 |
DAS
3.0
Das Analysis System
|
|
void | getHLTJetResponse (const vector< fs::path > &inputs, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
template<typename T = TH3D> |
std::unique_ptr< T > | makeRespHist (TString name, std::vector< double > pt_edges=DAS::JetEnergy::pt_JERC_edges, TString title=";p_{T}^{gen};|#eta^{rec}|;#frac{p_{T}^{rec}}{p_{T}^{gen}}") |
|
void | applyDataNormalisation (const vector< fs::path > &inputs, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
void | reset (Weights &wgts, const double v=0) |
|
float | GetNormFactor (const int steering, const vector< fs::path > &sumWgts, const float xsec) |
|
void | applyMClumi (const vector< fs::path > &inputs, const vector< fs::path > &sumWgts, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
void | applyNormFactor (const vector< fs::path > &inputs, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
void | getSumWeights (const vector< fs::path > &inputs, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
std::vector< DAS::RecJet >::iterator | phaseSel (std::vector< DAS::RecJet > &recjets) |
|
std::ostream & | operator<< (std::ostream &Stream, const TriggerLumi &tr_lu) |
|
void | loopOverDirs (TDirectory *dIn, TDirectory *dOut, const int steering, const DT::Slice slice) |
|
void | getHistoEfficiencyCurves (const fs::path &input, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
float | getPrescale (Trigger *trigger, size_t indx) |
|
void | getTriggerCurves (const vector< fs::path > &inputs, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
void | getTriggerEfficiencyEmulation (const vector< fs::path > &inputs, const fs::path &output, const pt::ptree &config, const int steering, const DT::Slice slice={1, 0}) |
|
void | getTriggerTurnons (const fs::path &input, const fs::path &outputRoot, const fs::path &outputTxt, const pt::ptree &config, const int steering) |
|
vector< double > | extractBinning (const unique_ptr< TH1 > &h3D, const TString &axis) |
|
unique_ptr< TH1F > | makeTriggerEffHist (const unique_ptr< TEfficiency > &t_eff, int iHLT, int iEta) |
|
DAS::FourVector | match (const DAS::FourVector &jet, const std::vector< DAS::FourVector > *hltJets) |
|
float | GetX (TF1 *f) |
|
template<typename STREAM > |
TF1 * | FitTriggerEfficiency (int trigger, TH1 *h, STREAM &Stream, int from, const char *options="NQERS") |
|
template<typename STREAM > |
float | GetTriggerEfficiency (int trigger, TH1 *h, STREAM &Stream, float from, float minEff) |
|
◆ anonymous enum
Enumerator |
---|
WEIGHT | use the weights
|
SIGN | use the sign
|
CUTOFF | apply a selection on the weight
|
◆ applyDataNormalisation()
void DAS::Normalisation::applyDataNormalisation |
( |
const vector< fs::path > & |
inputs, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Apply the the kinematic selection, ensuring that events in the dataset have fired a trigger and correcting the weight of the events with the associated trigger prescales, trigger efficiency, and total luminosity. The weight $\frac{ \text{Prescale} * \mathcal{L}^{-1} }{ \epsilon_\text{trigger} } $ is applied by event. The argument 'strategy' defines the selection criterion of the events and the calculation of the weight (see functor in applyDataNormalisation.h).
- Todo:
- add lumi unc variations
- Todo:
- revisit the logic (having inputs modified + a return object may be confusing)
- Todo:
- reimplement the logic to avoid a selection on the weight
- Parameters
-
inputs | input ROOT files (n-tuple) |
output | output ROOT file (n-tuple) |
config | config handled with `Darwin::Tools::Options` |
steering | parameters obtained from explicit options |
slice | number and index of slice |
51 cout << __func__ <<
' ' << slice <<
" start" << endl;
54 auto tIn = flow.GetInputTree(slice);
55 auto [fOut, tOut] = flow.GetOutput(output);
59 auto isMC = metainfo.Get<
bool>(
"flags",
"isMC");
61 BOOST_THROW_EXCEPTION(
DE::BadInput(
"Only real data may be used as input.", metainfo) );
64 auto recEvt = flow.GetBranchReadWrite<RecEvent>(
"recEvent");
65 auto trigger = flow.GetBranchReadOnly<Trigger>(
"jetTrigger");
68 auto recJets = flow.GetBranchReadOnly<vector<RecJet>>(
"recJets");
69 auto hltJets = flow.GetBranchReadOnly<vector<FourVector>>(
"hltJets");
71 int year = metainfo.Get<
int>(
"flags",
"year");
74 auto lumi_file =
config.get<fs::path>(
"corrections.normalisation.luminosities" ),
75 unc_file =
config.get<fs::path>(
"corrections.normalisation.uncertainties"),
76 turnon_file =
config.get<fs::path>(
"corrections.normalisation.turnons" ),
77 efficiencies =
config.get<fs::path>(
"corrections.normalisation.efficiencies" );
78 auto strategy =
config.get<
string>(
"corrections.normalisation.strategy"),
79 method =
config.get<
string>(
"corrections.normalisation.method" );
80 Functor normalisation(lumi_file, turnon_file, efficiencies, strategy,
method,
year);
81 LumiUnc lumi_unc(unc_file,
year);
84 bool applySyst = steering &
DT::syst;
86 for (
string source: lumi_unc.sources)
87 metainfo.Set<
string>(
"variations", RecEvent::WeightVar,
source);
91 ControlPlots corrNoTrigEff(
"corrNoTrigEff");
93 vector<ControlPlots> corr { ControlPlots(
"nominal") };
94 TList * ev_wgts = metainfo.List(
"variations", RecEvent::WeightVar);
95 for (TObject * obj: *ev_wgts) {
96 auto name =
dynamic_cast<TObjString*
>(obj)->GetString();
97 corr.push_back(ControlPlots(
name));
102 for (
DT::Looper looper(tIn); looper(); ++looper) {
109 if (recJets->size() == 0)
continue;
111 RecJet leadingJet = normalisation(*recEvt, *recJets, *hltJets, *trigger);
112 cout <<
"leadingJet: " << leadingJet << endl;
117 if (recEvt->weights.front() <= 0)
continue;
118 if (steering &
DT::fill) tOut->Fill();
120 float evtWgts = recEvt->weights.front();
121 float efficiency = normalisation.eff(leadingJet);
123 cout <<
"evtWgts = " << evtWgts <<
'\n'
124 <<
"efficiency = " << efficiency << endl;
125 if (efficiency <= 0)
continue;
127 corrNoTrigEff(*recJets, evtWgts*efficiency);
128 for (
size_t i = 0; i < corr.size(); ++i)
129 corr.at(i)(*recJets, recEvt->weights.at(i));
134 for (
auto& jet: *recJets) {
135 float y = jet.AbsRap();
136 float w = recEvt->weights.front();
137 normalisation.eff.contribs.at(normalisation.ibit)->Fill(jet.CorrPt(), y,
w);
142 corrNoTrigEff.Write(fOut);
143 for (
size_t i = 0; i < corr.size(); ++i)
144 corr.at(i).Write(fOut);
145 TDirectory * controlplots = fOut->mkdir(
"controlplots");
147 for (TH2 * h: normalisation.eff.contribs) {
148 h->SetDirectory(controlplots);
152 metainfo.Set<
bool>(
"git",
"complete",
true);
154 cout << __func__ <<
' ' << slice <<
" stop" << endl;
◆ applyMClumi()
void DAS::Normalisation::applyMClumi |
( |
const vector< fs::path > & |
inputs, |
|
|
const vector< fs::path > & |
sumWgts, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Normalise with sum of weights (to be computed) and cross section (given)
- Note
- A cut-off for events with hard scale above 5 TeV is applied, since these events are not realistic
- Parameters
-
inputs | input ROOT files (n-tuple) |
sumWgts | input ROOT files (histogram) |
output | output ROOT file (n-tuple) |
config | config handled with `Darwin::Tools::Options` |
steering | parameters obtained from explicit options |
slice | number and index of slice |
68 cout << __func__ <<
' ' << slice <<
" start" << endl;
71 auto tIn = flow.GetInputTree(slice);
72 auto [fOut, tOut] = flow.GetOutput(output);
76 auto isMC = metainfo.Get<
bool>(
"flags",
"isMC");
77 if (!
isMC) BOOST_THROW_EXCEPTION(
DE::BadInput(
"Only MC may be used as input.",
78 make_unique<TFile>(
inputs.front().c_str() )) );
81 auto xsection =
config.get<
float>(
"corrections.MCnormalisation.xsection");
83 metainfo.Set<
float>(
"corrections",
"MCnormalisation",
"xsection", xsection);
86 auto genEvt = flow.GetBranchReadWrite<GenEvent>(
"genEvent");
87 auto recEvt = flow.GetBranchReadOnly<RecEvent>(
"recEvent");
88 auto genJets = flow.GetBranchReadOnly<vector<GenJet>>(
"genJets",
DT::facultative);
89 auto recJets = flow.GetBranchReadOnly<vector<RecJet>>(
"recJets",
DT::facultative);
93 ControlPlots plots(
"controlplots");
95 for (
DT::Looper looper(tIn); looper(); ++looper) {
100 if (recJets !=
nullptr && recJets->size() > 0 && recJets->front().scales.size() > 1)
101 BOOST_THROW_EXCEPTION(
DE::AnomalousEvent(
"Unexpected jet energy scale variations", tIn) );
104 genEvt->weights.front() *= factor;
105 if (steering &
DT::fill) tOut->Fill();
108 if (genJets !=
nullptr)
109 plots(*genJets, genEvt->weights.front() );
110 if (recJets !=
nullptr)
111 plots(*recJets, genEvt->weights.front() * recEvt->weights.front());
114 metainfo.Set<
bool>(
"git",
"complete",
true);
118 cout << __func__ <<
' ' << slice <<
" stop" << endl;
◆ applyNormFactor()
void DAS::Normalisation::applyNormFactor |
( |
const vector< fs::path > & |
inputs, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Multiplies the gen weight of every event by a factor provided on the command line.
- Parameters
-
inputs | input ROOT files (n-tuple) |
output | output ROOT file (n-tuple) |
config | config handled with `Darwin::Tools::Options` |
steering | parameters obtained from explicit options |
slice | number and index of slice |
44 cout << __func__ <<
' ' << slice <<
" start" << endl;
47 auto tIn = flow.GetInputTree(slice);
48 auto tOut = flow.GetOutputTree(output);
52 auto isMC = metainfo.Get<
bool>(
"flags",
"isMC");
53 if (!
isMC) BOOST_THROW_EXCEPTION(
DE::BadInput(
"Only MC may be used as input.",
54 make_unique<TFile>(
inputs.front().c_str() )) );
56 const float factor =
config.get<
float>(
"corrections.normFactor");
57 metainfo.Set<
float>(
"corrections",
"normFactor", factor);
60 auto evnt = flow.GetBranchReadOnly<GenEvent>(
"genEvent");
62 for (
DT::Looper looper(tIn); looper(); ++looper) {
67 if (evnt->weights.size() != 1)
71 for (
auto&
weight: evnt->weights)
74 if (steering &
DT::fill) tOut->Fill();
77 metainfo.Set<
bool>(
"git",
"complete",
true);
79 cout << __func__ <<
' ' << slice <<
" stop" << endl;
◆ extractBinning()
vector<double> DAS::Normalisation::extractBinning |
( |
const unique_ptr< TH1 > & |
h3D, |
|
|
const TString & |
axis |
|
) |
| |
Extract the axis binning from a TH1 obgect and return it in a vector.
20 const TAxis *naxis =
nullptr;
21 if (axis ==
"X") naxis = h3D->GetXaxis();
22 else if (axis ==
"Y") naxis = h3D->GetYaxis();
23 else if (axis ==
"Z") naxis = h3D->GetZaxis();
25 int ndiv = naxis->GetNbins();
26 vector<double> binning(ndiv+1);
27 naxis->GetLowEdge(&binning[0]);
28 binning[ndiv] = naxis->GetBinUpEdge(ndiv);
◆ FitTriggerEfficiency()
TF1* DAS::Normalisation::FitTriggerEfficiency |
( |
int |
trigger, |
|
|
TH1 * |
h, |
|
|
STREAM & |
Stream, |
|
|
int |
from, |
|
|
const char * |
options = "NQERS" |
|
) |
| |
Fit the trigger efficiency with sigmoid function in [trigger, 3* trigger], where trigger is the HLT pt threshold.
The sigmoid function is defined as follows:
\epsilon (p_T) = a + 0.5 \times (1-a) \times \left( 1 + \erf \left( \frac{p_T - \mu}{\sigma} \right) \right)
where a, $\mu$ and $\sigma$ are the three parameters.
NOTE:
- the output is very sensitive to the fit range
- unclear if/how JES uncertainties should be taken into account
- Parameters
-
trigger | trigger HLT threshold |
h | efficiency histogram |
Stream | `cout` or file |
from | last turnon, to know from where the ref is efficient |
options | fit options for TF1 function |
56 int mbin = h->GetXaxis()->FindBin( from),
57 Mbin = h->GetXaxis()->FindBin(3*from);
58 float m = h->GetBinLowEdge(mbin+1), M = h->GetBinLowEdge(Mbin);
59 for (
int bin = 0; bin <= mbin; ++bin) {
60 h->SetBinContent(bin, 0);
61 h->SetBinError (bin, 0);
63 for (
int bin = Mbin+1; bin <= h->GetNbinsX()+1; ++bin) {
64 h->SetBinContent(bin, 0);
65 h->SetBinError (bin, 0);
68 cout <<
"Fitting trigger " << trigger <<
" from " << m <<
" to " << M << endl;
71 TF1 *
f =
new TF1(Form(
"sigmoid%d", trigger),
72 "[0]+0.5*(1-[0])*(1+erf((x-[1])/[2]))",
75 f->SetParNames(
"a",
"#mu",
"#sigma");
78 f->SetParameter(0,0.1);
79 f->SetParLimits(0,0,0.9);
81 f->SetParameter(1,1.1*trigger);
82 f->SetParLimits(1,m,M);
84 f->SetParameter(2,10);
85 f->SetParLimits(2,1,150);
90 float turnon =
GetX(
f);
92 Stream << trigger <<
'\t' << turnon <<
'\n';
◆ getHistoEfficiencyCurves()
void DAS::Normalisation::getHistoEfficiencyCurves |
( |
const fs::path & |
input, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Extract trigger efficiency distributions from getTriggerEfficiency*Method*
- Parameters
-
input | input ROOT file (output of getTriggerEfficiency*Method*) |
output | name of output ROOT file (histograms) |
config | config file from `DTOptions` |
steering | steering parameters from `DTOptions` |
slice | slices for running |
122 cout << __func__ <<
" start" << endl;
124 auto fIn = make_unique<TFile>(
input .c_str(),
"READ"),
125 fOut = make_unique<TFile>(output.c_str(),
"RECREATE");
128 cout << __func__ <<
' ' << slice <<
" stop" << endl;
◆ getHLTJetResponse()
void DAS::Normalisation::getHLTJetResponse |
( |
const vector< fs::path > & |
inputs, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Get HLT single-jet response in bins of kinematics in real data. The output can be used as input to fitJetResponse to determine and understand the deviations from the Gaussian expectations, which prevent from fitting the trigger efficiency with the error function.
- Parameters
-
inputs | input ROOT files (n-tuples) |
output | name of output ROOT file (histograms) |
config | config file from `DTOptions` |
steering | steering parameters from `DTOptions` |
slice | slices for running |
49 cout << __func__ <<
' ' << slice <<
" start" << endl;
52 auto tIn = flow.GetInputTree(slice);
53 auto [fOut, tOut] = flow.GetOutput(output);
57 auto isMC = metainfo.Get<
bool>(
"flags",
"isMC");
59 BOOST_THROW_EXCEPTION(
DE::BadInput(
"Only DATA may be used as input.", metainfo) );
61 auto rEv = flow.GetBranchReadOnly<RecEvent>(
"recEvent");
62 auto recjets = flow.GetBranchReadOnly<vector<RecJet>>(
"recJets");
63 auto hltjets = flow.GetBranchReadOnly<vector<FourVector>>(
"hltJets");
67 for (
DT::Looper looper(tIn); looper(); ++looper) {
71 auto recWgt = rEv->weights.front();
76 auto pthlt = hltjet.Pt();
78 int pthltbin = inclResp->GetXaxis()->FindBin(pthlt);
79 double hlt_lowedge = inclResp->GetXaxis()->GetBinLowEdge(pthltbin);
85 inclResp->Fill(pthlt, etarec,
response, recWgt);
91 inclResp->SetDirectory(fOut);
92 inclResp->SetTitle(
"Response");
93 inclResp->Write(
"Response");
95 metainfo.Set<
bool>(
"git",
"complete",
true);
97 cout << __func__ <<
' ' << slice <<
" end" << endl;
◆ GetNormFactor()
float DAS::Normalisation::GetNormFactor |
( |
const int |
steering, |
|
|
const vector< fs::path > & |
sumWgts, |
|
|
const float |
xsec |
|
) |
| |
Retrieve the sum of the weights obtained with getSumWeights
and combines it with the input cross section to calculate the normalisation factor.
- Parameters
-
sumWgts | file containing the hist |
xsec | cross section value |
42 auto sumw = h->Integral(0, -1,
45 BOOST_THROW_EXCEPTION(
DE::BadInput(
"Negative sum of weights.", h) );
47 BOOST_THROW_EXCEPTION( invalid_argument(
"Negative cross section.") );
48 auto factor = xsec/sumw;
50 cout << xsec <<
'/' << sumw <<
'=' << factor << endl;
◆ getPrescale()
float DAS::Normalisation::getPrescale |
( |
Trigger * |
trigger, |
|
|
size_t |
indx |
|
) |
| |
96 float preHLT = trigger->PreHLT[indx];
97 float preL1min = trigger->PreL1min[indx];
98 float preL1max = trigger->PreL1max[indx];
99 assert(preL1min == preL1max);
100 float prescale = preHLT * preL1min;
◆ getSumWeights()
void DAS::Normalisation::getSumWeights |
( |
const vector< fs::path > & |
inputs, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Sum the weights from ROOT n-tuple. Mostly useful for MC to estimate the effective number of events, which is necessary to normalise.
The histogram is filled in a way so that it can be used for two purposes:
- provide a distribution of the weights and choose a max weight,
- extract the normalisation factor by takaing its integral.
- Note
- The values beyond
maxAbsValue
are filled a 2nd time in the overflow with the opposite weight. The truncated sum of the weights is then obtained from the integral by including the overflow.
- Parameters
-
inputs | input ROOT files (n-tuple) |
output | output ROOT file (histograms) |
config | config handled with `Darwin::Tools::Options` |
steering | parameters obtained from explicit options |
slice | number and index of slice |
48 cout << __func__ <<
' ' << slice <<
" start" << endl;
51 auto tIn = flow.GetInputTree(slice);
52 auto tOut = flow.GetOutputTree(output);
56 auto isMC = metainfo.Get<
bool>(
"flags",
"isMC");
57 if (!
isMC) BOOST_THROW_EXCEPTION(
DE::BadInput(
"Only MC may be used as input.",
58 make_unique<TFile>(
inputs.front().c_str() )) );
60 const auto maxAbsValue =
config.get<
float>(
"corrections.weights.maxAbsValue");
61 const auto mode =
config.get<
string>(
"corrections.weights.mode");
63 cout <<
"maxAbsValue = " << maxAbsValue << endl;
65 auto evnt = flow.GetBranchReadOnly<GenEvent>(
"genEvent");
67 TString title =
";log_{10}(w);sign;#sum_{i=1}^{events} w_{i}";
68 if (maxAbsValue > 0) title = Form(
"w < %f", maxAbsValue);
69 auto h = make_unique<TH2D>(
"hSumWgt", title, 100, 3, 40,
71 const double overflow = h->GetXaxis()->GetXmax()+1.;
75 else if (mode ==
"signOnly") wm =
SIGN;
76 else if (mode !=
"count" )
77 BOOST_THROW_EXCEPTION( invalid_argument(mode +
" is unknown") );
79 if (maxAbsValue > 0) wm |=
CUTOFF;
81 cout <<
"wm = " << bitset<8>(wm) << endl;
84 cout << setw(20) <<
"w"
86 << setw(20) <<
"x [log10(abs(w))]"
87 << setw(20) <<
"y [sign]"
88 << setw(20) <<
"z [eff. weight]" << endl;
90 for (
DT::Looper looper(tIn); looper(); ++looper) {
94 const double w = evnt->weights.front();
95 if (
w == 0.)
continue;
98 BOOST_THROW_EXCEPTION( runtime_error(
"Infinite or NaN weight:"s +
w) );
104 const double absw = std::abs(
w),
107 double z = wm &
WEIGHT ? absw : 1;
108 if (wm &
SIGN) z = copysign(z,
w);
110 cout << setw(20) <<
w
114 << setw(20) << z << endl;
119 cerr <<
orange <<
"Warning: a good weight is being filled in the overflow.\n" <<
def;
124 if ((wm &
CUTOFF) && absw >= maxAbsValue)
125 h->Fill(overflow, y, -z);
128 metainfo.Set<
bool>(
"git",
"complete",
true);
132 cout << __func__ <<
' ' << slice <<
" end" << endl;
◆ getTriggerCurves()
void DAS::Normalisation::getTriggerCurves |
( |
const vector< fs::path > & |
inputs, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Get trigger curves from the data n-tuples.
- Todo:
- fix error
- Todo:
- fix error
- Parameters
-
inputs | input ROOT file (n-tuple) |
output | output ROOT file (n-tuple) |
config | config handled with `Darwin::Tools::options` |
steering | parameters obtained from explicit options |
slice | number and index of slice |
118 auto tIn = flow.GetInputTree(slice);
119 auto [fOut, tOut] = flow.GetOutput(output);
124 const auto usePrescales =
config.get<
bool>(
"corrections.normalisation.use_prescales");
125 metainfo.Set<
bool>(
"corrections",
"normalisation",
"use_prescales", usePrescales);
127 auto lumi_file =
config.get<fs::path>(
"corrections.normalisation.luminosities");
128 pt::ptree triggers_lumi;
129 pt::read_info(lumi_file.string(), triggers_lumi);
130 for (
auto const& trigger_lumi: triggers_lumi)
131 thresholds.push_back(stoi(trigger_lumi.first));
133 metainfo.Set<fs::path>(
"corrections",
"normalisation",
"luminosities", lumi_file);
135 auto trigger = flow.GetBranchReadOnly<Trigger>(
"jetTrigger");
136 auto recjets = flow.GetBranchReadOnly<vector<RecJet>>(
"recJets");
137 auto hltjets = flow.GetBranchReadOnly<vector<FourVector>>(
"hltJets");
139 map<TString, size_t> methods {
141 {
"emulationShift", 2},
146 TH1 * Deta =
new TH1F(
"deta",
"; #Delta #eta; nevt", 200, -5, 5);
147 TH1 * Dphi =
new TH1F(
"dphi",
"; #Delta #phi; nevt", 200, -M_PI, M_PI);
148 TH1 * dR =
new TH1F(
"dR" ,
"; #Delta R; nevt" , 200, 0, 10);
150 map<TString, map<int, Efficiency>> curves;
151 for (
auto method: methods)
154 cout <<
method.first <<
'\t' << t <<
'\n';
155 curves[
method.first].insert( {t, Efficiency(
method.first, t)} );
159 for (
DT::Looper looper(tIn); looper(); ++looper) {
164 size_t nbits = trigger->Bit.size();
166 BOOST_THROW_EXCEPTION(
DE::AnomalousEvent( Form(
"nbits = %ld < thresholds.size() = %ld",
170 if (
recjets->size() == 0)
continue;
172 for (
const RecJet& pfjet: *
recjets){
176 Deta->Fill(pfjet.p4.Eta() - hltjet.Eta(), pfjet.weights.front());
177 Dphi->Fill(DeltaPhi(pfjet.p4,hltjet), pfjet.weights.front());
178 dR->Fill(
DeltaR(pfjet.p4, hltjet), pfjet.weights.front());
179 pt_correlation->Fill(pfjet.CorrPt(), hltjet.Pt(), pfjet.weights.front());
186 if (leadingInTk ==
recjets->end())
continue;
189 pfjet0 *= leadingInTk->scales.front();
195 for (
auto method: methods) {
197 if (
method.first.Contains(
"TnP"))
continue;
198 size_t shift =
method.second;
200 for (
size_t i = shift; i <
thresholds.size(); ++i) {
203 auto& eff = curves.at(
method.first).at(t);
205 eff.hAll->Fill(pfjet0.Pt(), hltjet0.Pt());
208 if (!trigger->Bit[i-shift])
continue;
209 eff.hFired->Fill(pfjet0.Pt(), hltjet0.Pt());
211 if (hltjet0.Pt() <
thresholds.at(i-shift))
continue;
212 eff.hFiredThreshold->Fill(pfjet0.Pt(), hltjet0.Pt());
214 float wgt = usePrescales ?
getPrescale(trigger, i-shift) : 1;
215 bool fired = hltjet0.Pt() > t;
216 eff.Fill(pfjet0, fired, wgt*
recjets->front().weights.front());
218 eff.hHLTmap->Fill( pfjet0.Phi(),pfjet0.Eta(),wgt*
recjets->front().weights.front() );
223 for (
size_t i = 0; i <
thresholds.size(); ++i) {
226 auto& eff = curves.at(
"TnP").at(t);
228 eff.hAll->Fill(pfjet0.Pt(), hltjet0.Pt());
231 if (!trigger->Bit[i])
233 eff.hFired->Fill(pfjet0.Pt(), hltjet0.Pt());
240 if (DeltaPhi(
recjets->at(0).p4,
recjets->at(1).p4) < 2.4)
continue;
243 const double pt0 =
recjets->at(0).CorrPt(),
246 if (pt2 > 0.15*(pt0 + pt1))
251 static TRandom3 Rand( metainfo.Seed<10989678>(slice));
252 double r = Rand.Uniform();
257 pfprobe =
recjets->at(iprobe).p4;
259 float pfprobe_wgt =
recjets->at(iprobe).weights.front();
260 float pftag_wgt =
recjets->at(itag).weights.front();
262 pftag *=
recjets->at(itag ).scales.front();
263 pfprobe *=
recjets->at(iprobe).scales.front();
266 if (std::abs(
recjets->at(itag).p4.Eta()) > 1.3)
continue;
277 if (hlttag.Pt() > t) {
278 eff.hFiredThreshold->Fill(pfjet0.Pt(), hltjet0.Pt());
281 bool fired = hltprobe.Pt() > t;
283 float wgt = usePrescales ?
getPrescale(trigger, i) : 1;
284 eff.Fill(pfprobe, fired, wgt * pftag_wgt * pfprobe_wgt);
285 eff.hHLTmap->Fill( pfjet0.Phi(),pfjet0.Eta(),wgt*
recjets->front().weights.front() );
290 cout <<
"Writing to file" << endl;
291 for (
auto&
method: curves) {
293 auto d = fOut->mkdir(
method.first);
294 for (
auto& curve:
method.second)
295 curve.second.Write(d);
301 pt_correlation->Write();
303 metainfo.Set<
bool>(
"git",
"complete",
true);
◆ GetTriggerEfficiency()
float DAS::Normalisation::GetTriggerEfficiency |
( |
int |
trigger, |
|
|
TH1 * |
h, |
|
|
STREAM & |
Stream, |
|
|
float |
from, |
|
|
float |
minEff |
|
) |
| |
DON'T fit the trigger efficiency but just find the first bin above threshold
- Todo:
- Where does the factor 6 come from?
- Parameters
-
trigger | trigger HLT threshold |
h | efficiency histogram |
Stream | `cout` or file |
from | last turnon, to know from where the ref is efficient |
minEff | min efficiency (e.g. different for barrel and forward region) |
107 int mbin = h->GetXaxis()->FindBin( from),
108 Mbin = h->GetXaxis()->FindBin(6*from);
109 for (
int bin = 0; bin < mbin; ++bin) {
110 h->SetBinContent(bin, 0);
111 h->SetBinError (bin, 0);
113 for (
int bin = Mbin+1; bin <= h->GetNbinsX()+1; ++bin) {
114 h->SetBinContent(bin, 0);
115 h->SetBinError (bin, 0);
117 for (
int bin = mbin; bin <= Mbin; ++bin) {
118 float content = h->GetBinContent(bin);
119 if (content < minEff)
continue;
120 float turnon = h->GetBinLowEdge(bin);
121 Stream << trigger <<
'\t' << turnon <<
'\n';
◆ getTriggerEfficiencyEmulation()
void DAS::Normalisation::getTriggerEfficiencyEmulation |
( |
const vector< fs::path > & |
inputs, |
|
|
const fs::path & |
output, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice = {1,0} |
|
) |
| |
Get the efficiency in 3D TEfficiency objects from data n-tuples using different selection criteria for the matching.
- Todo:
- : what if there are HLT jets but no rec jets? -> global inefficiency?
- Parameters
-
inputs | input ROOT files (n-tuples) |
output | name of output ROOT file (histograms) |
config | config file from `DTOptions` |
steering | steering parameters from `DTOptions` |
slice | slices for running |
134 cout << __func__ <<
" start" << endl;
137 auto tIn = flow.GetInputTree(slice);
138 auto [fOut, tOut] = flow.GetOutput(output);
140 pt::ptree triggers_lumi;
141 auto lumi_file =
config.get<fs::path>(
"corrections.normalisation.luminosities");
142 pt::read_info(lumi_file.c_str(), triggers_lumi);
144 for (
auto [trigger, _]: triggers_lumi)
147 BOOST_THROW_EXCEPTION(invalid_argument(
"Empty list of triggers"));
152 const auto R = metainfo.Get<
int>(
"flags",
"R");
154 auto rEv = flow.GetBranchReadOnly<RecEvent>(
"recEvent");
155 auto trigger = flow.GetBranchReadOnly<Trigger>(
"jetTrigger");
156 auto recjets = flow.GetBranchReadOnly<vector<RecJet>>(
"recJets");
157 auto hltjets = flow.GetBranchReadOnly<vector<FourVector>>(
"hltJets");
159 using Matching = JMEmatching<vector<FourVector>, vector<RecJet>>;
160 Matching::maxDR = R/10./2.;
161 cout <<
"Radius for matching: " << Matching::maxDR << endl;
168 for (
DT::Looper looper(tIn); looper(); ++looper) {
173 size_t nbits = trigger->Bit.size();
175 BOOST_THROW_EXCEPTION(
DE::AnomalousEvent( Form(
"nbits = %ld < thresholds.size() = %ld",
179 if (
recjets->empty())
continue;
181 cout <<
"Running matching" << endl;
182 Matching matching(*hltjets, *
recjets);
184 auto ev_w = rEv->Weight();
186 auto get_hlt_match = [&matching,&hltjets](
const RecJet&
recjet) {
188 auto criterion = [&
recjet](
const auto& match_it) {
189 return *(match_it.second) ==
recjet;
191 auto it = ranges::find_if(matching.match_its, criterion);
192 return (it == matching.match_its.end()) ? hltjets->end() : it->first;
197 cout <<
"Leading pt" << endl;
199 const auto hltjet_it = get_hlt_match(
recjet);
200 if (hltjet_it != hltjets->end())
201 leading_pt.Fill(
recjet, *hltjet_it, trigger->Bit, ev_w);
206 cout <<
"Most central" << endl;
207 auto criterion = [](
const RecJet& jet1,
const RecJet& jet2) {
208 return jet1.AbsRap() < jet2.AbsRap();
210 auto recjet_it = ranges::min_element(*
recjets, criterion);
211 const auto hltjet_it = get_hlt_match(*recjet_it);
212 if (hltjet_it != hltjets->end())
213 most_central.Fill(*recjet_it, *hltjet_it, trigger->Bit, ev_w);
217 if (matching.match_its.size() > 0) {
218 cout <<
"Best match" << endl;
219 const auto& [hltjet_it, recjet_it] = matching.match_its.front();
220 best_match.Fill(*recjet_it, *hltjet_it, trigger->Bit, ev_w);
225 cout <<
"All isolated jets" << endl;
226 for (
auto ref_it =
recjets->begin(); ref_it !=
recjets->end(); ++ref_it) {
227 const auto hltjet_it = get_hlt_match(*ref_it);
229 auto is_neighbor = [ref_it, R](
const RecJet& test_jet) {
230 return &test_jet != &(*ref_it) &&
DeltaR(ref_it->p4, test_jet.p4) < R / 10.;
233 if (any_of(
recjets->begin(),
recjets->end(), is_neighbor))
continue;
234 isolated_jets.Fill(*ref_it, *hltjet_it, trigger->Bit, ev_w);
239 leading_pt .Write(fOut);
240 most_central .Write(fOut);
241 best_match .Write(fOut);
242 isolated_jets.Write(fOut);
244 cout << __func__ <<
" stop" << endl;
◆ getTriggerTurnons()
void DAS::Normalisation::getTriggerTurnons |
( |
const fs::path & |
input, |
|
|
const fs::path & |
outputRoot, |
|
|
const fs::path & |
outputTxt, |
|
|
const pt::ptree & |
config, |
|
|
const int |
steering |
|
) |
| |
Get the trigger turn-on points from the trigger curves.
- Todo:
- Use metainfo
- Todo:
- Get year from metainfo?
- Todo:
- Get lumis from metainfo?
- Todo:
- implement a more general logic to use only rapidity <3 turnons to determine the overall turnon
- Parameters
-
input | input ROOT file (n-tuple) |
outputRoot | output ROOT file with efficiency |
outputTxt | output text file with turn-ons |
config | config handled with `Darwin::Tools::options` |
steering | parameters obtained from explicit options |
46 cout << __func__ <<
" start" << endl;
55 cout << setw(10) <<
"trigger";
56 for (
auto yBin:
yBins) cout << setw(18) << yBin;
59 pt::ptree triggers_lumi;
60 auto lumi_file =
config.get<fs::path>(
"corrections.normalisation.luminosities");
61 pt::read_info(lumi_file.c_str(), triggers_lumi);
62 vector<int> triggerThresholds;
63 for (
auto trigger_lumi: triggers_lumi)
64 triggerThresholds.push_back(stoi(trigger_lumi.first));
66 auto fIn = make_unique<TFile>(
input.c_str(),
"READ");
67 map<int, int> turnonsFinal;
68 TIter Next(fIn->GetListOfKeys()) ;
70 TString defMethod =
"TnP";
71 while ( (
key =
dynamic_cast<TKey*
>(Next())) ) {
72 if (TString(
key->ReadObj()->ClassName()) != TString(
"TDirectoryFile"))
76 auto dIn =
dynamic_cast<TDirectory*
>(
key->ReadObj());
78 int lastturnon = triggerThresholds.front();
81 TString
method = dIn->GetName();
85 auto dOut = fOut->mkdir(
method);
87 TIter Next2(dIn->GetListOfKeys()) ;
88 while ( (
key =
dynamic_cast<TKey*
>(Next2())) ) {
89 if (TString(
key->ReadObj()->ClassName()) != TString(
"TDirectoryFile"))
93 auto ddIn =
dynamic_cast<TDirectory*
>(
key->ReadObj());
95 TString trigName = ddIn->GetName();
96 assert(trigName.Contains(
"HLT"));
99 auto ddOut = dOut->mkdir(trigName);
101 trigName.ReplaceAll(
"HLT",
"");
102 int trigger = trigName.Atoi();
103 if (
method ==
"TnP" && trigger < triggerThresholds.at(0))
continue;
104 if (
method ==
"emulation" && trigger < triggerThresholds.at(1))
continue;
105 if (
method ==
"emulationShift" && trigger < triggerThresholds.at(2))
continue;
106 cout << setw(10) << trigger;
108 auto h2 = unique_ptr<TH2>(ddIn->Get<TH2>(
"test"));
110 auto den = unique_ptr<TH2>(ddIn->Get<TH2>(
"ref"));
111 h2->Divide(h2.get(), den.get(), 1, 1,
"B");
116 h2->SetDirectory(ddOut);
117 h2->SetName(
"efficiency");
119 vector<int> turnonsNow;
120 for (
int y = 1; y <= h2->GetNbinsY(); ++y) {
123 auto h1 = unique_ptr<TH1>(h2->ProjectionX(Form(
"efficiency_ybin%d", y), y, y));
125 static ostream bitBucket(0);
139 float from = h1->GetBinLowEdge(h1->FindBin(lastturnon)+1);
141 h1->SetTitle(Form(
"%d (%.3f)", turnon,
threshold));
142 h1->SetDirectory(dOut);
144 turnonsNow.push_back(turnon);
149 auto maxturnon = max_element(turnonsNow.begin(), turnonsNow.begin()+6);
150 h2->SetTitle(Form(
"%d", *maxturnon));
152 for (
auto turnon: turnonsNow) {
153 if (turnon == *maxturnon) cout <<
"\x1B[32m\e[1m";
154 if (turnon < 0) cout <<
"\x1B[31m\e[1m";
155 cout << setw(18) << turnon;
156 cout <<
"\x1B[30m\e[0m";
162 turnonsFinal[trigger] = *maxturnon;
164 defMethod =
"emulation";
165 lastturnon = *maxturnon;
167 if (lastturnon == -1) {
168 cerr <<
"Didn't find any turnon for trigger " << trigger <<
'\n';
169 lastturnon = trigger;
174 pt::ptree turnon_file;
175 for (
auto& turnon: turnonsFinal)
176 turnon_file.put<
int>(to_string(turnon.first), turnon.second);
177 pt::write_info(outputTxt.string(), turnon_file);
179 cout << __func__ <<
" end" << endl;
◆ GetX()
float DAS::Normalisation::GetX |
( |
TF1 * |
f | ) |
|
Replaces TF1::GetX() which does not return the same value when run after compilation or in interactive mode...
Principle: just scan the pt axis with step = 1 until eff > 0.995
22 double m = 0, M = 7000;
25 for (
float pt = m;
pt < M; ++
pt)
29 cerr <<
"No threshold was found from " << m <<
" to " << M <<
".\nAborting.\n";
◆ loopOverDirs()
void DAS::Normalisation::loopOverDirs |
( |
TDirectory * |
dIn, |
|
|
TDirectory * |
dOut, |
|
|
const int |
steering, |
|
|
const DT::Slice |
slice |
|
) |
| |
Considering the possible strategies to determine the trigger efficiency of jets systems stored in 3D ROOT::TEfficiency objects, they need to be extarcted to other more convenient ROOT objects used in plotting and fitting:
- TH1
- TGraphAsymmErrors Based on whether the errors are symmetrical or not, the appropriate class should be used. In this case, the errors are symmetrical, so the TH1 class will be used.
This class includes the extraction of the corresponding histograms that are filled with the efficiency, for all HLT and |eta| bins.
56 for (
const auto&& obj: *(dIn->GetListOfKeys())) {
57 if (!obj->InheritsFrom(
"TKey"))
continue;
58 auto const key =
dynamic_cast<TKey*
>(obj);
60 auto ddIn =
dynamic_cast<TDirectory*
>(
key->ReadObj() );
61 if (ddIn ==
nullptr)
continue;
65 TString
match = ddIn->GetName();
66 cout <<
"Matching method: " <<
match << endl;
70 auto ddOut = dOut->mkdir(
match);
73 auto t_eff = unique_ptr<TEfficiency>(
dynamic_cast<TEfficiency*
>( ddIn->Get(
"efficiency") ) );
74 if (t_eff ==
nullptr)
continue;
76 auto h3D = t_eff->GetTotalHistogram();
79 auto h_HLTBins = unique_ptr<TH1>(
dynamic_cast<TH1*
>(h3D->Clone(
"h_HLTBins")) );
81 const int nHLTBins = HLTBins.size()-1;
84 auto h_EtaBins = unique_ptr<TH1>(
dynamic_cast<TH1*
>(h3D->Clone(
"h_EtaBins")) );
86 const int nEtaBins = EtaBins.size()-1;
88 for (
int iHLT = 1; iHLT <= nHLTBins; ++iHLT){
89 if (t_eff->GetDimension() != 3)
continue;
91 auto dddOut = ddOut->mkdir(Form(
"HLT%.0f", HLTBins[iHLT-1]));
94 vector<unique_ptr<TH1>> h1D_eff;
95 for (
int iEta = 1; iEta <= nEtaBins; ++iEta){
96 auto ddddOut = dddOut->mkdir(Form(
"etabin%d", iEta));
99 cout <<
"HLT" << HLTBins[iHLT-1] << std::setw(10) << EtaBins[iEta-1] <<
"<|#eta|<" << EtaBins[iEta] << endl;
103 h1D_eff.at(iEta-1)->SetDirectory(0);
105 h1D_eff.at(iEta-1)->SetDirectory(ddddOut);
106 h1D_eff.at(iEta-1)->Write();
◆ makeRespHist()
std::unique_ptr<T> DAS::Normalisation::makeRespHist |
( |
TString |
name, |
|
|
std::vector< double > |
pt_edges = DAS::JetEnergy::pt_JERC_edges , |
|
|
TString |
title = ";p_{T}^{gen};|#eta^{rec}|;#frac{p_{T}^{rec}}{p_{T}^{gen}}" |
|
) |
| |
Create a TH3 histogram for the Jet response and HLT jet response or trigger efficiency curve.
23 {T}^{gen};|#
eta^{rec}|;#frac{p_{T}^{rec}}{p_{T}^{gen}}
")
26 using namespace DAS::JetEnergy;
28 static int nResBins = 200;
29 static auto resBins = getBinning(nResBins, 0, 2);
30 int nPtBins = pt_edges.size()-1;
31 unique_ptr<T> h = make_unique<T>(name, title,
32 nPtBins, pt_edges.data(),
33 nAbsEtaBins, abseta_edges.data(),
34 nResBins, resBins.data());
36 h->SetDirectory(nullptr);
◆ makeTriggerEffHist()
unique_ptr<TH1F> DAS::Normalisation::makeTriggerEffHist |
( |
const unique_ptr< TEfficiency > & |
t_eff, |
|
|
int |
iHLT, |
|
|
int |
iEta |
|
) |
| |
Extract the HLT efficiency curves in 1D histograms from TEfficiency objects.
23 auto h3D = t_eff->GetTotalHistogram();
26 auto h3D_HLT = unique_ptr<TH1>(
dynamic_cast<TH1*
>(h3D->Clone(
"h3D_HLT")) );
30 auto h3D_res = unique_ptr<TH1>(
dynamic_cast<TH1*
>(h3D->Clone(
"h3D_res")) );
32 const int nResBins = ResBins.size()-1;
34 TString
name =
"efficiency";
35 TString title = Form(
"HLT%.0f_eta%d", HLTBins[iHLT-1], iEta+1);
36 unique_ptr<TH1F> h = make_unique<TH1F>(
name, title, nResBins, 0, 2*HLTBins[iHLT-1]);
37 for (
int ipt = 1; ipt <= nResBins; ++ipt){
38 h->SetBinContent( ipt, t_eff->GetEfficiency (t_eff->GetGlobalBin(iHLT, iEta, ipt)) );
39 h->SetBinError ( ipt, t_eff->GetEfficiencyErrorUp(t_eff->GetGlobalBin(iHLT, iEta, ipt)) );
42 h->SetDirectory(
nullptr);
◆ match()
8 for (
const auto& hltjet: *hltJets){
9 using ROOT::Math::VectorUtil::DeltaR;
10 if (
DeltaR(hltjet, jet) < 0.3)
◆ operator<<()
std::ostream& DAS::Normalisation::operator<< |
( |
std::ostream & |
Stream, |
|
|
const TriggerLumi & |
tr_lu |
|
) |
| |
25 Stream << tr_lu.pt <<
'\t' << tr_lu.turnon <<
'\t' << tr_lu.weight <<
'\t' << 1./tr_lu.weight;
◆ phaseSel()
10 auto leadingInTk =
recjets.begin();
11 while (leadingInTk !=
recjets.end()
12 && std::abs(leadingInTk->Rapidity()) >= 3.0)
◆ reset()
void DAS::Normalisation::reset |
( |
Weights & |
wgts, |
|
|
const double |
v = 0 |
|
) |
| |
|
inline |
28 {
std::fill(wgts.begin(), wgts.end(), Weight{v,0}); }
◆ nThresholds
◆ threshold
const float threshold = 0.995 |
◆ thresholds
vector<double> thresholds |
name
Definition: DYToLL_M-50_13TeV_pythia8_cff_GEN_SIM_RECOBEFMIX_DIGI_L1_DIGI2RAW_L1Reco_RECO.py:48
std::vector< DAS::RecJet >::iterator phaseSel(std::vector< DAS::RecJet > &recjets)
Definition: PhaseSelection.h:9
method
Definition: Core-gitclone-lastrun.txt:5
cerr
Definition: Ntupliser_cfg.py:105
@ SIGN
use the sign
Definition: getSumWeights.cc:29
options
Definition: DYToLL_M-50_13TeV_pythia8_cff_GEN_SIM_RECOBEFMIX_DIGI_L1_DIGI2RAW_L1Reco_RECO.py:41
pt
Definition: jmarExample.py:19
static bool verbose
Definition: Step.h:40
vector< double > thresholds
Definition: getTriggerCurves.cc:41
static const char * def
Definition: Step.h:36
FourVector p4
raw four-momentum directly after reconstruction
Definition: PhysicsObject.h:50
int nThresholds
Definition: getTriggerCurves.cc:42
int year
Definition: Ntupliser_cfg.py:67
source
Definition: DYToLL_M-50_13TeV_pythia8_cff_GEN_SIM_RECOBEFMIX_DIGI_L1_DIGI2RAW_L1Reco_RECO.py:39
static const std::vector< double > pt_edges
Definition: binnings.h:33
f
Definition: Ntupliser_cfg.py:322
string key
Definition: jercExample.py:109
static const float w
Definition: common.h:53
Strategy
Definition: fjcore.hh:1017
DAS::RecJet recjet
Definition: classes.h:15
DAS::Weight weight
Definition: classes.h:11
unique_ptr< TH1F > makeTriggerEffHist(const unique_ptr< TEfficiency > &t_eff, int iHLT, int iEta)
Extract the HLT efficiency curves in 1D histograms from TEfficiency objects.
Definition: MakeEfficiencyHistos.h:21
config
Definition: Ntupliser_cfg.py:330
static const char * orange
Definition: colours.h:6
input
Definition: DYToLL_M-50_13TeV_pythia8_cff_GEN_SIM_RECOBEFMIX_DIGI_L1_DIGI2RAW_L1Reco_RECO.py:35
float CorrPt(size_t i) const
corrected transverse momentum
Definition: PhysicsObject.h:55
recjets
Definition: Ntupliser_cfg.py:342
vector< double > extractBinning(const unique_ptr< TH1 > &h3D, const TString &axis)
Extract the axis binning from a TH1 obgect and return it in a vector.
Definition: ExtractBinning.h:18
std::unique_ptr< T > makeRespHist(TString name, std::vector< double > pt_edges=DAS::JetEnergy::pt_JERC_edges, TString title=";p_{T}^{gen};|#eta^{rec}|;#frac{p_{T}^{rec}}{p_{T}^{gen}}")
Definition: MakeResponseHistos.h:22
static const int nPtBins
Definition: binnings.h:39
@ WEIGHT
use the weights
Definition: getSumWeights.cc:28
dictionary isMC
Definition: Ntupliser_cfg.py:62
const float threshold
Definition: sigmoid.h:14
float GetNormFactor(const int steering, const vector< fs::path > &sumWgts, const float xsec)
Definition: applyMClumi.cc:37
def inputs
Definition: jercExample.py:118
DAS::FourVector match(const DAS::FourVector &jet, const std::vector< DAS::FourVector > *hltJets)
Definition: match.h:7
Generic exception for problematic event (during event loop).
Definition: exceptions.h:63
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< float > > FourVector
Definition: PhysicsObject.h:15
float GetTriggerEfficiency(int trigger, TH1 *h, STREAM &Stream, float from, float minEff)
Definition: sigmoid.h:101
float getPrescale(Trigger *trigger, size_t indx)
Definition: getTriggerCurves.cc:94
eta
DeepAK8/ParticleNet tagging.
Definition: jmarExample.py:19
void loopOverDirs(TDirectory *dIn, TDirectory *dOut, const int steering, const DT::Slice slice)
Definition: getHistoEfficiencyCurves.cc:51
float GetX(TF1 *f)
Definition: sigmoid.h:20
static const std::vector< TString > yBins
Definition: binnings.h:44
@ CUTOFF
apply a selection on the weight
Definition: getSumWeights.cc:30