4 #pragma GCC diagnostic ignored "-Wuseless-cast"
5 #pragma GCC diagnostic ignored "-Wfloat-conversion"
17 MACH3LOG_ERROR(
"Trying to create BinnedSplineHandler with uninitialized covariance object");
23 MACH3LOG_ERROR(
"Trying to create BinnedSplineHandler with uninitialized MaCh3Modes object");
69 const std::string& SampleTitle,
70 const std::vector<std::string>& OscChanFileNames,
71 const std::vector<std::string>& SplineVarNames) {
75 Dimensions.push_back(
static_cast<int>(SplineVarNames.size()));
95 MACH3LOG_INFO(
"SplineModeVecs_Sample is of size {}", SplineModeVecs_Sample.size());
100 int nOscChan = int(OscChanFileNames.size());
105 std::vector<std::vector<TAxis *>> SampleBinning(nOscChan);
106 for (
int iOscChan = 0; iOscChan < nOscChan; iOscChan++)
108 SampleBinning[iOscChan] =
FindSplineBinning(OscChanFileNames[iOscChan], SampleTitle);
110 MACH3LOG_INFO(
"#----------------------------------------------------------------------------------------------------------------------------------#");
115 MACH3LOG_INFO(
"#----------------------------------------------------------------------------------------------------------------------------------#");
118 MACH3LOG_INFO(
"#----------------------------------------------------------------------------------------------------------------------------------#");
125 std::map<unsigned int, std::map<unsigned int, std::map<std::string, std::pair<unsigned int, unsigned int>>>> systZeroCounts;
127 unsigned int iSample = entry.iSample;
128 unsigned int iSyst = entry.iSyst;
133 auto& counts = systZeroCounts[iSample][iSyst][modeSuffix];
136 if (entry.value == -1)
139 if (counts.second > 1)
142 "Sample '{}' | OscChan {} | Syst '{}' | Mode '{}' | Var1 {} | Var2 {} | Var3 {} => Value: {}",
157 for (
const auto& samplePair : systZeroCounts) {
158 unsigned int iSample = samplePair.first;
160 for (
const auto& systPair : samplePair.second) {
161 unsigned int iSyst = systPair.first;
162 const auto& systName = SplineFileParPrefixNames_Sample[iSyst];
163 for (
const auto& modePair : systPair.second) {
164 const auto& modeSuffix = modePair.first;
165 const auto& counts = modePair.second;
167 "Sample '{}': Systematic '{}' has missing splines in mode '{}'. Expected Splines: {}, Missing Splines: {}",
187 MACH3LOG_ERROR(
"Something's gone wrong when we tried to get the size of your monolith");
203 int splineindex = entry.value;
206 bool foundUniqueSpline =
false;
208 for (
int iUniqueSyst = 0; iUniqueSyst <
nParams; iUniqueSyst++)
213 foundUniqueSpline =
true;
219 if (!foundUniqueSpline)
224 for (
int iUniqueSyst = 0; iUniqueSyst <
nParams; iUniqueSyst++)
243 for(
int i = 0; i < splineKnots; i++){
250 delete[] tmpXCoeffArr;
251 delete[] tmpManyCoeffArr;
273 #pragma omp parallel for simd
279 const short int currentsegment = short(
SplineSegments[uniqueIndex]);
282 const int coeffOffset = segCoeff *
_nCoeff_;
301 if(weight < 0){weight = 0.;}
313 for (
int iOscChan = 0; iOscChan <
nOscChans[iSample]; ++iOscChan)
317 int nModesInSyst =
static_cast<int>(
SplineModeVecs[iSample][iSyst].size());
318 for (
int iMode = 0; iMode < nModesInSyst; ++iMode)
320 const int nBins1 =
SplineBinning[iSample][iOscChan][0]->GetNbins();
321 const int nBins2 =
SplineBinning[iSample][iOscChan][1]->GetNbins();
322 const int nBins3 =
SplineBinning[iSample][iOscChan][2]->GetNbins();
323 for (
int iVar1 = 0; iVar1 < nBins1; ++iVar1) {
324 for (
int iVar2 = 0; iVar2 < nBins2; ++iVar2) {
325 for (
int iVar3 = 0; iVar3 < nBins3; ++iVar3) {
350 constexpr
int nDummyBins = 1;
351 constexpr
double DummyEdges[2] = {-1e15, 1e15};
352 TAxis* DummyAxis =
new TAxis(nDummyBins, DummyEdges);
353 TH2F* Hist2D =
nullptr;
354 TH3F* Hist3D =
nullptr;
356 auto File = std::unique_ptr<TFile>(
TFile::Open(FileName.c_str(),
"READ"));
357 if (!File || File->IsZombie())
360 MACH3LOG_ERROR(
"This is caused by something here! {} : {}", __FILE__, __LINE__);
367 std::string TemplateName =
"dev_tmp_0_0";
368 TObject *Obj = File->Get(TemplateName.c_str());
372 TemplateName =
"dev_tmp.0.0";
373 Obj = File->Get(TemplateName.c_str());
376 MACH3LOG_ERROR(
"Could not find dev_tmp_0_0 in spline file. Spline binning cannot be set!");
383 bool isHist2D = Obj->IsA() == TH2F::Class();
385 bool isHist3D = Obj->IsA() == TH3F::Class();
386 if (!isHist2D && !isHist3D)
388 MACH3LOG_ERROR(
"Object doesn't inherit from either TH2D and TH3D - Odd A");
399 Hist2D = File->Get<TH2F>(TemplateName.c_str());
404 Hist3D = File->Get<TH3F>((TemplateName.c_str()));
406 if (
Dimensions[iSample] != 3 && Hist3D->GetZaxis()->GetNbins() != 1)
411 Hist3D = File->Get<TH3F>(TemplateName.c_str());
414 std::vector<TAxis*> ReturnVec;
419 ReturnVec[0] =
static_cast<TAxis*
>(Hist2D->GetXaxis()->Clone());
420 ReturnVec[1] =
static_cast<TAxis*
>(Hist2D->GetYaxis()->Clone());
421 ReturnVec[2] =
static_cast<TAxis*
>(DummyAxis->Clone());
422 }
else if (isHist3D) {
423 ReturnVec[0] =
static_cast<TAxis*
>(Hist3D->GetXaxis()->Clone());
424 ReturnVec[1] =
static_cast<TAxis*
>(Hist3D->GetYaxis()->Clone());
425 ReturnVec[2] =
static_cast<TAxis*
>(DummyAxis->Clone());
428 ReturnVec[0] =
static_cast<TAxis*
>(Hist3D->GetXaxis()->Clone());
429 ReturnVec[1] =
static_cast<TAxis*
>(Hist3D->GetYaxis()->Clone());
430 ReturnVec[2] =
static_cast<TAxis*
>(Hist3D->GetZaxis()->Clone());
436 for (
unsigned int iAxis = 0; iAxis < ReturnVec.size(); ++iAxis) {
448 const int sample,
const int oscchan,
const int syst,
const int mode,
449 const int var1bin,
const int var2bin,
const int var3bin) {
452 for (
size_t i = 0; i < vec.size(); i++)
454 const auto& entry = vec[i];
455 if (entry.iSample == sample &&
456 entry.iOscChan == oscchan &&
457 entry.iSyst == syst &&
458 entry.iMode == mode &&
459 entry.iVar1 == var1bin &&
460 entry.iVar2 == var2bin &&
461 entry.iVar3 == var3bin)
463 return static_cast<int>(i);
467 MACH3LOG_ERROR(
"Index not found! sample={} oscchan={} syst={} mode={} var1={} var2={} var3={}",
468 sample, oscchan, syst, mode, var1bin, var2bin, var3bin);
474 const int var1bin,
const int var2bin,
const int var3bin)
const {
486 int FullCounter_All = 0;
487 int FullCounter_NonFlat = 0;
489 for (
unsigned int index = 0; index <
IndexVect.size(); index++)
493 int iSample = entry.iSample;
499 entry.iMode, entry.iVar1,
500 entry.iVar2, entry.iVar3)) {
503 SampleAll[iSample]++;
506 SampleNonFlat[iSample]++;
511 for (
size_t iSample = 0; iSample <
SampleTitles.size(); iSample++)
513 MACH3LOG_DEBUG(
"{:<10} has {:<10} splines, of which {:<10} are not flat",
516 SampleNonFlat[iSample]);
518 FullCounter_All += SampleAll[iSample];
519 FullCounter_NonFlat += SampleNonFlat[iSample];
523 MACH3LOG_INFO(
"Total number of splines loaded: {}", FullCounter_All);
524 MACH3LOG_INFO(
"Total number of non-flat splines loaded: {}", FullCounter_NonFlat);
528 return FullCounter_NonFlat;
530 return FullCounter_All;
537 std::vector<TSpline3_red*> UniqueSystSplines;
538 bool FoundNonFlatSpline =
false;
546 int splineindex = entry.value;
548 if(SampleCounter != entry.iSample || SystCounter != entry.iSyst) {
549 SampleCounter = entry.iSample;
550 SystCounter = entry.iSyst;
551 FoundNonFlatSpline =
false;
554 bool FoundSyst =
false;
555 for (
unsigned int iFoundSyst = 0; iFoundSyst <
UniqueSystNames.size(); iFoundSyst++) {
560 if (FoundSyst)
continue;
567 FoundNonFlatSpline =
true;
569 if (FoundNonFlatSpline) {
572 MACH3LOG_INFO(
"{} syst has no response in sample {}", SystName, entry.iSample);
573 MACH3LOG_INFO(
"Whilst this isn't necessarily a problem, it seems odd");
576 nParams =
static_cast<short int>(UniqueSystSplines.size());
582 for (
int iSpline = 0; iSpline <
nParams; iSpline++)
591 UniqueSystSplines[iSpline]->GetKnot(iKnot, xPoint, yPoint);
600 MACH3LOG_INFO(
"{:<15} | {:<20} | {:<6}",
"Spline Index",
"Syst Name",
"nKnots");
601 for (
int iUniqueSyst = 0; iUniqueSyst <
nParams; iUniqueSyst++)
606 int nCombinations_FlatSplines = 0;
607 int nCombinations_All = 0;
609 for (
unsigned int index = 0; index <
IndexVect.size(); index++)
611 int splineindex =
IndexVect[index].value;;
614 nCombinations_FlatSplines++;
619 MACH3LOG_INFO(
"Number of combinations of Sample, OscChan, Syst and Mode which have entirely flat response: {} / {}", nCombinations_FlatSplines, nCombinations_All);
629 for (
int i = 0; i < nPoints; i++) {
631 for (
int j = 0; j <
_nCoeff_; j++) {
636 for(
int i=0; i<nPoints; i++) {
663 for (
size_t iSample = 0; iSample <
SampleTitles.size(); ++iSample) {
665 return static_cast<int>(iSample);
688 std::map<int, std::set<int>> OscToSysts;
691 if (entry.iSample != iSample)
continue;
692 OscToSysts[entry.iOscChan].insert(entry.iSyst);
694 MACH3LOG_INFO(
"Sample {} has {} oscillation channels", SampleTitle, OscToSysts.size());
696 for (
const auto& OscPair : OscToSysts) {
697 int osc = OscPair.first;
698 const std::set<int>& SystSet = OscPair.second;
699 MACH3LOG_INFO(
"Oscillation channel {} has {} systematics", osc, SystSet.size());
705 int iSyst,
int iMode,
int iVar1,
int iVar2,
int iVar3)
const {
714 if (entry.iSample == iSample &&
715 entry.iOscChan == iOscChan &&
716 entry.iSyst == iSyst &&
717 entry.iMode == iMode &&
718 entry.iVar1 == iVar1 &&
719 entry.iVar2 == iVar2 &&
720 entry.iVar3 == iVar3)
746 const int NBins = Axis->GetNbins();
747 std::string text =
"";
748 for (
int iBin = 0; iBin <= NBins; iBin++) {
749 text += fmt::format(
"{} ", Axis->GetXbins()->GetAt(iBin));
756 int iOscChan,
int EventMode,
double Var1Val,
757 double Var2Val,
double Var3Val) {
759 std::vector<std::vector<int>> ReturnVec;
774 std::vector<int> bins;
775 std::vector<double> vars = {Var1Val, Var2Val, Var3Val};
776 for (
size_t i = 0; i < vars.size(); ++i) {
777 int bin =
SplineBinning[SampleIndex][iOscChan][i]->FindBin(vars[i]) - 1;
778 if (bin < 0 || bin >=
SplineBinning[SampleIndex][iOscChan][i]->GetNbins()) {
783 int Var1Bin = bins[0];
int Var2Bin = bins[1];
int Var3Bin = bins[2];
785 for(
int iSyst=0; iSyst <
nSplineParams[SampleIndex]; iSyst++){
786 std::vector<int> spline_modes =
SplineModeVecs[SampleIndex][iSyst];
787 int nSampleModes =
static_cast<int>(spline_modes.size());
790 for(
int iMode = 0; iMode<nSampleModes; iMode++) {
792 if (Mode == spline_modes[iMode]) {
797 ReturnVec.push_back({SampleIndex, iOscChan, iSyst, iMode, Var1Bin, Var2Bin, Var3Bin});
811 size_t InputVectorSize = InputVector.size();
812 std::vector< std::vector<int> > ReturnVec(InputVectorSize);
815 for (
size_t iSyst=0;iSyst<InputVectorSize;iSyst++) {
816 std::vector<int> TmpVec;
817 std::vector<std::string> TestVec;
820 for (
unsigned int iMode = 0 ; iMode < InputVector[iSyst].size() ; iMode++) {
821 int Mode = InputVector[iSyst][iMode];
824 bool IncludeMode =
true;
825 for (
auto TestString : TestVec) {
826 if (ModeName == TestString) {
833 TmpVec.push_back(Mode);
834 TestVec.push_back(ModeName);
838 ReturnVec[iSyst] = TmpVec;
848 for (
int iOscChan = 0; iOscChan < nOscChannels; iOscChan++) {
850 TSpline3* mySpline =
nullptr;
853 int nKnots, SystNum, ModeNum, Var1Bin, Var2Bin, Var3Bin =
M3::_BAD_INT_;
857 std::set<std::string> SplineFileNames;
859 auto File = std::unique_ptr<TFile>(
TFile::Open(OscChanFileNames[iOscChan].c_str()));
861 if (!File || File->IsZombie()) {
868 for (
auto k : *File->GetListOfKeys()) {
869 auto Key =
static_cast<TKey*
>(k);
870 TClass *Class = gROOT->GetClass(Key->GetClassName(),
false);
871 if(!Class->InheritsFrom(
"TSpline3")) {
875 std::string FullSplineName = std::string(Key->GetName());
877 if (SplineFileNames.count(FullSplineName) > 0) {
878 MACH3LOG_CRITICAL(
"Skipping spline - Found a spline whose name has already been encountered before: {}", FullSplineName);
881 SplineFileNames.insert(FullSplineName);
886 MACH3LOG_ERROR(
"Invalid tokens from spline name - Expected {} tokens. Check implementation in GetTokensFromSplineName()",
static_cast<int>(
kNTokens));
907 MACH3LOG_DEBUG(
"Couldn't Match any systematic name in ParameterHandler with spline name: {}" , FullSplineName);
912 for (
unsigned int iMode = 0; iMode <
SplineModeVecs[iSample][SystNum].size(); iMode++) {
922 MACH3LOG_DEBUG(
"Couldn't find mode for {} in {}. Problem Spline is : {} ", Mode, Syst, FullSplineName);
926 mySpline = Key->ReadObject<TSpline3>();
928 if (
isValidSplineIndex(SampleTitle, iOscChan, SystNum, ModeNum, Var1Bin, Var2Bin, Var3Bin)) {
929 MACH3LOG_TRACE(
"Pushed back monolith for spline {}", FullSplineName);
931 nKnots = mySpline->GetNp();
933 for (
int iKnot = 0; iKnot < nKnots; iKnot++) {
934 mySpline->GetKnot(iKnot, x, y);
935 if (y < 0.99999 || y > 1.00001)
953 if(mySpline)
delete mySpline;
980 size_t pos = FileName.find(
' ');
981 if (pos != std::string::npos) {
982 MACH3LOG_WARN(
"Filename ({}) contains spaces. Replacing spaces with underscores.", FileName);
983 while ((pos = FileName.find(
' ')) != std::string::npos) {
987 auto SplineFile = std::make_unique<TFile>(FileName.c_str(),
"OPEN");
989 TMacro *ConfigCov = SplineFile->Get<TMacro>(
"ParameterHandler");
997 MACH3LOG_ERROR(
"Loading precomputed spline file, however encountered different YAML config, please regenerate input");
1006 for (
int iSpline = 0; iSpline <
nParams; iSpline++) {
1009 SplineFile->Close();
1016 TTree *Settings = SplineFile->Get<TTree>(
"Settings");
1017 int CoeffIndex_temp, MonolithSize_temp;
1018 short int nParams_temp;
1019 Settings->SetBranchAddress(
"CoeffIndex", &CoeffIndex_temp);
1020 Settings->SetBranchAddress(
"MonolithSize", &MonolithSize_temp);
1021 Settings->SetBranchAddress(
"nParams", &nParams_temp);
1023 int SplineBinning_size1, SplineBinning_size2, SplineBinning_size3;
1024 Settings->SetBranchAddress(
"SplineBinning_size1", &SplineBinning_size1);
1025 Settings->SetBranchAddress(
"SplineBinning_size2", &SplineBinning_size2);
1026 Settings->SetBranchAddress(
"SplineBinning_size3", &SplineBinning_size3);
1027 int SplineModeVecs_size1, SplineModeVecs_size2, SplineModeVecs_size3;
1028 Settings->SetBranchAddress(
"SplineModeVecs_size1", &SplineModeVecs_size1);
1029 Settings->SetBranchAddress(
"SplineModeVecs_size2", &SplineModeVecs_size2);
1030 Settings->SetBranchAddress(
"SplineModeVecs_size3", &SplineModeVecs_size3);
1031 std::vector<std::string>* SampleNames_temp =
nullptr;
1032 Settings->SetBranchAddress(
"SampleNames", &SampleNames_temp);
1033 std::vector<std::string>* SampleTitles_temp =
nullptr;
1034 Settings->SetBranchAddress(
"SampleTitles", &SampleTitles_temp);
1035 std::vector<int>* nSplineParams_temp =
nullptr;
1036 Settings->SetBranchAddress(
"nSplineParams", &nSplineParams_temp);
1037 Settings->GetEntry(0);
1050 auto Resize3D = [](
auto& vec,
int d1,
int d2,
int d3) {
1052 for (
int i = 0; i < d1; ++i) {
1054 for (
int j = 0; j < d2; ++j) {
1055 vec[i][j].resize(d3);
1060 Resize3D(
SplineBinning, SplineBinning_size1, SplineBinning_size2, SplineBinning_size3);
1061 Resize3D(
SplineModeVecs, SplineModeVecs_size1, SplineModeVecs_size2, SplineModeVecs_size3);
1068 TTree *MonolithTree = SplineFile->Get<TTree>(
"MonolithTree");
1074 MonolithTree->SetBranchAddress(
"isflatarray",
isflatarray);
1077 std::vector<int>* coeffindexvec_temp =
nullptr;
1078 MonolithTree->SetBranchAddress(
"coeffindexvec", &coeffindexvec_temp);
1079 std::vector<int>* uniquecoeffindices_temp =
nullptr;
1080 MonolithTree->SetBranchAddress(
"uniquecoeffindices", &uniquecoeffindices_temp);
1081 std::vector<int>* uniquesplinevec_Monolith_temp =
nullptr;
1082 MonolithTree->SetBranchAddress(
"uniquesplinevec_Monolith", &uniquesplinevec_Monolith_temp);
1083 std::vector<int>* UniqueSystIndices_temp =
nullptr;
1084 MonolithTree->SetBranchAddress(
"UniqueSystIndices", &UniqueSystIndices_temp);
1088 MonolithTree->SetBranchAddress(
"xcoeff",
xcoeff_arr);
1090 MonolithTree->GetEntry(0);
1102 TTree *IndexTree = SplineFile->Get<TTree>(
"IndexVec");
1105 IndexTree->SetBranchAddress(
"SplineIndex", &IndexTemp);
1106 IndexVect.resize(IndexTree->GetEntries());
1108 for (Long64_t iEntry = 0; iEntry < IndexTree->GetEntries(); ++iEntry) {
1109 IndexTree->GetEntry(iEntry);
1114 TTree *SplineBinningTree = SplineFile->Get<TTree>(
"SplineBinningTree");
1115 std::vector<int> indices(3);
1116 SplineBinningTree->SetBranchAddress(
"i", &indices[0]);
1117 SplineBinningTree->SetBranchAddress(
"j", &indices[1]);
1118 SplineBinningTree->SetBranchAddress(
"k", &indices[2]);
1119 TAxis* axis =
nullptr;
1120 SplineBinningTree->SetBranchAddress(
"axis", &axis);
1123 for (Long64_t entry = 0; entry < SplineBinningTree->GetEntries(); ++entry) {
1124 SplineBinningTree->GetEntry(entry);
1128 SplineBinning[i][j][k] =
static_cast<TAxis*
>(axis->Clone());
1131 std::vector<int> indices_mode(3);
1133 TTree *SplineModeTree = SplineFile->Get<TTree>(
"SplineModeTree");
1134 SplineModeTree->SetBranchAddress(
"i", &indices_mode[0]);
1135 SplineModeTree->SetBranchAddress(
"j", &indices_mode[1]);
1136 SplineModeTree->SetBranchAddress(
"k", &indices_mode[2]);
1137 SplineModeTree->SetBranchAddress(
"value", &mode_value);
1140 for (Long64_t entry = 0; entry < SplineModeTree->GetEntries(); ++entry) {
1141 SplineModeTree->GetEntry(entry);
1142 int i = indices_mode[0];
1143 int j = indices_mode[1];
1144 int k = indices_mode[2];
1155 size_t pos = FileName.find(
' ');
1156 if (pos != std::string::npos) {
1157 MACH3LOG_WARN(
"Filename ({}) contains spaces. Replacing spaces with underscores.", FileName);
1158 while ((pos = FileName.find(
' ')) != std::string::npos) {
1159 FileName[pos] =
'_';
1163 auto SplineFile = std::make_unique<TFile>(FileName.c_str(),
"recreate");
1165 TMacro ConfigSave =
YAMLtoTMacro(ConfigCurrent,
"ParameterHandler");
1174 SplineFile->Close();
1180 TTree *Settings =
new TTree(
"Settings",
"Settings");
1183 short int nParams_temp =
nParams;
1185 Settings->Branch(
"CoeffIndex", &CoeffIndex_temp,
"CoeffIndex/I");
1186 Settings->Branch(
"MonolithSize", &MonolithSize_temp,
"MonolithSize/I");
1187 Settings->Branch(
"nParams", &nParams_temp,
"nParams/S");
1189 int SplineBinning_size1 =
static_cast<int>(
SplineBinning.size());
1190 int SplineBinning_size2 = (SplineBinning_size1 > 0) ?
static_cast<int>(
SplineBinning[0].size()) : 0;
1191 int SplineBinning_size3 = (SplineBinning_size2 > 0) ?
static_cast<int>(
SplineBinning[0][0].size()) : 0;
1193 Settings->Branch(
"SplineBinning_size1", &SplineBinning_size1,
"SplineBinning_size1/I");
1194 Settings->Branch(
"SplineBinning_size2", &SplineBinning_size2,
"SplineBinning_size2/I");
1195 Settings->Branch(
"SplineBinning_size3", &SplineBinning_size3,
"SplineBinning_size3/I");
1197 int SplineModeVecs_size1 =
static_cast<int>(
SplineModeVecs.size());
1198 int SplineModeVecs_size2 = (SplineModeVecs_size1 > 0) ?
static_cast<int>(
SplineModeVecs[0].size()) : 0;
1199 int SplineModeVecs_size3 = (SplineModeVecs_size2 > 0) ?
static_cast<int>(
SplineModeVecs[0][0].size()) : 0;
1201 Settings->Branch(
"SplineModeVecs_size1", &SplineModeVecs_size1,
"SplineModeVecs_size1/I");
1202 Settings->Branch(
"SplineModeVecs_size2", &SplineModeVecs_size2,
"SplineModeVecs_size2/I");
1203 Settings->Branch(
"SplineModeVecs_size3", &SplineModeVecs_size3,
"SplineModeVecs_size3/I");
1205 std::vector<std::string> SampleNames_temp =
SampleNames;
1206 Settings->Branch(
"SampleNames", &SampleNames_temp);
1207 std::vector<std::string> SampleTitles_temp =
SampleTitles;
1208 Settings->Branch(
"SampleTitles", &SampleTitles_temp);
1210 Settings->Branch(
"nSplineParams", &nSplineParams_temp);
1221 TTree *MonolithTree =
new TTree(
"MonolithTree",
"MonolithTree");
1226 MonolithTree->Branch(
"coeffindexvec", &coeffindexvec_temp);
1228 MonolithTree->Branch(
"uniquecoeffindices", &uniquecoeffindices_temp);
1230 MonolithTree->Branch(
"uniquesplinevec_Monolith", &uniquesplinevec_Monolith_temp);
1232 MonolithTree->Branch(
"UniqueSystIndices", &UniqueSystIndices_temp);
1235 MonolithTree->Fill();
1237 MonolithTree->Write();
1238 delete MonolithTree;
1245 TTree *IndexTree =
new TTree(
"IndexVec",
"IndexVec");
1247 IndexTree->Branch(
"SplineIndex", &entry);
1262 TTree *SplineBinningTree =
new TTree(
"SplineBinningTree",
"SplineBinningTree");
1263 std::vector<int> indices(3);
1264 TAxis* axis =
nullptr;
1265 SplineBinningTree->Branch(
"i", &indices[0],
"i/I");
1266 SplineBinningTree->Branch(
"j", &indices[1],
"j/I");
1267 SplineBinningTree->Branch(
"k", &indices[2],
"k/I");
1268 SplineBinningTree->Branch(
"axis",
"TAxis", &axis);
1275 indices[0] =
static_cast<int>(i);
1276 indices[1] =
static_cast<int>(j);
1277 indices[2] =
static_cast<int>(k);
1278 SplineBinningTree->Fill();
1283 SplineBinningTree->Write();
1284 delete SplineBinningTree;
1286 std::vector<int> indices_mode(3);
1289 TTree *SplineModeTree =
new TTree(
"SplineModeTree",
"SplineModeTree");
1291 SplineModeTree->Branch(
"i", &indices_mode[0],
"i/I");
1292 SplineModeTree->Branch(
"j", &indices_mode[1],
"j/I");
1293 SplineModeTree->Branch(
"k", &indices_mode[2],
"k/I");
1294 SplineModeTree->Branch(
"value", &mode_value,
"value/I");
1300 indices_mode[0] =
static_cast<int>(i);
1301 indices_mode[1] =
static_cast<int>(j);
1302 indices_mode[2] =
static_cast<int>(k);
1304 SplineModeTree->Fill();
1310 SplineModeTree->Write();
1311 delete SplineModeTree;
int GetSplineIndex(const std::vector< SplineIndex > &vec, const int sample, const int oscchan, const int syst, const int mode, const int var1bin, const int var2bin, const int var3bin)
#define _MaCh3_Safe_Include_Start_
KS: Avoiding warning checking for headers.
#define _MaCh3_Safe_Include_End_
#define MACH3LOG_CRITICAL
void CleanContainer(T &)
Base case: do nothing for non-pointer types.
void CleanVector(T &)
Base case: do nothing for non-vector types.
@ kSpline
For splined parameters (1D)
constexpr int _nCoeff_
KS: We store coefficients {y,b,c,d} in one array one by one, this is only to define it once rather th...
void ApplyKnotWeightCapTSpline3(TSpline3 *&Spline, const int splineParsIndex, ParameterHandlerGeneric *XsecCov)
EM: Apply capping to knot weight for specified spline parameter. param graph needs to have been set i...
bool isFlat(TSpline3_red *&spl)
CW: Helper function used in the constructor, tests to see if the spline is flat.
TMacro YAMLtoTMacro(const YAML::Node &yaml_node, const std::string &name)
Convert a YAML node to a ROOT TMacro object.
YAML::Node TMacroToYAML(const TMacro ¯o)
KS: Convert a ROOT TMacro object to a YAML node.
bool compareYAMLNodes(const YAML::Node &node1, const YAML::Node &node2, bool Mute=false)
Compare if yaml nodes are identical.
void getSplineCoeff_SepMany(int splineindex, M3::float_t *&xArray, M3::float_t *&manyArray)
Rather work with spline coefficients in the splines, let's copy ND and use coefficient arrays.
virtual void FillSampleArray(const std::string &SampleTitle, const std::vector< std::string > &OscChanFileNames)
Loads and processes splines from ROOT files for a given sample.
bool * isflatarray
Need to keep track of which splines are flat and which aren't.
void LoadIndexDir(std::unique_ptr< TFile > &SplineFile)
KS: Load preprocessed Index.
int CountNumberOfLoadedSplines(bool NonFlat=false, int Verbosity=0)
Count how many splines we have.
ParameterHandlerGeneric * ParHandler
Pointer to covariance from which we get information about spline params.
void CalcSplineWeights() final
CPU based code which eval weight for each spline.
std::vector< std::vector< std::string > > SplineFileParPrefixNames
void LoadSettingsDir(std::unique_ptr< TFile > &SplineFile)
KS: Load preprocessed Settings.
std::vector< int > coeffindexvec
void cleanUpMemory()
Remove setup variables not needed for spline evaluations.
bool isValidSplineIndex(const std::string &SampleTitle, int iSyst, int iOscChan, int iMode, int iVar1, int iVar2, int iVar3) const
Ensure we have spline for a given bin.
void PrintBinning(TAxis *Axis) const
Print spline binning.
void PrepareSplineFile(std::string FileName) final
KS: Prepare spline file that can be used for fast loading.
void PrepForReweight()
Initialise flat structure.
void InvestigateMissingSplines() const
This function will find missing splines in file.
std::vector< int > nSplineParams
std::vector< std::vector< std::vector< int > > > SplineModeVecs
std::vector< int > nOscChans
M3::float_t * xcoeff_arr
x coefficients for each spline
std::vector< std::string > SampleTitles
void PrintSampleDetails(const std::string &SampleTitle) const
Print info like Sample ID of spline params etc.
std::vector< std::string > UniqueSystNames
name of each spline parameter
const M3::float_t * RetPointer(const int sample, const int oscchan, const int syst, const int mode, const int var1bin, const int var2bin, const int var3bin) const
get pointer to spline weight based on bin variables
std::vector< std::vector< SplineInterpolation > > SplineInterpolationTypes
spline interpolation types for each sample. These vectors are from a call to GetSplineInterpolationFr...
std::vector< SplineIndex > IndexVect
Variables related to determined which modes have splines and which piggy-back of other modes.
std::vector< std::vector< int > > GetEventSplines(const std::string &SampleTitle, int iOscChan, int EventMode, double Var1Val, double Var2Val, double Var3Val)
Return the splines which affect a given event.
void Evaluate() final
CW: This Eval should be used when using two separate x,{y,a,b,c,d} arrays to store the weights; proba...
std::vector< int > Dimensions
std::vector< int > uniquesplinevec_Monolith
Maps single spline object with single parameter.
void PrepareIndexDir(std::unique_ptr< TFile > &SplineFile) const
KS: Prepare Index Info within SplineFile.
void BuildSampleIndexingArray(const std::string &SampleTitle)
Only need 1 indexing array everything else interfaces with this to get binning properties.
std::vector< M3::float_t > weightvec_Monolith
Stores weight from spline evaluation for each single spline.
void AddSample(const std::string &SampleName, const std::string &SampleTitle, const std::vector< std::string > &OscChanFileNames, const std::vector< std::string > &SplineVarNames)
add oscillation channel to spline monolith
std::vector< TAxis * > FindSplineBinning(const std::string &FileName, const std::string &SampleTitle)
Grab histograms with spline binning.
std::vector< std::vector< std::string > > DimensionLabels
std::vector< std::vector< int > > StripDuplicatedModes(const std::vector< std::vector< int > > &InputVector) const
Creates an array to be filled with monolith indexes for each sample (allows for indexing between 7D b...
void LoadSplineFile(std::string FileName) final
KS: Load preprocessed spline file.
void PrepareMonolithDir(std::unique_ptr< TFile > &SplineFile) const
KS: Prepare Monolith Info within SplineFile.
BinnedSplineHandler(ParameterHandlerGeneric *xsec_, MaCh3Modes *Modes_)
Constructor.
void LoadMonolithDir(std::unique_ptr< TFile > &SplineFile)
KS: Load preprocessed Monolith.
std::vector< std::vector< std::vector< TAxis * > > > SplineBinning
std::vector< TSpline3_red * > splinevec_Monolith
holds each spline object before stripping into coefficient monolith
std::vector< int > uniquecoeffindices
Unique coefficient indices.
void PrepareOtherInfoDir(std::unique_ptr< TFile > &SplineFile) const
KS: Prepare Other Info within SplineFile.
void PrepareSettingsDir(std::unique_ptr< TFile > &SplineFile) const
KS: Prepare Settings Info within SplineFile.
MaCh3Modes * Modes
pointer to MaCh3 Mode from which we get spline suffix
void PrintArrayDetails(const std::string &SampleTitle) const
Print info like Sample ID of spline params etc.
std::vector< std::vector< int > > GlobalSystIndex
This holds the global spline index and is used to grab the current parameter value to evaluate spline...
virtual ~BinnedSplineHandler()
Destructor.
virtual std::vector< std::string > GetTokensFromSplineName(const std::string &FullSplineName)=0
std::vector< std::string > SampleNames
void TransferToMonolith()
flatten multidimensional spline array into proper monolith
std::vector< int > UniqueSystIndices
Global index of each spline param, it allows us to match spline ordering with global.
int GetSampleIndex(const std::string &SampleTitle) const
Get index of sample based on name.
M3::float_t * manycoeff_arr
ybcd coefficients for each spline
Custom exception class used throughout MaCh3.
KS: Class describing MaCh3 modes used in the analysis, it is being initialised from config.
int GetNModes() const
KS: Get number of modes, keep in mind actual number is +1 greater due to unknown category.
std::string GetSplineSuffixFromMaCh3Mode(const int Index)
DB: Get binned spline mode suffix from MaCh3 Mode.
const M3::float_t * RetPointer(const int iParam) const
DB Pointer return to param position.
YAML::Node GetConfig() const
Getter to return a copy of the YAML node.
Class responsible for handling of systematic error parameters with different types defined in the con...
int GetNumParamsFromSampleName(const std::string &SampleName, const SystType Type) const
DB Grab the number of parameters for the relevant SampleName.
const std::vector< std::string > GetParsNamesFromSampleName(const std::string &SampleName, const SystType Type) const
DB Grab the parameter names for the relevant SampleName.
const std::vector< std::string > GetSplineParsNamesFromSampleName(const std::string &SampleName) const
DB Get spline parameters depending on given SampleName.
const std::vector< int > GetGlobalSystIndexFromSampleName(const std::string &SampleName, const SystType Type) const
DB Get spline parameters depending on given SampleName.
const std::vector< SplineInterpolation > GetSplineInterpolationFromSampleName(const std::string &SampleName) const
Get the interpolation types for splines affecting a particular SampleName.
const std::vector< std::vector< int > > GetSplineModeVecFromSampleName(const std::string &SampleName) const
DB Grab the Spline Modes for the relevant SampleName.
Base class for calculating weight from spline.
short int nParams
Number of parameters that have splines.
void FindSplineSegment()
CW:Code used in step by step reweighting, Find Spline Segment for each param.
short int * SplineSegments
std::vector< FastSplineInfo > SplineInfoArray
float * ParamValues
Store parameter values they are not in FastSplineInfo as in case of GPU we need to copy paste it to G...
void LoadFastSplineInfoDir(std::unique_ptr< TFile > &SplineFile)
KS: Load preprocessed FastSplineInfo.
void PrepareFastSplineInfoDir(std::unique_ptr< TFile > &SplineFile) const
KS: Prepare Fast Spline Info within SplineFile.
CW: Reduced TSpline3 class.
constexpr static const double _BAD_DOUBLE_
Default value used for double initialisation.
TFile * Open(const std::string &Name, const std::string &Type, const std::string &File, const int Line)
Opens a ROOT file with the given name and mode.
constexpr static const char * float_t_str_repr
constexpr static const int _BAD_INT_
Default value used for int initialisation.
constexpr T fmaf_t(T x, T y, T z)
Function template for fused multiply-add.
void AddPath(std::string &FilePath)
Prepends the MACH3 environment path to FilePath if it is not already present.
Flat representation of a spline index entry.
int iMode
Mode index within a systematic.
int value
Index into the flattened spline weight vector.
int iVar2
Second kinematic bin index.
int iVar3
Third kinematic bin index.
int iOscChan
Oscillation channel index.
int iSyst
Systematic parameter index.
int iVar1
First kinematic bin index.