8 #include "marlinutil/CalorimeterHitType.h"
9 #include "HelixClass.h"
10 #include "DD4hep/Detector.h"
11 #include "DD4hep/DD4hepUnits.h"
13 #include "CLHEP/Random/Randomize.h"
14 #include "CLHEP/Units/PhysicalConstants.h"
20 using EVENT::TrackerHit;
23 using EVENT::CalorimeterHit;
24 using EVENT::TrackState;
25 using dd4hep::Detector;
26 using dd4hep::DetElement;
29 using CLHEP::RandGauss;
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();
40 helix.Initialize_Canonical(phi, d0, z0, omega, tanL, bField);
41 return helix.getMomentum();
46 auto& detector = Detector::getInstance();
49 return tpc->rMaxReadout/dd4hep::mm;
55 TrackerHit* lastHit = hits.
back();
56 Vector3D pos (lastHit->getPosition());
58 if ( pos.rho() > tpcOuterR )
return lastHit;
64 const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
65 Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
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;
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;
84 selectedHits.
erase(
std::remove_if( selectedHits.
begin(), selectedHits.
end(), [](CalorimeterHit* h) {
return h ==
nullptr; } ), selectedHits.
end() );
91 const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
92 Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
96 for(
auto hit : cluster->getCalorimeterHits() ){
97 CHT hitType( hit->getType() );
98 bool isECALHit = ( hitType.caloID() == CHT::ecal );
99 if (! isECALHit)
continue;
101 Vector3D hitPos( hit->getPosition() );
102 double dToTrack = (hitPos - trackPosAtEcal).r();
103 if( dToTrack < closestDistance ){
104 closestDistance = dToTrack;
105 hitTime = hit->getTime();
110 return RandGauss::shoot(hitTime, timeResolution) - closestDistance/CLHEP::c_light;
115 const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
116 Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
118 int nHits = selectedHits.
size();
119 if (nHits == 0)
return 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;
132 const TrackState* tsEcal = track->getTrackState(TrackState::AtCalorimeter);
133 Vector3D trackPosAtEcal ( tsEcal->getReferencePoint() );
135 int nHits = selectedHits.
size();
136 if (nHits == 0)
return 0.;
137 else if (nHits == 1){
139 Vector3D hitPos( selectedHits[0]->getPosition() );
140 double dToTrack = (hitPos - trackPosAtEcal).r();
141 return RandGauss::shoot(selectedHits[0]->getTime(), timeResolution) - dToTrack/CLHEP::c_light;
145 for (
auto hit : selectedHits ){
146 Vector3D hitPos( hit->getPosition() );
147 double dToTrack = (hitPos - trackPosAtEcal).r();
149 double time = RandGauss::shoot(hit->getTime(), timeResolution);
153 TGraph gr(nHits, x.
data(), y.
data());
155 return gr.GetFunction(
"pol1")->GetParameter(0);
double getTofFrankAvg(std::vector< EVENT::CalorimeterHit * > selectedHits, EVENT::Track *track, double timeResolution)
Get the time-of-flight using average of the Frank ECal hits.
double getTofClosest(EVENT::Cluster *cluster, EVENT::Track *track, double timeResolution)
Get the time-of-flight using the closest ECal hit.
EVENT::TrackerHit * getSETHit(EVENT::Track *track, double tpcOuterR)
Returns SET hit.
double getTPCOuterR()
Returns TPC outer radius from the DD4hep detector geometry.
double getTofFrankFit(std::vector< EVENT::CalorimeterHit * > selectedHits, EVENT::Track *track, double timeResolution)
Get the time-of-flight using fit of the Frank ECal hits.
std::vector< EVENT::CalorimeterHit * > selectFrankEcalHits(EVENT::Cluster *cluster, EVENT::Track *track, int maxEcalLayer, double bField)
Get a subset of the cluster calorimeter hits.
StructExtension< FixedPadSizeTPCStruct > FixedPadSizeTPCData
dd4hep::rec::Vector3D getHelixMomAtTrackState(const EVENT::TrackState &ts, double bField)
Get track momentum at the track state.