diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/DerivationFrameworkEGamma/EGElectronLikelihoodToolWrapper.h b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/DerivationFrameworkEGamma/EGElectronLikelihoodToolWrapper.h index b50f5d47e13b17719d7e182e5591a0fcefb5414e..239ac490fe952b9a6ff435b88ae8548c1f819e4a 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/DerivationFrameworkEGamma/EGElectronLikelihoodToolWrapper.h +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/DerivationFrameworkEGamma/EGElectronLikelihoodToolWrapper.h @@ -6,8 +6,8 @@ // EGLikelihoodToolWrapper.h, (c) ATLAS Detector software /////////////////////////////////////////////////////////////////// // Author: Giovanni Marchiori (giovanni.marchiori@cern.ch) -// Note: while EGSelectionToolWrapper permits to only store the boolean -// accept and the isEM-like mask (works for both isEM and likelihood selectors), +// Note: while EGSelectionToolWrapper permits to only store the boolean +// accept and the isEM-like mask (works for both isEM and likelihood selectors), // this tool (EGElectronLikelihoodToolWrapper) allows also to store // the double TResult output (i.e. the value of the likelihood or the ECIDS BDT) // if StoreTResult is set to true. Otherwise one can simply use the other tool. @@ -28,7 +28,7 @@ namespace DerivationFramework { class EGElectronLikelihoodToolWrapper : public AthAlgTool, public IAugmentationTool { - public: + public: EGElectronLikelihoodToolWrapper(const std::string& t, const std::string& n, const IInterface* p); StatusCode initialize(); @@ -42,7 +42,8 @@ namespace DerivationFramework { std::string m_sgName; std::string m_containerName; bool m_storeTResult; - }; + std::vector<std::string> m_sgMultipleNames; + }; } #endif // DERIVATIONFRAMEWORK_EGELECTRONLIKELIHOODTOOLWRAPPER_H diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/EGammaCommon.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/EGammaCommon.py index 738405860bb69dfc38cd650d4802c48458eb0953..b2f247e0a45fc5d1648c5933cae1ed4084b6f3dc 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/EGammaCommon.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/EGammaCommon.py @@ -1,9 +1,9 @@ # Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration #******************************************************************** -# EGammaCommon.py +# EGammaCommon.py # Schedules all tools needed for e-gamma object selection and writes -# results into SG. These may then be accessed along the train +# results into SG. These may then be accessed along the train #******************************************************************** from DerivationFrameworkCore.DerivationFrameworkMaster import * @@ -21,7 +21,7 @@ DFCommonPhotonsDirection = DerivationFramework__PhotonsDirectionTool(name = "DFC ToolSvc += DFCommonPhotonsDirection #==================================================================== -# SHOWER SHAPE FUDGING IN MC +# SHOWER SHAPE FUDGING IN MC # (PRESELECTION=22: FUDGE FACTORS RUN2 2015+2016 DATA, Rel 21) #==================================================================== @@ -33,17 +33,17 @@ isMC = 'IS_SIMULATION' in af.fileinfos['evt_type'] beam_energy = af.fileinfos['beam_energy'] conditions_tag = af.fileinfos['conditions_tag'] #useful for figuring out which mc production this is isFullSim = False -if isMC: +if isMC: simulationFlavour = af.fileinfos['metadata']['/Simulation/Parameters']['SimulationFlavour'] isFullSim = simulationFlavour in ('default', 'MC12G4', 'FullG4') print "EGammaCommon: isMC = ", isMC -if isMC: +if isMC: print "EGammaCommon: isFullSim = ", isFullSim if isFullSim: from ElectronPhotonShowerShapeFudgeTool.ElectronPhotonShowerShapeFudgeToolConf import ElectronPhotonShowerShapeFudgeTool - DF_ElectronPhotonShowerShapeFudgeTool = ElectronPhotonShowerShapeFudgeTool(Preselection=22) + DF_ElectronPhotonShowerShapeFudgeTool = ElectronPhotonShowerShapeFudgeTool(Preselection=22, ConfigFile="ElectronPhotonShowerShapeFudgeTool/May2016_ShiftsForMCBasedLHTuneUsing20pt7.conf") ToolSvc += DF_ElectronPhotonShowerShapeFudgeTool print DF_ElectronPhotonShowerShapeFudgeTool @@ -82,6 +82,20 @@ ElectronLHSelectorLooseBL = AsgElectronLikelihoodTool("ElectronLHSelectorLooseBL ElectronLHSelectorLooseBL.primaryVertexContainer = "PrimaryVertices" ToolSvc += ElectronLHSelectorLooseBL + +from ElectronPhotonSelectorTools.ElectronPhotonSelectorToolsConf import AsgElectronSelectorTool +ElectronDNNSelectorLoose = AsgElectronSelectorTool("ElectronDNNSelectorLoose", + WorkingPoint="LooseDNNElectron") +ToolSvc += ElectronDNNSelectorLoose + +ElectronDNNSelectorMedium = AsgElectronSelectorTool("ElectronDNNSelectorMedium", + WorkingPoint="MediumDNNElectron") +ToolSvc += ElectronDNNSelectorMedium + +ElectronDNNSelectorTight = AsgElectronSelectorTool("ElectronDNNSelectorTight", + WorkingPoint="TightDNNElectron") +ToolSvc += ElectronDNNSelectorTight + #==================================================================== # ELECTRON CHARGE SELECTION #==================================================================== @@ -97,13 +111,13 @@ ToolSvc += ElectronChargeIDSelector from ElectronPhotonSelectorTools.ElectronPhotonSelectorToolsConf import AsgForwardElectronLikelihoodTool ForwardElectronLHSelectorLoose = AsgForwardElectronLikelihoodTool("ForwardElectronLHSelectorLoose", WorkingPoint="LooseLHForwardElectron") -ToolSvc += ForwardElectronLHSelectorLoose +ToolSvc += ForwardElectronLHSelectorLoose ForwardElectronLHSelectorMedium = AsgForwardElectronLikelihoodTool("ForwardElectronLHSelectorMedium", WorkingPoint="MediumLHForwardElectron") -ToolSvc += ForwardElectronLHSelectorMedium +ToolSvc += ForwardElectronLHSelectorMedium ForwardElectronLHSelectorTight = AsgForwardElectronLikelihoodTool("ForwardElectronLHSelectorTight", WorkingPoint="TightLHForwardElectron") -ToolSvc += ForwardElectronLHSelectorTight +ToolSvc += ForwardElectronLHSelectorTight #==================================================================== @@ -220,13 +234,53 @@ ElectronPassLHTight = DerivationFramework__EGSelectionToolWrapper( name = "Elect ToolSvc += ElectronPassLHTight print ElectronPassLHTight + +# decorate electrons with the output of DNN ---------------------------------------------------------------------- +ElectronPassDNNLoose = DerivationFramework__EGElectronLikelihoodToolWrapper( name = "ElectronPassDNNLoose", + EGammaElectronLikelihoodTool = ElectronDNNSelectorLoose, + EGammaFudgeMCTool = DF_ElectronPhotonShowerShapeFudgeTool if isFullSim else "", + CutType = "", + StoreGateEntryName = "DFCommonElectronsDNNLoose", + ContainerName = "Electrons", + StoreTResult = True, + StoreGateEntryMultipleNames=["DFCommonElectronsDNN_pel", + "DFCommonElectronsDNN_pcf", + "DFCommonElectronsDNN_ppc", + "DFCommonElectronsDNN_phf", + "DFCommonElectronsDNN_ple", + "DFCommonElectronsDNN_plh"]) +ToolSvc += ElectronPassDNNLoose +print ElectronPassDNNLoose + +# decorate electrons with the output of DNN ---------------------------------------------------------------------- +ElectronPassDNNMedium = DerivationFramework__EGElectronLikelihoodToolWrapper( name = "ElectronPassDNNMedium", + EGammaElectronLikelihoodTool = ElectronDNNSelectorMedium, + EGammaFudgeMCTool = DF_ElectronPhotonShowerShapeFudgeTool if isFullSim else "", + CutType = "", + StoreGateEntryName = "DFCommonElectronsDNNMedium", + ContainerName = "Electrons", + StoreTResult = False) +ToolSvc += ElectronPassDNNMedium +print ElectronPassDNNMedium + +# decorate electrons with the output of DNN ---------------------------------------------------------------------- +ElectronPassDNNTight = DerivationFramework__EGElectronLikelihoodToolWrapper( name = "ElectronPassDNNTight", + EGammaElectronLikelihoodTool = ElectronDNNSelectorTight, + EGammaFudgeMCTool = DF_ElectronPhotonShowerShapeFudgeTool if isFullSim else "", + CutType = "", + StoreGateEntryName = "DFCommonElectronsDNNTight", + ContainerName = "Electrons", + StoreTResult = False) +ToolSvc += ElectronPassDNNTight +print ElectronPassDNNTight + # decorate electrons with the output of ECIDS ---------------------------------------------------------------------- ElectronPassECIDS = DerivationFramework__EGElectronLikelihoodToolWrapper( name = "ElectronPassECIDS", EGammaElectronLikelihoodTool = ElectronChargeIDSelector, EGammaFudgeMCTool = "", CutType = "", StoreGateEntryName = "DFCommonElectronsECIDS", - + ContainerName = "Electrons", StoreTResult = True) ToolSvc += ElectronPassECIDS @@ -281,7 +335,7 @@ else: ContainerName = "Photons") ToolSvc += PhotonPassIsEMLoose print PhotonPassIsEMLoose - + # decorate photons with the output of IsEM tight # on full-sim MC, fudge the shower shapes before computing the ID (but the original shower shapes are not overridden) if isFullSim: @@ -349,23 +403,23 @@ ToolSvc += ElectronAmbiguity EGAugmentationTools = [DFCommonPhotonsDirection, ElectronPassLHVeryLoose, ElectronPassLHLoose, ElectronPassLHLooseBL, ElectronPassLHMedium, ElectronPassLHTight, ForwardElectronPassLHLoose, ForwardElectronPassLHMedium, ForwardElectronPassLHTight, - ElectronPassECIDS, - PhotonPassIsEMLoose, PhotonPassIsEMTight, - PhotonPassIsEMTightPtIncl, + ElectronPassDNNLoose, ElectronPassDNNMedium, ElectronPassDNNTight, ElectronPassECIDS, + PhotonPassIsEMLoose, PhotonPassIsEMTight, + PhotonPassIsEMTightPtIncl, PhotonPassCleaning, PhotonPassCrackVeto,ElectronPassCrackVeto, ElectronAmbiguity] #================================================== -# Truth Related tools +# Truth Related tools from RecExConfig.RecFlags import rec -if rec.doTruth(): +if rec.doTruth(): # Decorate Electron with bkg electron type/origin - from MCTruthClassifier.MCTruthClassifierBase import MCTruthClassifier as BkgElectronMCTruthClassifier + from MCTruthClassifier.MCTruthClassifierBase import MCTruthClassifier as BkgElectronMCTruthClassifier BkgElectronMCTruthClassifier.barcodeG4Shift=(DerivationFrameworkSimBarcodeOffset+1) - from DerivationFrameworkEGamma.DerivationFrameworkEGammaConf import DerivationFramework__BkgElectronClassification + from DerivationFrameworkEGamma.DerivationFrameworkEGammaConf import DerivationFramework__BkgElectronClassification BkgElectronClassificationTool = DerivationFramework__BkgElectronClassification (name = "BkgElectronClassificationTool", MCTruthClassifierTool = BkgElectronMCTruthClassifier, barcodeCut=DerivationFrameworkSimBarcodeOffset) @@ -400,7 +454,7 @@ if rec.doTruth(): ToolSvc += TruthEgptIsolationTool print TruthEgptIsolationTool EGAugmentationTools.append(TruthEgptIsolationTool) - + # Compute the truth-particle-level energy density in the central eta region from EventShapeTools.EventDensityConfig import configEventDensityTool, EventDensityAthAlg from JetRec.JetRecStandard import jtm @@ -409,7 +463,7 @@ if rec.doTruth(): AbsRapidityMax = 1.5, OutputContainer = "TruthIsoCentralEventShape", OutputLevel = 3, - ) + ) ToolSvc += tc # Compute the truth-particle-level energy density in the forward eta region @@ -419,7 +473,7 @@ if rec.doTruth(): AbsRapidityMax = 3.0, OutputContainer = "TruthIsoForwardEventShape", OutputLevel = 3, - ) + ) ToolSvc += tf # Schedule the two energy density tools for running @@ -430,7 +484,7 @@ if rec.doTruth(): #======================================= -# CREATE THE DERIVATION KERNEL ALGORITHM +# CREATE THE DERIVATION KERNEL ALGORITHM #======================================= from DerivationFrameworkCore.DerivationFrameworkCoreConf import DerivationFramework__CommonAugmentation @@ -445,5 +499,3 @@ DerivationFrameworkJob += CfgMgr.DerivationFramework__CommonAugmentation("EGamma import IsolationAlgs.IsoUpdatedTrackCones as isoCones if not hasattr(DerivationFrameworkJob,"IsolationBuilderTight1000"): DerivationFrameworkJob += isoCones.GetUpdatedIsoTrackCones() - - diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/ElectronsCPContent.py b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/ElectronsCPContent.py index 94950a9c2c2a5c100151bc9a024e2fad3ab337f0..5ebaee19e19d3f4babf607ab5a1b9ac99d3dfd26 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/ElectronsCPContent.py +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/python/ElectronsCPContent.py @@ -2,7 +2,7 @@ ElectronsCPContent = [ "Electrons", -"ElectronsAux.trackParticleLinks.pt.eta.phi.m.charge.author.OQ.DFCommonElectronsLHVeryLoose.DFCommonElectronsLHLoose.DFCommonElectronsLHLooseBL.DFCommonElectronsLHMedium.DFCommonElectronsLHTight.DFCommonElectronsLHVeryLooseIsEMValue.DFCommonElectronsLHLooseIsEMValue.DFCommonElectronsLHLooseBLIsEMValue.DFCommonElectronsLHMediumIsEMValue.DFCommonElectronsLHTightIsEMValue.DFCommonElectronsECIDS.DFCommonElectronsECIDSResult.ptvarcone20.ptvarcone40_TightTTVALooseCone_pt1000.topoetcone20.topoetcone20ptCorrection.ptcone20_TightTTVALooseCone_pt500.ptcone20_TightTTVALooseCone_pt1000.ptvarcone20_TightTTVA_pt1000.ptvarcone30_TightTTVA_pt500.ptvarcone30_TightTTVA_pt1000.ptvarcone20_TightTTVALooseCone_pt1000.ptvarcone30_TightTTVALooseCone_pt500.ptvarcone30_TightTTVALooseCone_pt1000.neflowisol20.core57cellsEnergyCorrection.topoetconecoreConeSCEnergyCorrection.topoetconecoreConeEnergyCorrection.DFCommonCrackVetoCleaning.caloClusterLinks.ambiguityLink.truthParticleLink.truthOrigin.truthType.truthPdgId.firstEgMotherTruthType.firstEgMotherTruthOrigin.firstEgMotherTruthParticleLink.firstEgMotherPdgId.ambiguityType.DFCommonAddAmbiguity", +"ElectronsAux.trackParticleLinks.pt.eta.phi.m.charge.author.OQ.DFCommonElectronsLHVeryLoose.DFCommonElectronsLHLoose.DFCommonElectronsLHLooseBL.DFCommonElectronsLHMedium.DFCommonElectronsLHTight.DFCommonElectronsLHVeryLooseIsEMValue.DFCommonElectronsLHLooseIsEMValue.DFCommonElectronsLHLooseBLIsEMValue.DFCommonElectronsLHMediumIsEMValue.DFCommonElectronsLHTightIsEMValue.DFCommonElectronsECIDS.DFCommonElectronsECIDSResult.DFCommonElectronsDNNLoose.DFCommonElectronsDNNLooseIsEMValue.DFCommonElectronsDNNMedium.DFCommonElectronsDNNMediumIsEMValue.DFCommonElectronsDNNTight.DFCommonElectronsDNNTightIsEMValue.DFCommonElectronsDNN_pel.DFCommonElectronsDNN_ppc.DFCommonElectronsDNN_ppc.DFCommonElectronsDNN_phf.DFCommonElectronsDNN_ple.DFCommonElectronsDNN_plh.ptvarcone20.ptvarcone40_TightTTVALooseCone_pt1000.topoetcone20.topoetcone20ptCorrection.ptcone20_TightTTVALooseCone_pt500.ptcone20_TightTTVALooseCone_pt1000.ptvarcone20_TightTTVA_pt1000.ptvarcone30_TightTTVA_pt500.ptvarcone30_TightTTVA_pt1000.ptvarcone20_TightTTVALooseCone_pt1000.ptvarcone30_TightTTVALooseCone_pt500.ptvarcone30_TightTTVALooseCone_pt1000.neflowisol20.core57cellsEnergyCorrection.topoetconecoreConeSCEnergyCorrection.topoetconecoreConeEnergyCorrection.DFCommonCrackVetoCleaning.caloClusterLinks.ambiguityLink.truthParticleLink.truthOrigin.truthType.truthPdgId.firstEgMotherTruthType.firstEgMotherTruthOrigin.firstEgMotherTruthParticleLink.firstEgMotherPdgId.ambiguityType.DFCommonAddAmbiguity", "GSFTrackParticles", "GSFTrackParticlesAux.chiSquared.phi.d0.theta.qOverP.definingParametersCovMatrix.numberOfPixelHits.numberOfPixelOutliers.numberOfPixelDeadSensors.numberOfSCTHits.numberOfSCTOutliers.numberOfSCTDeadSensors.z0.vz.charge.vertexLink.numberOfInnermostPixelLayerHits.numberOfInnermostPixelLayerOutliers.numberOfNextToInnermostPixelLayerOutliers.expectInnermostPixelLayerHit.truthParticleLink.originalTrackParticle.numberOfNextToInnermostPixelLayerHits.expectNextToInnermostPixelLayerHit", "GSFConversionVertices", diff --git a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/src/EGElectronLikelihoodToolWrapper.cxx b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/src/EGElectronLikelihoodToolWrapper.cxx index b3c29587cf5f42500ae5656dd150a44400bfe42d..49036b1b964992efc466165956ad0a2c7da9044c 100644 --- a/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/src/EGElectronLikelihoodToolWrapper.cxx +++ b/PhysicsAnalysis/DerivationFramework/DerivationFrameworkEGamma/src/EGElectronLikelihoodToolWrapper.cxx @@ -19,12 +19,13 @@ namespace DerivationFramework { EGElectronLikelihoodToolWrapper::EGElectronLikelihoodToolWrapper(const std::string& t, const std::string& n, - const IInterface* p) : + const IInterface* p) : AthAlgTool(t,n,p), m_cut(""), m_sgName(""), m_containerName(""), - m_storeTResult(false) + m_storeTResult(false), + m_sgMultipleNames({}) { declareInterface<DerivationFramework::IAugmentationTool>(this); declareProperty("EGammaElectronLikelihoodTool", m_tool); @@ -33,6 +34,7 @@ namespace DerivationFramework { declareProperty("StoreGateEntryName", m_sgName); declareProperty("ContainerName", m_containerName); declareProperty("StoreTResult", m_storeTResult); + declareProperty("StoreGateEntryMultipleNames", m_sgMultipleNames); } StatusCode EGElectronLikelihoodToolWrapper::initialize() @@ -84,7 +86,7 @@ namespace DerivationFramework { ATH_MSG_ERROR ("addBranches(): Wrong particle type being passed to EGElectronLikelihoodToolWrapper"); return StatusCode::FAILURE; } - + xAOD::IParticle* pCopy = *pItr; // this should be computed based on some property of the tool or the existence of the ElectronPhotonShowerShapeFudgeTool @@ -117,40 +119,60 @@ namespace DerivationFramework { // compute the output of the selector Root::TAccept theAccept(m_tool->accept(pCopy)); unsigned int isEM = (unsigned int) theAccept.getCutResultInvertedBitSet().to_ulong(); // this should work for both the cut-based and the LH selectors - double result(0.); // initialise explicitly to avoid compilation warning. It will be overridden in the following block (result is used only if m_storeTResult is true) + std::vector<double> result; // initialise explicitly to avoid compilation warning. It will be overridden in the following block (result is used only if m_storeTResult is true) if (m_storeTResult) { - Root::TResult theResult(m_tool->calculate(pCopy)); - result = double(theResult); + Root::TResult theResult(m_tool->calculate(pCopy)); + for (uint i = 0; i < theResult.getNResults(); i++){ + result.push_back(theResult.getResult(i)); + } } - + // decorate the original object if(m_cut.empty()){ - bool pass_selection = (bool) theAccept; - if(pass_selection) decoratorPass(**pItr) = 1; - else decoratorPass(**pItr) = 0; - decoratorIsEM(**pItr) = isEM; - if (m_storeTResult) { - SG::AuxElement::Decorator< double > decoratorResult(m_sgName + "Result"); - decoratorResult(**pItr) = result; - } + bool pass_selection = (bool) theAccept; + if(pass_selection) decoratorPass(**pItr) = 1; + else decoratorPass(**pItr) = 0; + decoratorIsEM(**pItr) = isEM; + if (m_storeTResult) { + if (result.size() == 1){ + SG::AuxElement::Decorator< double > decoratorResult(m_sgName + "Result"); + decoratorResult(**pItr) = result.at(0); + } + else{ + for (uint i = 0; i < m_sgMultipleNames.size(); i++){ + SG::AuxElement::Decorator< double > decoratorResult(m_sgMultipleNames.at(i)); + // the first entry is supposed to be the discriminant and does not need to be saved + decoratorResult(**pItr) = result.at(i + 1); + } + } + } } else{ - if (theAccept.getCutResult(m_cut)) { - decoratorPass(**pItr) = 1; - } else { - decoratorPass(**pItr) = 0; - } - decoratorIsEM(**pItr) = isEM; - if (m_storeTResult) { - SG::AuxElement::Decorator< double > decoratorResult(m_sgName + "Result"); - decoratorResult(**pItr) = result; - } + if (theAccept.getCutResult(m_cut)) { + decoratorPass(**pItr) = 1; + } else { + decoratorPass(**pItr) = 0; + } + decoratorIsEM(**pItr) = isEM; + if (m_storeTResult) { + if (result.size() == 1){ + SG::AuxElement::Decorator< double > decoratorResult(m_sgName + "Result"); + decoratorResult(**pItr) = result.at(0); + } + else{ + for (uint i = 0; i < m_sgMultipleNames.size(); i++){ + SG::AuxElement::Decorator< double > decoratorResult(m_sgMultipleNames.at(i)); + // the first entry is supposed to be the discriminant and does not need to be saved + decoratorResult(**pItr) = result.at(i + 1); + } + } + } } // delete the particle copy if (applyFF) delete pCopy; } - + return StatusCode::SUCCESS; } } diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/AsgElectronSelectorTool.h b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/AsgElectronSelectorTool.h index 97451c38ece3082dedab659b7351d87121b6c9f1..2ca7a4b2f5e0f221e88c8acf0ef68d2fe8a6415c 100644 --- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/AsgElectronSelectorTool.h +++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/ElectronPhotonSelectorTools/AsgElectronSelectorTool.h @@ -112,7 +112,8 @@ private: /** Interpolates cut values along pt*/ double interpolateCuts( const std::vector<double>& cuts, double et, double eta ) const; - + /// Set all entries of the TResult to a default value of -9999 + void resetTResult() const; // Private member variables private: @@ -178,7 +179,18 @@ private: int m_cutPosition_MVA; /// The position of the MVA value bit in the TResult return object int m_resultPosition_MVA; - + /// The position of the electron probability bit in the TResult return object + int m_resultPosition_EL; + /// The position of the chargeFlip probability bit in the TResult return object + int m_resultPosition_CF; + /// The position of the photonConversion probability bit in the TResult return object + int m_resultPosition_PC; + /// The position of the heavyFlavor probability bit in the TResult return object + int m_resultPosition_HF; + /// The position of the lightFlavorEgamma probability bit in the TResult return object + int m_resultPosition_LE; + /// The position of the lightFlavorHadron probability bit in the TResult return object + int m_resultPosition_LH; /// number of discrimintants vs Et static const unsigned int s_fnDiscEtBins = 10; diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronSelectorTool.cxx b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronSelectorTool.cxx index 6025a06ae3c2233360d5be8c4a7a0a4708ae9e1d..854241cdfd06e799440e9163b0111ebc1b101e3b 100644 --- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronSelectorTool.cxx +++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/AsgElectronSelectorTool.cxx @@ -259,11 +259,31 @@ StatusCode AsgElectronSelectorTool::initialize() // Register the cuts and check that the registration worked: // NOTE: THE ORDER IS IMPORTANT!!! Cut0 corresponds to bit 0, Cut1 to bit 1,... - m_resultPosition_MVA = m_resultMVA.addResult( "mvaScore", "electron mvaScore" ); + m_resultPosition_MVA = m_resultMVA.addResult( "mvaScore", "electron combined MVA Score" ); if ( m_resultPosition_MVA < 0 ) sc = 0; // Exceeded the number of allowed results - // Set the result to a default value - m_resultMVA.setResult(m_resultPosition_MVA, -9999.0); + if (m_multiClass){ + m_resultPosition_EL = m_resultMVA.addResult( "elScore", "electron node" ); + if ( m_resultPosition_EL < 0 ) sc = 0; // Exceeded the number of allowed results + + m_resultPosition_CF = m_resultMVA.addResult( "cfScore", "chargeFlip node" ); + if ( m_resultPosition_CF < 0 ) sc = 0; // Exceeded the number of allowed results + + m_resultPosition_PC = m_resultMVA.addResult( "pcScore", "photonConv node" ); + if ( m_resultPosition_PC < 0 ) sc = 0; // Exceeded the number of allowed results + + m_resultPosition_HF = m_resultMVA.addResult( "hfScore", "heavyFlavor node" ); + if ( m_resultPosition_HF < 0 ) sc = 0; // Exceeded the number of allowed results + + m_resultPosition_LE = m_resultMVA.addResult( "leScore", "lightFlavorEgamma node" ); + if ( m_resultPosition_LE < 0 ) sc = 0; // Exceeded the number of allowed results + + m_resultPosition_LH = m_resultMVA.addResult( "lhScore", "lightFlavorHadron node" ); + if ( m_resultPosition_LH < 0 ) sc = 0; // Exceeded the number of allowed results + } + + // Set all entries of the TResult to a default of -9999. + resetTResult(); // Check that we got everything OK if (sc == 0){ @@ -455,8 +475,8 @@ const Root::TAccept& AsgElectronSelectorTool::accept( const xAOD::Electron* eg, //============================================================================= const Root::TResult& AsgElectronSelectorTool::calculate( const xAOD::Electron* eg, double mu ) const { - // Set the result to a default value - m_resultMVA.setResult(m_resultPosition_MVA, -9999.0); + // Set all entries of the TResult to a default of -9999. + resetTResult(); if (!eg){ throw std::runtime_error("AsgElectronSelectorTool: Failed, no electron object was passed" ); @@ -669,6 +689,12 @@ const Root::TResult& AsgElectronSelectorTool::calculate( const xAOD::Electron* e else{ // combine the six output nodes into one discriminant to cut on, any necessary transformation is applied within combineOutputs() discriminant = combineOutputs(mvaScores, eta); + m_resultMVA.setResult(m_resultPosition_EL, mvaScores.at(0)); + m_resultMVA.setResult(m_resultPosition_CF, mvaScores.at(1)); + m_resultMVA.setResult(m_resultPosition_PC, mvaScores.at(2)); + m_resultMVA.setResult(m_resultPosition_HF, mvaScores.at(3)); + m_resultMVA.setResult(m_resultPosition_LE, mvaScores.at(4)); + m_resultMVA.setResult(m_resultPosition_LH, mvaScores.at(5)); } m_resultMVA.setResult(m_resultPosition_MVA, discriminant); @@ -706,8 +732,8 @@ const Root::TResult& AsgElectronSelectorTool::calculate( const xAOD::IParticle* } else { ATH_MSG_DEBUG("AsgElectronSelectorTool::could not cast to const Electron"); - // Set the result to a default value - m_resultMVA.setResult(m_resultPosition_MVA, -9999.0); + // Set all entries of the TResult to a default of -9999. + resetTResult(); return m_resultMVA; } } @@ -733,8 +759,8 @@ const Root::TResult& AsgElectronSelectorTool::calculate( const xAOD::Egamma* eg, } else { ATH_MSG_DEBUG("AsgElectronSelectorTool::could not cast to const Electron"); - // Set the result to a default value - m_resultMVA.setResult(m_resultPosition_MVA, -9999.0); + // Set all entries of the TResult to a default of -9999. + resetTResult(); return m_resultMVA; } } @@ -857,3 +883,18 @@ double AsgElectronSelectorTool::interpolateCuts( const std::vector<double>& cuts return discLow + (et - etLow) * gradient; } + +// Set all results of the TResult to a default value of -9999 +void AsgElectronSelectorTool::resetTResult() const +{ + m_resultMVA.setResult(m_resultPosition_MVA, -9999.0); + if (m_multiClass){ + m_resultMVA.setResult(m_resultPosition_EL, -9999.0); + m_resultMVA.setResult(m_resultPosition_CF, -9999.0); + m_resultMVA.setResult(m_resultPosition_PC, -9999.0); + m_resultMVA.setResult(m_resultPosition_HF, -9999.0); + m_resultMVA.setResult(m_resultPosition_LE, -9999.0); + m_resultMVA.setResult(m_resultPosition_LH, -9999.0); + } + return; +} diff --git a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h index 15e0a9cd8cb59b1c24b28ebbc632d2a3cc22590b..570bc5e9b6cf3f2e584db5f47edde83c44dda314 100644 --- a/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h +++ b/PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools/Root/EGSelectorConfigurationMapping.h @@ -59,7 +59,9 @@ namespace EgammaSelectors { {"TightPhoton",egammaPID::PhotonTight}, }; const std::map<std::string,std::string> ElectronDNNPointToConfFile={ - {"LooseDNNElectron", "ElectronPhotonSelectorTools/offline/mc16_20210204/ElectronDNNLooseConfig.conf"} + {"LooseDNNElectron", "ElectronPhotonSelectorTools/offline/mc16_20210430/ElectronDNNMulticlassLoose.conf"}, + {"MediumDNNElectron", "ElectronPhotonSelectorTools/offline/mc16_20210430/ElectronDNNMulticlassMedium.conf"}, + {"TightDNNElectron", "ElectronPhotonSelectorTools/offline/mc16_20210430/ElectronDNNMulticlassTight.conf"} }; } ////////////////////////////////////////////