diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.cxx b/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.cxx index 8ad41171aeb081c02a64dce82e9c4e814a3bef18..99cc4192131240eb8c59359ea581c8ff78ad969e 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.cxx +++ b/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.cxx @@ -6,7 +6,6 @@ #include "MuonSegment/MuonSegment.h" #include "TrkTrack/Track.h" #include "TrkMeasurementBase/MeasurementBase.h" -#include "TrkTruthData/PRD_MultiTruthCollection.h" #include "HepMC/GenParticle.h" #include <iostream> #include "TTree.h" @@ -29,16 +28,11 @@ namespace Muon { m_level(0) { declareInterface<IMuonTruthSummaryTool>(this); - declareProperty("CSC_TruthName", m_CSC_TruthName = "CSC_TruthMap"); - declareProperty("RPC_TruthName", m_RPC_TruthName = "RPC_TruthMap"); - declareProperty("TGC_TruthName", m_TGC_TruthName = "TGC_TruthMap"); - declareProperty("MDT_TruthName", m_MDT_TruthName = "MDT_TruthMap"); - declareProperty("MM_TruthName", m_MM_TruthName = "MM_TruthMap"); - declareProperty("STGC_TruthName", m_STGC_TruthName = "STGC_TruthMap"); declareProperty("WriteNtuple", m_writeTree); declareProperty("NtupleTreeName", m_treeName = "MuonTruthSummaryTree"); declareProperty("HistStream", m_histStream = "Summary"); declareProperty("SelectedPdgId", m_selectedPdgId = 13, "Should be positive as absolute value is used" ); + declareProperty("UseNSW", m_useNSW=false); } StatusCode MuonTruthSummaryTool::initialize() @@ -93,6 +87,13 @@ namespace Muon { ATH_MSG_WARNING("SelectedPdgId should be positive, taking the absolute value"); m_selectedPdgId = abs(m_selectedPdgId); } + + if(m_useNSW){ + m_TruthNames.emplace_back("MM_TruthMap"); + m_TruthNames.emplace_back("STGC_TruthMap"); + } + else m_TruthNames.emplace_back("CSC_TruthMap"); + ATH_CHECK(m_TruthNames.initialize()); return StatusCode::SUCCESS; } @@ -113,35 +114,26 @@ namespace Muon { } void MuonTruthSummaryTool::init() const { - getTruth(m_CSC_TruthName); - getTruth(m_RPC_TruthName); - getTruth(m_TGC_TruthName); - getTruth(m_MDT_TruthName); - getTruth(m_MM_TruthName); - getTruth(m_STGC_TruthName); + getTruth(); m_wasInit = true; ATH_MSG_DEBUG(" Total collected muon truth hits " << m_truthHits.size() ); } - void MuonTruthSummaryTool::getTruth(std::string name ) const { - const PRD_MultiTruthCollection* col = 0; - - if( !evtStore()->contains<PRD_MultiTruthCollection>(name) ) return; + void MuonTruthSummaryTool::getTruth() const { - if( evtStore()->retrieve(col, name).isFailure() || !col ) { - ATH_MSG_WARNING( "PRD_MultiTruthCollection " << name << " NOT found"); - return; - } - ATH_MSG_DEBUG( "PRD_MultiTruthCollection " << name << " found"); - PRD_MultiTruthCollection::const_iterator it = col->begin(); - PRD_MultiTruthCollection::const_iterator it_end = col->end(); - for( ;it!=it_end;++it ){ - const HepMcParticleLink& link = it->second; - if( link.cptr() && - (abs(link.cptr()->pdg_id()) == m_selectedPdgId || abs(link.cptr()->pdg_id()) == 13 ) ) { - m_truthHits[it->first] = link.cptr()->barcode(); - m_pdgIdLookupFromBarcode[link.cptr()->barcode()]=link.cptr()->pdg_id(); + for(SG::ReadHandle<PRD_MultiTruthCollection>& col : m_TruthNames.makeHandles()){ + if(!col.isValid() || !col.isPresent()) continue; + ATH_MSG_DEBUG( "PRD_MultiTruthCollection " << col.key() << " found"); + PRD_MultiTruthCollection::const_iterator it = col->begin(); + PRD_MultiTruthCollection::const_iterator it_end = col->end(); + for( ;it!=it_end;++it ){ + const HepMcParticleLink& link = it->second; + if( link.cptr() && + (abs(link.cptr()->pdg_id()) == m_selectedPdgId || abs(link.cptr()->pdg_id()) == 13 ) ) { + m_truthHits[it->first] = link.cptr()->barcode(); + m_pdgIdLookupFromBarcode[link.cptr()->barcode()]=link.cptr()->pdg_id(); + } } } } diff --git a/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.h b/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.h index d7f5b3143d7a8d6fdb50a31d3b67cd75164a4551..2b3b4a689dc60cd887947d438dc77c5dfe12dd33 100644 --- a/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.h +++ b/MuonSpectrometer/MuonReconstruction/MuonRecTools/MuonTruthTools/src/MuonTruthSummaryTool.h @@ -11,7 +11,9 @@ #include "MuonIdHelpers/MuonIdHelperTool.h" #include "MuonRecHelperTools/MuonEDMPrinterTool.h" #include "MuonRecHelperTools/MuonEDMHelperTool.h" +#include "TrkTruthData/PRD_MultiTruthCollection.h" #include "GaudiKernel/IIncidentListener.h" +#include "StoreGate/ReadHandleKeyArray.h" #include <string> #include <set> #include <map> @@ -69,7 +71,7 @@ namespace Muon { /** add measurements */ void add( const std::vector<const Trk::MeasurementBase*>& measurements, int level ); - void getTruth(std::string name ) const; + void getTruth() const; std::string printSummary( const std::set<Identifier>& truth, const std::set<Identifier>& found ); ToolHandle<MuonIdHelperTool> m_idHelper; @@ -77,13 +79,9 @@ namespace Muon { ToolHandle<MuonEDMPrinterTool> m_printer; ServiceHandle< IIncidentSvc > m_incidentSvc; mutable bool m_wasInit; + bool m_useNSW; - std::string m_CSC_TruthName; - std::string m_RPC_TruthName; - std::string m_TGC_TruthName; - std::string m_MDT_TruthName; - std::string m_MM_TruthName; - std::string m_STGC_TruthName; + SG::ReadHandleKeyArray<PRD_MultiTruthCollection> m_TruthNames{this,"TruthNames",{"RPC_TruthMap","TGC_TruthMap","MDT_TruthMap"},"truth names"}; mutable std::map<int,int> m_pdgIdLookupFromBarcode; mutable std::map<Identifier,int> m_truthHits; // map containing truth hits associated with muons, stores barcode as second element diff --git a/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.cxx b/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.cxx index e07f109542040eaf44a04446746520e6ff51dbaa..bf65ff876729321a3528bb8618839b66468c5da8 100644 --- a/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.cxx +++ b/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.cxx @@ -63,7 +63,8 @@ namespace Muon { declareProperty("Extrapolator",m_extrapolator ); declareProperty("MatchTool",m_matchingTool ); declareProperty("MuonHitTimingTool",m_hitTimingTool ); - declareProperty("IncidentSvc",m_incidentSvc ); + declareProperty("IncidentSvc",m_incidentSvc ); + declareProperty("isMC",m_isMC=false); } MuonRecoValidationTool::~MuonRecoValidationTool() { @@ -76,7 +77,12 @@ namespace Muon { ATH_CHECK(m_edmHelper.retrieve()); ATH_CHECK(m_segmentHitSummaryTool.retrieve()); ATH_CHECK(m_hitSummaryTool.retrieve()); - ATH_CHECK(m_truthSummaryTool.retrieve()); + if(m_isMC){ + ATH_CHECK(m_truthSummaryTool.retrieve()); + } + else{ + m_truthSummaryTool.disable(); + } ATH_CHECK(m_extrapolator.retrieve()); ATH_CHECK(m_matchingTool.retrieve()); ATH_CHECK(m_hitTimingTool.retrieve()); @@ -164,6 +170,8 @@ namespace Muon { int MuonRecoValidationTool::getBarcode( const std::set<Identifier>& ids ) const { + if(!m_isMC) return -1; + // count how often a barcode occurs std::map<int,int> counters; for( std::set<Identifier>::const_iterator it=ids.begin();it!=ids.end();++it ){ @@ -211,8 +219,11 @@ namespace Muon { stauHit.propagationTime, stauHit.e, tof, 0., stauHit.shift, 1000 * m_candidateCounter); // barcode + pdg - int barcode = m_truthSummaryTool->getBarcode(id); - int pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + int barcode=-1,pdg=0; + if(m_isMC){ + barcode = m_truthSummaryTool->getBarcode(id); + pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + } m_ntuple.timeBlock.truth.fill(pdg,barcode); } ++m_candidateCounter; @@ -232,8 +243,11 @@ namespace Muon { m_ntuple.timeBlock.fill(2,m_idHelper->gasGapId(id).get_identifier32().get_compact(),gpos.perp(),gpos.z(),time,errorTime); // barcode + pdg - int barcode = m_truthSummaryTool->getBarcode(id); - int pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + int barcode=-1,pdg=0; + if(m_isMC){ + barcode = m_truthSummaryTool->getBarcode(id); + pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + } m_ntuple.timeBlock.truth.fill(pdg,barcode); return true; @@ -261,7 +275,8 @@ namespace Muon { std::vector<const MuonClusterOnTrack*> clusters; extract(*seg,ids,clusters); int barcode = getBarcode(ids); - int pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + int pdg=0; + if(m_isMC) pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; m_ntuple.timeBlock.truth.fill(pdg,barcode); return true; @@ -277,8 +292,11 @@ namespace Muon { // barcode + pdg - int barcode = m_truthSummaryTool->getBarcode(id); - int pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + int barcode=-1,pdg=0; + if(m_isMC){ + barcode = m_truthSummaryTool->getBarcode(id); + pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + } m_ntuple.timeBlock.truth.fill(pdg,barcode); bool measphi = m_idHelper->measuresPhi(id); @@ -352,7 +370,8 @@ namespace Muon { // barcode + pdg int barcode = getBarcode(ids); - int pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + int pdg=0; + if(m_isMC) pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; m_ntuple.segmentBlock.truth.fill(pdg,barcode); m_ntuple.segmentBlock.track.fill(getIndex(intersection)); @@ -425,8 +444,11 @@ namespace Muon { ids.insert((*hit)->prd->identify()); } } - int barcode = getBarcode(ids); - int pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + int barcode=-1,pdg=0; + if(m_isMC){ + barcode = getBarcode(ids); + pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + } m_ntuple.houghBlock.truth.fill(pdg,barcode); ATH_MSG_DEBUG(" Adding Hough maximum to ntuple "); @@ -441,8 +463,11 @@ namespace Muon { m_ntuple.hitBlock.id.fill(m_idHelper->sector(id),m_idHelper->chamberIndex(id)); m_ntuple.hitBlock.track.fill(getIndex(intersection)); - int barcode = m_truthSummaryTool->getBarcode(id); - int pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + int barcode=-1,pdg=0; + if(m_isMC){ + barcode = m_truthSummaryTool->getBarcode(id); + pdg = barcode != -1 ? m_truthSummaryTool->getPdgId(barcode) : 0; + } m_ntuple.hitBlock.truth.fill(pdg,barcode); float sign = expos < 0 ? -1. : 1.; diff --git a/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.h b/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.h index 54eb3dcd28e82443a7c91233ce91a6bda87a3bc0..ad783a294987e0462f65e7ce4cee3b2f1deb067e 100644 --- a/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.h +++ b/MuonSpectrometer/MuonValidation/MuonRecValidation/MuonTrackPerformance/src/MuonRecoValidationTool.h @@ -119,6 +119,8 @@ namespace Muon { TTree* m_tree; unsigned int m_candidateCounter; + + bool m_isMC; }; } diff --git a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py index 62e0b6fb2705371e08359f351296fd272729fb0c..8cf4920ee27ea5b22ac9304e8013c0581c26a606 100644 --- a/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py +++ b/Reconstruction/MuonIdentification/MuonCombinedRecExample/python/MuGirlTagTool.py @@ -4,6 +4,7 @@ from AthenaCommon import CfgMgr from AthenaCommon.CfgGetter import getPublicTool,getService +from AthenaCommon.GlobalFlags import globalflags from RecExConfig.RecFlags import rec @@ -48,6 +49,8 @@ def MuonLayerAmbiguitySolverTool( name="MuonLayerAmbiguitySolverTool",**kwargs): return CfgMgr.Muon__MuonLayerAmbiguitySolverTool(name,**kwargs) def MuonRecoValidationTool( name="MuonRecoValidationTool",**kwargs): + if globalflags.DataSource() != 'data': + kwargs.setdefault("isMC",True) return CfgMgr.Muon__MuonRecoValidationTool(name,**kwargs) def DCMathStauSegmentMaker( name="DCMathStauSegmentMaker", **kwargs ):