1 #ifndef DSourceComboTimeHandler_h
2 #define DSourceComboTimeHandler_h
4 #include <unordered_map>
13 #include "TDirectoryFile.h"
32 using DPhotonKinematicsByZBin = unordered_map<signed char, unordered_map<const DNeutralShower*, shared_ptr<const DKinematicData>>>;
47 void Setup(
const vector<const DNeutralShower*>& locNeutralShowers,
const DEventRFBunch* locInitialEventRFBunch,
const DDetectorMatches* locDetectorMatches);
48 void Set_BeamParticles(
const vector<const DBeamPhoton*>& locBeamParticles);
54 vector<const DKinematicData*> Get_BeamParticlesByRFBunch(
int locRFBunch,
unsigned int locPlusMinusBunchRange)
const;
57 map<DetectorSystem_t, TF1*> Get_TimeCuts(
Particle_t locPID)
const;
63 vector<int> Get_ValidRFBunches(
const JObject* locObject,
signed char locVertexZBin)
const;
64 vector<int> Get_CommonRFBunches(
const vector<int>& locRFBunches1,
const JObject* locObject,
signed char locVertexZBin)
const;
65 vector<int> Get_CommonRFBunches(
const vector<int>& locRFBunches1,
const vector<int>& locRFBunches2)
const;
69 int Calc_RFBunchShift(
double locTimeToStep,
double locTimeToStepTo)
const;
70 double Calc_RFTime(
int locNumRFBunchShifts)
const;
71 double Calc_PropagatedRFTime(
double locPrimaryVertexZ,
int locNumRFBunchShifts,
double locDetachedVertexTimeOffset)
const;
76 bool Select_RFBunches_PhotonVertices(
const DReactionVertexInfo* locReactionVertexInfo,
const DSourceCombo* locReactionFullCombo, vector<int>& locValidRFBunches);
86 signed char Get_PhotonVertexZBin(
double locVertexZ)
const;
87 double Get_PhotonVertexZBinCenter(
signed char locVertexZBin)
const;
90 void Vote_OldMethod(
const DSourceCombo* locReactionFullCombo, vector<int>& locValidRFBunches);
94 pair<DVector3, double> Calc_Photon_Kinematics(
const DNeutralShower* locNeutralShower,
const DVector3& locVertex)
const;
95 shared_ptr<const DKinematicData> Create_KinematicData_Photon(
const DNeutralShower* locNeutralShower,
const DVector3& locVertex)
const;
97 void Calc_PhotonBeamBunchShifts(
const DNeutralShower* locNeutralShower, shared_ptr<const DKinematicData>& locKinematicData,
double locRFTime,
signed char locZBin);
98 vector<int> Calc_BeamBunchShifts(
double locVertexTime,
double locOrigRFBunchPropagatedTime,
double locDeltaTCut,
bool locIncludeDecayTimeOffset,
Particle_t locPID,
DetectorSystem_t locSystem,
double locP);
101 double Calc_MaxDeltaTError(
const DNeutralShower* locNeutralShower,
double locTheta,
double locZError)
const;
103 bool Get_RFBunches_ChargedTrack(
const DChargedTrackHypothesis* locHypothesis,
bool locIsProductionVertex,
const DSourceCombo* locVertexPrimaryCombo,
bool locIsCombo2ndVertex,
DVector3 locVertex,
double locPropagatedRFTime,
bool locOnlyTrackFlag,
bool locDetachedVertex, vector<int>& locRFBunches);
106 bool Compute_RFChiSqs_UnknownVertices(
const DSourceCombo* locReactionFullCombo,
Charge_t locCharge,
const vector<int>& locRFBunches, unordered_map<int, double>& locChiSqByRFBunch, map<
int, map<
Particle_t, map<
DetectorSystem_t, vector<pair<float, float>>>>>& locRFDeltaTsForHisting);
107 bool Cut_PhotonPID(
const DNeutralShower* locNeutralShower,
const DVector3& locVertex,
double locPropagatedRFTime,
bool locTargetCenterFlag,
bool locDetachedVertex);
110 pair<double, double> Calc_RFDeltaTChiSq(
const DNeutralShower* locNeutralShower,
const TVector3& locVertex,
double locPropagatedRFTime)
const;
111 pair<double, double> Calc_RFDeltaTChiSq(
const DChargedTrackHypothesis* locHypothesis,
double locVertexTime,
double locPropagatedRFTime)
const;
113 void Define_DefaultCuts(
void);
114 void Get_CommandLineCuts(
void);
115 void Create_CutFunctions(
void);
116 void Fill_Histograms(
void);
124 bool dPrintCutFlag =
false;
128 double dTargetLength = 30.0;
129 double dBeamBunchPeriod = 1000.0/249.5;
130 bool dUseSigmaForRFSelectionFlag =
false;
137 float dPhotonVertexZBinWidth = 10.0;
138 float dPhotonVertexZRangeLow = 45.0;
139 size_t dNumPhotonVertexZBins = 6;
141 double dMaxDecayTimeOffset = 0.0;
142 double dDetachedPathLengthUncertainty = 10.0;
143 double dChargedDecayProductTimeUncertainty = 2.0;
182 map<Particle_t, map<DetectorSystem_t, vector<pair<float, float>>>>
dAllRFDeltaTs;
185 inline void DSourceComboTimeHandler::Reset(
void)
189 dInitialEventRFBunch =
nullptr;
191 dPhotonKinematics.clear();
192 for(
auto& locZPair : dShowerRFBunches)
193 locZPair.second.clear();
194 for(
auto& locZPair : dShowersByBeamBunchByZBin)
195 locZPair.second.clear();
196 dChargedParticlePOCAToVertexX4.clear();
197 dBeamParticlesByRFBunch.clear();
199 dChargedComboRFBunches.clear();
200 dPhotonVertexRFBunches.clear();
201 dUnknownVertexRFBunches.clear();
202 dFullComboRFBunches.clear();
205 inline signed char DSourceComboTimeHandler::Get_PhotonVertexZBin(
double locVertexZ)
const
208 if(locVertexZ < dPhotonVertexZRangeLow)
209 return DSourceComboInfo::Get_VertexZIndex_OutOfRange();
210 int locPhotonVertexZBin = int((locVertexZ - dPhotonVertexZRangeLow)/dPhotonVertexZBinWidth);
211 return ((locPhotonVertexZBin >=
int(dNumPhotonVertexZBins)) ? DSourceComboInfo::Get_VertexZIndex_OutOfRange() : locPhotonVertexZBin);
214 inline double DSourceComboTimeHandler::Get_PhotonVertexZBinCenter(
signed char locVertexZBin)
const
216 return dPhotonVertexZRangeLow + (double(locVertexZBin) + 0.5)*dPhotonVertexZBinWidth;
219 inline void DSourceComboTimeHandler::Set_BeamParticles(
const vector<const DBeamPhoton*>& locBeamParticles)
221 for(
const auto& locBeamParticle : locBeamParticles)
223 auto locRFBunch = Calc_RFBunchShift(dInitialEventRFBunch->dTime, locBeamParticle->time());
224 dBeamParticlesByRFBunch[locRFBunch].push_back(locBeamParticle);
225 dBeamRFDeltaTs.emplace_back(locBeamParticle->energy(), locBeamParticle->time() - dInitialEventRFBunch->dTime);
229 inline map<DetectorSystem_t, TF1*> DSourceComboTimeHandler::Get_TimeCuts(
Particle_t locPID)
const
231 auto locIterator = dPIDTimingCuts.find(locPID);
232 if(locIterator == dPIDTimingCuts.end())
234 return locIterator->second;
239 auto locIterator = dPIDTimingCuts.find(locPID);
240 if(locIterator == dPIDTimingCuts.end())
243 auto locSystemMap = locIterator->second;
244 auto locSystemIterator = locSystemMap.find(locSystem);
245 if(locSystemIterator == locSystemMap.end())
248 locTimeCut_ns = locSystemIterator->second;
252 inline vector<const DKinematicData*> DSourceComboTimeHandler::Get_BeamParticlesByRFBunch(
int locCenterRFBunch,
unsigned int locPlusMinusBunchRange)
const
254 vector<const DKinematicData*> locBeamParticles;
255 for(
auto locRFBunch = locCenterRFBunch -
int(locPlusMinusBunchRange); locRFBunch <= locCenterRFBunch + int(locPlusMinusBunchRange); ++locRFBunch)
257 auto locIterator = dBeamParticlesByRFBunch.find(locRFBunch);
258 if(locIterator != dBeamParticlesByRFBunch.end())
259 locBeamParticles.insert(locBeamParticles.end(), locIterator->second.begin(), locIterator->second.end());
261 return locBeamParticles;
264 inline double DSourceComboTimeHandler::Calc_RFTime(
int locNumRFBunchShifts)
const
266 return dInitialEventRFBunch->dTime + locNumRFBunchShifts*dBeamBunchPeriod;
269 inline double DSourceComboTimeHandler::Calc_PropagatedRFTime(
double locPrimaryVertexZ,
int locNumRFBunchShifts,
double locDetachedVertexTimeOffset)
const
272 return Calc_RFTime(locNumRFBunchShifts) + (locPrimaryVertexZ - dTargetCenter.Z())/
SPEED_OF_LIGHT + locDetachedVertexTimeOffset;
275 inline shared_ptr<const DKinematicData> DSourceComboTimeHandler::Create_KinematicData_Photon(
const DNeutralShower* locNeutralShower,
const DVector3& locVertex)
const
277 auto locKinematicsPair = Calc_Photon_Kinematics(locNeutralShower, locVertex);
278 return std::make_shared<const DKinematicData>(
Gamma, locKinematicsPair.first, locVertex, locKinematicsPair.second);
281 inline pair<DVector3, double> DSourceComboTimeHandler::Calc_Photon_Kinematics(
const DNeutralShower* locNeutralShower,
const DVector3& locVertex)
const
285 auto locPathLength = locPath.Mag();
286 auto locVertexTime = locNeutralShower->
dSpacetimeVertex.T() - locPathLength/29.9792458;
287 auto locMomentum = locNeutralShower->
dEnergy*locPath.Unit();
288 return std::make_pair(locMomentum, locVertexTime);
291 inline vector<int> DSourceComboTimeHandler::Get_ValidRFBunches(
const JObject* locObject,
signed char locVertexZBin)
const
293 const auto& locBunchesByObject = dShowerRFBunches.find(locVertexZBin)->second;
294 auto locIterator = locBunchesByObject.find(locObject);
295 if(locIterator == locBunchesByObject.end())
297 return locIterator->second;
300 inline int DSourceComboTimeHandler::Calc_RFBunchShift(
double locTimeToStep,
double locTimeToStepTo)
const
302 double locDeltaT = locTimeToStepTo - locTimeToStep;
303 return (locDeltaT > 0.0) ? int(locDeltaT/dBeamBunchPeriod + 0.5) : int(locDeltaT/dBeamBunchPeriod - 0.5);
306 inline vector<int> DSourceComboTimeHandler::Get_CommonRFBunches(
const vector<int>& locRFBunches1,
const JObject* locObject,
signed char locVertexZBin)
const
308 return Get_CommonRFBunches(locRFBunches1, Get_ValidRFBunches(locObject, locVertexZBin));
311 inline vector<int> DSourceComboTimeHandler::Get_CommonRFBunches(
const vector<int>& locRFBunches1,
const vector<int>& locRFBunches2)
const
314 if(locRFBunches1.empty())
315 return locRFBunches2;
316 else if(locRFBunches2.empty())
317 return locRFBunches1;
319 vector<int> locCommonRFBunches = {};
320 locCommonRFBunches.reserve(locRFBunches1.size() + locRFBunches2.size());
321 std::set_intersection(locRFBunches1.begin(), locRFBunches1.end(), locRFBunches2.begin(), locRFBunches2.end(), std::back_inserter(locCommonRFBunches));
322 return locCommonRFBunches;
325 inline pair<double, double> DSourceComboTimeHandler::Calc_RFDeltaTChiSq(
const DNeutralShower* locNeutralShower,
const TVector3& locVertex,
double locPropagatedRFTime)
const
328 auto locPathLength = (locNeutralShower->
dSpacetimeVertex.Vect() - locVertex).Mag();
329 auto locVertexTime = locNeutralShower->
dSpacetimeVertex.T() - locPathLength/29.9792458;
330 auto locVertexTimeVariance = dUseSigmaForRFSelectionFlag ? (*(locNeutralShower->
dCovarianceMatrix))(4, 4) : 1.0;
332 auto locDeltaT = locVertexTime - locPropagatedRFTime;
333 auto locChiSq = locDeltaT*locDeltaT/locVertexTimeVariance;
335 cout <<
"neutral Calc_RFDeltaTChiSq(): vertex time, rf time, delta-t, chisq = " << locVertexTime <<
", " << locPropagatedRFTime <<
", " << locDeltaT <<
", " << locChiSq << endl;
337 return std::make_pair(locDeltaT, locChiSq);
340 inline pair<double, double> DSourceComboTimeHandler::Calc_RFDeltaTChiSq(
const DChargedTrackHypothesis* locHypothesis,
double locVertexTime,
double locPropagatedRFTime)
const
343 auto locErrorMatrix = locHypothesis->
errorMatrix();
344 auto locVertexTimeVariance = (dUseSigmaForRFSelectionFlag && (locErrorMatrix !=
nullptr)) ? (*locErrorMatrix)(6, 6) : 1.0;
345 auto locDeltaT = locVertexTime - locPropagatedRFTime;
346 auto locChiSq = locDeltaT*locDeltaT/locVertexTimeVariance;
348 cout <<
"charged Calc_RFDeltaTChiSq(): vertex time, rf time, delta-t, chisq = " << locVertexTime <<
", " << locPropagatedRFTime <<
", " << locDeltaT <<
", " << locChiSq << endl;
350 return std::make_pair(locDeltaT, locChiSq);
355 auto locPIDIterator = dPIDTimingCuts.find(locPID);
356 if(locPIDIterator == dPIDTimingCuts.end())
359 auto& locSystemMap = locPIDIterator->second;
360 auto locSystemIterator = locSystemMap.find(locSystem);
361 if(locSystemIterator == locSystemMap.end())
364 return locSystemIterator->second;
369 #endif // DSourceComboTimeHandler_h
unordered_map< const DSourceCombo *, pair< bool, vector< int > > > dUnknownVertexRFBunches
map< vector< int >, vector< const JObject * >> DPhotonShowersByBeamBunch
double Calc_MaxDeltaTError(const DNeutralShower *locNeutralShower, double locTheta) const
map< pair< const DKinematicData *, vector< const DKinematicData * > >, DLorentzVector > dChargedParticlePOCAToVertexX4
unordered_map< signed char, unordered_map< const DNeutralShower *, shared_ptr< const DKinematicData >>> DPhotonKinematicsByZBin
map< Particle_t, map< DetectorSystem_t, vector< pair< float, float > > > > dAllRFDeltaTs
TH2 * dHist_BeamRFDeltaTVsBeamE
unordered_map< signed char, unordered_map< const JObject *, vector< int > > > dShowerRFBunches
int Calc_RFBunchShift(double locTimeToStepTo) const
TLorentzVector DLorentzVector
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_RFDeltaTVsP_AllRFs
DPhotonKinematicsByZBin Get_PhotonKinematics(void) const
map< Particle_t, map< DetectorSystem_t, vector< pair< float, float > > > > dSelectedRFDeltaTs
map< Particle_t, map< DetectorSystem_t, vector< double > > > dPIDTimingCuts_TF1Params
DLorentzVector dSpacetimeVertex
size_t Get_NumVertexZBins(void) const
unordered_map< signed char, DPhotonShowersByBeamBunch > Get_ShowersByBeamBunchByZBin(void) const
void Set_DebugLevel(int locDebugLevel)
shared_ptr< TMatrixFSym > dCovarianceMatrix
unordered_map< int, vector< const DKinematicData * > > dBeamParticlesByRFBunch
string dDefaultTimeCutFunctionString
double Get_BeamBunchPeriod(void) const
map< Particle_t, map< DetectorSystem_t, string > > dPIDTimingCuts_TF1FunctionString
size_t Get_VertexZBin_TargetCenter(void) const
map< Particle_t, map< DetectorSystem_t, TF1 * > > dPIDTimingCuts
unordered_map< signed char, DPhotonShowersByBeamBunch > dShowersByBeamBunchByZBin
~DSourceComboTimeHandler(void)
unordered_map< const DSourceCombo *, pair< bool, vector< int > > > dPhotonVertexRFBunches
const DEventRFBunch * Get_InitialEventRFBunch(void) const
DSourceComboer * dSourceComboer
shared_ptr< const TMatrixFSym > errorMatrix(void) const
const DSourceComboVertexer * dSourceComboVertexer
unordered_map< const DSourceCombo *, pair< bool, vector< int > > > dChargedComboRFBunches
unordered_map< const DSourceCombo *, int > dFullComboRFBunches
DPhotonKinematicsByZBin dPhotonKinematics
const DAnalysisUtilities * dAnalysisUtilities
vector< pair< float, float > > dBeamRFDeltaTs
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_RFDeltaTVsP_BestRF