3 #include <CalorimeterHitType.h>
4 #include "marlin/VerbosityLevels.h"
6 #include <EVENT/LCCollection.h>
7 #include <EVENT/MCParticle.h>
8 #include <EVENT/SimTrackerHit.h>
9 #include <EVENT/Track.h>
10 #include <EVENT/TrackerHit.h>
12 #include <IMPL/LCCollectionVec.h>
14 #include <CalorimeterHitType.h>
15 #include <marlinutil/GeometryUtil.h>
20 float bField = MarlinUtil::getBzAtOrigin();
21 const TrackState* pTrackState = pTrack->getTrackState(TrackState::AtCalorimeter);
24 const float* locationAtECal = pTrackState->getReferencePoint();
26 helix.Initialize_Canonical(pTrack->getPhi(), pTrack->getD0(), pTrack->getZ0(), pTrack->getOmega(), pTrack->getTanLambda(),
30 tof = sqrt(locationAtECal[0] * locationAtECal[0] + locationAtECal[1] * locationAtECal[1] +
31 locationAtECal[2] * locationAtECal[2]) /
36 float distance[3] = {0.0, 0.0, 0.0};
37 float minTime = helix.getDistanceToPoint(locationAtECal, distance);
39 const float px = helix.getMomentum()[0];
40 const float py = helix.getMomentum()[1];
41 const float pz = helix.getMomentum()[2];
43 const float E = sqrt(px * px + py * py + pz * pz + 0.139 * 0.139);
44 minTime = minTime / 300 * E - tof;
50 float& meanTimeHcalEndcap,
int& nHcalEnd,
bool correctHitTimesForTimeOfFlight) {
51 float sumTimeEnergy(0.f);
53 float sumEnergyEcal(0.f);
54 float sumTimeEnergyEcal(0.f);
55 float sumEnergyHcalEndcap(0.f);
56 float sumTimeEnergyHcalEndcap(0.f);
57 meanTime = std::numeric_limits<float>::max();
58 meanTimeEcal = std::numeric_limits<float>::max();
59 meanTimeHcalEndcap = std::numeric_limits<float>::max();
64 CalorimeterHitVec hits = cluster->getCalorimeterHits();
65 std::vector<float> hittimes;
66 std::vector<float> tofCorrections;
67 std::vector<float> deltaTimes;
69 for (
unsigned int ihit = 0; ihit < hits.size(); ++ihit) {
71 if (correctHitTimesForTimeOfFlight) {
72 const float x = hits[ihit]->getPosition()[0];
73 const float y = hits[ihit]->getPosition()[1];
74 const float z = hits[ihit]->getPosition()[2];
75 const float r = sqrt(x * x + y * y + z * z);
76 const float tof = r / 300.;
77 tofCorrections.push_back(tof);
78 hittimes.push_back(hits[ihit]->getTime() - tof);
80 hittimes.push_back(hits[ihit]->getTime());
84 std::sort(hittimes.begin(), hittimes.end());
86 int iMedian =
static_cast<int>(hits.size() / 2.);
87 float medianTime = hittimes[iMedian];
90 for (
unsigned int ihit = 0; ihit < hits.size(); ++ihit)
91 deltaTimes.push_back(fabs(hittimes[ihit] - medianTime));
92 std::sort(deltaTimes.begin(), deltaTimes.end());
96 if (hits.size() > 1) {
97 ihit90 =
static_cast<int>((hits.size() * 9) / 10.);
98 if (ihit90 >= hits.size() - 1)
99 ihit90 = hits.size() - 2;
105 float deltaMedian = deltaTimes[ihit90] + 0.1;
108 for (
unsigned int ihit = 0; ihit < hits.size(); ++ihit) {
109 CalorimeterHit* hit = hits[ihit];
110 float hitTime = hits[ihit]->getTime();
111 if (correctHitTimesForTimeOfFlight)
112 hitTime -= tofCorrections[ihit];
114 if ((hitTime - medianTime) < deltaMedian) {
115 sumEnergy += hit->getEnergy();
116 sumTimeEnergy += hit->getEnergy() * hitTime;
120 CHT ch = hit->getType();
121 if (ch.is(CHT::ecal)) {
123 sumEnergyEcal += hit->getEnergy();
124 sumTimeEnergyEcal += hit->getEnergy() * hitTime;
127 if (!ch.is(CHT::barrel)) {
129 sumEnergyHcalEndcap += hit->getEnergy();
130 sumTimeEnergyHcalEndcap += hit->getEnergy() * hitTime;
139 meanTime = sumTimeEnergy / sumEnergy;
140 if (sumEnergyEcal > 0.f)
141 meanTimeEcal = sumTimeEnergyEcal / sumEnergyEcal;
142 if (sumEnergyHcalEndcap > 0.f)
143 meanTimeHcalEndcap = sumTimeEnergyHcalEndcap / sumEnergyHcalEndcap;
float TimeAtEcal(const Track *pTrack, float &tof)
void GetClusterTimes(const Cluster *cluster, float &meanTime, int &nCaloHitsUsed, float &meanTimeEcal, int &nEcal, float &meanTimeHcalEndcap, int &nHcalEnd, bool correctHitTimesForTimeOfFlight)