19 Spectrum spectrum2D(loader, independentAxis, quantileAxis, cut, shift, wei);
21 return spectrum2D.
ToTH2(spectrum2D.
POT());
33 const unsigned int& numQuantiles,
37 std::cout <<
"Error: GetQuantileBins() not equipped for multi-dimensional axes." <<
std::endl;
50 std::vector<std::vector<double>> xBinQuantilesVec;
57 TH1* hTempProj = quantileHist->ProjectionY(Form(
"quantileHistProjYBin%d",
bin),
bin,
bin);
58 hTempProj->Scale( (
double)1 / (
double)hTempProj->Integral());
59 double probs[numQuantiles];
60 double q[numQuantiles];
61 for(
unsigned int i = 0;
i<numQuantiles;
i++){
62 probs[
i] = (
i+1) * ((
double)1)/ ((
double)numQuantiles);
65 hTempProj->GetQuantiles(numQuantiles, q, probs);
67 std::vector< double > quantilesVec(numQuantiles+1);
68 quantilesVec[0] = quantileHist->GetYaxis()->GetBinLowEdge(1);
69 for(
unsigned int i = 0;
i<numQuantiles;
i++){
70 quantilesVec[
i+1] = q[
i];
73 xBinQuantilesVec.push_back(quantilesVec);
74 if(hTempProj)
delete hTempProj;
79 for(
unsigned int bin=0;
bin<xBinQuantilesVec.size();
bin++){
80 std::cout <<
"independentAxis bin: " << std::setw(4) <<
bin <<
" " 81 <<
"lowEdge: " << std::setw(10) << quantileHist->GetXaxis()->GetBinLowEdge(
bin) <<
" " 82 <<
"centre: " << std::setw(10) << quantileHist->GetXaxis()->GetBinCenter(
bin) <<
" " 83 <<
"quantile bin edges:";
84 for(
unsigned int edge=0;edge<xBinQuantilesVec[
bin].size();edge++)
std::cout <<
" " << std::setw(10) << xBinQuantilesVec[
bin][edge];
89 return xBinQuantilesVec;
101 const unsigned int& numQuantiles,
107 TH2* quantileHist =
MakeQuantileHistogram(loader, independentAxis, quantileAxis, cut, spillCut, shift, wei);
109 std::vector<std::vector<double>> xBinQuantilesVec =
GetQuantileBins(quantileHist, independentAxis, quantileAxis, numQuantiles, verbose);
112 if(quantileHist)
delete quantileHist;
114 return xBinQuantilesVec;
126 const std::vector<std::vector<double>>& quantileBins):
127 fIndependentAxis(independentAxis), fQuantileAxis(quantileAxis), fQuantile(quantile), fQuantileBins(quantileBins)
131 std::cout <<
"Error: QuantileCutGenerator not equipped for multi-dimensional axes." <<
std::endl;
135 assert(
fQuantileBins.size() > 0 &&
"fQuantileBins must have more than 0 bins in the independent variable");
149 assert(
fQuantile > 0 &&
fQuantile < thisQuantilesBins.size() &&
"fQuantile <= 0 || fQuantile >= thisQuantilesBins.size()");
150 double lowEdge=thisQuantilesBins[
fQuantile-1];
151 double highEdge=thisQuantilesBins[
fQuantile];
152 return varY >= lowEdge && varY < highEdge;
164 std::cout <<
"Error: QuantileCut() not equipped for multi-dimensional axes." <<
std::endl;
168 assert((quantileBins.size() > 0) &&
"quantileBins.size() must be > 0");
169 unsigned int numQuantiles = quantileBins[0].size();
170 assert((quantile > 0 && quantile <= numQuantiles) &&
"quantile must be > 0 and <= number of quantiles");
182 const unsigned int& numQuantiles,
188 std::vector<std::vector<double>> quantileBins =
GetQuantileBins(loader, independentAxis, quantileAxis, cut, numQuantiles, spillCut, shift, wei, verbose);
190 std::vector<Cut> cutVec;
201 const unsigned int& numQuantiles,
204 std::vector<std::vector<double>> quantileBins =
GetQuantileBins(quantileHist, independentAxis, quantileAxis, numQuantiles, verbose);
206 std::vector<Cut> cutVec;
216 const unsigned int& numQuantiles,
220 std::vector<std::vector<double>> quantileBins =
GetQuantileBins(quantileHist, independentAxis, quantileAxis, numQuantiles, verbose);
222 std::vector<Cut> cutVec;
226 if (cutVec.size()==4 && rhc){
227 cutVec[0] = cutVec[0] &&
k2018PIDs(0.47, 0.40, 0.80);
228 cutVec[1] = cutVec[1] &&
k2018PIDs(0.48, 0.40, 0.65);
229 cutVec[2] = cutVec[2] &&
k2018PIDs(0.56, 0.40, 0.60);
230 cutVec[3] = cutVec[3] &&
k2018PIDs(0.59, 0.65, 0.50);
232 else if (cutVec.size()==4 && !rhc){
233 cutVec[0] = cutVec[0] &&
k2018PIDs(0.56, 0.60, 0.55);
234 cutVec[1] = cutVec[1] &&
k2018PIDs(0.56, 0.60, 0.55);
235 cutVec[2] = cutVec[2] &&
k2018PIDs(0.58, 0.60, 0.55);
236 cutVec[3] = cutVec[3] &&
k2018PIDs(0.59, 0.60, 0.55);
238 else for(
unsigned int quant=0;quant<numQuantiles;quant++) cutVec[quant] = cutVec[quant] &&
k2018PIDs();
TH2 * ToTH2(double exposure, EExposureType expotype=kPOT, EBinType bintype=kBinContent) const
Spectrum must be 2D to obtain TH2.
Represent the binning of a Spectrum's x-axis.
Cuts and Vars for the 2020 FD DiF Study.
const std::vector< T > & GetVars() const
Simple record of shifts applied to systematic parameters.
const Cut QuantileCut(const std::vector< std::vector< double >> &quantileBins, const HistAxis &independentAxis, const HistAxis &quantileAxis, const unsigned int &quantile)
Returns a Cut that will only pass events falling into a particular quantile of quantileAxis, where quantiles have been calculated for each independentAxis bin Quantiles have been precalculated in 'quantileBins' (number of quantiles, bin edges etc.)
Proxy for caf::StandardRecord.
std::vector< std::vector< double > > GetQuantileBins(TH2 *quantileHist, const HistAxis &independentAxis, const HistAxis &quantileAxis, const unsigned int &numQuantiles, const bool verbose)
Returns a 2D vector First index is the independentAxis bin number Second index is the high bin edge f...
std::vector< Cut > QuantileCuts(SpectrumLoader &loader, const HistAxis &independentAxis, const HistAxis &quantileAxis, const Cut &cut, const unsigned int &numQuantiles, const SpillCut &spillCut, const SystShifts &shift, const Var &wei, const bool verbose)
Returns a vector of Cuts, each one for a different quantile An individual cut will only pass events f...
void SetSpillCut(const SpillCut &cut)
Representation of a spectrum in any variable, with associated POT.
Cut k2018PIDs(double bdtCut, double remidCut, double cvnCut)
std::vector< std::vector< double > > fQuantileBins
_Cut< caf::SRProxy > Cut
Representation of a cut (selection) to be applied to a caf::StandardRecord object.
virtual void Go() override
Load all the registered spectra.
unsigned int quantile(std::vector< std::vector< double >> v, float E, float hadEfrac)
TH2 * MakeQuantileHistogram(SpectrumLoader &loader, const HistAxis &independentAxis, const HistAxis &quantileAxis, const Cut &cut, const SpillCut &spillCut, const SystShifts &shift, const Var &wei)
Returns a TH2D with xAxis as independentAxis and yAxis as quantileAxis Quantiles in yAxis can be calc...
const std::vector< Binning > & GetBinnings() const
HistAxis fIndependentAxis
unsigned int NDimensions() const
bool operator()(const caf::SRProxy *sr) const
Defines the Cut this Instance generates. Returns true if the slice is in the quantile set in quantile...
std::vector< Cut > QuantileAndPIDCutsFromTH2(TH2 *quantileHist, const HistAxis &independentAxis, const HistAxis &quantileAxis, const unsigned int &numQuantiles, const bool rhc, const bool verbose)
Collect information describing the x-axis of an analysis histogram.
Collaborates with Spectrum and OscillatableSpectrum to fill spectra from CAF files.
std::vector< Cut > QuantileCutsFromTH2(TH2 *quantileHist, const HistAxis &independentAxis, const HistAxis &quantileAxis, const unsigned int &numQuantiles, const bool verbose)
: Do the same as the QuantileCuts function but taking in the TH2 instead of making it...
assert(nhit_max >=nhit_nbins)
QuantileCutGenerator(const HistAxis &independentAxis, const HistAxis &quantileAxis, const unsigned int &quantile, const std::vector< std::vector< double >> &quantileBins)
Class to Generate a Quantile ana::Cut that is specialised via the constructor arguments.
Template for Cut and SpillCut.
const std::vector< std::string > & GetLabels() const