From b19a195b856ba393a8b2ad0e4ff4bddc4a6a3c7a Mon Sep 17 00:00:00 2001 From: Kamil Skwarczynski Date: Fri, 27 Mar 2026 10:24:06 +0000 Subject: [PATCH] Allow to pass multiple MC files and const corectness --- SamplesTutorial/SampleHandlerTutorial.cpp | 338 +++++++++--------- SamplesTutorial/SampleHandlerTutorial.h | 35 +- SamplesTutorial/StructsTutorial.h | 4 +- Tutorial/KinemDistributionTutorial.cpp | 3 +- .../Samples/SampleHandler_Tutorial.yaml | 14 +- .../Samples/SampleHandler_Tutorial_ATM.yaml | 18 +- .../Samples/SampleHandler_Tutorial_ND.yaml | 30 +- 7 files changed, 215 insertions(+), 227 deletions(-) diff --git a/SamplesTutorial/SampleHandlerTutorial.cpp b/SamplesTutorial/SampleHandlerTutorial.cpp index 194345bc..45dd7fdd 100755 --- a/SamplesTutorial/SampleHandlerTutorial.cpp +++ b/SamplesTutorial/SampleHandlerTutorial.cpp @@ -1,5 +1,5 @@ #include "SamplesTutorial/SampleHandlerTutorial.h" -#include + // ************************************************ SampleHandlerTutorial::SampleHandlerTutorial(const std::string& config_name, ParameterHandlerGeneric* parameter_handler, const std::shared_ptr& Oscillator_) @@ -105,7 +105,9 @@ void SampleHandlerTutorial::AddAdditionalWeightPointers() { } +// ************************************************ void SampleHandlerTutorial::CleanMemoryBeforeFit() { +// ************************************************ CleanVector(TutorialPlottingSamples); } @@ -113,10 +115,11 @@ void SampleHandlerTutorial::CleanMemoryBeforeFit() { int SampleHandlerTutorial::SetupExperimentMC() { // ************************************************ TChain* _Chain = new TChain("FlatTree_VARS"); - for(size_t iSample = 0; iSample < SampleDetails.size(); iSample++) - { - for (const std::string& filename : SampleDetails[iSample].mc_files) { - _Chain->Add(filename.c_str()); + for(size_t iSample = 0; iSample < SampleDetails.size(); iSample++) { + for (const std::vector& files : SampleDetails[iSample].mc_files) { + for (const std::string& filename : files) { + _Chain->Add(filename.c_str()); + } } } @@ -137,177 +140,182 @@ int SampleHandlerTutorial::SetupExperimentMC() { int oscnutype_ = OscillationChannels[iChannel].FinalPDG; - auto FileName = SampleDetails[iSample].mc_files[iChannel]; - MACH3LOG_INFO("-------------------------------------------------------------------"); - MACH3LOG_INFO("input file: {}", FileName); + auto FileNames = SampleDetails[iSample].mc_files[iChannel]; + for(int iFile = 0 ; iFile < static_cast(FileNames.size()); iFile++) + { + auto FileName = FileNames[iFile]; + MACH3LOG_INFO("-------------------------------------------------------------------"); + MACH3LOG_INFO("input file: {}", FileName); - TFile * _sampleFile = new TFile(FileName.c_str(), "READ"); - TTree* _data = static_cast(_sampleFile->Get("FlatTree_VARS")); + TFile * _sampleFile = new TFile(FileName.c_str(), "READ"); + TTree* _data = static_cast(_sampleFile->Get("FlatTree_VARS")); - if(_data){ - MACH3LOG_INFO("Found \"FlatTree_VARS\" tree in {}", FileName); - MACH3LOG_INFO("With number of entries: {}", _data->GetEntries()); - } else{ - MACH3LOG_ERROR("Could not find \"FlatTree_VARS\" tree in {}", FileName); - throw MaCh3Exception(__FILE__, __LINE__); - } - - //Truth Variables - float Enu_true, Q2, trueCZ, ELep; - int tgt, Mode, PDGLep; - - /* - double ELep; - double CosLep; - bool flagCC0pi; - bool flagCC1pip; - bool flagCC1pim; - */ - _data->SetBranchStatus("*", false); - _data->SetBranchStatus("Enu_true", true); - _data->SetBranchAddress("Enu_true", &Enu_true); - _data->SetBranchStatus("Q2", true); - _data->SetBranchAddress("Q2", &Q2); - _data->SetBranchStatus("tgt", true); - _data->SetBranchAddress("tgt", &tgt); - _data->SetBranchStatus("Mode", true); - _data->SetBranchAddress("Mode", &Mode); - _data->SetBranchStatus("PDGLep", true); - _data->SetBranchAddress("PDGLep", &PDGLep); - _data->SetBranchStatus("ELep", true); - _data->SetBranchAddress("ELep", &ELep); - // KS: If we have CosineZenith branch this must mean Atmospheric sample - if (_data->GetBranch("CosineZenith")) { - if(iChannel == 0) { - MACH3LOG_INFO("Enabling Atmospheric"); - isATM = true; - } - _data->SetBranchStatus("CosineZenith", true); - _data->SetBranchAddress("CosineZenith", &trueCZ); - } - - /* - _data->SetBranchStatus("CosLep", true); - _data->SetBranchAddress("CosLep", &CosLep); - _data->SetBranchStatus("flagCC0pi", true); - _data->SetBranchAddress("flagCC0pi", &flagCC0pi); - _data->SetBranchStatus("flagCC1pip", true); - _data->SetBranchAddress("flagCC1pip", &flagCC1pip); - _data->SetBranchStatus("flagCC1pim", true); - _data->SetBranchAddress("flagCC1pim", &flagCC1pim); - */ - - _data->GetEntry(0); - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_int_distribution<> unif(0,3); - std::normal_distribution<> mu_angle(0,M_PI/8); - std::normal_distribution<> pi_angle(0,M_PI/2); - std::uniform_real_distribution<> nucl_angle(-M_PI,M_PI); - std::exponential_distribution<> pi_energy(1./0.5); - std::exponential_distribution<> nucl_energy(1./2); - - for (int i = 0; i < _data->GetEntries(); ++i) { // Loop through tree - _data->GetEntry(i); - - // === JM resize particle-level vectors === - // JM: We don't have particle-level info in the tutorial sample, so will fake it - int nParticles = 5; //fake number of particles in event - TutorialPlottingSamples[TotalEventCounter].particle_energy.resize(nParticles); - TutorialPlottingSamples[TotalEventCounter].particle_pdg.resize(nParticles); - TutorialPlottingSamples[TotalEventCounter].particle_beamangle.resize(nParticles); - // ======================================== - - TutorialSamples[TotalEventCounter].TrueEnu = Enu_true; - // HH: We don't have Erec in the tutorial sample, so we set it to the true energy - TutorialSamples[TotalEventCounter].RecoEnu = Enu_true; - TutorialSamples[TotalEventCounter].RecoEnu_shifted = Enu_true; - TutorialSamples[TotalEventCounter].ELep = ELep; - TutorialSamples[TotalEventCounter].Q2 = Q2; - // KS: Currently we store target as 1000060120, therefore we hardcode it to 12 - TutorialSamples[TotalEventCounter].Target = 12; - TutorialSamples[TotalEventCounter].Mode = Modes->GetModeFromGenerator(std::abs(Mode)); - TutorialSamples[TotalEventCounter].nutype = nutype_; - TutorialSamples[TotalEventCounter].oscnutype = oscnutype_; - TutorialSamples[TotalEventCounter].Sample = static_cast(iSample); - - if (std::abs(PDGLep) == 12 || std::abs(PDGLep) == 14 || std::abs(PDGLep) == 16) { - TutorialSamples[TotalEventCounter].isNC = true; - } else { - TutorialSamples[TotalEventCounter].isNC = false; + if(_data){ + MACH3LOG_INFO("Found \"FlatTree_VARS\" tree in {}", FileName); + MACH3LOG_INFO("With number of entries: {}", _data->GetEntries()); + } else{ + MACH3LOG_ERROR("Could not find \"FlatTree_VARS\" tree in {}", FileName); + throw MaCh3Exception(__FILE__, __LINE__); } - if(isATM) { - TutorialSamples[TotalEventCounter].TrueCosZenith = trueCZ; + //Truth Variables + float Enu_true, Q2, trueCZ, ELep; + int tgt, Mode, PDGLep; + + /* + double ELep; + double CosLep; + bool flagCC0pi; + bool flagCC1pip; + bool flagCC1pim; + */ + _data->SetBranchStatus("*", false); + _data->SetBranchStatus("Enu_true", true); + _data->SetBranchAddress("Enu_true", &Enu_true); + _data->SetBranchStatus("Q2", true); + _data->SetBranchAddress("Q2", &Q2); + _data->SetBranchStatus("tgt", true); + _data->SetBranchAddress("tgt", &tgt); + _data->SetBranchStatus("Mode", true); + _data->SetBranchAddress("Mode", &Mode); + _data->SetBranchStatus("PDGLep", true); + _data->SetBranchAddress("PDGLep", &PDGLep); + _data->SetBranchStatus("ELep", true); + _data->SetBranchAddress("ELep", &ELep); + // KS: If we have CosineZenith branch this must mean Atmospheric sample + if (_data->GetBranch("CosineZenith")) { + if(iChannel == 0) { + MACH3LOG_INFO("Enabling Atmospheric"); + isATM = true; + } + _data->SetBranchStatus("CosineZenith", true); + _data->SetBranchAddress("CosineZenith", &trueCZ); } - // === JM loop through particles in event === - for (int iParticle = 0; iParticle < nParticles; ++iParticle) { - //JM: No particle-level data in sample, so fake it - if (iParticle==0) { - TutorialPlottingSamples[TotalEventCounter].particle_pdg[iParticle] = PDGLep; - TutorialPlottingSamples[TotalEventCounter].particle_energy[iParticle] = ELep; - TutorialPlottingSamples[TotalEventCounter].particle_beamangle[iParticle] = mu_angle(gen); + /* + _data->SetBranchStatus("CosLep", true); + _data->SetBranchAddress("CosLep", &CosLep); + _data->SetBranchStatus("flagCC0pi", true); + _data->SetBranchAddress("flagCC0pi", &flagCC0pi); + _data->SetBranchStatus("flagCC1pip", true); + _data->SetBranchAddress("flagCC1pip", &flagCC1pip); + _data->SetBranchStatus("flagCC1pim", true); + _data->SetBranchAddress("flagCC1pim", &flagCC1pim); + */ + + _data->GetEntry(0); + std::random_device rd; + std::mt19937 gen(rd()); + for (int i = 0; i < _data->GetEntries(); ++i) { // Loop through tree + _data->GetEntry(i); + + // === JM resize particle-level vectors === + // JM: We don't have particle-level info in the tutorial sample, so will fake it + constexpr int nParticles = 5; //fake number of particles in event + TutorialPlottingSamples[TotalEventCounter].particle_energy.resize(nParticles); + TutorialPlottingSamples[TotalEventCounter].particle_pdg.resize(nParticles); + TutorialPlottingSamples[TotalEventCounter].particle_beamangle.resize(nParticles); + // ======================================== + + TutorialSamples[TotalEventCounter].TrueEnu = Enu_true; + // HH: We don't have Erec in the tutorial sample, so we set it to the true energy + TutorialSamples[TotalEventCounter].RecoEnu = Enu_true; + TutorialSamples[TotalEventCounter].RecoEnu_shifted = Enu_true; + TutorialSamples[TotalEventCounter].ELep = ELep; + TutorialSamples[TotalEventCounter].Q2 = Q2; + // KS: Currently we store target as 1000060120, therefore we hardcode it to 12 + TutorialSamples[TotalEventCounter].Target = 12; + TutorialSamples[TotalEventCounter].Mode = Modes->GetModeFromGenerator(std::abs(Mode)); + TutorialSamples[TotalEventCounter].nutype = nutype_; + TutorialSamples[TotalEventCounter].oscnutype = oscnutype_; + TutorialSamples[TotalEventCounter].Sample = static_cast(iSample); + + if (std::abs(PDGLep) == 12 || std::abs(PDGLep) == 14 || std::abs(PDGLep) == 16) { + TutorialSamples[TotalEventCounter].isNC = true; + } else { + TutorialSamples[TotalEventCounter].isNC = false; } - else { - int particle_seed = unif(gen); - double angle, energy; - int pdg; - switch (particle_seed) { - case 0: - pdg = 211; - energy = pi_energy(gen); - angle = pi_angle(gen); - while (angle>M_PI || angle<-M_PI) angle = pi_angle(gen); - break; - case 1: - pdg = -211; - energy = pi_energy(gen); - angle = pi_angle(gen); - while (angle>M_PI || angle<-M_PI) angle = pi_angle(gen); - break; - case 2: - pdg = 2212; - energy = nucl_energy(gen); - angle = nucl_angle(gen); - break; - case 3: - pdg = 2112; - energy = nucl_energy(gen); - angle = nucl_angle(gen); - break; - default: - break; - } - TutorialPlottingSamples[TotalEventCounter].particle_energy[iParticle] = energy; - TutorialPlottingSamples[TotalEventCounter].particle_beamangle[iParticle] = angle; - TutorialPlottingSamples[TotalEventCounter].particle_pdg[iParticle] = pdg; + + if(isATM) { + TutorialSamples[TotalEventCounter].TrueCosZenith = trueCZ; } + + FillParticles(TotalEventCounter, nParticles, PDGLep, ELep, gen); + // ========================================== + TotalEventCounter++; } - // ========================================== - TotalEventCounter++; + _sampleFile->Close(); + delete _sampleFile; } - _sampleFile->Close(); - delete _sampleFile; MACH3LOG_INFO("Initialised channel: {}/{}", iChannel, GetNOscChannels(static_cast(iSample))); } } return nEntries; } -double SampleHandlerTutorial::ReturnKinematicParameter(KinematicTypes KinPar, int iEvent) { - const double* paramPointer = GetPointerToKinematicParameter(KinPar, iEvent); - return *paramPointer; +// ************************************************ +void SampleHandlerTutorial::FillParticles(int eventIndex, int nParticles, int PDGLep, double ELep, std::mt19937& gen) { +// ************************************************ + std::uniform_int_distribution<> unif(0,3); + std::normal_distribution<> mu_angle(0,M_PI/8); + std::normal_distribution<> pi_angle(0,M_PI/2); + std::uniform_real_distribution<> nucl_angle(-M_PI,M_PI); + std::exponential_distribution<> pi_energy(1./0.5); + std::exponential_distribution<> nucl_energy(1./2); + + // === JM loop through particles in event === + for (int iParticle = 0; iParticle < nParticles; ++iParticle) { + //JM: No particle-level data in sample, so fake it + if (iParticle==0) { + TutorialPlottingSamples[eventIndex].particle_pdg[iParticle] = PDGLep; + TutorialPlottingSamples[eventIndex].particle_energy[iParticle] = ELep; + TutorialPlottingSamples[eventIndex].particle_beamangle[iParticle] = mu_angle(gen); + } + else { + int particle_seed = unif(gen); + double angle, energy; + int pdg; + switch (particle_seed) { + case 0: + pdg = 211; + energy = pi_energy(gen); + angle = pi_angle(gen); + while (angle>M_PI || angle<-M_PI) angle = pi_angle(gen); + break; + case 1: + pdg = -211; + energy = pi_energy(gen); + angle = pi_angle(gen); + while (angle>M_PI || angle<-M_PI) angle = pi_angle(gen); + break; + case 2: + pdg = 2212; + energy = nucl_energy(gen); + angle = nucl_angle(gen); + break; + case 3: + pdg = 2112; + energy = nucl_energy(gen); + angle = nucl_angle(gen); + break; + default: + break; + } + TutorialPlottingSamples[eventIndex].particle_energy[iParticle] = energy; + TutorialPlottingSamples[eventIndex].particle_beamangle[iParticle] = angle; + TutorialPlottingSamples[eventIndex].particle_pdg[iParticle] = pdg; + } + } } -double SampleHandlerTutorial::ReturnKinematicParameter(int KinematicVariable, int iEvent) { - KinematicTypes KinPar = static_cast(std::round(KinematicVariable)); - return ReturnKinematicParameter(KinPar, iEvent); +double SampleHandlerTutorial::ReturnKinematicParameter(const int KinematicVariable, const int iEvent) const { + const double* paramPointer = GetPointerToKinematicParameter(KinematicVariable, iEvent); + return *paramPointer; } // === JM Define ReturnKinematicVector functions === -std::vector SampleHandlerTutorial::ReturnKinematicVector(KinematicParticleVecs KinVec, int iEvent) { - switch (KinVec) { +std::vector SampleHandlerTutorial::ReturnKinematicVector(const int KinematicVector, const int iEvent) const { + switch (KinematicVector) { case kParticleEnergy: return TutorialPlottingSamples[iEvent].particle_energy; case kParticlePDG: @@ -315,19 +323,14 @@ std::vector SampleHandlerTutorial::ReturnKinematicVector(KinematicPartic case kParticleBeamAngle: return TutorialPlottingSamples[iEvent].particle_beamangle; default: - MACH3LOG_ERROR("Unrecognized Kinematic Vector: {}", static_cast(KinVec)); + MACH3LOG_ERROR("Unrecognized Kinematic Vector: {}", KinematicVector); throw MaCh3Exception(__FILE__, __LINE__); } } -std::vector SampleHandlerTutorial::ReturnKinematicVector(int KinematicVector, int iEvent) { - KinematicParticleVecs KinVec = static_cast(std::round(KinematicVector)); - return ReturnKinematicVector(KinVec, iEvent); -} - // ================================================= -const double* SampleHandlerTutorial::GetPointerToKinematicParameter(KinematicTypes KinPar, int iEvent) { +const double* SampleHandlerTutorial::GetPointerToKinematicParameter(const int KinPar, const int iEvent) const { switch (KinPar) { case kTrueNeutrinoEnergy: return &TutorialSamples[iEvent].TrueEnu; @@ -340,22 +343,17 @@ const double* SampleHandlerTutorial::GetPointerToKinematicParameter(KinematicTyp return &TutorialSamples[iEvent].Mode; case kOscChannel: return GetPointerToOscChannel(iEvent); + case kTarget: + return &TutorialSamples[iEvent].Target; default: - MACH3LOG_ERROR("Unrecognized Kinematic Parameter type: {}", static_cast(KinPar)); + MACH3LOG_ERROR("Unrecognized Kinematic Parameter type: {}", KinPar); throw MaCh3Exception(__FILE__, __LINE__); } } -const double* SampleHandlerTutorial::GetPointerToKinematicParameter(double KinematicVariable, int iEvent) { - KinematicTypes KinPar = static_cast(std::round(KinematicVariable)); - return GetPointerToKinematicParameter(KinPar, iEvent); -} - void SampleHandlerTutorial::SetupMC() { for(unsigned int iEvent = 0 ;iEvent < GetNEvents(); ++iEvent) { MCEvents[iEvent].enu_true = TutorialSamples[iEvent].TrueEnu; - MCEvents[iEvent].mode = static_cast(TutorialSamples[iEvent].Mode); - MCEvents[iEvent].Target = TutorialSamples[iEvent].Target; MCEvents[iEvent].isNC = TutorialSamples[iEvent].isNC; MCEvents[iEvent].nupdgUnosc = TutorialSamples[iEvent].nutype; MCEvents[iEvent].nupdg = TutorialSamples[iEvent].oscnutype; diff --git a/SamplesTutorial/SampleHandlerTutorial.h b/SamplesTutorial/SampleHandlerTutorial.h index f324d989..87acbc2a 100755 --- a/SamplesTutorial/SampleHandlerTutorial.h +++ b/SamplesTutorial/SampleHandlerTutorial.h @@ -3,6 +3,7 @@ #include "Samples/SampleHandlerBase.h" #include "StructsTutorial.h" #include "SplinesTutorial/BinnedSplinesTutorial.h" +#include class SampleHandlerTutorial : public SampleHandlerBase { @@ -11,37 +12,35 @@ class SampleHandlerTutorial : public SampleHandlerBase const std::shared_ptr& Oscillator_ = nullptr); virtual ~SampleHandlerTutorial(); - enum KinematicTypes {kTrueNeutrinoEnergy, kTrueQ2, kM3Mode, kRecoNeutrinoEnergy, kOscChannel}; + enum KinematicTypes {kTrueNeutrinoEnergy, kTrueQ2, kM3Mode, kTarget, kRecoNeutrinoEnergy, kOscChannel}; // === JM enum for particle-level parameters === enum KinematicParticleVecs {kParticleEnergy, kParticlePDG, kParticleBeamAngle}; // ============================================= - protected: + private: void Init() override; ///@brief Setup our spline file, this calls InitialseSplineObject() under the hood - void SetupSplines() override final; + void SetupSplines() final; - void AddAdditionalWeightPointers() override final; + void AddAdditionalWeightPointers() final; - int SetupExperimentMC() override final; + int SetupExperimentMC() final; - void CleanMemoryBeforeFit() override final; + void CleanMemoryBeforeFit() final; - double ReturnKinematicParameter(KinematicTypes KinPar, int iEvent); - double ReturnKinematicParameter(int KinematicVariable, int iEvent) override final; + double ReturnKinematicParameter(const int KinematicVariable, const int iEvent) const final; // === JM ReturnKinematicVector declarations for particle-level parameters === - std::vector ReturnKinematicVector(KinematicParticleVecs KinVec, int iEvent); - std::vector ReturnKinematicVector(int KinematicVector, int iEvent) override final; + void FillParticles(int eventIndex, int nParticles, int PDGLep, double ELep, std::mt19937& gen); + std::vector ReturnKinematicVector(const int KinematicVector, const int iEvent) const final; // =========================================================================== - const double* GetPointerToKinematicParameter(KinematicTypes KinPar, int iEvent); - const double* GetPointerToKinematicParameter(double KinematicVariable, int iEvent) override final; + const double* GetPointerToKinematicParameter(const int KinematicVariable, const int iEvent) const final; - void SetupMC() override final; - void CalcWeightFunc(int iEvent) override final {return; (void)iEvent;} + void SetupMC() final; + void CalcWeightFunc(const int iEvent) final {return; (void)iEvent;} std::vector TutorialSamples; std::vector TutorialPlottingSamples; @@ -50,6 +49,7 @@ class SampleHandlerTutorial : public SampleHandlerBase {"TrueNeutrinoEnergy", kTrueNeutrinoEnergy}, {"TrueQ2", kTrueQ2}, {"Mode", kM3Mode}, + {"Target", kTarget}, {"RecoNeutrinoEnergy", kRecoNeutrinoEnergy}, {"OscillationChannel", kOscChannel}, }; @@ -57,7 +57,8 @@ class SampleHandlerTutorial : public SampleHandlerBase const std::unordered_map ReversedKinematicParametersTutorial = { {kTrueNeutrinoEnergy, "TrueNeutrinoEnergy"}, {kTrueQ2, "TrueQ2"}, - {kM3Mode,"Mode"}, + {kM3Mode, "Mode"}, + {kTarget, "Target"}, {kRecoNeutrinoEnergy, "RecoNeutrinoEnergy"}, {kOscChannel, "OscillationChannel"}, }; @@ -81,8 +82,8 @@ class SampleHandlerTutorial : public SampleHandlerBase // === HH: Functional parameters === enum FuncParEnum {kDebugNothing, kDebugShift, kEResLep, kEResTot}; - void RegisterFunctionalParameters() override final; - void ResetShifts(const int iEvent) override final; + void RegisterFunctionalParameters() final; + void ResetShifts(const int iEvent) final; void DebugShift(const M3::float_t* par, std::size_t iEvent); void EResLep(const M3::float_t* par, std::size_t iEvent); diff --git a/SamplesTutorial/StructsTutorial.h b/SamplesTutorial/StructsTutorial.h index 7df8622a..9bc720ff 100755 --- a/SamplesTutorial/StructsTutorial.h +++ b/SamplesTutorial/StructsTutorial.h @@ -13,9 +13,9 @@ struct TutorialMCInfo { /// type of neutrino int oscnutype = M3::_BAD_INT_; /// target material - int Target = M3::_BAD_INT_; - /// target material int Sample = M3::_BAD_INT_; + /// target material + double Target = M3::_BAD_INT_; /// interaction mode double Mode = M3::_BAD_DOUBLE_; /// is Neutral Current or not diff --git a/Tutorial/KinemDistributionTutorial.cpp b/Tutorial/KinemDistributionTutorial.cpp index 166817e4..d02da8c3 100755 --- a/Tutorial/KinemDistributionTutorial.cpp +++ b/Tutorial/KinemDistributionTutorial.cpp @@ -77,8 +77,7 @@ int main(int argc, char **argv) { MACH3LOG_INFO("Number of samples: {}", mySamples[iPDF]->GetNSamples()); for(int iSample = 0; iSample < mySamples[iPDF]->GetNSamples(); iSample++){ auto Stack = mySamples[iPDF]->ReturnStackedHistBySelection1D(iSample, vecParams[iParam], Selection); - TLegend* Legend = mySamples[iPDF]->ReturnStackHistLegend(); - + std::unique_ptr Legend(new TLegend(*mySamples[iPDF]->ReturnStackHistLegend())); Canv->cd(1); Stack->Draw("HIST"); //Due to crappy TStack design, you need to draw THStack first then assign axis titles diff --git a/TutorialConfigs/Samples/SampleHandler_Tutorial.yaml b/TutorialConfigs/Samples/SampleHandler_Tutorial.yaml index 094fb251..abb67399 100755 --- a/TutorialConfigs/Samples/SampleHandler_Tutorial.yaml +++ b/TutorialConfigs/Samples/SampleHandler_Tutorial.yaml @@ -36,40 +36,40 @@ Tutorial_Beam: splineprefix: "TutorialConfigs/MC/BinnedSplinesTutorialInputs" splinesuffix: "2D.root" - SubSamples: + OscChannels: - Name: "numu-x-numu" LatexName: "#nu_{#mu} #rightarrow #nu_{#mu}" - mtuplefile: "numu_x_numu" + mtuplefile: ["numu_x_numu"] splinefile: "" nutype: 14 oscnutype: 14 - Name: "nue-x-nue" LatexName: "#nu_{e} #rightarrow #nu_{e}" - mtuplefile: "nue_x_nue" + mtuplefile: ["nue_x_nue"] splinefile: "" nutype: 12 oscnutype: 12 - Name: "numubar-x-numubar" LatexName: "#bar{#nu}_{#mu} #rightarrow #bar{#nu}_{#mu}" - mtuplefile: "numubar_x_numubar" + mtuplefile: ["numubar_x_numubar"] splinefile: "" nutype: -14 oscnutype: -14 - Name: "nuebar-x-nuebar" LatexName: "#bar{#nu}_{e} #rightarrow #bar{#nu}_{e}" - mtuplefile: "nuebar_x_nuebar" + mtuplefile: ["nuebar_x_nuebar"] splinefile: "" nutype: -12 oscnutype: -12 - Name: "numu-x-nue" LatexName: "#nu_{#mu} #rightarrow #nu_{e}" - mtuplefile: "numu_x_nue" + mtuplefile: ["numu_x_nue"] splinefile: "" nutype: 14 oscnutype: 12 - Name: "numubar-x-nuebar" LatexName: "#bar{#nu}_{#mu} #rightarrow #bar{#nu}_{e}" - mtuplefile: "numubar_x_nuebar" + mtuplefile: ["numubar_x_nuebar"] splinefile: "" nutype: -14 oscnutype: -12 diff --git a/TutorialConfigs/Samples/SampleHandler_Tutorial_ATM.yaml b/TutorialConfigs/Samples/SampleHandler_Tutorial_ATM.yaml index 9df9c0ef..fc4a3061 100755 --- a/TutorialConfigs/Samples/SampleHandler_Tutorial_ATM.yaml +++ b/TutorialConfigs/Samples/SampleHandler_Tutorial_ATM.yaml @@ -38,52 +38,52 @@ Tutorial_ATM: splineprefix: "TutorialConfigs/MC/BinnedSplinesTutorialInputs" splinesuffix: "2D.root" - SubSamples: + OscChannels: - Name: "numu-x-numu" LatexName: "#nu_{#mu} #rightarrow #nu_{#mu}" - mtuplefile: "numu_x_numu" + mtuplefile: ["numu_x_numu"] splinefile: "" nutype: 14 oscnutype: 14 - Name: "nue-x-nue" LatexName: "#nu_{e} #rightarrow #nu_{e}" - mtuplefile: "nue_x_nue" + mtuplefile: ["nue_x_nue"] splinefile: "" nutype: 12 oscnutype: 12 - Name: "numub-x-numub" LatexName: "#bar{#nu}_{#mu} #rightarrow #bar{#nu}_{#mu}" - mtuplefile: "numubar_x_numubar" + mtuplefile: ["numubar_x_numubar"] splinefile: "" nutype: -14 oscnutype: -14 - Name: "nueb-x-nueb" LatexName: "#bar{#nu}_{e} #rightarrow #bar{#nu}_{e}" - mtuplefile: "nuebar_x_nuebar" + mtuplefile: ["nuebar_x_nuebar"] splinefile: "" nutype: -12 oscnutype: -12 - Name: "numu-x-nue" LatexName: "#nu_{#mu} #rightarrow #nu_{e}" - mtuplefile: "numu_x_nue" + mtuplefile: ["numu_x_nue"] splinefile: "" nutype: 14 oscnutype: 12 - Name: "numub-x-nueb" LatexName: "#bar{#nu}_{#mu} #rightarrow #bar{#nu}_{e}" - mtuplefile: "numubar_x_nuebar" + mtuplefile: ["numubar_x_nuebar"] splinefile: "" nutype: -14 oscnutype: -12 - Name: "nue-x-numu" LatexName: "#nu_{e} #rightarrow #nu_{#mu}" - mtuplefile: "nue_x_numu" + mtuplefile: ["nue_x_numu"] splinefile: "" nutype: 12 oscnutype: 14 - Name: "nueb-x-numub" LatexName: "#bar{#nu}_{e} #rightarrow #bar{#nu}_{#mu}" - mtuplefile: "nuebar_x_numubar" + mtuplefile: ["nuebar_x_numubar"] splinefile: "" nutype: -12 oscnutype: -14 diff --git a/TutorialConfigs/Samples/SampleHandler_Tutorial_ND.yaml b/TutorialConfigs/Samples/SampleHandler_Tutorial_ND.yaml index 5b3e6552..1d1f5147 100755 --- a/TutorialConfigs/Samples/SampleHandler_Tutorial_ND.yaml +++ b/TutorialConfigs/Samples/SampleHandler_Tutorial_ND.yaml @@ -32,13 +32,11 @@ ND_CC0pi: splineprefix: "TutorialConfigs/MC/BinnedSplinesTutorialInputs" splinesuffix: "2D.root" - SubSamples: + OscChannels: - Name: "FHC_numu_x_numu" LatexName: "#nu_{#mu} #rightarrow #nu_{#mu}" - mtuplefile: "" + mtuplefile: [""] splinefile: "" - nutype: 14 - oscnutype: 14 ND_CC1pip: SampleTitle: "ND_CC1pip" @@ -56,13 +54,11 @@ ND_CC1pip: splineprefix: "TutorialConfigs/MC/BinnedSplinesTutorialInputs" splinesuffix: "2D.root" - SubSamples: + OscChannels: - Name: "FHC_numu_x_numu" LatexName: "#nu_{#mu} #rightarrow #nu_{#mu}" - mtuplefile: "" + mtuplefile: [""] splinefile: "" - nutype: 14 - oscnutype: 14 ND_CCPi0: SampleTitle: "ND_CCPi0" @@ -80,13 +76,11 @@ ND_CCPi0: splineprefix: "TutorialConfigs/MC/BinnedSplinesTutorialInputs" splinesuffix: "2D.root" - SubSamples: + OscChannels: - Name: "FHC_numu_x_numu" LatexName: "#nu_{#mu} #rightarrow #nu_{#mu}" - mtuplefile: "" + mtuplefile: [""] splinefile: "" - nutype: 14 - oscnutype: 14 ND_NC0pi: SampleTitle: "ND_NC0pi" @@ -104,13 +98,11 @@ ND_NC0pi: splineprefix: "TutorialConfigs/MC/BinnedSplinesTutorialInputs" splinesuffix: "2D.root" - SubSamples: + OscChannels: - Name: "FHC_numu_x_numu" LatexName: "#nu_{#mu} #rightarrow #nu_{#mu}" - mtuplefile: "" + mtuplefile: [""] splinefile: "" - nutype: 14 - oscnutype: 14 ND_NC1pi0: SampleTitle: "ND_NC1pi0" @@ -127,10 +119,8 @@ ND_NC1pi0: splineprefix: "TutorialConfigs/MC/BinnedSplinesTutorialInputs" splinesuffix: "2D.root" - SubSamples: + OscChannels: - Name: "numu_x_numu" LatexName: "#nu_{#mu} #rightarrow #nu_{#mu}" - mtuplefile: "" + mtuplefile: [""] splinefile: "" - nutype: 14 - oscnutype: 14