diff --git a/PhysicsAnalysis/PrimaryDPDMaker/CMakeLists.txt b/PhysicsAnalysis/PrimaryDPDMaker/CMakeLists.txt index 94a85c4f67d3a7f11a9e3873807f275f17b2c2c7..103934131262b7c2634838dea1d4b23d8524f424 100644 --- a/PhysicsAnalysis/PrimaryDPDMaker/CMakeLists.txt +++ b/PhysicsAnalysis/PrimaryDPDMaker/CMakeLists.txt @@ -35,6 +35,7 @@ atlas_depends_on_subdirs( PUBLIC InnerDetector/InDetRecEvent/InDetRIO_OnTrack LArCalorimeter/LArRecEvent PhysicsAnalysis/AnalysisTrigger/AnalysisTriggerEvent + PhysicsAnalysis/MuonID/MuonSelectorTools Reconstruction/Jet/JetEvent Reconstruction/MuonIdentification/muonEvent Reconstruction/egamma/egammaEvent @@ -60,18 +61,18 @@ atlas_add_library( PrimaryDPDMakerLib PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} DEFINITIONS ${CLHEP_DEFINITIONS} LINK_LIBRARIES ${CLHEP_LIBRARIES} CaloEvent AthenaBaseComps AthenaKernel AthLinks AthContainers IRegionSelector Identifier EventKernel GaudiKernel InDetIdentifier InDetReadoutGeometry InDetPrepRawData Particle TrkTrack TrkToolInterfaces StoreGateLib SGtests - PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} RoiDescriptor FourMom FourMomUtils NavFourMom xAODEventInfo xAODMuon xAODTracking InDetRIO_OnTrack LArRecEvent AnalysisTriggerEvent JetEvent muonEvent egammaEvent tauEvent TileEvent TileIdentifier TrkParameters TrkParticleBase TrkPseudoMeasurementOnTrack TrkTrackSummary VxVertex ) + PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} RoiDescriptor FourMom FourMomUtils NavFourMom xAODEventInfo xAODMuon xAODTracking InDetRIO_OnTrack LArRecEvent AnalysisTriggerEvent MuonSelectorToolsLib JetEvent muonEvent egammaEvent tauEvent TileEvent TileIdentifier TrkParameters TrkParticleBase TrkPseudoMeasurementOnTrack TrkTrackSummary VxVertex ) atlas_add_component( PrimaryDPDMaker src/components/*.cxx INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} CaloEvent AthenaBaseComps AthenaKernel AthLinks AthContainers StoreGateLib SGtests IRegionSelector Identifier EventKernel GaudiKernel InDetIdentifier InDetReadoutGeometry InDetPrepRawData Particle TrkTrack TrkToolInterfaces RoiDescriptor FourMom FourMomUtils NavFourMom xAODEventInfo xAODMuon xAODTracking InDetRIO_OnTrack LArRecEvent AnalysisTriggerEvent JetEvent muonEvent egammaEvent tauEvent TileEvent TileIdentifier TrkParameters TrkParticleBase TrkPseudoMeasurementOnTrack TrkTrackSummary VxVertex PrimaryDPDMakerLib ) + LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} CaloEvent AthenaBaseComps AthenaKernel AthLinks AthContainers StoreGateLib SGtests IRegionSelector Identifier EventKernel GaudiKernel InDetIdentifier InDetReadoutGeometry InDetPrepRawData Particle TrkTrack TrkToolInterfaces RoiDescriptor FourMom FourMomUtils NavFourMom xAODEventInfo xAODMuon xAODTracking InDetRIO_OnTrack LArRecEvent AnalysisTriggerEvent MuonSelectorToolsLib JetEvent muonEvent egammaEvent tauEvent TileEvent TileIdentifier TrkParameters TrkParticleBase TrkPseudoMeasurementOnTrack TrkTrackSummary VxVertex PrimaryDPDMakerLib ) atlas_add_dictionary( PrimaryDPDMakerDict PrimaryDPDMaker/PrimaryDPDMakerDict.h PrimaryDPDMaker/selection.xml INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} CaloEvent AthenaBaseComps AthenaKernel AthLinks AthContainers StoreGateLib SGtests IRegionSelector Identifier EventKernel GaudiKernel InDetIdentifier InDetReadoutGeometry InDetPrepRawData Particle TrkTrack TrkToolInterfaces RoiDescriptor FourMom FourMomUtils NavFourMom xAODEventInfo xAODMuon xAODTracking InDetRIO_OnTrack LArRecEvent AnalysisTriggerEvent JetEvent muonEvent egammaEvent tauEvent TileEvent TileIdentifier TrkParameters TrkParticleBase TrkPseudoMeasurementOnTrack TrkTrackSummary VxVertex PrimaryDPDMakerLib ) + LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} CaloEvent AthenaBaseComps AthenaKernel AthLinks AthContainers StoreGateLib SGtests IRegionSelector Identifier EventKernel GaudiKernel InDetIdentifier InDetReadoutGeometry InDetPrepRawData Particle TrkTrack TrkToolInterfaces RoiDescriptor FourMom FourMomUtils NavFourMom xAODEventInfo xAODMuon xAODTracking InDetRIO_OnTrack LArRecEvent AnalysisTriggerEvent MuonSelectorToolsLib JetEvent muonEvent egammaEvent tauEvent TileEvent TileIdentifier TrkParameters TrkParticleBase TrkPseudoMeasurementOnTrack TrkTrackSummary VxVertex PrimaryDPDMakerLib ) # Install files from the package: atlas_install_python_modules( python/*.py ) diff --git a/PhysicsAnalysis/PrimaryDPDMaker/PrimaryDPDMaker/DRAW_ZMUMUSkimmingTool.h b/PhysicsAnalysis/PrimaryDPDMaker/PrimaryDPDMaker/DRAW_ZMUMUSkimmingTool.h new file mode 100644 index 0000000000000000000000000000000000000000..9092750caa730b84cfef4dff0d064178791ca742 --- /dev/null +++ b/PhysicsAnalysis/PrimaryDPDMaker/PrimaryDPDMaker/DRAW_ZMUMUSkimmingTool.h @@ -0,0 +1,62 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/////////////////////////////////////////////////////////////////// +// DRAW_ZMUMUSkimmingTool.h, (c) ATLAS Detector software +/////////////////////////////////////////////////////////////////// + +#ifndef DERIVATIONFRAMEWORK_SKIMMINGTOOLEXAMPLE_H +#define DERIVATIONFRAMEWORK_SKIMMINGTOOLEXAMPLE_H 1 + +#include<string> + +// Gaudi & Athena basics +#include "AthenaBaseComps/AthAlgTool.h" + +// DerivationFramework includes +#include "DerivationFrameworkInterfaces/ISkimmingTool.h" + +namespace CP { + class IMuonSelectionTool; +} + +namespace DerivationFramework { + + /** @class DRAW_ZMUMUSkimmingTool + + the code used in this implementation is kindly stolen from: + atlasoff:: ISF/ISF_Core/ISF_Tools + + @author James Catmore -at- cern.ch + */ + class DRAW_ZMUMUSkimmingTool : public AthAlgTool, public ISkimmingTool { + + public: + /** Constructor with parameters */ + DRAW_ZMUMUSkimmingTool( const std::string& t, const std::string& n, const IInterface* p ); + + /** Destructor */ + ~DRAW_ZMUMUSkimmingTool(); + + // Athena algtool's Hooks + StatusCode initialize(); + StatusCode finalize(); + + /** Check that the current event passes this filter */ + virtual bool eventPassesFilter() const; + + private: + mutable unsigned int m_ntot; + mutable unsigned int m_npass; + std::string m_muonSGKey; + ToolHandle<CP::IMuonSelectionTool> m_muonSelectionTool; + unsigned int m_nMuons; + double m_muonPtCut; + + }; + +} + + +#endif diff --git a/PhysicsAnalysis/PrimaryDPDMaker/share/DRAW_ZMUMU.py b/PhysicsAnalysis/PrimaryDPDMaker/share/DRAW_ZMUMU.py index 89c79087f83dc7f03e9d52e601187db056edc161..e51d461b707c48f18ec1d2942bb2ab53d4be65dc 100644 --- a/PhysicsAnalysis/PrimaryDPDMaker/share/DRAW_ZMUMU.py +++ b/PhysicsAnalysis/PrimaryDPDMaker/share/DRAW_ZMUMU.py @@ -35,11 +35,21 @@ dimuonMassSkimmingTool = DerivationFramework__xAODStringSkimmingTool(name = "DRA expression = dimuonMassString) ToolSvc += dimuonMassSkimmingTool -# Tightening by requiring at least one good (i.e. preselected) muon and either a single-muon or dimuon trigger to have passed -from DerivationFrameworkMuons.MuonsCommon import * -goodMuonString = 'count((Muons.DFCommonGoodMuon) && (Muons.pt > 20*GeV)) >= 1' -goodMuonSkimmingTool = DerivationFramework__xAODStringSkimmingTool(name = "DRAW_ZMUMU_GoodMuon_SkimmingTool", - expression = goodMuonString) +# Muon selector tool +from MuonSelectorTools.MuonSelectorToolsConf import CP__MuonSelectionTool +goodMuonTool = CP__MuonSelectionTool(name = "DRAW_ZMUMU_MuonsSelector") +goodMuonTool.MaxEta = 3. +goodMuonTool.MuQuality = 3 +# turn of the momentum correction which is not needed for IDHits cut and Preselection +goodMuonTool.TurnOffMomCorr = True +ToolSvc += goodMuonTool +print goodMuonTool +from PrimaryDPDMaker.PrimaryDPDMakerConf import DerivationFramework__DRAW_ZMUMUSkimmingTool +goodMuonSkimmingTool = DerivationFramework__DRAW_ZMUMUSkimmingTool(name = "DRAW_ZMUMU_GoodMuon_SkimmingTool", + MuonContainerKey = "Muons", + MuonSelectorTool = goodMuonTool, + MinimumNumberOfMuons = 1, + MuonPtCut = 20.0) ToolSvc += goodMuonSkimmingTool periods = TriggerPeriod.future | TriggerPeriod.y2015 | TriggerPeriod.y2016 | TriggerPeriod.y2017 diff --git a/PhysicsAnalysis/PrimaryDPDMaker/src/DRAW_ZMUMU_SkimmingTool.cxx b/PhysicsAnalysis/PrimaryDPDMaker/src/DRAW_ZMUMU_SkimmingTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..df51466fd310d216e72e6166c808ec04a80671ac --- /dev/null +++ b/PhysicsAnalysis/PrimaryDPDMaker/src/DRAW_ZMUMU_SkimmingTool.cxx @@ -0,0 +1,82 @@ +/* + Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration +*/ + +///////////////////////////////////////////////////////////////// +// DRAW_ZMUMUSkimmingTool.cxx +/////////////////////////////////////////////////////////////////// +// Author: James Catmore (James.Catmore@cern.ch) +// This tool implements the "good muon" event selection required +// by the DRAW_ZMUMU format, avoiding the use of decorators on the +// muons. Inherits from derivation framework components. + +#include "PrimaryDPDMaker/DRAW_ZMUMUSkimmingTool.h" +#include "xAODMuon/MuonContainer.h" +#include "MuonSelectorTools/IMuonSelectionTool.h" +#include <vector> +#include <string> + +// Constructor +DerivationFramework::DRAW_ZMUMUSkimmingTool::DRAW_ZMUMUSkimmingTool( const std::string& t, + const std::string& n, + const IInterface* p ) : + AthAlgTool(t,n,p), + m_ntot(0), + m_npass(0), + m_muonSGKey("Muons"), + m_muonSelectionTool("CP::MuonSelectionTool/MuonSelectionTool"), + m_nMuons(1), + m_muonPtCut(20.0) + { + declareInterface<DerivationFramework::ISkimmingTool>(this); + declareProperty("MuonContainerKey", m_muonSGKey); + declareProperty("MuonSelectorTool", m_muonSelectionTool); + declareProperty("MinimumNumberOfMuons", m_nMuons); + declareProperty("MuonPtCut", m_muonPtCut); + } + +// Destructor +DerivationFramework::DRAW_ZMUMUSkimmingTool::~DRAW_ZMUMUSkimmingTool() { +} + +// Athena initialize and finalize +StatusCode DerivationFramework::DRAW_ZMUMUSkimmingTool::initialize() +{ + ATH_MSG_VERBOSE("initialize() ..."); + return StatusCode::SUCCESS; +} +StatusCode DerivationFramework::DRAW_ZMUMUSkimmingTool::finalize() +{ + ATH_MSG_VERBOSE("finalize() ..."); + ATH_MSG_INFO("Processed "<< m_ntot <<" events, "<< m_npass<<" events passed filter "); + return StatusCode::SUCCESS; +} + +// The filter itself +bool DerivationFramework::DRAW_ZMUMUSkimmingTool::eventPassesFilter() const +{ + ++m_ntot; + + // Retrieve muon container + const xAOD::MuonContainer* muons(0); + StatusCode sc = evtStore()->retrieve(muons,m_muonSGKey); + if (sc.isFailure()) { + ATH_MSG_ERROR("No muon collection with name " << m_muonSGKey << " found in StoreGate!"); + return(false); + } + + // Loop over muons, count up and set decision + xAOD::MuonContainer::const_iterator muItr; + unsigned int nGoodMu(0); + for (muItr=muons->begin(); muItr!=muons->end(); ++muItr) { + if ( m_muonSelectionTool->accept(**muItr) && (*muItr)->pt() > m_muonPtCut ) ++nGoodMu; + } + bool acceptEvent(false); + if (nGoodMu >= m_nMuons) { + acceptEvent = true; + ++m_npass; + } + return acceptEvent; + +} + diff --git a/PhysicsAnalysis/PrimaryDPDMaker/src/components/PrimaryDPDMaker_entries.cxx b/PhysicsAnalysis/PrimaryDPDMaker/src/components/PrimaryDPDMaker_entries.cxx index d95193c1b7ba9df3ec77fa7ebe1a885a80ddfdae..dfc908783ea40da93dc7378376f83022de74d8fc 100644 --- a/PhysicsAnalysis/PrimaryDPDMaker/src/components/PrimaryDPDMaker_entries.cxx +++ b/PhysicsAnalysis/PrimaryDPDMaker/src/components/PrimaryDPDMaker_entries.cxx @@ -6,6 +6,7 @@ #include "PrimaryDPDMaker/CollisionFilterAlg.h" #include "PrimaryDPDMaker/muonTrkTrackThinTool.h" #include "PrimaryDPDMaker/CaloCellThinningTool.h" +#include "PrimaryDPDMaker/DRAW_ZMUMUSkimmingTool.h" using namespace DerivationFramework; @@ -17,4 +18,4 @@ DECLARE_COMPONENT( MBTSTimeFilterTool ) DECLARE_COMPONENT( CaloTimeFilterTool ) DECLARE_COMPONENT( BCIDFilterTool ) DECLARE_COMPONENT( CaloCellThinningTool ) - +DECLARE_COMPONENT( DRAW_ZMUMUSkimmingTool )