TimeOfFlight  1.32.00
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
TOFUtils.cc
Go to the documentation of this file.
1 #include "TOFUtils.h"
2 
3 #include <cmath>
4 #include <algorithm>
5 #include <limits>
6 
8 #include "marlinutil/CalorimeterHitType.h"
9 #include "HelixClass.h"
10 #include "DD4hep/Detector.h"
11 #include "DD4hep/DD4hepUnits.h"
12 #include "DDRec/DetectorData.h"
13 #include "CLHEP/Random/Randomize.h"
14 #include "CLHEP/Units/PhysicalConstants.h"
15 #include "TGraph.h"
16 #include "TF1.h"
17 
18 using std::vector;
20 using EVENT::TrackerHit;
21 using EVENT::Track;
22 using EVENT::Cluster;
23 using EVENT::CalorimeterHit;
24 using EVENT::TrackState;
25 using dd4hep::Detector;
26 using dd4hep::DetElement;
29 using CLHEP::RandGauss;
30 
31 
32 dd4hep::rec::Vector3D TOFUtils::getHelixMomAtTrackState(const EVENT::TrackState& ts, double bField){
33  double phi = ts.getPhi();
34  double d0 = ts.getD0();
35  double z0 = ts.getZ0();
36  double omega = ts.getOmega();
37  double tanL = ts.getTanLambda();
38 
39  HelixClass helix;
40  helix.Initialize_Canonical(phi, d0, z0, omega, tanL, bField);
41  return helix.getMomentum();
42 }
43 
44 
46  auto& detector = Detector::getInstance();
47  DetElement tpcDet = detector.detector("TPC");
48  FixedPadSizeTPCData* tpc = tpcDet.extension <FixedPadSizeTPCData>();
49  return tpc->rMaxReadout/dd4hep::mm;
50 }
51 
52 
53 EVENT::TrackerHit* TOFUtils::getSETHit(EVENT::Track* track, double tpcOuterR){
54  vector<TrackerHit*> hits = track->getTrackerHits();
55  TrackerHit* lastHit = hits.back();
56  Vector3D pos (lastHit->getPosition());
57 
58  if ( pos.rho() > tpcOuterR ) return lastHit;
59  return nullptr;
60 }
61 
62 
63 std::vector<EVENT::CalorimeterHit*> TOFUtils::selectFrankEcalHits( EVENT::Cluster* cluster, EVENT::Track* track, int maxEcalLayer, double bField ){
64  const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
65  Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
66  Vector3D trackMomAtEcal = TOFUtils::getHelixMomAtTrackState(*tsEcal, bField);
67 
68  vector<CalorimeterHit*> selectedHits(maxEcalLayer, nullptr);
69  vector<double> minDistances(maxEcalLayer, numeric_limits<double>::max());
70 
71  for ( auto hit : cluster->getCalorimeterHits() ){
72  CHT hitType( hit->getType() );
73  bool isECALHit = ( hitType.caloID() == CHT::ecal );
74  int layer = hitType.layer();
75  if ( (!isECALHit) || ( layer >= maxEcalLayer) ) continue;
76 
77  Vector3D hitPos( hit->getPosition() );
78  double dToLine = (hitPos - trackPosAtEcal).cross(trackMomAtEcal.unit()).r();
79  if ( dToLine < minDistances[layer] ){
80  minDistances[layer] = dToLine;
81  selectedHits[layer] = hit;
82  }
83  }
84  selectedHits.erase( std::remove_if( selectedHits.begin(), selectedHits.end(), [](CalorimeterHit* h) { return h == nullptr; } ), selectedHits.end() );
85 
86  return selectedHits;
87 }
88 
89 
90 double TOFUtils::getTofClosest( EVENT::Cluster* cluster, EVENT::Track* track, double timeResolution){
91  const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
92  Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
93 
94  double hitTime = numeric_limits<double>::max();
95  double closestDistance = numeric_limits<double>::max();
96  for( auto hit : cluster->getCalorimeterHits() ){
97  CHT hitType( hit->getType() );
98  bool isECALHit = ( hitType.caloID() == CHT::ecal );
99  if (! isECALHit) continue;
100 
101  Vector3D hitPos( hit->getPosition() );
102  double dToTrack = (hitPos - trackPosAtEcal).r();
103  if( dToTrack < closestDistance ){
104  closestDistance = dToTrack;
105  hitTime = hit->getTime();
106  }
107  }
108 
109  if ( hitTime == numeric_limits<double>::max() ) return 0.;
110  return RandGauss::shoot(hitTime, timeResolution) - closestDistance/CLHEP::c_light;
111 }
112 
113 
114 double TOFUtils::getTofFrankAvg( std::vector<EVENT::CalorimeterHit*> selectedHits, EVENT::Track* track, double timeResolution){
115  const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
116  Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
117 
118  int nHits = selectedHits.size();
119  if (nHits == 0) return 0.;
120 
121  double tof = 0.;
122  for ( auto hit : selectedHits ){
123  Vector3D hitPos( hit->getPosition() );
124  double dToTrack = (hitPos - trackPosAtEcal).r();
125  tof += RandGauss::shoot(hit->getTime(), timeResolution) - dToTrack/CLHEP::c_light;
126  }
127  return tof/nHits;
128 }
129 
130 
131 double TOFUtils::getTofFrankFit( std::vector<EVENT::CalorimeterHit*> selectedHits, EVENT::Track* track, double timeResolution){
132  const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
133  Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
134 
135  int nHits = selectedHits.size();
136  if (nHits == 0) return 0.;
137  else if (nHits == 1){
138  //we can't fit 1 point, but lets return something reasonable
139  Vector3D hitPos( selectedHits[0]->getPosition() );
140  double dToTrack = (hitPos - trackPosAtEcal).r();
141  return RandGauss::shoot(selectedHits[0]->getTime(), timeResolution) - dToTrack/CLHEP::c_light;
142  }
143 
144  vector <double> x, y;
145  for ( auto hit : selectedHits ){
146  Vector3D hitPos( hit->getPosition() );
147  double dToTrack = (hitPos - trackPosAtEcal).r();
148  x.push_back(dToTrack);
149  double time = RandGauss::shoot(hit->getTime(), timeResolution);
150  y.push_back(time);
151  }
152 
153  TGraph gr(nHits, x.data(), y.data());
154  gr.Fit("pol1", "Q");
155  return gr.GetFunction("pol1")->GetParameter(0);
156 }
double getTofFrankAvg(std::vector< EVENT::CalorimeterHit * > selectedHits, EVENT::Track *track, double timeResolution)
Get the time-of-flight using average of the Frank ECal hits.
Definition: TOFUtils.cc:114
double getTofClosest(EVENT::Cluster *cluster, EVENT::Track *track, double timeResolution)
Get the time-of-flight using the closest ECal hit.
Definition: TOFUtils.cc:90
T end(T...args)
T remove_if(T...args)
EVENT::TrackerHit * getSETHit(EVENT::Track *track, double tpcOuterR)
Returns SET hit.
Definition: TOFUtils.cc:53
double getTPCOuterR()
Returns TPC outer radius from the DD4hep detector geometry.
Definition: TOFUtils.cc:45
T push_back(T...args)
T data(T...args)
T erase(T...args)
T size(T...args)
STL class.
double getTofFrankFit(std::vector< EVENT::CalorimeterHit * > selectedHits, EVENT::Track *track, double timeResolution)
Get the time-of-flight using fit of the Frank ECal hits.
Definition: TOFUtils.cc:131
std::vector< EVENT::CalorimeterHit * > selectFrankEcalHits(EVENT::Cluster *cluster, EVENT::Track *track, int maxEcalLayer, double bField)
Get a subset of the cluster calorimeter hits.
Definition: TOFUtils.cc:63
T begin(T...args)
T back(T...args)
StructExtension< FixedPadSizeTPCStruct > FixedPadSizeTPCData
dd4hep::rec::Vector3D getHelixMomAtTrackState(const EVENT::TrackState &ts, double bField)
Get track momentum at the track state.
Definition: TOFUtils.cc:32