203 map<string, string> locParameterMap;
204 gPARMS->GetParameters(locParameterMap,
"COMBO_DEDXCUT:");
205 for(
auto locParamPair : locParameterMap)
208 cout <<
"param pair: " << locParamPair.first <<
", " << locParamPair.second << endl;
211 auto locFirstUnderscoreIndex = locParamPair.first.find(
'_');
212 auto locSideString = locParamPair.first.substr(0, locFirstUnderscoreIndex);
213 auto locHighSideFlag = (locSideString ==
"Low") ?
false :
true;
216 auto locSecondUnderscoreIndex = locParamPair.first.find(
'_', locFirstUnderscoreIndex + 1);
217 auto locParticleString = locParamPair.first.substr(locFirstUnderscoreIndex + 1, locSecondUnderscoreIndex);
218 istringstream locPIDtream(locParticleString);
220 locPIDtream >> locPIDInt;
221 if(locPIDtream.fail())
226 auto locFuncIndex = locParamPair.first.find(
"_FUNC");
227 auto locDetectorString = locParamPair.first.substr(locSecondUnderscoreIndex + 1, locFuncIndex);
228 istringstream locDetectorStream(locDetectorString);
230 locDetectorStream >> locSystemInt;
231 if(locDetectorStream.fail())
236 cout <<
"dE/dx cut: pid, detector, high-side flag = " << locPID <<
", " << locSystem <<
", " << locHighSideFlag << endl;
240 string locFullParamName =
string(
"COMBO_DEDXCUT:") + locParamPair.first;
241 gPARMS->SetDefaultParameter(locFullParamName, locKeyValue);
244 if(locFuncIndex != string::npos)
262 auto locUnderscoreIndex = locKeyValue.find(
'_');
263 auto locValueString = locKeyValue.substr(0, locUnderscoreIndex);
265 istringstream locValuetream(locValueString);
267 locValuetream >> locParameter;
268 if(locValuetream.fail())
271 cout <<
"param: " << locParameter << endl;
278 if(locUnderscoreIndex == string::npos)
280 locKeyValue = locKeyValue.substr(locUnderscoreIndex + 1);
291 map<string, string> locParameterMap;
292 gPARMS->GetParameters(locParameterMap,
"COMBO_EOVERP:");
293 for(
auto locParamPair : locParameterMap)
296 cout <<
"param pair: " << locParamPair.first <<
", " << locParamPair.second << endl;
299 auto locUnderscoreIndex = locParamPair.first.find(
'_');
300 auto locParticleString = locParamPair.first.substr(0, locUnderscoreIndex);
301 istringstream locPIDtream(locParticleString);
303 locPIDtream >> locPIDInt;
304 if(locPIDtream.fail())
309 auto locFuncIndex = locParamPair.first.find(
"_FUNC");
310 auto locDetectorString = locParamPair.first.substr(locUnderscoreIndex + 1, locFuncIndex);
311 istringstream locDetectorStream(locDetectorString);
313 locDetectorStream >> locSystemInt;
314 if(locDetectorStream.fail())
319 cout <<
"E/p cut: pid, detector = " << locPID <<
", " << locSystem << endl;
323 string locFullParamName =
string(
"COMBO_EOVERP:") + locParamPair.first;
324 gPARMS->SetDefaultParameter(locFullParamName, locKeyValue);
327 if(locFuncIndex != string::npos)
338 auto locUnderscoreIndex = locKeyValue.find(
'_');
339 auto locValueString = locKeyValue.substr(0, locUnderscoreIndex);
341 istringstream locValuetream(locValueString);
343 locValuetream >> locParameter;
344 if(locValuetream.fail())
347 cout <<
"param: " << locParameter << endl;
351 if(locUnderscoreIndex == string::npos)
353 locKeyValue = locKeyValue.substr(locUnderscoreIndex + 1);
361 japp->RootWriteLock();
366 auto& locSystemMap = locPIDPair.second;
367 for(
auto& locSystemPair : locSystemMap)
369 auto& locParamsPair = locSystemPair.second;
370 auto& locParamVector_Low = locParamsPair.first;
371 auto& locParamVector_High = locParamsPair.second;
372 if(locParamVector_Low.empty() || locParamVector_High.empty())
379 if(locSystemStringMap.find(locSystemPair.first) == locSystemStringMap.end())
381 auto locCutFuncString_Low = locSystemStringMap[locSystemPair.first].first;
382 auto locCutFuncString_High = locSystemStringMap[locSystemPair.first].second;
385 auto locFunc_Low =
new TF1(
"df_dEdxCut_Low", locCutFuncString_Low.c_str(), 0.0, 12.0);
387 jout <<
"dE/dx Cut PID, System, low-side func form, params: " <<
ParticleType(locPIDPair.first) <<
", " <<
SystemName(locSystemPair.first) <<
", " << locCutFuncString_Low;
388 ddEdxCutMap[locPIDPair.first][locSystemPair.first].first = locFunc_Low;
389 for(
size_t loc_i = 0; loc_i < locParamVector_Low.size(); ++loc_i)
391 locFunc_Low->SetParameter(loc_i, locParamVector_Low[loc_i]);
393 jout <<
", " << locParamVector_Low[loc_i];
399 auto locFunc_High =
new TF1(
"df_dEdxCut_High", locCutFuncString_High.c_str(), 0.0, 12.0);
401 jout <<
"dE/dx Cut PID, System, High-side func form, params: " <<
ParticleType(locPIDPair.first) <<
", " <<
SystemName(locSystemPair.first) <<
", " << locCutFuncString_High;
402 ddEdxCutMap[locPIDPair.first][locSystemPair.first].second = locFunc_High;
403 for(
size_t loc_i = 0; loc_i < locParamVector_High.size(); ++loc_i)
405 locFunc_High->SetParameter(loc_i, locParamVector_High[loc_i]);
407 jout <<
", " << locParamVector_High[loc_i];
417 auto& locSystemMap = locPIDPair.second;
418 for(
auto& locSystemPair : locSystemMap)
420 auto& locParamVector = locSystemPair.second;
426 if(locSystemStringMap.find(locSystemPair.first) == locSystemStringMap.end())
428 auto locCutFuncString = locSystemStringMap[locSystemPair.first];
431 auto locFunc =
new TF1(
"df_EOverPCut", locCutFuncString.c_str(), 0.0, 12.0);
433 jout <<
"E/p Cut PID, System, func form, params: " <<
ParticleType(locPIDPair.first) <<
", " <<
SystemName(locSystemPair.first) <<
", " << locCutFuncString;
434 dEOverPCutMap[locPIDPair.first][locSystemPair.first] = locFunc;
435 for(
size_t loc_i = 0; loc_i < locParamVector.size(); ++loc_i)
437 locFunc->SetParameter(loc_i, locParamVector[loc_i]);
439 jout <<
", " << locParamVector[loc_i];
460 gPARMS->SetDefaultParameter(
"COMBO:DEBUG_LEVEL",
dDebugLevel);
461 gPARMS->SetDefaultParameter(
"COMBO:PRINT_CUTS",
dPrintCutFlag);
469 double locTargetCenterZ = 65.0;
483 vector<const DReactionVertexInfo*> locVertexInfos;
484 locEventLoop->Get(locVertexInfos);
485 for(
const auto& locVertexInfo : locVertexInfos)
503 if(gPARMS->Exists(
"COMBO:NUM_PLUSMINUS_RF_BUNCHES"))
505 size_t locNumPlusMinusRFBunches;
506 gPARMS->GetParameter(
"COMBO:NUM_PLUSMINUS_RF_BUNCHES", locNumPlusMinusRFBunches);
507 for(
const auto& locReaction : locReactions)
512 for(
const auto& locReaction : locReactions)
514 auto locNumBunches = locReaction->Get_NumPlusMinusRFBunches();
515 pair<bool, double> locMaxPhotonRFDeltaT = locReaction->Get_MaxPhotonRFDeltaT();
516 if(locMaxPhotonRFDeltaT.first)
523 for(
const auto& locVertexInfo : locVertexInfos)
526 for(
const auto& locReaction : locVertexInfo->Get_Reactions())
534 vector<string> locBuildStages_Event = {
"Input",
"Min # Particles",
"Max # Particles",
"In Skim",
"Charged Combos",
"Charged RF Bunch",
"Full Combos",
"Neutral RF Bunch",
535 "No-Vertex RF Bunch",
"Heavy-Neutral IM",
"Beam Combos",
"MM/Dangling-Vertex Timing",
"MM/Dangling-Vertex IM Cuts",
"Accurate-Photon IM",
"Reaction Beam-RF Cuts",
"Missing Mass"};
536 vector<string> locBuildStages_Combo{
"In Skim Events"};
537 locBuildStages_Combo.insert(locBuildStages_Combo.end(), locBuildStages_Event.begin() + 4, locBuildStages_Event.end());
540 for(
auto locReaction : locReactions)
547 japp->RootWriteLock();
554 TDirectory* locCurrentDir = gDirectory;
556 string locDirName =
"Independent";
557 TDirectoryFile* locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
558 if(locDirectoryFile == NULL)
559 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
560 locDirectoryFile->cd();
562 locDirName =
"Combo_Construction";
563 locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
564 if(locDirectoryFile == NULL)
565 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
566 locDirectoryFile->cd();
569 locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
570 if(locDirectoryFile == NULL)
571 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
572 locDirectoryFile->cd();
574 for(
auto& locPID : locPIDs)
577 locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
578 if(locDirectoryFile == NULL)
579 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
580 locDirectoryFile->cd();
582 for(
auto& locSystem : locdEdxSystems)
585 auto locHist = gDirectory->Get(locHistName.c_str());
588 string locUnits = ((locSystem ==
SYS_CDC) || (locSystem ==
SYS_FDC)) ?
"(keV/cm)" :
"(MeV/cm)";
590 dHistMap_dEdx[locPID][locSystem] =
new TH2I(locHistName.c_str(), locHistTitle.c_str(), 400, 0.0, 12.0, 400, 0.0, 25.0);
596 for(
auto& locSystem : locEOverPSystems)
599 auto locHist = gDirectory->Get(locHistName.c_str());
603 dHistMap_EOverP[locPID][locSystem] =
new TH2I(locHistName.c_str(), locHistTitle.c_str(), 400, 0.0, 12.0, 400, 0.0, 4.0);
608 gDirectory->cd(
"..");
613 for(
auto locReaction : locReactions)
615 string locReactionName = locReaction->Get_ReactionName();
617 locDirName = locReactionName;
618 locDirectoryFile =
static_cast<TDirectoryFile*
>(gDirectory->GetDirectory(locDirName.c_str()));
619 if(locDirectoryFile == NULL)
620 locDirectoryFile =
new TDirectoryFile(locDirName.c_str(), locDirName.c_str());
621 locDirectoryFile->cd();
623 string locHistName =
"ComboConstruction_NumEventsSurvived";
624 auto locHist = gDirectory->Get(locHistName.c_str());
627 string locHistTitle = locReactionName +
string(
";;# Events Survived Stage");
628 dNumEventsSurvivedStageMap[locReaction] =
new TH1D(locHistName.c_str(), locHistTitle.c_str(), locBuildStages_Event.size(), -0.5, locBuildStages_Event.size() - 0.5);
629 for(
size_t loc_i = 0; loc_i < locBuildStages_Event.size(); ++loc_i)
635 locHistName =
"ComboConstruction_NumCombosSurvived";
636 locHist = gDirectory->Get(locHistName.c_str());
639 string locHistTitle = locReactionName +
string(
";;# Combos Survived Stage");
640 dNumCombosSurvivedStageMap[locReaction] =
new TH1D(locHistName.c_str(), locHistTitle.c_str(), locBuildStages_Combo.size(), -0.5, locBuildStages_Combo.size() - 0.5);
641 for(
size_t loc_i = 0; loc_i < locBuildStages_Combo.size(); ++loc_i)
647 locHistName =
"ComboConstruction_NumCombosSurvived2D";
648 locHist = gDirectory->Get(locHistName.c_str());
651 string locHistTitle = locReactionName +
string(
";;# Combos Survived Stage");
652 dNumCombosSurvivedStage2DMap[locReaction] =
new TH2D(locHistName.c_str(), locHistTitle.c_str(), locBuildStages_Combo.size(), -0.5, locBuildStages_Combo.size() - 0.5, 1000, 0, 1000);
653 for(
size_t loc_i = 0; loc_i < locBuildStages_Combo.size(); ++loc_i)
659 gDirectory->cd(
"..");
668 auto locNumPreComboStages = 3;
669 japp->WriteLock(
"DSourceComboer_Survival");
673 auto& locReaction = locReactionPair.first;
674 for(
auto& locStagePair : locReactionPair.second)
676 auto locNumCombos = locStagePair.second;
677 if(locNumCombos == 0)
680 auto locStageIndex =
static_cast<std::underlying_type<DConstructionStage>::type
>(locStagePair.first);
682 if(locStageIndex < locNumPreComboStages)
686 auto locBin = locStageIndex - locNumPreComboStages + 1;
695 japp->Unlock(
"DSourceComboer_Survival");
700 for(
auto& locStagePair : locReactionPair.second)
701 locStagePair.second = 0;
748 map<size_t, DSourceComboUse> locStepComboUseMap;
751 auto locReaction = locReactionVertexInfo->
Get_Reaction();
753 for(
auto locStepIterator = locReactionSteps.rbegin(); locStepIterator != locReactionSteps.rend(); ++locStepIterator)
755 auto locStep = *locStepIterator;
756 auto locStepIndex = locReaction->Get_NumReactionSteps() - std::distance(locReactionSteps.rbegin(), locStepIterator) - 1;
758 cout <<
"Step index " << locStepIndex << endl;
766 auto locIncludeParentFlag = locFinalStateDecayingComboUsesPair.first;
767 auto& locFurtherDecays = locFinalStateDecayingComboUsesPair.second;
770 map<DSourceComboUse, unsigned char> locFurtherDecays_Charged, locFurtherDecays_Neutral, locFurtherDecays_Mixed;
771 for(
const auto& locDecayPair : locFurtherDecays)
775 locFurtherDecays_Charged.emplace(locDecayPair);
777 locFurtherDecays_Neutral.emplace(locDecayPair);
779 locFurtherDecays_Mixed.emplace(locDecayPair);
784 locIncludeParentFlag =
false;
787 auto locInitPID = locIncludeParentFlag ? locStep->Get_InitialPID() :
Unknown;
788 bool locNoChargedFlag = (locChargedParticleMap.empty() && locFurtherDecays_Charged.empty());
789 bool locNoNeutralFlag = (locNeutralParticleMap.empty() && locFurtherDecays_Neutral.empty());
792 auto locTargetToInclude = (locStepIndex != 0) ? locStep->Get_TargetPID() :
Unknown;
795 bool locMissingDecayProductFlag =
false;
800 cout <<
"locIncludeParentFlag, init pid, missing-product flag, to-include target pid: " << locIncludeParentFlag <<
", " << locInitPID <<
", " << locMissingDecayProductFlag <<
", " << locTargetToInclude << endl;
804 if(locNoChargedFlag && locNoNeutralFlag)
805 locPrimaryComboUse =
Make_ComboUse(locInitPID, {}, locFurtherDecays_Mixed, locMissingDecayProductFlag, locTargetToInclude);
806 else if(locNoNeutralFlag && locFurtherDecays_Mixed.empty())
807 locPrimaryComboUse =
Make_ComboUse(locInitPID, locChargedParticleMap, locFurtherDecays_Charged, locMissingDecayProductFlag, locTargetToInclude);
808 else if(locNoChargedFlag && locFurtherDecays_Mixed.empty())
809 locPrimaryComboUse =
Make_ComboUse(locInitPID, locNeutralParticleMap, locFurtherDecays_Neutral, locMissingDecayProductFlag, locTargetToInclude);
812 auto locFurtherDecays_All = locFurtherDecays_Mixed;
813 map<Particle_t, unsigned char> locParticleMap_All = {};
815 if(!locNoChargedFlag)
818 if(locChargedParticleMap.empty() && (locFurtherDecays_Charged.size() == 1) && (locFurtherDecays_Charged.begin()->second == 1))
819 locFurtherDecays_All.emplace(locFurtherDecays_Charged.begin()->first, 1);
823 locFurtherDecays_All.emplace(locComboUse_Charged, 1);
826 if(!locNoNeutralFlag)
829 if(locNeutralParticleMap.empty() && (locFurtherDecays_Neutral.size() == 1))
830 locFurtherDecays_All.emplace(locFurtherDecays_Neutral.begin()->first, locFurtherDecays_Neutral.begin()->second);
831 else if(locFurtherDecays_Neutral.empty() && (locNeutralParticleMap.size() == 1))
832 locParticleMap_All.emplace(locNeutralParticleMap.begin()->first, locNeutralParticleMap.begin()->second);
836 locFurtherDecays_All.emplace(locComboUse_Neutral, 1);
840 locPrimaryComboUse =
Make_ComboUse(locInitPID, locParticleMap_All, locFurtherDecays_All, locMissingDecayProductFlag, locTargetToInclude);
843 locStepComboUseMap.emplace(locStepIndex, locPrimaryComboUse);
849 for(
const auto& locUseStepPair : locStepComboUseMap)
851 for(
auto locTempReaction : locReactionVertexInfo->
Get_Reactions())
855 cout <<
"DSourceComboInfo OBJECTS CREATED" << endl;
861 auto locIncludeParentFlag =
true;
862 map<DSourceComboUse, unsigned char> locFurtherDecays;
864 for(
size_t loc_i = 0; loc_i < locStep->Get_NumFinalPIDs(); ++loc_i)
867 if(locDecayStepIndex < 0)
870 auto locUseIterator = locStepComboUseMap.find(
size_t(locDecayStepIndex));
871 if(locUseIterator == locStepComboUseMap.end())
872 locIncludeParentFlag =
false;
876 auto& locSourceComboUse = locUseIterator->second;
877 auto locDecayIterator = locFurtherDecays.find(locSourceComboUse);
878 if(locDecayIterator == locFurtherDecays.end())
879 locFurtherDecays.emplace(locSourceComboUse, 1);
881 ++(locDecayIterator->second);
885 return std::make_pair(locIncludeParentFlag, locFurtherDecays);
891 map<Particle_t, unsigned char> locNumParticles;
892 auto locParticles = locReaction->
Get_FinalPIDs(locStepIndex,
false,
false, locCharge,
true);
893 for(
const auto& locPID : locParticles)
895 auto locPIDIterator = locNumParticles.find(locPID);
896 if(locPIDIterator != locNumParticles.end())
897 ++(locPIDIterator->second);
899 locNumParticles.emplace(locPID, 1);
902 return locNumParticles;
908 vector<pair<DSourceComboUse, unsigned char>> locDecayVector;
909 locDecayVector.reserve(locFurtherDecays.size());
910 std::copy(locFurtherDecays.begin(), locFurtherDecays.end(), std::back_inserter(locDecayVector));
913 vector<pair<Particle_t, unsigned char>> locParticleVector;
914 locParticleVector.reserve(locNumParticles.size());
915 std::copy(locNumParticles.begin(), locNumParticles.end(), std::back_inserter(locParticleVector));
922 cout <<
"CREATED COMBO USE:" << endl;
937 return *locInfoIterator;
940 auto locComboInfo =
new DSourceComboInfo(locNumParticles, locFurtherDecays);
945 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
946 cout <<
"CREATED COMBO INFO:" << endl;
948 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
966 if(locIteratorPair.first != locIteratorPair.second)
967 return *(locIteratorPair.first);
970 auto locComboInfo =
new DSourceComboInfo(locNumParticles, locFurtherDecays);
975 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
976 cout <<
"CREATED COMBO INFO:" << endl;
978 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
996 auto locCreationPair = std::make_pair(locReactionVertexInfo, locVertexZBins);
999 return locUseIterator->second;
1001 auto locReaction = locReactionVertexInfo->
Get_Reaction();
1004 unordered_map<size_t, DSourceComboUse> locCreatedUseMap;
1006 for(
const auto& locStepVertexInfo : locStepVertexInfos)
1011 cout <<
"step, vertex z-bin = " << locStepVertexInfo->Get_StepIndices().front() <<
", " << locVertexZBin << endl;
1014 auto locStepIndices = locStepVertexInfo->Get_StepIndices();
1015 for(
auto locStepIterator = locStepIndices.rbegin(); locStepIterator != locStepIndices.rend(); ++locStepIterator)
1017 auto locStepIndex = *locStepIterator;
1021 auto locNewComboUse =
Build_NewZDependentUse(locReaction, locStepIndex, locVertexZBin, locStepOrigUse, locCreatedUseMap);
1022 locCreatedUseMap.emplace(locStepIndex, locNewComboUse);
1027 return locCreatedUseMap[0];
1034 auto locOrigInfo = std::get<2>(locOrigUse);
1041 map<DSourceComboUse, unsigned char> locNewFurtherDecays;
1042 auto locOrigFurtherDecays = locOrigInfo->Get_FurtherDecays();
1043 for(
const auto& locDecayPair : locOrigFurtherDecays)
1045 const auto& locOrigDecayUse = locDecayPair.first;
1046 auto locDecayPID = std::get<0>(locOrigDecayUse);
1050 for(
unsigned char locInstance = 1; locInstance <= locDecayPair.second; ++locInstance)
1054 const auto& locSavedDecayUse = locCreatedUseMap.find(locDecayStepIndex)->second;
1057 auto locUseIterator = locNewFurtherDecays.find(locSavedDecayUse);
1058 if(locUseIterator != locNewFurtherDecays.end())
1059 ++(locUseIterator->second);
1061 locNewFurtherDecays.emplace(locSavedDecayUse, 1);
1067 auto locNewComboUse =
Build_NewZDependentUse(locReaction, locStepIndex, locVertexZBin, locOrigDecayUse, locCreatedUseMap);
1069 auto locUseIterator = locNewFurtherDecays.find(locNewComboUse);
1070 if(locUseIterator != locNewFurtherDecays.end())
1071 ++(locUseIterator->second);
1073 locNewFurtherDecays.emplace(locNewComboUse, 1);
1078 vector<pair<DSourceComboUse, unsigned char>> locFurtherDecayVector;
1079 locFurtherDecayVector.reserve(locNewFurtherDecays.size());
1080 std::copy(locNewFurtherDecays.begin(), locNewFurtherDecays.end(), std::back_inserter(locFurtherDecayVector));
1081 auto locNewComboInfo = locNewFurtherDecays.empty() ? locOrigInfo :
GetOrMake_SourceComboInfo(locOrigInfo->Get_NumParticles(), locFurtherDecayVector, 0);
1083 DSourceComboUse locNewComboUse(std::get<0>(locOrigUse), locVertexZBin, locNewComboInfo, std::get<3>(locOrigUse), std::get<4>(locOrigUse));
1086 cout <<
"NEW Z-DEPENDENT USE:" << endl;
1088 cout <<
"FROM ORIG USE:" << endl;
1092 return locNewComboUse;
1100 auto locEventNumber = locEventLoop->GetJEvent().GetEventNumber();
1150 vector<const DNeutralShower*> locNeutralShowers;
1153 vector<const DChargedTrack*> locChargedTracks;
1154 locEventLoop->Get(locChargedTracks,
"Combo");
1156 vector<const DBeamPhoton*> locBeamPhotons;
1157 locEventLoop->Get(locBeamPhotons);
1160 locEventLoop->GetSingle(locInitialRFBunch);
1163 locEventLoop->GetSingle(locDetectorMatches,
"Combo");
1166 const DVertex* locVertex =
nullptr;
1167 locEventLoop->GetSingle(locVertex);
1170 vector<const DESSkimData*> locESSkimDataVector;
1171 locEventLoop->Get(locESSkimDataVector);
1172 dESSkimData = locESSkimDataVector.empty() ? NULL : locESSkimDataVector[0];
1180 auto& locShowerByBunchMap = locZBinPair.second;
1182 cout <<
"Register zbin: " << int(locZBinPair.first) << endl;
1183 for(
auto& locBunchPair : locShowerByBunchMap)
1192 for(
const auto& locChargedTrack : locChargedTracks)
1194 for(
const auto& locChargedHypo : locChargedTrack->dChargedTrackHypotheses)
1197 cout <<
"track, hypo, pid, t1 system = " << locChargedTrack <<
", " << locChargedHypo <<
", " << locChargedHypo->PID() <<
", " << locChargedHypo->t1_detector() << endl;
1201 cout <<
"passed cuts, register" << endl;
1202 dTracksByPID[locChargedHypo->PID()].push_back(locChargedTrack);
1210 std::sort(locPIDPair.second.begin(), locPIDPair.second.end());
1214 for(
auto& locChargePair : dTracksByCharge)
1216 auto& locVector = locChargePair.second;
1217 std::sort(locVector.begin(), locVector.end());
1218 locVector.erase(std::unique(locVector.begin(), locVector.end()), locVector.end());
1223 cout <<
"TRACKS BY PID:" << endl;
1224 for(
const auto& locPIDPair : dTracksByPID)
1226 cout <<
"PID, pointers: " << locPIDPair.first <<
", ";
1227 for(
const auto& locTrack : locPIDPair.second)
1228 cout << locTrack <<
", ";
1231 cout <<
"TRACKS BY CHARGE:" << endl;
1232 for(
const auto& locChargePair : dTracksByCharge)
1234 cout <<
"charge, pointers: " << (locChargePair.first ? 1 : -1) <<
", ";
1235 for(
const auto& locTrack : locChargePair.second)
1236 cout << locTrack <<
", ";
1242 Fill_CutHistograms();
1247 auto locPID = locChargedTrackHypothesis->
PID();
1249 auto locP = locTrackTimeBased->
momentum().Mag();
1250 bool locPassedCutFlag =
true;
1254 if(locTrackTimeBased->dNumHitsUsedFordEdx_CDC > 0)
1256 auto locdEdx = locTrackTimeBased->ddEdx_CDC_amp*1.0E6;
1258 locPassedCutFlag =
false;
1263 auto locSystem = locChargedTrackHypothesis->
t1_detector();
1269 if(locTrackTimeBased->dNumHitsUsedFordEdx_FDC > 0)
1271 auto locdEdx = locTrackTimeBased->ddEdx_FDC*1.0E6;
1273 locPassedCutFlag =
false;
1278 if(locSCHitMatchParams !=
nullptr)
1280 auto locdEdx = locSCHitMatchParams->dEdx*1.0E3;
1282 locPassedCutFlag =
false;
1287 if(locTOFHitMatchParams !=
nullptr)
1289 auto locdEdx = locTOFHitMatchParams->dEdx*1.0E3;
1291 locPassedCutFlag =
false;
1296 if(locBCALShowerMatchParams !=
nullptr)
1298 const DBCALShower* locBCALShower = locBCALShowerMatchParams->dBCALShower;
1299 double locEOverP = locBCALShower->
E/locP;
1301 locPassedCutFlag =
false;
1306 if(locFCALShowerMatchParams !=
nullptr)
1308 const DFCALShower* locFCALShower = locFCALShowerMatchParams->dFCALShower;
1309 double locEOverP = locFCALShower->
getEnergy()/locP;
1311 locPassedCutFlag =
false;
1314 return locPassedCutFlag;
1319 japp->WriteLock(
"DSourceComboer_Cuts");
1323 for(
auto& locSystemPair : locPIDPair.second)
1325 auto&
locHist = locSystemPair.second;
1326 auto& locVector =
ddEdxValueMap[locPIDPair.first][locSystemPair.first];
1327 for(
auto& locVectorPair : locVector)
1328 locHist->Fill(locVectorPair.first, locVectorPair.second);
1333 for(
auto& locSystemPair : locPIDPair.second)
1335 auto&
locHist = locSystemPair.second;
1336 auto& locVector =
dEOverPValueMap[locPIDPair.first][locSystemPair.first];
1337 for(
auto& locVectorPair : locVector)
1338 locHist->Fill(locVectorPair.first, locVectorPair.second);
1342 japp->Unlock(
"DSourceComboer_Cuts");
1347 for(
auto& locSystemPair : locPIDPair.second)
1348 decltype(locSystemPair.second)().swap(locSystemPair.second);
1352 for(
auto& locSystemPair : locPIDPair.second)
1353 decltype(locSystemPair.second)().swap(locSystemPair.second);
1368 for(
auto locReaction : locReactions)
1370 locOutputComboMap[locReaction] = {};
1378 cout <<
"FINISHED COMBOING:" << endl;
1379 for(
auto locComboPair : locOutputComboMap)
1380 cout <<
"event#, reaction, #combos = " <<
dEventNumber <<
", " << locComboPair.first->Get_ReactionName() <<
", " << locComboPair.second.size() << endl;
1382 return locOutputComboMap;
1442 auto locPrimaryComboInfo = std::get<2>(locPrimaryComboUse);
1450 cout <<
"No charged tracks." << endl;
1451 for(
auto& locReaction : locReactions)
1460 cout <<
"FINISHED COMBOING:" << endl;
1461 for(
auto locComboPair : locOutputComboMap)
1462 cout <<
"event#, reaction, #combos = " <<
dEventNumber <<
", " << locComboPair.first->Get_ReactionName() <<
", " << locComboPair.second.size() << endl;
1464 return locOutputComboMap;
1470 for(
auto& locReaction : locReactions)
1475 cout <<
"Charged combos built: " << locReactionChargedCombos.size() << endl;
1476 if(locReactionChargedCombos.empty())
1477 cout <<
"no combos for event: " <<
dEventNumber << endl;
1481 for(
const auto& locReactionChargedCombo : locReactionChargedCombos)
1487 vector<int> locBeamBunches_Charged;
1490 for(
auto& locReaction : locReactions)
1494 auto locChargeContent = dComboInfoChargeContent[locPrimaryComboInfo];
1498 cout <<
"Fully charged." << endl;
1503 if(locBeamBunches_Charged.empty())
1510 cout <<
"Selected rf bunch." << endl;
1512 for(
auto& locReaction : locReactions)
1521 Combo_WithBeam(locReactions, locReactionVertexInfo, locPrimaryComboUse, locReactionChargedCombo, locRFBunch, locOutputComboMap);
1526 Combo_WithNeutralsAndBeam(locReactions, locReactionVertexInfo, locPrimaryComboUse, locReactionChargedCombo, locBeamBunches_Charged, locOutputComboMap);
1531 cout <<
"FINISHED COMBOING:" << endl;
1532 for(
auto locComboPair : locOutputComboMap)
1533 cout <<
"event#, reaction, #combos = " <<
dEventNumber <<
", " << locComboPair.first->Get_ReactionName() <<
", " << locComboPair.second.size() << endl;
1536 return locOutputComboMap;
1545 cout << endl <<
"Comboing neutrals, z-independent, #FCAL/BCAL showers: " << locNumFCALShowers <<
"/" << locNumDetectedShowers - locNumFCALShowers << endl;
1550 cout <<
"charged combo, vertex zbins: " << locReactionChargedCombo;
1552 for(
auto& locZBin : locVertexZBins)
1553 cout <<
", " << int(locZBin);
1562 if(!locStepVertexInfo->Get_OnlyConstrainTimeParticles().empty())
1565 cout <<
"Combo has photons at a vertex that is out of range: don't combo." << endl;
1574 cout << endl <<
"Comboing neutrals, z-dependent." << endl;
1578 vector<int> locComboRFBunches = locBeamBunches_Charged;
1581 locComboRFBunches.clear();
1584 cout << endl <<
"Neutral combos created, # with the charged RF bunches: " << locReactionFullCombos.size() << endl;
1585 for(
auto& locReaction : locReactions)
1592 for(
const auto& locReactionFullCombo : locReactionFullCombos)
1598 cout <<
"#charged bunches, #neutral, #common = " << locBeamBunches_Charged.size() <<
", " << locNeutralRFBunches.size() <<
", " << locValidRFBunches.size() << endl;
1599 if(locValidRFBunches.empty() && (!locNeutralRFBunches.empty() || !locBeamBunches_Charged.empty()))
1603 if(locReactionChargedCombo !=
nullptr)
1615 cout <<
"Failed photon/photon-vertex PID timing cuts" << endl;
1618 for(
auto& locReaction : locReactions)
1622 if(locValidRFBunches.empty())
1627 for(
auto& locReaction : locReactions)
1635 for(
auto& locReaction : locReactions)
1642 if(locValidRFBunches.empty())
1652 for(
auto& locReaction : locReactions)
1659 Combo_WithBeam(locReactions, locReactionVertexInfo, locZDependentComboUse, locReactionFullCombo, locRFBunch, locOutputComboMap);
1666 cout << endl <<
"Comboing beam." << endl;
1672 cout <<
"No beam particles, we are done!" << endl;
1676 for(
const auto& locReaction : locReactions)
1681 if(!locPassMassCutFlag)
1693 if (abs(locRFBunch) > 2000000000)
1698 cout <<
"rf bunch, max #rf bunches, #beams = " << locRFBunch <<
", " <<
dMaxRFBunchCuts[locReactionVertexInfo] <<
", " << locBeamParticles.size() << endl;
1699 if(locBeamParticles.empty())
1701 for(
const auto& locReaction : locReactions)
1705 for(
const auto& locBeamParticle : locBeamParticles)
1713 for(
const auto& locReaction : locReactions)
1719 for(
const auto& locReaction : locReactions)
1725 for(
const auto& locReaction : locReactions)
1730 size_t locDeltaRFBunch = abs(locRFBunch - locBeamRFBunch);
1731 for(
const auto& locReaction : locReactions)
1734 cout<<
"beam rf bunch, delta rf bunch, reaction, max for reaction = " << locBeamRFBunch <<
", " << locDeltaRFBunch <<
", " << locReaction->Get_ReactionName() <<
", " <<
dRFBunchCutsByReaction[locReaction] << endl;
1747 cout <<
"Created particle combo, beam energy, combo contents = " << locBeamParticle->energy() << endl;
1799 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1800 cout <<
"Creating source combos: Stage, presiding charged combo: " << locComboingStage <<
", " << locChargedCombo_Presiding << endl;
1801 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1802 cout <<
"PRESIDING COMBO:" << endl;
1804 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1805 cout <<
"USE TO CREATE:" << endl;
1810 const auto& locDecayPID = std::get<0>(locComboUseToCreate);
1811 const auto& locVertexZBin = std::get<1>(locComboUseToCreate);
1812 const auto& locSourceComboInfo = std::get<2>(locComboUseToCreate);
1813 const auto& locMissingDecayProductFlag = std::get<3>(locComboUseToCreate);
1817 if(locSourceCombosByUseSoFar.find(locComboUseToCreate) != locSourceCombosByUseSoFar.end())
1820 cout <<
"Already created!" << endl;
1827 if(locSourceCombosByUseSoFar.find(locUnknownComboUse) == locSourceCombosByUseSoFar.end())
1832 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1833 cout <<
"Combos with unknown parent created, desired decay pid = " << locDecayPID << endl;
1842 auto locSourceCombos = locSourceCombosByUseSoFar[locUnknownComboUse];
1849 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1850 cout <<
"On charged stage, need neutrals: done for now" << endl;
1852 locSourceCombosByUseSoFar.emplace(locComboUseToCreate, locSourceCombos);
1859 if(locMissingDecayProductFlag)
1864 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1865 cout <<
"Missing decay product: No invariant mass cut." << endl;
1867 locSourceCombosByUseSoFar.emplace(locComboUseToCreate, locSourceCombos);
1886 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1887 cout <<
"Massive neutrals, done for now" << endl;
1889 locSourceCombosByUseSoFar.emplace(locComboUseToCreate, locSourceCombos);
1890 (*locSourceCombosByBeamBunchByUse)[locComboUseToCreate] = (*locSourceCombosByBeamBunchByUse)[locUnknownComboUse];
1902 if(locSourceCombos->empty())
1910 for(
auto& locCombo : *locSourceCombos)
1912 if(!locCombo->Get_IsComboingZIndependent())
1913 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locCombo);
1917 auto& locUnknownBothCombosByBeamBunch = (*locSourceCombosByBeamBunchByUse)[locUnknownComboUse];
1918 for(
const auto& locComboBeamBunchPair : locUnknownBothCombosByBeamBunch)
1920 if(locComboBeamBunchPair.first.size() > 1)
1922 for(
const auto& locCombo : locComboBeamBunchPair.second)
1924 if(!locCombo->Get_IsComboingZIndependent())
1925 (*locSourceCombosByBeamBunchByUse)[locComboUseToCreate][locComboBeamBunchPair.first].push_back(locCombo);
1935 auto locTargetPIDToSubtract = std::get<4>(locComboUseToCreate);
1936 for(
const auto& locSourceCombo : *locSourceCombos)
1939 if((locComboingStage ==
d_MixedStage) && locSourceCombo->Get_IsComboingZIndependent())
1945 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locSourceCombo);
1951 Register_ValidRFBunches(locComboUseToCreate, locSourceCombo, locBeamBunches, locComboingStage, locChargedCombo_Presiding);
1987 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1988 cout <<
"Create_SourceCombos_Unknown: Stage, presiding charged combo, use to create = " << locComboingStage <<
", " << locChargedCombo_Presiding << endl;
1989 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1990 cout <<
"PRESIDING COMBO:" << endl;
1992 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
1993 cout <<
"USE TO CREATE:" << endl;
1998 auto locComboInfoToCreate = std::get<2>(locComboUseToCreate);
2000 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locChargeContent, locChargedCombo_Presiding);
2003 if(locSourceCombosByUseSoFar.find(locComboUseToCreate) != locSourceCombosByUseSoFar.end())
2006 cout <<
"We're done!" << endl;
2013 if(locSourceCombosByUseSoFar.find(locComboUseToCreate) != locSourceCombosByUseSoFar.end())
2016 cout <<
"We're done!" << endl;
2032 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2033 cout <<
"Combo_Vertically_AllDecays: Stage, presiding charged combo = " << locComboingStage <<
", " << locChargedCombo_Presiding << endl;
2034 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2035 cout <<
"PRESIDING COMBO:" << endl;
2037 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2038 cout <<
"USE TO CREATE:" << endl;
2043 auto locComboInfo = std::get<2>(locComboUseToCreate);
2044 auto locVertexZBin = std::get<1>(locComboUseToCreate);
2045 auto locNumParticlesNeeded = locComboInfo->Get_NumParticles();
2046 auto locFurtherDecays = locComboInfo->Get_FurtherDecays();
2049 for(
const auto& locFurtherDecayPair : locFurtherDecays)
2051 auto& locSourceComboDecayUse = locFurtherDecayPair.first;
2052 auto& locNumDecaysNeeded = locFurtherDecayPair.second;
2053 auto locSourceComboDecayInfo = std::get<2>(locSourceComboDecayUse);
2062 if(locNumDecaysNeeded == 1)
2066 auto locChargedCombo_NextPresiding =
Get_NextChargedCombo(locChargedCombo_Presiding, locSourceComboDecayUse, locComboingStage,
true, 1);
2067 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locDecayChargeContent, locChargedCombo_NextPresiding);
2070 if(locSourceCombosByUseSoFar.find(locSourceComboDecayUse) == locSourceCombosByUseSoFar.end())
2073 Create_SourceCombos(locSourceComboDecayUse, locComboingStage, locChargedCombo_NextPresiding, locNumTabs + 1);
2076 cout <<
"This decay already created!" << endl;
2084 auto locNeededGroupingUse = locComboUseToCreate;
2085 if((locFurtherDecays.size() > 1) || !locNumParticlesNeeded.empty())
2087 auto locGroupingComboInfo =
GetOrMake_SourceComboInfo({}, {std::make_pair(locSourceComboDecayUse, locNumDecaysNeeded)}, locNumTabs);
2088 locNeededGroupingUse = std::make_tuple(
Unknown, locVertexZBin, locGroupingComboInfo,
false,
Unknown);
2092 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locDecayChargeContent, locChargedCombo_Presiding);
2093 if(locSourceCombosByUseSoFar.find(locNeededGroupingUse) != locSourceCombosByUseSoFar.end())
2096 cout <<
"This decay already created!" << endl;
2102 auto locNMinus1ComboUse = locSourceComboDecayUse;
2103 if(locNumDecaysNeeded > 2)
2105 auto locNMinus1Info =
GetOrMake_SourceComboInfo({}, {std::make_pair(locSourceComboDecayUse, locNumDecaysNeeded - 1)}, locNumTabs);
2106 locNMinus1ComboUse = std::make_tuple(
Unknown, locVertexZBin, locNMinus1Info,
false,
Unknown);
2110 if(locNumDecaysNeeded == 2)
2112 auto locChargedCombo_NextPresiding =
Get_NextChargedCombo(locChargedCombo_Presiding, locSourceComboDecayUse, locComboingStage,
true, 1);
2113 locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locDecayChargeContent, locChargedCombo_NextPresiding);
2114 if(locSourceCombosByUseSoFar.find(locNMinus1ComboUse) == locSourceCombosByUseSoFar.end())
2115 Create_SourceCombos(locNMinus1ComboUse, locComboingStage, locChargedCombo_NextPresiding, locNumTabs + 1);
2120 if(locSourceCombosByUseSoFar.find(locNMinus1ComboUse) == locSourceCombosByUseSoFar.end())
2125 Combo_Vertically_NDecays(locNeededGroupingUse, locNMinus1ComboUse, locSourceComboDecayUse, locComboingStage, locChargedCombo_Presiding, locNumTabs);
2134 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2135 cout <<
"Combo_Vertically_NDecays: Stage, presiding charged combo = " << locComboingStage <<
", " << locChargedCombo_Presiding << endl;
2136 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2137 cout <<
"PRESIDING COMBO:" << endl;
2139 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2140 cout <<
"USE TO CREATE:" << endl;
2142 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2143 cout <<
"N - 1 USE:" << endl;
2145 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2146 cout <<
"SINGLE USE:" << endl;
2150 auto locNIs2Flag = (locNMinus1ComboUse == locSourceComboDecayUse);
2153 auto locComboInfoToCreate = std::get<2>(locComboUseToCreate);
2155 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locChargeContent, locChargedCombo_Presiding);
2159 const auto& locCombos_NMinus1 = *locSourceCombosByUseSoFar[locNMinus1ComboUse];
2167 cout <<
"n-1 size: " << locCombos_NMinus1.size() << endl;
2168 if(locCombos_NMinus1.empty())
2174 auto locInstanceUse = locCombos_NMinus1.front()->Get_IsComboingZIndependent() ? locZIndependentDecayUse : locSourceComboDecayUse;
2175 auto locFirstNMinus1FurtherDecayCombos = locCombos_NMinus1.front()->Get_FurtherDecayCombos();
2176 size_t locInstance = 2;
2179 auto locIteratorPair = std::equal_range(locFirstNMinus1FurtherDecayCombos.begin(), locFirstNMinus1FurtherDecayCombos.end(), locInstanceUse,
DSourceCombo::DCompare_FurtherDecays());
2180 locInstance = (*locIteratorPair.first).second.size() + 1;
2182 auto locPreviousPresidingCombo =
Get_NextChargedCombo(locChargedCombo_Presiding, locSourceComboDecayUse, locComboingStage,
true, locInstance);
2183 auto locChargedCombo_WithPrevious =
Get_ChargedCombo_WithNow(locPreviousPresidingCombo, locComboInfoToCreate, locComboingStage);
2186 cout <<
"instance = " << locInstance <<
", combos: presiding, previous-presiding, with-previous: " << locChargedCombo_Presiding <<
", " << locPreviousPresidingCombo <<
", " << locChargedCombo_WithPrevious << endl;
2194 auto& locComboResultsVector = *(locSourceCombosByUseSoFar[locComboUseToCreate]);
2195 for(
const auto& locCombo_NMinus1 : locCombos_NMinus1)
2201 const auto& locValidRFBunches_NMinus1 =
dValidRFBunches_ByCombo[std::make_pair(locCombo_NMinus1, std::get<1>(locNMinus1ComboUse))];
2202 const auto& locDecayCombos_1 =
Get_CombosForComboing(locSourceComboDecayUse, locComboingStage, locValidRFBunches_NMinus1, locPreviousPresidingCombo);
2204 cout <<
"decay combos vector address, size: " << &locDecayCombos_1 <<
", " << locDecayCombos_1.size() << endl;
2207 cout <<
"Vector combos: ";
2208 for(
auto& locCombo : locDecayCombos_1)
2209 cout << locCombo <<
", ";
2220 auto locNMinus1ComboDecayUse = locCombo_NMinus1->Get_IsComboingZIndependent() ? locZIndependentDecayUse : locSourceComboDecayUse;
2221 auto locNMinus1FurtherDecayCombos = locCombo_NMinus1->Get_FurtherDecayCombos();
2222 auto locNMinus1LastCombo = locCombo_NMinus1;
2225 auto locIteratorPair = std::equal_range(locNMinus1FurtherDecayCombos.begin(), locNMinus1FurtherDecayCombos.end(), locNMinus1ComboDecayUse,
DSourceCombo::DCompare_FurtherDecays());
2226 locNMinus1LastCombo = (*locIteratorPair.first).second.back();
2229 auto locComboSearchIndex =
Get_ResumeAtIndex_Combos(locSourceComboDecayUse, locNMinus1LastCombo, locValidRFBunches_NMinus1, locComboingStage);
2231 cout <<
"n-1 last combo, begin search index = : " << locNMinus1LastCombo <<
", " << locComboSearchIndex << endl;
2232 if(locComboSearchIndex == locDecayCombos_1.size())
2237 std::sort(locUsedParticles_NMinus1.begin(), locUsedParticles_NMinus1.end());
2240 auto Search_Duplicates = [&locUsedParticles_NMinus1](
const JObject* locParticle) ->
bool
2241 {
return std::binary_search(locUsedParticles_NMinus1.begin(), locUsedParticles_NMinus1.end(), locParticle);};
2243 auto locIsZIndependent_NMinus1 = locCombo_NMinus1->Get_IsComboingZIndependent();
2246 for(; locComboSearchIndex != locDecayCombos_1.size(); ++locComboSearchIndex)
2248 const auto locDecayCombo_1 = locDecayCombos_1[locComboSearchIndex];
2251 auto locIsZIndependent = locIsZIndependent_NMinus1 && locDecayCombo_1->Get_IsComboingZIndependent();
2252 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
2257 if(std::any_of(locUsedParticles_1.begin(), locUsedParticles_1.end(), Search_Duplicates))
2266 vector<const DSourceCombo*> locAllDecayCombos;
2268 locAllDecayCombos = {locCombo_NMinus1, locDecayCombo_1};
2271 auto locIteratorPair = std::equal_range(locNMinus1FurtherDecayCombos.begin(), locNMinus1FurtherDecayCombos.end(), locNMinus1ComboDecayUse,
DSourceCombo::DCompare_FurtherDecays());
2272 locAllDecayCombos = (*locIteratorPair.first).second;
2273 locAllDecayCombos.push_back(locDecayCombo_1);
2279 locCombo->Set_Members({}, locFurtherDecayCombos, locIsZIndependent);
2282 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2283 cout <<
"CREATED COMBO:" << endl;
2288 locComboResultsVector.push_back(locCombo);
2289 Register_ValidRFBunches(locComboUseToCreate, locCombo, locValidRFBunches, locComboingStage, locChargedCombo_Presiding);
2299 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2300 cout <<
"Combo_Vertically_NDecays: NUM SOURCE COMBOS CREATED: " << locComboResultsVector.size() << endl;
2309 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2310 cout <<
"Combo_Vertically_AllParticles: Stage = " << locComboingStage << endl;
2311 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2312 cout <<
"USE TO CREATE:" << endl;
2317 auto locVertexZBin = std::get<1>(locComboUseToCreate);
2318 auto locNumParticlesNeeded = std::get<2>(locComboUseToCreate)->Get_NumParticles();
2319 auto locFurtherDecays = std::get<2>(locComboUseToCreate)->Get_FurtherDecays();
2325 for(
const auto& locParticlePair : locNumParticlesNeeded)
2328 auto& locPID = locParticlePair.first;
2329 auto& locNumPIDNeeded = locParticlePair.second;
2331 if(locNumPIDNeeded == 1)
2343 if((locNumParticlesNeeded.size() > 1) || !locFurtherDecays.empty())
2346 locNeededGroupingUse = std::make_tuple(
Unknown, locVertexZBin, locGroupingComboInfo,
false,
Unknown);
2350 if(locSourceCombosByUseSoFar.find(locNeededGroupingUse) != locSourceCombosByUseSoFar.end())
2353 cout <<
"This group already created!" << endl;
2359 if(locNumPIDNeeded == 2)
2370 if(locSourceCombosByUseSoFar.find(locNMinus1ComboUse) == locSourceCombosByUseSoFar.end())
2383 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2384 cout <<
"Combo_Vertically_NParticles: Stage = " << locComboingStage << endl;
2385 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2386 cout <<
"USE TO CREATE:" << endl;
2388 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2389 cout <<
"N - 1 USE:" << endl;
2394 auto locComboInfo = std::get<2>(locComboUseToCreate);
2395 auto locParticlePair = locComboInfo->Get_NumParticles().back();
2396 auto locPID = locParticlePair.first;
2397 auto locNumParticles = locParticlePair.second;
2398 auto locVertexZBin = std::get<1>(locComboUseToCreate);
2410 if(locZBin == locVertexZBin)
2413 if(locSourceCombosByUseSoFar.find(locZBinUse) == locSourceCombosByUseSoFar.end())
2417 locSourceCombosByUseSoFar[locComboUseToCreate] = locSourceCombosByUseSoFar[locZBinUse];
2419 locSourceCombosByBeamBunchByUse.emplace(locComboUseToCreate, locSourceCombosByBeamBunchByUse[locZBinUse]);
2425 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2426 cout <<
"Combo_Vertically_NParticles: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseSoFar[locComboUseToCreate]->size() << endl;
2437 if(locNumParticles == 2)
2441 if(locParticles.size() < 2)
2444 auto locLastIteratorToCheck = std::prev(locParticles.end());
2445 for(
auto locFirstIterator = locParticles.begin(); locFirstIterator != locLastIteratorToCheck; ++locFirstIterator)
2448 for(
auto locSecondIterator = std::next(locFirstIterator); locSecondIterator != locParticles.end(); ++locSecondIterator)
2451 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
2456 if((locPID ==
Gamma) && locValidRFBunches.empty())
2463 vector<const JObject*> locPhotons;
2466 locPhotons = {*locFirstIterator, *locSecondIterator};
2470 auto locCombo = locIterator->second;
2471 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locCombo);
2474 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2475 cout <<
"COPIED COMBO:" << endl;
2484 locCombo->Set_Members({std::make_pair(locPID, *locFirstIterator), std::make_pair(locPID, *locSecondIterator)}, {}, locIsZIndependent);
2485 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locCombo);
2490 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2491 cout <<
"CREATED COMBO:" << endl;
2505 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2506 cout <<
"Combo_Vertically_NParticles: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseSoFar[locComboUseToCreate]->size() << endl;
2512 const auto& locCombos_NMinus1 = *locSourceCombosByUseSoFar[locNMinus1ComboUse];
2513 for(
const auto& locCombo_NMinus1 : locCombos_NMinus1)
2516 const auto& locValidRFBunches_NMinus1 =
dValidRFBunches_ByCombo[std::make_pair(locCombo_NMinus1, std::get<1>(locNMinus1ComboUse))];
2517 const auto& locParticles =
Get_ParticlesForComboing(locPID, locComboingStage, locValidRFBunches_NMinus1, locVertexZBin);
2520 auto locLastParticleInCombo = locCombo_NMinus1->Get_SourceParticles(
false).back().second;
2521 auto locParticleSearchIndex =
Get_ResumeAtIndex_Particles(locPID, locLastParticleInCombo, locValidRFBunches_NMinus1, locVertexZBin);
2523 cout <<
"particle index, #particles = " << locParticleSearchIndex <<
", " << locParticles.size() << endl;
2524 if(locParticleSearchIndex == locParticles.size())
2527 auto locIsZIndependent_NMinus1 = locCombo_NMinus1->Get_IsComboingZIndependent();
2529 for(; locParticleSearchIndex < locParticles.size(); ++locParticleSearchIndex)
2531 auto& locParticle = locParticles[locParticleSearchIndex];
2533 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
2540 auto locComboParticlePairs = locCombo_NMinus1->Get_SourceParticles();
2546 vector<const JObject*> locPhotons;
2549 auto GetParticle = [](
const pair<Particle_t, const JObject*>& locPair) ->
const JObject* {
return locPair.second;};
2550 std::transform(locComboParticlePairs.begin(), locComboParticlePairs.end(), std::back_inserter(locPhotons), GetParticle);
2551 locPhotons.push_back(locParticle);
2555 auto locCombo = locIterator->second;
2556 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locCombo);
2559 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2560 cout <<
"COPIED COMBO:" << endl;
2568 locComboParticlePairs.emplace_back(locPID, locParticle);
2570 locCombo->Set_Members(locComboParticlePairs, {}, locIsZIndependent);
2571 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locCombo);
2576 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2577 cout <<
"CREATED COMBO:" << endl;
2591 cout <<
"Combo_Vertically_NParticles: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseSoFar[locComboUseToCreate]->size() << endl;
2592 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2603 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2604 cout <<
"Combo_Horizontally_All: Stage, presiding charged combo = " << locComboingStage <<
", " << locChargedCombo_Presiding << endl;
2605 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2606 cout <<
"PRESIDING COMBO:" << endl;
2608 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2609 cout <<
"USE TO CREATE:" << endl;
2614 auto locVertexZBin = std::get<1>(locComboUseToCreate);
2615 const auto& locComboInfoToCreate = std::get<2>(locComboUseToCreate);
2616 auto locNumParticlesNeeded = locComboInfoToCreate->Get_NumParticles();
2617 auto locFurtherDecays = locComboInfoToCreate->Get_FurtherDecays();
2620 if(locNumParticlesNeeded.empty() && (locFurtherDecays.size() == 1))
2622 Create_Combo_OneDecay(locComboUseToCreate, locComboingStage, locChargedCombo_Presiding, locNumTabs);
2625 if(locFurtherDecays.empty() && (locNumParticlesNeeded.size() == 1))
2628 auto& locParticlePair = locNumParticlesNeeded.front();
2629 if(locParticlePair.second > 1)
2652 auto locChargedCombo_SubsetToBuildPresiding = locChargedCombo_Presiding;
2655 bool locMissingSubsetIsDecayFlag =
true;
2656 if((locFurtherDecays.size() == 1) && (locNumParticlesNeeded.size() == 1))
2659 cout <<
"1 decay, 1 type of particle needed" << endl;
2666 cout <<
"build decay first" << endl;
2667 auto locAllBut1ComboUse = locFurtherDecays[0].first;
2668 locMissingSubsetIsDecayFlag =
false;
2671 auto locAllBut1ComboInfo = std::get<2>(locAllBut1ComboUse);
2672 auto locChargedCombo_NextPresiding =
Get_NextChargedCombo(locChargedCombo_Presiding, locAllBut1ComboUse, locComboingStage,
true, 1);
2676 if(locSourceCombosByUseSoFar.find(locAllBut1ComboUse) == locSourceCombosByUseSoFar.end())
2677 locComboUse_SubsetToBuild = locAllBut1ComboUse;
2682 auto& locAllBut1Combos = locSourceCombosByUseSoFar[locAllBut1ComboUse];
2683 locSourceCombosByUseSoFar.emplace(locComboUseToCreate, locAllBut1Combos);
2692 cout <<
"build particles first" << endl;
2703 auto locToAddComboInfo = (locFurtherDecays[0].second == 1) ? std::get<2>(locFurtherDecays[0].first) :
GetOrMake_SourceComboInfo({}, {std::make_pair(locFurtherDecays[0].first, locFurtherDecays[0].second)}, locNumTabs);
2706 auto locToAddComboUse = (locFurtherDecays[0].second == 1) ? locFurtherDecays[0].first :
DSourceComboUse{
Unknown, locToAddZBin, locToAddComboInfo,
false,
Unknown};
2709 if(locSourceCombosByUseSoFar.find(locAllBut1ComboUse) == locSourceCombosByUseSoFar.end())
2711 locComboUse_SubsetToBuild = locAllBut1ComboUse;
2712 locComboUse_SubsetToAdd = locToAddComboUse;
2713 locChargedCombo_SubsetToBuildPresiding =
nullptr;
2718 Combo_Horizontally_AddCombo(locComboUseToCreate, locAllBut1ComboUse, locToAddComboUse, locComboingStage, locChargedCombo_Presiding,
false, locNumTabs);
2728 for(
auto locDecayIterator = locFurtherDecays.begin(); locDecayIterator != locFurtherDecays.end(); ++locDecayIterator)
2730 if(locFurtherDecays.size() == 1)
2733 cout <<
"2+ decays: try to build subsets with a decay missing" << endl;
2737 auto locFurtherDecaysToSearchFor = locFurtherDecays;
2738 const auto& locSourceComboUse_ThisDecay = locDecayIterator->first;
2739 locFurtherDecaysToSearchFor.erase(locFurtherDecaysToSearchFor.begin() + std::distance(locFurtherDecays.begin(), locDecayIterator));
2743 auto locAllBut1ComboInfo = std::get<2>((*locFurtherDecaysToSearchFor.begin()).first);
2747 auto locToAddComboInfo = (locDecayIterator->second == 1) ? std::get<2>(locSourceComboUse_ThisDecay) :
GetOrMake_SourceComboInfo({}, {std::make_pair(locSourceComboUse_ThisDecay, locDecayIterator->second)}, locNumTabs);
2750 auto locToAddComboUse = (locDecayIterator->second == 1) ? locSourceComboUse_ThisDecay :
DSourceComboUse{
Unknown, locToAddZBin, locToAddComboInfo,
false,
Unknown};
2754 auto locChargedCombo_PresidingToUse = locChargedCombo_Presiding;
2755 if((locFurtherDecaysToSearchFor.size() > 1) || !locNumParticlesNeeded.empty())
2761 else if((locFurtherDecaysToSearchFor.size() == 1) && (locFurtherDecaysToSearchFor[0].second > 1))
2763 locAllBut1ComboInfo =
GetOrMake_SourceComboInfo({}, {std::make_pair(locSourceComboUse_ThisDecay, locDecayIterator->second)}, locNumTabs);
2767 else if(locFurtherDecaysToSearchFor.size() == 1)
2769 locAllBut1ComboUse = (*locFurtherDecaysToSearchFor.begin()).first;
2770 locChargedCombo_PresidingToUse =
Get_NextChargedCombo(locChargedCombo_Presiding, locAllBut1ComboUse, locComboingStage,
true, 1);
2775 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2776 cout <<
"Comboing decays together. All-But-1 Use:" << endl;
2778 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
2779 cout <<
"Comboing decays together. To-Add Use:" << endl;
2791 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locToAddChargeContent);
2792 auto& locToAddCombos = locSourceCombosByUseSoFar[locToAddComboUse];
2793 locSourceCombosByUseSoFar.emplace(locComboUseToCreate, locToAddCombos);
2795 cout <<
"Save for later!" << endl;
2807 Combo_Horizontally_AddDecay(locComboUseToCreate, locAllBut1ComboUse, locToAddComboUse, locComboingStage, locChargedCombo_Presiding,
false, locNumTabs);
2812 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locAllBut1ChargeContent, locChargedCombo_PresidingToUse);
2815 if(locSourceCombosByUseSoFar.find(locAllBut1ComboUse) == locSourceCombosByUseSoFar.end())
2818 if(locDecayIterator == locFurtherDecays.begin())
2820 locComboUse_SubsetToBuild = locAllBut1ComboUse;
2821 locChargedCombo_SubsetToBuildPresiding = locChargedCombo_PresidingToUse;
2822 locComboUse_SubsetToAdd = locToAddComboUse;
2830 Combo_Horizontally_AddDecay(locComboUseToCreate, locAllBut1ComboUse, locToAddComboUse, locComboingStage, locChargedCombo_Presiding, locExpandAllBut1Flag, locNumTabs);
2838 cout <<
"try to build subsets with some detected particles missing" << endl;
2839 for(
auto locParticleIterator = locNumParticlesNeeded.begin(); locParticleIterator != locNumParticlesNeeded.end(); ++locParticleIterator)
2843 auto locNumParticlesToSearchFor = locNumParticlesNeeded;
2844 const auto& locParticlePair = *locParticleIterator;
2845 locNumParticlesToSearchFor.erase(locNumParticlesToSearchFor.begin() + std::distance(locNumParticlesNeeded.begin(), locParticleIterator));
2847 cout <<
"particle pair: " << locParticlePair.first <<
", " << int(locParticlePair.second) << endl;
2858 auto locChargedCombo_PresidingToUse = locChargedCombo_Presiding;
2859 if(locFurtherDecays.empty() && (locNumParticlesToSearchFor.size() == 1))
2860 locChargedCombo_PresidingToUse =
Get_NextChargedCombo(locChargedCombo_Presiding, locAllBut1ComboUse, locComboingStage,
true, 1);
2861 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locChargedContentAllBut1, locChargedCombo_PresidingToUse);
2864 if(locSourceCombosByUseSoFar.find(locAllBut1ComboUse) == locSourceCombosByUseSoFar.end())
2867 if((locParticleIterator == locNumParticlesNeeded.begin()) && (locFurtherDecays.size() < 2))
2869 locComboUse_SubsetToBuild = locAllBut1ComboUse;
2870 locChargedCombo_SubsetToBuildPresiding = locChargedCombo_PresidingToUse;
2871 locMissingSubsetIsDecayFlag =
false;
2878 bool locExpandAllBut1Flag =
false;
2879 if(std::get<0>(locAllBut1ComboUse) ==
Unknown)
2880 locExpandAllBut1Flag = (locAllBut1ComboInfo->Get_NumParticles().size() + locAllBut1ComboInfo->Get_FurtherDecays().size()) > 1;
2881 Combo_Horizontally_AddParticles(locComboUseToCreate, locAllBut1ComboUse, locParticlePair, locComboingStage, locChargedCombo_Presiding, locExpandAllBut1Flag, locNumTabs);
2890 cout <<
"build subset: dive down" << endl;
2891 Create_SourceCombos(locComboUse_SubsetToBuild, locComboingStage, locChargedCombo_SubsetToBuildPresiding, locNumTabs + 1);
2894 if(locMissingSubsetIsDecayFlag)
2897 cout <<
"do final add: add decay" << endl;
2899 Combo_Horizontally_AddDecay(locComboUseToCreate, locComboUse_SubsetToBuild, locComboUse_SubsetToAdd, locComboingStage, locChargedCombo_Presiding, locExpandAllBut1Flag, locNumTabs);
2904 cout <<
"do final add: add particles" << endl;
2906 auto locExpandAllBut1Flag =
Get_ExpandAllBut1Flag(locComboingStage, locComboUse_SubsetToBuild, locToAddChargeContent);
2907 Combo_Horizontally_AddParticles(locComboUseToCreate, locComboUse_SubsetToBuild, locNumParticlesNeeded.front(), locComboingStage, locChargedCombo_Presiding, locExpandAllBut1Flag, locNumTabs);
2913 if(std::get<0>(locAllBut1ComboUse) !=
Unknown)
2916 auto locAllBut1ComboInfo = std::get<2>(locAllBut1ComboUse);
2925 size_t locNumNeutralUses = locAllBut1ComboInfo->Get_NumParticles().size();
2926 size_t locNumNonNeutralUses = 0;
2927 for(
auto& locAllBut1DecayPair : locAllBut1ComboInfo->Get_FurtherDecays())
2930 ++locNumNeutralUses;
2932 ++locNumNonNeutralUses;
2934 if((locNumNeutralUses >= 1) && (locNumNonNeutralUses == 1))
2938 auto locExpandAllBut1Flag = ((locAllBut1ComboInfo->Get_NumParticles().size() + locAllBut1ComboInfo->Get_FurtherDecays().size()) > 1);
2940 if(!locExpandAllBut1Flag && locAllBut1ComboInfo->Get_NumParticles().empty() && (locAllBut1ComboInfo->Get_FurtherDecays()[0].second > 1))
2941 locExpandAllBut1Flag =
true;
2942 return locExpandAllBut1Flag;
2947 auto locChargeContentUseToAdd =
Get_ChargeContent(std::get<2>(locComboUseToAdd));
2952 auto& locAllBut1Combos = locSourceCombosByUseSoFar[locComboUseAllBut1];
2953 locSourceCombosByUseSoFar.emplace(locComboUseToCreate, locAllBut1Combos);
2955 cout <<
"Save for later!" << endl;
2963 auto locChargedCombo_NextPresiding =
Get_NextChargedCombo(locChargedCombo_Presiding, locComboUseToAdd, locComboingStage,
true, 1);
2964 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locChargeContentUseToAdd, locChargedCombo_NextPresiding);
2965 if(locSourceCombosByUseSoFar.find(locComboUseToAdd) == locSourceCombosByUseSoFar.end())
2966 Create_SourceCombos(locComboUseToAdd, locComboingStage, locChargedCombo_Presiding, locNumTabs + 1);
2969 Combo_Horizontally_AddCombo(locComboUseToCreate, locComboUseAllBut1, locComboUseToAdd, locComboingStage, locChargedCombo_Presiding, locExpandAllBut1Flag, locNumTabs);
2978 auto& locAllBut1Combos = locSourceCombosByUseSoFar[locComboUseAllBut1];
2979 locSourceCombosByUseSoFar.emplace(locComboUseToCreate, locAllBut1Combos);
2981 cout <<
"Save for later!" << endl;
2987 if(locParticlePairToAdd.second > 1)
2996 auto locChargedCombo_NextPresiding =
Get_NextChargedCombo(locChargedCombo_Presiding, locComboUseToAdd, locComboingStage,
true, 1);
2997 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locChargeContentUseToAdd, locChargedCombo_NextPresiding);
2998 if(locSourceCombosByUseSoFar.find(locComboUseToAdd) == locSourceCombosByUseSoFar.end())
2999 Create_SourceCombos(locComboUseToAdd, locComboingStage, locChargedCombo_Presiding, locNumTabs + 1);
3002 Combo_Horizontally_AddCombo(locComboUseToCreate, locComboUseAllBut1, locComboUseToAdd, locComboingStage, locChargedCombo_Presiding, locExpandAllBut1Flag, locNumTabs);
3005 Combo_Horizontally_AddParticle(locComboUseToCreate, locComboUseAllBut1, locParticlePairToAdd.first, locComboingStage, locChargedCombo_Presiding, locNumTabs);
3013 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3014 cout <<
"Create_Combo_OneParticle: Stage = " << locComboingStage << endl;
3015 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3016 cout <<
"USE TO CREATE:" << endl;
3026 auto locVertexZBin = std::get<1>(locComboUseToCreate);
3027 auto locComboInfo = std::get<2>(locComboUseToCreate);
3028 auto locParticlePair = locComboInfo->Get_NumParticles().front();
3029 auto locPID = locParticlePair.first;
3038 if(locZBin == locVertexZBin)
3041 if(locSourceCombosByUseSoFar.find(locZBinUse) == locSourceCombosByUseSoFar.end())
3045 locSourceCombosByUseSoFar[locComboUseToCreate] = locSourceCombosByUseSoFar[locZBinUse];
3047 locSourceCombosByBeamBunchByUse.emplace(locComboUseToCreate, locSourceCombosByBeamBunchByUse[locZBinUse]);
3053 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3054 cout <<
"Create_Combo_OneParticle: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseSoFar[locComboUseToCreate]->size() << endl;
3067 for(
const auto& locParticle : locParticles)
3070 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
3082 auto locCombo = locIterator->second;
3083 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locCombo);
3086 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3087 cout <<
"COPIED COMBO:" << endl;
3095 locCombo->Set_Members({std::make_pair(locPID, locParticle)}, {}, locIsZIndependent);
3100 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3101 cout <<
"CREATED COMBO:" << endl;
3105 locSourceCombosByUseSoFar[locComboUseToCreate]->push_back(locCombo);
3118 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3119 cout <<
"Create_Combo_OneParticle: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseSoFar[locComboUseToCreate]->size() << endl;
3130 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3131 cout <<
"Create_Combo_OneDecay: Stage = " << locComboingStage << endl;
3132 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3133 cout <<
"USE TO CREATE:" << endl;
3137 auto locComboInfoToCreate = std::get<2>(locComboUseToCreate);
3139 auto locFurtherDecays = locComboInfoToCreate->Get_FurtherDecays();
3140 auto& locDecayUse = locFurtherDecays[0].first;
3141 auto locChargedCombo_PreviousPresiding =
Get_NextChargedCombo(locChargedCombo_Presiding, locDecayUse, locComboingStage,
true, 1);
3152 auto& locDecayCombos = locSourceCombosByUseSoFar[locDecayUse];
3153 for(
auto locDecayCombo : *locDecayCombos)
3155 auto locIsZIndependent = locDecayCombo->Get_IsComboingZIndependent();
3156 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
3163 locCombo->Set_Members({}, {std::make_pair(locDecayUse, vector<const DSourceCombo*>{locDecayCombo})}, locIsZIndependent);
3166 locSourceCombosByUseToSaveTo[locComboUseToCreate]->push_back(locCombo);
3167 Register_ValidRFBunches(locComboUseToCreate, locCombo, locValidRFBunches, locComboingStage, locChargedCombo_Presiding);
3174 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3175 cout <<
"Create_Combo_OneDecay: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseToSaveTo[locComboUseToCreate]->size() << endl;
3184 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3185 cout <<
"Combo_Horizontally_AddCombo: Stage, presiding charged combo = " << locComboingStage <<
", " << locChargedCombo_Presiding << endl;
3186 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3187 cout <<
"PRESIDING COMBO:" << endl;
3189 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3190 cout <<
"USE TO CREATE:" << endl;
3192 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3193 cout <<
"All-But-1 USE:" << endl;
3195 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3196 cout <<
"USE TO ADD:" << endl;
3204 auto locComboInfo_AllBut1 = std::get<2>(locAllBut1ComboUse);
3205 auto locComboInfoToCreate = std::get<2>(locComboUseToCreate);
3207 auto locChargedCombo_WithNow =
Get_ChargedCombo_WithNow(locChargedCombo_Presiding, locComboInfoToCreate, locComboingStage);
3212 auto locChargedCombo_PresidingAllBut1 = locChargedCombo_Presiding;
3213 if((locComboInfo_AllBut1->Get_FurtherDecays().size() == 1) && locComboInfo_AllBut1->Get_NumParticles().empty())
3214 locChargedCombo_PresidingAllBut1 =
Get_NextChargedCombo(locChargedCombo_Presiding, locAllBut1ComboUse, locComboingStage,
true, 1);
3215 auto& locSourceCombosByUseAllBut1 =
Get_CombosSoFar(locComboingStage, locChargeContent_AllBut1, locChargedCombo_PresidingAllBut1);
3217 vector<const DSourceCombo*> locChargedComboVector = {locChargedCombo_WithNow};
3218 auto locCombos_AllBut1 = locGetFromSoFarFlag ? locSourceCombosByUseAllBut1[locAllBut1ComboUse] : &locChargedComboVector;
3224 locSourceCombosByUseToSaveTo.emplace(locComboUseToCreate, locCombos_AllBut1);
3228 cout <<
"Save for later!" << endl;
3237 if(locCombos_AllBut1->empty())
3240 auto locDecayPID_UseToAdd = std::get<0>(locSourceComboUseToAdd);
3241 auto locComboInfo_UseToAdd = std::get<2>(locSourceComboUseToAdd);
3244 auto locComboInfo_UseToCreate = std::get<2>(locComboUseToCreate);
3246 bool locPromoteToAddFlag =
Get_PromoteFlag(locComboingStage, locDecayPID_UseToAdd, locComboInfo_UseToCreate, locComboInfo_UseToAdd, locNonNeutralUse);
3247 bool locPromoteAllBut1Flag =
Get_PromoteFlag(locComboingStage, std::get<0>(locAllBut1ComboUse), locComboInfo_UseToCreate, locComboInfo_AllBut1, locNonNeutralUse);
3249 cout <<
"flags: expand all-but-1, promote to-add, promote all-but-1: " << locExpandAllBut1Flag <<
", " << locPromoteToAddFlag <<
", " << locPromoteAllBut1Flag << endl;
3255 for(
const auto& locCombo_AllBut1 : *locCombos_AllBut1)
3257 auto locIsZIndependent = locCombo_AllBut1->Get_IsComboingZIndependent();
3258 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
3262 const auto& locValidRFBunches =
dValidRFBunches_ByCombo[std::make_pair(locCombo_AllBut1, std::get<1>(locAllBut1ComboUse))];
3268 auto locFurtherDecayCombos_AllBut1 = locCombo_AllBut1->Get_FurtherDecayCombos();
3269 auto locComboParticles_AllBut1 = locCombo_AllBut1->Get_SourceParticles();
3271 if(locExpandAllBut1Flag)
3273 locFurtherDecayCombos_AllBut1.emplace_back(locSourceComboUseToAdd, vector<const DSourceCombo*>{locChargedCombo_WithNow});
3274 locCombo->Set_Members(locComboParticles_AllBut1, locFurtherDecayCombos_AllBut1, locIsZIndependent);
3278 if(locPromoteAllBut1Flag)
3282 locFurtherDecayCombos_AllBut1.emplace_back(locSourceComboUseToAdd, vector<const DSourceCombo*>{locChargedCombo_WithNow});
3283 locCombo->Set_Members(locComboParticles_AllBut1, locFurtherDecayCombos_AllBut1, locIsZIndependent);
3288 locFurtherDecayCombos_Needed.emplace_back(locAllBut1ComboUse, vector<const DSourceCombo*>{locCombo_AllBut1});
3289 locFurtherDecayCombos_Needed.emplace_back(locSourceComboUseToAdd, vector<const DSourceCombo*>{locChargedCombo_WithNow});
3290 locCombo->Set_Members({}, locFurtherDecayCombos_Needed, locIsZIndependent);
3295 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3296 cout <<
"CREATED COMBO:" << endl;
3301 locSourceCombosByUseToSaveTo[locComboUseToCreate]->push_back(locCombo);
3302 Register_ValidRFBunches(locComboUseToCreate, locCombo, locValidRFBunches, locComboingStage, locChargedCombo_Presiding);
3311 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3312 cout <<
"Combo_Horizontally_AddCombo: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseToSaveTo[locComboUseToCreate]->size() << endl;
3318 auto locNextPresidingCombo =
Get_NextChargedCombo(locChargedCombo_Presiding, locSourceComboUseToAdd, locComboingStage,
true, 1);
3319 auto locChargedCombo_WithPrevious =
Get_ChargedCombo_WithNow(locNextPresidingCombo, std::get<2>(locSourceComboUseToAdd), locComboingStage);
3321 cout <<
"combos: presiding, next-presiding, with-previous: " << locChargedCombo_Presiding <<
", " << locNextPresidingCombo <<
", " << locChargedCombo_WithPrevious << endl;
3325 for(
const auto& locCombo_AllBut1 : *locCombos_AllBut1)
3328 const auto& locValidRFBunches_AllBut1 =
dValidRFBunches_ByCombo[std::make_pair(locCombo_AllBut1, std::get<1>(locAllBut1ComboUse))];
3329 const auto& locDecayCombos_ToAdd =
Get_CombosForComboing(locSourceComboUseToAdd, locComboingStage, locValidRFBunches_AllBut1, locNextPresidingCombo);
3333 std::sort(locUsedParticles_AllBut1.begin(), locUsedParticles_AllBut1.end());
3336 auto Search_Duplicates = [&locUsedParticles_AllBut1](
const JObject* locParticle) ->
bool
3337 {
return std::binary_search(locUsedParticles_AllBut1.begin(), locUsedParticles_AllBut1.end(), locParticle);};
3339 auto locIsZIndependent_AllBut1 = locCombo_AllBut1->Get_IsComboingZIndependent();
3342 for(
const auto& locDecayCombo_ToAdd : locDecayCombos_ToAdd)
3344 auto locIsZIndependent = (locIsZIndependent_AllBut1 && locDecayCombo_ToAdd->Get_IsComboingZIndependent());
3345 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
3352 if(std::any_of(locUsedParticles_ToAdd.begin(), locUsedParticles_ToAdd.end(), Search_Duplicates))
3358 vector<int> locValidRFBunches = {};
3366 auto locFurtherDecayCombos_AllBut1 = locCombo_AllBut1->Get_FurtherDecayCombos();
3367 auto locComboParticles_AllBut1 = locCombo_AllBut1->Get_SourceParticles(
false);
3368 if(locExpandAllBut1Flag)
3370 if(locPromoteToAddFlag)
3373 auto locUsedParticlePairs_ToAdd = locDecayCombo_ToAdd->Get_SourceParticles(
false);
3374 locComboParticles_AllBut1.insert(locComboParticles_AllBut1.end(), locUsedParticlePairs_ToAdd.begin(), locUsedParticlePairs_ToAdd.end());
3375 auto locFurtherDecayCombos_ToAdd = locDecayCombo_ToAdd->Get_FurtherDecayCombos();
3376 locFurtherDecayCombos_AllBut1.insert(locFurtherDecayCombos_AllBut1.end(), locFurtherDecayCombos_ToAdd.begin(), locFurtherDecayCombos_ToAdd.end());
3379 locFurtherDecayCombos_AllBut1.emplace_back(locSourceComboUseToAdd, vector<const DSourceCombo*>{locDecayCombo_ToAdd});
3380 locCombo->Set_Members(locComboParticles_AllBut1, locFurtherDecayCombos_AllBut1, locIsZIndependent);
3384 auto locComboParticlePairs_ToAdd = locDecayCombo_ToAdd->Get_SourceParticles(
false);
3385 auto locFurtherDecayCombos_ToAdd = locDecayCombo_ToAdd->Get_FurtherDecayCombos();
3386 if(locPromoteAllBut1Flag && locPromoteToAddFlag)
3390 locFurtherDecayCombos_AllBut1.insert(locFurtherDecayCombos_AllBut1.end(), locFurtherDecayCombos_ToAdd.begin(), locFurtherDecayCombos_ToAdd.end());
3391 locComboParticles_AllBut1.insert(locComboParticles_AllBut1.end(), locComboParticlePairs_ToAdd.begin(), locComboParticlePairs_ToAdd.end());
3392 locCombo->Set_Members(locComboParticles_AllBut1, locFurtherDecayCombos_AllBut1, locIsZIndependent);
3394 else if(locPromoteAllBut1Flag)
3398 locFurtherDecayCombos_AllBut1.emplace_back(locSourceComboUseToAdd, vector<const DSourceCombo*>{locDecayCombo_ToAdd});
3399 locCombo->Set_Members(locComboParticles_AllBut1, locFurtherDecayCombos_AllBut1, locIsZIndependent);
3401 else if(locPromoteToAddFlag)
3406 auto locAllBut1UseToUse = (std::get<2>(locNonNeutralUse) ==
nullptr) ? locAllBut1ComboUse : locNonNeutralUse;
3407 locFurtherDecayCombos_ToAdd.emplace_back(locAllBut1UseToUse, vector<const DSourceCombo*>{locCombo_AllBut1});
3408 locCombo->Set_Members(locComboParticlePairs_ToAdd, locFurtherDecayCombos_ToAdd, locIsZIndependent);
3414 auto locAllBut1UseToUse = (std::get<2>(locNonNeutralUse) ==
nullptr) ? locAllBut1ComboUse : locNonNeutralUse;
3415 locFurtherDecayCombos_Needed.emplace_back(locAllBut1UseToUse, vector<const DSourceCombo*>{locCombo_AllBut1});
3416 locFurtherDecayCombos_Needed.emplace_back(locSourceComboUseToAdd, vector<const DSourceCombo*>{locDecayCombo_ToAdd});
3417 locCombo->Set_Members({}, locFurtherDecayCombos_Needed, locIsZIndependent);
3422 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3423 cout <<
"CREATED COMBO:" << endl;
3428 locSourceCombosByUseToSaveTo[locComboUseToCreate]->push_back(locCombo);
3429 Register_ValidRFBunches(locComboUseToCreate, locCombo, locValidRFBunches, locComboingStage, locChargedCombo_Presiding);
3439 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3440 cout <<
"Combo_Horizontally_AddCombo: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseToSaveTo[locComboUseToCreate]->size() << endl;
3449 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3450 cout <<
"Combo_Horizontally_AddParticle: Stage, PID-to-add, presiding charged combo = " << locComboingStage <<
", " << locPID <<
", " << locChargedCombo_Presiding << endl;
3451 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3452 cout <<
"PRESIDING COMBO:" << endl;
3454 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3455 cout <<
"USE TO CREATE:" << endl;
3457 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3458 cout <<
"All-But-1 USE:" << endl;
3463 auto locComboInfo_AllBut1 = std::get<2>(locAllBut1ComboUse);
3465 auto locComboInfoToCreate = std::get<2>(locAllBut1ComboUse);
3466 auto locChargedCombo_WithNow =
Get_ChargedCombo_WithNow(locChargedCombo_Presiding, locComboInfoToCreate, locComboingStage);
3467 auto locChargedCombo_PresidingAllBut1 = locChargedCombo_Presiding;
3468 if((locComboInfo_AllBut1->Get_FurtherDecays().size() == 1) && locComboInfo_AllBut1->Get_NumParticles().empty())
3469 locChargedCombo_PresidingAllBut1 =
Get_NextChargedCombo(locChargedCombo_Presiding, locAllBut1ComboUse, locComboingStage,
true, 1);
3470 auto& locSourceCombosByUseSoFar =
Get_CombosSoFar(locComboingStage, locChargeContent_AllBut1, locChargedCombo_PresidingAllBut1);
3475 vector<const DSourceCombo*> locChargedComboVector = {locChargedCombo_WithNow};
3477 auto locCombos_AllBut1 = locGetFromSoFarFlag ? locSourceCombosByUseSoFar[locAllBut1ComboUse] : &locChargedComboVector;
3482 locSourceCombosByUseToSaveTo[locComboUseToCreate] = locCombos_AllBut1;
3486 cout <<
"Save for later!" << endl;
3495 auto locVertexZBin = std::get<1>(locComboUseToCreate);
3498 for(
const auto& locCombo_AllBut1 : *locCombos_AllBut1)
3504 auto locUsedParticlePairs_AllBut1 = locCombo_AllBut1->Get_SourceParticles(
true);
3507 std::sort(locUsedParticles_AllBut1.begin(), locUsedParticles_AllBut1.end());
3510 auto locFurtherDecays = locCombo_AllBut1->Get_FurtherDecayCombos();
3511 auto locIsZIndependent_AllBut1 = locCombo_AllBut1->Get_IsComboingZIndependent();
3514 const auto& locValidRFBunches_AllBut1 =
dValidRFBunches_ByCombo[std::make_pair(locCombo_AllBut1, std::get<1>(locAllBut1ComboUse))];
3515 const auto& locParticles =
Get_ParticlesForComboing(locPID, locComboingStage, locValidRFBunches_AllBut1, locVertexZBin);
3518 for(
const auto& locParticle : locParticles)
3521 if((locComboingStage ==
d_MixedStage) && locIsZIndependent)
3525 if(std::binary_search(locUsedParticles_AllBut1.begin(), locUsedParticles_AllBut1.end(), locParticle))
3533 auto locComboParticles = locCombo_AllBut1->Get_SourceParticles(
false);
3534 locComboParticles.emplace_back(locPID, locParticle);
3536 locCombo->Set_Members(locComboParticles, locFurtherDecays, locIsZIndependent);
3539 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3540 cout <<
"CREATED COMBO:" << endl;
3545 locSourceCombosByUseToSaveTo[locComboUseToCreate]->push_back(locCombo);
3546 Register_ValidRFBunches(locComboUseToCreate, locCombo, locValidRFBunches, locComboingStage, locChargedCombo_Presiding);
3556 for(decltype(locNumTabs) locTabNum = 0; locTabNum < locNumTabs; ++locTabNum) cout <<
"\t";
3557 cout <<
"Combo_Horizontally_AddParticle: NUM SOURCE COMBOS CREATED: " << locSourceCombosByUseToSaveTo[locComboUseToCreate]->size() << endl;
3573 return dTracksByPID[locPID];
3574 else if(locPID !=
Gamma)
3582 return locGroupBunchIterator->second;
3586 if(locBeamBunches.empty())
3591 return locGroupBunchIterator->second;
3597 if(locBeamBunches.empty())
3598 return locShowersByBunch[{}];
3602 vector<int> locBunchesSoFar = {*locBeamBunches.begin()};
3603 for(
auto locBunchIterator = std::next(locBeamBunches.begin()); locBunchIterator != locBeamBunches.end(); ++locBunchIterator)
3605 const auto& locComboShowers = locShowersByBunch[locBunchesSoFar];
3606 const auto& locBunchShowers = locShowersByBunch[{*locBunchIterator}];
3608 locBunchesSoFar.push_back(*locBunchIterator);
3609 if(locShowersByBunch.find(locBunchesSoFar) != locShowersByBunch.end())
3612 if(locBunchShowers.empty())
3614 locShowersByBunch.emplace(locBunchesSoFar, locComboShowers);
3620 vector<const JObject*> locMergeResult;
3621 locMergeResult.reserve(locComboShowers.size() + locBunchShowers.size());
3622 std::set_union(locComboShowers.begin(), locComboShowers.end(), locBunchShowers.begin(), locBunchShowers.end(), std::back_inserter(locMergeResult));
3623 locShowersByBunch.emplace(locBunchesSoFar, std::move(locMergeResult));
3626 return locShowersByBunch[locBeamBunches];
3634 auto locComboInfo = std::get<2>(locSourceComboUse);
3635 dValidRFBunches_ByCombo.emplace(std::make_pair(locSourceCombo, std::get<1>(locSourceComboUse)), locRFBunches);
3641 auto& locCombosByBeamBunch = locSourceCombosByBeamBunchByUse[locSourceComboUse];
3642 for(
const auto& locBeamBunch : locRFBunches)
3643 locCombosByBeamBunch[{locBeamBunch}].push_back(locSourceCombo);
3649 auto locComboInfo = std::get<2>(locSourceComboUse);
3652 std::sort(locComboVector.begin(), locComboVector.end());
3659 auto& locCombosByBeamBunch = locSourceCombosByBeamBunchByUse[locSourceComboUse];
3660 for(
auto& locRFPair : locCombosByBeamBunch)
3662 std::sort(locRFPair.second.begin(), locRFPair.second.end());
3663 Build_ComboIndices(locSourceComboUse, locRFPair.first, locRFPair.second, locComboingStage);
3672 cout <<
"Get_CombosForComboing: stage, #bunches, charged combo, bunches " << locComboingStage <<
", " << locBeamBunches.size() <<
", " << locChargedCombo_PresidingPrevious <<
", ";
3673 for(
auto& locBunch : locBeamBunches)
3674 cout << locBunch <<
", ";
3676 cout <<
"GET-COMBOS USE:" << endl;
3684 if(locBeamBunches.empty() || (locChargeContent ==
d_Charged))
3685 return *((
Get_CombosSoFar(locComboingStage, locChargeContent, locChargedCombo_PresidingPrevious))[locComboUse]);
3688 auto locGroupBunchIterator = locSourceCombosByBeamBunchByUse[locComboUse].find(locBeamBunches);
3689 if(locGroupBunchIterator != locSourceCombosByBeamBunchByUse[locComboUse].end())
3690 return locGroupBunchIterator->second;
3692 return Get_CombosByBeamBunch(locComboUse, locSourceCombosByBeamBunchByUse[locComboUse], locBeamBunches, locComboingStage);
3699 cout <<
"Get_CombosByBeamBunch: stage, # bunches, bunches: " << locComboingStage <<
", " << locBeamBunches.size() <<
", ";
3700 for(
auto& locBunch : locBeamBunches)
3701 cout << locBunch <<
", ";
3704 if(locBeamBunches.empty())
3706 Build_ComboIndices(locComboUse, locBeamBunches, locCombosByBunch[locBeamBunches], locComboingStage);
3707 return locCombosByBunch[{}];
3712 vector<int> locBunchesSoFar = {*locBeamBunches.begin()};
3713 for(
auto locBunchIterator = std::next(locBeamBunches.begin()); locBunchIterator != locBeamBunches.end(); ++locBunchIterator)
3716 auto& locCombosSoFar = locCombosByBunch[locBunchesSoFar];
3717 auto& locBunchCombos = locCombosByBunch[{*locBunchIterator}];
3719 locBunchesSoFar.push_back(*locBunchIterator);
3720 if(locCombosByBunch.find(locBunchesSoFar) != locCombosByBunch.end())
3723 if(locBunchCombos.empty())
3725 locCombosByBunch.emplace(locBunchesSoFar, locCombosSoFar);
3726 Build_ComboIndices(locComboUse, locBeamBunches, locCombosByBunch[locBunchesSoFar], locComboingStage);
3731 vector<const DSourceCombo*> locMergeResult;
3732 locMergeResult.reserve(locCombosSoFar.size() + locBunchCombos.size());
3733 std::set_union(locCombosSoFar.begin(), locCombosSoFar.end(), locBunchCombos.begin(), locBunchCombos.end(), std::back_inserter(locMergeResult));
3734 locCombosByBunch.emplace(locBunchesSoFar, std::move(locMergeResult));
3735 Build_ComboIndices(locComboUse, locBunchesSoFar, locCombosByBunch[locBunchesSoFar], locComboingStage);
3738 return locCombosByBunch[locBeamBunches];
3756 cout <<
"FCAL USE: " << endl;
3759 if(locSourceCombosByUseSoFar.find(locComboUseFCAL) == locSourceCombosByUseSoFar.end())
3761 const auto& locFCALComboVector = *(locSourceCombosByUseSoFar[locComboUseFCAL]);
3763 cout <<
"copying " << locFCALComboVector.size() <<
" from the fcal vector" << endl;
3764 if(locFCALComboVector.empty())
3768 auto& locBothComboVector = *(locSourceCombosByUseSoFar[locComboUseToCreate]);
3770 locBothComboVector.assign(locFCALComboVector.begin(), locFCALComboVector.end());
3774 const auto& locCombosByBeamBunch = locSourceCombosByBeamBunchByUse[locComboUseFCAL];
3775 for(
const auto& locComboBeamBunchPair : locCombosByBeamBunch)
3777 if(locComboBeamBunchPair.first.size() == 1)
3778 locSourceCombosByBeamBunchByUse[locComboUseToCreate].emplace(locComboBeamBunchPair);
3786 return locReactionCombo;
3789 auto locCreationPair = std::make_pair(locReactionCombo, locStepVertexInfo);
3792 return locIterator->second;
3796 auto locDesiredStepIndex = locStepVertexInfo->
Get_StepIndices().front();
3797 auto locVertexPrimaryCombo =
Get_StepSourceCombo(locReaction, locDesiredStepIndex, locReactionCombo, 0);
3801 return locVertexPrimaryCombo;
3808 return locReactionCombo;
3811 auto locCreationPair = std::make_pair(locReactionCombo, locStepVertexInfo);
3814 return locIterator->second;
3818 auto locDesiredStepIndex = locStepVertexInfo->
Get_StepIndices().front();
3819 auto locVertexPrimaryCombo =
Get_StepSourceCombo(locReaction, locDesiredStepIndex, locReactionCombo, 0);
3822 return locVertexPrimaryCombo;
3828 cout <<
"reaction, desired step index, current step index: " << locReaction->
Get_ReactionName() <<
", " << locDesiredStepIndex <<
", " << locVertexPrimaryStepIndex << endl;
3829 if(locDesiredStepIndex == locVertexPrimaryStepIndex)
3830 return locVertexPrimaryCombo;
3834 while(locParticleIndices.back().first != locVertexPrimaryStepIndex)
3838 cout <<
"decay from pair: " << locParticlePair.first <<
", " << locParticlePair.second << endl;
3841 locParticleIndices.emplace_back(locParticlePair.first, locInstanceIndex);
3843 cout <<
"save indices: " << locParticlePair.first <<
", " << locInstanceIndex << endl;
3849 auto locNextStep = locParticleIndices[locParticleIndices.size() - 2].first;
3850 auto locInstanceIndexToFind = locParticleIndices.back().second;
3853 cout <<
"next step, instance to find, use to find: " << locNextStep <<
", " << locInstanceIndexToFind << endl;
3856 locVertexPrimaryCombo =
Find_Combo_AtThisStep(locVertexPrimaryCombo, locUseToFind, locInstanceIndexToFind);
3858 cout <<
"pointer = " << locVertexPrimaryCombo << endl;
3859 if(locVertexPrimaryCombo ==
nullptr)
3861 if(locNextStep == locDesiredStepIndex)
3862 return locVertexPrimaryCombo;
3863 locParticleIndices.pop_back();
3877 cout <<
"Find_Combo_AtThisStep: USE TO FIND:" << endl;
3883 auto locDecayUse = locDecayPair.first;
3888 cout <<
"USE TO CHECK:" << endl;
3892 if(locDecayUse == locUseToFind)
3893 return locDecayPair.second[locDecayInstanceIndex];
3894 if(std::get<0>(locDecayUse) !=
Unknown)
3898 auto locComboToSearch = locDecayPair.second[0];
3900 cout <<
"#to-check decay uses: " << locComboToSearch->Get_FurtherDecayCombos().size() << endl;
3901 for(
const auto& locNestedDecayPair : locComboToSearch->Get_FurtherDecayCombos())
3904 auto locNestedDecayUse = locNestedDecayPair.first;
3909 cout <<
"NESTED USE TO CHECK:" << endl;
3912 if(locNestedDecayUse == locUseToFind)
3913 return locNestedDecayPair.second[locDecayInstanceIndex];
3918 return locSourceCombo;
3925 cout <<
"reaction, desired step index, current step index: " << locReaction->
Get_ReactionName() <<
", " << locDesiredStepIndex <<
", " << locVertexPrimaryStepIndex << endl;
3926 if(locDesiredStepIndex == locVertexPrimaryStepIndex)
3927 return std::make_pair(locVertexPrimaryComboUse,
size_t(1));
3931 while(locParticleIndices.back().first != locVertexPrimaryStepIndex)
3935 cout <<
"decay from pair: " << locParticlePair.first <<
", " << locParticlePair.second << endl;
3938 locParticleIndices.emplace_back(locParticlePair.first, locInstanceIndex);
3940 cout <<
"save indices: " << locParticlePair.first <<
", " << locInstanceIndex << endl;
3946 auto locNextStep = locParticleIndices[locParticleIndices.size() - 2].first;
3947 auto locInstanceIndexToFind = locParticleIndices.back().second;
3950 cout <<
"next step, instance to find, use to find: " << locNextStep <<
", " << locInstanceIndexToFind << endl;
3954 if(std::get<2>(locVertexPrimaryComboUse) ==
nullptr)
3955 return std::make_pair(locVertexPrimaryComboUse,
size_t(locInstanceIndexToFind + 1));
3956 if(locNextStep == locDesiredStepIndex)
3957 return std::make_pair(locVertexPrimaryComboUse,
size_t(locInstanceIndexToFind + 1));
3958 locParticleIndices.pop_back();
3971 cout <<
"Find_Combo_AtThisStep: USE TO FIND:" << endl;
3974 for(
const auto& locDecayPair : std::get<2>(locSourceComboUse)->Get_FurtherDecays())
3977 auto locDecayUse = locDecayPair.first;
3978 auto locZIndependentDecayUse = locDecayUse;
3983 cout <<
"USE TO CHECK:" << endl;
3987 if(locZIndependentDecayUse == locUseToFind)
3989 if(std::get<0>(locDecayUse) !=
Unknown)
3994 cout <<
"#to-check decay uses: " << std::get<2>(locDecayUse)->Get_FurtherDecays().size() << endl;
3995 for(
const auto& locNestedDecayPair : std::get<2>(locDecayUse)->Get_FurtherDecays())
3998 auto locNestedDecayUse = locNestedDecayPair.first;
3999 auto locZIndependentNestedDecayUse = locNestedDecayUse;
4004 cout <<
"NESTED USE TO CHECK:" << endl;
4007 if(locZIndependentNestedDecayUse == locUseToFind)
4008 return locNestedDecayUse;
4044 if(locChargedCombo_Presiding ==
nullptr)
4053 locWithNowComboUse = locDecayComboPair.first;
4057 if(std::get<2>(locWithNowComboUse) ==
nullptr)
4060 cout <<
"CHARGED COMBO WITH NOW: Same as presiding." << endl;
4061 return locChargedCombo_Presiding;
4063 return Get_NextChargedCombo(locChargedCombo_Presiding, locWithNowComboUse, locComboingStage,
false, 0);
4071 if(locChargedCombo_Presiding ==
nullptr)
4083 cout <<
"Get_NextChargedCombo: get-presiding-flag, instance, stage, find result, use-to-find: " << locGetPresidingFlag <<
", " << locInstance <<
", " << locComboingStage <<
", " << (locIteratorPair.first != locIteratorPair.second) << endl;
4085 cout <<
"Presiding combo:" << endl;
4091 if(locIteratorPair.first == locIteratorPair.second)
4092 return locChargedCombo_Presiding;
4095 auto locNextChargedComboVector = (*locIteratorPair.first).second;
4097 cout <<
"next charged combo vector size: = " << locNextChargedComboVector.size() << endl;
4100 if(!locGetPresidingFlag)
4104 cout <<
"CHARGED COMBO WITH NOW:" << endl;
4107 return locNextChargedComboVector[0];
4112 return locNextChargedComboVector[locInstance - 1];
4116 size_t locCount = 0;
4117 auto locDesiredVertexZBin = std::get<1>(locNextComboUse);
4118 for(
const auto& locNextPotentialCombo : locNextChargedComboVector)
4124 auto locIsCombo2ndVertex = (locVertexChargeContent ==
d_Neutral);
4129 cout <<
"detached next potential combo, next zbin, desired zbin = " << locNextPotentialCombo <<
", " << int(locNextVertexZBin) <<
", " << int(locDesiredVertexZBin) << endl;
4135 cout <<
"pre-count, instance = " << locCount <<
", " << locInstance << endl;
4136 if(++locCount == locInstance)
4137 return locNextPotentialCombo;
4141 cout <<
"uh oh" << endl;
4148 if(locDecayPID_UseToCheck !=
Unknown)
4151 auto locFurtherDecayInfo_UseToCheck = locComboInfo_UseToCheck->
Get_FurtherDecays();
4156 size_t locNumNeutralUses = locComboInfo_UseToCheck->
Get_NumParticles().size();
4157 size_t locNumNonNeutralUses = 0;
4158 for(
auto& locAllBut1DecayPair : locFurtherDecayInfo_UseToCheck)
4161 ++locNumNeutralUses;
4164 ++locNumNonNeutralUses;
4165 locNonNeutralUse = locAllBut1DecayPair.first;
4168 if((locNumNeutralUses >= 1) && (locNumNonNeutralUses == 1))
4176 if(!locFurtherDecayInfo_UseToCheck.empty())
4178 auto locFurtherDecayInfo_UseToCreate = locComboInfo_UseToCreate->
Get_FurtherDecays();
4184 auto locNumParticles_UseToCreate = locComboInfo_UseToCreate->
Get_NumParticles();
4197 cout <<
"Not enough particles: No combos." << endl;
4200 for(
auto& locReaction : locReactions)
4204 auto locNumNeutralNeeded = locReactions.front()->Get_FinalPIDs(-1,
false,
false,
d_Neutral,
true).size();
4206 if((locNumNeutralNeeded > 0) && (locNumDetectedShowers >
dMaxNumNeutrals))
4209 cout <<
"Too many neutrals: No combos." << endl;
4213 auto NumShower_Checker = [&](
const DReaction* locReaction) ->
bool
4215 auto locCutPair = locReaction->Get_MaxExtraShowers();
4216 if(!locCutPair.first)
4218 return ((locNumDetectedShowers - locNumNeutralNeeded) > locCutPair.second);
4220 locReactions.erase(std::remove_if(locReactions.begin(), locReactions.end(), NumShower_Checker), locReactions.end());
4221 if(locReactions.empty())
4224 cout <<
"Too many showers (" << locNumDetectedShowers <<
"): No combos." << endl;
4229 auto locNumTracksNeeded = locReactions.front()->Get_FinalPIDs(-1,
false,
false,
d_Charged,
true).size();
4230 auto NumExtra_Checker = [&](
const DReaction* locReaction) ->
bool
4232 auto locCutPair = locReaction->Get_MaxExtraGoodTracks();
4233 if(!locCutPair.first)
4237 locReactions.erase(std::remove_if(locReactions.begin(), locReactions.end(), NumExtra_Checker), locReactions.end());
4238 if(locReactions.empty())
4244 for(
auto& locReaction : locReactions)
4248 auto Skim_Checker = [
this](
const DReaction* locReaction) ->
bool{
return !
Check_Skims(locReaction);};
4249 locReactions.erase(std::remove_if(locReactions.begin(), locReactions.end(), Skim_Checker), locReactions.end());
4250 if(locReactions.empty())
4253 cout <<
"Event not in skim: No combos." << endl;
4256 for(
auto& locReaction : locReactions)
4265 cout <<
"Checking #particles" << endl;
4269 auto locPIDMap = DAnalysis::Convert_VectorToCountMap<Particle_t>(locReactionPIDs);
4270 size_t locNumPositiveNeeded = 0, locNumNegativeNeeded = 0, locNumNeutralNeeded = 0;
4271 for(
const auto& locPIDPair : locPIDMap)
4274 locNumPositiveNeeded += locPIDPair.second;
4276 locNumNegativeNeeded += locPIDPair.second;
4278 locNumNeutralNeeded += locPIDPair.second;
4284 cout <<
"q+: Need " << locNumPositiveNeeded <<
", Have " << dTracksByCharge[
true].size() << endl;
4285 if(dTracksByCharge[
true].
size() < locNumPositiveNeeded)
4288 cout <<
"q-: Need " << locNumNegativeNeeded <<
", Have " << dTracksByCharge[
false].size() << endl;
4289 if(dTracksByCharge[
false].
size() < locNumNegativeNeeded)
4292 cout <<
"q+/-: Need " << locNumNegativeNeeded + locNumPositiveNeeded <<
", Have " <<
dNumChargedTracks << endl;
4296 cout <<
"q0: Need " << locNumNeutralNeeded <<
", Have " << locNumDetectedShowers <<
", Max allowed: " <<
dMaxNumNeutrals << endl;
4297 if(locNumDetectedShowers < locNumNeutralNeeded)
4300 for(
const auto& locPIDPair : locPIDMap)
4304 cout <<
ParticleType(locPIDPair.first) <<
": Need " << locPIDPair.second <<
", Have " << locNumParticlesForComboing << endl;
4305 if(locNumParticlesForComboing < locPIDPair.second)
4307 if(locPIDPair.first !=
Gamma)
4311 size_t locMaxNumPhotonsSameBunch = 0;
4314 for(
const auto& locBunchPair : locZBinPair.second)
4316 if(locBunchPair.first.empty())
4318 if(locBunchPair.second.size() > locMaxNumPhotonsSameBunch)
4319 locMaxNumPhotonsSameBunch = locBunchPair.second.size();
4323 cout <<
ParticleType(locPIDPair.first) <<
": Need " << locPIDPair.second <<
", Have at most " << locMaxNumPhotonsSameBunch <<
" that agree on any beam bunch." << endl;
4324 if(locMaxNumPhotonsSameBunch < locPIDPair.second)
4332 cout <<
"Num combos by use (charged):" << endl;
4335 cout << locCombosByUsePair.second->size() <<
" of ";
4343 locIterator->second += locCombosByUsePair.second->size();
4347 map<DSourceComboUse, size_t> locNumMixedCombosMap;
4350 const auto& locCombosByUseMap = locChargedComboPair.second;
4351 for(
const auto& locCombosByUsePair : locCombosByUseMap)
4353 auto locIterator = locNumMixedCombosMap.find(locCombosByUsePair.first);
4354 if(locIterator == locNumMixedCombosMap.end())
4355 locNumMixedCombosMap.emplace(locCombosByUsePair.first, locCombosByUsePair.second->size());
4357 locIterator->second += locCombosByUsePair.second->size();
4361 cout <<
"Num combos by use (neutral/mixed):" << endl;
4362 for(
const auto& locNumCombosByUsePair : locNumMixedCombosMap)
4364 cout << locNumCombosByUsePair.second <<
" of ";
4372 locIterator->second += locNumCombosByUsePair.second;
4381 cout <<
"Re-used particles, event = " <<
dEventNumber <<
". Aborting!" << endl;
4384 for(
size_t loc_i = 0; loc_i < locCombos.size(); ++loc_i)
4386 for(
size_t loc_j = loc_i + 1; loc_j < locCombos.size(); ++loc_j)
4390 cout <<
"Duplicate particles, event = " <<
dEventNumber <<
". Aborting!" << endl;
4391 cout <<
"DUPE COMBO 1:" << endl;
4393 cout <<
"DUPE COMBO 2:" << endl;
void Combo_WithNeutralsAndBeam(const vector< const DReaction * > &locReactions, const DReactionVertexInfo *locReactionVertexInfo, const DSourceComboUse &locPrimaryComboUse, const DSourceCombo *locReactionChargedCombo, const vector< int > &locBeamBunches_Charged, DCombosByReaction &locOutputComboMap)
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
int Get_ParticleIndex(const DReactionStep *locStep, Particle_t locInputPID, size_t locInstance)
bool Get_IsFirstStepBeam(const DReaction *locReaction)
void Combo_Horizontally_All(const DSourceComboUse &locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, unsigned char locNumTabs)
bool Select_RFBunches_PhotonVertices(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, vector< int > &locValidRFBunches)
void Set_SourceComboTimeHandler(const DSourceComboTimeHandler *locSourceComboTimeHandler)
DSourceCombosByUse_Large dSourceCombosByUse_Charged
set< const DSourceComboInfo *, DCompare_SourceComboInfos > dSourceComboInfoSet
const vector< const DSourceCombo * > & Get_CombosByBeamBunch(const DSourceComboUse &locComboUse, DCombosByBeamBunch &locCombosByBunch, const vector< int > &locBeamBunches, ComboingStage_t locComboingStage)
map< tuple< const JObject *, Particle_t, vector< int >, signed char >, size_t > dResumeSearchAfterIndices_Particles
signed char Get_VertexZBin_NoBeam(bool locIsProductionVertex, const DSourceCombo *locPrimaryVertexCombo, bool locIsCombo2ndVertex) const
int Select_RFBunch_Full(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, const vector< int > &locRFBunches)
static char * ParticleName_ROOT(Particle_t p)
const DReaction * Get_Reaction(void) const
const DSourceComboInfo * GetOrMake_SourceComboInfo(const vector< pair< Particle_t, unsigned char >> &locNumParticles, const vector< pair< DSourceComboUse, unsigned char >> &locFurtherDecays, unsigned char locNumTabs)
vector< int > Get_CommonRFBunches(const vector< int > &locRFBunches1, const JObject *locObject, signed char locVertexZBin) const
DSourceComboP4Handler * dSourceComboP4Handler
static constexpr int Get_ParticleIndex_Initial(void)
map< vector< int >, vector< const DSourceCombo * >> DCombosByBeamBunch
Charge_t Get_ChargeContent_ThisVertex(const DSourceComboInfo *locSourceComboInfo)
void Setup(const vector< const DNeutralShower * > &locNeutralShowers, const DEventRFBunch *locInitialEventRFBunch, const DDetectorMatches *locDetectorMatches)
pair< int, int > Get_InitialParticleDecayFromIndices(const DReaction *locReaction, int locStepIndex)
string dShowerSelectionTag
bool Get_HasPhotons(const DSourceComboInfo *locComboInfo)
unordered_map< const DReaction *, map< size_t, DSourceComboUse > > dSourceComboUseReactionStepMap
void Get_CommandLineCuts_EOverP(void)
bool Cut_InvariantMass_HasMassiveNeutral_OrPhotonVertex(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, vector< int > &locValidRFBunches)
map< vector< int >, vector< const JObject * >> DPhotonShowersByBeamBunch
void Create_Combo_OneParticle(const DSourceComboUse &locComboUseToCreate, ComboingStage_t locComboingStage, unsigned char locNumTabs)
DSourceComboUse Find_ZDependentUse_AtThisStep(const DSourceComboUse &locSourceComboUse, DSourceComboUse locUseToFind, size_t locDecayInstanceIndex) const
bool Check_AreDuplicateCombos(const DSourceCombo *lhs, const DSourceCombo *rhs)
map< Particle_t, map< DetectorSystem_t, vector< double > > > dEOverPCuts_TF1Params
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_dEdx
map< const DReaction *, TH1 * > dNumCombosSurvivedStageMap
size_t Get_ResumeAtIndex_Combos(const DSourceComboUse &locSourceComboUse, const DSourceCombo *locPreviousCombo, const vector< int > &locBeamBunches, ComboingStage_t locComboingStage) const
unordered_set< const DSourceComboInfo * > dComboInfosWithPhotons
const DSourceComboInfo * MakeOrGet_SourceComboInfo(const vector< pair< Particle_t, unsigned char >> &locNumParticles, const vector< pair< DSourceComboUse, unsigned char >> &locFurtherDecays, unsigned char locNumTabs)
vector< const DReaction * > Get_Reactions(JEventLoop *locEventLoop)
void Build_ComboIndices(const DSourceComboUse &locSourceComboUse, const vector< int > &locBeamBunches, const vector< const DSourceCombo * > &locCombos, ComboingStage_t locComboingStage)
const DReactionStepVertexInfo * Get_StepVertexInfo(size_t locStepIndex) const
void Define_DefaultCuts(void)
void Print_SourceComboInfo(const DSourceComboInfo *locComboInfo, unsigned char locNumTabs=0)
bool Cut_dEdxAndEOverP(const DChargedTrackHypothesis *locHypo)
vector< DSourceCombo * > dCreatedCombos
unordered_set< const DSourceComboInfo * > dComboInfosWithMassiveNeutrals
DCombosByReaction Build_ParticleCombos(const DReactionVertexInfo *locReactionVertexInfo)
vector< pair< DSourceComboUse, vector< const DSourceCombo * >>> DSourceCombosByUse_Small
void Combo_Vertically_AllDecays(const DSourceComboUse &locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, unsigned char locNumTabs)
vector< int > Get_ValidRFBunches(const JObject *locObject, signed char locVertexZBin) const
map< pair< const DSourceCombo *, signed char >, vector< int > > dValidRFBunches_ByCombo
bool Check_Skims(const DReaction *locReaction) const
const DTrackTimeBased * Get_TrackTimeBased(void) const
const DSourceCombo * Get_StepSourceCombo(const DReaction *locReaction, size_t locDesiredStepIndex, const DSourceCombo *locVertexPrimaryCombo, size_t locVertexPrimaryStepIndex=0) const
void Combo_Horizontally_AddParticles(const DSourceComboUse &locComboUseToCreate, const DSourceComboUse &locComboUseAllBut1, const pair< Particle_t, unsigned char > &locParticlePairToAdd, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, bool locExpandAllBut1Flag, unsigned char locNumTabs)
bool Get_HasMassiveNeutrals(const DSourceComboInfo *locComboInfo)
map< pair< const DReactionVertexInfo *, vector< signed char > >, DSourceComboUse > dSourceComboUseVertexZMap
unordered_map< const DReaction *, size_t > dRFBunchCutsByReaction
static signed char Get_VertexZIndex_OutOfRange(void)
unordered_map< const DSourceCombo *, DSourceCombosByBeamBunchByUse > dSourceCombosByBeamBunchByUse
void Create_SourceComboInfos(const DReactionVertexInfo *locReactionVertexInfo)
vector< const DKinematicData * > Get_BeamParticlesByRFBunch(int locRFBunch, unsigned int locPlusMinusBunchRange) const
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)
const DSourceCombo * Find_Combo_AtThisStep(const DSourceCombo *locSourceCombo, DSourceComboUse locUseToFind, size_t locDecayInstanceIndex) const
bool Get_ProductionVertexFlag(void) const
static char * ParticleType(Particle_t p)
map< bool, vector< const JObject * > > dTracksByCharge
map< Particle_t, map< DetectorSystem_t, vector< pair< double, double > > > > dEOverPValueMap
int Calc_RFBunchShift(double locTimeToStepTo) const
const vector< const DSourceCombo * > & Get_CombosForComboing(const DSourceComboUse &locComboUse, ComboingStage_t locComboingStage, const vector< int > &locBeamBunches, const DSourceCombo *locChargedCombo_PresidingPrevious)
static signed char Get_VertexZIndex_Unknown(void)
map< Particle_t, map< DetectorSystem_t, pair< TF1 *, TF1 * > > > ddEdxCutMap
unordered_map< const DReactionVertexInfo *, size_t > dMaxRFBunchCuts
vector< pair< Particle_t, unsigned char > > Get_NumParticles(bool locEntireChainFlag=false) const
void Get_CommandLineCuts_dEdx(void)
static int ParticleCharge(Particle_t p)
map< pair< const DSourceCombo *, const DReactionStepVertexInfo * >, const DSourceCombo * > dVertexPrimaryComboMap
const DParticleCombo * Build_ParticleCombo(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locFullCombo, const DKinematicData *locBeamParticle, int locRFBunchShift, DKinFitType locKinFitType)
DSourceComboUse Build_NewZDependentUse(const DReaction *locReaction, size_t locStepIndex, signed char locVertexZBin, const DSourceComboUse &locOrigUse, const unordered_map< size_t, DSourceComboUse > &locCreatedUseMap)
DSourceComboTimeHandler * dSourceComboTimeHandler
DResourcePool< DSourceCombo > dResourcePool_SourceCombo
bool Get_IsComboingZIndependent(const JObject *locObject, Particle_t locPID) const
static signed char Get_VertexZIndex_ZIndependent(void)
bool Check_IfMissingDecayProduct(const DReaction *locReaction, size_t locStepIndex)
DPhotonKinematicsByZBin Get_PhotonKinematics(void) const
shared_ptr< const DTOFHitMatchParams > Get_TOFHitMatchParams(void) const
unordered_map< const DSourceComboInfo *, Charge_t > dComboInfoChargeContent
tuple< Particle_t, signed char, const DSourceComboInfo *, bool, Particle_t > DSourceComboUse
bool Cut_InvariantMass_AccuratePhotonKinematics(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, const DKinematicData *locBeamParticle, int locRFBunch)
size_t dInitialComboVectorCapacity
vector< Particle_t > Get_FinalPIDs(int locStepIndex=-1, bool locIncludeMissingFlag=true, bool locIncludeDecayingFlag=true, Charge_t locCharge=d_AllCharges, bool locIncludeDuplicatesFlag=true) const
map< pair< const DReactionStepVertexInfo *, DSourceComboUse >, size_t > dSourceComboInfoStepMap
void Create_SourceCombos_Unknown(const DSourceComboUse &locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, unsigned char locNumTabs)
vector< vector< const DSourceCombo * > * > dCreatedComboVectors
const DESSkimData * dESSkimData
DParticleComboCreator * dParticleComboCreator
DSourceComboUse Get_ZIndependentUse(const DSourceComboUse &locZDependentUse)
size_t Get_NumVertexZBins(void) const
const DReaction * Get_Reaction(void) const
Charge_t Get_ChargeContent(const DSourceComboInfo *locSourceComboInfo) const
unordered_map< signed char, DPhotonShowersByBeamBunch > Get_ShowersByBeamBunchByZBin(void) const
pair< bool, map< DSourceComboUse, unsigned char > > Get_FinalStateDecayingComboUses(const DReaction *locReaction, size_t locStepIndex, const map< size_t, DSourceComboUse > &locStepComboUseMap) const
Charge_t Get_ChargeContent(const DSourceComboInfo *locSourceComboInfo)
void Set_BeamParticles(const vector< const DBeamPhoton * > &locBeamParticles)
const vector< const JObject * > & Get_ShowersByBeamBunch(const vector< int > &locBeamBunches, DPhotonShowersByBeamBunch &locShowersByBunch, signed char locVertexZBin)
void Combo_WithBeam(const vector< const DReaction * > &locReactions, const DReactionVertexInfo *locReactionVertexInfo, const DSourceComboUse &locReactionFullComboUse, const DSourceCombo *locReactionFullCombo, int locRFBunch, DCombosByReaction &locOutputComboMap)
void Recycle_Vectors(void)
void Vote_OldMethod(const DSourceCombo *locReactionFullCombo, vector< int > &locValidRFBunches)
void Create_Combo_OneDecay(const DSourceComboUse &locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, unsigned char locNumTabs)
const DSourceCombo * Get_ChargedCombo_WithNow(const DSourceCombo *locChargedCombo_Presiding, const DSourceComboInfo *locToCreateComboInfo, ComboingStage_t locComboingStage) const
map< const DReaction *, TH1 * > dNumEventsSurvivedStageMap
void Fill_SurvivalHistograms(void)
const DSourceCombo * Get_NextChargedCombo(const DSourceCombo *locChargedCombo_Presiding, const DSourceComboUse &locNextComboUse, ComboingStage_t locComboingStage, bool locGetPresidingFlag, size_t locInstance) const
void Combo_Vertically_NDecays(const DSourceComboUse &locComboUseToCreate, const DSourceComboUse &locNMinus1ComboUse, const DSourceComboUse &locSourceComboDecayUse, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, unsigned char locNumTabs)
bool Get_HasPhotons(const DSourceComboInfo *locSourceComboInfo) const
vector< const DSourceComboInfo * > dSourceComboInfos
signed char Get_VertexZBin(bool locIsProductionVertex, const DSourceCombo *locReactionCombo, const DSourceCombo *locPrimaryVertexCombo, const DKinematicData *locBeamParticle, bool locIsCombo2ndVertex) const
map< DSourceComboUse, size_t > dNumMixedCombosMap_Charged
DGeometry * GetDGeometry(unsigned int run_number)
string Get_ReactionName(void) const
DSourceComboUse Create_ZDependentSourceComboUses(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionChargedCombo)
DSourceCombosByBeamBunchByUse & Get_SourceCombosByBeamBunchByUse(Charge_t locChargeContent_SearchForUse, const DSourceCombo *locChargedCombo=nullptr)
bool Cut_Timing_MissingMassVertices(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, const DKinematicData *locBeamParticle, int locRFBunch)
bool Get_ExpandAllBut1Flag(ComboingStage_t locComboingStage, const DSourceComboUse &locAllBut1ComboUse, Charge_t locToAddChargeContent)
bool Cut_dEdx(Particle_t locPID, DetectorSystem_t locSystem, double locP, double locdEdx)
map< Particle_t, vector< const JObject * > > dTracksByPID
void Calc_VertexTimeOffsets_WithBeam(const DReactionVertexInfo *locReactionVertexInfo, const DSourceComboUse &locReactionFullComboUse, const DSourceCombo *locReactionFullCombo, const DKinematicData *locBeamParticle)
void Check_ForDuplicates(const vector< const DSourceCombo * > &locCombos) const
DSourceComboUse Make_ComboUse(Particle_t locInitPID, const map< Particle_t, unsigned char > &locNumParticles, const map< DSourceComboUse, unsigned char > &locFurtherDecays, bool locMissingDecayProductFlag, Particle_t locTargetToInclude)
unordered_map< const DSourceCombo *, DSourceCombosByUse_Large > dMixedCombosByUseByChargedCombo
void Create_SourceCombos(const DSourceComboUse &locComboUseToCreate, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, unsigned char locNumTabs)
h_means GetYaxis() -> SetTitleOffset(1.8)
map< Particle_t, map< DetectorSystem_t, vector< pair< double, double > > > > ddEdxValueMap
void Register_ValidRFBunches(const DSourceComboUse &locSourceComboUse, const DSourceCombo *locSourceCombo, const vector< int > &locRFBunches, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding)
vector< signed char > Get_VertexZBins(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionCombo, const DKinematicData *locBeamParticle, bool locComboIsFullyCharged) const
h1eff_eff GetXaxis() -> SetTitleSize(0.05)
void Combo_Horizontally_AddCombo(const DSourceComboUse &locComboUseToCreate, const DSourceComboUse &locAllBut1ComboUse, const DSourceComboUse &locSourceComboUseToAdd, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, bool locExpandAllBut1Flag, unsigned char locNumTabs)
DSourceCombosByUse_Large & Get_CombosSoFar(ComboingStage_t locComboingStage, Charge_t locChargeContent_SearchForUse, const DSourceCombo *locChargedCombo=nullptr)
vector< const JObject * > Get_SourceParticles(const vector< pair< Particle_t, const JObject * >> &locSourceParticles, Particle_t locPID=Unknown)
map< Particle_t, unsigned char > Build_ParticleMap(const DReaction *locReaction, size_t locStepIndex, Charge_t locCharge) const
void Set_Vertex(const DVertex *locVertex)
bool Select_RFBunches_Charged(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locChargedCombo, vector< int > &locValidRFBunches)
map< DSourceComboUse, DSourceComboUse > dZDependentUseToIndependentMap
shared_ptr< const DSCHitMatchParams > Get_SCHitMatchParams(void) const
vector< pair< DSourceComboUse, unsigned char > > Get_FurtherDecays(void) const
void Print_NumCombosByUse(void)
const char * SystemName(DetectorSystem_t sys)
bool Select_RFBunches_AllVerticesUnknown(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionFullCombo, Charge_t locCharge, vector< int > &locValidRFBunches)
double Get_BeamBunchPeriod(void) const
unordered_map< const DReactionStepVertexInfo *, DSourceComboUse > dSourceComboUseReactionMap
size_t Get_ParticleInstanceIndex(const DReactionStep *locStep, size_t locParticleIndex)
static double ParticleMass(Particle_t p)
vector< const DReactionStepVertexInfo * > Get_StepVertexInfos(void) const
vector< const DSourceCombo * > * Get_SourceComboVectorResource(void)
bool Check_Reactions(vector< const DReaction * > &locReactions)
shared_ptr< const DFCALShowerMatchParams > Get_FCALShowerMatchParams(void) const
const DSourceCombo * Get_VertexPrimaryCombo(const DSourceCombo *locReactionCombo, const DReactionStepVertexInfo *locStepVertexInfo) const
map< vector< const JObject * >, const DSourceCombo * > dNPhotonsToComboMap
map< Particle_t, map< DetectorSystem_t, TH2 * > > dHistMap_EOverP
void Print_SourceComboUse(const DSourceComboUse &locComboUse, unsigned char locNumTabs=0, bool locIgnoreTabs=false)
size_t Get_VertexZBin_TargetCenter(void) const
void Reset_NewEvent(JEventLoop *locEventLoop)
void Set_SourceComboVertexer(const DSourceComboVertexer *locSourceComboVertexer)
DResourcePool< vector< const DSourceCombo * > > dResourcePool_SourceComboVector
void Build_ComboResumeIndices(const DSourceComboUse &locSourceComboUse, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding)
vector< const DReactionStepVertexInfo * > Get_StepVertexInfos_ReverseOrderByStep(const DReactionVertexInfo *locReactionVertexInfo)
void Copy_ZIndependentMixedResults(const DSourceComboUse &locComboUseToCreate, const DSourceCombo *locChargedCombo_Presiding)
map< DSourceComboUse, size_t > dNumMixedCombosMap_Mixed
const DVector3 & momentum(void) const
unordered_map< signed char, DPhotonShowersByBeamBunch > dShowersByBeamBunchByZBin
void Combo_Vertically_NParticles(const DSourceComboUse &locComboUseToCreate, const DSourceComboUse &locNMinus1ComboUse, ComboingStage_t locComboingStage, unsigned char locNumTabs)
bool Cut_EOverP(Particle_t locPID, DetectorSystem_t locSystem, double locP, double locEOverP)
DSourceComboer(void)=delete
size_t Get_ResumeAtIndex_Particles(Particle_t locPID, const JObject *locPreviousObject, vector< int > locBeamBunches, signed char locVertexZBin) const
size_t Get_NumObjectsAllThreads(void) const
bool Check_NumParticles(const DReaction *locReaction)
map< const DReaction *, map< DConstructionStage, size_t > > dNumCombosSurvivedStageTracker
const DReactionStep * Get_ReactionStep(size_t locStepIndex) const
void Set_ControlParams(size_t locGetBatchSize, size_t locNumToAllocateAtOnce, size_t locMaxLocalPoolSize)
int Get_DecayStepIndex(const DReaction *locReaction, size_t locStepIndex, size_t locParticleIndex)
map< Particle_t, map< DetectorSystem_t, string > > dEOverPCuts_TF1FunctionStrings
shared_ptr< const DBCALShowerMatchParams > Get_BCALShowerMatchParams(void) const
map< Particle_t, map< DetectorSystem_t, pair< string, string > > > ddEdxCuts_TF1FunctionStrings
bool Get_IsVertexKnown_NoBeam(bool locIsProductionVertex, const DSourceCombo *locVertexCombo, bool locIsCombo2ndVertex) const
DSourceCombosByUse_Small Get_FurtherDecayCombos(void) const
void Combo_Horizontally_AddDecay(const DSourceComboUse &locComboUseToCreate, const DSourceComboUse &locComboUseAllBut1, const DSourceComboUse &locComboUseToAdd, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, bool locExpandAllBut1Flag, unsigned char locNumTabs)
void Set_SourceComboTimeHandler(const DSourceComboTimeHandler *locSourceComboTimeHandler)
vector< const DReactionStep * > Get_ReactionSteps(void) const
void Create_CutFunctions(void)
void Calc_VertexTimeOffsets_WithCharged(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionChargedCombo)
void Set_PhotonKinematics(const DPhotonKinematicsByZBin &locPhotonKinematics)
vector< size_t > Get_StepIndices(void) const
DetectorSystem_t t1_detector(void) const
bool Get_PromoteFlag(ComboingStage_t locComboingStage, Particle_t locDecayPID_UseToCheck, const DSourceComboInfo *locComboInfo_UseToCreate, const DSourceComboInfo *locComboInfo_UseToCheck, DSourceComboUse &locNonNeutralUse) const
void Calc_VertexTimeOffsets_WithPhotons(const DReactionVertexInfo *locReactionVertexInfo, const DSourceCombo *locReactionChargedCombo, const DSourceCombo *locReactionFullCombo)
DSourceCombo * Get_SourceComboResource(void)
map< Particle_t, map< DetectorSystem_t, TF1 * > > dEOverPCutMap
map< Particle_t, map< DetectorSystem_t, pair< vector< double >, vector< double > > > > ddEdxCuts_TF1Params
bool GetTargetZ(double &z_target) const
z-location of center of target
bool Get_HasMassiveNeutrals(const DSourceComboInfo *locSourceComboInfo) const
map< const DReaction *, TH2 * > dNumCombosSurvivedStage2DMap
void Combo_Vertically_AllParticles(const DSourceComboUse &locComboUseToCreate, ComboingStage_t locComboingStage, unsigned char locNumTabs)
DSourceComboVertexer * dSourceComboVertexer
void Combo_Horizontally_AddParticle(const DSourceComboUse &locComboUseToCreate, const DSourceComboUse &locAllBut1ComboUse, Particle_t locPID, ComboingStage_t locComboingStage, const DSourceCombo *locChargedCombo_Presiding, unsigned char locNumTabs)
map< pair< const DSourceCombo *, DSourceComboUse >, map< vector< int >, size_t > > dResumeSearchAfterIndices_Combos
Particle_t PID(void) const
unordered_map< const DReaction *, vector< const DParticleCombo * >> DCombosByReaction
const vector< const JObject * > & Get_ParticlesForComboing(Particle_t locPID, ComboingStage_t locComboingStage, const vector< int > &locBeamBunches={}, signed char locVertexZBin=0)
bool Cut_MissingMassSquared(const DReaction *locReaction, const DReactionVertexInfo *locReactionVertexInfo, const DSourceComboUse &locReactionFullComboUse, const DSourceCombo *locReactionFullCombo, const DKinematicData *locBeamParticle, int locRFBunch)
void Build_ParticleIndices(Particle_t locPID, const vector< int > &locBeamBunches, const vector< const JObject * > &locParticles, signed char locVertexZBin)
void Print_SourceCombo(const DSourceCombo *locCombo, unsigned char locNumTabs=0)
void Fill_CutHistograms(void)
void Recycle(const DType *locResource)
vector< const DReaction * > Get_Reactions(void) const