diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt b/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt index 27eefb6b34e88e81bf86392d18bd9477b40b47a5..13a3ced0d6e4dc30959224e2d00fb35bc8e9fd3a 100644 --- a/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt +++ b/Trigger/TrigAlgorithms/TrigEgammaRec/CMakeLists.txt @@ -20,12 +20,14 @@ atlas_depends_on_subdirs( PUBLIC Trigger/TrigSteer/TrigInterfaces PRIVATE Calorimeter/CaloEvent + Calorimeter/CaloUtils Event/xAOD/xAODCaloEvent Event/xAOD/xAODEgammaCnv Event/xAOD/xAODEventShape Event/xAOD/xAODTracking PhysicsAnalysis/Interfaces/EgammaAnalysisInterfaces Reconstruction/egamma/egammaEvent + Reconstruction/egamma/egammaUtils Trigger/TrigTools/TrigTimeAlgs ) # External dependencies: @@ -36,13 +38,13 @@ atlas_add_library( TrigEgammaRecLib src/*.cxx PUBLIC_HEADERS TrigEgammaRec PRIVATE_INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} - LINK_LIBRARIES xAODEgamma xAODPrimitives GaudiKernel RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent LumiBlockCompsLib TrigInterfacesLib EgammaAnalysisInterfacesLib TrigTimeAlgsLib - PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} CaloEvent xAODCaloEvent xAODEventShape xAODTracking egammaEvent ) + LINK_LIBRARIES xAODEgamma xAODPrimitives GaudiKernel CaloUtilsLib RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent LumiBlockCompsLib TrigInterfacesLib EgammaAnalysisInterfacesLib TrigTimeAlgsLib + PRIVATE_LINK_LIBRARIES ${ROOT_LIBRARIES} CaloEvent xAODCaloEvent xAODEventShape xAODTracking egammaEvent egammaUtils) atlas_add_component( TrigEgammaRec src/components/*.cxx INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} - LINK_LIBRARIES ${ROOT_LIBRARIES} xAODEgamma xAODPrimitives GaudiKernel LumiBlockCompsLib RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent TrigInterfacesLib CaloEvent xAODCaloEvent xAODEventShape xAODTracking EgammaAnalysisInterfacesLib egammaEvent TrigTimeAlgsLib TrigEgammaRecLib ) + LINK_LIBRARIES ${ROOT_LIBRARIES} xAODEgamma xAODPrimitives GaudiKernel CaloUtilsLib LumiBlockCompsLib RecoToolInterfaces egammaRecEvent TrigCaloEvent TrigParticle TrigSteeringEvent TrigInterfacesLib CaloEvent xAODCaloEvent xAODEventShape xAODTracking EgammaAnalysisInterfacesLib egammaEvent egammaUtils TrigTimeAlgsLib TrigEgammaRecLib ) # Install files from the package: atlas_install_python_modules( python/*.py ) diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h b/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h index 5e86e07598dd278d6be45ca9247fa04215c94d38..1a049aed5d7b1b4bdce74615a3246925d7259784 100755 --- a/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h +++ b/Trigger/TrigAlgorithms/TrigEgammaRec/TrigEgammaRec/TrigEgammaRec.h @@ -86,6 +86,8 @@ private: ToolHandle<IEMTrackMatchBuilder> m_trackMatchBuilder; ToolHandle<IEMConversionBuilder> m_conversionBuilder; + + ToolHandle<IEMShowerBuilder> m_showerBuilder; // trigger specific ToolHandle<IEMFourMomBuilder> m_fourMomBuilder; // trigger specific ToolHandle<IEGammaAmbiguityTool> m_ambiguityTool; @@ -112,12 +114,13 @@ private: ToolHandle<ILumiBlockMuTool> m_lumiBlockMuTool; // booleans to run specific parts of offline reconstruction bool m_doConversions; + bool m_doBremCollection; bool m_doTrackMatching; bool m_doTrackIsolation; bool m_doCaloCellIsolation; bool m_doTopoIsolation; bool m_useBremAssoc; - + // Allows delete EgammaRecContainer *m_eg_container; // needed for monitoring to work diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py index 40a003b5ac769727addd93030118bfd6afaaa42d..1721caa5a02a8f94876f727f7900c43b6005f5d8 100755 --- a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py +++ b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaRecConfig.py @@ -56,7 +56,7 @@ TrigEgammaRec = Factory(TrigEgammaRecConf.TrigEgammaRec, name="TrigEgammaRec",do # Tools with non-default configuration TrackMatchBuilderTool = TrigEMTrackMatchBuilder, ShowerBuilderTool = TrigEMShowerBuilder, - + # Set the isolation tools TrackIsolationTool = TrigTrackIsolationTool, CaloCellIsolationTool = TrigCaloIsolationTool, @@ -75,7 +75,6 @@ TrigEgammaRec = Factory(TrigEgammaRecConf.TrigEgammaRec, name="TrigEgammaRec",do PhotonPIDBuilder = TrigPhotonPIDBuilder, # Tools with default configuration -# VertexBuilderTool = EMVertexBuilder, ConversionBuilderTool = EMConversionBuilder.copyPublic("TrigEMConversionBuilder"), AmbiguityTool = EGammaAmbiguityTool.copyPublic("TrigEGammaAmbiguityTool"), FourMomBuilderTool = EMFourMomBuilder.copyPublic("TrigEMFourMomBuilder"), @@ -88,3 +87,4 @@ TrigEgammaRec = Factory(TrigEgammaRecConf.TrigEgammaRec, name="TrigEgammaRec",do postInit = [configureTrigEgammaMonitoring], ) + diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py index befd1e2ce4be958d9ec77d59a054e417441f498c..723459a24f27d63f24a66dace1fe31e23edd7bfc 100644 --- a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py +++ b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaToolFactories.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- # vim:fenc=utf-8 # -# Copyright @2016 Ryan Mackenzie White <ryan.white@cern.ch> +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration # """ @@ -36,9 +36,11 @@ PhotonPidTools() # Following tools have TrigEgamma factories from egammaTools.egammaToolsFactories import EMTrackMatchBuilder, EMFourMomBuilder, EMShowerBuilder +from egammaTools import egammaToolsConf from egammaTools.egammaToolsConf import EMPIDBuilder from CaloClusterCorrection import CaloClusterCorrectionConf as Cccc +from egammaTrackTools.egammaTrackToolsFactories import EMExtrapolationTools TrigCaloFillRectangularCluster = PublicToolFactory( Cccc.CaloFillRectangularCluster, name = "trigegamma_CaloFillRectangularCluster", eta_size = 5, @@ -118,8 +120,14 @@ TrigEMExtrapolationTools=EMExtrapolationTools.copyPublic(name="TrigEMExtrapolati useCaching=False) +def appendtoTrigEMTrackMatchBuilder(tool): + "add track to calo tool " + if not hasattr(tool,"EMExtrapolationTools"): + tool += EMExtrapolationTools() + TrigEMTrackMatchBuilder = EMTrackMatchBuilder.copyPublic( name = "TrigEMTrackMatchBuilder", + postInit=[appendtoTrigEMTrackMatchBuilder], broadDeltaEta = 0.2, #For offline 0.1 broadDeltaPhi = 0.2, #For offline 0.15 useScoring = False, @@ -134,10 +142,13 @@ TrigEMShowerBuilder = EMShowerBuilder.copyPublic( ) from TriggerMenu.egamma.EgammaSliceFlags import EgammaSliceFlags +from egammaMVACalib.TrigEgammaMVACalibFactories import TrigElectronMVATool, TrigPhotonMVATool + mlog.info("MVA version version %s"%EgammaSliceFlags.calibMVAVersion() ) mlog.info("Cluster Correction version %s"%EgammaSliceFlags.clusterCorrectionVersion() ) EgammaSliceFlags.calibMVAVersion.set_On() + from TrigCaloRec.TrigCaloRecConf import TrigCaloClusterMaker def configureTrigCaloClusterMonitoring(tool): @@ -163,7 +174,6 @@ def configureClusterBuilder(slwAlg): eta_Duplicate = 5, phi_Duplicate = 5 ) - #mlog.info("TrigCaloClusterMaker adding slw tool %s"%trigslw.getFullName()) slwAlg += trigslw slwAlg.ClusterMakerTools=[ trigslw.getFullName() ] @@ -178,7 +188,6 @@ def configureClusterCorrections(slwAlg): if hasattr(slwAlg,clName): continue for tool in make_CaloSwCorrections (cl,version=EgammaSliceFlags.clusterCorrectionVersion()): - #mlog.info("Correction tool %s"%tool.getFullName()) slwAlg += tool slwAlg.ClusterCorrectionTools += [tool.getFullName()] diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaTrackTools.py b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaTrackTools.py new file mode 100644 index 0000000000000000000000000000000000000000..a5fe6863b36d92a8977f798b8746d99579ff985b --- /dev/null +++ b/Trigger/TrigAlgorithms/TrigEgammaRec/python/TrigEgammaTrackTools.py @@ -0,0 +1,112 @@ +# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration + +from AthenaCommon.AppMgr import ServiceMgr as svcMgr, ToolSvc + +from SiClusterOnTrackTool.SiClusterOnTrackToolConf import InDet__PixelClusterOnTrackTool +egTrigPixelClusterOnTrackTool = InDet__PixelClusterOnTrackTool("egTrigPixelClusterOnTrackTool", + DisableDistortions = False, + applyNNcorrection = False) +ToolSvc += egTrigPixelClusterOnTrackTool + +from SiClusterOnTrackTool.SiClusterOnTrackToolConf import InDet__SCT_ClusterOnTrackTool +egTrigSCT_ClusterOnTrackTool = InDet__SCT_ClusterOnTrackTool ("egTrigSCT_ClusterOnTrackTool", + CorrectionStrategy = 0, # do correct position bias + ErrorStrategy = 2) # do use phi dependent errors +ToolSvc += egTrigSCT_ClusterOnTrackTool + + + +from TrkRIO_OnTrackCreator.TrkRIO_OnTrackCreatorConf import Trk__RIO_OnTrackCreator +egTrigRotCreator = Trk__RIO_OnTrackCreator(name = 'egTrigRotCreator', + ToolPixelCluster = egTrigPixelClusterOnTrackTool, + ToolSCT_Cluster = egTrigSCT_ClusterOnTrackTool, + Mode = 'indet') +ToolSvc += egTrigRotCreator + + +from TrkDetDescrSvc.AtlasTrackingGeometrySvc import AtlasTrackingGeometrySvc + +from TrkExRungeKuttaPropagator.TrkExRungeKuttaPropagatorConf import Trk__RungeKuttaPropagator as Propagator +egTrigTrkPropagator = Propagator(name = 'egTrigTrkPropagator') +egTrigTrkPropagator.AccuracyParameter = 0.0001 +ToolSvc += egTrigTrkPropagator + +from TrkExSTEP_Propagator.TrkExSTEP_PropagatorConf import Trk__STEP_Propagator as StepPropagator +egTrigTrkStepPropagator = StepPropagator(name = 'egTrigTrkStepPropagator') +ToolSvc += egTrigTrkStepPropagator + +from TrkExTools.TrkExToolsConf import Trk__Navigator +egTrigTrkNavigator = Trk__Navigator(name = 'egTrigTrkNavigator') +ToolSvc += egTrigTrkNavigator + +from TrkExTools.TrkExToolsConf import Trk__MaterialEffectsUpdator +egTrigTrkMaterialUpdator = Trk__MaterialEffectsUpdator(name = "egTrigTrkMaterialEffectsUpdator") +ToolSvc += egTrigTrkMaterialUpdator + +egTrigTrkSubPropagators = [] +egTrigTrkSubUpdators = [] +# -------------------- set it depending on the geometry ---------------------------------------------------- +# default for ID is (Rk,Mat) +egTrigTrkSubPropagators += [ egTrigTrkPropagator.name() ] +egTrigTrkSubUpdators += [ egTrigTrkMaterialUpdator.name() ] +# default for Calo is (Rk,MatLandau) +egTrigTrkSubPropagators += [ egTrigTrkPropagator.name() ] +egTrigTrkSubUpdators += [ egTrigTrkMaterialUpdator.name() ] +# default for MS is (STEP,Mat) +egTrigTrkSubPropagators += [ egTrigTrkStepPropagator.name() ] +egTrigTrkSubUpdators += [ egTrigTrkMaterialUpdator.name() ] +# ---------------------------------------------------------------------------------------------------------- + +from TrkExTools.TrkExToolsConf import Trk__Extrapolator +egTrigTrkExtrapolator = Trk__Extrapolator(name = 'egTrigTrkExtrapolator', + Propagators = [ egTrigTrkPropagator, egTrigTrkStepPropagator ], + MaterialEffectsUpdators = [ egTrigTrkMaterialUpdator ], + Navigator = egTrigTrkNavigator, + SubPropagators = egTrigTrkSubPropagators, + SubMEUpdators = egTrigTrkSubUpdators) +ToolSvc += egTrigTrkExtrapolator + + +# Set up the GSF +from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GsfMaterialMixtureConvolution +GSFTrigMaterialUpdator = Trk__GsfMaterialMixtureConvolution (name = 'GSFTrigMaterialUpdator') +ToolSvc += GSFTrigMaterialUpdator +# component Reduction +from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__QuickCloseComponentsMultiStateMerger +GSFTrigComponentReduction = Trk__QuickCloseComponentsMultiStateMerger (name = 'GSFTrigComponentReduction', + MaximumNumberOfComponents = 12) +ToolSvc += GSFTrigComponentReduction + +from TrkMeasurementUpdator.TrkMeasurementUpdatorConf import Trk__KalmanUpdator as ConfiguredKalmanUpdator +egTrigTrkUpdator = ConfiguredKalmanUpdator('egTrigTrkUpdator') +ToolSvc += egTrigTrkUpdator + +from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GsfMeasurementUpdator +GSFTrigMeasurementUpdator = Trk__GsfMeasurementUpdator( name = 'GSFTrigMeasurementUpdator', + Updator = egTrigTrkUpdator ) +ToolSvc += GSFTrigMeasurementUpdator + +from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GsfExtrapolator +GSFTrigExtrapolator = Trk__GsfExtrapolator(name = 'GSFTrigExtrapolator', + Propagators = [ egTrigTrkPropagator ], + SearchLevelClosestParameters = 10, + StickyConfiguration = True, + Navigator = egTrigTrkNavigator, + GsfMaterialConvolution = GSFTrigMaterialUpdator, + ComponentMerger = GSFTrigComponentReduction, + SurfaceBasedMaterialEffects = False ) +ToolSvc += GSFTrigExtrapolator + + +from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GaussianSumFitter +GSFTrigTrackFitter = Trk__GaussianSumFitter(name = 'GSFTrigTrackFitter', + ToolForExtrapolation = GSFTrigExtrapolator, + MeasurementUpdatorType = GSFTrigMeasurementUpdator, + ReintegrateOutliers = True, + MakePerigee = True, + RefitOnMeasurementBase = True, + DoHitSorting = True, + ValidationMode = False, + ToolForROTCreation = egTrigRotCreator) +# --- end of fitter loading +ToolSvc += GSFTrigTrackFitter diff --git a/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.cxx b/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.cxx index 578aa0d87c3fe76507b6c895674f1528e8b1f85a..8b95163cef42217d4667e2e1e546c1264740c7e8 100755 --- a/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.cxx +++ b/Trigger/TrigAlgorithms/TrigEgammaRec/src/TrigEgammaRec.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration */ /******************************************************************** @@ -146,6 +146,8 @@ TrigEgammaRec::TrigEgammaRec(const std::string& name,ISvcLocator* pSvcLocator): declareProperty("doTrackMatching",m_doTrackMatching = false, "run TrackMatchBuilder"); // Set flag for conversions declareProperty("doConversions",m_doConversions = false, "run ConversionBuilder"); + /** @brief run GSF refit */ + declareProperty("doBremCollection", m_doBremCollection = false, "run BremCollection"); // Monitoring typedef const DataVector<xAOD::Electron> xAODElectronDV_type; @@ -469,59 +471,59 @@ HLT::ErrorCode TrigEgammaRec::hltInitialize() { if (runIsoType.find(flavName) == runIsoType.end()) runIsoType.insert(flavName); } - // /** @brief Retrieve IsolationTools based on IsoTypes configured */ - // // BROKEN! WORTH FIXING, OR IS THIS FILE NOW OBSOLETE - // if(m_doTrackIsolation){ - // if (!m_trackIsolationTool.empty() && runIsoType.find("ptcone") != runIsoType.end()){ - // ATH_MSG_DEBUG("Retrieve TrackIsolationTool"); - - // if(m_trackIsolationTool.retrieve().isFailure()){ - // ATH_MSG_ERROR("Unable to retrieve " << m_trackIsolationTool); - // return HLT::BAD_JOB_SETUP; - // } - // else { - // ATH_MSG_DEBUG("Retrieved Tool "<<m_trackIsolationTool); - // if (timerSvc()) m_timerIsoTool1 = addTimer("TrackIsolationTool"); - // } - // } - // } else { - m_trackIsolationTool.disable(); - // } - - // if(m_doCaloCellIsolation){ - // if (!m_caloCellIsolationTool.empty() && runIsoType.find("etcone") != runIsoType.end()) { - // ATH_MSG_DEBUG("Retrieve CaloIsolationTool is empty"); - // if(m_caloCellIsolationTool.retrieve().isFailure()){ - // ATH_MSG_ERROR("Unable to retrieve " << m_caloCellIsolationTool); - // return HLT::BAD_JOB_SETUP; - // } - // else { - // ATH_MSG_DEBUG("Retrieved Tool "<<m_caloCellIsolationTool); - // if (timerSvc()) m_timerIsoTool2 = addTimer("CaloCellIsolationTool"); - // } - // } else { - // m_caloCellIsolationTool.disable(); - // } - // } else { - m_caloCellIsolationTool.disable(); - // } - // if(m_doTopoIsolation){ - // if (!m_topoIsolationTool.empty() && runIsoType.find("topoetcone") != runIsoType.end()) { - // ATH_MSG_DEBUG("Retrieve TopoIsolationTool is empty"); - // if(m_topoIsolationTool.retrieve().isFailure()){ - // ATH_MSG_ERROR("Unable to retrieve " << m_topoIsolationTool); - // return HLT::BAD_JOB_SETUP; - // } - // else { - // ATH_MSG_DEBUG("Retrieved Tool "<<m_topoIsolationTool); - // if (timerSvc()) m_timerIsoTool3 = addTimer("topoIsolationTool"); - // } - // } else { - // m_topoIsolationTool.disable(); - // } - // } else { - m_topoIsolationTool.disable(); - // } + /** @brief Retrieve IsolationTools based on IsoTypes configured */ + if(m_doTrackIsolation){ + if (!m_trackIsolationTool.empty() && runIsoType.find("ptcone") != runIsoType.end()){ + ATH_MSG_DEBUG("Retrieve TrackIsolationTool"); + + if(m_trackIsolationTool.retrieve().isFailure()){ + ATH_MSG_ERROR("Unable to retrieve " << m_trackIsolationTool); + return HLT::BAD_JOB_SETUP; + } + else { + ATH_MSG_DEBUG("Retrieved Tool "<<m_trackIsolationTool); + if (timerSvc()) m_timerIsoTool1 = addTimer("TrackIsolationTool"); + } + } + } else { + m_trackIsolationTool.disable(); + } + + if(m_doCaloCellIsolation){ + if (!m_caloCellIsolationTool.empty() && runIsoType.find("etcone") != runIsoType.end()) { + ATH_MSG_DEBUG("Retrieve CaloIsolationTool is empty"); + if(m_caloCellIsolationTool.retrieve().isFailure()){ + ATH_MSG_ERROR("Unable to retrieve " << m_caloCellIsolationTool); + return HLT::BAD_JOB_SETUP; + } + else { + ATH_MSG_DEBUG("Retrieved Tool "<<m_caloCellIsolationTool); + if (timerSvc()) m_timerIsoTool2 = addTimer("CaloCellIsolationTool"); + } + } else { + m_caloCellIsolationTool.disable(); + } + } else { + m_caloCellIsolationTool.disable(); + } + if(m_doTopoIsolation){ + if (!m_topoIsolationTool.empty() && runIsoType.find("topoetcone") != runIsoType.end()) { + ATH_MSG_DEBUG("Retrieve TopoIsolationTool is empty"); + if(m_topoIsolationTool.retrieve().isFailure()){ + ATH_MSG_ERROR("Unable to retrieve " << m_topoIsolationTool); + return HLT::BAD_JOB_SETUP; + } + else { + ATH_MSG_DEBUG("Retrieved Tool "<<m_topoIsolationTool); + if (timerSvc()) m_timerIsoTool3 = addTimer("topoIsolationTool"); + } + } else { + m_topoIsolationTool.disable(); + } + } else { + m_topoIsolationTool.disable(); + } + // <-- //print summary info ATH_MSG_INFO("REGTEST: xAOD Reconstruction for Run2" ); ATH_MSG_INFO("REGTEST: Initialization completed successfully, tools initialized: " ); @@ -546,6 +548,7 @@ HLT::ErrorCode TrigEgammaRec::hltInitialize() { ATH_MSG_DEBUG("REGTEST: Do Track Isolation: " << m_doTrackIsolation); ATH_MSG_DEBUG("REGTEST: Do CaloCell Isolation: "<< m_doCaloCellIsolation); ATH_MSG_DEBUG("REGTEST: Do TopoIsolation: " << m_doTopoIsolation); + ATH_MSG_DEBUG("REGTEST: run bremBuilding: " << m_doBremCollection); ATH_MSG_DEBUG("REGTEST: Use BremAssoc: " << m_useBremAssoc); ATH_MSG_INFO("REGTEST: ElectronContainerName: " << m_electronContainerName ); @@ -635,28 +638,30 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, } - // bool topoClusTrue = false; - // std::vector<const xAOD::CaloClusterContainer*> vectorClusterContainerTopo; - // if(m_doTopoIsolation){ - // stat = getFeatures(inputTE, vectorClusterContainerTopo,m_topoClusterContName); + bool topoClusTrue = false; + std::vector<const xAOD::CaloClusterContainer*> vectorClusterContainerTopo; + if(m_doTopoIsolation){ + stat = getFeatures(inputTE, vectorClusterContainerTopo,m_topoClusterContName); - // if ( stat!= HLT::OK ) { - // ATH_MSG_ERROR(" REGTEST: No CaloTopoClusterContainers retrieved for the trigger element"); - // //return HLT::OK; // If you did not get it, it is not a problem, continue! - // } + // -> From here is broken? + if ( stat!= HLT::OK ) { + ATH_MSG_ERROR(" REGTEST: No CaloTopoClusterContainers retrieved for the trigger element"); + //return HLT::OK; // If you did not get it, it is not a problem, continue! + } - // //debug message - // if ( msgLvl() <= MSG::VERBOSE){ - // msg() << MSG::VERBOSE << " REGTEST: Got " << vectorClusterContainerTopo.size() - // << " CaloCTopoclusterContainers associated to the TE " << endmsg; - // } - // // Get the last ClusterContainer - // if ( !vectorClusterContainerTopo.empty() ) { - // const xAOD::CaloClusterContainer* clusContainerTopo = vectorClusterContainerTopo.back(); - // if (clusContainerTopo->size() > 0) topoClusTrue = true; - // ATH_MSG_DEBUG("REGTEST: Number of topo containers : " << clusContainerTopo->size()); - // } // vector of Cluster Container empty?! - // } + //debug message + if ( msgLvl() <= MSG::VERBOSE){ + msg() << MSG::VERBOSE << " REGTEST: Got " << vectorClusterContainerTopo.size() + << " CaloCTopoclusterContainers associated to the TE " << endmsg; + } + // Get the last ClusterContainer + if ( !vectorClusterContainerTopo.empty() ) { + const xAOD::CaloClusterContainer* clusContainerTopo = vectorClusterContainerTopo.back(); + if (clusContainerTopo->size() > 0) topoClusTrue = true; + ATH_MSG_DEBUG("REGTEST: Number of topo containers : " << clusContainerTopo->size()); + } // vector of Cluster Container empty?! + } + // <-- up to here if(msgLvl() <= MSG::DEBUG) msg() << MSG::DEBUG @@ -672,6 +677,7 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, std::string electronContSGKey=""; std::string electronKey=""; HLT::ErrorCode sc = getUniqueKey( m_electron_container, electronContSGKey, electronKey); + ATH_MSG_DEBUG("The electron container SG key created is: " << electronContSGKey); if (sc != HLT::OK) { msg() << MSG::DEBUG << "Could not retrieve the electron container key" << endmsg; return sc; @@ -700,7 +706,7 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, // Shower Shape & CaloCellContainer const CaloCellContainer* pCaloCellContainer = 0; - //const xAOD::CaloClusterContainer* pTopoClusterContainer = 0; + const xAOD::CaloClusterContainer* pTopoClusterContainer = 0; // Get vector of pointers to all CaloCellContainers from TE std::string clusCollKey=""; @@ -748,7 +754,57 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, if ( msgLvl() <= MSG::VERBOSE) msg() << MSG::VERBOSE << "Running m_showerBuilder: " << m_showerBuilder << endmsg; } //pCaloCellContainer } - //if(topoClusTrue) pTopoClusterContainer = vectorClusterContainerTopo.back(); + if(topoClusTrue) pTopoClusterContainer = vectorClusterContainerTopo.back(); + } + + + //******************************************************************************** + xAOD::TrackParticleContainer *GSFTrigTrackParticles = new xAOD::TrackParticleContainer(); + if (m_doBremCollection){ + + ATH_MSG_DEBUG("In m_doBremCollection"); + ATH_MSG_DEBUG(" REGTEST: Got " << vectorClusterContainer.size() << " CaloClusterContainers associated to the TE "); + if (vectorClusterContainer.size() != 1){ + ATH_MSG_ERROR("REGTEST: Size of vectorClusterContainer is not 1, it is: "<< vectorClusterContainer.size()); + return HLT::NAV_ERROR; + } + + // Get the last ClusterContainer + const xAOD::CaloClusterContainer* clusContainer = vectorClusterContainer.back(); + if(!clusContainer){ + return HLT::OK; + } + + ATH_MSG_DEBUG (clusContainer->size() << " calo clusters in container"); + + + std::vector<const xAOD::TrackParticleContainer*> vectorTrackParticleContainer; + stat = getFeatures(inputTE, vectorTrackParticleContainer); + + if (stat != HLT::OK) { + ATH_MSG_DEBUG(" REGTEST: no TrackParticleContainer from TE, m_doBremCollection "); + return HLT::NAV_ERROR; + } + + const xAOD::TrackParticleContainer *tracks = vectorTrackParticleContainer.back(); + if (!tracks || tracks->size()<1){ + return HLT::OK; + } + for (const xAOD::TrackParticle *trk:*tracks) { + ATH_MSG_DEBUG("track pt is: " << trk->pt()); + } + + + + for (const xAOD::TrackParticle *trk:*GSFTrigTrackParticles) { + ATH_MSG_DEBUG("GSFTrigTrackParticles pt is: " << trk->pt()); + } + + if (HLT::OK != attachFeature( outputTE, GSFTrigTrackParticles, "GSFTrigTrackParticles") ){ + ATH_MSG_ERROR("REGTEST: trigger xAOD::TrackParticleContainer for GSF attach to TE and record into StoreGate failed"); + return HLT::NAV_ERROR; + } + } //********************************************************************** @@ -775,8 +831,11 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, << " REGTEST: empty TrackParticleContainer from TE, m_trackMatchBuilder: " << m_trackMatchBuilder << endmsg; } else { - // Get the pointer to last TrackParticleContainer - pTrackParticleContainer = vectorTrackParticleContainer.back(); + // Get the pointer to last TrackParticleContainer + if(m_doBremCollection){ + pTrackParticleContainer = GSFTrigTrackParticles; + } + else pTrackParticleContainer = vectorTrackParticleContainer.back(); m_doTrackMatching = true; if(!pTrackParticleContainer){ m_doTrackMatching = false; @@ -796,6 +855,7 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, float leadTrkpt=0.0; const xAOD::TrackParticle *leadTrk=NULL; for (const xAOD::TrackParticle *trk:*pTrackParticleContainer) { + ATH_MSG_DEBUG("In track matching, track pt: " << trk->pt()); if(trk->pt() > leadTrkpt) { leadTrkpt = trk->pt(); leadTrk=trk; @@ -894,7 +954,10 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, } ElementLinkVector<xAOD::TrackParticleContainer> trackLinks; - stat=getFeaturesLinks< xAOD::TrackParticleContainer, xAOD::TrackParticleContainer > (inputTE, trackLinks, ""); + if(m_doBremCollection){ + stat=getFeaturesLinks< xAOD::TrackParticleContainer, xAOD::TrackParticleContainer > (outputTE, trackLinks, ""); + } + else stat=getFeaturesLinks< xAOD::TrackParticleContainer, xAOD::TrackParticleContainer > (inputTE, trackLinks, ""); if ( stat != HLT::OK ) { ATH_MSG_ERROR("REGTEST: No TrackParticleLinks retrieved for the trigger element"); //May need to add ERROR codes for online debugging @@ -1082,53 +1145,61 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, // Isolation // // Calo Isolation types - - // THIS IS NOW BROKEN. IS IT WORTH FIXING, OR WILL THIS BECOME OBSOLETE IN 22.0? - - // if(m_doCaloCellIsolation || m_doTopoIsolation){ - // if (timerSvc()) m_timerIsoTool2->start(); //timer - // std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end(); - // for (; itc != itcE; itc++) { - // CaloIsoHelp isoH = itc->second; - // std::string flav = itc->first; - // bool bsc = false; - // if (flav == "etcone" && pCaloCellContainer) - // bsc = m_caloCellIsolationTool->decorateParticle_caloCellIso(*eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer); - // /*else if (flav == "topoetcone" ) - // // Add check for topoclusters (when available); - // //bsc = m_topoIsolationTool->decorateParticle_topoClusterIso(*eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer);*/ - // if (!bsc && flav=="etcone") - // ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav); - // } - // ATH_MSG_DEBUG(" REGTEST: etcone20 = " << getIsolation_etcone20(eg)); - // ATH_MSG_DEBUG(" REGTEST: etcone30 = " << getIsolation_etcone30(eg)); - // ATH_MSG_DEBUG(" REGTEST: etcone40 = " << getIsolation_etcone40(eg)); - // if (timerSvc()) m_timerIsoTool2->stop(); //timer - // } - // if(m_doTrackIsolation){ - // ATH_MSG_DEBUG("Running TrackIsolationTool for Electrons"); - - // if (timerSvc()) m_timerIsoTool1->start(); //timer - // if(m_egTrackIso.size() != 0) { - // // Track Isolation types - // std::map<std::string,TrackIsoHelp>::iterator itt = m_egTrackIso.begin(), ittE = m_egTrackIso.end(); - // for (; itt != ittE; itt++) { - // TrackIsoHelp isoH = itt->second; - // std::string flav = itt->first; - // const std::set<const xAOD::TrackParticle*> tracksToExclude = xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); // For GSF this may need to be property - // // Need the decorate methods from IsolationTool - // bool bsc = m_trackIsolationTool->decorateParticle(*eg, isoH.help.isoTypes, isoH.CorrList, &leadTrkVtx, &tracksToExclude,pTrackParticleContainer); - // if (!bsc) - // ATH_MSG_WARNING("Call to TrackIsolationTool failed for flavour " << flav); - // } - // ATH_MSG_DEBUG(" REGTEST: ptcone20 = " << getIsolation_ptcone20(eg)); - // ATH_MSG_DEBUG(" REGTEST: ptcone30 = " << getIsolation_ptcone30(eg)); - // ATH_MSG_DEBUG(" REGTEST: ptcone40 = " << getIsolation_ptcone40(eg)); - - // } - // if (timerSvc()) m_timerIsoTool1->stop(); //timer - // } + if(m_doCaloCellIsolation || m_doTopoIsolation){ + if (timerSvc()) m_timerIsoTool2->start(); //timer + std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end(); + for (; itc != itcE; itc++) { + CaloIsoHelp isoH = itc->second; + std::string flav = itc->first; + bool bsc = false; + bool tbsc = false; + xAOD::CaloIsolation CaloIsoResult; + xAOD::CaloIsolation TopoIsoResult; + if (flav == "etcone" && pCaloCellContainer) { + bsc = m_caloCellIsolationTool->caloCellIsolation(CaloIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer); + } else if (flav == "topoetcone" && topoClusTrue) { + // Add check for topoclusters (when available); + tbsc = m_topoIsolationTool->caloTopoClusterIsolation(TopoIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer); + } + if (!bsc && m_doCaloCellIsolation && flav=="etcone") { + ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav); + } + if (!tbsc && m_doTopoIsolation && flav =="topoetcone") { + ATH_MSG_WARNING("Call to CaloTopoIsolationTool failed for flavour " << flav); + } + + ATH_MSG_DEBUG(" REGTEST: etcone " << flav << " = " << CaloIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]); + ATH_MSG_DEBUG(" REGTEST: topoetcone40 " << flav << " = " << TopoIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]); + + } + if (timerSvc()) m_timerIsoTool2->stop(); //timer + } + if(m_doTrackIsolation){ + ATH_MSG_DEBUG("Running TrackIsolationTool for Electrons"); + + if (timerSvc()) m_timerIsoTool1->start(); //timer + if(m_egTrackIso.size() != 0) { + // Track Isolation types + std::map<std::string,TrackIsoHelp>::iterator itt = m_egTrackIso.begin(), ittE = m_egTrackIso.end(); + xAOD::TrackIsolation isoresult; + for (; itt != ittE; itt++) { + TrackIsoHelp isoH = itt->second; + std::string flav = itt->first; + const std::set<const xAOD::TrackParticle*> tracksToExclude = xAOD::EgammaHelpers::getTrackParticles(eg, m_useBremAssoc); // For GSF this may need to be property + // Need the decorate methods from IsolationTool + bool bsc = m_trackIsolationTool->trackIsolation(isoresult, *eg, isoH.help.isoTypes, isoH.CorrList, &leadTrkVtx, &tracksToExclude,pTrackParticleContainer); + if (!bsc) + ATH_MSG_WARNING("Call to TrackIsolationTool failed for flavour " << flav); + } + ATH_MSG_DEBUG(" REGTEST: ptcone20 = " << isoresult.ptcones[0]); + ATH_MSG_DEBUG(" REGTEST: ptcone30 = " << isoresult.ptcones[1]); + ATH_MSG_DEBUG(" REGTEST: ptcone40 = " << isoresult.ptcones[2]); + + if (timerSvc()) m_timerIsoTool1->stop(); //timer + } + } + // // PID ATH_MSG_DEBUG("about to run execute(eg) for PID"); if (timerSvc()) m_timerPIDTool1->start(); //timer @@ -1169,35 +1240,35 @@ HLT::ErrorCode TrigEgammaRec::hltExecute( const HLT::TriggerElement* inputTE, // Isolation - // BROKEN. WORTH FIXING, OR IS THIS FILE MOVING? - // if(m_doCaloCellIsolation || m_doTopoIsolation){ - // if (timerSvc()) m_timerIsoTool2->start(); //timer - // std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end(); - // for (; itc != itcE; itc++) { - // CaloIsoHelp isoH = itc->second; - // std::string flav = itc->first; - // bool bsc = false; - // bool tbsc = false; - // if (flav == "etcone" && pCaloCellContainer) - // bsc = m_caloCellIsolationTool->decorateParticle_caloCellIso(*eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer); - // else if (flav == "topoetcone" && topoClusTrue) - // // Add check for topoclusters (when available); - // tbsc = m_topoIsolationTool->decorateParticle_topoClusterIso(*eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer); - // if (!bsc && m_doCaloCellIsolation && flav=="etcone") - // ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav); - // if (!tbsc && m_doTopoIsolation && flav =="topoetcone") - // ATH_MSG_WARNING("Call to CaloTopoIsolationTool failed for flavour " << flav); - // } - // ATH_MSG_DEBUG(" REGTEST: etcone20 = " << getIsolation_etcone20(eg)); - // ATH_MSG_DEBUG(" REGTEST: etcone30 = " << getIsolation_etcone30(eg)); - // ATH_MSG_DEBUG(" REGTEST: etcone40 = " << getIsolation_etcone40(eg)); - // ATH_MSG_DEBUG(" REGTEST: topoetcone20 = " << getIsolation_topoetcone20(eg)); - // ATH_MSG_DEBUG(" REGTEST: topoetcone30 = " << getIsolation_topoetcone30(eg)); - // ATH_MSG_DEBUG(" REGTEST: topoetcone40 = " << getIsolation_topoetcone40(eg)); - - // if (timerSvc()) m_timerIsoTool2->stop(); //timer - // } - + if(m_doCaloCellIsolation || m_doTopoIsolation){ + if (timerSvc()) m_timerIsoTool2->start(); //timer + std::map<std::string,CaloIsoHelp>::iterator itc = m_egCaloIso.begin(), itcE = m_egCaloIso.end(); + for (; itc != itcE; itc++) { + CaloIsoHelp isoH = itc->second; + std::string flav = itc->first; + bool bsc = false; + bool tbsc = false; + xAOD::CaloIsolation CaloIsoResult; + xAOD::CaloIsolation TopoIsoResult; + if (flav == "etcone" && pCaloCellContainer){ + bsc = m_caloCellIsolationTool->caloCellIsolation(CaloIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pCaloCellContainer); + } else if (flav == "topoetcone" && topoClusTrue) { + // Add check for topoclusters (when available); + tbsc = m_topoIsolationTool->caloTopoClusterIsolation(TopoIsoResult, *eg, isoH.help.isoTypes, isoH.CorrList, pTopoClusterContainer); + } + if (!bsc && m_doCaloCellIsolation && flav=="etcone") { + ATH_MSG_WARNING("Call to CaloIsolationTool failed for flavour " << flav); + } + if (!tbsc && m_doTopoIsolation && flav =="topoetcone") { + ATH_MSG_WARNING("Call to CaloTopoIsolationTool failed for flavour " << flav); + } + ATH_MSG_DEBUG(" REGTEST: etcone " << flav << " = " << CaloIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]); + ATH_MSG_DEBUG(" REGTEST: topoetcone40 " << flav << " = " << TopoIsoResult.etcones[std::distance(m_egCaloIso.begin(), itc)]); + } + + if (timerSvc()) m_timerIsoTool2->stop(); //timer + } + // Particle ID if (timerSvc()) m_timerPIDTool3->start(); //timer if( m_photonPIDBuilder->execute(ctx, eg)){