MaCh3  2.6.0
Reference Guide
MR2T2.cpp
Go to the documentation of this file.
1 #include "Fitters/MR2T2.h"
2 
3 
4 // ***************
6 // ***************
7  AlgorithmName = "MR2T2";
8 }
9 
10 // *******************
11 void MR2T2::DoStep() {
12 // *******************
13  ProposeStep();
14  // Does the MCMC accept this step?
16 
18  {
19  AcceptStep();
20  }
21 }
22 
23 // *******************
24 // Do the initial reconfigure of the MCMC
26 // *******************
27  // Initial likelihood
28  out_of_bounds = false;
29 
30  double llh = 0.0;
31 
32  // Loop over the systematics and propose the initial step
33  for (size_t s = 0; s < systematics.size(); ++s)
34  {
35  // Could throw the initial value here to do MCMC stability studies
36  // Propose the steps for the systematics
37  systematics[s]->ProposeStep();
38 
39  // Get the likelihood from the systematics
40  syst_llh[s] = systematics[s]->GetLikelihood();
41  llh += syst_llh[s];
42 
43 #ifdef MACH3_DEBUG
44  if (debug)
45  debugFile << "LLH after " << systematics[s]->GetName() << " " << llh << std::endl;
46 #endif
47  }
48 
49  // if we're using the multicanonical method, we need to add the penalty to the
50  // likelihood now prior to the Large LLH check
51  if (multicanonical) {
52  // get the proposed value of delta_cp and apply the multicanonical pentalty,
53  // weighting it using the beta value to increase or decrease the strenght of
54  // the penalty
55 
56  double delta_cp_value = systematics[multicanonicalHandler->oscCovVar]->GetParProp(multicanonicalHandler->multicanonicalVar);
57  double delm23_value = systematics[multicanonicalHandler->oscCovVar]->GetParProp(multicanonicalHandler->multicanonicalVar_dm23);
58  double multicanonical_penalty = multicanonicalHandler->GetMulticanonicalWeight(delta_cp_value, delm23_value);
59 
60 #ifdef DEBUG
61  // Print the multicanonical penalty and the delta_cp and delm23 values to the debug file
62  if (debug) debugFile << " delta_cp: " << delta_cp_value << " delm23: " << delm23_value << " multicanonical_penalty: " << multicanonical_penalty << std::endl;
63 #endif
64 
65  llh += multicanonical_penalty;
66 
67  MACH3LOG_DEBUG("Delta CP value: {}", delta_cp_value);
68  MACH3LOG_DEBUG("Multicanonical penalty: {}", multicanonical_penalty);
69  MACH3LOG_DEBUG("LLH after multicanonical penalty: {}", llh);
70  }
71 
72  // Check if we've hit a boundary in the systematics
73  // In this case we can save time by not having to reconfigure the simulation
74  if (llh >= M3::_LARGE_LOGL_)
75  {
76  out_of_bounds = true;
77 #ifdef MACH3_DEBUG
78  if (debug)
79  debugFile << "Rejecting based on boundary" << std::endl;
80 #endif
81  }
82 
83  // Only reweight when we have a good parameter configuration
84  // This speeds things up considerably because for every bad parameter configuration we don't have to reweight the MC
85  if (!out_of_bounds)
86  {
87  // Could multi-thread this
88  // But since sample reweight is multi-threaded it's probably better to do that
89  for (size_t i = 0; i < samples.size(); ++i)
90  {
91  samples[i]->Reweight();
92  }
93 
94  // DB for atmospheric event by event sample migration, need to fully reweight all samples to allow event passing prior to likelihood evaluation
95  for (size_t i = 0; i < samples.size(); ++i)
96  {
97  // Get the sample likelihoods and add them
98  sample_llh[i] = samples[i]->GetLikelihood();
99  llh += sample_llh[i];
100 #ifdef MACH3_DEBUG
101  if (debug)
102  debugFile << "LLH after sample " << i << " " << llh << std::endl;
103 #endif
104  }
105 
106  // For when we don't have to reweight, set sample to madness
107  }
108  else
109  {
110  for (size_t i = 0; i < samples.size(); ++i)
111  {
112  // Set the sample_llh[i] to be madly high also to signify a step out of bounds
114 #ifdef MACH3_DEBUG
115  if (debug)
116  debugFile << "LLH after REJECT sample " << i << " " << llh << std::endl;
117 #endif
118  }
119  }
120  // Save the proposed likelihood (class member)
121  logLProp = llh;
122 }
123 
124 // **********************
125 // Do we accept the proposed step for all the parameters?
127 // **********************
128  // Set the acceptance probability to zero
129  double acc_prob = 0.0;
130 
131  // Calculate acceptance probability
132  if (anneal)
133  acc_prob = std::min(1., std::exp(-(logLProp - logLCurr) / (std::exp(-step / AnnealTemp))));
134  else
135  acc_prob = std::min(1., std::exp(logLCurr - logLProp));
136 
137  return acc_prob;
138 }
#define MACH3LOG_DEBUG
Definition: MaCh3Logger.h:34
double logLProp
proposed likelihood
Definition: FitterBase.h:120
unsigned int step
current state
Definition: FitterBase.h:116
double accProb
current acceptance prob
Definition: FitterBase.h:122
std::string AlgorithmName
Name of fitting algorithm that is being used.
Definition: FitterBase.h:173
std::vector< double > sample_llh
store the llh breakdowns
Definition: FitterBase.h:129
std::vector< SampleHandlerInterface * > samples
Sample holder.
Definition: FitterBase.h:134
double logLCurr
current likelihood
Definition: FitterBase.h:118
std::vector< double > syst_llh
systematic llh breakdowns
Definition: FitterBase.h:131
std::vector< ParameterHandlerBase * > systematics
Systematic holder.
Definition: FitterBase.h:139
Base class for MCMC fitting algorithms.
Definition: MCMCBase.h:8
std::unique_ptr< MulticanonicalMCMCHandler > multicanonicalHandler
multicanonical handler for umbrella sampling
Definition: MCMCBase.h:64
bool anneal
simulated annealing
Definition: MCMCBase.h:76
void AcceptStep()
Accept a step.
Definition: MCMCBase.cpp:252
double AnnealTemp
simulated annealing temperature
Definition: MCMCBase.h:78
bool out_of_bounds
Do we reject based on hitting boundaries in systs.
Definition: MCMCBase.h:67
bool IsStepAccepted(const double acc_prob)
Is step accepted?
Definition: MCMCBase.cpp:234
bool multicanonical
multi-canonical method toggle on/off
Definition: MCMCBase.h:81
MR2T2(Manager *const FitManager)
Constructor.
Definition: MR2T2.cpp:5
void ProposeStep() final
Propose a step.
Definition: MR2T2.cpp:25
double AcceptanceProbability() override
Step acceptance probability.
Definition: MR2T2.cpp:126
void DoStep() override
The MCMC step proposal and acceptance.
Definition: MR2T2.cpp:11
The manager class is responsible for managing configurations and settings.
Definition: Manager.h:16
constexpr static const double _LARGE_LOGL_
Large Likelihood is used it parameter go out of physical boundary, this indicates in MCMC that such s...
Definition: Core.h:80