From 8fdc4fc388570cc212966921d41912cde717727b Mon Sep 17 00:00:00 2001 From: Steven Doran <78985334+S81D@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:07:59 -0600 Subject: [PATCH 1/3] Add BRF / beam jitter to the MC Include additional jitter / uncertainty observed in the data to correctly model the BNB spill structure --- .../AssignBunchTimingMC.cpp | 30 ++++++++++++++++--- .../AssignBunchTimingMC/AssignBunchTimingMC.h | 3 ++ UserTools/AssignBunchTimingMC/README.md | 17 ++++++----- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.cpp b/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.cpp index c34aa7b75..002291ee2 100644 --- a/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.cpp +++ b/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.cpp @@ -15,6 +15,7 @@ bool AssignBunchTimingMC::Initialise(std::string configfile, DataModel &data){ bool got_width = m_variables.Get("bunchwidth", fbunchwidth); bool got_interval = m_variables.Get("bunchinterval", fbunchinterval); bool got_count = m_variables.Get("bunchcount", fbunchcount); + bool got_BRF = m_variables.Get("BRFfituncertainty", fBRF); bool got_sample = m_variables.Get("sampletype", fsample); bool got_trigger = m_variables.Get("prompttriggertime", ftriggertime); bool got_waveform = m_variables.Get("PMTWaveformSim", fPMTWaveformSim); @@ -49,6 +50,15 @@ bool AssignBunchTimingMC::Initialise(std::string configfile, DataModel &data){ Log(logmessage, v_warning, verbosity); } + // Uncertainty due to beam signals / electronic jitter in our system + // see https://annie-docdb.fnal.gov/cgi-bin/sso/ShowDocument?docid=6489 for more information + if (!got_BRF) { + fBRF = 0; + logmessage = ("Warning (AssignBunchTimingMC): \"BRFfituncertainty\" not " + "set in the config file. Using default: 0ns (no uncertainty will be included for this)"); + Log(logmessage, v_warning, verbosity); + } + if (!got_sample) { fsample = 0; // assume they are using the Tank samples logmessage = ("Warning (AssignBunchTimingMC): \"sampletype\" not " @@ -78,6 +88,7 @@ bool AssignBunchTimingMC::Initialise(std::string configfile, DataModel &data){ std::cout<<"bunch width = "< distribution(0, fbunchwidth); jitter = distribution(generator); + // assign beam jitter (BRF uncertainty) + std::normal_distribution BRF_distribution(0, fBRF); + BRF_jitter = BRF_distribution(generator); + if (verbosity >= v_message) { - std::string logmessage = "AssignBunchTimingMC: bunchNumber = " + std::to_string(bunchNumber) + " | t0 = " + std::to_string(new_nu_time); - Log(logmessage, v_debug, verbosity); + std::ostringstream logmessage; + logmessage << "AssignBunchTimingMC: bunchNumber = " << bunchNumber + << " | t0 = " << new_nu_time + << " | sampled intrinsic bunch jitter = " << jitter << " ns" + << " | sampled BRF jitter = " << BRF_jitter << " ns"; + Log(logmessage.str(), v_debug, verbosity); } } @@ -292,8 +314,8 @@ void AssignBunchTimingMC::CalculateClusterAndBunchTimesPMTWaveformSim(std::vecto Log(logmessage, v_debug, verbosity); } - // calculate BunchTime - bunchTime = fbunchinterval * bunchNumber + clusterTime + jitter + new_nu_time ; + // calculate BunchTime (add the two gaussian contributions independently) + bunchTime = fbunchinterval * bunchNumber + clusterTime + jitter + BRF_jitter + new_nu_time ; if (verbosity >= v_debug) { std::string logmessage = "AssignBunchTimingMC: bunchTime = " + std::to_string(bunchTime); Log(logmessage, v_debug, verbosity); diff --git a/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.h b/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.h index 5058923a5..3c5b39e07 100644 --- a/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.h +++ b/UserTools/AssignBunchTimingMC/AssignBunchTimingMC.h @@ -46,13 +46,16 @@ class AssignBunchTimingMC: public Tool { double fbunchwidth; ///< BNB intrinsic bunch width in ns double fbunchinterval; ///< BNB bunch spacing in ns int fbunchcount; ///< number of BNB bunches per spill + double fBRF; ///< BRF fit uncertainty extracted from the data (due to any additional electronic jitter unaccounted for) int fsample; ///< GENIE Tank or WORLD samples int ftriggertime; ///< whether the samples used the default WCSim prompt trigger = 0 (when particles enter the volume), or the adjusted prompt trigger based on the start of the beam dump bool fPMTWaveformSim; ///< whether to use the PMTWaveform data-like hits or the defaul MCHits + double new_nu_time; ///< offset needed to make the cluster times beam realistic int bunchNumber; ///< randomly assigned bunch number double jitter; ///< random jitter based on the intrinsic bunch width + double BRF_jitter; ///< random jitter based on the beam timing + fit uncertainties double bunchTime; ///< individual bunch time assigned for a specific cluster /// \brief verbosity levels: if 'verbosity' < this level, the message type will be logged. diff --git a/UserTools/AssignBunchTimingMC/README.md b/UserTools/AssignBunchTimingMC/README.md index f4f84943a..951b27023 100644 --- a/UserTools/AssignBunchTimingMC/README.md +++ b/UserTools/AssignBunchTimingMC/README.md @@ -15,16 +15,17 @@ verbosity 0 -PMTWaveformSim 1 # Whether we're using the data-like hits output from PMTWaveformSim - # BNB properties taken from: MicroBooNE https://doi.org/10.1103/PhysRevD.108.052010 -bunchwidth 1.308 # BNB instrinic bunch spread [ns] -bunchinterval 18.936 # BNB bunch spacings [ns] -bunchcount 81 # number of BNB bunches per spill +bunchwidth 1.308 # BNB instrinic bunch spread [ns] +bunchinterval 18.936 # BNB bunch spacings [ns] +bunchcount 81 # number of BNB bunches per spill + +# Uncertainty extracted from Data / MC comparisons, see here: https://annie-docdb.fnal.gov/cgi-bin/sso/ShowDocument?docid=6489 +BRFfituncertainty 1.809 # jitter in our beam signals / BRF fitting uncertainty [ns] -sampletype 1 # Tank (0) or World (1) genie samples you are running over -prompttriggertime 1 # WCSim prompt trigger settings: (0 = default, t0 = 0 when a particle enters the volume) - # (1 = modified, t0 = 0 when the neutrino beam dump begins) +sampletype 0 # Tank (0) or World (1) genie samples you are running over +prompttriggertime 1 # WCSim prompt trigger settings: (0 = default, t0 = 0 when a particle enters the volume) + # (1 = modified, t0 = 0 when the neutrino beam dump begins) ``` From 24a5d2b15ad91531e2e7b9b1fe5f646202ea87fd Mon Sep 17 00:00:00 2001 From: Steven Doran <78985334+S81D@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:34:05 -0600 Subject: [PATCH 2/3] Update AssignBunchTimingMCConfig --- configfiles/BeamClusterAnalysisMC/AssignBunchTimingMCConfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configfiles/BeamClusterAnalysisMC/AssignBunchTimingMCConfig b/configfiles/BeamClusterAnalysisMC/AssignBunchTimingMCConfig index e868945b3..8bebe310a 100644 --- a/configfiles/BeamClusterAnalysisMC/AssignBunchTimingMCConfig +++ b/configfiles/BeamClusterAnalysisMC/AssignBunchTimingMCConfig @@ -7,6 +7,8 @@ bunchwidth 1.308 # BNB instrinic bunch spread [ns] bunchinterval 18.936 # BNB bunch spacings [ns] bunchcount 81 # number of BNB bunches per spill +BRFfituncertainty 1.809 # jitter in our beam signals / BRF fitting uncertainty [ns] + sampletype 0 # Tank (0) or World (1) genie samples you are running over prompttriggertime 1 # WCSim prompt trigger settings: (0 = default, t0 = 0 when a particle enters the volume) # (1 = modified, t0 = 0 when the neutrino beam dump begins) From cbb8cc6b3b7459f2d144dbef1df63d334fedf1d3 Mon Sep 17 00:00:00 2001 From: Steven Doran <78985334+S81D@users.noreply.github.com> Date: Mon, 1 Dec 2025 13:34:18 -0600 Subject: [PATCH 3/3] Update AssignBunchTimingMCConfig --- configfiles/CC_MC_RECO_ntuple/AssignBunchTimingMCConfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configfiles/CC_MC_RECO_ntuple/AssignBunchTimingMCConfig b/configfiles/CC_MC_RECO_ntuple/AssignBunchTimingMCConfig index e868945b3..3fd95b480 100644 --- a/configfiles/CC_MC_RECO_ntuple/AssignBunchTimingMCConfig +++ b/configfiles/CC_MC_RECO_ntuple/AssignBunchTimingMCConfig @@ -7,6 +7,8 @@ bunchwidth 1.308 # BNB instrinic bunch spread [ns] bunchinterval 18.936 # BNB bunch spacings [ns] bunchcount 81 # number of BNB bunches per spill +BRFfituncertainty 1.809 # jitter in our beam signals / BRF fitting uncertainty [ns] + sampletype 0 # Tank (0) or World (1) genie samples you are running over prompttriggertime 1 # WCSim prompt trigger settings: (0 = default, t0 = 0 when a particle enters the volume) # (1 = modified, t0 = 0 when the neutrino beam dump begins)