30 const IInterface* p ) :
34 declareProperty(
"taggerName",
m_taggerName =
"undefined",
35 "tagging algorithm name");
36 declareProperty(
"operatingPoints", m_operatingPoints,
37 "operating points for this tagging algorithm");
39 "efficiency calibration curve for b jets");
41 "efficiency calibration curve for c jets");
43 "efficiency calibration curve for tau jets");
45 "efficiency calibration curve for light-flavour jets");
47 "scale factor calibration curve for b jets");
49 "scale factor calibration curve for c jets");
51 "scale factor calibration curve for tau jets");
53 "scale factor calibration curve for light-flavour jets");
54 declareProperty(
"PerformanceBroker",
m_broker,
55 "tool interfacing with COOL Database");
71 string::size_type end;
73 std::vector<string> calibrationBNames;
79 }
while (end != string::npos);
82 std::vector<string> calibrationCNames;
88 }
while (end != string::npos);
91 std::vector<string> calibrationTNames;
97 }
while (end != string::npos);
100 std::vector<string> calibrationLightNames;
106 }
while (end != string::npos);
111 std::map<string, std::vector<string> > effNames;
112 effNames[
"B"] = calibrationBNames;
113 effNames[
"C"] = calibrationCNames;
114 effNames[
"T"] = calibrationTNames;
115 effNames[
"Light"] = calibrationLightNames;
119 std::map<string, string> calibrationNames;
127 for (std::map<string, string>::const_iterator it = calibrationNames.begin();
128 it != calibrationNames.end(); ++it) {
129 for (std::vector<string>::const_iterator op = m_operatingPoints.begin();
130 op != m_operatingPoints.end(); ++op) {
136 return StatusCode::SUCCESS;
151 string flavour(
label);
152 if (flavour ==
"N/A") flavour =
"Light";
154 string author =
jet.jetAuthor();
156 string sfName(
getBasename(OP, flavour,
"_SF",
true));
159 std::pair<CalibrationDataContainer*,bool> ret =
163 ATH_MSG_WARNING(
"in " << name() <<
": unable to find SF calibration for object with "
164 <<
"tagger/jetCollection/flavour/operating point = "
165 <<
m_taggerName <<
"/" << author <<
"/" << flavour <<
"/" << OP);
180 if (
container->getResult(variables, value) == CalibrationDataContainer::kError)
186 if (
container->getStatUncertainty(variables, stat) == CalibrationDataContainer::kError)
187 cerr <<
"getScaleFactor: error retrieving Scale factor statistical uncertainty!"
192 if (
container->getSystUncertainty(variables, resSyst) == CalibrationDataContainer::kError)
193 cerr <<
"getScaleFactor: error retrieving Scale factor parameter systematic uncertainty!"
215 string flavour(
label);
216 if (flavour ==
"N/A") flavour =
"Light";
218 string author =
jet.jetAuthor();
220 string effName(
getBasename(OP, flavour,
"_Eff",
false));
223 std::pair<CalibrationDataContainer*,bool> ret =
227 ATH_MSG_WARNING(
"in " << name() <<
": unable to find Eff calibration for object with "
228 <<
"tagger/jetCollection/flavour/operating point = "
229 <<
m_taggerName <<
"/" << author <<
"/" << flavour <<
"/" << OP);
244 if (
container->getResult(variables, value) == CalibrationDataContainer::kError)
250 if (
container->getStatUncertainty(variables, stat) == CalibrationDataContainer::kError)
251 cerr <<
"getMCEfficiency: error retrieving MC efficiency statistical uncertainty!"
256 if (
container->getSystUncertainty(variables, resSyst) == CalibrationDataContainer::kError)
257 cerr <<
"getMCEfficiency: error retrieving MC efficiency parameter systematic uncertainty!"
264 result.first = std::max(0., std::min(1.,
result.first));
278 double value = effResult.first*sfResult.first;
280 relative = effResult.second/effResult.first;
281 double sfRelative = sfResult.second/sfResult.first;
282 relative = std::sqrt(sfRelative*sfRelative + relative*relative);
284 ATH_MSG_WARNING(
"in " << name() <<
": null result, SF=" << sfResult.first
285 <<
" MC eff=" << effResult.first);
289 return std::make_pair(value,value*relative);
295 const string& OP)
const
297 static const string slash(
"/");
312 x.jetAuthor =
jet.jetAuthor();
313 x.jetPt =
jet.pt() * 0.001;
314 x.jetEta =
jet.eta();
#define ATH_MSG_WARNING(x)
This is the interface for the objects to be stored in the calibration ROOT file.
std::string m_taggerName
tagging algorithm name
const std::string & SFCalibrationName(const std::string &flavour) const
void setEffCalibrationNames(const std::map< std::string, std::vector< std::string > > &names)
void setSFCalibrationNames(const std::map< std::string, std::string > &names)
const std::string & EffCalibrationName(const std::string &flavour, unsigned int mapIndex=0) const
Main interface methods accessing the flavour tagging performance information.
std::string getBasename(const std::string &name) const
auxiliary function for retrieval of name within the directory
double combinedUncertainty(double stat, const std::pair< double, double > &syst) const
utility function for combination of statistical and (a priori asymmetric) systematic uncertainty.
This class (struct, actually) is nothing but a light-weight container of (kinematic or other) variabl...
std::string label(const std::string &format, int i)
const CalibResult dummyResult(dummyValue, dummyValue)
std::pair< double, double > CalibResult
std::pair< double, double > UncertaintyResult
The following typedef is for convenience: most uncertainties can be asymmetric.
Uncertainty
specification of type information requested by the user