ATLAS Offline Software
TopOtherCPTools.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3  */
4 
6 
7 #include <map>
8 #include <string>
9 #include <cstdio>
10 
11 // Top includes
13 #include "TopEvent/EventTools.h"
14 
15 // PathResolver include(s):
17 
18 // GRL include(s):
20 
21 // Pileup Reweighting include(s):
23 
24 // PMG include(s):
26 
27 namespace top {
28  OtherCPTools::OtherCPTools(const std::string& name) :
29  asg::AsgTool(name) {
30  declareProperty("config", m_config);
31 
32  declareProperty("GRLTool", m_grlTool);
33  }
34 
36  ATH_MSG_INFO("top::OtherCPTools initialize...");
37 
38  if (!m_config->isMC() || m_config->PileupUseGRLTool()) top::check(setupGRL(), "Failed to setup GRL tool");
39 
40  if (m_config->doPileupReweighting()) top::check(setupPileupReweighting(), "Failed to setup pile-up reweighting");
41 
42  if (m_config->isMC()) top::check(setupPMGTools(), "Failed to setup PMG tools");
43 
44  return StatusCode::SUCCESS;
45  }
46 
48  using IGRLTool = IGoodRunsListSelectionTool;
49  const std::string grl_tool_name = "GoodRunsListSelectionTool";
50  if (asg::ToolStore::contains<IGRLTool>(grl_tool_name)) {
51  m_grlTool = asg::ToolStore::get<IGRLTool>(grl_tool_name);
52  } else {
53  if (!m_config->grlFile().size()) {
54  // do not configure GRL tool
55  ATH_MSG_WARNING("No GRL files provided -> Will NOT setup GoodRunsListSelectionTool.");
56  return StatusCode::SUCCESS;
57  }
58 
59  IGRLTool* grlTool = new GoodRunsListSelectionTool(grl_tool_name);
60  std::vector<std::string> names = {};
61  std::string grlDir = m_config->grlDir();
62  if (grlDir.size()) grlDir += "/";
63  for (const std::string& grl : m_config->grlFile()) {
64  names.push_back(PathResolverFindCalibFile(grlDir + grl));
65  }
66 
67  top::check(asg::setProperty(grlTool, "GoodRunsListVec", names),
68  "GRLSelector failed to set GRL");
69  top::check(grlTool->initialize(),
70  "Failed to initialize GRLSelectionTool");
71  m_grlTool = grlTool;
72  }
73  return StatusCode::SUCCESS;
74  }
75 
77  const std::string prw_tool_name = "PileupReweightingTool";
78 
79  auto GetDefaultPRW = [this](bool isFS) {
80  // example path: dev/PileupReweighting/share/DSID410xxx/pileup_mc20e_dsid410470_FS.root
81  std::string path = "dev/PileupReweighting/share/DSID";
82  const int dsid = this->m_config->getDSID();
83  const std::string year = this->m_config->getYear();
84  std::string campaign("mc20a");
85  if (year == "2017") campaign = "mc20d";
86  else if (year == "2018") campaign = "mc20e";
87  path += std::to_string(dsid/1000) + "xxx/";
88  path += "pileup_" + campaign + "_dsid" + std::to_string(dsid) + "_";
89  path += isFS ? "FS" : "AFII";
90  path += ".root";
91 
92  // if running on data, give any valid MC file
93  if (!this->m_config->isMC()) path = "dev/PileupReweighting/share/DSID410xxx/pileup_mc20e_dsid410470_FS.root";
94 
95  ATH_MSG_INFO("Using the default PRW file: " + path);
96 
97  return path;
98  };
99 
100  if (asg::ToolStore::contains<CP::IPileupReweightingTool>(prw_tool_name)) {
101  m_pileupReweightingTool = asg::ToolStore::get<CP::IPileupReweightingTool>(prw_tool_name);
102  } else {
103  CP::IPileupReweightingTool* pileupReweightingTool
104  = new CP::PileupReweightingTool(prw_tool_name);
105 
106  std::vector<std::string> pileup_config = m_config->PileupConfig();
107  for (std::string& s : pileup_config)
109 
110  std::vector<std::string> pileup_lumi_calc = m_config->PileupLumiCalc();
111  for (std::string& s : pileup_lumi_calc)
113 
114  std::vector<std::string> pileup_config_FS = m_config->PileupConfig_FS();
115  if (pileup_config_FS.empty() && !m_config->isAFII()) {
116  pileup_config_FS.emplace_back(PathResolverFindCalibFile(GetDefaultPRW(true)));
117  } else {
118  for (std::string& s : pileup_config_FS) {
120  }
121  }
122 
123  std::vector<std::string> pileup_config_AF = m_config->PileupConfig_AF();
124  if (pileup_config_AF.empty() && m_config->isAFII()) {
125  pileup_config_AF.emplace_back(PathResolverFindCalibFile(GetDefaultPRW(false)));
126  } else {
127  for (std::string& s : pileup_config_AF)
129  }
130 
131  std::vector<std::string> actual_mu_FS = m_config->PileupActualMu_FS();
132  for (std::string& s : actual_mu_FS)
134 
135  std::vector<std::string> actual_mu_AF = m_config->PileupActualMu_AF();
136  for (std::string& s : actual_mu_AF)
138 
139  // New checks - If FS or AF size != 0, then the general option should be empty
140  if ((pileup_config_AF.size() > 0 || pileup_config_FS.size() > 0) && (pileup_config.size() > 0)) {
141  ATH_MSG_ERROR("You have used PRWConfigFiles as well as PRWConfigFiles_FS and/or PRWConfigFiles_AF");
142  ATH_MSG_ERROR("We do not know how to configure with all these options");
143  return StatusCode::FAILURE;
144  }
145 
146  if (m_config->PileupUseGRLTool()) top::check(asg::setProperty(pileupReweightingTool, "GRLTool", m_grlTool),
147  "Failed to give GRLtool to pileup reweighting tool");
148 
149  // Config file is not needed on Data
150  // see "Just random run numbers and lumi corrections"
151  // case in twiki page below
152  // However, the tool would spit out warnings for Data if we didn't supply ConfigFiles.
153  if (pileup_config.size() > 0) {
154  ATH_MSG_INFO("PRW tool is being configured without any FS/AF information");
155  top::check(asg::setProperty(pileupReweightingTool, "ConfigFiles", pileup_config),
156  "Failed to set pileup reweighting config files");
157  } else if (m_config->isAFII() && pileup_config_AF.size() > 0) {
158  // concatenate the config and the actual mu files
159  std::vector<std::string> final_config_AF = pileup_config_AF;
160  final_config_AF.insert(final_config_AF.end(), actual_mu_AF.begin(), actual_mu_AF.end());
161  ATH_MSG_INFO("This sample is fast sim");
162  ATH_MSG_INFO("PRW tool is being configured only with fast simulation (AF) config files");
163  top::check(asg::setProperty(pileupReweightingTool, "ConfigFiles", final_config_AF),
164  "Failed to set pileup reweighting config files");
165  } else if (!m_config->isAFII() && pileup_config_FS.size() > 0) {
166  // concatenate the config and the actual mu files
167  std::vector<std::string> final_config_FS = pileup_config_FS;
168  final_config_FS.insert(final_config_FS.end(), actual_mu_FS.begin(), actual_mu_FS.end());
169  ATH_MSG_INFO("This sample is full sim");
170  ATH_MSG_INFO("PRW tool is being configured only with full simulation (FS) config files");
171  top::check(asg::setProperty(pileupReweightingTool, "ConfigFiles", final_config_FS),
172  "Failed to set pileup reweighting config files");
173  } else {
174  ATH_MSG_ERROR("There are not any PRW config files provided with any allowed options");
175  return StatusCode::FAILURE;
176  }
177  // data scale-factors, initialised to recommended values
178  // can also be customised, thanks to PRWCustomScaleFactor option
179  double SF_nominal = 1.0 / 1.03;
180  double SF_up = 1.0 / 0.99;
181  double SF_down = 1.0 / 1.07;
182 
183  // if custom data SFs
184  if (m_config->PileUpCustomScaleFactors().size() != 0) {
185  SF_nominal = m_config->PileUpCustomScaleFactors()[0];
186  SF_up = m_config->PileUpCustomScaleFactors()[1];
187  SF_down = m_config->PileUpCustomScaleFactors()[2];
188  ATH_MSG_INFO("Using custom Data Scale-Factors for pile-up reweighting");
189  std::ostringstream oss;
190  oss << "Nominal:" << SF_nominal << " up:" << SF_up << " down:" << SF_down << std::endl;
191  ATH_MSG_INFO(oss.str());
192  }
193 
194  top::check(asg::setProperty(pileupReweightingTool, "LumiCalcFiles", pileup_lumi_calc),
195  "Failed to set pileup reweighting lumicalc files");
196  // see [http://cern.ch/go/hx7d]
197  top::check(asg::setProperty(pileupReweightingTool, "DataScaleFactor", static_cast<Float_t>(SF_nominal)),
198  "Failed to set pileup reweighting data scale factor");
199  top::check(asg::setProperty(pileupReweightingTool, "DataScaleFactorUP", SF_up),
200  "Failed to set pileup reweighting data scale factor up");
201  top::check(asg::setProperty(pileupReweightingTool, "DataScaleFactorDOWN", SF_down),
202  "Failed to set pileup reweighting data scale factor down");
203  // Set the unrepresented data tolerence (default is 5% same as the PRW tool)
204  top::check(asg::setProperty(pileupReweightingTool, "UnrepresentedDataThreshold", m_config->PileupDataTolerance()),
205  "Failed to set pileup reweighting data tolerance");
206  if (m_config->PileupPeriodAssignments().size() > 0) {
207  // Set the period assignments associated with different running periods
208  top::check(asg::setProperty(pileupReweightingTool, "PeriodAssignments", m_config->PileupPeriodAssignments()),
209  "Failed to set pileup reweighting period assignments");
210  }
211  top::check(pileupReweightingTool->initialize(),
212  "Failed to initialize pileup reweighting tool");
213 
214  m_pileupReweightingTool = pileupReweightingTool;
215  }
216  return StatusCode::SUCCESS;
217  }
218 
220  // Setup any PMG tools
221 
222  // Sherpa 2.2 V+jets samples based on the number of truth jets
223  const std::string name = "PMGSherpa22VJetsWeightTool";
224 
226  if (asg::ToolStore::contains<PMGTools::PMGSherpa22VJetsWeightTool>(name)) {
227  tool = asg::ToolStore::get<PMGTools::PMGSherpa22VJetsWeightTool>(name);
228  } else {
230  top::check(asg::setProperty(tool, "TruthJetContainer",
231  m_config->sgKeyTruthJets()),
232  "Failed to set TruthJetContainer to " + name);
233  top::check(tool->initialize(), "Failed to initialize " + name);
234  }
236 
237  // Tool for access truth weights via names
238  const std::string truthWeightToolName = "PMGTruthWeightTool";
239  PMGTools::PMGTruthWeightTool* truthweightTool = new PMGTools::PMGTruthWeightTool(truthWeightToolName);
240  if (truthweightTool->initialize()) {
241  m_pmg_weightTool = truthweightTool;
242  } else {
243  // delete the tool instance, it is half-initialized at best = broken
244  // elsewere we won't be able to retrieve a ToolHandle, which indicates to us
245  // that we cannot rely on it for this MC sample
246  delete truthweightTool;
247  ATH_MSG_WARNING("Failed to initialize " << truthWeightToolName << ". Any features depending on PMGTruthWeightTool will not work!");
248  }
249 
250  return StatusCode::SUCCESS;
251  }
252 } // namespace top
top::OtherCPTools::OtherCPTools
OtherCPTools(const std::string &name)
Definition: TopOtherCPTools.cxx:28
top::OtherCPTools::setupPileupReweighting
StatusCode setupPileupReweighting()
Definition: TopOtherCPTools.cxx:76
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
top
TopConfig A simple configuration that is NOT a singleton.
Definition: AnalysisTrackingHelper.cxx:58
athena.path
path
python interpreter configuration --------------------------------------—
Definition: athena.py:126
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
GoodRunsListSelectionTool
Tool implementing the GRL selection.
Definition: GoodRunsListSelectionTool.h:37
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
top::OtherCPTools::m_config
std::shared_ptr< top::TopConfig > m_config
Definition: TopOtherCPTools.h:38
asg
Definition: DataHandleTestTool.h:28
top::OtherCPTools::initialize
StatusCode initialize()
Dummy implementation of the initialisation function.
Definition: TopOtherCPTools.cxx:35
PMGTools::PMGTruthWeightTool::initialize
virtual StatusCode initialize() override
Function initialising the tool.
Definition: PMGTruthWeightTool.cxx:31
top::OtherCPTools::m_pileupReweightingTool
ToolHandle< CP::IPileupReweightingTool > m_pileupReweightingTool
Definition: TopOtherCPTools.h:41
PMGTruthWeightTool.h
python.AtlRunQueryAMI.year
year
Definition: AtlRunQueryAMI.py:226
IGoodRunsListSelectionTool
Main tools implementing this interface: GoodRunsListSelectionTool (source code: DataQuality/GoodRunsL...
Definition: PhysicsAnalysis/Interfaces/AsgAnalysisInterfaces/AsgAnalysisInterfaces/IGoodRunsListSelectionTool.h:26
top::OtherCPTools::setupGRL
StatusCode setupGRL()
Definition: TopOtherCPTools.cxx:47
EventTools.h
A few functions for doing operations on particles / events. Currently holds code for dR,...
PileupReweightingTool.h
top::OtherCPTools::setupPMGTools
StatusCode setupPMGTools()
Definition: TopOtherCPTools.cxx:219
grl
Definition: ZLumiScripts/grid/grl.py:1
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
Generate_dsid_ranseed.dsid
dsid
Definition: Generate_dsid_ranseed.py:6
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
python.subdetectors.mmg.names
names
Definition: mmg.py:8
top::check
void check(bool thingToCheck, const std::string &usefulFailureMessage)
Print an error message and terminate if thingToCheck is false.
Definition: EventTools.cxx:15
CP::PileupReweightingTool
Implementation of the PileupReweighting tool.
Definition: PileupReweightingTool.h:34
TopOtherCPTools.h
PathResolver.h
GoodRunsListSelectionTool.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:192
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
AtlCoolConsole.tool
tool
Definition: AtlCoolConsole.py:453
TopConfig.h
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
PMGTools::PMGTruthWeightTool
Implementation for the xAOD truth meta data weight tool.
Definition: PMGTruthWeightTool.h:26
dqt_zlumi_pandas.campaign
campaign
Definition: dqt_zlumi_pandas.py:41
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
top::OtherCPTools::m_grlTool
ToolHandle< IGoodRunsListSelectionTool > m_grlTool
Definition: TopOtherCPTools.h:40
top::OtherCPTools::m_pmg_sherpa22_vjets_tool
ToolHandle< PMGTools::PMGSherpa22VJetsWeightTool > m_pmg_sherpa22_vjets_tool
Definition: TopOtherCPTools.h:42
PMGTools::PMGSherpa22VJetsWeightTool
Definition: PMGSherpa22VJetsWeightTool.h:33
top::OtherCPTools::m_pmg_weightTool
ToolHandle< PMGTools::IPMGTruthWeightTool > m_pmg_weightTool
Definition: TopOtherCPTools.h:43
CP::IPileupReweightingTool
Definition: IPileupReweightingTool.h:29