Skip to content
Snippets Groups Projects
Commit 56eda117 authored by Magnar Kopangen Bugge's avatar Magnar Kopangen Bugge Committed by Walter Lampl
Browse files

MuonSelectorToolsTester updates

parent 296d1e85
No related branches found
No related tags found
No related merge requests found
......@@ -39,8 +39,9 @@ endif()
# Test(s) in the package:
if( XAOD_STANDALONE )
atlas_add_test( ut_MuonSelectorToolsTester_data
SOURCES test/ut_MuonSelectorToolsTester_data.cxx
LINK_LIBRARIES AsgMessagingLib )
SCRIPT test/ut_MuonSelectorToolsTester_data.sh )
atlas_add_test( ut_MuonSelectorToolsTester_MC
SCRIPT test/ut_MuonSelectorToolsTester_MC.sh )
endif()
# Install files from the package:
......
#!/bin/sh
echo "Unit test for MuonSelectorTools on MC"
echo "Test files:"
env | grep ASG_TEST_FILE_ | sort
echo "Will now run this command: MuonSelectorToolsTester $ASG_TEST_FILE_MC"
MuonSelectorToolsTester $ASG_TEST_FILE_MC
/*
Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
*/
#include <AsgMessaging/MessageCheck.h>
#include <cstdlib>
#include <iostream>
int main() {
using namespace asg::msgUserCode;
ATH_MSG_INFO("Unit test for MuonSelectorTools on data");
// Full `env` makes log file diffs useless. Check if the input file changed, though - points us quickly to an issue.
ATH_MSG_INFO("Test files");
system("env | grep ASG_TEST_FILE_ | sort");
std::string cmd("MuonSelectorToolsTester $ASG_TEST_FILE_DATA");
ATH_MSG_INFO("Will now run this command: " << cmd);
int ret = system(cmd.c_str());
if (ret != 0) {
ATH_MSG_ERROR("Test failed (return code was " << ret << ")");
return 1;
}
ATH_MSG_INFO("Finished (return code was " << ret << ")");
return 0;
}
#!/bin/sh
echo "Unit test for MuonSelectorTools on data"
echo "Test files:"
env | grep ASG_TEST_FILE_ | sort
echo "Will now run this command: MuonSelectorToolsTester $ASG_TEST_FILE_DATA"
MuonSelectorToolsTester $ASG_TEST_FILE_DATA
......@@ -39,7 +39,6 @@
#include "xAODCore/tools/ReadStats.h"
// Truth classification
#include "MCTruthClassifier/MCTruthClassifier.h"
#include "MCTruthClassifier/MCTruthClassifierDefs.h"
/// Example of how to run the MuonSelectorTools package to obtain information from muons
......@@ -84,9 +83,9 @@ int main(int argc, char* argv[]) {
std::vector<std::unique_ptr<CP::MuonSelectionTool> > selectorTools;
selectorTools.clear();
const int Nwp = 6; // number of working points (tool instances)
const int Nwp = 7; // number of working points (tool instances)
std::vector<std::string> WPnames = {"Tight", "Medium", "Loose", "VeryLoose", "HighPt", "LowPt"};
std::vector<std::string> WPnames = {"Tight", "Medium", "Loose", "VeryLoose", "HighPt", "LowPt", "LowPtMVA"};
for (int wp = 0; wp < Nwp; wp++) {
Info(APP_NAME, "Creating selector tool for working point: %s ...", WPnames[wp].c_str());
......@@ -95,7 +94,14 @@ int main(int argc, char* argv[]) {
muonSelection->msg().setLevel(MSG::INFO);
CHECK(muonSelection->setProperty("MaxEta", 2.7));
CHECK(muonSelection->setProperty("MuQuality", wp));
if (WPnames[wp] == "LowPtMVA") {
CHECK (muonSelection->setProperty( "MuQuality", 5));
CHECK (muonSelection->setProperty( "UseMVALowPt", true));
}
else
CHECK(muonSelection->setProperty("MuQuality", wp));
CHECK(muonSelection->setProperty("TurnOffMomCorr", true));
CHECK(muonSelection->initialize());
......@@ -167,6 +173,52 @@ int main(int argc, char* argv[]) {
for (int type = 0; type < Ntype; type++)
for (int wp = 0; wp < Nwp; wp++) selectedMuonsTypeNotBad[type][wp] = 0;
// Obtain summary information also split by primary author
const int Nauthor = xAOD::Muon::NumberOfMuonAuthors;
std::string authorNames[Nauthor];
for (int author = 0; author < Nauthor; author++) {
if (author == xAOD::Muon::MuidCo)
authorNames[author] = "MuidCo";
else if (author == xAOD::Muon::STACO)
authorNames[author] = "STACO";
else if (author == xAOD::Muon::MuTag)
authorNames[author] = "MuTag";
else if (author == xAOD::Muon::MuTagIMO)
authorNames[author] = "MuTagIMO";
else if (author == xAOD::Muon::MuidSA)
authorNames[author] = "MuidSA";
else if (author == xAOD::Muon::MuGirl)
authorNames[author] = "MuGirl";
else if (author == xAOD::Muon::MuGirlLowBeta)
authorNames[author] = "MuGirlLowBeta";
else if (author == xAOD::Muon::CaloTag)
authorNames[author] = "CaloTag";
else if (author == xAOD::Muon::CaloLikelihood)
authorNames[author] = "CaloLikelihood";
else if (author == xAOD::Muon::CaloScore)
authorNames[author] = "CaloScore";
else if (author == xAOD::Muon::ExtrapolateMuonToIP)
authorNames[author] = "ExtrapolateMuonToIP";
else
authorNames[author] = "unknown";
}
// Muon counters for each author
int allMuonsAuthor[Nauthor];
for (int author = 0; author < Nauthor; author++) allMuonsAuthor[author] = 0;
// Muon counters for muons of each author passing each working point
int selectedMuonsAuthor[Nauthor][Nwp];
for (int author = 0; author < Nauthor; author++)
for (int wp = 0; wp < Nwp; wp++) selectedMuonsAuthor[author][wp] = 0;
int selectedMuonsAuthorNotBad[Nauthor][Nwp];
for (int author = 0; author < Nauthor; author++)
for (int wp = 0; wp < Nwp; wp++) selectedMuonsAuthorNotBad[author][wp] = 0;
// Obtain summary information also split by muon |eta|
const int Neta = 4;
double etaCuts[Neta - 1] = {1.0, 2.0, 2.5};
......@@ -204,10 +256,8 @@ int main(int argc, char* argv[]) {
for (int truthType = 0; truthType < NtruthType; truthType++)
for (int wp = 0; wp < Nwp; wp++) selectedMuonsTruthTypeNotBad[truthType][wp] = 0;
// Truth classifier
//To determine whether to print truth classification table
bool isMC = false;
MCTruthClassifier truthClassifier("truthClassifier");
CHECK(truthClassifier.initialize());
// Loop over the events:
for (Long64_t entry = 0; entry < entries; ++entry) {
......@@ -253,6 +303,7 @@ int main(int argc, char* argv[]) {
allMuons++;
allMuonsType[(*mu_itr)->muonType()]++;
allMuonsAuthor[(*mu_itr)->author()]++;
allMuonsEta[etaIndex]++;
muCounter++;
......@@ -260,17 +311,16 @@ int main(int argc, char* argv[]) {
// Check truth origin
isMC = ei->eventType(xAOD::EventInfo::IS_SIMULATION);
std::pair<MCTruthPartClassifier::ParticleType, MCTruthPartClassifier::ParticleOrigin> truthClassification =
truthClassifier.particleTruthClassifier(*mu_itr);
int truthClass = isMC ? (*mu_itr)->auxdata<int>("truthType") : -999;
int truthType;
if (truthClassification.first == MCTruthPartClassifier::IsoMuon)
if (truthClass == MCTruthPartClassifier::IsoMuon)
truthType = 0;
else if (truthClassification.first == MCTruthPartClassifier::NonIsoMuon)
else if (truthClass == MCTruthPartClassifier::NonIsoMuon)
truthType = 1;
else if (truthClassification.first == MCTruthPartClassifier::Hadron)
else if (truthClass == MCTruthPartClassifier::Hadron)
truthType = 2;
else if (truthClassification.first == MCTruthPartClassifier::BkgMuon)
else if (truthClass == MCTruthPartClassifier::BkgMuon)
truthType = 3;
else
truthType = 4;
......@@ -287,10 +337,11 @@ int main(int argc, char* argv[]) {
my_quality = selectorTools[0]->getQuality(**mu_itr);
// Print some general information about the muon
if (isMC) Info(APP_NAME, "Muon truthType: %d (%s)", truthClassification.first, truthTypeNames[truthType].c_str());
if (isMC) Info(APP_NAME, "Muon truthType: %d (%s)", truthClass, truthTypeNames[truthType].c_str());
Info(APP_NAME, "Muon pT [GeV]: %g ", std::abs((*mu_itr)->pt()) / 1000.);
Info(APP_NAME, "Muon eta, phi: %g, %g ", (*mu_itr)->eta(), (*mu_itr)->phi());
Info(APP_NAME, "Muon muonType: %d (%s)", (*mu_itr)->muonType(), typeNames[(*mu_itr)->muonType()].c_str());
Info(APP_NAME, "Muon primary author: %d (%s)", (*mu_itr)->author(), authorNames[(*mu_itr)->author()].c_str());
Info(APP_NAME, "Muon quality (from tool, from xAOD): %d, %d", my_quality, (*mu_itr)->quality());
Info(APP_NAME, "Muon passes cuts (ID hits, preselection): %d, %d", passesIDRequirements, passesPreselectionCuts);
......@@ -334,6 +385,7 @@ int main(int argc, char* argv[]) {
selectedMuons[wp]++;
selectedMuonsEvent[wp]++;
selectedMuonsType[(*mu_itr)->muonType()][wp]++;
selectedMuonsAuthor[(*mu_itr)->author()][wp]++;
selectedMuonsTruthType[truthType][wp]++;
selectedMuonsEta[etaIndex][wp]++;
selectionResults += "pass ";
......@@ -342,6 +394,7 @@ int main(int argc, char* argv[]) {
selectedMuonsNotBad[wp]++;
selectedMuonsEventNotBad[wp]++;
selectedMuonsTypeNotBad[(*mu_itr)->muonType()][wp]++;
selectedMuonsAuthorNotBad[(*mu_itr)->author()][wp]++;
selectedMuonsTruthTypeNotBad[truthType][wp]++;
selectedMuonsEtaNotBad[etaIndex][wp]++;
}
......@@ -428,6 +481,54 @@ int main(int argc, char* argv[]) {
}
Info(APP_NAME, "---------------------------------------------------------------------------------------");
// Make table of selected muons by author and working point
Info(APP_NAME, "Selected muons by primary author and working point (numbers in parenthesis include bad muon veto):");
Info(APP_NAME, "---------------------------------------------------------------------------------------");
for (int l = 0; l < Nwp + 2; l++) {
std::string line = "";
if (l == 0) { // line with author names
line += " ";
for (int author = 0; author < Nauthor; author++) {
//Do not print unrepresented authors, since the table can be quite wide
if (allMuonsAuthor[author] == 0) continue;
std::stringstream ss;
ss << std::left << std::setw(16);
ss << authorNames[author];
line += ss.str();
}
} else if (l == 1) { // line for all muons inclusive
line += "All muons: ";
for (int author = 0; author < Nauthor; author++) {
if (allMuonsAuthor[author] == 0) continue;
std::stringstream ss;
ss << std::left << std::setw(16);
ss << std::to_string(allMuonsAuthor[author]);
line += ss.str();
}
} else { // lines for each of the working points
int wp = l - 2;
line += WPnames[wp] + ":" + padding[wp] + " ";
for (int author = 0; author < Nauthor; author++) {
if (allMuonsAuthor[author] == 0) continue;
std::stringstream ss;
ss << std::left << std::setw(16);
ss << (std::to_string(selectedMuonsAuthor[author][wp]) + " (" + std::to_string(selectedMuonsAuthorNotBad[author][wp]) + ")");
line += ss.str();
}
}
Info(APP_NAME, "%s", line.c_str());
}
Info(APP_NAME, "---------------------------------------------------------------------------------------");
// Make table of selected muons by |eta| and working point
Info(APP_NAME, "Selected muons by |eta| and working point (numbers in parenthesis include bad muon veto):");
Info(APP_NAME, "---------------------------------------------------------------------------------------");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment