209 map<string, string> locParameterMap;
210 gPARMS->GetParameters(locParameterMap,
"COMBO_MM2CUT:");
211 for(
auto locParamPair : locParameterMap)
214 cout <<
"param pair: " << locParamPair.first <<
", " << locParamPair.second << endl;
217 auto locUnderscoreIndex = locParamPair.first.find(
'_');
218 auto locSideString = locParamPair.first.substr(0, locUnderscoreIndex);
219 auto locHighSideFlag = (locSideString ==
"Low") ?
false :
true;
222 auto locFuncIndex = locParamPair.first.find(
"_FUNC");
223 auto locParticleString = locParamPair.first.substr(locUnderscoreIndex + 1, locFuncIndex);
224 istringstream locPIDtream(locParticleString);
226 locPIDtream >> locPIDInt;
227 if(locPIDtream.fail())
232 cout <<
"mm2 cut: pid, side = " << locPID <<
", " << locSideString << endl;
236 string locFullParamName =
string(
"COMBO_MM2CUT:") + locParamPair.first;
237 gPARMS->SetDefaultParameter(locFullParamName, locKeyValue);
240 if(locFuncIndex != string::npos)
257 locUnderscoreIndex = locKeyValue.find(
'_');
258 auto locValueString = locKeyValue.substr(0, locUnderscoreIndex);
260 istringstream locValuetream(locValueString);
262 locValuetream >> locParameter;
263 if(locValuetream.fail())
266 cout <<
"param: " << locParameter << endl;
273 if(locUnderscoreIndex == string::npos)
275 locKeyValue = locKeyValue.substr(locUnderscoreIndex + 1);
288 map<string, string> locParameterMap;
289 gPARMS->GetParameters(locParameterMap,
"COMBO_IMCUT:");
290 for(
auto locParamPair : locParameterMap)
293 cout <<
"param pair: " << locParamPair.first <<
", " << locParamPair.second << endl;
296 auto locUnderscoreIndex = locParamPair.first.find(
'_');
297 auto locSideString = locParamPair.first.substr(0, locUnderscoreIndex);
298 auto locHighSideFlag = (locSideString ==
"Low") ?
false :
true;
301 auto locParticleString = locParamPair.first.substr(locUnderscoreIndex + 1);
302 istringstream locPIDtream(locParticleString);
304 locPIDtream >> locPIDInt;
305 if(locPIDtream.fail())
310 cout <<
"im cut: pid, side = " << locPID <<
", " << locSideString << endl;
314 string locFullParamName =
string(
"COMBO_IMCUT:") + locParamPair.first;
315 gPARMS->SetDefaultParameter(locFullParamName, locKeyValue);
318 istringstream locValuetream(locKeyValue);
320 locValuetream >> locParameter;
321 if(locValuetream.fail())
324 cout <<
"param: " << locParameter << endl;
338 jout <<
"Invariant mass cut: pid, low cut, high cut = " << locPIDPair.first <<
", " << locPIDPair.second.first <<
", " << locPIDPair.second.second << endl;
357 map<string, string> locParameterMap;
358 gPARMS->GetParameters(locParameterMap,
"COMBO_MISSECUT:");
359 for(
auto locParamPair : locParameterMap)
362 cout <<
"param pair: " << locParamPair.first <<
", " << locParamPair.second << endl;
365 auto locUnderscoreIndex = locParamPair.first.find(
'_');
366 auto locSideString = locParamPair.first.substr(0, locUnderscoreIndex);
367 auto locHighSideFlag = (locSideString ==
"Low") ?
false :
true;
369 cout <<
"missE cut: side = " << locSideString << endl;
373 string locFullParamName =
string(
"COMBO_MISSECUT:") + locParamPair.first;
374 gPARMS->SetDefaultParameter(locFullParamName, locKeyValue);
377 auto locFuncIndex = locParamPair.first.find(
"_FUNC");
378 if(locFuncIndex != string::npos)
395 locUnderscoreIndex = locKeyValue.find(
'_');
396 auto locValueString = locKeyValue.substr(0, locUnderscoreIndex);
398 istringstream locValuetream(locValueString);
400 locValuetream >> locParameter;
401 if(locValuetream.fail())
404 cout <<
"param: " << locParameter << endl;
411 if(locUnderscoreIndex == string::npos)
413 locKeyValue = locKeyValue.substr(locUnderscoreIndex + 1);
421 japp->RootWriteLock();
426 auto& locParamVector_Low = locPIDPair.second.first;
427 auto& locParamVector_High = locPIDPair.second.second;
428 if(locParamVector_Low.empty() || locParamVector_High.empty())
444 auto locFunc_Low =
new TF1(
"df_MissingMassSquaredCut", locCutFuncString_Low.c_str(), 0.0, 12.0);
446 jout <<
"Missing Mass Squared Cut, Low-side: PID, func form, params: " <<
ParticleType(locPIDPair.first) <<
", " << locCutFuncString_Low;
447 for(
size_t loc_i = 0; loc_i < locParamVector_Low.size(); ++loc_i)
449 locFunc_Low->SetParameter(loc_i, locParamVector_Low[loc_i]);
451 jout <<
", " << locParamVector_Low[loc_i];
457 auto locFunc_High =
new TF1(
"df_MissingMassSquaredCut", locCutFuncString_High.c_str(), 0.0, 12.0);
459 jout <<
"Missing Mass Squared Cut, High-side: PID, func form, params: " <<
ParticleType(locPIDPair.first) <<
", " << locCutFuncString_High;
460 for(
size_t loc_i = 0; loc_i < locParamVector_High.size(); ++loc_i)
462 locFunc_High->SetParameter(loc_i, locParamVector_High[loc_i]);
464 jout <<
", " << locParamVector_High[loc_i];
478 auto locFunc_Low =
new TF1(
"df_MissingBeamEnergyCut", locCutFuncString_Low.c_str(), 0.0, 12.0);
480 jout <<
"Missing Energy Cut (none-missing only), Low-side: func form, params: " << locCutFuncString_Low;
491 auto locFunc_High =
new TF1(
"df_MissingBeamEnergyCut", locCutFuncString_High.c_str(), 0.0, 12.0);
493 jout <<
"Missing Energy Cut (none-missing only), High-side: func form, params: " << locCutFuncString_High;
510 gPARMS->SetDefaultParameter(
"COMBO:DEBUG_LEVEL",
dDebugLevel);
511 gPARMS->SetDefaultParameter(
"COMBO:PRINT_CUTS",
dPrintCutFlag);
520 if(!locCreateHistsFlag)
524 japp->RootWriteLock();
528 TDirectory* locCurrentDir = gDirectory;
530 string locDirName =
"Independent";
531 TDirectoryFile* locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
532 if(locDirectoryFile == NULL)
533 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
534 locDirectoryFile->cd();
536 locDirName =
"Combo_Construction";
537 locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
538 if(locDirectoryFile == NULL)
539 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
540 locDirectoryFile->cd();
542 locDirName =
"Invariant_Mass";
543 locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
544 if(locDirectoryFile == NULL)
545 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
546 locDirectoryFile->cd();
550 string locHistName =
"InvariantMass_2Gamma_BCAL";
551 auto locHist = gDirectory->Get(locHistName.c_str());
554 locHistName =
"InvariantMass_2Gamma_FCAL";
555 locHist = gDirectory->Get(locHistName.c_str());
558 locHistName =
"InvariantMass_2Gamma_BCALFCAL";
559 locHist = gDirectory->Get(locHistName.c_str());
566 auto locPID = locPIDPair.first;
567 auto& locMassPair = locPIDPair.second;
569 auto locHist = gDirectory->Get(locHistName.c_str());
573 auto locMinMass = locMassPair.first - 0.2;
576 auto locMaxMass = locMassPair.second + 0.2;
577 auto locNumBins = 1000.0*(locMaxMass - locMinMass);
578 dHistMap_InvariantMass[locPID] =
new TH1I(locHistName.c_str(), locHistTitle.c_str(), locNumBins, locMinMass, locMaxMass);
583 gDirectory->cd(
"..");
585 locDirName =
"Missing_Mass";
586 locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
587 if(locDirectoryFile == NULL)
588 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
589 locDirectoryFile->cd();
594 auto locPID = locPIDPair.first;
595 auto& locMassPair = locPIDPair.second;
597 auto locHist = gDirectory->Get(locHistName.c_str());
601 auto locMinMass = locMassPair.first->Eval(12.0) - 0.2;
602 auto locMaxMass = locMassPair.second->Eval(12.0) + 0.2;
603 auto locNumBins = 1000.0*(locMaxMass - locMinMass);
612 string locHistName =
"NoneMissing_MissingEVsBeamEnergy_PreMissMassSqCut";
613 auto locHist = gDirectory->Get(locHistName.c_str());
616 string locHistTitle =
string(
"None Missing: From All Production Mechanisms;Beam Energy (GeV); Missing E (GeV)");
622 locHistName =
"NoneMissing_MissingEVsBeamEnergy_PostMissMassSqCut";
623 locHist = gDirectory->Get(locHistName.c_str());
626 string locHistTitle =
string(
"None Missing: From All Production Mechanisms;Beam Energy (GeV); Missing E (GeV)");
635 string locHistName =
"NoneMissing_MissingPtVsMissingE_PreMissMassSqCut";
636 auto locHist = gDirectory->Get(locHistName.c_str());
639 string locHistTitle =
string(
"None Missing: From All Production Mechanisms; Missing E (GeV); Missing Transverse Momentum (GeV/c)");
645 locHistName =
"NoneMissing_MissingPtVsMissingE_PostMissMassSqCut";
646 locHist = gDirectory->Get(locHistName.c_str());
649 string locHistTitle =
string(
"None Missing: From All Production Mechanisms; Missing E (GeV); Missing Transverse Momentum (GeV/c)");
664 return static_cast<const DChargedTrack*
>(locObject)->Get_Hypothesis(locPID)->lorentzMomentum();
667 auto locNeutralShower =
static_cast<const DNeutralShower*
>(locObject);
668 if(!locAccuratePhotonsFlag)
671 if(locNeutralShower->dDetectorSystem ==
SYS_BCAL)
675 auto& locKinematicData =
dPhotonKinematics.find(locVertexZBin)->second.find(locNeutralShower)->second;
676 return locKinematicData->lorentzMomentum();
680 auto locMomentum = locNeutralShower->dEnergy*((locNeutralShower->dSpacetimeVertex.Vect() - locVertex).Unit());
689 auto locPathMag = locPath.Mag();
690 double locDeltaT = locNeutralShower->
dSpacetimeVertex.T() - locRFVertexTime;
692 double locBeta = locPathMag/(locDeltaT*29.9792458);
698 auto locGamma = 1.0/
sqrt(1.0 - locBeta*locBeta);
699 auto locPMag = locGamma*locBeta*locMass;
700 locPath.SetMag(locPMag);
703 cout <<
"Calc_MassiveNeutralP4: pid, mass, shower-z, vertex-z, path, shower t, rf t, delta-t, beta, pmag = " << locPID <<
", " << locMass <<
", " << locNeutralShower->
dSpacetimeVertex.Vect().Z() <<
", " << locVertex.Z() <<
", " << locPathMag <<
", " << locNeutralShower->
dSpacetimeVertex.T() <<
", " << locRFVertexTime <<
", " << locDeltaT <<
", " << locBeta <<
", " << locPMag << endl;
705 auto locEnergy =
sqrt(locPMag*locPMag + locMass*locMass);
720 cout <<
"Read Calc_P4_NoMassiveNeutrals: Combo " << locVertexCombo <<
" P4: " << locIterator->second.Px() <<
", " << locIterator->second.Py() <<
", " << locIterator->second.Pz() <<
", " << locIterator->second.E() << endl;
721 return locIterator->second;
731 for(
const auto& locCombosByUsePair : locFurtherDecayCombos)
733 auto locDetachedVertexFlag =
IsDetachedVertex(std::get<0>(locCombosByUsePair.first));
734 auto locDecayVertexZBin = std::get<1>(locCombosByUsePair.first);
735 for(
size_t loc_i = 0; loc_i < locCombosByUsePair.second.size(); ++loc_i)
737 const auto& locCombo = (locCombosByUsePair.second)[loc_i];
738 if((locCombosByUsePair.first == locToExcludeUse) && ((loc_i + 1) == locInstanceToExclude))
742 auto locDecayVertex = (locDetachedVertexFlag && locIsVertexKnown) ?
dSourceComboVertexer->
Get_Vertex(
false, locReactionCombo, locCombo, locBeamParticle,
false) : locVertex;
743 locTotalP4 +=
Calc_P4_NoMassiveNeutrals(locReactionCombo, locCombo, locDecayVertex, locDecayVertexZBin, locBeamParticle, locToExcludeUse, locInstanceToExclude, locAccuratePhotonsFlag);
747 auto locTargetPIDToSubtract = std::get<4>(locCombosByUsePair.first);
748 if(locTargetPIDToSubtract !=
Unknown)
753 if(!locAccuratePhotonsFlag || !locHasPhotons)
756 if(!locAccuratePhotonsFlag)
759 if((locSourceParticles.size() == 2) && (locSourceParticles[0].first ==
Gamma) && (locSourceParticles[1].first ==
Gamma))
761 auto locSystem1 =
static_cast<const DNeutralShower*
>(locSourceParticles[0].second)->dDetectorSystem;
762 auto locSystem2 =
static_cast<const DNeutralShower*
>(locSourceParticles[1].second)->dDetectorSystem;
763 auto locSystem = (locSystem1 != locSystem2) ?
SYS_NULL : locSystem1;
769 cout <<
"Save Calc_P4_NoMassiveNeutrals: Combo " << locVertexCombo <<
" P4: " << locTotalP4.Px() <<
", " << locTotalP4.Py() <<
", " << locTotalP4.Pz() <<
", " << locTotalP4.E() << endl;
778 for(
const auto& locParticlePair : locSourceParticles)
780 auto locPID = locParticlePair.first;
783 auto locNeutralShower =
static_cast<const DNeutralShower*
>(locParticlePair.second);
786 cout <<
"pid, pointer, pxyzE = " << locPID <<
", " << locParticlePair.second <<
", " << locParticleP4.Px() <<
", " << locParticleP4.Py() <<
", " << locParticleP4.Pz() <<
", " << locParticleP4.E() << endl;
787 locTotalP4 += locParticleP4;
791 auto locParticleP4 =
Get_P4_NotMassiveNeutral(locParticlePair.first, locParticlePair.second, locVertex, locAccuratePhotonsFlag);
793 cout <<
"pid, pointer, pxyzE = " << locPID <<
", " << locParticlePair.second <<
", " << locParticleP4.Px() <<
", " << locParticleP4.Py() <<
", " << locParticleP4.Pz() <<
", " << locParticleP4.E() << endl;
794 locTotalP4 += locParticleP4;
799 cout <<
"Calc_P4_SourceParticles: Combo " << locVertexCombo <<
" P4: " << locTotalP4.Px() <<
", " << locTotalP4.Py() <<
", " << locTotalP4.Pz() <<
", " << locTotalP4.E() << endl;
804 bool DSourceComboP4Handler::Calc_P4_Decay(
bool locIsProductionVertex,
bool locIsPrimaryProductionVertex,
const DSourceCombo* locReactionFullCombo,
const DSourceComboUse& locDecayUse,
const DSourceCombo* locDecayCombo,
DVector3 locVertex,
double locTimeOffset,
int locRFBunch,
double locRFVertexTime,
DLorentzVector& locDecayP4,
const DKinematicData* locBeamParticle,
const DSourceComboUse& locToExcludeUse,
size_t locInstanceToExclude,
bool locAccuratePhotonsFlag)
806 auto locDecayPID = std::get<0>(locDecayUse);
807 auto locDecayVertexZBin = std::get<1>(locDecayUse);
813 if(!locHasMassiveNeutrals)
814 locDecayP4 =
Calc_P4_NoMassiveNeutrals(locReactionFullCombo, locDecayCombo, locVertex, locDecayVertexZBin, locBeamParticle, locToExcludeUse, locInstanceToExclude, locAccuratePhotonsFlag);
815 else if(!
Calc_P4_HasMassiveNeutrals(locIsProductionVertex, locIsPrimaryProductionVertex, locReactionFullCombo, locDecayCombo, locVertex, locTimeOffset, locRFBunch, locRFVertexTime, locToExcludeUse, locInstanceToExclude, locDecayP4, locBeamParticle, locAccuratePhotonsFlag))
818 cout <<
"Calc_P4_Decay: Combo " << locDecayCombo <<
" P4: " << locDecayP4.Px() <<
", " << locDecayP4.Py() <<
", " << locDecayP4.Pz() <<
", " << locDecayP4.E() << endl;
823 if(!locHasMassiveNeutrals)
825 if(locAccuratePhotonsFlag)
828 locVertex = locIsVertexKnown ?
dSourceComboVertexer->
Get_Vertex(locIsProductionVertex, locReactionFullCombo, locDecayCombo, locBeamParticle,
false) : locVertex;
832 locDecayP4 =
Calc_P4_NoMassiveNeutrals(locReactionFullCombo, locDecayCombo, locVertex, locDecayVertexZBin, locBeamParticle, locToExcludeUse, locInstanceToExclude, locAccuratePhotonsFlag);
834 else if(!locAccuratePhotonsFlag)
837 auto locDecayP4LookupTuple = std::make_tuple(locIsProductionVertex, locReactionFullCombo, locDecayCombo, locRFBunch, locBeamParticle, locToExcludeUse, locInstanceToExclude);
841 if(locBeamParticle ==
nullptr)
845 locDecayP4LookupTuple = std::make_tuple(locIsProductionVertex, locReactionFullCombo, locDecayCombo, locRFBunch, (
const DKinematicData*)
nullptr, locToExcludeUse, locInstanceToExclude);
850 locDecayP4 = locDecayIterator->second;
857 locTimeOffset = locIsTimeOffsetKnown ?
dSourceComboVertexer->
Get_TimeOffset(locIsPrimaryProductionVertex, locReactionFullCombo, locDecayCombo, locBeamParticle) : locTimeOffset;
861 if(!
Calc_P4_HasMassiveNeutrals(
false, locIsPrimaryProductionVertex, locReactionFullCombo, locDecayCombo, locVertex, locTimeOffset, locRFBunch, locRFVertexTime, locToExcludeUse, locInstanceToExclude, locDecayP4, locBeamParticle, locAccuratePhotonsFlag))
866 cout <<
"Calc_P4_Decay: Combo " << locDecayCombo <<
" P4: " << locDecayP4.Px() <<
", " << locDecayP4.Py() <<
", " << locDecayP4.Pz() <<
", " << locDecayP4.E() << endl;
870 bool DSourceComboP4Handler::Calc_P4_HasMassiveNeutrals(
bool locIsProductionVertex,
bool locIsPrimaryProductionVertex,
const DSourceCombo* locReactionFullCombo,
const DSourceCombo* locCurrentCombo,
DVector3 locVertex,
double locTimeOffset,
int locRFBunch,
double locRFVertexTime,
const DSourceComboUse& locToExcludeUse,
size_t locInstanceToExclude,
DLorentzVector& locTotalP4,
const DKinematicData* locBeamParticle,
bool locAccuratePhotonsFlag)
872 auto locP4LookupTuple = std::make_tuple(locIsProductionVertex, locReactionFullCombo, locCurrentCombo, locRFBunch, locBeamParticle, locToExcludeUse, locInstanceToExclude);
875 if(!locHasPhotons || !locAccuratePhotonsFlag)
880 locTotalP4 = locIterator->second;
882 cout <<
"Read Calc_P4_HasMassiveNeutrals: Combo " << locCurrentCombo <<
" P4: " << locTotalP4.Px() <<
", " << locTotalP4.Py() <<
", " << locTotalP4.Pz() <<
", " << locTotalP4.E() << endl;
889 auto locParticlesP4 =
Calc_P4_SourceParticles(locCurrentCombo, locVertex, locRFVertexTime, locAccuratePhotonsFlag);
891 cout <<
"combo, source total pxyzE = " << locCurrentCombo <<
", " << locParticlesP4.Px() <<
", " << locParticlesP4.Py() <<
", " << locParticlesP4.Pz() <<
", " << locParticlesP4.E() << endl;
892 locTotalP4 += locParticlesP4;
896 for(
const auto& locCombosByUsePair : locFurtherDecayCombos)
898 for(
size_t loc_i = 0; loc_i < locCombosByUsePair.second.size(); ++loc_i)
900 const auto& locDecayCombo = (locCombosByUsePair.second)[loc_i];
901 if((locCombosByUsePair.first == locToExcludeUse) && ((loc_i + 1) == locInstanceToExclude))
905 if(!
Calc_P4_Decay(locIsProductionVertex, locIsPrimaryProductionVertex, locReactionFullCombo, locCombosByUsePair.first, locDecayCombo, locVertex, locTimeOffset, locRFBunch, locRFVertexTime, locDecayP4, locBeamParticle, locToExcludeUse, locInstanceToExclude, locAccuratePhotonsFlag))
908 cout <<
"combo, add decayp4 = " << locDecayCombo <<
", " << locDecayP4.Px() <<
", " << locDecayP4.Py() <<
", " << locDecayP4.Pz() <<
", " << locDecayP4.E() << endl;
909 locTotalP4 += locDecayP4;
913 auto locTargetPIDToSubtract = std::get<4>(locCombosByUsePair.first);
914 if(locTargetPIDToSubtract !=
Unknown)
918 if(!locAccuratePhotonsFlag || !locHasPhotons)
921 cout <<
"Save Calc_P4_HasMassiveNeutrals: Combo " << locCurrentCombo <<
" P4: " << locTotalP4.Px() <<
", " << locTotalP4.Py() <<
", " << locTotalP4.Pz() <<
", " << locTotalP4.E() << endl;
930 locMinMaxMassCuts_GeV = locCutIterator->second;
932 if(locAccuratePhotonsFlag)
936 if(locNumPhotons == 0)
939 locMinMaxMassCuts_GeV.first -= locMassError;
940 locMinMaxMassCuts_GeV.second += locMassError;
948 pair<float, float> locMassCuts;
954 auto locFinalStateP4 =
Calc_P4_NoMassiveNeutrals(
nullptr, locVertexCombo, locVertex, locVertexZBin,
nullptr,
DSourceComboUse(
Unknown, 0,
nullptr,
false,
Unknown), 1, locAccuratePhotonsFlag);
957 if(locTargetPIDToSubtract !=
Unknown)
959 auto locInvariantMass = locFinalStateP4.M();
962 auto locCutResult = ((locInvariantMass >= locMassCuts.first) && (locInvariantMass <= locMassCuts.second));
964 if(!locAccuratePhotonsFlag)
966 auto locSaveTuple = std::make_tuple(locDecayPID, locVertexCombo);
970 cout <<
"fill no-massive hist" << endl;
976 cout <<
"accurate flag, decay pid, z, zbin, mass, cut min/max, pass flag: " << locAccuratePhotonsFlag <<
", " << locDecayPID <<
", " << locVertex.Z() <<
", " << int(locVertexZBin) <<
", " << locInvariantMass <<
", " << locMassCuts.first <<
", " << locMassCuts.second <<
", " << locCutResult << endl;
980 bool DSourceComboP4Handler::Cut_InvariantMass_HasMassiveNeutral(
bool locIsProductionVertex,
bool locIsPrimaryProductionVertex,
const DSourceCombo* locReactionFullCombo,
const DSourceCombo* locVertexCombo,
Particle_t locDecayPID,
Particle_t locTargetPIDToSubtract,
double locPrimaryVertexZ,
const DVector3& locVertex,
double locTimeOffset, vector<int>& locValidRFBunches,
const DKinematicData* locBeamParticle,
bool locAccuratePhotonsFlag)
982 if(locValidRFBunches.empty())
985 pair<float, float> locMassCuts;
994 auto CalcAndCut_InvariantMass = [&](
int locRFBunch) ->
bool
999 if(!
Calc_P4_HasMassiveNeutrals(locIsProductionVertex, locIsPrimaryProductionVertex, locReactionFullCombo, locVertexCombo, locVertex, locTimeOffset, locRFBunch, locRFVertexTime,
DSourceComboUse(
Unknown, 0,
nullptr,
false,
Unknown), 1, locTotalP4, locBeamParticle, locAccuratePhotonsFlag))
1003 if(locTargetPIDToSubtract !=
Unknown)
1006 auto locInvariantMass = locTotalP4.M();
1007 auto locPassCutFlag = ((locInvariantMass > locMassCuts.first) && (locInvariantMass < locMassCuts.second));
1009 cout <<
"has-mass neutral: accurate flag, decay pid, z, mass, cut min/max, pass flag: " << locAccuratePhotonsFlag <<
", " << locDecayPID <<
", " << locVertex.Z() <<
", " << locTotalP4.M() <<
", " << locMassCuts.first <<
", " << locMassCuts.second <<
", " << locPassCutFlag << endl;
1012 if(!locAccuratePhotonsFlag)
1014 auto locSaveTuple = std::make_tuple(locDecayPID, locIsProductionVertex, locReactionFullCombo, locVertexCombo, locRFBunch);
1018 cout <<
"fill hist: massive neutrals" << endl;
1023 return !locPassCutFlag;
1027 locValidRFBunches.erase(std::remove_if(locValidRFBunches.begin(), locValidRFBunches.end(), CalcAndCut_InvariantMass), locValidRFBunches.end());
1028 return !locValidRFBunches.empty();
1037 cout <<
"Cut_InvariantMass_HasMassiveNeutral_OrPhotonVertex()" << endl;
1045 if(locStepVertexInfo->Get_DanglingVertexFlag())
1049 auto locIsProductionVertex = locStepVertexInfo->Get_ProductionVertexFlag();
1059 cout <<
"determinable, has-flag: " << locVertexConstrainedByChargedFlag <<
", " << locHasMassiveNeutrals << endl;
1060 if(locVertexConstrainedByChargedFlag && !locHasMassiveNeutrals)
1063 if(locVertexPrimaryFullCombo->Get_IsComboingZIndependent() && !locHasMassiveNeutrals)
1074 locSourceCombosAndUses_ThisVertex.emplace(locSourceCombosAndUses_ThisVertex.begin(), locVertexComboUse, vector<const DSourceCombo*>{locVertexPrimaryFullCombo});
1077 for(
auto locIterator = locSourceCombosAndUses_ThisVertex.rbegin(); locIterator != locSourceCombosAndUses_ThisVertex.rend(); ++locIterator)
1079 auto locDecayComboUse = locIterator->first;
1080 auto locDecayPID = std::get<0>(locDecayComboUse);
1081 if((locDecayPID ==
Unknown) || std::get<3>(locDecayComboUse))
1085 auto locTargetPIDToSubtract = std::get<4>(locDecayComboUse);
1088 for(
const auto& locDecayCombo : locIterator->second)
1090 if(locDecayCombo->Get_IsComboingZIndependent() && !locDecayHasMassiveNeutrals)
1092 if(!
Cut_InvariantMass_HasMassiveNeutral(locIsProductionVertex, locIsPrimaryProductionVertex, locReactionFullCombo, locDecayCombo, locDecayPID, locTargetPIDToSubtract, locPrimaryVertexZ, locVertex, locTimeOffset, locValidRFBunches,
nullptr,
false))
1113 auto locIsProductionVertex = locStepVertexInfo->Get_ProductionVertexFlag();
1125 if(locVertexPrimaryFullCombo->Get_IsComboingZIndependent() && !locHasMassiveNeutrals)
1134 locSourceCombosAndUses_ThisVertex.emplace(locSourceCombosAndUses_ThisVertex.begin(), locVertexComboUse, vector<const DSourceCombo*>{locVertexPrimaryFullCombo});
1137 for(
auto locIterator = locSourceCombosAndUses_ThisVertex.rbegin(); locIterator != locSourceCombosAndUses_ThisVertex.rend(); ++locIterator)
1139 auto locDecayComboUse = locIterator->first;
1140 auto locDecayPID = std::get<0>(locDecayComboUse);
1141 if((locDecayPID ==
Unknown) || std::get<3>(locDecayComboUse))
1145 auto locTargetPIDToSubtract = std::get<4>(locDecayComboUse);
1148 for(
const auto& locDecayCombo : locIterator->second)
1150 if(locDecayCombo->Get_IsComboingZIndependent() && !locDecayHasMassiveNeutrals)
1152 vector<int> locRFBunches{locRFBunch};
1153 if(!
Cut_InvariantMass_HasMassiveNeutral(locIsProductionVertex, locIsPrimaryProductionVertex, locReactionFullCombo, locDecayCombo, locDecayPID, locTargetPIDToSubtract, locPrimaryVertexZ, locVertex, locTimeOffset, locRFBunches,
nullptr,
false))
1165 cout <<
"DSourceComboP4Handler::Cut_MissingMassSquared()" << endl;
1176 size_t locNumInclusiveSteps = 0;
1179 if(locReactionStep->Get_IsInclusiveFlag())
1180 ++locNumInclusiveSteps;
1184 if((locNumMissingParticles == 0) && (locNumInclusiveSteps == 0))
1187 if(!
Cut_MissingMassSquared(locReaction, locReactionVertexInfo, locReactionFullComboUse, locReactionFullCombo,
Unknown, 0, -1, locInitialStateP4, locRFBunch, locBeamParticle, locMissingP4))
1195 map<size_t, DLorentzVector> locDecayP4sByStep;
1200 auto locP4Iterator = locDecayP4sByStep.find(loc_i);
1201 if(locP4Iterator == locDecayP4sByStep.end())
1203 locInitialStateP4 = locP4Iterator->second;
1207 for(
size_t loc_j = 0; loc_j < locReactionStep->Get_NumFinalPIDs(); ++loc_j)
1211 cout <<
"i, j, pid, missing index: " << loc_i <<
", " << loc_j <<
", " << locPID <<
", " << locReactionStep->Get_MissingParticleIndex() << endl;
1214 if(
int(loc_j) == locReactionStep->Get_MissingParticleIndex())
1216 if((locNumMissingParticles > 1) || (locNumInclusiveSteps > 0))
1219 if(!
Cut_MissingMassSquared(locReaction, locReactionVertexInfo, locReactionFullComboUse, locReactionFullCombo, locPID, loc_i, -1, locInitialStateP4, locRFBunch, locBeamParticle, locMissingP4))
1226 cout <<
"decay step index: " << locDecayStepIndex << endl;
1227 if(locDecayStepIndex <= 0)
1233 cout <<
"num missing total/decay: " << locNumMissingParticles <<
", " << locMissingDecayProducts.size() << endl;
1234 if((locNumMissingParticles - locMissingDecayProducts.size()) > 0)
1238 size_t locNumInclusiveDecayProductSteps = 0;
1239 for(
auto& locParticlePair : locMissingDecayProducts)
1242 ++locNumInclusiveDecayProductSteps;
1245 cout <<
"num inclusives total/decay: " << locNumInclusiveSteps <<
", " << locNumInclusiveDecayProductSteps << endl;
1246 if((locNumInclusiveSteps - locNumInclusiveDecayProductSteps) > 0)
1250 if(!
Cut_MissingMassSquared(locReaction, locReactionVertexInfo, locReactionFullComboUse, locReactionFullCombo, locPID, loc_i, locDecayStepIndex, locInitialStateP4, locRFBunch, locBeamParticle, locMissingP4))
1252 locDecayP4sByStep.emplace(locDecayStepIndex, locMissingP4);
1259 bool DSourceComboP4Handler::Cut_MissingMassSquared(
const DReaction* locReaction,
const DReactionVertexInfo* locReactionVertexInfo,
const DSourceComboUse& locReactionFullComboUse,
const DSourceCombo* locFullCombo,
Particle_t locMissingPID,
int locStepIndex,
int locDecayStepIndex,
const DLorentzVector& locInitialStateP4,
int locRFBunch,
const DKinematicData* locBeamParticle,
DLorentzVector& locMissingP4)
1264 auto locSourceCombo = (locStepIndex == 0) ? locFullCombo :
dSourceComboer->
Get_StepSourceCombo(locReaction, locStepIndex, locVertexPrimaryCombo, locStepVertexInfo->Get_StepIndices().front());
1277 if(!
Calc_P4_HasMassiveNeutrals(locIsProductionVertex,
true, locFullCombo, locSourceCombo, locVertex, locTimeOffset, locRFBunch, locRFVertexTime, locToExcludeUsePair.first, locToExcludeUsePair.second, locFinalStateP4, locBeamParticle,
true))
1279 locMissingP4.SetE(0.0);
1283 locMissingP4 = locInitialStateP4 - locFinalStateP4;
1285 cout <<
"missing pid, pxyzE = " << locMissingPID <<
", " << locMissingP4.Px() <<
", " << locMissingP4.Py() <<
", " << locMissingP4.Pz() <<
", " << locMissingP4.E() << endl;
1287 pair<TF1*, TF1*> locCutPair;
1291 auto locMissingMassSquared_Min = locCutPair.first->Eval(locBeamEnergy);
1292 auto locMissingMassSquared_Max = locCutPair.second->Eval(locBeamEnergy);
1294 cout <<
"beam E, missing mass^2 min/max/measured = " << locBeamEnergy <<
", " << locMissingMassSquared_Min <<
", " << locMissingMassSquared_Max <<
", " << locMissingP4.M2() << endl;
1297 dMissingMassPairs[locMissingPID].emplace_back(locBeamEnergy, locMissingP4.M2());
1298 auto locPassCutFlag = ((locMissingP4.M2() >= locMissingMassSquared_Min) && (locMissingP4.M2() <= locMissingMassSquared_Max));
1306 locPassCutFlag = ((locMissingP4.E() >=
dMissingECuts.first->Eval(locBeamEnergy)) && (locMissingP4.E() <=
dMissingECuts.second->Eval(locBeamEnergy)));
1312 return locPassCutFlag;
1318 cout <<
"DSourceComboP4Handler::Cut_InvariantMass_AccuratePhotonKinematics()" << endl;
1331 auto locIsProductionVertex = locStepVertexInfo->Get_ProductionVertexFlag();
1343 locSourceCombosAndUses_ThisVertex.emplace(locSourceCombosAndUses_ThisVertex.begin(), locVertexComboUse, vector<const DSourceCombo*>{locVertexPrimaryFullCombo});
1346 for(
auto locIterator = locSourceCombosAndUses_ThisVertex.rbegin(); locIterator != locSourceCombosAndUses_ThisVertex.rend(); ++locIterator)
1348 auto locDecayComboUse = locIterator->first;
1349 auto locDecayPID = std::get<0>(locDecayComboUse);
1350 if((locDecayPID ==
Unknown) || std::get<3>(locDecayComboUse))
1354 auto locTargetPIDToSubtract = std::get<4>(locDecayComboUse);
1357 for(
const auto& locDecayCombo : locIterator->second)
1361 if(locDecayHasMassiveNeutrals)
1363 vector<int> locBeamBunches{locRFBunch};
1364 if(!
Cut_InvariantMass_HasMassiveNeutral(locIsProductionVertex, locIsPrimaryProductionVertex, locReactionFullCombo, locDecayCombo, locDecayPID, locTargetPIDToSubtract, locPrimaryVertexZ, locVertex, locTimeOffset, locBeamBunches, locBeamParticle,
true))
1380 japp->WriteLock(
"DSourceComboP4Handler");
1384 for(
auto& locMass : locPIDPair.second)
1389 for(
auto& locMassPair : locPIDPair.second)
1394 for(
auto& locMass : locSystemPair.second)
1407 japp->Unlock(
"DSourceComboP4Handler");
1415 decltype(locPIDPair.second)().swap(locPIDPair.second);
1417 decltype(locPIDPair.second)().swap(locPIDPair.second);
1419 decltype(locSystemPair.second)().swap(locSystemPair.second);
vector< pair< float, float > > dMissingPtVsMissingE_PostMissMassSqCut
DLorentzVector Get_P4_NotMassiveNeutral(Particle_t locPID, const JObject *locObject, const DVector3 &locVertex, bool locAccuratePhotonsFlag) const
bool Cut_InvariantMass_MissingMassVertex(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, const DKinematicData *locBeamParticle, int locRFBunch)
pair< DSourceComboUse, size_t > Get_StepSourceComboUse(const DReaction *locReaction, size_t locDesiredStepIndex, DSourceComboUse locVertexPrimaryComboUse, size_t locVertexPrimaryStepIndex) const
bool Get_IsFirstStepBeam(const DReaction *locReaction)
vector< pair< DSourceComboUse, vector< const DSourceCombo * > > > Get_SourceCombosAndUses_ThisVertex(const DSourceCombo *locSourceCombo)
bool Get_VertexDeterminableWithPhotons(const DReactionStepVertexInfo *locStepVertexInfo) const
DPhotonKinematicsByZBin dPhotonKinematics
static char * ParticleName_ROOT(Particle_t p)
double Get_TimeOffset(bool locIsPrimaryProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DKinematicData *locBeamParticle) const
map< Particle_t, vector< pair< float, float > > > dMissingMassPairs
DSourceComboUse Get_SourceComboUse(const DReactionStepVertexInfo *locStepVertexInfo) const
bool Cut_InvariantMass_HasMassiveNeutral_OrPhotonVertex(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, vector< int > &locValidRFBunches)
bool Get_MissingMassSquaredCuts(Particle_t locPID, pair< TF1 *, TF1 * > &locMinMaxCuts_GeVSq) const
map< DetectorSystem_t, vector< float > > d2GammaInvariantMasses
map< Particle_t, pair< double, double > > dInvariantMassCuts
vector< pair< float, float > > dMissingEVsBeamEnergy_PreMissMassSqCut
map< Particle_t, vector< float > > dInvariantMasses
const DReactionStepVertexInfo * Get_StepVertexInfo(size_t locStepIndex) const
const DSourceComboVertexer * dSourceComboVertexer
map< Particle_t, pair< vector< double >, vector< double > > > dMissingMassSquaredCuts_TF1Params
bool Calc_P4_Decay(bool locIsProductionVertex, bool locIsPrimaryProductionVertex, const DSourceCombo *locReactionFullCombo, const DSourceComboUse &locDecayUse, const DSourceCombo *locDecayCombo, DVector3 locVertex, double locTimeOffset, int locRFBunch, double locRFVertexTime, DLorentzVector &locDecayP4, const DKinematicData *locBeamParticle, const DSourceComboUse &locToExcludeUse, size_t locInstanceToExclude, bool locAccuratePhotonsFlag)
const DSourceCombo * Get_StepSourceCombo(const DReaction *locReaction, size_t locDesiredStepIndex, const DSourceCombo *locVertexPrimaryCombo, size_t locVertexPrimaryStepIndex=0) const
Particle_t Get_TargetPID(void) const
bool Get_VertexDeterminableWithCharged(const DReactionStepVertexInfo *locStepVertexInfo) const
TH2 * dHist_NoneMissing_MissingPtVsMissingE_PreMissMassSqCut
static signed char Get_VertexZIndex_OutOfRange(void)
set< tuple< Particle_t, bool, const DSourceCombo *, const DSourceCombo *, int > > dInvariantMassFilledSet_MassiveNeutral
bool Cut_InvariantMass_NoMassiveNeutrals(const DSourceCombo *locVertexCombo, Particle_t locDecayPID, Particle_t locTargetPIDToSubtract, const DVector3 &locVertex, signed char locVertexZBin, bool locAccuratePhotonsFlag)
static unsigned short int IsDetachedVertex(Particle_t p)
bool Get_ProductionVertexFlag(void) const
static char * ParticleType(Particle_t p)
DVector3 Get_Vertex(bool locIsProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DKinematicData *locBeamParticle, bool locIsCombo2ndVertex) const
TH2 * dHist_NoneMissing_MissingPtVsMissingE_PostMissMassSqCut
static signed char Get_VertexZIndex_Unknown(void)
TLorentzVector DLorentzVector
TH2 * dHist_NoneMissing_MissingEVsBeamEnergy_PreMissMassSqCut
DVector3 Get_PrimaryVertex(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionCombo, const DKinematicData *locBeamParticle) const
double Get_PhotonVertexZBinCenter(signed char locVertexZBin) const
DLorentzVector Calc_MassiveNeutralP4(const DNeutralShower *locNeutralShower, Particle_t locPID, const DVector3 &locVertex, double locVertexTime) const
static int ParticleCharge(Particle_t p)
map< tuple< bool, const DSourceCombo *, const DSourceCombo *, int, const DKinematicData *, DSourceComboUse, size_t >, DLorentzVector > dFinalStateP4ByCombo_HasMassiveNeutrals
static signed char Get_VertexZIndex_ZIndependent(void)
tuple< Particle_t, signed char, const DSourceComboInfo *, bool, Particle_t > DSourceComboUse
map< Particle_t, TH1 * > dHistMap_InvariantMass
double dMaxMassiveNeutralBeta
bool Cut_InvariantMass_AccuratePhotonKinematics(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, const DKinematicData *locBeamParticle, int locRFBunch)
DLorentzVector dSpacetimeVertex
bool Calc_P4_HasMassiveNeutrals(bool locIsProductionVertex, bool locIsPrimaryProductionVertex, const DSourceCombo *locReactionFullCombo, const DSourceCombo *locCurrentCombo, DVector3 locVertex, double locTimeOffset, int locRFBunch, double locRFVertexTime, const DSourceComboUse &locToExcludeUse, size_t locInstanceToExclude, DLorentzVector &locTotalP4, const DKinematicData *locBeamParticle, bool locAccuratePhotonsFlag)
map< Particle_t, TH2 * > dHistMap_MissingMassSquaredVsBeamEnergy
vector< pair< Particle_t, const JObject * > > Get_SourceParticles(bool locEntireChainFlag=false, Charge_t locCharge=d_AllCharges) const
void Fill_Histograms(void)
vector< pair< int, int > > Get_MissingDecayProductIndices(const DReaction *locReaction, size_t locStepIndex)
bool Get_IsTimeOffsetKnown(bool locIsPrimaryProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DKinematicData *locBeamParticle) const
DSourceComboer * dSourceComboer
signed char Get_PhotonVertexZBin(double locVertexZ) const
map< Particle_t, pair< TF1 *, TF1 * > > dMissingMassSquaredCuts
void Create_CutFunctions(void)
string dDefaultMissingMassSquaredCutFunctionString
bool Get_IsComboingZIndependent(void) const
double d2PhotonInvariantMassCutError
Particle_t Get_FinalPID(size_t locIndex) const
vector< pair< float, float > > dMissingPtVsMissingE_PreMissMassSqCut
static constexpr int Get_ParticleIndex_Inclusive(void)
void Get_CommandLineCuts_IM(void)
vector< const JObject * > Get_SourceParticles(const vector< pair< Particle_t, const JObject * >> &locSourceParticles, Particle_t locPID=Unknown)
map< pair< const DSourceCombo *, signed char >, DLorentzVector > dFinalStateP4ByCombo
pair< string, string > dMissingEnergyCuts_TF1FunctionStrings
vector< Particle_t > Get_MissingPIDs(int locStepIndex=-1, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
void Define_DefaultCuts(void)
DLorentzVector lorentzMomentum(void) const
static double ParticleMass(Particle_t p)
vector< const DReactionStepVertexInfo * > Get_StepVertexInfos(void) const
const DSourceCombo * Get_VertexPrimaryCombo(const DSourceCombo *locReactionCombo, const DReactionStepVertexInfo *locStepVertexInfo) const
DSourceComboP4Handler(void)=delete
size_t Get_VertexZBin_TargetCenter(void) const
void Get_CommandLineCuts_MM2(void)
pair< vector< double >, vector< double > > dMissingEnergyCuts_TF1Params
bool Get_InvariantMassCut(const DSourceCombo *locSourceCombo, Particle_t locDecayPID, bool locAccuratePhotonsFlag, pair< float, float > &locMinMaxMassCuts_GeV) const
void Get_CommandLineCuts_MissingEnergy(void)
vector< const DReactionStepVertexInfo * > Get_StepVertexInfos_ReverseOrderByStep(const DReactionVertexInfo *locReactionVertexInfo)
vector< pair< float, float > > dMissingEVsBeamEnergy_PostMissMassSqCut
map< Particle_t, pair< string, string > > dMissingMassSquaredCuts_TF1FunctionStrings
pair< TF1 *, TF1 * > dMissingECuts
TH2 * dHist_NoneMissing_MissingEVsBeamEnergy_PostMissMassSqCut
const DReactionStep * Get_ReactionStep(size_t locStepIndex) const
DLorentzVector Calc_P4_SourceParticles(const DSourceCombo *locVertexCombo, const DVector3 &locVertex, double locRFVertexTime, bool locAccuratePhotonsFlag)
int Get_DecayStepIndex(const DReaction *locReaction, size_t locStepIndex, size_t locParticleIndex)
DVector3 Get_Vertex_NoBeam(bool locIsProductionVertex, const DSourceCombo *locVertexCombo, bool locIsCombo2ndVertex) const
bool Get_IsVertexKnown(bool locIsProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DKinematicData *locBeamParticle, bool locIsCombo2ndVertex) const
bool Get_IsVertexKnown_NoBeam(bool locIsProductionVertex, const DSourceCombo *locVertexCombo, bool locIsCombo2ndVertex) const
DSourceCombosByUse_Small Get_FurtherDecayCombos(void) const
vector< const DReactionStep * > Get_ReactionSteps(void) const
const DSourceComboTimeHandler * dSourceComboTimeHandler
size_t Get_NumReactionSteps(void) const
bool Cut_InvariantMass_HasMassiveNeutral(bool locIsProductionVertex, bool locIsPrimaryProductionVertex, const DSourceCombo *locReactionFullCombo, const DSourceCombo *locVertexCombo, Particle_t locDecayPID, Particle_t locTargetPIDToSubtract, double locPrimaryVertexZ, const DVector3 &locVertex, double locTimeOffset, vector< int > &locValidRFBunches, const DKinematicData *locBeamParticle, bool locAccuratePhotonsFlag)
set< tuple< Particle_t, const DSourceCombo * > > dInvariantMassFilledSet
map< DetectorSystem_t, TH1 * > dHistMap_2GammaMass
double Calc_PropagatedRFTime(double locPrimaryVertexZ, int locNumRFBunchShifts, double locDetachedVertexTimeOffset) const
bool Get_HasMassiveNeutrals(const DSourceComboInfo *locSourceComboInfo) const
DLorentzVector Calc_P4_NoMassiveNeutrals(const DSourceCombo *locReactionCombo, const DSourceCombo *locVertexCombo, const DVector3 &locVertex, signed char locVertexZBin, const DKinematicData *locBeamParticle, const DSourceComboUse &locToExcludeUse, size_t locInstanceToExclude, bool locAccuratePhotonsFlag)
bool Cut_MissingMassSquared(const DReaction *locReaction, const DReactionVertexInfo *locReactionVertexInfo, const DSourceComboUse &locReactionFullComboUse, const DSourceCombo *locReactionFullCombo, const DKinematicData *locBeamParticle, int locRFBunch)