diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py b/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py index d9a225b90343c5549056e169aa45624ea30f7b52..af8466ecde171792f541dc99344b0099bc590d0c 100644 --- a/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py +++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/share/NSWPRDValAlg.digi.py @@ -32,6 +32,9 @@ NSWPRDValAlg.doSTGCFastDigit = False NSWPRDValAlg.doRPCHit = True NSWPRDValAlg.doRPCDigit = True +NSWPRDValAlg.doMDTHit = True +NSWPRDValAlg.doMDTDigit = True + #----------------------------------------------------------------------------- # save ROOT histograms and Tuple #----------------------------------------------------------------------------- diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.cxx b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.cxx new file mode 100644 index 0000000000000000000000000000000000000000..1860bfd0f704ef83fc1f6389e742d2aab5ad75dc --- /dev/null +++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.cxx @@ -0,0 +1,166 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#include "MDTDigitVariables.h" +#include "AthenaKernel/errorcheck.h" + +#include "MuonDigitContainer/MdtDigitContainer.h" +#include "MuonDigitContainer/MdtDigit.h" + +#include "MuonReadoutGeometry/MdtReadoutElement.h" + +#include "MuonDigitContainer/MdtDigitCollection.h" + +#include "TTree.h" +/** ---------- filling of variables */ +/** ---------- to be called on each evt i.e. execute level of main alg */ +StatusCode MdtDigitVariables::fillVariables(const MuonGM::MuonDetectorManager* MuonDetMgr) +{ + ATH_MSG_DEBUG(" do fillMdtDigitVariables()"); + CHECK( this->clearVariables() ); + + const MdtDigitContainer* MdtDigitContainer = nullptr; + CHECK( m_evtStore->retrieve(MdtDigitContainer, m_ContainerName.c_str()) ); + + ATH_MSG_DEBUG("retrieved MDT Digit Container with size "<<MdtDigitContainer->digit_size()); + + if(MdtDigitContainer->size()==0) ATH_MSG_DEBUG(" MDT Digit Continer empty "); + for(const MdtDigitCollection* coll : *MdtDigitContainer) { + ATH_MSG_DEBUG( "processing collection with size " << coll->size() ); + for (unsigned int digitNum=0; digitNum<coll->size(); digitNum++) { + const MdtDigit* digit = coll->at(digitNum); + Identifier Id = digit->identify(); + + std::string stName = m_MdtIdHelper->stationNameString(m_MdtIdHelper->stationName(Id)); + int stationEta = m_MdtIdHelper->stationEta(Id); + int stationPhi = m_MdtIdHelper->stationPhi(Id); + int multiplet = m_MdtIdHelper->multilayer(Id); + int channel = m_MdtIdHelper->channel(Id); + int stationEtaMin = m_MdtIdHelper->stationEtaMin(Id); + int stationEtaMax = m_MdtIdHelper->stationEtaMax(Id); + int stationPhiMin = m_MdtIdHelper->stationPhiMin(Id); + int stationPhiMax = m_MdtIdHelper->stationPhiMax(Id); + int NofMultilayers = m_MdtIdHelper->numberOfMultilayers(Id); + int multilayerMin = m_MdtIdHelper->multilayerMin(Id); + int multilayerMax = m_MdtIdHelper->multilayerMax(Id); + int tubeLayerMin = m_MdtIdHelper->tubeLayerMin(Id); + int tubeLayerMax = m_MdtIdHelper->tubeLayerMax(Id); + int tubeMin = m_MdtIdHelper->tubeMin(Id); + int tubeMax = m_MdtIdHelper->tubeMax(Id); + + ATH_MSG_DEBUG( "MDT Digit Offline id: Station Name [" << stName << " ]" + << " Station Eta [" << stationEta << "]" + << " Station Phi [" << stationPhi << "]" + << " Multiplet [" << multiplet << "]" + << " ChNr [" << channel << "]" + << " Station EtaMin [" << stationEtaMin << "]" + << " Station EtaMax [" << stationEtaMax << "]" + << " Station PhiMin [" << stationPhiMin << "]" + << " Station PhiMax [" << stationPhiMax << "]"); + + const MuonGM::MdtReadoutElement* rdoEl = MuonDetMgr->getMdtReadoutElement(Id); + if (!rdoEl) return StatusCode::FAILURE; + + Amg::Vector3D gpos(0.,0.,0.); + Amg::Vector2D lpos(0.,0.); + + rdoEl->surface(Id).localToGlobal(lpos, gpos,gpos); + + m_MDT_dig_localPosX.push_back( lpos.x() ); + m_MDT_dig_localPosY.push_back( lpos.y() ); + m_MDT_dig_globalPosX.push_back( gpos.x() ); + m_MDT_dig_globalPosY.push_back( gpos.y() ); + m_MDT_dig_globalPosZ.push_back( gpos.z() ); + + m_MDT_dig_stationName.push_back(stName); + m_MDT_dig_stationEta.push_back(stationEta); + m_MDT_dig_stationPhi.push_back(stationPhi); + m_MDT_dig_multiplet.push_back(multiplet); + m_MDT_dig_channel.push_back(channel); + m_MDT_dig_stationEtaMin.push_back(stationEtaMin); + m_MDT_dig_stationEtaMax.push_back(stationEtaMax); + m_MDT_dig_stationPhiMin.push_back(stationPhiMin); + m_MDT_dig_stationPhiMax.push_back(stationPhiMax); + m_MDT_dig_numberOfMultilayers.push_back(NofMultilayers); + m_MDT_dig_multilayerMin.push_back(multilayerMin); + m_MDT_dig_multilayerMax.push_back(multilayerMax); + m_MDT_dig_tubeLayerMin.push_back(tubeLayerMin); + m_MDT_dig_tubeLayerMax.push_back(tubeLayerMax); + m_MDT_dig_tubeMin.push_back(tubeMin); + m_MDT_dig_tubeMax.push_back(tubeMax); + + m_MDT_nDigits++; + } + } + ATH_MSG_DEBUG(" finished fillMdtDigitVariables()"); + return StatusCode::SUCCESS; +} + +/** ---------- clearing of variables */ +/** ---------- to be called inside filling method before filling starts */ +StatusCode MdtDigitVariables::clearVariables() +{ + m_MDT_nDigits = 0; + m_MDT_dig_stationName.clear(); + m_MDT_dig_stationEta.clear(); + m_MDT_dig_stationPhi.clear(); + m_MDT_dig_multiplet.clear(); + m_MDT_dig_channel.clear(); + m_MDT_dig_stationEtaMin.clear(); + m_MDT_dig_stationEtaMax.clear(); + m_MDT_dig_stationPhiMin.clear(); + m_MDT_dig_stationPhiMax.clear(); + m_MDT_dig_numberOfMultilayers.clear(); + m_MDT_dig_multilayerMin.clear(); + m_MDT_dig_multilayerMax.clear(); + m_MDT_dig_tubeLayerMin.clear(); + m_MDT_dig_tubeLayerMax.clear(); + m_MDT_dig_tubeMin.clear(); + m_MDT_dig_tubeMax.clear(); + m_MDT_dig_channelPosX.clear(); + m_MDT_dig_channelPosY.clear(); + m_MDT_dig_localPosX.clear(); + m_MDT_dig_localPosY.clear(); + m_MDT_dig_globalPosX.clear(); + m_MDT_dig_globalPosY.clear(); + m_MDT_dig_globalPosZ.clear(); + + return StatusCode::SUCCESS; +} + +/** ---------- creating variables and associate them to branches */ +/** ---------- to be called on initialization level of main alg */ +StatusCode MdtDigitVariables::initializeVariables() +{ + + if(m_tree) { + ATH_MSG_DEBUG("MDT digit: init m_tree "); + m_tree->Branch("Digits_MDT", &m_MDT_nDigits, "Digits_MDT_n/i"); + m_tree->Branch("Digits_MDT_stationName", &m_MDT_dig_stationName); + m_tree->Branch("Digits_MDT_stationEta", &m_MDT_dig_stationEta); + m_tree->Branch("Digits_MDT_stationPhi", &m_MDT_dig_stationPhi); + m_tree->Branch("Digits_MDT_stationEtaMin", &m_MDT_dig_stationEtaMin); + m_tree->Branch("Digits_MDT_stationEtaMax", &m_MDT_dig_stationEtaMax); + m_tree->Branch("Digits_MDT_stationPhiMin", &m_MDT_dig_stationPhiMin); + m_tree->Branch("Digits_MDT_stationPhiMax", &m_MDT_dig_stationPhiMax); + m_tree->Branch("Digits_MDT_numberOfMultilayers", &m_MDT_dig_numberOfMultilayers); + m_tree->Branch("Digits_MDT_multilayerMin", &m_MDT_dig_multilayerMin); + m_tree->Branch("Digits_MDT_multilayerMax", &m_MDT_dig_multilayerMax); + + m_tree->Branch("Digits_MDT_tubeLayerMin", &m_MDT_dig_tubeLayerMin); + m_tree->Branch("Digits_MDT_tubeLayerMax", &m_MDT_dig_tubeLayerMax); + m_tree->Branch("Digits_MDT_tubeMin", &m_MDT_dig_tubeMin); + m_tree->Branch("Digits_MDT_tubeMax", &m_MDT_dig_tubeMax); + + m_tree->Branch("Digits_MDT_channelPosX", &m_MDT_dig_channelPosX); + m_tree->Branch("Digits_MDT_channelPosY", &m_MDT_dig_channelPosY); + m_tree->Branch("Digits_MDT_localPosX", &m_MDT_dig_localPosX); + m_tree->Branch("Digits_MDT_localPosY", &m_MDT_dig_localPosY); + m_tree->Branch("Digits_MDT_globalPosX", &m_MDT_dig_globalPosX); + m_tree->Branch("Digits_MDT_globalPosY", &m_MDT_dig_globalPosY); + m_tree->Branch("Digits_MDT_globalPosZ", &m_MDT_dig_globalPosZ); + } + + return StatusCode::SUCCESS; +} diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.h b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.h new file mode 100644 index 0000000000000000000000000000000000000000..4b1019e8fe50c4becb04f164e679193c1b5d3494 --- /dev/null +++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/MDTDigitVariables.h @@ -0,0 +1,74 @@ +/* + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef MuonPRDTEST_MDTDigitVARIABLES_H +#define MuonPRDTEST_MDTDigitVARIABLES_H + +#include "ValAlgVariables.h" +#include "MuonIdHelpers/MdtIdHelper.h" +#include "AthenaBaseComps/AthMsgStreamMacros.h" +#include <vector> + +class MdtDigitVariables : public ValAlgVariables +{ + public: + MdtDigitVariables(StoreGateSvc* evtStore, + const MuonGM::MuonDetectorManager* detManager, + const MuonIdHelper* idhelper, + TTree* tree, + std::string containername, + MSG::Level msglvl) : + ValAlgVariables(evtStore, detManager, tree, containername, msglvl) + { + setHelper(idhelper); + } + + ~MdtDigitVariables() = default; + + StatusCode initializeVariables(); + StatusCode fillVariables(const MuonGM::MuonDetectorManager* MuonDetMgr); + + private: + + void setHelper(const MuonIdHelper* idhelper){ + m_MdtIdHelper = dynamic_cast<const MdtIdHelper*>(idhelper); + if (!m_MdtIdHelper){ + throw std::runtime_error("Could not cast the MDTIdHelper"); + } + } + + void deleteVariables(){}; + StatusCode clearVariables(); + + const MdtIdHelper* m_MdtIdHelper; + + int m_MDT_nDigits; + std::vector<std::string> m_MDT_dig_stationName; + std::vector<int> m_MDT_dig_stationEta; + std::vector<int> m_MDT_dig_stationPhi; + std::vector<int> m_MDT_dig_multiplet; + std::vector<int> m_MDT_dig_channel; + std::vector<int> m_MDT_dig_stationEtaMin; + std::vector<int> m_MDT_dig_stationEtaMax; + std::vector<int> m_MDT_dig_stationPhiMin; + std::vector<int> m_MDT_dig_stationPhiMax; + std::vector<int> m_MDT_dig_numberOfMultilayers; + std::vector<int> m_MDT_dig_multilayerMin; + std::vector<int> m_MDT_dig_multilayerMax; + std::vector<int> m_MDT_dig_tubeLayerMin; + std::vector<int> m_MDT_dig_tubeLayerMax; + std::vector<int> m_MDT_dig_tubeMin; + std::vector<int> m_MDT_dig_tubeMax; + std::vector<int> m_MDT_dig_channelNumber; + + std::vector< double > m_MDT_dig_channelPosX; + std::vector< double > m_MDT_dig_channelPosY; + std::vector< double > m_MDT_dig_localPosX; + std::vector< double > m_MDT_dig_localPosY; + std::vector< double > m_MDT_dig_globalPosX; + std::vector< double > m_MDT_dig_globalPosY; + std::vector< double > m_MDT_dig_globalPosZ; +}; + +#endif // MuonPRDTEST_MDTDigitVARIABLES_H diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx index 5bb4624c49205691ba93c157aadedf7e50c1e59a..9392fbdb5c653b5be3ebdf5e8daa27c6df0ab837 100644 --- a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx +++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.cxx @@ -9,6 +9,7 @@ #include "MMDigitVariables.h" #include "MMSimHitVariables.h" +#include "MDTDigitVariables.h" #include "MDTSimHitVariables.h" #include "RPCDigitVariables.h" #include "RPCSimHitVariables.h" @@ -61,7 +62,9 @@ NSWPRDValAlg::NSWPRDValAlg(const std::string& name, ISvcLocator* pSvcLocator) m_MmPrdVar(nullptr), m_CscDigitVar(nullptr), m_MDTSimHitVar(nullptr), + m_MDTDigitVar(nullptr), m_RPCSimHitVar(nullptr), + m_RPCDigitVar(nullptr), m_CSCSimHitVar(nullptr), m_TGCSimHitVar(nullptr), m_thistSvc(nullptr), @@ -84,6 +87,7 @@ NSWPRDValAlg::NSWPRDValAlg(const std::string& name, ISvcLocator* pSvcLocator) declareProperty("NSWMM_PRDContainerName", m_NSWMM_PRDContainerName="MM_Measurements"); declareProperty("CSC_DigitContainerName", m_CSC_DigitContainerName="CSC_DIGITS"); declareProperty("MDT_SimContainerName", m_MDT_SimContainerName="MDT_Hits"); + declareProperty("MDT_DigitContainerName", m_MDT_DigitContainerName="MDT_DIGITS"); declareProperty("RPC_SimContainerName", m_RPC_SimContainerName="RPC_Hits"); declareProperty("RPC_DigitContainerName", m_RPC_DigitContainerName="RPC_DIGITS"); declareProperty("CSC_SimContainerName", m_CSC_SimContainerName="CSC_Hits"); @@ -105,6 +109,7 @@ NSWPRDValAlg::NSWPRDValAlg(const std::string& name, ISvcLocator* pSvcLocator) declareProperty("doMMPRD", m_doMMPRD=false); declareProperty("doCSCDigit", m_doCSCDigit=false); declareProperty("doMDTHit", m_doMDTHit=false); + declareProperty("doMDTDigit", m_doMDTDigit=false); declareProperty("doRPCHit", m_doRPCHit=false); declareProperty("doRPCDigit", m_doRPCDigit=false); declareProperty("doCSCHit", m_doCSCHit=false); @@ -241,6 +246,11 @@ StatusCode NSWPRDValAlg::initialize() { &m_idHelperSvc->mdtIdHelper(), m_tree, m_MDT_SimContainerName, msgLevel()); ATH_CHECK( m_MDTSimHitVar->initializeVariables() ); } + if (m_doMDTDigit){ + m_MDTDigitVar = new MdtDigitVariables(&(*(evtStore())), m_muonDetMgrDS, + &m_idHelperSvc->mdtIdHelper(), m_tree, m_MDT_DigitContainerName, msgLevel()); + ATH_CHECK( m_MDTDigitVar->initializeVariables() ); + } if (m_doRPCHit){ m_RPCSimHitVar = new RPCSimHitVariables(&(*(evtStore())), m_muonDetMgrDS, @@ -283,6 +293,7 @@ StatusCode NSWPRDValAlg::finalize() if (m_MmPrdVar) { delete m_MmPrdVar; m_MmPrdVar=0;} if (m_CscDigitVar) { delete m_CscDigitVar; m_CscDigitVar=0;} if (m_MDTSimHitVar) { delete m_MDTSimHitVar; m_MDTSimHitVar=0;} + if (m_MDTDigitVar) { delete m_MDTDigitVar; m_MDTDigitVar=0;} if (m_RPCSimHitVar) { delete m_RPCSimHitVar; m_RPCSimHitVar=0;} if (m_CSCSimHitVar) { delete m_CSCSimHitVar; m_CSCSimHitVar=0;} if (m_TGCSimHitVar) { delete m_TGCSimHitVar; m_TGCSimHitVar=0;} @@ -345,6 +356,8 @@ StatusCode NSWPRDValAlg::execute() if (m_doCSCDigit) ATH_CHECK( m_CscDigitVar->fillVariables(muonDetMgr) ); if (m_doMDTHit) ATH_CHECK( m_MDTSimHitVar->fillVariables(muonDetMgr) ); + + if (m_doMDTDigit) ATH_CHECK( m_MDTDigitVar->fillVariables(muonDetMgr) ); if (m_doRPCHit) ATH_CHECK( m_RPCSimHitVar->fillVariables(muonDetMgr) ); diff --git a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h index dc520be802d994fed9981b3c87b207f10ee95df2..d333d70866a91ef3c12e96f6c0bf02923ff4eac9 100644 --- a/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h +++ b/MuonSpectrometer/MuonValidation/MuonPRDTest/src/NSWPRDValAlg.h @@ -14,8 +14,9 @@ #include <vector> class MDTSimHitVariables; +class MdtDigitVariables; class RPCSimHitVariables; -class RPCDigitVariables; +class RpcDigitVariables; class CSCSimHitVariables; class TGCSimHitVariables; class MMDigitVariables; @@ -69,7 +70,9 @@ class NSWPRDValAlg:public AthAlgorithm MMPRDVariables* m_MmPrdVar; CSCDigitVariables* m_CscDigitVar; MDTSimHitVariables* m_MDTSimHitVar; + MdtDigitVariables* m_MDTDigitVar; RPCSimHitVariables* m_RPCSimHitVar; + RpcDigitVariables* m_RPCDigitVar; CSCSimHitVariables* m_CSCSimHitVar; TGCSimHitVariables* m_TGCSimHitVar; @@ -100,7 +103,8 @@ class NSWPRDValAlg:public AthAlgorithm BooleanProperty m_doMMRDO; // switch on the output of the MicroMegas RDO BooleanProperty m_doMMPRD; // switch on the output of the MicroMegas prepdata BooleanProperty m_doCSCDigit; // switch on the output of the MicroMegas digitization - BooleanProperty m_doMDTHit; + BooleanProperty m_doMDTHit; // switch on the output of the MDT data + BooleanProperty m_doMDTDigit; // switch on the output of the MDT digitization BooleanProperty m_doRPCHit; // switch on the output of the RPC data BooleanProperty m_doRPCDigit; // switch on the output of the RPC digitization BooleanProperty m_doCSCHit; @@ -123,6 +127,7 @@ class NSWPRDValAlg:public AthAlgorithm std::string m_NSWMM_PRDContainerName; std::string m_CSC_DigitContainerName; std::string m_MDT_SimContainerName; + std::string m_MDT_DigitContainerName; std::string m_RPC_DigitContainerName; std::string m_RPC_SimContainerName; std::string m_CSC_SimContainerName;