50int main(
int argc,
char* argv[]) {
55 using namespace msgMMC;
58 bool useCorrectedCopy =
true;
64 Error(
APP_NAME,
"==============================================");
65 Error(
APP_NAME,
"No file name received!");
68 Error(
APP_NAME,
" $> %s [xAOD file name] -n X | X = number of events you want to run on",
APP_NAME);
69 Error(
APP_NAME,
" $> %s [xAOD file name] -event X | X = specific number of the event to run on - for debugging",
APP_NAME);
70 Error(
APP_NAME,
"==============================================");
78 for (
int i = 0; i < argc; i++) { options += (argv[i]); }
82 if (options.find(
"-event") != std::string::npos) {
83 for (
int ipos = 0; ipos < argc; ipos++) {
84 if (std::string(argv[ipos]).compare(
"-event") == 0) {
85 Ievent = atoi(argv[ipos + 1]);
86 Info(
APP_NAME,
"Argument (-event) : Running only on event # %i", Ievent);
93 if (options.find(
"-n") != std::string::npos) {
94 for (
int ipos = 0; ipos < argc; ipos++) {
95 if (std::string(argv[ipos]).compare(
"-n") == 0) {
103 TString limitSys =
"";
104 if (options.find(
"-s") != std::string::npos) {
105 for (
int ipos = 0; ipos < argc; ipos++) {
106 if (std::string(argv[ipos]).compare(
"-s") == 0) {
107 limitSys = TString(argv[ipos + 1]);
114 if (options.find(
"-doSys") != std::string::npos) {
123 std::string fileName = argv[1];
124 Info(
APP_NAME,
"Opening file: %s", fileName.c_str());
125 std::unique_ptr<TFile> ifile(TFile::Open(fileName.c_str(),
"READ"));
126 if (!ifile) Error(
APP_NAME,
"Cannot find file %s", fileName.c_str());
128 std::unique_ptr<TChain> chain = std::make_unique<TChain>(
"CollectionTree",
"CollectionTree");
129 chain->Add(fileName.c_str());
133 Info(
APP_NAME,
"Number of events in the file: %i",
static_cast<int>(event.getEntries()));
139 Long64_t
entries =
event.getEntries();
140 if (fileName.find(
"data") != std::string::npos)
entries = 2000;
152 bool isRun3Geo =
false;
153 if(fileName.find(
"mc21") != std::string::npos) isRun3Geo =
true;
154 if(fileName.find(
"data22") != std::string::npos) isRun3Geo =
true;
158 corrTool.
setProperty(
"IsRun3Geo", isRun3Geo).ignore();
166 bool isDebug =
false;
167 if (
nEvents >= 0 || Ievent >= 0) isDebug =
true;
169 if (isDebug) corrTool.
setProperty(
"OutputLevel", MSG::VERBOSE).ignore();
172 if (
sc.isFailure()) {
173 Error(
APP_NAME,
"Cannot retrieve MuonCorrectionTool");
179 if (
sc.isFailure()) {
180 Error(
APP_NAME,
"Cannot retrieve MuonCorrectionTool");
192 selTool.
setTypeAndName(
"CP::MuonSelectionTool/MuonSelectionTool");
195 selTool.
setProperty(
"IsRun3Geo", isRun3Geo).ignore();
197 selTool.
setProperty(
"MuQuality", (
int)xAOD::Muon::Loose).ignore();
200 if (selTool.
retrieve().isFailure() ||
sc.isFailure()) {
201 Error(
APP_NAME,
"Cannot retrieve MuonSelectionTool");
208 std::vector<CP::SystematicSet> sysList;
216 if(!TString(sysItr->name()).Contains(limitSys) && limitSys.Length() > 0)
continue;
218 sysList.back().insert(*sysItr);
222 std::vector<CP::SystematicSet>::const_iterator sysListItr;
224 msgMMC::ANA_MSG_INFO(
"main() - Systematics are ");
225 for (sysListItr = sysList.begin(); sysListItr != sysList.end(); ++sysListItr) msgMMC::ANA_MSG_INFO(sysListItr->name());
228 Float_t InitPtCB(0.), InitPtID(0.), InitPtMS(0.);
229 Float_t CorrPtCB(0.), CorrPtID(0.), CorrPtMS(0.);
230 Float_t
Eta(0.),
Phi(0.), Charge(0.);
231 Float_t ExpResoCB(0.), ExpResoID(0.), ExpResoMS(0.);
232 long long unsigned int eventNum(0);
235 TFile* outputFile = TFile::Open(
"output.root",
"recreate");
238 std::unordered_map<CP::SystematicSet, TTree*> sysTreeMap;
239 for (sysListItr = sysList.begin(); sysListItr != sysList.end(); ++sysListItr) {
241 std::string treeName =
"test_tree_" + (sysListItr->name().size() == 0 ?
"NOMINAL" : sysListItr->name());
242 TTree* sysTree =
new TTree(treeName.c_str(),
"test tree for MCAST");
245 sysTree->Branch(
"InitPtCB", &InitPtCB,
"InitPtCB/F");
246 sysTree->Branch(
"InitPtID", &InitPtID,
"InitPtID/F");
247 sysTree->Branch(
"InitPtMS", &InitPtMS,
"InitPtMS/F");
248 sysTree->Branch(
"CorrPtCB", &CorrPtCB,
"CorrPtCB/F");
249 sysTree->Branch(
"CorrPtID", &CorrPtID,
"CorrPtID/F");
250 sysTree->Branch(
"CorrPtMS", &CorrPtMS,
"CorrPtMS/F");
251 sysTree->Branch(
"Eta", &Eta,
"Eta/F");
252 sysTree->Branch(
"Phi", &Phi,
"Phi/F");
253 sysTree->Branch(
"Charge", &Charge,
"Charge/F");
254 sysTree->Branch(
"ExpResoCB", &ExpResoCB,
"ExpResoCB/F");
255 sysTree->Branch(
"ExpResoID", &ExpResoID,
"ExpResoID/F");
256 sysTree->Branch(
"ExpResoMS", &ExpResoMS,
"ExpResoMS/F");
257 sysTree->Branch(
"eventNum", &eventNum);
259 sysTreeMap[*sysListItr] = sysTree;
265 for (Long64_t entry = 0; entry <
entries; ++entry) {
268 event.getEntry(entry);
272 ANA_CHECK(event.retrieve(evtInfo,
"EventInfo"));
273 if (Ievent != -1 &&
static_cast<int>(evtInfo->
eventNumber()) != Ievent) {
continue; }
279 ANA_CHECK(event.retrieve(muons,
"Muons"));
282 for (sysListItr = sysList.begin(); sysListItr != sysList.end(); ++sysListItr) {
289 Info(
APP_NAME,
"-----------------------------------------------------------");
290 Info(
APP_NAME,
"Looking at %s systematic", (sysListItr->name()).c_str());
293 if (corrTool->applySystematicVariation(*sysListItr) != StatusCode::SUCCESS) {
294 Error(
APP_NAME,
"Cannot configure muon calibration tool for systematic");
298 for (
auto muon : *muonsCorr) {
300 if (!selTool->accept(*muon)) {
301 if (isDebug) Info(
APP_NAME,
"This muon doesn't pass the ID hits quality cuts");
306 InitPtCB = muon->pt();
308 if (muon->inDetTrackParticleLink().isValid()) {
310 InitPtID = (!id_track) ? 0 : (*id_track)->pt();
313 if (muon->extrapolatedMuonSpectrometerTrackParticleLink().isValid()) {
315 InitPtMS = (!ms_track) ? 0 : (*ms_track)->pt();
320 Charge = muon->charge();
323 if (isDebug) Info(
APP_NAME,
"Selected muon: eta = %g, phi = %g, pt = %g", muon->eta(), muon->phi(), muon->pt() / 1e3);
326 if (muon->primaryTrackParticleLink().isValid()) {
328 ptCB = (!cb_track) ? 0 : (*cb_track)->pt();
331 Info(
APP_NAME,
"Missing primary track particle link for --> CB %g, author: %d, type: %d", ptCB, muon->author(),
335 if (muon->inDetTrackParticleLink().isValid()) {
337 ptID = (!id_track) ? 0 : (*id_track)->pt();
340 if (muon->extrapolatedMuonSpectrometerTrackParticleLink().isValid()) {
342 ptME = (!ms_track) ? 0 : (*ms_track)->pt();
346 Info(
APP_NAME,
"--> CB %g, ID %g, ME %g, author: %d, type: %d", ptCB / 1e3, ptID / 1e3, ptME / 1e3, muon->author(),
352 if (useCorrectedCopy) {
355 if (!corrTool->correctedCopy(*muon, mu)) {
356 Error(
APP_NAME,
"Cannot really apply calibration nor smearing");
360 CorrPtID = InnerDetectorPtAcc (*mu);
361 CorrPtMS = MuonSpectrometerPtAcc (*mu);
364 sysTreeMap[*sysListItr]->Fill();
369 if (!corrTool->applyCorrection(*muon)) {
370 Error(
APP_NAME,
"Cannot really apply calibration nor smearing");
373 CorrPtCB = muon->pt();
374 CorrPtID = InnerDetectorPtAcc (*muon);
375 CorrPtMS = MuonSpectrometerPtAcc (*muon);
376 ExpResoCB = corrTool->expectedResolution(
"CB", *muon,
true);
377 ExpResoID = corrTool->expectedResolution(
"ID", *muon,
true);
378 ExpResoMS = corrTool->expectedResolution(
"MS", *muon,
true);
380 Info(
APP_NAME,
"Calibrated muon: eta = %g, phi = %g, pt(CB) = %g, pt(ID) = %g, pt(MS) = %g", muon->eta(),
381 muon->phi(), muon->pt() / 1e3, CorrPtID / 1e3, CorrPtMS / 1e3);
383 Info(
APP_NAME,
" expReso : ExpResoCB = %g , ExpResoID = %g , ExpResoMS = %g", ExpResoCB, ExpResoID, ExpResoMS);
384 sysTreeMap[*sysListItr]->Fill();
387 if (isDebug) Info(
APP_NAME,
"-----------------------------------------------------------");
389 delete muons_shallowCopy.first;
390 delete muons_shallowCopy.second;
395 "===>>> done processing event #%i, run #%i %i events processed so far <<<===",
static_cast<int>(evtInfo->
eventNumber()),
396 static_cast<int>(evtInfo->
runNumber()),
static_cast<int>(entry + 1));
399 for (sysListItr = sysList.begin(); sysListItr != sysList.end(); ++sysListItr) { sysTreeMap[*sysListItr]->Write(); }