Skip to content
Snippets Groups Projects
Commit f767f868 authored by Vakhtang Tsulaia's avatar Vakhtang Tsulaia
Browse files

Merge branch 'TrigL2EgammaFexForSep2017hackathon' into 'master'

migrate to new method of declaring ReadHandles and Properties and add monitoring

See merge request !4712

Former-commit-id: f2adfd28
parents 6efaab8b e6056531
No related merge requests found
......@@ -11,6 +11,7 @@ atlas_depends_on_subdirs( PUBLIC
Calorimeter/CaloUtils
Control/DataModel
Control/StoreGate
Control/AthenaMonitoring
Event/xAOD/xAODCaloEvent
Event/xAOD/xAODEgamma
Event/xAOD/xAODTracking
......@@ -57,7 +58,7 @@ atlas_add_component( TrigEgammaHypo
src/*.cxx
src/components/*.cxx
INCLUDE_DIRS ${AIDA_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS}
LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} CaloUtilsLib DataModel AthenaBaseComps StoreGateLib SGtests xAODCaloEvent xAODEgamma xAODTracking xAODTrigCalo xAODTrigEgamma GaudiKernel LumiBlockCompsLib PATCoreLib ElectronPhotonSelectorToolsLib TrkSurfaces VxVertex TrigCaloEvent TrigInDetEvent TrigParticle TrigSteeringEvent TrigInterfacesLib TrigT1Interfaces TrigTimeAlgsLib CaloEvent CxxUtils ITrackToVertex RecoToolInterfaces egammaEvent egammaMVACalibLib TrkCaloExtension TrigCaloRecLib TrigMissingEtEvent TrigNavigationLib DecisionHandlingLib AthViews )
LINK_LIBRARIES ${ROOT_LIBRARIES} ${CLHEP_LIBRARIES} CaloUtilsLib DataModel AthenaBaseComps StoreGateLib SGtests AthenaMonitoringLib xAODCaloEvent xAODEgamma xAODTracking xAODTrigCalo xAODTrigEgamma GaudiKernel LumiBlockCompsLib PATCoreLib ElectronPhotonSelectorToolsLib TrkSurfaces VxVertex TrigCaloEvent TrigInDetEvent TrigParticle TrigSteeringEvent TrigInterfacesLib TrigT1Interfaces TrigTimeAlgsLib CaloEvent CxxUtils ITrackToVertex RecoToolInterfaces egammaEvent egammaMVACalibLib TrkCaloExtension TrigCaloRecLib TrigMissingEtEvent TrigNavigationLib DecisionHandlingLib AthViews )
# Install files from the package:
atlas_install_headers( TrigEgammaHypo )
......
......@@ -10,19 +10,14 @@ from AthenaCommon.SystemOfUnits import GeV, mm
from AthenaCommon.AppMgr import ToolSvc
from AthenaMonitoring.GenericMonitoringTool import GenericMonitoringTool,defineHistogram
# ---------------------------------------------------------------
# class for common setups (like monitoring)
class L2ElectronFexBase(TrigL2ElectronFexMT):
__slots__ = []
def __init__(self, name):
super(L2ElectronFexBase,self).__init__(name)
# from TrigEgammaHypo.TrigL2ElectronHypoMonitoring import TrigL2ElectronFexValidationMonitoring, TrigL2ElectronFexOnlineMonitoring
# validation = TrigL2ElectronFexValidationMonitoring()
# online = TrigL2ElectronFexOnlineMonitoring()
# from TrigTimeMonitor.TrigTimeHistToolConfig import TrigTimeHistToolConfig
# time = TrigTimeHistToolConfig("Time")
# self.AthenaMonTools = [ time, validation, online ]
# Tracking cuts
self.TrackPt = 1.0 * GeV
......@@ -36,6 +31,21 @@ class L2ElectronFexBase(TrigL2ElectronFexMT):
self.CaloTrackdEoverPLow = 0.0
self.CaloTrackdEoverPHigh = 999.0
from TriggerJobOpts.TriggerFlags import TriggerFlags
if 'Validation' in TriggerFlags.enableMonitoring() or 'Online' in TriggerFlags.enableMonitoring():
monTool = GenericMonitoringTool('MonTool')
monTool.Histograms +=[defineHistogram('CaloTrackdEta', path='EXPERT', type='TH1F', title="L2Electron Hypo #Delta #eta between cluster and track;#Delta #eta;Nevents", xbins=80, xmin=-0.4, xmax=0.4) ]
monTool.Histograms +=[defineHistogram('CaloTrackdPhi', path='EXPERT', type='TH1F', title="L2Electron Hypo #Delta #phi between cluster and track;#Delta #phi;Nevents", xbins=80, xmin=-0.4, xmax=0.4) ]
monTool.Histograms +=[defineHistogram('CaloTrackEoverP', path='EXPERT', type='TH1F', title="L2Electron Hypo E/p;E/p;Nevents", xbins=120, xmin=0, xmax=12) ]
monTool.Histograms +=[defineHistogram('PtTrack', path='EXPERT', type='TH1F', title="L2Electron Hypo p_{T}^{track} [MeV];p_{T}^{track} [MeV];Nevents", xbins=50, xmin=0, xmax=100000) ]
monTool.Histograms +=[defineHistogram('PtCalo', path='EXPERT', type='TH1F', title="L2Electron Hypo p_{T}^{calo} [MeV];p_{T}^{calo} [MeV];Nevents", xbins=50, xmin=0, xmax=100000) ]
monTool.Histograms +=[defineHistogram('CaloEta',path='EXPERT', type='TH1F', title="L2Electron Hypo #eta^{calo} ; #eta^{calo};Nevents", xbins=200, xmin=-2.5, xmax=2.5) ]
monTool.Histograms +=[defineHistogram('CaloPhi', path='EXPERT', type='TH1F', title="L2Electron Hypo #phi^{calo} ; #phi^{calo};Nevents", xbins=320, xmin=-3.2, xmax=3.2) ]
monTool.Histograms +=[defineHistogram('CaloTrackdEtaNoExtrapMon', path='EXPERT',type='TH1F', title="L2Electron Fex #Delta #eta between cluster and track;#Delta #eta;Nevents", xbins=80, xmin=-0.4, xmax=0.4) ]
self.MonTool = monTool
# ---------------------------------------------------------------
# TrigL2ElectronFex configurations
# ---------------------------------------------------------------
......
......@@ -20,7 +20,6 @@
** N.Berger Dec.06 - migrate to new steering (RG)
**************************************************************************/
#include "RecoToolInterfaces/IParticleCaloExtensionTool.h"
#include "TrkCaloExtension/CaloExtensionHelpers.h"
#include "TrigL2ElectronFexMT.h"
#include "xAODTrigCalo/TrigEMClusterContainer.h"
......@@ -34,50 +33,12 @@ inline const DataVector<xAOD::TrigElectron>** dvec_cast(SRC** ptr) {
TrigL2ElectronFexMT::TrigL2ElectronFexMT(const std::string & name, ISvcLocator* pSvcLocator)
: AthAlgorithm(name, pSvcLocator),
m_caloExtensionTool("Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"),
m_roiCollectionKey(""),
m_TrigEMClusterContainerKey(""),
m_TrackParticleContainerKey(""),
m_outputElectronsKey("")
: AthAlgorithm(name, pSvcLocator)
{
declareProperty( "AcceptAll", m_acceptAll = false );
declareProperty( "ClusEt", m_clusEtthr = 20.0*CLHEP::GeV );
declareProperty( "TrackPt", m_trackPtthr = 5.0*CLHEP::GeV );
declareProperty( "CaloTrackdEtaNoExtrap", m_calotrkdeta_noextrap );
declareProperty( "TrackPtHighEt", m_trackPtthr = 2.0*CLHEP::GeV );
declareProperty( "CaloTrackdEtaNoExtrapHighEt", m_calotrkdeta_noextrap_highet = 0);
declareProperty( "CaloTrackdETA", m_calotrackdeta = 0);
declareProperty( "CaloTrackdPHI", m_calotrackdphi = 0);
declareProperty( "CaloTrackdEoverPLow", m_calotrackdeoverp_low = 0);
declareProperty( "CaloTrackdEoverPHigh", m_calotrackdeoverp_high = 0);
declareProperty( "RCalBarrelFace", m_RCAL = 1470.0*CLHEP::mm );
declareProperty( "ZCalEndcapFace", m_ZCAL = 3800.0*CLHEP::mm );
declareProperty( "ParticleCaloExtensionTool", m_caloExtensionTool);
declareProperty("TrackParticlesName",
m_TrackParticleContainerKey = std::string("Tracks"),
"TrackParticle container");
declareProperty("ElectronsName",
m_outputElectronsKey = std::string("Electrons"),
"Electron container");
declareProperty("RoIs",
m_roiCollectionKey = std::string("rois"),
"RoI Collection");
declareProperty("TrigEMClusterName",
m_TrigEMClusterContainerKey = std::string("clusters"),
"TrigEMCluster Container");
// declareMonitoredStdContainer("PtCalo",m_calopt_mon);
//declareMonitoredStdContainer("PtTrack",m_trackpt_mon);
//declareMonitoredStdContainer("CaloTrackdEta",m_calotrackdeta_mon);
//declareMonitoredStdContainer("CaloTrackdPhi",m_calotrackdphi_mon);
//declareMonitoredStdContainer("CaloTrackEoverP",m_calotrackdeoverp_mon);
//declareMonitoredStdContainer("CaloTrackdEtaNoExtrapMon",m_calotrkdeta_noextrap_mon);
// initialize error counter
// TODO: Replace this with a .h property once Gaudi!385 has been merged
declareProperty("MonTool", m_monTool=VoidMonitoringTool(this), "Monitoring tool");
m_extrapolator_failed = 0;
}
......@@ -90,13 +51,12 @@ StatusCode TrigL2ElectronFexMT::initialize()
{
ATH_MSG_DEBUG("Initialization:");
ATH_CHECK( m_roiCollectionKey.initialize() );
ATH_CHECK( m_TrigEMClusterContainerKey.initialize() );
ATH_CHECK( m_TrackParticleContainerKey.initialize() );
ATH_CHECK( m_outputElectronsKey.initialize() );
if (!m_monTool.empty()) {
ATH_MSG_DEBUG("Retrieving monTool");
CHECK(m_monTool.retrieve());
} else {
ATH_MSG_INFO("No monTool configured => NO MONITOING");
}
// initialize error counter
m_extrapolator_failed = 0;
......@@ -119,6 +79,11 @@ StatusCode TrigL2ElectronFexMT::initialize()
ATH_MSG_DEBUG("CaloTrackdEoverPLow = " << m_calotrackdeoverp_low);
ATH_MSG_DEBUG("CaloTrackdEoverPHigh = " << m_calotrackdeoverp_high);
ATH_CHECK( m_roiCollectionKey.initialize() );
ATH_CHECK( m_TrigEMClusterContainerKey.initialize() );
ATH_CHECK( m_TrackParticleContainerKey.initialize() );
ATH_CHECK( m_outputElectronsKey.initialize() );
return StatusCode::SUCCESS;
}
......@@ -135,14 +100,12 @@ StatusCode TrigL2ElectronFexMT::finalize()
StatusCode TrigL2ElectronFexMT::execute() {
// Collection may be never used. Better only create if necessary
// NULL value is specially important to avoid crashs in monitoring
//m_trigElecColl = NULL;
using namespace Monitored;
using namespace xAOD;
auto ctx = getContext();
auto trigElecColl = SG::makeHandle (m_outputElectronsKey, ctx);
auto trigElecColl = SG::makeHandle (m_outputElectronsKey, ctx);
ATH_CHECK( trigElecColl.record (std::make_unique<xAOD::TrigElectronContainer>(),
std::make_unique<xAOD::TrigEMClusterAuxContainer>()) );
......@@ -197,6 +160,23 @@ StatusCode TrigL2ElectronFexMT::execute() {
size_t coll_size = tracks->size();
trigElecColl->reserve(coll_size);
// monitoring
std::vector<float> calotrkdeta_noextrap_mon; //!< monitor preselection between track eta and cluster before extrapolation
std::vector<float> calotrackdeta_mon;
std::vector<float> calotrackdphi_mon;
std::vector<float> calotrackdeoverp_mon;
std::vector<float> trackpt_mon;
std::vector<float> calopt_mon;
auto mon1 = MonitoredCollection::declare("PtCalo", calopt_mon);
auto mon2 = MonitoredCollection::declare("PtTrack", trackpt_mon);
auto mon3 = MonitoredCollection::declare("CaloTrackdEta", calotrackdeta_mon);
auto mon4 = MonitoredCollection::declare("CaloTrackdPhi", calotrackdphi_mon);
auto mon5 = MonitoredCollection::declare("CaloTrackEoverP", calotrackdeoverp_mon);
auto mon6 = MonitoredCollection::declare("CaloTrackdEtaNoExtrapMon", calotrkdeta_noextrap_mon);
auto mon = MonitoredScope::declare(m_monTool, mon1, mon2, mon3, mon4, mon5, mon6);
// loop over tracks
unsigned int track_index=0;
......@@ -220,7 +200,7 @@ StatusCode TrigL2ElectronFexMT::execute() {
if(!extrapolate(el_t2calo_clus,trkIter,etaAtCalo,phiAtCalo)){
ATH_MSG_VERBOSE("extrapolator failed");
continue;
}
}
else{
ATH_MSG_VERBOSE("REGTEST: TrigElectron: cluster index = " << clusEL.index() <<
" track = " << trkIter << " eta = " << etaAtCalo << " phi = " << phiAtCalo);
......@@ -232,12 +212,12 @@ StatusCode TrigL2ElectronFexMT::execute() {
etaAtCalo, phiAtCalo, etoverpt,
clusEL,
trackEL);
m_calotrackdeta_mon.push_back(trigElec->trkClusDeta());
m_calotrackdphi_mon.push_back(trigElec->trkClusDphi());
m_calotrackdeoverp_mon.push_back(trigElec->etOverPt());
m_trackpt_mon.push_back(getTkPt(trigElec));
m_calopt_mon.push_back(getCaloPt(trigElec));
m_calotrkdeta_noextrap_mon.push_back(calotrkdeta_noextrap);
calotrackdeta_mon.push_back(trigElec->trkClusDeta());
calotrackdphi_mon.push_back(trigElec->trkClusDphi());
calotrackdeoverp_mon.push_back(trigElec->etOverPt());
trackpt_mon.push_back(getTkPt(trigElec));
calopt_mon.push_back(getCaloPt(trigElec));
calotrkdeta_noextrap_mon.push_back(calotrkdeta_noextrap);
}
}
else {
......@@ -317,12 +297,12 @@ StatusCode TrigL2ElectronFexMT::execute() {
<< " phiAtCalo = " << phiAtCalo << " phiAtCalo = " << trigElec->trkPhiAtCalo()
);
m_calotrackdeta_mon.push_back(trigElec->trkClusDeta());
m_calotrackdphi_mon.push_back(trigElec->trkClusDphi());
m_calotrackdeoverp_mon.push_back(trigElec->etOverPt());
m_trackpt_mon.push_back(getTkPt(trigElec));
m_calopt_mon.push_back(getCaloPt(trigElec));
m_calotrkdeta_noextrap_mon.push_back(calotrkdeta_noextrap);
calotrackdeta_mon.push_back(trigElec->trkClusDeta());
calotrackdphi_mon.push_back(trigElec->trkClusDphi());
calotrackdeoverp_mon.push_back(trigElec->etOverPt());
trackpt_mon.push_back(getTkPt(trigElec));
calopt_mon.push_back(getCaloPt(trigElec));
calotrkdeta_noextrap_mon.push_back(calotrkdeta_noextrap);
}
track_index++;
}
......
......@@ -43,9 +43,11 @@
#include "xAODTrigCalo/TrigEMCluster.h"
#include "xAODTrigEgamma/TrigElectron.h"
#include "xAODTrigEgamma/TrigElectronContainer.h"
#include "RecoToolInterfaces/IParticleCaloExtensionTool.h"
namespace Trk
{ class IParticleCaloExtensionTool; }
#include "AthenaMonitoring/GenericMonitoringTool.h"
//namespace Trk
//{ class IParticleCaloExtensionTool; }
/**
* \class TrigL2ElectronFexMT
......@@ -57,12 +59,6 @@ namespace Trk
* The TrigElectron conatiner will then be retrieved by the hypothesis algorithm TrigL2ElectronHypo
* that will perform the corresponding L2 electron selection
*
* Cleanup / Update for Run2
* Remove m_calo_algoID; m_trackalgoID -- only 1 type of track
* Remove deta/dphi cluster -- this is checked at L2Calo
* Remove track pt for TRT tracks -- TRT only not used
* Remove m_calotrackdeta/dphiTRT -- not cutting on TRT tracks
* calotrack deta/dphi and eoverp cuts flat (not as function of eta)
*/
class TrigL2ElectronFexMT : public AthAlgorithm {
......@@ -79,29 +75,6 @@ class TrigL2ElectronFexMT : public AthAlgorithm {
private:
//tracking cut
float m_trackPtthr;
float m_trackPtthr_highet; //!< track pt cut for high et cluster (20 GeV)
float m_clusEtthr; //!< cluster Et threshold for high et cuts
float m_calotrkdeta_noextrap; //!< preselection between track eta and cluster before extrapolation
float m_calotrkdeta_noextrap_highet; //!< preselection between track eta and cluster before extrapolation for high et cluster
//calo-tracking cuts
float m_calotrackdeta; //!< deta between calo and track
float m_calotrackdphi; //!< dphi between calo and track
float m_calotrackdeoverp_low; //!< E/p lower cut between calo and track
float m_calotrackdeoverp_high; //!< E/p upper cut between calo and track
//radius and Z of calorimeter face
float m_RCAL; //!< radious of calorimeter face
float m_ZCAL; //!< Z of calorimeter face
// build electrons for all tracks
bool m_acceptAll;
// for extrapolating TrigInDetTracks to calorimeter surface
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtensionTool;
// track-extrapolation error counter
unsigned long m_extrapolator_failed;
......@@ -117,18 +90,44 @@ class TrigL2ElectronFexMT : public AthAlgorithm {
}
bool extrapolate(const xAOD::TrigEMCluster *, const xAOD::TrackParticle *, double &, double &);
// Algorithm properties: the parameters are {this, <name>, <default value>, <documentation>}
Gaudi::Property<bool> m_acceptAll {this, "AcceptAll", false, "Build electrons for all tracks"};
Gaudi::Property<float> m_clusEtthr {this, "ClusEt", 20.0*CLHEP::GeV , " lower limit on cluster Et"};
Gaudi::Property<float> m_trackPtthr {this, "TrackPt", 5.0*CLHEP::GeV , "lower limit on TrackPt cut" };
Gaudi::Property<float> m_calotrkdeta_noextrap {this, "CaloTrackdEtaNoExtrap", 0.5, "Upper limit on DEta between Calo cluster and Track for track preselection before extrapolation"};
Gaudi::Property<float> m_trackPtthr_highet {this, "TrackPtHighEt", 2.0*CLHEP::GeV , "lower limit on TrackPt cut High Et Cluster (20GeV)"};
Gaudi::Property<float> m_calotrkdeta_noextrap_highet {this, "CaloTrackdEtaNoExtrapHighEt", 0, "upper limit on DEta between Calo cluster and Track for track preselection before extrapolation for High Et cluster (20GeV)"};
Gaudi::Property<float> m_calotrackdeta {this, "CaloTrackdETA", 0, "Upper limit on DEta between Calo cluster and Track"};
Gaudi::Property<float> m_calotrackdphi {this, "CaloTrackdPHI", 0, "Upper limit on DPhi between Calo cluster and Track"};
Gaudi::Property<float> m_calotrackdeoverp_low {this, "CaloTrackdEoverPLow", 0, "lower limit on E(calo)/p(track)"};
Gaudi::Property<float> m_calotrackdeoverp_high {this, "CaloTrackdEoverPHigh", 0, "upper limit on track E(calo)/p(track)"};
Gaudi::Property<float> m_RCAL {this, "RCalBarrelFace", 1470.0*CLHEP::mm , "Radius of inner face of the barrel calorimeter"};
Gaudi::Property<float> m_ZCAL {this, "ZCalEndcapFace", 3800.0*CLHEP::mm, "z of the inner face of endcap calorimeter"};
// Too be changed Public Tools depreciated
PublicToolHandle<Trk::IParticleCaloExtensionTool > m_caloExtensionTool {this, "ParticleCaloExtensionTool", "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool", "Tool to extrapolate Track to Calo inner surface"};
SG::ReadHandleKey<TrigRoiDescriptorCollection> m_roiCollectionKey { this,
"RoIs", // property name
"rois", // default value of StoreGate key
"input RoI Collection name"};
SG::ReadHandleKey<xAOD::TrigEMClusterContainer> m_TrigEMClusterContainerKey{ this,
"TrigEMClusterName", // property name
"clusters", // default value of StoreGate key
"input TrigEMCluster Container name"};
SG::ReadHandleKey<xAOD::TrackParticleContainer> m_TrackParticleContainerKey{ this,
"TrackParticlesName", // property name
"Tracks", // default value of StoreGate key
"input TrackParticle container name"};
std::vector<float> m_calotrkdeta_noextrap_mon; //!< monitor preselection between track eta and cluster before extrapolation
std::vector<float> m_calotrackdeta_mon;
std::vector<float> m_calotrackdphi_mon;
std::vector<float> m_calotrackdeoverp_mon;
std::vector<float> m_trackpt_mon;
std::vector<float> m_calopt_mon;
SG::ReadHandleKey<TrigRoiDescriptorCollection> m_roiCollectionKey;
SG::ReadHandleKey<xAOD::TrigEMClusterContainer> m_TrigEMClusterContainerKey;
SG::ReadHandleKey<xAOD::TrackParticleContainer> m_TrackParticleContainerKey;
SG::WriteHandleKey<xAOD::TrigElectronContainer> m_outputElectronsKey;
};
SG::WriteHandleKey<xAOD::TrigElectronContainer> m_outputElectronsKey{ this,
"ElectronsName", // property name
"Electrons", // default value of StoreGate key
"output Electron container name "};
ToolHandle<GenericMonitoringTool> m_monTool;
};
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment