From b1be3134ff7130f7970a666a444fcd5d597c2408 Mon Sep 17 00:00:00 2001 From: Vakhtang Tsulaia <Vakhtang.Tsulaia@cern.ch> Date: Thu, 20 Mar 2014 03:05:34 +0100 Subject: [PATCH] Drop unised forward declaration and includes (InDetCaloClusterROISelector-00-01-02) --- .../CaloClusterROI_Selector.h | 93 +++++ .../cmt/requirements | 29 ++ .../src/CaloClusterROI_Selector.cxx | 341 ++++++++++++++++++ .../InDetCaloClusterROISelector_entries.cxx | 12 + .../InDetCaloClusterROISelector_load.cxx | 3 + 5 files changed, 478 insertions(+) create mode 100755 InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/InDetCaloClusterROISelector/CaloClusterROI_Selector.h create mode 100644 InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/cmt/requirements create mode 100755 InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/CaloClusterROI_Selector.cxx create mode 100644 InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_entries.cxx create mode 100644 InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_load.cxx diff --git a/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/InDetCaloClusterROISelector/CaloClusterROI_Selector.h b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/InDetCaloClusterROISelector/CaloClusterROI_Selector.h new file mode 100755 index 00000000000..ea5c3cc7fe7 --- /dev/null +++ b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/InDetCaloClusterROISelector/CaloClusterROI_Selector.h @@ -0,0 +1,93 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +#ifndef EGAMMAREC_CALOCLUSTERROI_SELECTOR_H +#define EGAMMAREC_CALOCLUSTERROI_SELECTOR_H +/** + @class CaloClusterROI_Selector + Algorithm which creates an CaloClusterROICollection. + It retrieves data objects from TDS +*/ + +// INCLUDE HEADER FILES: +#include <vector> +#include "AthenaBaseComps/AthAlgorithm.h" +#include "GaudiKernel/ToolHandle.h" +#include "GaudiKernel/IChronoStatSvc.h" + +class IEMShowerBuilder; +class IegammaCheckEnergyDepositTool; +class IegammaIso; +class IegammaMiddleShape; + + +#include "xAODCaloEvent/CaloClusterFwd.h" + +class CaloCellContainer; + +namespace InDet { + +class ICaloClusterROI_Builder; + + +class CaloClusterROI_Selector : public AthAlgorithm +{ + public: + + /** @brief Default constructor*/ + CaloClusterROI_Selector(const std::string& name, ISvcLocator* pSvcLocator); + + /** @brief Destructor*/ + ~CaloClusterROI_Selector(); + + /** @brief initialize method*/ + StatusCode initialize(); + /** @brief finalize method*/ + StatusCode finalize(); + /** @brief execute method*/ + StatusCode execute(); + + private: + bool PassClusterSelection(const xAOD::CaloCluster* cluster , const CaloCellContainer* cellcoll) ; + /** @brief Name of the cluster intput collection*/ + std::string m_inputClusterContainerName; + /** @brief Name of the cluster output collection*/ + std::string m_outputClusterContainerName; + /** @brief Name of the cells container*/ + std::string m_cellsName; + + // + // The tools + // + // subalgorithm pointers cached in initialize: + /** @brief isolation tool for Ethad1 / Ethad*/ + ToolHandle<IegammaIso> m_emCaloIsolationTool; + /** @brief Pointer to the egammaCheckEnergyDepositTool*/ + ToolHandle<IegammaCheckEnergyDepositTool> m_egammaCheckEnergyDepositTool; + /** @Middle shape Tool*/ + ToolHandle<IegammaMiddleShape> m_egammaMiddleShape; + /** @brief Tool to build ROI*/ + ToolHandle<InDet::ICaloClusterROI_Builder> m_caloClusterROI_Builder; + // + // All booleans + // + bool m_CheckHadronicEnergy; + bool m_CheckReta; + // + // Other properties. + // + /** @brief Cut on hadronic leakage*/ + double m_HadRatioCut; + double m_RetaCut; + double m_ClusterEtCut; + unsigned int m_AllClusters; + unsigned int m_SelectedClusters; + + // others: + IChronoStatSvc* m_timingProfile; + +}; + +} //End namespace +#endif diff --git a/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/cmt/requirements b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/cmt/requirements new file mode 100644 index 00000000000..08b7933c344 --- /dev/null +++ b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/cmt/requirements @@ -0,0 +1,29 @@ +package InDetCaloClusterROISelector + +author A. Morley <amorley@cern.ch> + +use AtlasPolicy AtlasPolicy-* +use GaudiInterface GaudiInterface-* External +use AthenaBaseComps AthenaBaseComps-* Control + +use xAODCaloEvent xAODCaloEvent-* Event/xAOD + + +private +use CaloUtils CaloUtils-* Calorimeter +use TrkCaloClusterROI TrkCaloClusterROI-* Tracking/TrkEvent + +use egammaInterfaces egammaInterfaces-* Reconstruction/egamma +use InDetRecToolInterfaces InDetRecToolInterfaces-* InnerDetector/InDetRecTools + + +use CaloEvent CaloEvent-* Calorimeter +#use xAODEgamma xAODEgamma-* Event/xAOD + + +apply_tag ROOTMathLibs +end_private + +library InDetCaloClusterROISelector *.cxx components/*.cxx +apply_pattern component_library + diff --git a/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/CaloClusterROI_Selector.cxx b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/CaloClusterROI_Selector.cxx new file mode 100755 index 00000000000..ac049c6b74e --- /dev/null +++ b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/CaloClusterROI_Selector.cxx @@ -0,0 +1,341 @@ +/* + Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration +*/ + +/******************************************************************** + +NAME: CaloClusterROI_Selector.cxx +PACKAGE: offline/Reconstruction/egamma/egammaRec + +AUTHORS: A.Morley,C.A +CREATED: Nov 2011 + +PURPOSE: For each cluster create a new CaloClusterROI object and fills it then in the CaloClusterROI_Collection. + + +********************************************************************/ + +// INCLUDE HEADER FILES: + +#include "InDetCaloClusterROISelector/CaloClusterROI_Selector.h" + +#include "InDetRecToolInterfaces/ICaloClusterROI_Builder.h" +// +#include "CaloEvent/CaloCellContainer.h" +#include "CaloUtils/CaloCellList.h" + +#include "xAODCaloEvent/CaloClusterContainer.h" + + +//Cluster cuts +#include "egammaInterfaces/IegammaCheckEnergyDepositTool.h" +#include "egammaInterfaces/IegammaIso.h" +#include "egammaInterfaces/IegammaMiddleShape.h" +#include "TrkCaloClusterROI/CaloClusterROI.h" +#include "TrkCaloClusterROI/CaloClusterROI_Collection.h" + + + +// INCLUDE GAUDI HEADER FILES: +#include "GaudiKernel/MsgStream.h" + +#include <algorithm> +#include <math.h> + +// END OF HEADER FILES INCLUDE + +///////////////////////////////////////////////////////////////// + +// CONSTRUCTOR: + +InDet::CaloClusterROI_Selector::CaloClusterROI_Selector(const std::string& name, + ISvcLocator* pSvcLocator): + AthAlgorithm(name, pSvcLocator), + m_AllClusters(0), + m_SelectedClusters(0), + m_timingProfile(0) +{ + // The following properties are specified at run-time + // (declared in jobOptions file) + // input cluster for egamma objects + declareProperty("InputClusterContainerName", + m_inputClusterContainerName="LArClusterEM", + "Input cluster for egamma objects"); + + //Cell container + declareProperty("CellsName", + m_cellsName="AllCalo", + "Names of containers which contain cells "); + + // input cluster for egamma objects + declareProperty("OutputClusterContainerName", + m_outputClusterContainerName="CaloClusterROIs", + "Output cluster for egamma objects"); + // + // Handles of tools + //Hadronic Isolation + declareProperty("EMCaloIsolationTool", m_emCaloIsolationTool, "Handle of the EMCaloIsolationTool"); + //Check Fraction + declareProperty("egammaCheckEnergyDepositTool", m_egammaCheckEnergyDepositTool, "Handle of the egammaCheckEnergyDepositTool"); + // + declareProperty("CaloClusterROIBuilder", m_caloClusterROI_Builder,"Handle of the CaloClusterROI_Builder Tool"); + // + // Other properties. + // + declareProperty("CheckHadronicEnergy", m_CheckHadronicEnergy=true); + declareProperty("CheckReta", m_CheckReta=true); + // + declareProperty("HadRatioCut", m_HadRatioCut =0.12, " Cut on Hadronic Leakage"); + declareProperty("RetaCut", m_RetaCut =0.65, " Cut on Reta"); + declareProperty("ClusterEtCut", m_ClusterEtCut = 0000, " Cut On Cluster Et"); + + +} + +// ================================================================ +InDet::CaloClusterROI_Selector::~CaloClusterROI_Selector() +{ + // + // destructor + // +} + +// ================================================================= +StatusCode InDet::CaloClusterROI_Selector::initialize() +{ + // + // initialize method + // + + ATH_MSG_DEBUG("Initializing CaloClusterROI_Selector"); + + /*Get the check Energy Deposit tool*/ + if(m_egammaCheckEnergyDepositTool.retrieve().isFailure()) { + ATH_MSG_ERROR("Unable to retrieve "<<m_egammaCheckEnergyDepositTool); + return StatusCode::FAILURE; + } + + /*Get the Hadronic iso tool*/ + if(m_CheckHadronicEnergy){ + if(m_emCaloIsolationTool.retrieve().isFailure()) { + ATH_MSG_ERROR("Unable to retrieve "<<m_emCaloIsolationTool); + return StatusCode::FAILURE; + } + } + /* Get the middle shapes Tool*/ + if(m_CheckReta){ + // Create egammaMiddleShape Tool + std::string egammaMiddleShapeTool_name="egammaMiddleShape/Roiegammamiddleshape"; + m_egammaMiddleShape=ToolHandle<IegammaMiddleShape>(egammaMiddleShapeTool_name); + // a priori this is not useful + if(m_egammaMiddleShape.retrieve().isFailure()) { + ATH_MSG_WARNING("Unable to retrieve "<<m_egammaMiddleShape); + return StatusCode::SUCCESS; + } + else ATH_MSG_DEBUG("Tool " << m_egammaMiddleShape << " retrieved"); + } + + if(m_caloClusterROI_Builder.retrieve().isFailure()) { + ATH_MSG_ERROR("Unable to retrieve "<< m_caloClusterROI_Builder); + return StatusCode::FAILURE; + } + else ATH_MSG_DEBUG("Retrieved Tool "<< m_caloClusterROI_Builder); + + + m_timingProfile = 0; + StatusCode sc = service("ChronoStatSvc",m_timingProfile); + if(sc.isFailure() || m_timingProfile == 0) { + ATH_MSG_ERROR("Cannot find the ChronoStatSvc " << m_timingProfile); + } + + m_AllClusters=0; + m_SelectedClusters=0; + + ATH_MSG_INFO("Initialization completed successfully"); + return StatusCode::SUCCESS; +} + + + +// ==================================================================== +StatusCode InDet::CaloClusterROI_Selector::finalize() +{ + // + // finalize method + // + ATH_MSG_INFO ("AllClusters " << m_AllClusters); + ATH_MSG_INFO ("SelectedClusters " << m_SelectedClusters); + + return StatusCode::SUCCESS; +} + +// ====================================================================== +StatusCode InDet::CaloClusterROI_Selector::execute() +{ + // + // athena execute method + // + + //bool do_trackMatch = true; + ATH_MSG_DEBUG("Executing CaloClusterROI_Selector"); + + StatusCode sc; + // Chrono name for each Tool + std::string chronoName; + + // Record output CaloClusterROICollection: + CaloClusterROI_Collection* ccROI_Collection = new CaloClusterROI_Collection(); + + sc = evtStore()->record( ccROI_Collection, m_outputClusterContainerName ); + if (sc.isFailure()) + { + ATH_MSG_ERROR("Could not record "<< m_outputClusterContainerName <<" object."); + return StatusCode::FAILURE; + } + + // retrieve cluster containers, return `failure' if not existing + const xAOD::CaloClusterContainer* inputClusterContainer; + if( evtStore()->contains<xAOD::CaloClusterContainer>(m_inputClusterContainerName)) { + sc = evtStore()->retrieve(inputClusterContainer, m_inputClusterContainerName); + if( sc.isFailure() ) { + ATH_MSG_ERROR("Input EM Cluster not retrived but found " << m_inputClusterContainerName); + ATH_MSG_DEBUG("Locking ROI container and returning"); + evtStore()->setConst(ccROI_Collection).ignore(); + return StatusCode::SUCCESS; + } + } else { + ATH_MSG_INFO("No input EM Cluster container found " << m_inputClusterContainerName); + ATH_MSG_DEBUG("Locking ROI container and returning"); + evtStore()->setConst(ccROI_Collection).ignore(); + return StatusCode::SUCCESS; + } + + + // retrieve Calo Cell Container + const CaloCellContainer* m_cellcoll(0); + if(m_CheckHadronicEnergy|| m_CheckReta){ + if( evtStore()->contains<CaloCellContainer>(m_cellsName) ){ + StatusCode sc = evtStore()->retrieve(m_cellcoll, m_cellsName) ; + if(sc.isFailure() || !m_cellcoll) { + ATH_MSG_WARNING("no Calo Cell Container " << m_cellsName << " found"); + return sc; + } + } else { + ATH_MSG_DEBUG("No input Cell container found " << m_cellsName << ". Will not apply shape cuts"); + ATH_MSG_DEBUG("Locking ROI container and returning"); + // evtStore()->setConst(ccROI_Collection).ignore(); + // return StatusCode::SUCCESS; + m_CheckHadronicEnergy = false; + m_CheckReta = false; + + } + } + + // loop over clusters in the default inputClusterContainer: + typedef xAOD::CaloClusterContainer::const_iterator clus_iterator; + // loop over clusters + for(clus_iterator iter = inputClusterContainer->begin(); + iter != inputClusterContainer->end(); + ++iter) + { + m_AllClusters++; + const xAOD::CaloCluster* cluster = *iter; + if (PassClusterSelection(cluster , m_cellcoll)) + { + m_SelectedClusters++; + ATH_MSG_DEBUG("Pass cluster selection"); + Trk::CaloClusterROI* ccROI = m_caloClusterROI_Builder->buildClusterROI( cluster ); + ccROI_Collection->push_back(ccROI); + } else { + ATH_MSG_DEBUG("Fail cluster selection"); + } + // reset sc to success for each cluster + sc = StatusCode::SUCCESS; + } // end loop over all Calorimeter clusters + + // May be left unchecked if we exited the loop via a continue. + sc.ignore(); + // lock the egamma collection + evtStore()->setConst(ccROI_Collection).ignore(); + ATH_MSG_DEBUG("execute completed successfully"); + return StatusCode::SUCCESS; +} +// ====================================================================== +bool InDet::CaloClusterROI_Selector::PassClusterSelection(const xAOD::CaloCluster* cluster , const CaloCellContainer* cellcoll) +{ + + if( !m_egammaCheckEnergyDepositTool->checkFractioninSamplingCluster(cluster ) ) { + ATH_MSG_DEBUG("Cluster failed sample check: dont make ROI"); + return false; + } + + if((m_CheckHadronicEnergy || m_CheckReta) && cellcoll==0) { + ATH_MSG_DEBUG("No cell collection: dont make ROI"); + return false; + } + + // transverse energy in calorimeter (using eta position in second sampling) + double eta2 = fabs(cluster->etaBE(2)); + if (eta2>2.47 || eta2<0.) { + ATH_MSG_DEBUG("Cluster failed acceptance test: dont make ROI"); + return false; + } + + double et = cosh(eta2)!=0. ? cluster->e()/cosh(eta2) : 0.; + + if ( et < m_ClusterEtCut ){ + ATH_MSG_DEBUG("Cluster failed Energy Cut: dont make ROI"); + return false; + } + + + if(m_CheckReta || m_CheckHadronicEnergy){ + + if(m_CheckReta){ + StatusCode sc = m_egammaMiddleShape->execute(cluster,cellcoll); + if ( sc.isFailure() ) { + ATH_MSG_WARNING("call to Middle shape returns failure for execute"); + return false; + } + double e237 = m_egammaMiddleShape->e237(); + // E(7*7) in 2nd sampling + double e277 = m_egammaMiddleShape->e277(); + if (e277 != 0. && e237/e277<=m_RetaCut){ + ATH_MSG_DEBUG("Cluster failed Reta test: dont make ROI"); + return false; + } + } + if(m_CheckHadronicEnergy){ + // define a new Calo Cell list corresponding to HAD Calo + CaloCell_ID::SUBCALO theCalo1 = static_cast<CaloCell_ID::SUBCALO>(CaloCell_ID::LARHEC) ; + CaloCell_ID::SUBCALO theCalo2 = static_cast<CaloCell_ID::SUBCALO>(CaloCell_ID::TILE) ; + std::vector<CaloCell_ID::SUBCALO> theVecCalo; + theVecCalo.push_back(theCalo1); + theVecCalo.push_back(theCalo2); + // define a new Calo Cell list + CaloCellList* HADccl = new CaloCellList(cellcoll,theVecCalo); + StatusCode sc = m_emCaloIsolationTool->execute(cluster,HADccl); + if ( sc.isFailure() ) { + ATH_MSG_WARNING("call to Iso returns failure for execute"); + delete HADccl; + return false; + } + delete HADccl; + double ethad1 = m_emCaloIsolationTool->ethad1(); + double ethad = m_emCaloIsolationTool->ethad(); + double raphad1 = fabs(et) > 0. ? ethad1/et : 0.; + double raphad = fabs(et) > 0. ? ethad/et : 0.; + if (eta2 >= 0.8 && eta2 < 1.37){ + if (raphad >m_HadRatioCut){ + ATH_MSG_DEBUG("Cluster failed Hadronic Leakage test: dont make ROI"); + return false; + } + } + else if(raphad1 >m_HadRatioCut){ + ATH_MSG_DEBUG("Cluster failed Hadronic Leakage test: dont make ROI"); + return false; + } + } + } + return true; +} diff --git a/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_entries.cxx b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_entries.cxx new file mode 100644 index 00000000000..ad10c2b761f --- /dev/null +++ b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_entries.cxx @@ -0,0 +1,12 @@ + +#include "GaudiKernel/DeclareFactoryEntries.h" +#include "InDetCaloClusterROISelector/CaloClusterROI_Selector.h" + +using namespace InDet; + +DECLARE_ALGORITHM_FACTORY( CaloClusterROI_Selector ) + +DECLARE_FACTORY_ENTRIES( InDetCaloClusterROISelector ) +{ + DECLARE_ALGORITHM( CaloClusterROI_Selector ) +} diff --git a/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_load.cxx b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_load.cxx new file mode 100644 index 00000000000..38fed34af54 --- /dev/null +++ b/InnerDetector/InDetRecAlgs/InDetCaloClusterROISelector/src/components/InDetCaloClusterROISelector_load.cxx @@ -0,0 +1,3 @@ +#include "GaudiKernel/LoadFactoryEntries.h" + +LOAD_FACTORY_ENTRIES( InDetCaloClusterROISelector ) -- GitLab