diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt
index 8bff1abe2b008b5b2e8fa9204eb8294652bf1076..78261fb99f5604de87c60b2095d54a74cfa5ff58 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/CMakeLists.txt
@@ -6,37 +6,38 @@
 atlas_subdir( TrigEgammaAnalysisTools )
 
 # Declare the package's dependencies:
-atlas_depends_on_subdirs(
-   PUBLIC
-   Control/AthToolSupport/AsgTools
-   Event/xAOD/xAODCaloEvent
-   Event/xAOD/xAODEgamma
-   Event/xAOD/xAODEventInfo
-   Event/xAOD/xAODJet
-   Event/xAOD/xAODTracking
-   Event/xAOD/xAODTrigCalo
-   Event/xAOD/xAODTrigEgamma
-   Event/xAOD/xAODTrigRinger
-   Event/xAOD/xAODTrigger
-   Event/xAOD/xAODTruth
-   LumiBlock/LumiBlockComps
-   PhysicsAnalysis/Interfaces/EgammaAnalysisInterfaces
-   Reconstruction/RecoTools/RecoToolInterfaces
-   PhysicsAnalysis/ElectronPhotonID/egammaMVACalibAnalysis
-   Trigger/TrigAnalysis/TrigDecisionTool
-   Trigger/TrigAnalysis/TrigEgammaMatchingTool
-   Trigger/TrigAnalysis/TrigEgammaEmulationTool
-   Trigger/TrigConfiguration/TrigConfHLTData
-   Trigger/TrigEvent/TrigSteeringEvent
-   Trigger/TrigMonitoring/TrigHLTMonitoring
-   PhysicsAnalysis/AnalysisCommon/PATCore
-   PRIVATE
-   Control/AthenaBaseComps
-   Control/AthenaMonitoring
-   Control/StoreGate
-   GaudiKernel
-   Trigger/TrigConfiguration/TrigConfxAOD )
-
+atlas_depends_on_subdirs( PUBLIC
+                          Control/AthToolSupport/AsgTools
+                          Event/xAOD/xAODCaloEvent
+                          Event/xAOD/xAODEgamma
+                          Event/xAOD/xAODEventInfo
+                          Event/xAOD/xAODJet
+                          Event/xAOD/xAODPrimitives
+                          Event/xAOD/xAODTracking
+                          Event/xAOD/xAODTrigCalo
+                          Event/xAOD/xAODTrigEgamma
+                          Event/xAOD/xAODTrigRinger
+                          Event/xAOD/xAODTrigger
+                          Event/xAOD/xAODTruth
+                          Event/xAOD/xAODMissingET
+                          Event/xAOD/xAODCaloRings
+                          LumiBlock/LumiBlockComps
+                          PhysicsAnalysis/ElectronPhotonID/ElectronPhotonSelectorTools
+                          Reconstruction/RecoTools/RecoToolInterfaces
+                          Reconstruction/egamma/egammaMVACalib
+                          Trigger/TrigAnalysis/TrigDecisionTool
+                          Trigger/TrigAnalysis/TrigEgammaMatchingTool
+                          Trigger/TrigAnalysis/TrigEgammaEmulationTool
+                          Trigger/TrigConfiguration/TrigConfHLTData
+                          Trigger/TrigEvent/TrigSteeringEvent
+                          Trigger/TrigMonitoring/TrigHLTMonitoring
+                          PhysicsAnalysis/AnalysisCommon/PATCore
+                          PRIVATE
+                          Control/AthenaBaseComps
+                          Control/AthenaMonitoring
+                          Control/StoreGate
+                          GaudiKernel
+                          Trigger/TrigConfiguration/TrigConfxAOD )
 # External dependencies:
 find_package( Boost )
 find_package( ROOT COMPONENTS Core Hist Tree )
@@ -48,20 +49,25 @@ atlas_add_library( TrigEgammaAnalysisToolsLib
    INCLUDE_DIRS ${ROOT_INCLUDE_DIRS}
    PRIVATE_INCLUDE_DIRS ${Boost_INCLUDE_DIRS}
    LINK_LIBRARIES ${ROOT_LIBRARIES} AsgTools xAODCaloEvent xAODEgamma
-   xAODEventInfo xAODJet xAODTracking xAODTrigCalo xAODTrigEgamma xAODTrigRinger
-   xAODTrigger xAODTruth LumiBlockCompsLib EgammaAnalysisInterfacesLib
+   xAODEventInfo xAODJet xAODTracking xAODTrigCalo xAODTrigEgamma xAODTrigRinger xAODMissingET
+   xAODTrigger xAODCaloRings xAODTruth LumiBlockCompsLib EgammaAnalysisInterfacesLib
    RecoToolInterfaces egammaMVACalibAnalysisLib TrigDecisionToolLib
    TrigEgammaMatchingToolLib TrigEgammaEmulationToolLib TrigConfHLTData
    TrigSteeringEvent TrigHLTMonitoringLib PATCoreLib
    PRIVATE_LINK_LIBRARIES ${Boost_LIBRARIES} TrigConfxAODLib )
 
 atlas_add_component( TrigEgammaAnalysisTools
-   src/*.h src/*.cxx src/components/*.cxx
-   LINK_LIBRARIES AthenaBaseComps GaudiKernel AsgTools TrigHLTMonitoringLib
-   AthenaMonitoringLib TrigDecisionToolLib TrigEgammaMatchingToolLib xAODEgamma
-   TrigEgammaAnalysisToolsLib )
+                     src/*.h
+                     src/*.cxx
+                     Root/*.cxx
+                     src/components/*.cxx
+                     INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
+                     LINK_LIBRARIES ${ROOT_LIBRARIES} ${Boost_LIBRARIES} AsgTools xAODCaloEvent xAODMissingET xAODEgamma xAODEventInfo xAODJet xAODTracking xAODTrigCalo xAODTrigEgamma xAODTrigRinger xAODCaloRings xAODTrigger xAODTruth LumiBlockCompsLib ElectronPhotonSelectorToolsLib egammaMVACalibLib TrigDecisionToolLib TrigEgammaMatchingToolLib TrigEgammaEmulationTool TrigConfHLTData TrigSteeringEvent TrigHLTMonitoringLib AthenaBaseComps AthenaMonitoringLib StoreGateLib SGtests GaudiKernel PATCoreLib )
 
 # Install files from the package:
 atlas_install_python_modules( python/TrigEgamma*.py )
 atlas_install_joboptions( share/test*.py )
-atlas_install_scripts( share/trigEgammaDQ.py share/get_trigEgammaDQ.sh )
+atlas_install_generic( share/trigEgammaDQ.py share/get_trigEgammaDQ.sh 
+                        DESTINATION share
+                        EXECUTABLE )
+
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx
index 073cef0276a1524ce30569e4a3048f1111ecd69a..f4baf74a26da1601a7ba15c8803bd889da15222a 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/EfficiencyTool.cxx
@@ -50,26 +50,25 @@ bool EfficiencyTool::analyseIsEMLH(const xAOD::Electron *eg, const std::string p
     const std::string ineff = "Ineff" + pidword;
 
     bool failIsEMLH = true;
-    unsigned int isem = 9999;
     try{
-	ATH_MSG_DEBUG("Running selectionisEM("<<pidword<<")");
-	isem = eg->selectionisEM(pidword);
-
-	failIsEMLH = false;
-	for (int ii = 0; ii < 11; ii++) {
-	    if ((isem >> ii) & 0x1) {
-		failIsEMLH = true;
-		hist1(fail)->Fill(ii + 0.5);
-		hist1(ineff)->Fill(ii + 3.5, 1);
+	    ATH_MSG_DEBUG("Running selectionisEM("<<pidword<<")");
+	    unsigned int isem = eg->selectionisEM(pidword);
+
+	    failIsEMLH = false;
+	    for (int ii = 0; ii < 11; ii++) {
+	        if ((isem >> ii) & 0x1) {
+	    	failIsEMLH = true;
+	    	hist1(fail)->Fill(ii + 0.5);
+	    	hist1(ineff)->Fill(ii + 3.5, 1);
+	        }
 	    }
-	}
     } catch (const ValidationException &e) {
-	ATH_MSG_WARNING("Exception thrown: " << e.msg() );
-	ATH_MSG_WARNING("Is " << pidword << " is a valid one? returning failed....");
-	failIsEMLH = true;
+	    ATH_MSG_WARNING("Exception thrown: " << e.msg() );
+	    ATH_MSG_WARNING("Is " << pidword << " is a valid one? returning failed....");
+	    failIsEMLH = true;
     } catch(...) {
-	ATH_MSG_WARNING("Unknown exception caught in analyseIsEMLH ... Is " << pidword << " is a valid one? returning failed....");
-	failIsEMLH = true;
+	    ATH_MSG_WARNING("Unknown exception caught in analyseIsEMLH ... Is " << pidword << " is a valid one? returning failed....");
+	    failIsEMLH = true;
     }
     return failIsEMLH;
 
@@ -90,18 +89,7 @@ bool EfficiencyTool::analyseIsEM(const xAOD::Electron *eg, const std::string pid
     bool failtrt = false;
     bool failisem = false;
 
-    unsigned int isem = 9999;
-    try{
-	isem = eg->selectionisEM(pidword);
-    } catch (const ValidationException &eg) {
-	ATH_MSG_WARNING("Exception thrown: " << eg.msg() );
-	ATH_MSG_WARNING("Is " << pidword << " is a valid one? returning failed....");
-	return(true);
-    } catch(...) {
-	ATH_MSG_WARNING("Unknown exception caught in analyseIsEMLH ... Is " << pidword << " is a valid one? returning failed....");
-	return(true);
-    }
-
+    unsigned int isem = eg->selectionisEM(pidword);
 
     for (int ii = 0; ii < 29; ii++) {
         if ((isem >> ii) & 0x1) {
@@ -255,8 +243,7 @@ void EfficiencyTool::fillInefficiency(const std::string& pid, const std::string
             hist1(ineff)->Fill(lastbin - 4, 1);
             hist1(ineff)->Fill(sumbin, 1);
         }
-        else {
-            hist1(ineff)->Fill(lastbin - 3, 1);
+        else{
             hist1(ineff)->Fill(sumbin, 1);
         }
 
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx
index fcd2a4aee400191fe2a3e27520bf5c87ecf1eac5..7909da2527e71ad979297000184fe3d58b9ae106 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaAnalysisBaseTool.cxx
@@ -66,6 +66,7 @@ TrigEgammaAnalysisBaseTool( const std::string& myname )
     declareProperty("TPTrigger",m_tp=false)->declareUpdateHandler(&TrigEgammaAnalysisBaseTool::updateTP,this);
     declareProperty("isEMResultNames",m_isemname,"isEM");
     declareProperty("LHResultNames",m_lhname,"LH");
+    declareProperty("ForceTrigAttachment", m_forceTrigAttachment=false);
 
     m_storeGate = nullptr;
     m_histsvc = nullptr;
@@ -85,6 +86,9 @@ TrigEgammaAnalysisBaseTool( const std::string& myname )
     m_nPVertex=0;
     m_offmu=0.;
     m_onlmu=0.;
+    m_sgContainsRnn=false;
+    m_sgContainsTrigPhoton=false;
+    m_forceTrigEmulation=false;
 }
 
 void TrigEgammaAnalysisBaseTool::updateDetail(Property& /*p*/){
@@ -101,14 +105,14 @@ void TrigEgammaAnalysisBaseTool::updateAltBinning(Property& /*p*/){
 
 void TrigEgammaAnalysisBaseTool::updateTP(Property& /*p*/){
     plot()->setTP(m_tp);
-    for( auto& tool : m_tools) {
+    for( const auto& tool : m_tools) {
         tool->setTP(m_tp);
     }
 }
 
 void TrigEgammaAnalysisBaseTool::updateEmulation(Property& /*p*/){
     plot()->setEmulation(m_doEmulation);
-    for( auto& tool : m_tools) {
+    for( const auto& tool : m_tools) {
         tool->setEmulation(m_doEmulation);
         ATH_MSG_INFO("updateEmulation() property for tool with name: " << tool->name());
         tool->setEmulationTool(m_emulationTool);
@@ -175,7 +179,7 @@ StatusCode TrigEgammaAnalysisBaseTool::initialize() {
 
     // propagate the emulation tool for all tools
     if( m_doEmulation ){
-      for( auto& tool : m_tools) {
+      for( const auto& tool : m_tools) {
         ATH_MSG_INFO("Propagate emulation tool handler to: " << tool->name() );
         tool->setEmulationTool(m_emulationTool);  
       }
@@ -351,8 +355,10 @@ void TrigEgammaAnalysisBaseTool::setTrigInfo(const std::string trigger){
 
     if(isL1) etthr=l1thr; // Should be handled elsewhere 
 
-    TrigInfo info{trigger,type,l1item,l1type,pidname,decorator,isL1,perf,etcut,etthr,l1thr};
+    TrigInfo info{trigger,type,l1item,l1type,pidname,decorator,isL1,perf,etcut,etthr,l1thr,m_forceTrigEmulation};
     m_trigInfo[trigger] = info;
+    
+    m_forceTrigEmulation=false; //hack disable
 }
 
 // return the TrigInfo from trigger name
@@ -557,6 +563,7 @@ bool TrigEgammaAnalysisBaseTool::isPrescaled(const std::string trigger){
 
 asg::AcceptData
 TrigEgammaAnalysisBaseTool::setAccept(const HLT::TriggerElement *te,const TrigInfo info){
+    
     ATH_MSG_DEBUG("setAccept");
     asg::AcceptData acceptData (&m_accept);
     bool passedL1Calo=false;
@@ -571,6 +578,16 @@ TrigEgammaAnalysisBaseTool::setAccept(const HLT::TriggerElement *te,const TrigIn
     if(getFeature<xAOD::TrigRNNOutput>(te)){
         hasRnn=true;
     }
+    
+    ATH_MSG_DEBUG("Rnn container " << getSGContainsRnn());
+    ATH_MSG_DEBUG("TrigPhotonContainer " << getSGContainsTrigPhoton());
+    
+    if(getSGContainsRnn()){
+        if(getFeature<xAOD::TrigRNNOutput>(te)){
+            hasRnn=true;
+        }
+    }
+    
 
     if(!info.trigL1){ // HLT item get full decision
         ATH_MSG_DEBUG("Check for active features: TrigEMCluster,CaloClusterContainer");
@@ -594,7 +611,9 @@ TrigEgammaAnalysisBaseTool::setAccept(const HLT::TriggerElement *te,const TrigIn
         }
         else if(info.trigType == "photon"){
             ATH_MSG_DEBUG("Check for active features: TrigPhoton, PhotonContainer");
-            passedL2=ancestorPassed<xAOD::TrigPhotonContainer>(te);
+            if(getSGContainsTrigPhoton()){
+                passedL2=ancestorPassed<xAOD::TrigPhotonContainer>(te);
+            }
             passedEF = ancestorPassed<xAOD::PhotonContainer>(te);
             passedEFTrk=true;// Assume true for photons
         }
@@ -930,7 +949,7 @@ GETTER(pixeldEdx)
 GETTER(deltaPhiRescaled3) 
 #undef GETTER    
 
-    std::string TrigEgammaAnalysisBaseTool::getProbePid(const std::string pidtype){
+std::string TrigEgammaAnalysisBaseTool::getProbePid(const std::string pidtype){
     static std::map<std::string,std::string> PidMap; //no longer class member but static
     // Note vloose/lhvloose trigger mapped to Loose/LHLoose offline PID
     if(PidMap.empty()){
@@ -992,43 +1011,56 @@ bool TrigEgammaAnalysisBaseTool::getTrigCaloRings( const xAOD::TrigEMCluster *em
   return false;
 }
 
-bool TrigEgammaAnalysisBaseTool::getCaloRings( const xAOD::Electron * /*el*/, std::vector<float> & /*ringsE*/ ){
+bool TrigEgammaAnalysisBaseTool::getCaloRings( const xAOD::Electron * el, std::vector<float> &ringsE ){
 
-  /*
+  
   if(!el) return false;
   ringsE.clear();
-    
-  auto m_ringsELReader = xAOD::getCaloRingsReader();
 
+  auto ringsELReader = xAOD::getCaloRingsReader();
   // First, check if we can retrieve decoration: 
   const xAOD::CaloRingsLinks *caloRingsLinks(nullptr);
   try { 
-    caloRingsLinks = &(m_ringsELReader->operator()(*el)); 
+    ATH_MSG_DEBUG("getCaloRingsReader->operator()(*el)");
+    caloRingsLinks = &(ringsELReader->operator()(*el)); 
   } catch ( const std::exception &e) { 
     ATH_MSG_WARNING("Couldn't retrieve CaloRingsELVec. Reason: " << e.what()); 
     return false;
   } 
 
-  if ( caloRingsLinks->empty() ){ 
-    ATH_MSG_WARNING("Particle does not have CaloRings decoratorion.");
-    return false;
-  }
+  if( caloRingsLinks ){
+    if ( caloRingsLinks->empty() ){ 
+      ATH_MSG_WARNING("Particle does not have CaloRings decoratorion.");
+      return false;
+    }
 
+    const xAOD::CaloRings *clrings=nullptr;
+    try {
+      // For now, we are using only the first cluster 
+      clrings = *(caloRingsLinks->at(0));
+    } catch(const std::exception &e){
+      ATH_MSG_WARNING("Couldn't retrieve CaloRings. Reason: " << e.what()); 
+      return false;
+    }
+    // For now, we are using only the first cluster 
+    if(clrings) {
+      ATH_MSG_DEBUG("exportRingsTo...");
+      clrings->exportRingsTo(ringsE);
+    }else{
+      ATH_MSG_WARNING("There is a problem when try to attack the rings vector using exportRigsTo() method.");
+      return false;
+    }
 
-  // For now, we are using only the first cluster 
-  const xAOD::CaloRings *clrings = *(caloRingsLinks->at(0));
-  // For now, we are using only the first cluster 
-  
-  if(clrings) clrings->exportRingsTo(ringsE);
-  else{
-    ATH_MSG_WARNING("There is a problem when try to attack the rings vector using exportRigsTo() method.");
+  }else{
+    ATH_MSG_WARNING("CaloRingsLinks in a nullptr...");
     return false;
   }
-  */  
+
   return true;
 }
 
 
+
 void TrigEgammaAnalysisBaseTool::calculatePileupPrimaryVertex(){
   // pileup calculation
   m_nGoodVertex = 0.0; m_nPVertex = 0.0;
@@ -1050,8 +1082,6 @@ void TrigEgammaAnalysisBaseTool::calculatePileupPrimaryVertex(){
 }
 
 
-
-
 MonteCarlo::PDGID TrigEgammaAnalysisBaseTool::pdgid(const xAOD::Egamma *eg, const xAOD::TruthParticleContainer* truthContainer,
                                                                             const xAOD::TruthParticle *&mc_match )
 {
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx
index 95ec6a52b47ee4b6a6dad33f3b025e77a0229636..de83d7d794ca60614295a02ab112a9a8c97cba34 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaDistTool.cxx
@@ -144,13 +144,14 @@ StatusCode TrigEgammaDistTool::toolExecute(const std::string basePath,TrigInfo i
                 const auto* obj = getFeature<xAOD::TrigEMCluster>(feat.te());
                 // Only consider passing objects
                 if(!obj) continue;
-                if(!ancestorPassed<xAOD::TrigEMCluster>(feat.te())) continue;
                 cd(dir+"HLT");
-                hist1("rejection")->Fill("L2Calo",1);
+                if(ancestorPassed<xAOD::TrigEMCluster>(feat.te()))
+                  hist1("rejection")->Fill("L2Calo",1);
                 fillL2Calo(dir+"L2Calo",obj); // Fill HLT shower shapes
-                if(boost::contains(info.trigName,"ringer") || info.trigEtcut || info.trigPerf)
-                    fillRinger(dir+"L2Calo",obj); // Fill HLT shower shapes
             }
+
+
+
             const auto vec_clus = fc.get<xAOD::CaloClusterContainer>("TrigEFCaloCalibFex",TrigDefs::alsoDeactivateTEs);
             for(const auto feat : vec_clus){
                 if(feat.te()==nullptr) continue;
@@ -244,7 +245,7 @@ StatusCode TrigEgammaDistTool::toolExecute(const std::string basePath,TrigInfo i
     return StatusCode::SUCCESS;
 }
 
-void TrigEgammaDistTool::fillL1Calo(const std::string dir, const xAOD::EmTauRoI *l1){
+void TrigEgammaDistTool::fillL1Calo(const std::string &dir, const xAOD::EmTauRoI *l1){
     cd(dir);
     ATH_MSG_DEBUG("Fill L1Calo distributions" << dir);
     hist1("eta")->Fill(l1->eta());
@@ -258,7 +259,7 @@ void TrigEgammaDistTool::fillL1Calo(const std::string dir, const xAOD::EmTauRoI
     hist2("emClusVsHadCore")->Fill(l1->hadCore()*0.001, l1->emClus()*0.001);
 }
 
-void TrigEgammaDistTool::fillEFCalo(const std::string dir, const xAOD::CaloCluster *clus){
+void TrigEgammaDistTool::fillEFCalo(const std::string &dir, const xAOD::CaloCluster *clus){
     cd(dir);
     ATH_MSG_DEBUG("Fill EFCalo distributions" << dir);
     ATH_MSG_DEBUG("Energy " << clus->e()/1.e3);
@@ -286,7 +287,7 @@ void TrigEgammaDistTool::fillEFCalo(const std::string dir, const xAOD::CaloClust
     hist1("phi_calo")->Fill(tmpphi);
 }
 
-void TrigEgammaDistTool::fillL2Electron(const std::string dir, const xAOD::TrigElectron *el){
+void TrigEgammaDistTool::fillL2Electron(const std::string &dir, const xAOD::TrigElectron *el){
     cd(dir);
     if(!el) ATH_MSG_DEBUG("TrigElectron nullptr");
     else {
@@ -297,7 +298,7 @@ void TrigEgammaDistTool::fillL2Electron(const std::string dir, const xAOD::TrigE
 
 }
 
-void TrigEgammaDistTool::fillL2Calo(const std::string dir, const xAOD::TrigEMCluster *emCluster){
+void TrigEgammaDistTool::fillL2Calo(const std::string &dir, const xAOD::TrigEMCluster *emCluster){
     cd(dir);
     if(!emCluster) ATH_MSG_DEBUG("Online pointer fails"); 
     else{
@@ -309,33 +310,9 @@ void TrigEgammaDistTool::fillL2Calo(const std::string dir, const xAOD::TrigEMClu
     }
 }
 
-void TrigEgammaDistTool::fillRinger(const std::string dir, const xAOD::TrigEMCluster *emCluster){
-    cd(dir);
-    if(!emCluster) ATH_MSG_DEBUG("Online pointer fails"); 
-    else{
-        bool hasRings = false;
-        std::vector<float> ringsE;
-        hasRings = getTrigCaloRings(emCluster, ringsE );
-        if(hasRings){
-            hist2("ringer_etVsEta")->Fill(emCluster->eta(), emCluster->et()/1.e3);
-            ///Fill rings pdf for each ring
-            if(m_detailedHists){
-                for(unsigned layer =0; layer < 7; ++layer){
-                    unsigned minRing, maxRing;  std::string strLayer;
-                    parseCaloRingsLayers( layer, minRing, maxRing, strLayer );
-                    cd(dir+"/rings_"+strLayer);
-                    for(unsigned r=minRing; r<=maxRing; ++r){
-                        std::stringstream ss;
-                        ss << "ringer_ring#" << r;
-                        hist1(ss.str())->Fill( ringsE.at(r) );
-                    }///loop into rings
-                }///loop for each calo layer
-            }
-        }
-    }
-}
 
-void TrigEgammaDistTool::fillShowerShapes(const std::string dir,const xAOD::Egamma *eg){
+
+void TrigEgammaDistTool::fillShowerShapes(const std::string &dir,const xAOD::Egamma *eg){
     cd(dir);
     ATH_MSG_DEBUG("Fill SS distributions " << dir);
     if(!eg) ATH_MSG_WARNING("Egamma pointer fails"); 
@@ -362,13 +339,16 @@ void TrigEgammaDistTool::fillShowerShapes(const std::string dir,const xAOD::Egam
         hist1("eta")->Fill(eg->eta());
         hist1("phi")->Fill(eg->phi());
         hist1("topoetcone20")->Fill(getIsolation_topoetcone20(eg)/1e3);
-        if (eg->pt() > 0) 
+        hist1("topoetcone40_shift")->Fill((getIsolation_topoetcone40(eg)-2450)/1e3);
+        if (eg->pt() > 0) {
             hist1("topoetcone20_rel")->Fill(getIsolation_topoetcone20(eg)/eg->pt());
+            hist1("topoetcone40_shift_rel")->Fill((getIsolation_topoetcone40(eg)-2450)/eg->pt());
+        }
         
     }
 }
 
-void TrigEgammaDistTool::fillTracking(const std::string dir, const xAOD::Electron *eg){
+void TrigEgammaDistTool::fillTracking(const std::string &dir, const xAOD::Electron *eg){
     cd(dir);  
     ATH_MSG_DEBUG("Fill tracking");
     if(!eg) ATH_MSG_WARNING("Electron pointer fails");
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..bf313f2bde985292a10927d26d04d19ff8279c8c
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaEventSelection.cxx
@@ -0,0 +1,1206 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+/**********************************************************************
+ * AsgTool: TrigEgammaEventSelection
+ * Authors:
+ *      Ryan Mackenzie White <ryan.white@cern.ch>
+ *      Denis Damazio <denis.damazio@cern.ch>
+ * Contributors:
+ *      Joao Victor da Fonseca Pinto <joao.victor.da.fonseca.pinto@cern.ch>
+ * Date: Mar 2015
+ * Description:
+ *      Derived class for dumping the probe information into a ttree.
+ *     
+ **********************************************************************/
+
+#include "TrigEgammaAnalysisTools/TrigEgammaEventSelection.h"
+#include "GaudiKernel/SystemOfUnits.h"
+using namespace std;
+
+TrigEgammaEventSelection::TrigEgammaEventSelection( const std::string& myname ): 
+  TrigEgammaNavTPBaseTool(myname) , TrigEgammaPhysValBase()
+{
+  m_eventCounter = 0;
+  declareProperty("CutLabels"                        ,      m_cutlabels               );
+  declareProperty("Analysis"                         ,      m_anatype="EventSelection");
+  declareProperty("SelectionZ"                       ,      m_selectionZ=true         );
+  declareProperty("SelectionFakes"                   ,      m_selectionFakes=false    );
+  declareProperty("SelectionMC"                      ,      m_selectionMC=false       );
+  declareProperty("SelectionW"                       ,      m_selectionW=false        );
+  declareProperty("SelectionJpsi"                    ,      m_selectionJpsi=false     );
+  declareProperty("DumpTags"                         ,      m_dumpTags=false          );
+  declareProperty("DetailedDataLevel"                ,      m_detailedDataLevel=0     );
+  declareProperty("ElectronLHVLooseTool"             ,      m_electronLHVLooseTool    );
+
+  
+  declareProperty("HLTElectronLikelihoodSelector"    ,      m_HLTElectronLHSelectors  );
+  declareProperty("EFCaloElectronLikelihoodSelector" , m_EFCaloElectronLHSelectors    );
+  declareProperty("EFCaloElectronIsEMSelector"       , m_EFCaloElectronIsEMSelectors  );
+  declareProperty("HLTElectronIsEMSelector"          , m_HLTElectronIsEMSelectors     );
+
+  m_doCaloRings=false;
+}
+
+StatusCode TrigEgammaEventSelection::childInitialize(){
+
+  if ( (m_electronLHVLooseTool.retrieve()).isFailure() ){
+    ATH_MSG_ERROR( "Could not retrieve VeryLoose LH Selector Tool! Can't work");
+    return StatusCode::FAILURE;
+  }
+
+  if ( (m_EFCaloElectronLHSelectors.retrieve()).isFailure() ){
+    ATH_MSG_ERROR( "Could not retrieve EFCalo LH Selector Tool! Can't work");
+    return StatusCode::FAILURE;
+  }
+ 
+  if ( (m_EFCaloElectronIsEMSelectors.retrieve()).isFailure() ){
+    ATH_MSG_ERROR( "Could not retrieve EFCalo IsEM Selector Tool! Can't work");
+    return StatusCode::FAILURE;
+  }
+  if ( (m_HLTElectronLHSelectors.retrieve()).isFailure() ){
+    ATH_MSG_ERROR( "Could not retrieve HLT LH Selector Tool! Can't work");
+    return StatusCode::FAILURE;
+  }
+  if ( (m_HLTElectronIsEMSelectors.retrieve()).isFailure() ){
+    ATH_MSG_ERROR( "Could not retrieve HLT IsEM Selector Tool! Can't work");
+    return StatusCode::FAILURE;
+  }
+  
+  return StatusCode::SUCCESS;
+}
+
+
+StatusCode TrigEgammaEventSelection::childBook(){
+
+  ATH_MSG_DEBUG("Now configuring chains for analysis");
+  //Set the base directory from the plot()
+  m_dir=plot()->getBasePath();
+  std::vector<std::string> chains  = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*");
+
+  TrigEgammaAnalysisBaseTool::write_trigger_list(chains);
+  
+  if(!getEmulation()){
+    ATH_MSG_ERROR("Emulation tool was not set. This tool use the emulation to retrievea all support objects. Please, enable this!");
+    return StatusCode::FAILURE;
+  }
+
+
+  for(const auto trigName:m_trigInputList){ 
+    if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ 
+      if(plot()->getTrigInfoMap().count(trigName) != 0)
+        ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName);
+      else{ 
+        m_trigList.push_back(trigName);
+        setTrigInfo(trigName);
+      }
+    }else if(getEmulation() && m_forceTrigAttachment){// 
+      ATH_MSG_DEBUG("Trigger doesn't exist in menu. Attach to emulate.");
+      if(plot()->getTrigInfoMap().count(trigName) == 0){
+        std::string parent;
+        m_trigList.push_back(trigName);
+        setTrigEmulation();
+        setTrigInfo(trigName);
+      }
+    }// emulation 
+  }
+ 
+  // set the correct schema level to save
+  /* 0 is very slim schema
+   * 1 is slim
+   * 2 is full */
+  if(m_detailedDataLevel > 0 ){
+    m_doL2Detailed=true;
+    m_doL2CaloDetailed=true;
+  }
+  if(m_detailedDataLevel > 1){
+    m_doRecoDetailed=true;
+    m_doMCDetailed=true;
+  }
+
+
+  // Book histograms for average efficiencies and counters
+  //const int nTrigger = (int) m_trigList.size();
+  addDirectory(m_dir+"/Expert/Event");
+  std::string histname=m_anatype+"_ProbeCutCounter";
+  addHistogram(new TH1F(histname.c_str(), "Number of Probes; Cut ; Count", 12, 0., 12));
+  histname=m_anatype+"_TagCutCounter";
+  addHistogram(new TH1F(histname.c_str(), "Number of Tags; Cut ; Count", 10, 0., 10));
+  histname=m_anatype+"_Mee";
+  addHistogram(new TH1F(histname.c_str(), "Offline M(ee); m_ee [GeV] ; Count", 50, m_ZeeMassMin, m_ZeeMassMax));
+  histname=m_anatype+"_CutCounter";
+  addHistogram(new TH1I(histname.c_str(), "Event Selection; Cut ; Count", 6, 0., 6));
+  setLabels(hist1(histname),m_cutlabels);
+
+
+  addDirectory(m_dir+"/Egamma");
+
+  // create the TDT metadata for future access
+  TTree *tdtMetadata = new TTree("tdt", "Trigger  metadata navigation");
+  createTDTMetadata( tdtMetadata, m_trigList );
+  addTree(tdtMetadata, m_dir+"/Egamma");
+
+  if(m_selectionZ){
+      if(m_dumpTags){
+        TTree *tag = new TTree( "tags", "tree of Offline Zee tags");
+        bookEventBranches( tag );
+        bookElectronBranches( tag );
+        bookTriggerBranches( tag );
+        bookTDTBranches( tag );
+        bookMonteCarloBranches( tag );
+        addTree(tag, m_dir+"/Egamma");
+      }
+      TTree *probe = new TTree( "probes", "tree of Zee probes");
+      bookEventBranches( probe );
+      bookElectronBranches( probe );
+      bookTriggerBranches( probe );
+      bookTDTBranches( probe );
+      bookMonteCarloBranches( probe );
+
+      addTree(probe, m_dir+"/Egamma");
+  }
+
+  if(m_selectionFakes){
+      TTree *fakes = new TTree( "fakes", "tree of Fakes");
+      bookEventBranches( fakes );
+      bookElectronBranches( fakes );
+      bookTriggerBranches( fakes );
+      bookTDTBranches( fakes );
+      bookMonteCarloBranches( fakes );
+      addTree(fakes, m_dir+"/Egamma");
+  }
+
+
+
+  // Check for Rnn container in SG
+  if(m_storeGate->contains<xAOD::TrigRNNOutputContainer>("HLT_xAOD__TrigRNNOutputContainer_TrigRingerNeuralFex")){
+    ATH_MSG_DEBUG("Rnn container in SG "); 
+    setSGContainsRnn(true);
+  }
+
+
+  if(m_storeGate->contains<xAOD::CaloRingsContainer>("ElectronCaloRings")){
+    ATH_MSG_DEBUG("Offline electron calo rings in SG");
+    m_doCaloRings=true;
+  }
+
+
+  ///Alloc pointers
+  alloc_space();
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigEgammaEventSelection::childExecute(){
+
+  m_eventCounter++;
+
+  cd(m_dir+"/Expert/Event");
+  
+  // Event Wise Selection (independent of the required signatures)
+  if ( !TrigEgammaNavTPBaseTool::EventWiseSelection() ) return StatusCode::SUCCESS;
+
+  // Pass by errors in EventInfo
+  if( !TrigEgammaNavTPBaseTool::passesEventCleaning() ) return StatusCode::SUCCESS;
+
+  // nvtx > 0
+  if( getNPVtx() <= 0 )  return StatusCode::SUCCESS;
+  
+  if(m_selectionZ)  
+    EventSelectionZ();
+
+  if(m_selectionFakes)
+    EventSelectionFakes();
+
+
+  return StatusCode::SUCCESS;
+}
+
+bool TrigEgammaEventSelection::EventSelectionZ(){
+
+  ATH_MSG_INFO("In EventSelectonZ...");
+  // execute the standard tag and probe method
+  TrigEgammaNavTPBaseTool::executeTandP();
+  cd(m_dir+"/Egamma");
+ 
+  for(auto Z : m_Z){
+    const xAOD::Electron *elTag   = m_offElectrons->at(Z.first);
+    const xAOD::Electron *elProbe = m_offElectrons->at(Z.second); 
+    if(m_dumpTags)
+      fill( tree("tags"  , m_dir+"/Egamma")  , elTag   );
+    fill( tree("probes", m_dir+"/Egamma")  , elProbe );
+
+  }// Loop over pairs
+
+  return true;
+}
+
+bool TrigEgammaEventSelection::EventSelectionFakes(){
+
+  
+  ATH_MSG_INFO("In EventSelectonFakes...");
+
+  for(const auto& elTag : *m_offElectrons){ 
+
+    // Remove electrons from Z or W if this is Monte Carlo
+    if(m_selectionMC && !isTruthElectronAny( elTag ))  continue; 
+
+    if (!elTag->isGoodOQ(xAOD::EgammaParameters::BADCLUSELECTRON)) continue;
+
+    if(!elTag->trackParticle()) continue;
+
+    // Default is 4 GeV
+    if( !(elTag->e()/cosh(elTag->trackParticle()->eta())  > m_probeMinEt*Gaudi::Units::GeV) ) continue;
+    
+    //fiducial detector acceptance region
+    float absEta = fabs(elTag->caloCluster()->etaBE(2));
+    if (absEta > 2.47) continue;
+     
+    if( !(getWTransverseMass(elTag) < 40000) )  continue;
+
+    bool passesZveto=true;
+
+    // If we can find any pair that falls in the Zmass window we fail the passesZveto cut
+    for(const auto& elProbe : *m_offElectrons){
+
+      if(elTag == elProbe)  continue;
+
+      if(!elProbe->isGoodOQ(xAOD::EgammaParameters::BADCLUSELECTRON)) continue;
+      
+      if(!elProbe->trackParticle()) continue;
+      
+      // Must be higher than 4 GeV
+      if( (getEt(elProbe)) < 4*Gaudi::Units::GeV)  continue;
+
+      if(!TrigEgammaNavTPBaseTool::ApplyElectronPid(elProbe,"LHMedium")) continue;
+
+      //Must be an easy way with IParticle
+      TLorentzVector el1;
+      TLorentzVector el2;
+      el1.SetPtEtaPhiE(elTag->pt(), elTag->trackParticle()->eta(), elTag->trackParticle()->phi(), elTag->e());
+      el2.SetPtEtaPhiE(elProbe->pt(), elProbe->trackParticle()->eta(), elProbe->trackParticle()->phi(), elProbe->e());
+      float tpPairMass = (el1 + el2).M();
+      if( !((tpPairMass > m_ZeeMassMin*Gaudi::Units::GeV) && (tpPairMass < m_ZeeMassMax*Gaudi::Units::GeV))){
+          ATH_MSG_DEBUG("tag and probe pair not in Z mass window");
+          continue;
+      }else{
+        ATH_MSG_INFO("tag and probe pain in Z mass window. Regect the electron...");
+        passesZveto=false;
+        break;
+      }
+    }// Loop over probes electrons
+
+    if(!passesZveto)  continue;
+
+    ATH_MSG_INFO("Appling Fire trigger...");
+    if(!ApplyFireTriggers( elTag ))  continue;
+
+    if(TrigEgammaNavTPBaseTool::ApplyElectronPid(elTag,"LHTight")) continue;
+    
+    ATH_MSG_INFO("Fill electron...");
+    fill( tree("fakes"  , m_dir+"/Egamma")  , elTag   );
+
+
+  }// Loop over electrons
+
+  return true;
+}
+
+
+
+bool TrigEgammaEventSelection::fill( TTree *t, const xAOD::Electron *el){
+ 
+
+  linkEventBranches(t); 
+  linkElectronBranches(t); 
+  linkTriggerBranches(t); 
+  linkMonteCarloBranches(t); 
+
+  const HLT::TriggerElement* feat=nullptr;
+
+  if(getEmulation())
+    emulation()->match( el,  feat );
+  else{
+    ATH_MSG_ERROR("Emulation tool was not configurated. Impossible to match! Please, see your python config.");
+    return false;
+  }
+
+  if(feat){
+    clear();
+    fillEvent();
+    fillElectron( el );  
+
+    if(!fillMonteCarlo( el ) ){
+      ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron");
+    }
+ 
+    ///Start trigger analisys...
+    const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat);
+    if(emTauRoI){
+      fillEmTauRoI( emTauRoI ); 
+    }else{ 
+      ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement..");
+    }
+  
+    const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat);
+    if(emCluster){
+      if(!fillTrigEMCluster( emCluster )){
+        ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree.");
+      }
+
+      if(!fillTrigCaloRings( feat )){
+        ATH_MSG_WARNING("Cound not attach the TrigRingerRings information into the tree.");
+      }
+    }///cluster protection
+  
+  
+    const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat);
+    // Level 2 ID+Calo
+    if(trigElCont){
+      for(const auto& trigEl : *trigElCont){
+        if(!fillTrigElectron(trigEl)) {
+          ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree.");
+        }    
+      }// loop over all trigElectrons for this feat
+    }
+     
+    const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat);
+    if(caloCont){
+      for(const auto& cl : *caloCont){
+        if(!fillCaloCluster(cl)){
+          ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree.");
+        }
+      }// loop over calo cluster
+    }
+
+
+    const xAOD::ElectronContainer *elCont = getFeature<xAOD::ElectronContainer>(feat);
+
+    if(elCont){
+      for(const auto& hlt_el : *elCont){
+        if(!fillHLTElectron(hlt_el))
+          ATH_MSG_WARNING("Cound not attach the HLT Electron information into the tree.");
+      }
+    }
+
+
+    fillTDT( el, feat );
+
+
+    ATH_MSG_INFO("recording trigger information into the file.");
+    t->Fill();
+  }//loop over trigger objects
+
+  return true;
+}
+
+
+bool TrigEgammaEventSelection::fillTDT(const xAOD::Electron *el , const HLT::TriggerElement *te){
+
+  ATH_MSG_DEBUG("FillTDT...");
+  for(auto& trigItem : m_trigList){
+
+    const HLT::TriggerElement* feat=nullptr;
+    match()->match(el, trigItem, feat);
+    if(feat){
+      asg::AcceptData acceptData = setAccept(feat, getTrigInfo(trigItem));
+      bool passedL1Calo  = acceptData.getCutResult("L1Calo");
+      bool passedL2Calo  = acceptData.getCutResult("L2Calo");
+      bool passedL2      = acceptData.getCutResult("L2");
+      bool passedEFCalo  = acceptData.getCutResult("EFCalo");
+      bool passedHLT     = acceptData.getCutResult("HLT");
+      m_trig_tdt_L1_calo_accept->push_back( int(passedL1Calo) );
+      m_trig_tdt_L2_calo_accept->push_back( int(passedL2Calo) );
+      m_trig_tdt_L2_el_accept->push_back( int(passedL2) );
+      m_trig_tdt_EF_calo_accept->push_back( int(passedEFCalo) );
+      m_trig_tdt_EF_el_accept->push_back( int(passedHLT) );
+      //m_trig_tdt_emu_decision_mask
+      count("tdt_"+trigItem+"_total");
+      if(passedL1Calo)  count("tdt_"+trigItem+"_L1Calo");
+      if(passedL2Calo)  count("tdt_"+trigItem+"_L2Calo");
+      if(passedL2)      count("tdt_"+trigItem+"_L2"    );
+      if(passedEFCalo)  count("tdt_"+trigItem+"_EFCalo");
+      if(passedHLT)     count("tdt_"+trigItem+"_HLT"   );
+ 
+    }else{
+      m_trig_tdt_L1_calo_accept->push_back( -1 );
+      m_trig_tdt_L2_calo_accept->push_back( -1 );
+      m_trig_tdt_L2_el_accept->push_back( -1 );
+      m_trig_tdt_EF_calo_accept->push_back( -1 );
+      m_trig_tdt_EF_el_accept->push_back( -1 );
+    }
+
+    if(te && getEmulation()){
+      asg::AcceptData acceptData  = emulation()->executeTool(te, trigItem);
+      bool passedL1Calo  = acceptData.getCutResult("L1Calo");
+      bool passedL2Calo  = acceptData.getCutResult("L2Calo");
+      bool passedL2      = acceptData.getCutResult("L2");
+      bool passedEFCalo  = acceptData.getCutResult("EFCalo");
+      bool passedHLT     = acceptData.getCutResult("HLT");
+      m_trig_tdt_emu_L1_calo_accept->push_back( int(passedL1Calo) );
+      m_trig_tdt_emu_L2_calo_accept->push_back( int(passedL2Calo) );
+      m_trig_tdt_emu_L2_el_accept->push_back(   int(passedL2) );
+      m_trig_tdt_emu_EF_calo_accept->push_back( int(passedEFCalo) );
+      m_trig_tdt_emu_EF_el_accept->push_back(   int(passedHLT) );
+      //m_trig_tdt_emu_decision_mask
+      count("emu_"+trigItem+"_total");
+      if(passedL1Calo)  count("emu_"+trigItem+"_L1Calo");
+      if(passedL2Calo)  count("emu_"+trigItem+"_L2Calo");
+      if(passedL2)      count("emu_"+trigItem+"_L2"    );
+      if(passedEFCalo)  count("emu_"+trigItem+"_EFCalo");
+      if(passedHLT)     count("emu_"+trigItem+"_HLT"   );
+    }else{
+      m_trig_tdt_emu_L1_calo_accept->push_back( -1 );
+      m_trig_tdt_emu_L2_calo_accept->push_back( -1 );
+      m_trig_tdt_emu_L2_el_accept->push_back( -1 );
+      m_trig_tdt_emu_EF_calo_accept->push_back( -1 );
+      m_trig_tdt_emu_EF_el_accept->push_back( -1 );
+    }
+
+
+  }// Loop over triggers
+
+
+  return true;
+
+}
+
+
+
+bool TrigEgammaEventSelection::fillTrigCaloRings( const HLT::TriggerElement *feat ){
+  
+  ATH_MSG_DEBUG("FillTrigCaloRings...");
+  /* try to get the calo rings energy for this TE!*/
+  const xAOD::TrigRingerRings *ringer = getFeature<xAOD::TrigRingerRings>(feat);
+  if(ringer){// from this TE
+    for(unsigned r=0; r<ringer->size(); ++r){
+      m_trig_L2_calo_rings->push_back(ringer->rings()[r]);
+    }
+  }else{// from others TEs
+    const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat);
+    if(emCluster){
+      // try to match without any other cluster.
+      TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, *m_trig_L2_calo_rings);
+    }else{
+      return false;
+    }
+  }
+ 
+  if(getSGContainsRnn()){
+    /* try to retrieve the NN output from this TE*/
+    const xAOD::TrigRNNOutput *rnn = getFeature<xAOD::TrigRNNOutput>(feat);
+    if(rnn){
+      for(unsigned o=0; o<rnn->rnnDecision().size(); ++o)
+        m_trig_L2_calo_rnnOutput->push_back(rnn->rnnDecision()[o]);
+    }else{
+      ATH_MSG_WARNING("Cound not attach the TrigRNNOutput information into the tree.");
+    }
+  }
+  return true;
+}
+
+
+
+
+bool TrigEgammaEventSelection::ApplyFireTriggers( const xAOD::Electron *el){
+
+  float et = getEt(el);
+
+  std::string trigger="";
+  
+  if(et < 5*Gaudi::Units::GeV){
+    return false;
+  }else if(et >= 5*Gaudi::Units::GeV && et < 10*Gaudi::Units::GeV){
+    trigger = "HLT_e5_etcut";
+  }else if(et >= 10*Gaudi::Units::GeV && et < 15*Gaudi::Units::GeV){
+    trigger = "HLT_e10_etcut_L1EM7";
+  }else if(et >= 15*Gaudi::Units::GeV && et < 20*Gaudi::Units::GeV){
+    trigger = "HLT_e15_etcut_L1EM7";
+  }else if(et >= 20*Gaudi::Units::GeV && et < 25*Gaudi::Units::GeV){
+    trigger = "HLT_e20_etcut_L1EM12";
+  }else if(et >= 25*Gaudi::Units::GeV && et < 30*Gaudi::Units::GeV){
+    trigger = "HLT_e25_etcut_L1EM15";
+  }else if(et >= 30*Gaudi::Units::GeV && et < 40*Gaudi::Units::GeV){
+    trigger = "HLT_e30_etcut_L1EM15";
+  }else if(et >= 40*Gaudi::Units::GeV && et < 50*Gaudi::Units::GeV){
+    trigger = "HLT_e40_etcut_L1EM15";
+  }else if(et >= 50*Gaudi::Units::GeV && et < 60*Gaudi::Units::GeV){
+    trigger = "HLT_e50_etcut_L1EM15";
+  }else if(et >= 50*Gaudi::Units::GeV && et < 60*Gaudi::Units::GeV){
+    trigger = "HLT_e60_etcut";
+  }else if(et >= 60*Gaudi::Units::GeV && et < 70*Gaudi::Units::GeV){
+    trigger = "HLT_e70_etcut";
+  }else if(et >= 70*Gaudi::Units::GeV && et < 80*Gaudi::Units::GeV){
+    trigger = "HLT_e80_etcut";
+  }else if(et >= 80*Gaudi::Units::GeV && et < 100*Gaudi::Units::GeV){
+    trigger = "HLT_e100_etcut";
+  }else if(et >= 100*Gaudi::Units::GeV && et < 120*Gaudi::Units::GeV){
+    trigger = "HLT_e120_etcut";
+  }else{
+    return true;
+  }
+ 
+  const HLT::TriggerElement *te;
+  match()->match(el,trigger,te);
+  bool passedHLT = ancestorPassed<xAOD::ElectronContainer>(te);
+  
+  if(!passedHLT)  return false;
+
+  return true;
+}
+
+
+
+StatusCode TrigEgammaEventSelection::childFinalize(){
+  
+  for(auto& trigItem : m_trigList){
+    ATH_MSG_DEBUG("From TDT tool:");
+    ATH_MSG_DEBUG(trigItem << " total  = " << m_countMap["tdt_"+trigItem+"_total"] );
+    ATH_MSG_DEBUG(trigItem << " L1Calo = " << m_countMap["tdt_"+trigItem+"_L1Calo"]);
+    ATH_MSG_DEBUG(trigItem << " L2Calo = " << m_countMap["tdt_"+trigItem+"_L2Calo"]);
+    ATH_MSG_DEBUG(trigItem << " L2     = " << m_countMap["tdt_"+trigItem+"_L2"]    );
+    ATH_MSG_DEBUG(trigItem << " EFCalo = " << m_countMap["tdt_"+trigItem+"_EFCalo"]);
+    ATH_MSG_DEBUG(trigItem << " HLT    = " << m_countMap["tdt_"+trigItem+"_HLT"]   );
+    ATH_MSG_DEBUG("From emulation tool:");
+    ATH_MSG_DEBUG(trigItem << " total  = " << m_countMap["emu_"+trigItem+"_total"] );
+    ATH_MSG_DEBUG(trigItem << " L1Calo = " << m_countMap["emu_"+trigItem+"_L1Calo"]);
+    ATH_MSG_DEBUG(trigItem << " L2Calo = " << m_countMap["emu_"+trigItem+"_L2Calo"]);
+    ATH_MSG_DEBUG(trigItem << " L2     = " << m_countMap["emu_"+trigItem+"_L2"]    );
+    ATH_MSG_DEBUG(trigItem << " EFCalo = " << m_countMap["emu_"+trigItem+"_EFCalo"]);
+    ATH_MSG_DEBUG(trigItem << " HLT    = " << m_countMap["emu_"+trigItem+"_HLT"]   );
+  }
+  return StatusCode::SUCCESS;
+}
+
+
+bool TrigEgammaEventSelection::fillEmTauRoI( const xAOD::EmTauRoI *emTauRoI ){
+  
+  ATH_MSG_DEBUG("FillEmTauRoI...");
+  m_trig_L1_eta     = emTauRoI->eta();
+  m_trig_L1_phi     = emTauRoI->phi();
+  m_trig_L1_emClus  = emTauRoI->emClus();
+  m_trig_L1_tauClus = emTauRoI->tauClus();
+  m_trig_L1_emIsol  = emTauRoI->emIsol();
+  m_trig_L1_hadIsol = emTauRoI->hadIsol();
+  m_trig_L1_hadCore = emTauRoI->hadCore();
+  return true;
+} 
+
+bool TrigEgammaEventSelection::fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ){
+  
+  ATH_MSG_DEBUG("FillTrigEMCluster...");
+  m_trig_L2_calo_et         = emCluster->et();
+  m_trig_L2_calo_eta        = emCluster->eta();
+  m_trig_L2_calo_phi        = emCluster->phi();
+  m_trig_L2_calo_emaxs1     = emCluster->emaxs1();
+  m_trig_L2_calo_e2tsts1    = emCluster->e2tsts1();
+  m_trig_L2_calo_e237       = emCluster->e237();
+  m_trig_L2_calo_e277       = emCluster->e277();
+  m_trig_L2_calo_ehad1      = emCluster->ehad1();
+  m_trig_L2_calo_weta2      = emCluster->weta2();
+  m_trig_L2_calo_wstot      = emCluster->wstot();
+  m_trig_L2_calo_fracs1     = emCluster->fracs1();
+  for(unsigned i=0; i<emCluster->energySample().size(); ++i){
+    m_trig_L2_calo_energySample->push_back( emCluster->energySample().at(i));
+  }
+
+  return true;
+}
+
+
+bool TrigEgammaEventSelection::fillTrigElectron( const xAOD::TrigElectron *trigEl ){
+   ATH_MSG_DEBUG("FillTrigElectron...");
+   //const xAOD::TrackParticle* trkIter = trigEl->trackParticle();
+   //if (trkIter==nullptr) return false; // disconsider candidates without track
+   //int algoId = 0;
+   //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::FastTrackFinderSeed] ) algoId=9;
+   //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyA] )           algoId=5;
+   //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyB] )           algoId=6;
+   //if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyC] )           algoId=7;
+
+   //m_trig_L2_el_trackAlgID  ->push_back(algoId);
+   m_trig_L2_el_caloEta     ->push_back(trigEl->caloEta()); 
+   m_trig_L2_el_trkClusDphi ->push_back(trigEl->trkClusDphi());  
+   m_trig_L2_el_trkClusDeta ->push_back(trigEl->trkClusDeta());  
+   m_trig_L2_el_pt          ->push_back(trigEl->pt());
+   m_trig_L2_el_phi         ->push_back(trigEl->phi());  
+   m_trig_L2_el_eta         ->push_back(trigEl->eta());  
+   m_trig_L2_el_etOverPt    ->push_back(trigEl->etOverPt());          
+   m_trig_L2_el_nTRTHits    ->push_back(trigEl->nTRTHits());        
+   m_trig_L2_el_nTRTHiThresholdHits->push_back(trigEl->nTRTHiThresholdHits());
+   m_trig_L2_el_charge      ->push_back(trigEl->charge());      
+   return true;
+}
+
+
+bool TrigEgammaEventSelection::fillCaloCluster( const xAOD::CaloCluster *cluster){
+
+  ATH_MSG_DEBUG("FillCaloCluster...");
+  m_trig_EF_calo_et->push_back(cluster->et());
+  m_trig_EF_calo_eta->push_back(cluster->eta());
+  m_trig_EF_calo_phi->push_back(cluster->phi());
+  m_trig_EF_calo_etaBE2->push_back(cluster->etaBE(2));
+  m_trig_EF_calo_e->push_back(cluster->e());
+
+  return true;
+}
+
+bool TrigEgammaEventSelection::fillEvent(){
+  ///Event information
+  ATH_MSG_DEBUG("FillEvent...");
+  m_runNumber               = m_eventInfo->runNumber();
+  m_eventNumber             = m_eventInfo->eventNumber();
+  m_lumiBlock               = m_eventInfo->lumiBlock();
+  m_avgmu=getAvgMu();
+  return true;
+}
+
+bool TrigEgammaEventSelection::fillElectron( const xAOD::Electron *el ){
+
+  ATH_MSG_DEBUG("FillElectron...");
+  ///Cluster information
+  uint8_t nblayerhits(0);
+  uint8_t nblayerolhits(0);
+  uint8_t npixhits(0);
+  uint8_t npixolhits(0);
+  uint8_t nscthits(0);
+  uint8_t nsctolhits(0);
+  uint8_t ntrthighthreshits(0);
+  uint8_t ntrthighthresolhits(0);
+  uint8_t ntrthits(0);
+  uint8_t ntrtolhits(0);
+  uint8_t ntrtxenonhits(0);
+  uint8_t npixdeadsensors(0);
+  uint8_t nsctdeadsensors(0);
+  uint8_t expectblayerhit(true);
+  uint8_t expectNextToInnerMostLayer(true);
+  uint8_t nNextToInnerMostLayerHits(0);
+  uint8_t nNextToInnerMostLayerOutliers(0);
+  float val(0);
+  bool hasCalo(false);
+  bool hasTrack(false);
+
+
+  
+  m_el_e                    = el->e();
+  m_el_et                   = el->pt();
+  m_el_eta                  = el->eta();
+  m_el_phi                  = el->phi();
+
+  el->showerShapeValue( m_el_ethad1   , xAOD::EgammaParameters::ShowerShapeType::ethad1   ); 
+  el->showerShapeValue( m_el_ehad1    , xAOD::EgammaParameters::ShowerShapeType::ehad1    );
+  el->showerShapeValue( m_el_f1       , xAOD::EgammaParameters::ShowerShapeType::f1       ); // LH
+  el->showerShapeValue( m_el_f3       , xAOD::EgammaParameters::ShowerShapeType::f3       ); // LH
+  el->showerShapeValue( m_el_f1core   , xAOD::EgammaParameters::ShowerShapeType::f1core   );
+  el->showerShapeValue( m_el_f3core   , xAOD::EgammaParameters::ShowerShapeType::f3core   );
+  el->showerShapeValue( m_el_weta1    , xAOD::EgammaParameters::ShowerShapeType::weta1    ); // LH (new)
+  el->showerShapeValue( m_el_weta2    , xAOD::EgammaParameters::ShowerShapeType::weta2    ); // LH
+  el->showerShapeValue( m_el_wtots1   , xAOD::EgammaParameters::ShowerShapeType::wtots1   );
+  el->showerShapeValue( m_el_fracs1   , xAOD::EgammaParameters::ShowerShapeType::fracs1   );
+  el->showerShapeValue( m_el_Reta     , xAOD::EgammaParameters::ShowerShapeType::Reta     ); // LH
+  el->showerShapeValue( m_el_Rphi     , xAOD::EgammaParameters::ShowerShapeType::Rphi     ); // LH
+  el->showerShapeValue( m_el_Eratio   , xAOD::EgammaParameters::ShowerShapeType::Eratio   ); // LH
+  el->showerShapeValue( m_el_Rhad     , xAOD::EgammaParameters::ShowerShapeType::Rhad     ); // LH
+  el->showerShapeValue( m_el_Rhad1    , xAOD::EgammaParameters::ShowerShapeType::Rhad1    ); // LH
+  el->showerShapeValue( m_el_deltaE   , xAOD::EgammaParameters::ShowerShapeType::DeltaE   ); // LH
+  el->showerShapeValue( m_el_e277     , xAOD::EgammaParameters::ShowerShapeType::e277     ); // LH
+  ///Combined track/Cluter information
+  el->trackCaloMatchValue( m_el_deta2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2   );
+  el->trackCaloMatchValue( m_el_dphi2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2   );
+  el->trackCaloMatchValue( m_el_dphiresc  , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0 );
+  m_el_deltaPhiRescaled2  =  get_el_deltaPhiRescaled2(el); // LH
+  m_el_deltaEta1          =  get_el_deltaEta1(el); // LH
+ 
+  if(el->caloCluster()){
+    hasCalo=true;
+    m_el_calo_et                 = getCluster_et( el );
+    m_el_calo_eta                = getCluster_eta( el );
+    m_el_calo_phi                = getCluster_phi( el );
+    m_el_calo_etaBE2             = el->caloCluster()->etaBE(2); // LH
+    m_el_calo_e                  = el->caloCluster()->e(); // LH
+  }
+ 
+  ///Track particle information
+  const xAOD::TrackParticle *track = el->trackParticle();
+  if(track){
+    hasTrack=true;
+    track->summaryValue( nblayerhits                  , xAOD::SummaryType::numberOfBLayerHits );
+    track->summaryValue( nblayerolhits                , xAOD::SummaryType::numberOfBLayerOutliers );
+    track->summaryValue( npixhits                     , xAOD::SummaryType::numberOfPixelHits );
+    track->summaryValue( npixolhits                   , xAOD::SummaryType::numberOfPixelOutliers );
+    track->summaryValue( npixdeadsensors              , xAOD::SummaryType::numberOfPixelDeadSensors);
+    track->summaryValue( nscthits                     , xAOD::SummaryType::numberOfSCTHits );
+    track->summaryValue( nsctolhits                   , xAOD::SummaryType::numberOfSCTOutliers );
+    track->summaryValue( nsctdeadsensors              , xAOD::SummaryType::numberOfSCTDeadSensors);
+    track->summaryValue( ntrthits                     , xAOD::SummaryType::numberOfTRTHits);
+    track->summaryValue( ntrtolhits                   , xAOD::SummaryType::numberOfTRTOutliers );
+    track->summaryValue( ntrthighthreshits            , xAOD::SummaryType::numberOfTRTHighThresholdHits );
+    track->summaryValue( ntrthighthresolhits          , xAOD::SummaryType::numberOfTRTHighThresholdOutliers );
+    track->summaryValue( ntrtxenonhits                , xAOD::SummaryType::numberOfTRTXenonHits );
+    track->summaryValue( expectblayerhit              , xAOD::SummaryType::expectBLayerHit );
+    track->summaryValue( expectNextToInnerMostLayer   , xAOD::expectNextToInnermostPixelLayerHit);
+    track->summaryValue( nNextToInnerMostLayerHits    , xAOD::numberOfNextToInnermostPixelLayerHits);
+    track->summaryValue( nNextToInnerMostLayerOutliers, xAOD::numberOfNextToInnermostPixelLayerOutliers);
+    
+    m_el_trk_pt                 =  track->pt();
+    m_el_trk_eta                =  track->eta();
+    m_el_trk_charge             =  track->charge(); // LH 
+    m_el_trk_qOverP             =  track->qOverP(); // LH
+    m_el_trk_sigd0              =  get_el_sigd0(el); // LH
+    m_el_trk_d0                 =  get_el_d0(el); // LH
+    m_el_trk_eProbabilityHT     =  get_el_eProbabilityHT(el); // LH
+    m_el_trk_transformed_eProbabilityHT=get_el_transformed_eProbabilityHT(el); // LH
+    m_el_trk_d0significance     =  get_el_d0significance(el);
+    m_el_trk_deltaPOverP        =  get_el_DeltaPOverP(el); // LH
+
+  }
+
+  ///Extra information about pileup
+  m_el_nGoodVtx             = getNGoodVertex();
+  m_el_nPileupPrimaryVtx    = getNPVtx();
+
+  auto ctx = Gaudi::Hive::currentContext() ;
+  // rerun Likelihood Veryloose selector tool
+  bool accept=(bool)m_electronLHVLooseTool->accept(ctx,el, getAvgMu());
+  m_el_lhVLoose             = accept;
+  m_el_loose                = ApplyElectronPid(el, "Loose");
+  m_el_medium               = ApplyElectronPid(el, "Medium");
+  m_el_tight                = ApplyElectronPid(el, "Tight");
+  m_el_lhLoose              = ApplyElectronPid(el, "LHLoose");
+  m_el_lhMedium             = ApplyElectronPid(el, "LHMedium");
+  m_el_lhTight              = ApplyElectronPid(el, "LHTight"); 
+ 
+
+  // Do not change this order!
+  m_el_trk_summaryValues->push_back( nblayerhits                     ); 
+  m_el_trk_summaryValues->push_back( nblayerolhits                   ); 
+  m_el_trk_summaryValues->push_back( npixhits                        ); 
+  m_el_trk_summaryValues->push_back( npixolhits                      ); 
+  m_el_trk_summaryValues->push_back( npixdeadsensors                 ); 
+  m_el_trk_summaryValues->push_back( nscthits                        ); 
+  m_el_trk_summaryValues->push_back( nsctolhits                      ); 
+  m_el_trk_summaryValues->push_back( nsctdeadsensors                 ); 
+  m_el_trk_summaryValues->push_back( ntrthits                        ); 
+  m_el_trk_summaryValues->push_back( ntrtolhits                      ); 
+  m_el_trk_summaryValues->push_back( ntrthighthreshits               ); 
+  m_el_trk_summaryValues->push_back( ntrthighthresolhits             ); 
+  m_el_trk_summaryValues->push_back( ntrtxenonhits                   ); 
+  m_el_trk_summaryValues->push_back( expectblayerhit                 ); 
+  m_el_trk_summaryValues->push_back( expectNextToInnerMostLayer      ); 
+  m_el_trk_summaryValues->push_back( nNextToInnerMostLayerHits       ); 
+  m_el_trk_summaryValues->push_back( nNextToInnerMostLayerOutliers   );
+
+  //Add isolations values
+  el->isolationValue(val,xAOD::Iso::etcone20);
+  m_el_etCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::etcone30);
+  m_el_etCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::etcone40);
+  m_el_etCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptcone20);
+  m_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptcone30);
+  m_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptcone40);
+  m_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptvarcone20);
+  m_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptvarcone30);
+  m_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptvarcone40);
+  m_el_ptCone->push_back(val);
+
+  m_el_hasCalo=hasCalo;
+  m_el_hasTrack=hasTrack;
+
+
+  if(m_doCaloRings){
+    ATH_MSG_DEBUG("Fill Electron calo rings...");
+    if(!TrigEgammaAnalysisBaseTool::getCaloRings( el , *m_el_ringsE)){
+      ATH_MSG_WARNING("Could not attach the calorRings information.");
+    }
+  }
+
+
+
+  return true;
+}
+
+
+bool TrigEgammaEventSelection::fillHLTElectron( const xAOD::Electron *el ){
+
+  ATH_MSG_DEBUG("FillHLTElectron...");
+  float   calo_e(0);
+  float   calo_et(0);
+  float   calo_eta(0);
+  float   calo_phi(0);
+  float   calo_etaBE2(0);
+  float   eta(0);
+  float   et(0);
+  //float   eta2(0);
+  float   phi(0);
+  float   pt(0);
+  float   trk_eta(0);
+  float   ethad1(0);
+  float   ehad1(0);
+  float   f1(0);
+  float   f3(0);
+  float   f1core(0);
+  float   f3core(0);
+  float   weta1(0);
+  float   weta2(0);
+  float   wtots1(0);
+  float   fracs1(0);
+  float   Reta(0);
+  float   Rphi(0);
+  float   Eratio(0);
+  float   Rhad(0);
+  float   Rhad1(0);
+  float   deta1(0);
+  float   deta2(0);
+  float   dphi2(0);
+  float   dphiresc(0);
+  float   charge(0);
+  float   qOverP(0);
+  float   sigd0(0);
+  float   d0(0);
+  //float   eprobht(0);
+  float   eProbabilityHT(0);
+  float   transformed_eProbabilityHT(0);
+  float   d0significance(0);
+  float   deltaPhiRescaled2(0);
+  float   deltaPOverP(0);
+  float   e(0);
+  float   e277(0);
+  float   deltaE(0);
+  uint8_t nblayerhits(0);
+  uint8_t nblayerolhits(0);
+  uint8_t npixhits(0);
+  uint8_t npixolhits(0);
+  uint8_t nscthits(0);
+  uint8_t nsctolhits(0);
+  uint8_t ntrthighthreshits(0);
+  uint8_t ntrthighthresolhits(0);
+  uint8_t ntrthits(0);
+  uint8_t ntrtolhits(0);
+  uint8_t ntrtxenonhits(0);
+  uint8_t npixdeadsensors(0);
+  uint8_t nsctdeadsensors(0);
+  uint8_t expectblayerhit(true);
+  uint8_t expectNextToInnerMostLayer(true);
+  uint8_t nNextToInnerMostLayerHits(0);
+  uint8_t nNextToInnerMostLayerOutliers(0);
+  float   val(0) ; 
+
+  bool hasCalo(false);
+  bool hasTrack(false);
+
+
+  ATH_MSG_DEBUG("FillElectron...");
+  
+  ///Cluster information
+  e                    = el->e();
+  et                   = el->pt();
+  eta                  = el->eta();
+  phi                  = el->phi();
+
+  el->showerShapeValue( ethad1   , xAOD::EgammaParameters::ShowerShapeType::ethad1   ); 
+  el->showerShapeValue( ehad1    , xAOD::EgammaParameters::ShowerShapeType::ehad1    );
+  el->showerShapeValue( f1       , xAOD::EgammaParameters::ShowerShapeType::f1       ); // LH, isEM
+  el->showerShapeValue( f3       , xAOD::EgammaParameters::ShowerShapeType::f3       ); // LH, isEM
+  el->showerShapeValue( f1core   , xAOD::EgammaParameters::ShowerShapeType::f1core   );
+  el->showerShapeValue( f3core   , xAOD::EgammaParameters::ShowerShapeType::f3core   ); // isEM
+  el->showerShapeValue( weta1    , xAOD::EgammaParameters::ShowerShapeType::weta1    ); // LH, isEM (new)
+  el->showerShapeValue( weta2    , xAOD::EgammaParameters::ShowerShapeType::weta2    ); // LH, isEM
+  el->showerShapeValue( wtots1   , xAOD::EgammaParameters::ShowerShapeType::wtots1   ); // LH, isEM
+  el->showerShapeValue( fracs1   , xAOD::EgammaParameters::ShowerShapeType::fracs1   ); // isEM
+  el->showerShapeValue( Reta     , xAOD::EgammaParameters::ShowerShapeType::Reta     ); // LH, isEM
+  el->showerShapeValue( Rphi     , xAOD::EgammaParameters::ShowerShapeType::Rphi     ); // LH, isEM
+  el->showerShapeValue( Eratio   , xAOD::EgammaParameters::ShowerShapeType::Eratio   ); // LH, isEM
+  el->showerShapeValue( Rhad     , xAOD::EgammaParameters::ShowerShapeType::Rhad     ); // LH, isEM
+  el->showerShapeValue( Rhad1    , xAOD::EgammaParameters::ShowerShapeType::Rhad1    ); // LH, isEM
+  el->showerShapeValue( e277     , xAOD::EgammaParameters::e277                      ); // isEM (new)
+  el->showerShapeValue( deltaE   , xAOD::EgammaParameters::DeltaE                    ); // isEM (new)
+
+  ///Combined track/Cluter information
+  el->trackCaloMatchValue( deta2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2          );
+  el->trackCaloMatchValue( dphi2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2          );
+  el->trackCaloMatchValue( dphiresc  , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0  );
+  deltaPhiRescaled2  =  get_el_deltaPhiRescaled2(el); // LH
+  deta1              =  get_el_deltaEta1(el); // LH
+ 
+  if(el->caloCluster()){
+    hasCalo=true;
+    calo_et                 = getCluster_et( el );
+    calo_eta                = getCluster_eta( el );
+    calo_phi                = getCluster_phi( el );
+    calo_etaBE2             = el->caloCluster()->etaBE(2); // LH
+    calo_e                  = el->caloCluster()->e(); // LH
+  }
+ 
+
+
+  ///Track particle information
+  const xAOD::TrackParticle *track = el->trackParticle();
+  if(track){
+    hasTrack=true;
+    // track->summaryValue( eprobht                      , xAOD::SummaryType::eProbabilityHT ); // LH
+    track->summaryValue( nblayerhits                  , xAOD::SummaryType::numberOfBLayerHits ); // LH, isEM
+    track->summaryValue( nblayerolhits                , xAOD::SummaryType::numberOfBLayerOutliers ); // LH, isEM
+    track->summaryValue( npixhits                     , xAOD::SummaryType::numberOfPixelHits ); // LH, isEM
+    track->summaryValue( npixolhits                   , xAOD::SummaryType::numberOfPixelOutliers ); // isEM
+    track->summaryValue( npixdeadsensors              , xAOD::SummaryType::numberOfPixelDeadSensors); // LH, isEM
+    track->summaryValue( nscthits                     , xAOD::SummaryType::numberOfSCTHits ); // LH, isEM
+    track->summaryValue( nsctolhits                   , xAOD::SummaryType::numberOfSCTOutliers ); // isEM
+    track->summaryValue( nsctdeadsensors              , xAOD::SummaryType::numberOfSCTDeadSensors); // isEM
+    track->summaryValue( ntrthits                     , xAOD::SummaryType::numberOfTRTHits); // isEM
+    track->summaryValue( ntrtolhits                   , xAOD::SummaryType::numberOfTRTOutliers ); // isEM
+    track->summaryValue( ntrthighthreshits            , xAOD::SummaryType::numberOfTRTHighThresholdHits ); // isEM
+    track->summaryValue( ntrthighthresolhits          , xAOD::SummaryType::numberOfTRTHighThresholdOutliers ); // isEM
+    track->summaryValue( ntrtxenonhits                , xAOD::SummaryType::numberOfTRTXenonHits ); // isEM
+    track->summaryValue( expectblayerhit              , xAOD::SummaryType::expectBLayerHit ); // LH, isEM
+    track->summaryValue( expectNextToInnerMostLayer   , xAOD::expectNextToInnermostPixelLayerHit); // LH, isEM
+    track->summaryValue( nNextToInnerMostLayerHits    , xAOD::numberOfNextToInnermostPixelLayerHits); // LH, isEM
+    track->summaryValue( nNextToInnerMostLayerOutliers, xAOD::numberOfNextToInnermostPixelLayerOutliers); // LH, isEM
+   
+    pt                 =  track->pt();
+    trk_eta            =  track->eta(); // LH
+    charge             =  track->charge(); // LH
+    qOverP             =  track->qOverP();  // LH, isEM
+    sigd0              =  get_el_sigd0(el); // LH
+    d0                 =  get_el_d0(el); // LH, isEM
+    eProbabilityHT     =  get_el_eProbabilityHT(el); // LH, isEM
+    transformed_eProbabilityHT=get_el_transformed_eProbabilityHT(el); // LH
+    d0significance     =  get_el_d0significance(el); 
+    deltaPOverP        =  get_el_DeltaPOverP(el); // LH  
+  }
+
+  auto avgmu=getAvgMu();
+
+  m_trig_EF_el_hasCalo                      ->push_back( hasCalo ); 
+  m_trig_EF_el_hasTrack                     ->push_back( hasTrack );
+
+  auto ctx  = Gaudi::Hive::currentContext();
+  m_trig_EF_calo_tight                      ->push_back((bool)(m_EFCaloElectronIsEMSelectors[0]->accept(ctx,el)));
+  m_trig_EF_calo_medium                     ->push_back((bool)(m_EFCaloElectronIsEMSelectors[1]->accept(ctx,el)));
+  m_trig_EF_calo_loose                      ->push_back((bool)(m_EFCaloElectronIsEMSelectors[2]->accept(ctx,el)));
+  m_trig_EF_calo_lhtight                    ->push_back((bool)(m_EFCaloElectronLHSelectors[0]->accept(ctx,el,avgmu)));
+  m_trig_EF_calo_lhmedium                   ->push_back((bool)(m_EFCaloElectronLHSelectors[1]->accept(ctx,el,avgmu)));
+  m_trig_EF_calo_lhloose                    ->push_back((bool)(m_EFCaloElectronLHSelectors[2]->accept(ctx,el,avgmu)));
+  m_trig_EF_calo_lhvloose                   ->push_back((bool)(m_EFCaloElectronLHSelectors[3]->accept(ctx,el,avgmu)));
+  
+  m_trig_EF_el_tight                        ->push_back((bool)(m_HLTElectronIsEMSelectors[0]->accept(ctx,el)));
+  m_trig_EF_el_medium                       ->push_back((bool)(m_HLTElectronIsEMSelectors[1]->accept(ctx,el)));
+  m_trig_EF_el_loose                        ->push_back((bool)(m_HLTElectronIsEMSelectors[2]->accept(ctx,el)));
+  m_trig_EF_el_lhtight                      ->push_back((bool)(m_HLTElectronLHSelectors[0]->accept(ctx,el,avgmu)));
+  m_trig_EF_el_lhmedium                     ->push_back((bool)(m_HLTElectronLHSelectors[1]->accept(ctx,el,avgmu)));
+  m_trig_EF_el_lhloose                      ->push_back((bool)(m_HLTElectronLHSelectors[2]->accept(ctx,el,avgmu)));
+  m_trig_EF_el_lhvloose                     ->push_back((bool)(m_HLTElectronLHSelectors[3]->accept(ctx,el,avgmu)));
+  
+  m_trig_EF_el_calo_et                      ->push_back( calo_et); 
+  m_trig_EF_el_calo_eta                     ->push_back( calo_eta ); 
+  m_trig_EF_el_calo_phi                     ->push_back( calo_phi ); 
+  m_trig_EF_el_calo_etaBE2                  ->push_back( calo_etaBE2 ); 
+  m_trig_EF_el_calo_e                       ->push_back( calo_e ); 
+  
+  m_trig_EF_el_et                           ->push_back( et );
+  m_trig_EF_el_eta                          ->push_back( eta );
+  m_trig_EF_el_phi                          ->push_back( phi );
+  m_trig_EF_el_e                            ->push_back( e );
+  m_trig_EF_el_e277                         ->push_back( e277 );
+  m_trig_EF_el_deltaE                       ->push_back( deltaE );
+  m_trig_EF_el_ethad1                       ->push_back( ethad1 );
+  m_trig_EF_el_ehad1                        ->push_back( ehad1 );
+  m_trig_EF_el_f1                           ->push_back( f1 );
+  m_trig_EF_el_f3                           ->push_back( f3 );
+  m_trig_EF_el_f1core                       ->push_back( f1core );
+  m_trig_EF_el_f3core                       ->push_back( f3core );
+  m_trig_EF_el_weta1                        ->push_back( weta1 );
+  m_trig_EF_el_weta2                        ->push_back( weta2 );
+  m_trig_EF_el_wtots1                       ->push_back( wtots1 );
+  m_trig_EF_el_fracs1                       ->push_back( fracs1 );
+  m_trig_EF_el_Reta                         ->push_back( Reta );
+  m_trig_EF_el_Rphi                         ->push_back( Rphi );
+  m_trig_EF_el_Eratio                       ->push_back( Eratio );
+  m_trig_EF_el_Rhad                         ->push_back( Rhad );
+  m_trig_EF_el_Rhad1                        ->push_back( Rhad1 );
+  m_trig_EF_el_deta2                        ->push_back( deta2 );
+  m_trig_EF_el_dphi2                        ->push_back( dphi2 );
+  m_trig_EF_el_dphiresc                     ->push_back( dphiresc );
+  m_trig_EF_el_deltaEta1                    ->push_back( deta1 );
+  m_trig_EF_el_deltaPhiRescaled2            ->push_back( deltaPhiRescaled2 );
+  
+  m_trig_EF_el_trk_pt                           ->push_back( pt );
+  m_trig_EF_el_trk_eta                          ->push_back( trk_eta );
+  m_trig_EF_el_trk_charge                       ->push_back( charge );
+  m_trig_EF_el_trk_qOverP                       ->push_back( qOverP );
+  m_trig_EF_el_trk_sigd0                        ->push_back( sigd0 );
+  m_trig_EF_el_trk_d0                           ->push_back( d0 );
+  m_trig_EF_el_trk_eProbabilityHT               ->push_back( eProbabilityHT );
+  m_trig_EF_el_trk_transformed_eProbabilityHT   ->push_back( transformed_eProbabilityHT );
+  m_trig_EF_el_trk_d0significance               ->push_back( d0significance );
+  m_trig_EF_el_trk_deltaPOverP                  ->push_back( deltaPOverP );
+    
+
+  m_trig_EF_el_trk_summaryValues->push_back( nblayerhits                     ); 
+  m_trig_EF_el_trk_summaryValues->push_back( nblayerolhits                   ); 
+  m_trig_EF_el_trk_summaryValues->push_back( npixhits                        ); 
+  m_trig_EF_el_trk_summaryValues->push_back( npixolhits                      ); 
+  m_trig_EF_el_trk_summaryValues->push_back( npixdeadsensors                 ); 
+  m_trig_EF_el_trk_summaryValues->push_back( nscthits                        ); 
+  m_trig_EF_el_trk_summaryValues->push_back( nsctolhits                      ); 
+  m_trig_EF_el_trk_summaryValues->push_back( nsctdeadsensors                 ); 
+  m_trig_EF_el_trk_summaryValues->push_back( ntrthits                        ); 
+  m_trig_EF_el_trk_summaryValues->push_back( ntrtolhits                      ); 
+  m_trig_EF_el_trk_summaryValues->push_back( ntrthighthreshits               ); 
+  m_trig_EF_el_trk_summaryValues->push_back( ntrthighthresolhits             ); 
+  m_trig_EF_el_trk_summaryValues->push_back( ntrtxenonhits                   ); 
+  m_trig_EF_el_trk_summaryValues->push_back( expectblayerhit                 ); 
+  m_trig_EF_el_trk_summaryValues->push_back( expectNextToInnerMostLayer      ); 
+  m_trig_EF_el_trk_summaryValues->push_back( nNextToInnerMostLayerHits       ); 
+  m_trig_EF_el_trk_summaryValues->push_back( nNextToInnerMostLayerOutliers   );
+
+   //Add isolations values
+  el->isolationValue(val,xAOD::Iso::etcone20);
+  m_trig_EF_el_etCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::etcone30);
+  m_trig_EF_el_etCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::etcone40);
+  m_trig_EF_el_etCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptcone20);
+  m_trig_EF_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptcone30);
+  m_trig_EF_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptcone40);
+  m_trig_EF_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptvarcone20);
+  m_trig_EF_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptvarcone30);
+  m_trig_EF_el_ptCone->push_back(val);
+  el->isolationValue(val,xAOD::Iso::ptvarcone40);
+  m_trig_EF_el_ptCone->push_back(val);
+
+
+  return true;
+}
+
+
+
+// if true: is Z or W Or not MC   if false: not electron or not Z||W mother
+bool TrigEgammaEventSelection::isTruthElectronAny(const xAOD::Egamma *eg ){
+  if(m_truthContainer){
+    const xAOD::TruthParticle *mc=nullptr;
+    MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc);
+    if(mc){
+      bool Z,W,e;
+      Z=W=e=false;
+      if(pdg == MonteCarlo::PDGID::ZMother)  Z = true;
+      if(pdg == MonteCarlo::PDGID::WMother)  W = true;
+      if(mc->isElectron()) e=true;
+      return !(e && (Z||W));
+    }
+  }
+  return true;
+}
+
+
+bool TrigEgammaEventSelection::fillMonteCarlo(const xAOD::Egamma *eg){
+
+  if(m_truthContainer){
+    const xAOD::TruthParticle *mc=nullptr;
+    MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc);
+    if(mc){
+      m_mc_hasMC        = true;
+      m_mc_pt           = mc->pt();
+      m_mc_eta          = mc->eta();
+      m_mc_phi          = mc->phi();
+      m_mc_isTop        = mc->isTop();
+      m_mc_isQuark      = mc->isQuark();
+      m_mc_isParton     = mc->isParton();
+      m_mc_isMeson      = mc->isMeson();
+      m_mc_isTau        = mc->isTau();
+      m_mc_isMuon       = mc->isMuon();
+      m_mc_isPhoton     = mc->isPhoton();
+      m_mc_isElectron   = mc->isElectron();
+      if(pdg == MonteCarlo::PDGID::ZMother)  m_mc_hasZMother   = true;
+      if(pdg == MonteCarlo::PDGID::WMother)  m_mc_hasWMother   = true;
+      return true;
+    }//has match
+  }//has truth container
+  return false;
+}
+
+
+bool TrigEgammaEventSelection::fillCaloRings( const xAOD::Electron *el ){
+  return TrigEgammaAnalysisBaseTool::getCaloRings(el, *m_el_ringsE );
+}
+
+
+//! ============================================================================================================
+
+  
+double TrigEgammaEventSelection::get_el_sigd0(const xAOD::Electron *el){
+  float vard0 = el->trackParticle()->definingParametersCovMatrix()(0,0); // Cov matrix in vector form
+  if(vard0>0.0)
+    return sqrt(vard0); // variance of d0
+  return 0.0; 
+}
+
+double TrigEgammaEventSelection::get_el_d0(const xAOD::Electron *el){
+ return el->trackParticle()->d0();
+}
+
+
+double TrigEgammaEventSelection::get_el_eProbabilityHT(const xAOD::Electron *el){
+ float TRT_PID = 0;
+ el->trackParticle()->summaryValue(TRT_PID, xAOD::eProbabilityHT);
+ return TRT_PID;
+}
+
+
+double TrigEgammaEventSelection::get_el_transformed_eProbabilityHT(const xAOD::Electron *el){
+ double TRT_PID = get_el_eProbabilityHT(el);
+ double epsilon = 1e-30;
+ if(TRT_PID >= 1.0) TRT_PID = 1.0 - 1.e-15;
+ else if(TRT_PID <= epsilon) TRT_PID = epsilon;
+ double tau = 15.0;
+ TRT_PID = -(1/tau) * log( (1.0/TRT_PID) - 1.0);
+ return TRT_PID;
+}
+
+
+double TrigEgammaEventSelection::get_el_d0significance(const xAOD::Electron *el){
+ double d0 = get_el_d0(el);
+ double sigd0 = get_el_sigd0(el);
+ return (sigd0 != 0) ? fabs(d0/sigd0) : 0;
+}
+
+double TrigEgammaEventSelection::get_el_deltaPhiRescaled2(const xAOD::Electron *el){
+ float deltaPhiRescaled2 = 0;
+ el->trackCaloMatchValue(deltaPhiRescaled2, xAOD::EgammaParameters::deltaPhiRescaled2);
+ return deltaPhiRescaled2;
+}
+
+
+double TrigEgammaEventSelection::get_el_deltaEta1(const xAOD::Electron *el){
+ float deltaEta1 = 0;
+ el->trackCaloMatchValue(deltaEta1, xAOD::EgammaParameters::deltaEta1);
+ return deltaEta1;
+}
+
+
+double TrigEgammaEventSelection::get_el_DeltaPOverP(const xAOD::Electron *el){
+ unsigned int index;
+ if(el->trackParticle()->indexOfParameterAtPosition(index,xAOD::LastMeasurement)){
+   double LMPX = el->trackParticle()->parameterPX(index);
+   double LMPY = el->trackParticle()->parameterPY(index);
+   double LMPZ = el->trackParticle()->parameterPZ(index);
+   double refittedTrack_LMP = sqrt(LMPX*LMPX + LMPY*LMPY + LMPZ*LMPZ);
+   double refittedTrack_LMqOverP = el->trackParticle()->charge() / refittedTrack_LMP;
+   double unrefittedTrack_qOverP = el->trackParticle()->qOverP();
+   return 1 - (unrefittedTrack_qOverP / refittedTrack_LMqOverP);
+ }
+ else
+   return 0.0;
+}
+
+
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx
index 0c030885532abd2bc6681761433986678cc976d7..b071f53faa5365e5105c9582e00554a7d1e85d68 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavAnalysisTool.cxx
@@ -27,13 +27,25 @@ StatusCode TrigEgammaNavAnalysisTool::childBook(){
     m_dir=plot()->getBasePath();
     std::vector<std::string> chains  = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*");
 
-    for(const auto trigName:m_trigInputList){ 
-        if (std::find(chains.begin(), chains.end(), trigName) != chains.end()) {
+    for(const auto trigName:m_trigInputList){
+        if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ 
             if(plot()->getTrigInfoMap().count(trigName) != 0)
                 ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName);
-            else 
+            else {
                 m_trigList.push_back(trigName);
+                setTrigInfo(trigName);
+            }
         }
+        // Special code to attach trigger without of the menu
+        else if(getEmulation() && m_forceTrigAttachment){// 
+          ATH_MSG_INFO("Trigger doesn't exist in menu. Attach to emulate.");
+          if(plot()->getTrigInfoMap().count(trigName) == 0){
+            m_trigList.push_back(trigName);
+            setTrigEmulation();
+            setTrigInfo(trigName);
+          }
+        }
+
     }
 
     // Container level kinematic histograms
@@ -57,8 +69,6 @@ StatusCode TrigEgammaNavAnalysisTool::childBook(){
         setLabels(plot()->hist1(m_anatype+"_trigger_counts"),m_trigList);
     }
    
-    for (const auto trigger: m_trigList)
-            setTrigInfo(trigger);
 
     plot()->setEmulation(getEmulation()); 
     if(plot()->book(getTrigInfoMap()).isFailure()) {
@@ -79,6 +89,21 @@ StatusCode TrigEgammaNavAnalysisTool::childExecute(){
         ATH_MSG_DEBUG("Fails EventWise selection");
         return StatusCode::SUCCESS; //return nicely
     }
+    // Check for Rnn container in SG
+    if(m_storeGate->contains<xAOD::TrigRNNOutputContainer>("HLT_xAOD__TrigRNNOutputContainer_TrigRingerNeuralFex")){
+        ATH_MSG_DEBUG("Rnn container in SG "); 
+        setSGContainsRnn(true);
+    }
+    if(m_storeGate->contains<xAOD::TrigPhotonContainer>("HLT_xAOD__TrigPhotonContainer_L2PhotonFex")){
+        ATH_MSG_DEBUG("TrigPhotonContainer in SG ");
+        setSGContainsTrigPhoton(true);
+    }
+    ATH_MSG_DEBUG("Rnn container in SG " << getSGContainsRnn());
+    ATH_MSG_DEBUG("TrigPhotonContainer in SG " << getSGContainsTrigPhoton());
+    for( const auto& tool : m_tools) {
+        tool->setSGContainsRnn(getSGContainsRnn());
+        tool->setSGContainsTrigPhoton(getSGContainsTrigPhoton());
+    }
 
     // Check HLTResult
     if(tdt()->ExperimentalAndExpertMethods()->isHLTTruncated()){
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx
index 8ae71d4a14294113e1e0674b4cb7019fe87ff3ea..4f313a9690957b425f89db0e7ea46592ea14c0e6 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavBaseTool.cxx
@@ -13,11 +13,10 @@
  * Description:
  *      Inherits from TrigEgammaAnalysisBaseTool.
  **********************************************************************/
-#include "egammaMVACalibAnalysis/IegammaMVATool.h"
 #include "TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h"
 #include "TrigConfxAOD/xAODConfigTool.h"
 #include "PATCore/AcceptData.h"
-
+#include "GaudiKernel/SystemOfUnits.h"
 #include "string"
 #include <algorithm>
 #include "boost/algorithm/string.hpp"
@@ -138,6 +137,7 @@ bool TrigEgammaNavBaseTool::EventWiseSelection( ){
     //Calculate number of vertex 
     TrigEgammaAnalysisBaseTool::calculatePileupPrimaryVertex();   
 
+
     return true; 
 }
 
@@ -218,10 +218,10 @@ StatusCode TrigEgammaNavBaseTool::executeElectronNavigation( std::string trigIte
 
       if(m_forcePidSelection){///default is true
         if(!ApplyElectronPid(eg,pidname)){
-	    ATH_MSG_DEBUG("Fails ElectronID "<< pidname);
-	    continue;
-	}
-	ATH_MSG_DEBUG("Passes ElectronID "<< pidname);
+	        ATH_MSG_DEBUG("Fails ElectronID "<< pidname);
+	        continue;
+	      }
+	      ATH_MSG_DEBUG("Passes ElectronID "<< pidname);
       }
 
       if (m_forceProbeIsolation) {///default is false
@@ -239,15 +239,20 @@ StatusCode TrigEgammaNavBaseTool::executeElectronNavigation( std::string trigIte
 
       xAOD::Electron *el = new xAOD::Electron(*eg);
       el->auxdecor<bool>(decor)=static_cast<bool>(true);
-      
 
-      if (match()->match(el, trigItem, te)){
-         std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,te);
-         m_objTEList.push_back(pair);
-      }
-      else {
-          std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,nullptr);
-          m_objTEList.push_back(pair);
+      bool isEmulation = getTrigInfo(trigItem).trigIsEmulation;
+      if(isEmulation && getEmulation()){
+        emulation()->match(el,te);
+        std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,te);
+        m_objTEList.push_back(pair);
+      }else{
+        if (match()->match(el, trigItem, te)){
+           std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,te);
+           m_objTEList.push_back(pair);
+        }else {
+            std::pair< const xAOD::Electron*, const HLT::TriggerElement* > pair(el,nullptr);
+            m_objTEList.push_back(pair);
+        }
       }
 
   }
@@ -269,7 +274,7 @@ StatusCode TrigEgammaNavBaseTool::executePhotonNavigation( std::string trigItem,
           ATH_MSG_DEBUG("No caloCluster");
           continue;
       } 
-      if( !(getCluster_et(eg) > (etthr-5.)*1.e3)) continue; //Take 2GeV above threshold
+      if( !(getCluster_et(eg) > (etthr-5.)*Gaudi::Units::GeV)) continue; //Take 2GeV above threshold
       if(!eg->passSelection(m_photonPid)) continue;
       if(m_doUnconverted){
           if (eg->vertex()){
@@ -279,13 +284,19 @@ StatusCode TrigEgammaNavBaseTool::executePhotonNavigation( std::string trigItem,
       }
       xAOD::Photon *ph = new xAOD::Photon(*eg);
       ph->auxdecor<bool>(decor)=static_cast<bool>(true);
-      if ( match()->match(ph, trigItem, te)){
-          std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,te);
-          m_objTEList.push_back(pair);
-      }
-      else {
-          std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,nullptr);
-          m_objTEList.push_back(pair);
+      bool isEmulation = getTrigInfo(trigItem).trigIsEmulation;
+      if(isEmulation && getEmulation()){
+        emulation()->match(ph,te);
+        std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,te);
+        m_objTEList.push_back(pair);
+      }else{
+        if (match()->match(ph, trigItem, te)){
+           std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,te);
+           m_objTEList.push_back(pair);
+        }else {
+            std::pair< const xAOD::Photon*, const HLT::TriggerElement* > pair(ph,nullptr);
+            m_objTEList.push_back(pair);
+        }
       }
 
   }
@@ -295,6 +306,9 @@ StatusCode TrigEgammaNavBaseTool::executePhotonNavigation( std::string trigItem,
 }
 
 void TrigEgammaNavBaseTool::clearList(){
+    for( auto paitIt : m_objTEList )
+      delete paitIt.first;
+
     m_objTEList.clear();
 }
 
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavNtuple.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavNtuple.cxx
deleted file mode 100755
index a15b46ae14857468d84e882fb5460bfc613c8087..0000000000000000000000000000000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavNtuple.cxx
+++ /dev/null
@@ -1,1138 +0,0 @@
-/*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-*/
-
-
-#include "TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h"
-using namespace std;
-
-TrigEgammaNavNtuple::TrigEgammaNavNtuple( const std::string& myname ): TrigEgammaNavBaseTool(myname) 
-{
-  declareProperty("Analysis",               m_anatype="NavNtuple"             );
-  declareProperty("doOfflineDump",          m_doOfflineDump=false             ); 
-  declareProperty("DoSupportTrigger",       m_doSupport=true                  );
-  declareProperty("ForceMCMatch",           m_forceMCMatch=true               );
-  declareProperty("OfflineMinEtThreshold",  m_minEt=-1                        );
-
-  ///Set base tool configuration
-  m_forcePidSelection=false;
-  
-  m_el_ringsE=nullptr;
-  m_trig_L1_thrNames=nullptr;          
-  m_trig_L2_calo_energySample=nullptr;
-  m_trig_L2_calo_rings=nullptr;
-  m_trig_L2_el_trackAlgID=nullptr;
-  m_trig_L2_el_pt=nullptr;
-  m_trig_L2_el_eta=nullptr;
-  m_trig_L2_el_caloEta=nullptr;
-  m_trig_L2_el_phi=nullptr;
-  m_trig_L2_el_charge=nullptr;
-  m_trig_L2_el_nTRTHits=nullptr;
-  m_trig_L2_el_nTRTHiThresholdHits=nullptr;
-  m_trig_L2_el_etOverPt=nullptr;
-  m_trig_L2_el_trkClusDeta=nullptr;
-  m_trig_L2_el_trkClusDphi=nullptr;
-  m_trig_EF_calo_et=nullptr;
-  m_trig_EF_calo_eta=nullptr;
-
-}
-
-
-StatusCode TrigEgammaNavNtuple::childInitialize(){
-
-  return StatusCode::SUCCESS;
-}
-
-StatusCode TrigEgammaNavNtuple::childBook(){
-
-  ATH_MSG_DEBUG("Now configuring chains for analysis");
-  //Set the base directory from the plot()
-  m_dir=plot()->getBasePath();
-  std::vector<std::string> chains  = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*");
-
-  TrigEgammaAnalysisBaseTool::write_trigger_list(chains);
-  
-  for(const auto trigName:m_trigInputList){ 
-    if (std::find(chains.begin(), chains.end(), trigName) != chains.end()) {
-      if(plot()->getTrigInfoMap().count(trigName) != 0)
-          ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName);
-      else 
-          m_trigList.push_back(trigName);
-    }
-  }
-
-
-  // Container level kinematic histograms
-  ATH_MSG_DEBUG("cd in: " << m_dir <<"/Expert/Event");
-  addDirectory(m_dir+"/Expert/Event");
-  const int nTrigger = (int) m_trigList.size();
-   
-  std::string histname=m_anatype+"_electrons";
-  addHistogram(new TH1F(histname.c_str(), "Offline Electrons; ; N_{electrons}", 6, 1., 6));  
-  std::vector<std::string> el_labels;
-  el_labels.push_back("loose");
-  el_labels.push_back("medium");
-  el_labels.push_back("tight");
-  el_labels.push_back("lhloose");
-  el_labels.push_back("lhmedium");
-  el_labels.push_back("lhtight");
-  setLabels(hist1(histname),el_labels); 
-
-  histname=m_anatype+"_trigger_counts";
-  if(nTrigger>0) {
-    addHistogram(new TH1F(histname.c_str(), "Trigger Counts; Trigger ; Count", nTrigger, 1, nTrigger));
-    setLabels(plot()->hist1(m_anatype+"_trigger_counts"),m_trigList);
-  }
-
-  ///Only offline egamma ntuple
-  if(m_doOfflineDump){
-    ATH_MSG_DEBUG("Now configuting only the egamma analysis");
-    addDirectory(m_dir+"/Expert/Offline");
-    TTree *t_el = new TTree("electron", "tree of egamma and monte carlo information");
-    TTree *t_ph = new TTree("photons", "tree of egamma and monte carlo information");
-    bookEventBranches( t_ph );
-    //bookPhotonBranches( t_ph );
-    bookMonteCarloBranches( t_ph );
-    bookEventBranches( t_el );
-    bookElectronBranches( t_el );
-    bookMonteCarloBranches( t_el );
-    addTree( t_el, m_dir+"/Expert/Offline" );
-    addTree( t_ph, m_dir+"/Expert/Offline" );
-  }else if(m_doSupport){// all support trigger in one
-    addDirectory(m_dir+"/Expert/support");
-    TTree *t = new TTree( "trigger", "support trigger");
-    bookEventBranches( t );
-    bookElectronBranches( t );
-    //bookPhotonBranches( t );
-    bookTriggerBranches( t );
-    bookMonteCarloBranches( t );
-    for(auto& trigItem : m_trigList)
-      setTrigInfo(trigItem);
-    addTree(t, m_dir+"/Expert/support");
-  }else{// each trigger
-    for (int i = 0; i < (int) m_trigList.size(); i++) {      
-        std::string trigItem = m_trigList[i];
-        addDirectory(m_dir+"/Expert/"+trigItem);
-
-        TTree *t = new TTree( "trigger", "tree of trigger, egamma and monte carlo information");
-        bookEventBranches( t );
-        bookElectronBranches( t );
-        //bookPhotonBranches( t );
-        bookTriggerBranches( t );
-        bookMonteCarloBranches( t );
-        ATH_MSG_DEBUG("Already to attach the tree: " << trigItem);
-        setTrigInfo(trigItem);
-        addTree(t, m_dir+"/Expert/"+trigItem);
-    }
-  }
-  
-  // alloc memory to vector branchs
-  alloc_space();
-
-  return StatusCode::SUCCESS;
-}
-
-StatusCode TrigEgammaNavNtuple::childExecute(){
-
-  m_eventCounter++;
-
-  m_dir=plot()->getBasePath();
-  
-  cd(m_dir+"/Expert/Event");
-  if( !EventWiseSelection() ) {
-    ATH_MSG_DEBUG("Unable to retrieve offline containers");
-    return StatusCode::FAILURE;
-  }
-
-  cd(m_dir+"/Expert");
-
-
-  /// Egamma ntuple mode
-  if(m_doOfflineDump){
-    cd(m_dir+"/Expert/Offline");
-    if(!executeElectronDump())  return StatusCode::FAILURE;
-    if(!executePhotonDump())    return StatusCode::FAILURE;
-  }else if(m_doSupport){
-    if(!executeTrigSupportDump())  return StatusCode::FAILURE;
-  }else{
-    if(!executeTrigItemDump())  return StatusCode::FAILURE;
-  }
-
-  return StatusCode::SUCCESS;
-}
-
-
-StatusCode TrigEgammaNavNtuple::childFinalize(){
-  //release_space();
-  return StatusCode::SUCCESS;
-}
-
-
-bool TrigEgammaNavNtuple::executeElectronDump(){
-    
-  ATH_MSG_DEBUG("TrigEgammaNavNtuple::executeEgammaDump()");
-  
-  const xAOD::ElectronContainer* offElectrons = 0;
-  if ( (m_storeGate->retrieve(offElectrons,m_offElContKey)).isFailure() ){
-    ATH_MSG_ERROR("Failed to retrieve offline Electrons ");
-    return false;
-  }
-
-  TTree *t = tree( "electron" , m_dir+"/Expert/Offline" );
-  if(!t){
-    ATH_MSG_ERROR("Can no get the ttree pointer into the store.");
-    return false;
-  }
-  
-  linkEventBranches(t); 
-  linkElectronBranches(t);
-  linkMonteCarloBranches(t);
-   
-  for (const auto &eg : *offElectrons){
-    clear();  
-    if(!eg->trackParticle()){
-        ATH_MSG_DEBUG("No track Particle");
-        continue;
-    }
-    if(!eg->caloCluster()){
-        ATH_MSG_DEBUG("No caloCluster");
-        continue;
-    }
-
-    if(m_rmCrack){///default is true
-      if ( (fabs(eg->eta())>1.37 && fabs(eg->eta())<1.52) || fabs(eg->eta())>2.47 )  continue; 
-    }
-
-    if (m_forceProbeIsolation) {///default is false
-      if (!isIsolated(eg, "Loose"))  continue;///default is Loose
-    }
-    
-    if(m_forceMCEnhancedBias){///default is false
-      const xAOD::TruthParticle *mc=nullptr;
-      if( pdgid(eg,m_truthContainer,mc) != MonteCarlo::PDGID::EnhancedBias)  continue;
-    }
-
-    const xAOD::Electron* el =static_cast<const xAOD::Electron*> (el);
-      
-    fillEvent();
-    fillElectron( eg );
-    
-    if(!fillMonteCarlo( eg ) ){
-      ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron");
-    }
-
-    ATH_MSG_DEBUG("Record information into the ttree.");
-    t->Fill();// save information
-  }
-
-  return true;
-}
-
-bool TrigEgammaNavNtuple::executePhotonDump(){
-  return true;
-}
-
-
-bool TrigEgammaNavNtuple::executeTrigItemDump(){
-
-
-  for(unsigned int ilist = 0; ilist != m_trigList.size(); ilist++) {
-
-    std::string trigItem = m_trigList.at(ilist);
-    const TrigInfo info = getTrigInfo(trigItem);
-    if ( executeNavigation(info).isFailure() ){
-      ATH_MSG_DEBUG("executeNavigation failure! continue...");
-      return false;
-    }
-
-    TTree *t = tree( "trigger", m_dir+"/Expert/"+trigItem);
-    linkEventBranches(t); 
-    linkElectronBranches(t);
-    //linkPhotonBranches(t);
-    linkTriggerBranches(t);
-    linkMonteCarloBranches(t);
-    ATH_MSG_DEBUG("ObjTEList size is: " << m_objTEList.size());
-    for(unsigned int i = 0; i != m_objTEList.size(); ++i){
-
-      const xAOD::Electron* el =static_cast<const xAOD::Electron*> (m_objTEList[i].first);
-      //const xAOD::Photon*   ph =static_cast<const xAOD::Photon*>   (m_objTEList[i].first);
-      const HLT::TriggerElement *feat = m_objTEList[i].second;
-      if(feat == nullptr){
-        ATH_MSG_WARNING("TriggerElement is nullptr");
-        continue;
-      } 
-      
-      clear();
-      fillEvent();
-      fillElectron( el );
-      //fillPhoton( ph );
-
-      if(!fillMonteCarlo( el ) ){
-        ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron");
-      }
-        
-      ///Start trigger analisys...
-      const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat);
-      if(emTauRoI){
-        fillEmTauRoI( emTauRoI ); 
-      }else{ 
-        ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement..");
-      }
-
-      const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat);
-      if(emCluster){
-
-        if(!fillTrigEMCluster( emCluster )){
-          ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree.");
-        }
-        
-        //const xAOD::TrigRNNOutput *rnnOutput=getFeature<xAOD::TrigRNNOutput>(feat);
-        //if(rnnOutput)  m_trig_L2_calo_rnnOutput = rnnOutput->rnnDecision().at(0);
-
-        //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){
-        if(!fillTrigCaloRings( emCluster )){
-          ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree.");
-        }
-
-      }///cluster protection
-
- 
-      const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat);
-      // Level 2 ID+Calo
-      if(trigElCont){
-        for(const auto& trigEl : *trigElCont){
-          if(!fillTrigElectron(trigEl)) {
-            ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree.");
-          }    
-        }// loop over all trigElectrons for this feat
-      }
-
-      const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat);
-      if(caloCont){
-        for(const auto& cl : *caloCont){
-          if(!fillCaloCluster(cl)){
-            ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree.");
-          }
-        }// loop over calo cluster
-      }
-
-      asg::AcceptData acceptData = setAccept(feat,info);
-      m_trig_L1_accept       = acceptData.getCutResult("L1Calo"); 
-      m_trig_L2_calo_accept  = acceptData.getCutResult("L2Calo"); 
-      m_trig_L2_el_accept    = acceptData.getCutResult("L2"); 
-      m_trig_EF_calo_accept  = acceptData.getCutResult("EFCalo");  
-      m_trig_EF_el_accept    = acceptData.getCutResult("HLT");  
-      
-      ATH_MSG_DEBUG("L1Calo: "  << int(m_trig_L1_accept)); 
-      ATH_MSG_DEBUG("L2Calo: "  << int(m_trig_L2_calo_accept));
-      ATH_MSG_DEBUG("L2    : "  << int(m_trig_L2_el_accept));
-      ATH_MSG_DEBUG("EFCalo: "  << int(m_trig_EF_calo_accept));
-      ATH_MSG_DEBUG("HLT   : "  << int(m_trig_EF_el_accept));          
-
-      ATH_MSG_DEBUG("Record information into the ttree.");
-      t->Fill();// save information
-    }// loop
-  } // End loop over trigger
-  return true;
-}
-
-
-bool TrigEgammaNavNtuple::executeTrigSupportDump(){
-  
-  double GeV=1000.;
-  // Just do this to retrieve all offline electrons, dummy trigItem!
-  const TrigInfo info = getTrigInfo(m_trigList[0]);
-  if ( executeNavigation(info).isFailure() ){
-    ATH_MSG_DEBUG("executeNavigation failure! continue...");
-    return false;
-  }//executeNavigation to collect electron
-
-  std::vector<const HLT::TriggerElement *> vec_feat;
-
-
-  cd(m_dir+"/Expert/support");
-  TTree *t = tree( "trigger", m_dir+"/Expert/support");
-  linkEventBranches(t); 
-  linkElectronBranches(t); 
-  linkTriggerBranches(t); 
-  linkMonteCarloBranches(t); 
-
-  // Loop over all good offline objects
-  for(const auto& eg : m_objTEList){
-
-    // Get the good electron
-    const xAOD::Electron* el =static_cast<const xAOD::Electron*> (eg.first);
-    // Force Et cut 
-    if(m_minEt > 0.0){
-      if( !( getEt(el)  > (m_minEt)*GeV) ) continue;
-    }
-    // Clear the vector
-    vec_feat.clear();
-    // Loop over support triggers
-    for(auto& trigItem : m_trigList){
-      const HLT::TriggerElement *feat;
-      // Trigger match using Matching tool
-      match()->match(el, trigItem, feat);
-      if(feat){// If has a match!
-        for(unsigned i=0; i < vec_feat.size(); ++i){
-          if(getFeature<xAOD::EmTauRoI>(vec_feat[i])->roiWord() == getFeature<xAOD::EmTauRoI>(feat)->roiWord()){
-            if(count_HLT_objects(feat) > count_HLT_objects(vec_feat[i])){
-              vec_feat.erase(vec_feat.begin() + i); // Erase the trigger element lowest than the new feature
-              vec_feat.push_back(feat); // attach the new trigger element
-              break;
-            }
-          }// The same region in L1Calo trigger
-        }
-        if(vec_feat.empty())  vec_feat.push_back(feat);
-      }
-    }// Loop over support trigger
-
-    ATH_MSG_DEBUG("Attach " << vec_feat.size() << " features ");
-    for(auto& feat : vec_feat){
-      
-      clear();
-      fillEvent();
-      fillElectron( el );  
-
-      if(!fillMonteCarlo( el ) ){
-        ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron");
-        if(m_forceMCMatch)  continue;
-      }
- 
-      ///Start trigger analisys...
-      const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat);
-      if(emTauRoI){
-        fillEmTauRoI( emTauRoI ); 
-      }else{ 
-        ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement..");
-      }
-    
-      const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat);
-      if(emCluster){
-        //ATH_MSG_INFO("AKI: Et = " << emCluster->et()*1e-3); 
-        //if(emCluster->et()*1e-3 < 20){
-        //  continue;
-        //}
-        if(!fillTrigEMCluster( emCluster )){
-          ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree.");
-        }
-    
-        //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){
-        if(!fillTrigCaloRings( emCluster )){
-          ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree.");
-        }
-      }///cluster protection
-    
-    
-      const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat);
-      // Level 2 ID+Calo
-      if(trigElCont){
-        for(const auto& trigEl : *trigElCont){
-          if(!fillTrigElectron(trigEl)) {
-            ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree.");
-          }    
-        }// loop over all trigElectrons for this feat
-      }
-       
-      const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat);
-      if(caloCont){
-        for(const auto& cl : *caloCont){
-          if(!fillCaloCluster(cl)){
-            ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree.");
-          }
-        }// loop over calo cluster
-      }
-
-      ATH_MSG_DEBUG("record trigger information into the file.");
-      t->Fill();
-    }//loop over trigger objects
-
-  }// Loop over electrons
-  return true;
-}
-
-
-
-
-
-
-
-bool TrigEgammaNavNtuple::fillEmTauRoI( const xAOD::EmTauRoI *emTauRoI ){
-  
-  m_trig_L1_eta     = emTauRoI->eta();
-  m_trig_L1_phi     = emTauRoI->phi();
-  m_trig_L1_emClus  = emTauRoI->emClus();
-  m_trig_L1_tauClus = emTauRoI->tauClus();
-  m_trig_L1_emIsol  = emTauRoI->emIsol();
-  m_trig_L1_hadIsol = emTauRoI->hadIsol();
-  for(unsigned i=0; i < emTauRoI->thrNames().size();++i)  m_trig_L1_thrNames->push_back(emTauRoI->thrNames().at(i));
-  return true;
-} 
-
-bool TrigEgammaNavNtuple::fillCaloCluster( const xAOD::CaloCluster *cluster){
-
-  m_trig_EF_calo_et->push_back(cluster->et());
-  m_trig_EF_calo_eta->push_back(cluster->eta());
-  return true;
-}
-
-bool TrigEgammaNavNtuple::fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ){
-  
-  m_trig_L2_calo_et         = emCluster->et();
-  m_trig_L2_calo_eta        = emCluster->eta();
-  m_trig_L2_calo_phi        = emCluster->phi();
-  m_trig_L2_calo_e237       = emCluster->e237();
-  m_trig_L2_calo_e277       = emCluster->e277();
-  m_trig_L2_calo_fracs1     = emCluster->fracs1();
-  m_trig_L2_calo_weta2      = emCluster->weta2();
-  m_trig_L2_calo_ehad1      = emCluster->ehad1();
-  m_trig_L2_calo_emaxs1     = emCluster->emaxs1();
-  m_trig_L2_calo_e2tsts1    = emCluster->e2tsts1();
-  m_trig_L2_calo_wstot      = emCluster->wstot();
-  for(unsigned i=0; i<emCluster->energySample().size(); ++i){
-    m_trig_L2_calo_energySample->push_back( emCluster->energySample().at(i));
-  }
-
-  return true;
-}
-
-
-bool TrigEgammaNavNtuple::fillTrigElectron( const xAOD::TrigElectron *trigEl ){
-
-   const xAOD::TrackParticle* trkIter = trigEl->trackParticle();
-   if (trkIter==nullptr) return false; // disconsider candidates without track
-   int algoId = 0;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::FastTrackFinderSeed] ) algoId=9;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyA] )           algoId=5;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyB] )           algoId=6;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyC] )           algoId=7;
-
-   m_trig_L2_el_trackAlgID  ->push_back(algoId);
-   m_trig_L2_el_caloEta     ->push_back(trigEl->caloEta()); 
-   m_trig_L2_el_trkClusDphi ->push_back(trigEl->trkClusDphi());  
-   m_trig_L2_el_trkClusDeta ->push_back(trigEl->trkClusDeta());  
-   m_trig_L2_el_pt          ->push_back(trigEl->pt());
-   m_trig_L2_el_phi         ->push_back(trigEl->phi());  
-   m_trig_L2_el_eta         ->push_back(trigEl->eta());  
-   m_trig_L2_el_etOverPt    ->push_back(trigEl->etOverPt());          
-   m_trig_L2_el_nTRTHits    ->push_back(trigEl->nTRTHits());        
-   m_trig_L2_el_nTRTHiThresholdHits->push_back(trigEl->nTRTHiThresholdHits());
-   m_trig_L2_el_charge      ->push_back(trigEl->charge());      
-   return true;
-}
-
-
-
-bool TrigEgammaNavNtuple::fillEvent(){
-  ///Event information
-  m_runNumber               = m_eventInfo->runNumber();
-  m_eventNumber             = m_eventInfo->eventNumber();
-  m_avgmu=getAvgMu();
-  return true;
-}
-
-bool TrigEgammaNavNtuple::fillElectron( const xAOD::Electron *el ){
-
-  ///Cluster information
-  m_el_et                   = el->pt();
-  m_el_eta                  = el->eta();
-  m_el_phi                  = el->phi();
-  el->showerShapeValue( m_el_ethad1   , xAOD::EgammaParameters::ShowerShapeType::ethad1   ); 
-  el->showerShapeValue( m_el_ehad1    , xAOD::EgammaParameters::ShowerShapeType::ehad1    );
-  el->showerShapeValue( m_el_f1       , xAOD::EgammaParameters::ShowerShapeType::f1       );
-  el->showerShapeValue( m_el_f3       , xAOD::EgammaParameters::ShowerShapeType::f3       );
-  el->showerShapeValue( m_el_f1core   , xAOD::EgammaParameters::ShowerShapeType::f1core   );
-  el->showerShapeValue( m_el_f3core   , xAOD::EgammaParameters::ShowerShapeType::f3core   );
-  el->showerShapeValue( m_el_weta2    , xAOD::EgammaParameters::ShowerShapeType::weta2    );
-  el->showerShapeValue( m_el_wtots1   , xAOD::EgammaParameters::ShowerShapeType::wtots1  );
-  el->showerShapeValue( m_el_fracs1   , xAOD::EgammaParameters::ShowerShapeType::fracs1   );
-  el->showerShapeValue( m_el_Reta     , xAOD::EgammaParameters::ShowerShapeType::Reta     );
-  el->showerShapeValue( m_el_Rphi     , xAOD::EgammaParameters::ShowerShapeType::Rphi     );
-  el->showerShapeValue( m_el_Eratio   , xAOD::EgammaParameters::ShowerShapeType::Eratio   );
-  el->showerShapeValue( m_el_Rhad     , xAOD::EgammaParameters::ShowerShapeType::Rhad     );
-  el->showerShapeValue( m_el_Rhad1    , xAOD::EgammaParameters::ShowerShapeType::Rhad1    );
-
-  ///Combined track/Cluter information
-  el->trackCaloMatchValue( m_el_deta1     , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta1   );
-  el->trackCaloMatchValue( m_el_deta2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2   );
-  el->trackCaloMatchValue( m_el_dphi2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2   );
-  el->trackCaloMatchValue( m_el_dphiresc  , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0 );
-  el->trackCaloMatchValue( m_el_dphiresc2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled2 );
-
-
-  ///Track particle information
-  const xAOD::TrackParticle *track = el->trackParticle();
-  if(track){
-    m_el_pt                   = track->pt();
-    m_el_d0                   = fabsf(track->d0());
-    m_el_charge               = el->charge();
-    
-    track->summaryValue( m_el_eprobht            , xAOD::SummaryType::eProbabilityHT );
-    track->summaryValue( m_el_nblayerhits        , xAOD::SummaryType::numberOfInnermostPixelLayerHits );
-    track->summaryValue( m_el_nblayerolhits      , xAOD::SummaryType::numberOfInnermostPixelLayerOutliers );
-    track->summaryValue( m_el_npixhits           , xAOD::SummaryType::numberOfPixelHits );
-    track->summaryValue( m_el_npixolhits         , xAOD::SummaryType::numberOfPixelOutliers );
-    track->summaryValue( m_el_nscthits           , xAOD::SummaryType::numberOfSCTHits );
-    track->summaryValue( m_el_nsctolhits         , xAOD::SummaryType::numberOfSCTOutliers );
-    track->summaryValue( m_el_ntrthightreshits   , xAOD::SummaryType::numberOfTRTHighThresholdHits );
-    track->summaryValue( m_el_ntrthits           , xAOD::SummaryType::numberOfTRTHits);
-    track->summaryValue( m_el_ntrthighthresolhits, xAOD::SummaryType::numberOfTRTHighThresholdOutliers );
-    track->summaryValue( m_el_ntrtolhits         , xAOD::SummaryType::numberOfTRTOutliers );
-    track->summaryValue( m_el_ntrtxenonhits      , xAOD::SummaryType::numberOfTRTXenonHits );
-    //track->summaryValue( m_el_expectblayerhit    , xAOD::SummaryType::expectInnermostPixelLayerHit );
-    track->summaryValue( m_el_npixdeadsensors    , xAOD::SummaryType::numberOfPixelDeadSensors);
-    track->summaryValue( m_el_nsctdeadsensors    , xAOD::SummaryType::numberOfSCTDeadSensors);
-
-    m_el_nsideadsensors       = m_el_npixdeadsensors  + m_el_nsctdeadsensors;
-    m_el_nsihits              = m_el_npixhits         + m_el_nscthits;
-  }
-
-  //m_el_loose              = el->passSelection("Loose");
-  //m_el_medium             = el->passSelection("Medium");
-  //m_el_tight              = el->passSelection("Tight");
-  //m_el_lhLoose            = el->passSelection("LHLoose");
-  //m_el_lhMedium           = el->passSelection("LHMedium");
-  //m_el_lhTight            = el->passSelection("LHTight"); 
-  //m_el_rgLoose            = el->passSelection("RGLoose");
-  //m_el_rgMedium           = el->passSelection("RGMedium");
-  //m_el_rgTight            = el->passSelection("RGTight");
-  //m_el_multiLepton        = el->passSelection("MultiLepton");
-  m_el_loose                = ApplyElectronPid(el, "Loose");
-  m_el_medium               = ApplyElectronPid(el, "Medium");
-  m_el_tight                = ApplyElectronPid(el, "Tight");
-  m_el_lhLoose              = ApplyElectronPid(el, "LHLoose");
-  m_el_lhMedium             = ApplyElectronPid(el, "LHMedium");
-  m_el_lhTight              = ApplyElectronPid(el, "LHTight"); 
-  //m_el_rgLoose            = ApplyElectronPid(el, "RGLoose");
-  //m_el_rgMedium           = ApplyElectronPid(el, "RGMedium");
-  //m_el_rgTight            = ApplyElectronPid(el, "RGTight");
-  
-  m_calo_et                 = getCluster_et( el );
-  m_calo_eta                = getCluster_eta( el );
-  m_calo_phi                = getCluster_phi( el );
-  ///Extra information about pileup
-  m_el_nGoodVtx             = getNGoodVertex();
-  m_el_nPileupPrimaryVtx    = getNPVtx();
-
-
-  if(!fillCaloRings( el )){
-    ATH_MSG_WARNING("Could not attach the calorRings information.");
-  }
-
-  return true;
-}
-
-
-/*bool TrigEgammaNavNtuple::fillPhoton( const xAOD::Photon *ph ){
-  return true;
-}*/
-
-bool TrigEgammaNavNtuple::fillMonteCarlo(const xAOD::Egamma *eg){
-
-  if(m_truthContainer){
-    ATH_MSG_DEBUG("TruthParticle container size is: " << m_truthContainer->size());
-    const xAOD::TruthParticle *mc=nullptr;
-    MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc);
-    if(mc){
-      m_mc_hasMC        = true;
-      m_mc_pt           = mc->pt();
-      m_mc_eta          = mc->eta();
-      m_mc_phi          = mc->phi();
-      m_mc_isTop        = mc->isTop();
-      m_mc_isQuark      = mc->isQuark();
-      m_mc_isParton     = mc->isParton();
-      m_mc_isMeson      = mc->isMeson();
-      m_mc_isTau        = mc->isTau();
-      m_mc_isMuon       = mc->isMuon();
-      m_mc_isPhoton     = mc->isPhoton();
-      m_mc_isElectron   = mc->isElectron();
-      if(pdg == MonteCarlo::PDGID::ZMother)  m_mc_hasZMother   = true;
-      if(pdg == MonteCarlo::PDGID::WMother)  m_mc_hasWMother   = true;
-      return true;
-    }//has match
-  }//has truth container
-  return false;
-}
-
-
-bool TrigEgammaNavNtuple::fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster ){
-  return TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, *m_trig_L2_calo_rings);
-}
-
-
-bool TrigEgammaNavNtuple::fillCaloRings( const xAOD::Electron *el ){
-  return TrigEgammaAnalysisBaseTool::getCaloRings(el, *m_el_ringsE );
-}
-
-/*
- * book, link, clear, alloc and release method divide in:
- * trigger, Egamma and MonteCarlo data base.
- */
-
-template <class T> 
-void TrigEgammaNavNtuple::InitBranch(TTree* fChain, std::string branch_name, T* param, bool message){
-
-  std::string bname = branch_name;
-  if (fChain->GetAlias(bname.c_str()))
-     bname = std::string(fChain->GetAlias(bname.c_str()));
-
-  if (!fChain->FindBranch(bname.c_str()) && message) {
-    ATH_MSG_WARNING("unknown branch " << bname);
-    return;  
-  }
-  fChain->SetBranchStatus(bname.c_str(), 1.);
-  fChain->SetBranchAddress(bname.c_str(), param);
-}
-
-void TrigEgammaNavNtuple::bookEventBranches(TTree *t){
-  
-  t->Branch("RunNumber",        &m_runNumber);
-  t->Branch("EventNumber",      &m_eventNumber);
-  t->Branch("avgmu",            &m_avgmu);
-}
-
-void TrigEgammaNavNtuple::bookTriggerBranches(TTree *t){
-
-  // Level L1 cluster
-  t->Branch( "trig_L1_eta",             &m_trig_L1_eta);
-  t->Branch( "trig_L1_phi",             &m_trig_L1_phi);
-  t->Branch( "trig_L1_emClus",          &m_trig_L1_emClus);
-  t->Branch( "trig_L1_tauClus",         &m_trig_L1_tauClus);
-  t->Branch( "trig_L1_emIsol",          &m_trig_L1_emIsol);
-  t->Branch( "trig_L1_hadIsol",         &m_trig_L1_hadIsol);
-  t->Branch( "trig_L1_thrNames",        &m_trig_L1_thrNames);
-  t->Branch( "trig_L1_accept",          &m_trig_L1_accept);
-  t->Branch( "trig_L2_calo_et",         &m_trig_L2_calo_et);
-  t->Branch( "trig_L2_calo_eta",        &m_trig_L2_calo_eta);
-  t->Branch( "trig_L2_calo_phi",        &m_trig_L2_calo_phi);
-  t->Branch( "trig_L2_calo_e237",       &m_trig_L2_calo_e237 );
-  t->Branch( "trig_L2_calo_e277",       &m_trig_L2_calo_e277 );
-  t->Branch( "trig_L2_calo_fracs1",     &m_trig_L2_calo_fracs1);
-  t->Branch( "trig_L2_calo_weta2",      &m_trig_L2_calo_weta2);
-  t->Branch( "trig_L2_calo_ehad1",      &m_trig_L2_calo_ehad1);
-  t->Branch( "trig_L2_calo_emaxs1",     &m_trig_L2_calo_emaxs1);
-  t->Branch( "trig_L2_calo_e2tsts1",    &m_trig_L2_calo_e2tsts1);
-  t->Branch( "trig_L2_calo_wstot",      &m_trig_L2_calo_wstot);
-  t->Branch( "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); 
-  t->Branch( "trig_L2_calo_rings",      &m_trig_L2_calo_rings ); 
-  t->Branch( "trig_L2_calo_rnnOutput",  &m_trig_L2_calo_rnnOutput ); 
-  t->Branch( "trig_L2_calo_accept",     &m_trig_L2_calo_accept);
-  t->Branch( "trig_L2_el_trackAlgID" ,         &m_trig_L2_el_trackAlgID );
-  t->Branch( "trig_L2_el_pt" ,                 &m_trig_L2_el_pt );
-  t->Branch( "trig_L2_el_eta",                 &m_trig_L2_el_eta);
-  t->Branch( "trig_L2_el_phi",                 &m_trig_L2_el_phi );
-  t->Branch( "trig_L2_el_caloEta",             &m_trig_L2_el_caloEta );
-  t->Branch( "trig_L2_el_charge",              &m_trig_L2_el_charge);
-  t->Branch( "trig_L2_el_nTRTHits",            &m_trig_L2_el_nTRTHits);
-  t->Branch( "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits);
-  t->Branch( "trig_L2_el_etOverPt" ,           &m_trig_L2_el_etOverPt );
-  t->Branch( "trig_L2_el_trkClusDeta" ,        &m_trig_L2_el_trkClusDeta );
-  t->Branch( "trig_L2_el_trkClusDphi" ,        &m_trig_L2_el_trkClusDphi );
-  t->Branch( "trig_L2_el_accept",       &m_trig_L2_el_accept );
-  t->Branch( "trig_EF_calo_accept",     &m_trig_EF_calo_accept);
-  t->Branch( "trig_EF_calo_et",         &m_trig_EF_calo_et);
-  t->Branch( "trig_EF_calo_eta",        &m_trig_EF_calo_eta);
-  t->Branch( "trig_EF_el_accept",       &m_trig_EF_el_accept);
-}
-
-void TrigEgammaNavNtuple::bookElectronBranches(TTree *t){
- 
-  t->Branch("el_et",                    &m_el_et);
-  t->Branch("el_pt",                    &m_el_pt);
-  t->Branch("el_eta",                   &m_el_eta);
-  t->Branch("el_phi",                   &m_el_phi);
-  t->Branch("el_ethad1",                &m_el_ethad1);
-  t->Branch("el_ehad1",                 &m_el_ehad1);
-  t->Branch("el_f1",                    &m_el_f1);
-  t->Branch("el_f3",                    &m_el_f3);
-  t->Branch("el_f1core",                &m_el_f1core);
-  t->Branch("el_f3core",                &m_el_f3core);
-  t->Branch("el_weta2",                 &m_el_weta2);
-  t->Branch("el_d0",                    &m_el_d0);
-  t->Branch("el_wtots1",                &m_el_wtots1);
-  t->Branch("el_fracs1",                &m_el_fracs1);
-  t->Branch("el_Reta",                  &m_el_Reta);
-  t->Branch("el_Rphi",                  &m_el_Rphi);
-  t->Branch("el_Eratio",                &m_el_Eratio);
-  t->Branch("el_Rhad",                  &m_el_Rhad);
-  t->Branch("el_Rhad1",                 &m_el_Rhad1);
-  t->Branch("el_deta1",                 &m_el_deta1);
-  t->Branch("el_deta2",                 &m_el_deta2);
-  t->Branch("el_dphi2",                 &m_el_dphi2);
-  t->Branch("el_dphiresc",              &m_el_dphiresc);
-  t->Branch("el_dphiresc2",             &m_el_dphiresc2);
-  t->Branch("el_eprobht",               &m_el_eprobht);
-  t->Branch("el_charge",                &m_el_charge);
-  t->Branch("el_nblayerhits",           &m_el_nblayerhits);
-  t->Branch("el_nblayerolhits",         &m_el_nblayerolhits);
-  t->Branch("el_npixhits",              &m_el_npixhits);
-  t->Branch("el_npixolhits",            &m_el_npixolhits);
-  t->Branch("el_nscthits",              &m_el_nscthits);
-  t->Branch("el_nsctolhits",            &m_el_nsctolhits);
-  t->Branch("el_ntrthightreshits",      &m_el_ntrthightreshits);
-  t->Branch("el_ntrthits",              &m_el_ntrthits);
-  t->Branch("el_ntrthighthresolhits",   &m_el_ntrthighthresolhits);
-  t->Branch("el_ntrtolhits",            &m_el_ntrtolhits);
-  t->Branch("el_ntrtxenonhits",         &m_el_ntrtxenonhits);
-  t->Branch("el_expectblayerhit",       &m_el_expectblayerhit); 
-  t->Branch("el_nsihits",               &m_el_nsihits          );
-  t->Branch("el_nsideadsensors",        &m_el_nsideadsensors   );
-  t->Branch("el_npixdeadsensors",       &m_el_npixdeadsensors  );
-  t->Branch("el_nsctdeadsensors",       &m_el_nsctdeadsensors  );
-  t->Branch("el_ringsE",                &m_el_ringsE );
-  t->Branch("el_loose",                 &m_el_loose  );
-  t->Branch("el_medium",                &m_el_medium );
-  t->Branch("el_tight",                 &m_el_tight );
-  t->Branch("el_lhLoose",               &m_el_lhLoose );
-  t->Branch("el_lhMedium",              &m_el_lhMedium ); 
-  t->Branch("el_lhTight",               &m_el_lhTight ); 
-  t->Branch("el_rgLoose",               &m_el_rgLoose );
-  t->Branch("el_rgMedium",              &m_el_rgMedium ); 
-  t->Branch("el_rgTight",               &m_el_rgTight ); 
-  t->Branch("el_multiLepton",           &m_el_multiLepton);
-  t->Branch("el_nGoodVtx",              &m_el_nGoodVtx);
-  t->Branch("el_nPileupPrimaryVtx",     &m_el_nPileupPrimaryVtx);
-  t->Branch("calo_et",                  &m_calo_et);
-  t->Branch("calo_eta",                 &m_calo_eta);
-  t->Branch("calo_phi",                 &m_calo_phi);
- 
-}
-
-
-/*void TrigEgammaNavNtuple::bookPhotonBranches(TTree *t){
-} */ 
-  
-void TrigEgammaNavNtuple::bookMonteCarloBranches(TTree *t){
-  // Monte Carlo
-  t->Branch("mc_hasMC",       &m_mc_hasMC);
-  t->Branch("mc_pt",          &m_mc_pt);
-  t->Branch("mc_eta",         &m_mc_eta);
-  t->Branch("mc_phi",         &m_mc_phi);
-  t->Branch("mc_isTop",       &m_mc_isTop);
-  t->Branch("mc_isParton",    &m_mc_isParton);
-  t->Branch("mc_isMeson",     &m_mc_isMeson);
-  t->Branch("mc_isTau",       &m_mc_isTau);
-  t->Branch("mc_isMuon",      &m_mc_isMuon);
-  t->Branch("mc_isPhoton",    &m_mc_isPhoton);
-  t->Branch("mc_isElectron",  &m_mc_isElectron);
-  t->Branch("mc_hasZMother",  &m_mc_hasZMother);
-  t->Branch("mc_hasWMother",  &m_mc_hasWMother);
-}
-
-void TrigEgammaNavNtuple::linkEventBranches(TTree *t){
-  
-  InitBranch( t, "RunNumber",        &m_runNumber);
-  InitBranch( t, "EventNumber",      &m_eventNumber);
-  InitBranch( t, "avgmu",            &m_avgmu);
-}
-
-void TrigEgammaNavNtuple::linkElectronBranches( TTree *t ){
-  
-  InitBranch( t, "el_et",                    &m_el_et);
-  InitBranch( t, "el_pt",                    &m_el_pt);
-  InitBranch( t, "el_eta",                   &m_el_eta);
-  InitBranch( t, "el_phi",                   &m_el_phi);
-  InitBranch( t, "el_ethad1",                &m_el_ethad1);
-  InitBranch( t, "el_ehad1",                 &m_el_ehad1);
-  InitBranch( t, "el_f1",                    &m_el_f1);
-  InitBranch( t, "el_f3",                    &m_el_f3);
-  InitBranch( t, "el_f1core",                &m_el_f1core);
-  InitBranch( t, "el_f3core",                &m_el_f3core);
-  InitBranch( t, "el_weta2",                 &m_el_weta2);
-  InitBranch( t, "el_d0",                    &m_el_d0);
-  InitBranch( t, "el_wtots1",                &m_el_wtots1);
-  InitBranch( t, "el_fracs1",                &m_el_fracs1);
-  InitBranch( t, "el_Reta",                  &m_el_Reta);
-  InitBranch( t, "el_Rphi",                  &m_el_Rphi);
-  InitBranch( t, "el_Eratio",                &m_el_Eratio);
-  InitBranch( t, "el_Rhad",                  &m_el_Rhad);
-  InitBranch( t, "el_Rhad1",                 &m_el_Rhad1);
-  InitBranch( t, "el_deta1",                 &m_el_deta1);
-  InitBranch( t, "el_deta2",                 &m_el_deta2);
-  InitBranch( t, "el_dphi2",                 &m_el_dphi2);
-  InitBranch( t, "el_dphiresc",              &m_el_dphiresc);
-  InitBranch( t, "el_dphiresc2",             &m_el_dphiresc2);
-  InitBranch( t, "el_eprobht",               &m_el_eprobht);
-  InitBranch( t, "el_charge",                &m_el_charge);
-  InitBranch( t, "el_nblayerhits",           &m_el_nblayerhits);
-  InitBranch( t, "el_nblayerolhits",         &m_el_nblayerolhits);
-  InitBranch( t, "el_npixhits",              &m_el_npixhits);
-  InitBranch( t, "el_npixolhits",            &m_el_npixolhits);
-  InitBranch( t, "el_nscthits",              &m_el_nscthits);
-  InitBranch( t, "el_nsctolhits",            &m_el_nsctolhits);
-  InitBranch( t, "el_ntrthightreshits",      &m_el_ntrthightreshits);
-  InitBranch( t, "el_ntrthits",              &m_el_ntrthits);
-  InitBranch( t, "el_ntrthighthresolhits",   &m_el_ntrthighthresolhits);
-  InitBranch( t, "el_ntrtolhits",            &m_el_ntrtolhits);
-  InitBranch( t, "el_ntrtxenonhits",         &m_el_ntrtxenonhits);
-  InitBranch( t, "el_expectblayerhit",       &m_el_expectblayerhit); 
-  InitBranch( t, "el_nsihits",               &m_el_nsihits          );
-  InitBranch( t, "el_nsideadsensors",        &m_el_nsideadsensors   );
-  InitBranch( t, "el_npixdeadsensors",       &m_el_npixdeadsensors  );
-  InitBranch( t, "el_nsctdeadsensors",       &m_el_nsctdeadsensors  );
-  InitBranch( t, "el_ringsE",                &m_el_ringsE );
-  InitBranch( t, "el_loose",                 &m_el_loose  );
-  InitBranch( t, "el_medium",                &m_el_medium );
-  InitBranch( t, "el_tight",                 &m_el_tight );
-  InitBranch( t, "el_lhLoose",               &m_el_lhLoose );
-  InitBranch( t, "el_lhMedium",              &m_el_lhMedium ); 
-  InitBranch( t, "el_lhTight",               &m_el_lhTight ); 
-  InitBranch( t, "el_rgLoose",               &m_el_rgLoose );
-  InitBranch( t, "el_rgMedium",              &m_el_rgMedium ); 
-  InitBranch( t, "el_rgTight",               &m_el_rgTight ); 
-  InitBranch( t, "el_multiLepton",           &m_el_multiLepton);
-  InitBranch( t, "el_nGoodVtx",              &m_el_nGoodVtx);
-  InitBranch( t, "el_nPileupPrimaryVtx",     &m_el_nPileupPrimaryVtx);
-  InitBranch( t, "calo_et",                  &m_calo_et);
-  InitBranch( t, "calo_eta",                 &m_calo_eta);
-  InitBranch( t, "calo_phi",                 &m_calo_phi);
-
-}
-
-
-/*void TrigEgammaNavNtuple::linkPhotonBranches( TTree *t ){
-}*/
-
-void TrigEgammaNavNtuple::linkTriggerBranches( TTree *t ){
-
-  InitBranch(t, "trig_L1_eta",             &m_trig_L1_eta);
-  InitBranch(t, "trig_L1_phi",             &m_trig_L1_phi);
-  InitBranch(t, "trig_L1_emClus",          &m_trig_L1_emClus);
-  InitBranch(t, "trig_L1_tauClus",         &m_trig_L1_tauClus);
-  InitBranch(t, "trig_L1_emIsol",          &m_trig_L1_emIsol);
-  InitBranch(t, "trig_L1_hadIsol",         &m_trig_L1_hadIsol);
-  InitBranch(t, "trig_L1_thrNames",        &m_trig_L1_thrNames);
-  InitBranch(t, "trig_L1_accept",          &m_trig_L1_accept);
-  InitBranch(t, "trig_L2_calo_et",         &m_trig_L2_calo_et);
-  InitBranch(t, "trig_L2_calo_eta",        &m_trig_L2_calo_eta);
-  InitBranch(t, "trig_L2_calo_phi",        &m_trig_L2_calo_phi);
-  InitBranch(t, "trig_L2_calo_e237",       &m_trig_L2_calo_e237 );
-  InitBranch(t, "trig_L2_calo_e277",       &m_trig_L2_calo_e277 );
-  InitBranch(t, "trig_L2_calo_fracs1",     &m_trig_L2_calo_fracs1);
-  InitBranch(t, "trig_L2_calo_weta2",      &m_trig_L2_calo_weta2);
-  InitBranch(t, "trig_L2_calo_ehad1",      &m_trig_L2_calo_ehad1);
-  InitBranch(t, "trig_L2_calo_emaxs1",     &m_trig_L2_calo_emaxs1);
-  InitBranch(t, "trig_L2_calo_e2tsts1",    &m_trig_L2_calo_e2tsts1);
-  InitBranch(t, "trig_L2_calo_wstot",      &m_trig_L2_calo_wstot);
-  InitBranch(t, "trig_L2_calo_rnnOutput",      &m_trig_L2_calo_rnnOutput ); 
-  InitBranch(t, "trig_L2_calo_rings",      &m_trig_L2_calo_rings ); 
-  InitBranch(t, "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); 
-  InitBranch(t, "trig_L2_calo_accept",     &m_trig_L2_calo_accept);
-
-  InitBranch(t, "trig_L2_el_trackAlgID" ,         &m_trig_L2_el_trackAlgID );
-  InitBranch(t, "trig_L2_el_pt" ,                 &m_trig_L2_el_pt );
-  InitBranch(t, "trig_L2_el_eta",                 &m_trig_L2_el_eta);
-  InitBranch(t, "trig_L2_el_phi",                 &m_trig_L2_el_phi );
-  InitBranch(t, "trig_L2_el_caloEta",             &m_trig_L2_el_caloEta );
-  InitBranch(t, "trig_L2_el_charge",              &m_trig_L2_el_charge);
-  InitBranch(t, "trig_L2_el_nTRTHits",            &m_trig_L2_el_nTRTHits);
-  InitBranch(t, "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits);
-  InitBranch(t, "trig_L2_el_etOverPt" ,           &m_trig_L2_el_etOverPt );
-  InitBranch(t, "trig_L2_el_trkClusDeta" ,        &m_trig_L2_el_trkClusDeta );
-  InitBranch(t, "trig_L2_el_trkClusDphi" ,        &m_trig_L2_el_trkClusDphi );
-
-  InitBranch(t, "trig_L2_el_accept",       &m_trig_L2_el_accept );
-  InitBranch(t, "trig_EF_el_accept",       &m_trig_EF_el_accept );
-  InitBranch(t, "trig_EF_calo_accept",     &m_trig_EF_calo_accept );
-  InitBranch(t, "trig_EF_calo_et",         &m_trig_EF_calo_et );
-  InitBranch(t, "trig_EF_calo_eta",        &m_trig_EF_calo_eta );
- 
-}
-
-
-void TrigEgammaNavNtuple::linkMonteCarloBranches(TTree *t){
- 
-  InitBranch(t, "mc_hasMC",       &m_mc_hasMC);
-  InitBranch(t, "mc_pt",          &m_mc_pt);
-  InitBranch(t, "mc_eta",         &m_mc_eta);
-  InitBranch(t, "mc_phi",         &m_mc_phi);
-  InitBranch(t, "mc_isTop",       &m_mc_isTop);
-  InitBranch(t, "mc_isParton",    &m_mc_isParton);
-  InitBranch(t, "mc_isMeson",     &m_mc_isMeson);
-  InitBranch(t, "mc_isTau",       &m_mc_isTau);
-  InitBranch(t, "mc_isMuon",      &m_mc_isMuon);
-  InitBranch(t, "mc_isPhoton",    &m_mc_isPhoton);
-  InitBranch(t, "mc_isElectron",  &m_mc_isElectron);
-  InitBranch(t, "mc_hasZMother",  &m_mc_hasZMother);
-  InitBranch(t, "mc_hasWMother",  &m_mc_hasWMother); 
-}
-
-
-void TrigEgammaNavNtuple::clear(){
-
-  ///EventInfo
-  m_runNumber             = 0;
-  m_eventNumber           = 0;
-  m_avgmu                 = 0;
-  ///Egamma
-  m_el_et                 = -1;
-  m_el_pt                 = -1;
-  m_el_eta                = -1;
-  m_el_phi                = -1;
-  m_el_ethad1             = -1;
-  m_el_ehad1              = -1;
-  m_el_f1                 = -1;
-  m_el_f3                 = -1;
-  m_el_f1core             = -1;
-  m_el_f3core             = -1;
-  m_el_weta2              = -1;
-  m_el_d0                 = -1;
-  m_el_wtots1             = -1;
-  m_el_fracs1             = -1;
-  m_el_Reta               = -1;
-  m_el_Rphi               = -1;
-  m_el_Eratio             = -1;
-  m_el_Rhad               = -1;
-  m_el_Rhad1              = -1;
-  m_el_deta1              = -1;
-  m_el_deta2              = -1;
-  m_el_dphi2              = -1;
-  m_el_dphiresc           = -1;
-  m_el_dphiresc2          = -1;
-  m_el_eprobht            = -1;
-  m_el_charge             =  0;
-  m_el_nblayerhits        =  0;
-  m_el_nblayerolhits      =  0;
-  m_el_npixhits           =  0;
-  m_el_npixolhits         =  0;
-  m_el_nscthits           =  0;
-  m_el_nsctolhits         =  0;
-  m_el_ntrthightreshits   =  0;
-  m_el_ntrthits           =  0;
-  m_el_ntrthighthresolhits=  0;
-  m_el_ntrtolhits         =  0;
-  m_el_ntrtxenonhits      =  0;
-  m_el_expectblayerhit    =  false;
-  m_el_nsihits            =  0;
-  m_el_nsideadsensors     =  0;
-  m_el_npixdeadsensors    =  0;
-  m_el_nsctdeadsensors    =  0;
-  m_el_loose              = false; 
-  m_el_medium             = false; 
-  m_el_tight              = false; 
-  m_el_lhLoose            = false; 
-  m_el_lhMedium           = false; 
-  m_el_lhTight            = false;  
-  m_el_rgLoose            = false; 
-  m_el_rgMedium           = false; 
-  m_el_rgTight            = false;  
-  m_el_multiLepton        = false;
-  m_el_nGoodVtx           = -1;
-  m_el_nPileupPrimaryVtx  = -1;
-  m_calo_et               = -1; 
-  m_calo_eta              = -1; 
-  m_calo_phi              = -1; 
-
-  ///Trigger
-  m_trig_L1_eta           = -1;
-  m_trig_L1_phi           = -1;
-  m_trig_L1_emClus        = -1;
-  m_trig_L1_tauClus       = -1;
-  m_trig_L1_emIsol        = -1;
-  m_trig_L1_hadIsol       = -1;
-  m_trig_L1_accept        = false;
-  m_trig_L2_calo_et       = -1;
-  m_trig_L2_calo_eta      = -1;
-  m_trig_L2_calo_phi      = -1;
-  m_trig_L2_calo_e237     = -1;
-  m_trig_L2_calo_e277     = -1;
-  m_trig_L2_calo_fracs1   = -1;
-  m_trig_L2_calo_weta2    = -1;
-  m_trig_L2_calo_ehad1    = -1;
-  m_trig_L2_calo_emaxs1   = -1;
-  m_trig_L2_calo_e2tsts1  = -1;
-  m_trig_L2_calo_wstot    = -1; 
-  m_trig_L2_calo_rnnOutput    = 999; 
-
-  m_trig_L1_accept        = false;
-  m_trig_L2_calo_accept   = false;
-  m_trig_L2_el_accept     = false; 
-  m_trig_EF_calo_accept   = false;
-  m_trig_EF_el_accept     = false;
-
-  ///Monte Carlo
-  m_mc_hasMC              = false;
-  m_mc_pt                 = -1;
-  m_mc_eta                = -1;
-  m_mc_phi                = -1;
-  m_mc_isTop              = false;
-  m_mc_isParton           = false;
-  m_mc_isMeson            = false;
-  m_mc_isTau              = false;
-  m_mc_isMuon             = false;
-  m_mc_isPhoton           = false;
-  m_mc_isElectron         = false;
-  m_mc_hasZMother         = false;
-  m_mc_hasWMother         = false;
-
-  ///Some vectors
-  m_trig_L1_thrNames               ->clear(); 
-  m_trig_L2_calo_energySample      ->clear();
-  m_trig_L2_calo_rings             ->clear();
-
-  m_trig_L2_el_trackAlgID          ->clear(); 
-  m_trig_L2_el_eta                 ->clear(); 
-  m_trig_L2_el_phi                 ->clear(); 
-  m_trig_L2_el_caloEta             ->clear(); 
-  m_trig_L2_el_trkClusDeta         ->clear(); 
-  m_trig_L2_el_trkClusDphi         ->clear(); 
-  m_trig_L2_el_pt                  ->clear(); 
-  m_trig_L2_el_etOverPt            ->clear();         
-  m_trig_L2_el_nTRTHits            ->clear();       
-  m_trig_L2_el_nTRTHiThresholdHits ->clear();       
-  m_trig_L2_el_charge              ->clear();     
-  m_trig_EF_calo_et                ->clear();     
-}
-
-void TrigEgammaNavNtuple::alloc_space(){
-
-  m_el_ringsE                       = new std::vector<float>();
-  m_trig_L1_thrNames                = new std::vector<std::string>();
-  m_trig_L2_calo_energySample       = new std::vector<float>();
-  m_trig_L2_calo_rings              = new std::vector<float>();
-  m_trig_L2_el_trackAlgID           = new std::vector<int>();
-  m_trig_L2_el_eta                  = new std::vector<float>();   
-  m_trig_L2_el_phi                  = new std::vector<float>();   
-  m_trig_L2_el_caloEta              = new std::vector<float>();   
-  m_trig_L2_el_trkClusDeta          = new std::vector<float>();
-  m_trig_L2_el_trkClusDphi          = new std::vector<float>();
-  m_trig_L2_el_pt                   = new std::vector<float>();   
-  m_trig_L2_el_etOverPt             = new std::vector<float>();           
-  m_trig_L2_el_nTRTHits             = new std::vector<float>();         
-  m_trig_L2_el_nTRTHiThresholdHits  = new std::vector<float>();         
-  m_trig_L2_el_charge               = new std::vector<float>();       
-  m_trig_EF_calo_et                 = new std::vector<float>();       
-  m_trig_EF_calo_eta                = new std::vector<float>();       
-  
-}
-
-void TrigEgammaNavNtuple::release_space(){
-  delete m_el_ringsE              ;
-  delete m_trig_L1_thrNames       ;
-  delete m_trig_L2_calo_energySample;
-  delete m_trig_L2_calo_rings     ;
-  delete m_trig_L2_el_trackAlgID  ;
-  delete m_trig_L2_el_pt          ;  
-  delete m_trig_L2_el_eta         ;   
-  delete m_trig_L2_el_caloEta     ;   
-  delete m_trig_L2_el_phi         ;   
-  delete m_trig_L2_el_charge      ;       
-  delete m_trig_L2_el_nTRTHits    ;         
-  delete m_trig_L2_el_nTRTHiThresholdHits    ;         
-  delete m_trig_L2_el_etOverPt    ;           
-  delete m_trig_L2_el_trkClusDeta ;
-  delete m_trig_L2_el_trkClusDphi ;
-  delete m_trig_EF_calo_et        ;
-  delete m_trig_EF_calo_eta       ;
-}
-
-unsigned TrigEgammaNavNtuple::count_HLT_objects( const HLT::TriggerElement *feat )
-{
-  unsigned nobj=0;
-  if(getFeature<xAOD::ElectronContainer>(feat)    ) nobj++; // HLT
-  if(getFeature<xAOD::CaloClusterContainer>(feat) ) nobj++; // EFCalo
-  if(getFeature<xAOD::TrigElectronContainer>(feat)) nobj++; // L2
-  if(getFeature<xAOD::TrigEMCluster>(feat)        ) nobj++; // L2Calo
-  ATH_MSG_DEBUG("Number of objects counted in this feature: " << nobj);
-  return nobj;
-}
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx
index 57a1a2058f76f9e7f9fbca8b03424a9ad15f0f9e..c13b73ef8d1fbf887f923596d0735186e99d4c61 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPAnalysisTool.cxx
@@ -48,9 +48,21 @@ StatusCode TrigEgammaNavTPAnalysisTool::childBook(){
         if (std::find(chains.begin(), chains.end(), trigName) != chains.end()){ 
             if(plot()->getTrigInfoMap().count(trigName) != 0)
                 ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName);
-            else 
+            else {
                 m_trigList.push_back(trigName);
+                setTrigInfo(trigName);
+            }
         }
+
+        // specail code to add trigger without the menu
+        else if(getEmulation() && m_forceTrigAttachment){// 
+          ATH_MSG_INFO("Trigger doesn't exist in menu. Attach to emulate.");
+          if(plot()->getTrigInfoMap().count(trigName) == 0){
+            m_trigList.push_back(trigName);
+            setTrigEmulation();
+            setTrigInfo(trigName);
+          }
+        }// emulation 
     }
     // Book histograms for average efficiencies and counters
     const int nTrigger = (int) m_trigList.size();
@@ -104,9 +116,6 @@ StatusCode TrigEgammaNavTPAnalysisTool::childBook(){
         setLabels(hist1(m_anatype+"_EffHLT"),m_trigList);
         setLabels(hist1(m_anatype+"_CutCounter"),m_cutlabels);
     }
-    // Book the histograms per signature
-    for (int i = 0; i < (int) m_trigList.size(); i++)
-        setTrigInfo(m_trigList[i]);
  
     plot()->setEmulation(getEmulation()); 
     if(plot()->book(getTrigInfoMap()).isFailure()){
@@ -136,6 +145,19 @@ StatusCode TrigEgammaNavTPAnalysisTool::childExecute()
         ATH_MSG_DEBUG("Fails EventWise selection");
         return StatusCode::SUCCESS;
     }
+    // Check for Rnn container in SG
+    if(m_storeGate->contains<xAOD::TrigRNNOutputContainer>("HLT_xAOD__TrigRNNOutputContainer_TrigRingerNeuralFex")){
+        setSGContainsRnn(true);
+    }
+    if(m_storeGate->contains<xAOD::TrigPhotonContainer>("HLT_xAOD__TrigPhotonContainer_L2PhotonFex")){
+        setSGContainsTrigPhoton(true);
+    }
+    ATH_MSG_DEBUG("Rnn container in SG " << getSGContainsRnn());
+    ATH_MSG_DEBUG("TrigPhotonContainer in SG " << getSGContainsTrigPhoton());
+    for( const auto& tool : m_tools) {
+        tool->setSGContainsRnn(getSGContainsRnn());
+        tool->setSGContainsTrigPhoton(getSGContainsTrigPhoton());
+    }
     // Event Wise Selection (independent of the required signatures)
     hist1(m_anatype+"_CutCounter")->Fill("EventWise",1);
     // Select TP Pairs
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx
index 4dac467c9006890f13a19afe2a7ef296c5b30d36..90610ba04a1ee451369de5d41458e18e498f3d2d 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPBaseTool.cxx
@@ -19,10 +19,10 @@
  *      All derived classes work with list of probes for a given trigger.
  *      As input property, pass a list of triggers to study.
  **********************************************************************/
-#include "egammaMVACalibAnalysis/IegammaMVATool.h"
 #include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h"
 #include "TrigConfxAOD/xAODConfigTool.h"
 #include "xAODEventInfo/EventInfo.h"
+#include "GaudiKernel/SystemOfUnits.h"
 #include "PATCore/AcceptData.h"
 #include "string"
 #include <algorithm>
@@ -47,12 +47,14 @@ TrigEgammaNavTPBaseTool( const std::string& myname )
   declareProperty("ForceProbePid", m_forceProbePid=false); // new
   declareProperty("OppositeCharge",m_oppositeCharge=true);
   declareProperty("OfflineTagMinEt",m_tagMinEt=25);
+  declareProperty("OfflineProbeMinEt",m_probeMinEt=4);
   declareProperty("TagTriggerList", m_tagTrigList);
   declareProperty("TriggerList",m_trigInputList);
   declareProperty("CategoryList",m_categories);
   declareProperty("RemoveCrack", m_rmCrack=true); //new
   declareProperty("OfflineProbeIsolation", m_offProbeIsolation="Loose");
   declareProperty("ForceProbeIsolation", m_forceProbeIsolation=false);
+  declareProperty("ApplyMinimalTrigger", m_applyMinimalTrigger=true);
 
   // Maps should be static
   m_PidToolMap["Tight"]=0;
@@ -64,9 +66,9 @@ TrigEgammaNavTPBaseTool( const std::string& myname )
   m_jets=nullptr;
   m_eventInfo=nullptr;
   m_truthContainer=nullptr;
+  m_METContainer=nullptr;
   m_applyJetNearProbeSelection=true; 
-  m_skipTrigger=false; 
-  
+  m_skipTrigger=false;  
 }
 
 //**********************************************************************
@@ -81,7 +83,10 @@ StatusCode TrigEgammaNavTPBaseTool::childExecute() {
 StatusCode TrigEgammaNavTPBaseTool::childFinalize() {
 
    ATH_MSG_VERBOSE( "child Finalize tool " << name() );
+   // delete electron pointers alloc in the tap execute method and
+   // clear the list of pairs
    clearProbeList();
+   // clear the list of pairs
    clearPairList();
    //m_offElectrons->clearDecorations();
 
@@ -104,9 +109,11 @@ TrigEgammaNavTPBaseTool::childInitialize() {
 
     return StatusCode::SUCCESS;
 }
+
 StatusCode TrigEgammaNavTPBaseTool::childBook() {
     return StatusCode::SUCCESS;
 }
+
 bool TrigEgammaNavTPBaseTool::EventWiseSelection(){
 
     ATH_MSG_DEBUG("Apply EventWise selection");
@@ -122,7 +129,6 @@ bool TrigEgammaNavTPBaseTool::EventWiseSelection(){
     m_offElectrons = 0;
     m_jets = 0;
     m_truthContainer=0;
-
     
     if ( (m_storeGate->retrieve(m_eventInfo, "EventInfo")).isFailure() ){
         ATH_MSG_WARNING("Failed to retrieve eventInfo ");
@@ -136,6 +142,15 @@ bool TrigEgammaNavTPBaseTool::EventWiseSelection(){
       }
     }// protection
 
+    if(m_storeGate->contains<xAOD::MissingETContainer>("MET_Reference_AntiKt4EMTopo")){
+      if(m_storeGate->retrieve(m_METContainer,"MET_Reference_AntiKt4EMTopo").isFailure()){
+        ATH_MSG_WARNING("Could not retrieve xAOD::MissingETContainer 'MET_Reference_AntiKt4EMTopo'");
+        return false;
+      }
+    }// protection
+
+
+
     if (m_eventInfo->errorState(xAOD::EventInfo::LAr) == xAOD::EventInfo::Error) {
         ATH_MSG_DEBUG("Event not passing LAr");
         return false;
@@ -173,9 +188,11 @@ bool TrigEgammaNavTPBaseTool::EventWiseSelection(){
 
     // missing more selections
     // check Minimal Trigger Requirements
-    if ( !MinimalTriggerRequirement() ) return false;
+    if(m_applyMinimalTrigger)    
+      if ( !MinimalTriggerRequirement() ) return false;
     hist1(m_anatype+"_CutCounter")->Fill("PassTrigger",1);
 
+    
     return true;
 }
 
@@ -193,11 +210,18 @@ bool TrigEgammaNavTPBaseTool::MinimalTriggerRequirement(){
 
 void TrigEgammaNavTPBaseTool::executeTandP(){
     
+    // clear all Z index pairs
+    m_Z.clear();
+    unsigned itag=0;
+
     clearProbeList(); // Clear Probes after each trigger
     ATH_MSG_DEBUG("Execute TandP BaseTool " << m_offElectrons->size());
     for(const auto& elTag : *m_offElectrons){
+        itag++;
         if( ! isTagElectron(elTag) ) continue;
+        unsigned iprobe=0;
         for(const auto& elProbe : *m_offElectrons){  // Dress the probes with updated Pid decision
+            iprobe++;
             hist1(m_anatype+"_ProbeCutCounter")->Fill("Electrons",1);
             if(elProbe==elTag) continue;
             hist1(m_anatype+"_ProbeCutCounter")->Fill("NotTag",1);
@@ -241,36 +265,56 @@ void TrigEgammaNavTPBaseTool::executeTandP(){
                 xAOD::Electron *selProbe = new xAOD::Electron(*elProbe);              
                 DressPid(selProbe);
                 m_probeElectrons.push_back(selProbe);
+                m_Z.push_back( std::pair<unsigned,unsigned>(itag-1,iprobe-1) );
                 hist1(m_anatype+"_Mee")->Fill(tpPairMass/1.e3);
             }
         } // end of for in Probe
     } // end of for in Tags
 }
 
+
 void TrigEgammaNavTPBaseTool::matchObjects(const std::string probeTrigItem){
 
     clearPairList();
+    bool isEmulation = getTrigInfo(probeTrigItem).trigIsEmulation;
+
+
     for(unsigned int i=0;i<m_probeElectrons.size();i++){
         const HLT::TriggerElement *finalFC;
-
-        // Use matching tool and create pair of offline probe and TE
-        if ( match()->match(m_probeElectrons[i], probeTrigItem, finalFC)){
-            std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],finalFC);
-            m_pairObj.push_back(pairProbe);
-        } // end of check Probe
-        else {
-            std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],nullptr);
-            m_pairObj.push_back(pairProbe);
-        } // still include the probe
+        if(isEmulation && getEmulation()){  // Collect from  support match
+          emulation()->match( m_probeElectrons[i], finalFC );
+          std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],finalFC);
+          m_pairObj.push_back(pairProbe);
+        }else{
+          // Use matching tool and create pair of offline probe and TE
+          if ( match()->match(m_probeElectrons[i], probeTrigItem, finalFC)){
+              std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],finalFC);
+              m_pairObj.push_back(pairProbe);
+          } // end of check Probe
+          else {
+              std::pair<const xAOD::Electron*,const HLT::TriggerElement*> pairProbe(m_probeElectrons[i],nullptr);
+              m_pairObj.push_back(pairProbe);
+          } // still include the probe
+        }
     }
 }
 
 void TrigEgammaNavTPBaseTool::clearProbeList(){
+
+    ATH_MSG_DEBUG("Clear all Probes...");
+    // this vector hold the Electron pointer and need to
+    // be deleted since we alloc such memory for than
+    for (auto it : m_probeElectrons) 
+      delete it;
     m_probeElectrons.clear();
+    
     m_probePhotons.clear();
 }
 
 void TrigEgammaNavTPBaseTool::clearPairList(){
+
+    ATH_MSG_DEBUG("Clear all Pairs...");
+    // this only hold < Electron * , TriggerElement * >
     m_pairObj.clear();
 }
 
@@ -285,7 +329,6 @@ bool TrigEgammaNavTPBaseTool::isTagElectron(const xAOD::Electron *el){
     // Require offline tight electron
     // Match to e24_tight1_L1EM20V
     ATH_MSG_DEBUG("Selecting Tag Electron");
-    double GeV = 1000.;
 
     //Check constituents
     const xAOD::TrackParticle *trk = el->trackParticle();
@@ -308,7 +351,7 @@ bool TrigEgammaNavTPBaseTool::isTagElectron(const xAOD::Electron *el){
     hist1(m_anatype+"_TagCutCounter")->Fill("GoodPid",1);
     ATH_MSG_DEBUG("Selecting Tag Electron Et");
     //Require Et > 25 GeV
-    if( !(el->e()/cosh(el->trackParticle()->eta())  > m_tagMinEt*GeV) ){
+    if( !(el->e()/cosh(el->trackParticle()->eta())  > m_tagMinEt*Gaudi::Units::GeV) ){
         return false;
     }
     hist1(m_anatype+"_TagCutCounter")->Fill("Et",1);
@@ -375,13 +418,14 @@ bool TrigEgammaNavTPBaseTool::isTagElectron(const xAOD::Electron *el){
 
 
 void TrigEgammaNavTPBaseTool::DressPid(const xAOD::Electron *eg){
+    auto ctx = Gaudi::Hive::currentContext() ;
     for(int ipid=0;ipid<3;ipid++){
-        bool accept = (bool) m_electronIsEMTool[ipid]->accept(eg);
+        bool accept = (bool) m_electronIsEMTool[ipid]->accept(ctx,eg);
         const std::string pidname="is"+m_isemname[ipid];
         eg->auxdecor<bool>(pidname)=static_cast<bool>(accept);
     }
     for(int ipid=0;ipid<2;ipid++){
-        bool accept = (bool) m_electronLHTool[ipid]->accept(eg);
+        bool accept = (bool) m_electronLHTool[ipid]->accept(ctx,eg);
         const std::string pidname="is"+m_lhname[ipid];
         eg->auxdecor<bool>(pidname)=static_cast<bool>(accept);
     }
@@ -389,34 +433,30 @@ void TrigEgammaNavTPBaseTool::DressPid(const xAOD::Electron *eg){
 }
 
 bool TrigEgammaNavTPBaseTool::ApplyElectronPid(const xAOD::Electron *eg, const std::string pidname){
-    
+    auto ctx = Gaudi::Hive::currentContext() ;
     if (pidname == "Tight"){
-        bool accept = (bool) m_electronIsEMTool[0]->accept(eg);
-        return static_cast<bool>(accept);
+        return (bool) m_electronIsEMTool[0]->accept(ctx,eg);
     }
     else if (pidname == "Medium"){
-        bool accept = (bool) m_electronIsEMTool[1]->accept(eg);
-        return static_cast<bool>(accept);
+        return  (bool) m_electronIsEMTool[1]->accept(ctx,eg);
     }
     else if (pidname == "Loose"){
-        bool accept = (bool) m_electronIsEMTool[2]->accept(eg);
-        return static_cast<bool>(accept);
+        return (bool) m_electronIsEMTool[2]->accept(ctx,eg);
     }
     else if (pidname == "LHTight"){
-        bool accept = (bool) m_electronLHTool[0]->accept(eg);
-        return static_cast<bool>(accept);
+        return (bool) m_electronLHTool[0]->accept(ctx,eg);
     }
     else if (pidname == "LHMedium"){
-        bool accept = (bool) m_electronLHTool[1]->accept(eg);
-        return static_cast<bool>(accept);
+        return (bool) m_electronLHTool[1]->accept(ctx,eg);
     }
     else if (pidname == "LHLoose"){
-        bool accept = (bool) m_electronLHTool[2]->accept(eg);
-        return static_cast<bool>(accept);
+        return (bool) m_electronLHTool[2]->accept(ctx,eg);
     }
     else if (pidname == "LHMediumHI"){
-        bool accept = (bool) m_electronLHTool[3]->accept(eg);
-        return static_cast<bool>(accept);
+        return (bool) m_electronLHTool[3]->accept(ctx,eg);
+    }
+    else if (pidname == "LHMediumHI"){
+        return (bool) m_electronLHTool[3]->accept(ctx,eg);
     }
     else ATH_MSG_DEBUG("No Pid tool, continue without PID");
     return false;
@@ -424,7 +464,6 @@ bool TrigEgammaNavTPBaseTool::ApplyElectronPid(const xAOD::Electron *eg, const s
 
 bool TrigEgammaNavTPBaseTool::isGoodProbeElectron(const xAOD::Electron *el){
 
-    double GeV = 1000.;
     //Check constituents
     if(!el->trackParticle()){
         ATH_MSG_DEBUG("No track Particle");
@@ -444,7 +483,7 @@ bool TrigEgammaNavTPBaseTool::isGoodProbeElectron(const xAOD::Electron *el){
         }
     }
     hist1(m_anatype+"_ProbeCutCounter")->Fill("Eta",1);
-    /*if( !(el->e()/cosh(el->trackParticle()->eta())  > (etthr-5.0)*GeV) ){
+    /*if( !(el->e()/cosh(el->trackParticle()->eta())  > (etthr-5.0)*Gaudi::Units::GeV) ){
         return false;
     }
     hist1("ProbeCutCounter")->Fill("Et",1);*/
@@ -461,7 +500,7 @@ bool TrigEgammaNavTPBaseTool::isGoodProbeElectron(const xAOD::Electron *el){
         for(const auto &i_jet : *m_jets){
             TLorentzVector jet;
             jet.SetPtEtaPhiE(i_jet->pt(), i_jet->eta(), i_jet->phi(), i_jet->e());
-            if( (jet.Et() > 20*GeV) && (jet.DeltaR(probeCandidate) < 0.4)) jetsAroundProbeElectron++;
+            if( (jet.Et() > 20*Gaudi::Units::GeV) && (jet.DeltaR(probeCandidate) < 0.4)) jetsAroundProbeElectron++;
         }
         //reject if more than 1 jet close to the probe electron
         if ( jetsAroundProbeElectron >= 2 ) {
@@ -529,3 +568,32 @@ double TrigEgammaNavTPBaseTool::simple_lxy(int flag,   double d1,  double d2, do
   else
     return (a+b)/c;
 }
+
+
+
+float TrigEgammaNavTPBaseTool::getWTransverseMass( const xAOD::Electron *el ){
+  float transverseMass=0.0;
+  if(m_METContainer){
+    TLorentzVector MET_4vec = TLorentzVector(getMET()->mpx(), getMET()->mpy(), 0, getMET()->met());
+    TLorentzVector electron;
+    electron.SetPtEtaPhiE(el->pt(), 0, el->phi(), el->pt());
+    transverseMass = (MET_4vec + electron).M();
+  }
+  return transverseMass;
+
+}
+
+bool TrigEgammaNavTPBaseTool::passesEventCleaning()
+{
+  ATH_MSG_DEBUG("Appling Event Cleaning...");
+  bool failsLAr  = (m_eventInfo->errorState(xAOD::EventInfo::LAr)  == xAOD::EventInfo::Error );
+  bool failsTile = (m_eventInfo->errorState(xAOD::EventInfo::Tile) == xAOD::EventInfo::Error );
+  bool failsSCT  = (m_eventInfo->errorState(xAOD::EventInfo::SCT)  == xAOD::EventInfo::Error );
+  bool failsTTC  = (m_eventInfo->isEventFlagBitSet(xAOD::EventInfo::Core, 18)); // timing, trigger, control failed => some eventinfo missing
+  bool pass =  !(failsLAr || failsTile || failsSCT || failsTTC);
+  if(!pass)
+    ATH_MSG_DEBUG("Event not clear! ");
+  return pass;
+}
+
+
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPNtuple.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPNtuple.cxx
deleted file mode 100755
index 680e786f42f35dbe1fe6acb46eb52ff672b9c156..0000000000000000000000000000000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaNavTPNtuple.cxx
+++ /dev/null
@@ -1,1066 +0,0 @@
-/*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-*/
-
-/**********************************************************************
- * AsgTool: TrigEgammaNavTPNtuple
- * Authors:
- *      Ryan Mackenzie White <ryan.white@cern.ch>
- *      Denis Damazio <denis.damazio@cern.ch>
- * Contributors:
- *      Joao Victor da Fonseca Pinto <joao.victor.da.fonseca.pinto@cern.ch>
- * Date: Mar 2015
- * Description:
- *      Derived class for dumping the probe information into a ttree.
- *     
- **********************************************************************/
-
-#include "TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h"
-
-using namespace std;
-
-TrigEgammaNavTPNtuple::TrigEgammaNavTPNtuple( const std::string& myname ): TrigEgammaNavTPBaseTool(myname) 
-{
-  m_eventCounter = 0;
-  declareProperty("CutLabels",              m_cutlabels               );
-  declareProperty("Analysis",               m_anatype="NavTPNtuple"   );
-  declareProperty("doOfflineDump",          m_doOfflineDump=false     );
-  declareProperty("DoSupportTrigger",       m_doSupport=true          );
-  declareProperty("OfflineProbeMinEt",      m_probeMinEt=-1           );
-
-  m_el_ringsE=nullptr;
-  m_trig_L1_thrNames=nullptr;          
-  m_trig_L2_calo_energySample=nullptr;
-  m_trig_L2_calo_rings=nullptr;
-  m_trig_L2_el_trackAlgID=nullptr;
-  m_trig_L2_el_pt=nullptr;
-  m_trig_L2_el_eta=nullptr;
-  m_trig_L2_el_caloEta=nullptr;
-  m_trig_L2_el_phi=nullptr;
-  m_trig_L2_el_charge=nullptr;
-  m_trig_L2_el_nTRTHits=nullptr;
-  m_trig_L2_el_nTRTHiThresholdHits=nullptr;
-  m_trig_L2_el_etOverPt=nullptr;
-  m_trig_L2_el_trkClusDeta=nullptr;
-  m_trig_L2_el_trkClusDphi=nullptr;
-  m_trig_EF_calo_et=nullptr;
-  m_trig_EF_calo_eta=nullptr;
-}
-
-StatusCode TrigEgammaNavTPNtuple::childInitialize(){
-  return StatusCode::SUCCESS;
-}
-
-
-StatusCode TrigEgammaNavTPNtuple::childBook(){
-
-  ATH_MSG_DEBUG("Now configuring chains for analysis");
-  //Set the base directory from the plot()
-  m_dir=plot()->getBasePath();
-  std::vector<std::string> chains  = tdt()->getListOfTriggers("HLT_e.*, L1_EM.*, HLT_g.*");
-
-  TrigEgammaAnalysisBaseTool::write_trigger_list(chains);
-
-  for(const auto trigName:m_trigInputList){ 
-    if (std::find(chains.begin(), chains.end(), trigName) != chains.end()) {
-      if(plot()->getTrigInfoMap().count(trigName) != 0)
-          ATH_MSG_WARNING("Trigger already booked, removing from trigger list " << trigName);
-      else 
-          m_trigList.push_back(trigName);
-    }
-  }
-
-
-
-  // Book histograms for average efficiencies and counters
-  //const int nTrigger = (int) m_trigList.size();
-  addDirectory(m_dir+"/Expert/Event");
-  std::string histname=m_anatype+"_ProbeCutCounter";
-  addHistogram(new TH1F(histname.c_str(), "Number of Probes; Cut ; Count", 12, 0., 12));
-  histname=m_anatype+"_TagCutCounter";
-  addHistogram(new TH1F(histname.c_str(), "Number of Tags; Cut ; Count", 10, 0., 10));
-  histname=m_anatype+"_Mee";
-  addHistogram(new TH1F(histname.c_str(), "Offline M(ee); m_ee [GeV] ; Count", 50, m_ZeeMassMin, m_ZeeMassMax));
-  histname=m_anatype+"_CutCounter";
-  addHistogram(new TH1I(histname.c_str(), "Event Selection; Cut ; Count", 6, 0., 6));
-  setLabels(hist1(histname),m_cutlabels);
-  
-  if(m_doOfflineDump){
-      addDirectory(m_dir+"/Expert/Offline");
-      TTree *t = new TTree( "probes", "tree of Offline Zee probes");
-      bookEventBranches( t );
-      bookElectronBranches( t );
-      //bookPhotonBranches( t );
-      bookMonteCarloBranches( t );
-      addTree(t, m_dir+"/Expert/Offline");
-  }else if (m_doSupport){ // All trigger in one
-      addDirectory(m_dir+"/Expert/support");
-      TTree *t = new TTree( "probes", "tree of Zee probes");
-      bookEventBranches( t );
-      bookElectronBranches( t );
-      //bookPhotonBranches( t );
-      bookTriggerBranches( t );
-      bookMonteCarloBranches( t );
-      for(auto& trigItem : m_trigList)
-        setTrigInfo(trigItem);
-      addTree(t, m_dir+"/Expert/support");
-  }else{// Each trigger 
-    for (auto& trigItem : m_trigList) {
-      addDirectory(m_dir+"/Expert/"+trigItem);
-      TTree *t = new TTree( "probes", "tree of Zee probes");
-      bookEventBranches( t );
-      bookElectronBranches( t );
-      //bookPhotonBranches( t );
-      bookTriggerBranches( t );
-      bookMonteCarloBranches( t );
-      setTrigInfo(trigItem);
-      addTree(t, m_dir+"/Expert/"+trigItem);
-    }// Loop over triggers
-  }
-
-  ///Alloc pointers
-  alloc_space();
-  return StatusCode::SUCCESS;
-}
-
-StatusCode TrigEgammaNavTPNtuple::childExecute(){
-
-  m_eventCounter++;
-  cd(m_dir+"/Expert/Event");
-  // Event Wise Selection (independent of the required signatures)
-  if ( !TrigEgammaNavTPBaseTool::EventWiseSelection() ) return StatusCode::SUCCESS;
-
-  if(m_doOfflineDump){
-    if(!executeProbesDump())  return StatusCode::FAILURE;
-  }else if (m_doSupport){
-    if(!executeProbesSupportDump())  return StatusCode::FAILURE; 
-  }else{
-    if(!executeProbesItemDump())  return StatusCode::FAILURE;
-  }
-
-  return StatusCode::SUCCESS;
-}
-
-
-
-bool TrigEgammaNavTPNtuple::executeProbesDump(){
-
-  // Select TP Pairs
-  executeTandP();
-
-  TTree *t = tree( "probes", m_dir+"/Expert/Offline");
-  linkEventBranches(t); 
-  linkElectronBranches(t); 
-  linkMonteCarloBranches(t); 
-  for(unsigned int iprobe = 0; iprobe != m_probeElectrons.size(); ++iprobe){
-    const xAOD::Electron *el = static_cast<const xAOD::Electron *> (m_probeElectrons[iprobe]);
-    ATH_MSG_DEBUG("dumping probe electron information...");
-    clear();
-    fillEvent();
-    fillElectron( el );  
-    if(!fillMonteCarlo( el ) ){
-      ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron");
-    }
-    ATH_MSG_DEBUG("record probe information into the file.");
-    t->Fill();
-  }// loop over offline probes
- 
-  return true;
-}
-
-
-bool TrigEgammaNavTPNtuple::executeProbesItemDump(){
-  
-  executeTandP();
-
-  for(unsigned int ilist = 0; ilist != m_trigList.size(); ++ilist) {
-
-    std::string trigItem = m_trigList.at(ilist);
-    const TrigInfo info = getTrigInfo(trigItem); 
-    cd(m_dir+"/Expert/"+trigItem);
-    TTree *t = tree( "probes", m_dir+"/Expert/"+trigItem);
-    linkEventBranches(t); 
-    linkElectronBranches(t); 
-    linkTriggerBranches(t); 
-    linkMonteCarloBranches(t); 
-    //Try to find trigger objects
-    TrigEgammaNavTPBaseTool::matchObjects(trigItem);
-
-    for(unsigned int iprobe = 0; iprobe != m_pairObj.size(); ++iprobe){
-
-      const xAOD::Electron *el = static_cast<const xAOD::Electron *> (m_pairObj[iprobe].first);
-      const HLT::TriggerElement *feat = m_pairObj[iprobe].second;
-      ATH_MSG_DEBUG("dumping probe electron information...");
-
-      clear();
-      fillEvent();
-      fillElectron( el );  
-
-      if(!fillMonteCarlo( el ) ){
-        ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron");
-      }
- 
-      if(feat){ 
-        ///Start trigger analisys...
-        const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat);
-        if(emTauRoI){
-          fillEmTauRoI( emTauRoI ); 
-        }else{ 
-          ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement..");
-        }
-    
-        const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat);
-        if(emCluster){
-    
-          if(!fillTrigEMCluster( emCluster )){
-            ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree.");
-          }
-    
-          //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){
-          if(!fillTrigCaloRings( emCluster )){
-            ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree.");
-          }
-        }///cluster protection
-    
-    
-        const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat);
-        // Level 2 ID+Calo
-        if(trigElCont){
-          for(const auto& trigEl : *trigElCont){
-            if(!fillTrigElectron(trigEl)) {
-              ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree.");
-            }    
-          }// loop over all trigElectrons for this feat
-        }
-         
-        const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat);
-        if(caloCont){
-          for(const auto& cl : *caloCont){
-            if(!fillCaloCluster(cl)){
-              ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree.");
-            }
-          }// loop over calo cluster
-        }
-
-
-        asg::AcceptData acceptData = setAccept(feat,info);
-        m_trig_L1_accept       = acceptData.getCutResult("L1Calo"); 
-        m_trig_L2_calo_accept  = acceptData.getCutResult("L2Calo"); 
-        m_trig_L2_el_accept    = acceptData.getCutResult("L2"); 
-        m_trig_EF_calo_accept  = acceptData.getCutResult("EFCalo");  
-        m_trig_EF_el_accept    = acceptData.getCutResult("HLT");   
-
-        ATH_MSG_DEBUG("L1Calo: "  << int(m_trig_L1_accept)); 
-        ATH_MSG_DEBUG("L2Calo: "  << int(m_trig_L2_calo_accept));
-        ATH_MSG_DEBUG("L2    : "  << int(m_trig_L2_el_accept));
-        ATH_MSG_DEBUG("EFCalo: "  << int(m_trig_EF_calo_accept));
-        ATH_MSG_DEBUG("HLT   : "  << int(m_trig_EF_el_accept));
- 
-      }else{
-        ATH_MSG_DEBUG("No TriggerElement for this probe!");
-      }
-      ATH_MSG_DEBUG("record probe information into the file.");
-      t->Fill();
-    }// loop over probes
-  } // End loop over trigger list
-
-  return true;
-}
-
-
-
-bool TrigEgammaNavTPNtuple::executeProbesSupportDump(){
-  
-  double GeV=1000.;
-  std::vector<const HLT::TriggerElement *> vec_feat;
-
-  // Tag and probe algorithm
-  executeTandP();
-
-  cd(m_dir+"/Expert/support");
-  TTree *t = tree( "probes", m_dir+"/Expert/support");
-  linkEventBranches(t); 
-  linkElectronBranches(t); 
-  linkMonteCarloBranches(t); 
-
-  for(const auto &eg : m_probeElectrons){
-    // Get the good electron
-    const xAOD::Electron* el =static_cast<const xAOD::Electron*> (eg);
-    // Force Et cut 
-    if(m_probeMinEt > 0.0){
-      if( !( getEt(el)  > (m_probeMinEt)*GeV) ) continue;
-    }
-    // Clear the vector
-    vec_feat.clear();
-    // Loop over support triggers: Here, we will collect all good trigger elements to 
-    // dump on the ttree.
-    for(auto& trigItem : m_trigList){
-
-      const HLT::TriggerElement *feat=nullptr;
-      // Trigger match using Matching tool
-      match()->match(el, trigItem, feat);
-
-      if(feat){// If has a match!
-        for(unsigned i=0; i < vec_feat.size(); ++i){
-          if(getFeature<xAOD::EmTauRoI>(vec_feat[i])->roiWord() == getFeature<xAOD::EmTauRoI>(feat)->roiWord()){
-            if(count_HLT_objects(feat) > count_HLT_objects(vec_feat[i])){
-              vec_feat.erase(vec_feat.begin() + i); // Erase the trigger element lowest than the new feature
-              vec_feat.push_back(feat); // attach the new trigger element
-              break;
-            }
-          }// The same region in L1Calo trigger
-        }
-        if(vec_feat.empty())  vec_feat.push_back(feat);
-      }else{
-        ATH_MSG_DEBUG("There is no match for this probe.");
-      }
-    }// Loop over support triggers
-
-    ATH_MSG_DEBUG("Attached " << vec_feat.size() << " features ");
-    for(auto& feat : vec_feat){
-      clear();
-      fillEvent();
-      fillElectron( el );  
-
-      if(!fillMonteCarlo( el ) ){
-        ATH_MSG_WARNING("Cound not found any TruthParticle for this Electron");
-      }
- 
-      ///Start trigger analisys...
-      const xAOD::EmTauRoI *emTauRoI = getFeature<xAOD::EmTauRoI>(feat);
-      if(emTauRoI){
-        fillEmTauRoI( emTauRoI ); 
-      }else{ 
-        ATH_MSG_WARNING("Cound not found EmTauRoI in this TriggerElement..");
-      }
-    
-      const xAOD::TrigEMCluster *emCluster = getFeature<xAOD::TrigEMCluster>(feat);
-      if(emCluster){
-    
-        if(!fillTrigEMCluster( emCluster )){
-          ATH_MSG_WARNING("Cound not attach the trigEMCluster information into the tree.");
-        }
-    
-        //if(TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, ringsContainer ,*m_trig_L2_calo_rings)){
-        if(!fillTrigCaloRings( emCluster )){
-          ATH_MSG_WARNING("Cound not attach the trigCaloRinger information into the tree.");
-        }
-      }///cluster protection
-    
-    
-      const xAOD::TrigElectronContainer *trigElCont = getFeature<xAOD::TrigElectronContainer>(feat);
-      // Level 2 ID+Calo
-      if(trigElCont){
-        for(const auto& trigEl : *trigElCont){
-          if(!fillTrigElectron(trigEl)) {
-            ATH_MSG_WARNING("Cound not attach the trigElectron information into the tree.");
-          }    
-        }// loop over all trigElectrons for this feat
-      }
-       
-      const xAOD::CaloClusterContainer *caloCont = getFeature<xAOD::CaloClusterContainer>(feat);
-      if(caloCont){
-        for(const auto& cl : *caloCont){
-          if(!fillCaloCluster(cl)){
-            ATH_MSG_WARNING("Cound not attach the CaloCluster information into the tree.");
-          }
-        }// loop over calo cluster
-      }
-
-      ATH_MSG_DEBUG("record trigger information into the file.");
-      t->Fill();
-    }//loop over trigger objects
-
-  }// Loop over probes
-  return true;
-}
-
-
-
-StatusCode TrigEgammaNavTPNtuple::childFinalize(){
-  //release_space();
-  return StatusCode::SUCCESS;
-}
-
-
-
-bool TrigEgammaNavTPNtuple::fillEmTauRoI( const xAOD::EmTauRoI *emTauRoI ){
-  
-  m_trig_L1_eta     = emTauRoI->eta();
-  m_trig_L1_phi     = emTauRoI->phi();
-  m_trig_L1_emClus  = emTauRoI->emClus();
-  m_trig_L1_tauClus = emTauRoI->tauClus();
-  m_trig_L1_emIsol  = emTauRoI->emIsol();
-  m_trig_L1_hadIsol = emTauRoI->hadIsol();
-  for(unsigned i=0; i < emTauRoI->thrNames().size();++i)  m_trig_L1_thrNames->push_back(emTauRoI->thrNames().at(i));
-  return true;
-} 
-
-bool TrigEgammaNavTPNtuple::fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster ){
-  
-  m_trig_L2_calo_et         = emCluster->et();
-  m_trig_L2_calo_eta        = emCluster->eta();
-  m_trig_L2_calo_phi        = emCluster->phi();
-  m_trig_L2_calo_e237       = emCluster->e237();
-  m_trig_L2_calo_e277       = emCluster->e277();
-  m_trig_L2_calo_fracs1     = emCluster->fracs1();
-  m_trig_L2_calo_weta2      = emCluster->weta2();
-  m_trig_L2_calo_ehad1      = emCluster->ehad1();
-  m_trig_L2_calo_emaxs1     = emCluster->emaxs1();
-  m_trig_L2_calo_e2tsts1    = emCluster->e2tsts1();
-  m_trig_L2_calo_wstot      = emCluster->wstot();
-  for(unsigned i=0; i<emCluster->energySample().size(); ++i){
-    m_trig_L2_calo_energySample->push_back( emCluster->energySample().at(i));
-  }
-
-  return true;
-}
-
-
-bool TrigEgammaNavTPNtuple::fillTrigElectron( const xAOD::TrigElectron *trigEl ){
-
-   const xAOD::TrackParticle* trkIter = trigEl->trackParticle();
-   if (trkIter==nullptr) return false; // disconsider candidates without track
-   int algoId = 0;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::FastTrackFinderSeed] ) algoId=9;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyA] )           algoId=5;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyB] )           algoId=6;
-   if ( trkIter->patternRecoInfo()[xAOD::TrackPatternRecoInfo::strategyC] )           algoId=7;
-
-   m_trig_L2_el_trackAlgID  ->push_back(algoId);
-   m_trig_L2_el_caloEta     ->push_back(trigEl->caloEta()); 
-   m_trig_L2_el_trkClusDphi ->push_back(trigEl->trkClusDphi());  
-   m_trig_L2_el_trkClusDeta ->push_back(trigEl->trkClusDeta());  
-   m_trig_L2_el_pt          ->push_back(trigEl->pt());
-   m_trig_L2_el_phi         ->push_back(trigEl->phi());  
-   m_trig_L2_el_eta         ->push_back(trigEl->eta());  
-   m_trig_L2_el_etOverPt    ->push_back(trigEl->etOverPt());          
-   m_trig_L2_el_nTRTHits    ->push_back(trigEl->nTRTHits());        
-   m_trig_L2_el_nTRTHiThresholdHits->push_back(trigEl->nTRTHiThresholdHits());
-   m_trig_L2_el_charge      ->push_back(trigEl->charge());      
-   return true;
-}
-
-
-bool TrigEgammaNavTPNtuple::fillCaloCluster( const xAOD::CaloCluster *cluster){
-
-  m_trig_EF_calo_et->push_back(cluster->et());
-  m_trig_EF_calo_eta->push_back(cluster->eta());
-  return true;
-}
-
-bool TrigEgammaNavTPNtuple::fillEvent(){
-  ///Event information
-  m_runNumber               = m_eventInfo->runNumber();
-  m_eventNumber             = m_eventInfo->eventNumber();
-  m_avgmu=getAvgMu();
-  return true;
-}
-
-bool TrigEgammaNavTPNtuple::fillElectron( const xAOD::Electron *el ){
-
-  ///Cluster information
-  m_el_et                   = el->pt();
-  m_el_eta                  = el->eta();
-  m_el_phi                  = el->phi();
-  el->showerShapeValue( m_el_ethad1   , xAOD::EgammaParameters::ShowerShapeType::ethad1   ); 
-  el->showerShapeValue( m_el_ehad1    , xAOD::EgammaParameters::ShowerShapeType::ehad1    );
-  el->showerShapeValue( m_el_f1       , xAOD::EgammaParameters::ShowerShapeType::f1       );
-  el->showerShapeValue( m_el_f3       , xAOD::EgammaParameters::ShowerShapeType::f3       );
-  el->showerShapeValue( m_el_f1core   , xAOD::EgammaParameters::ShowerShapeType::f1core   );
-  el->showerShapeValue( m_el_f3core   , xAOD::EgammaParameters::ShowerShapeType::f3core   );
-  el->showerShapeValue( m_el_weta2    , xAOD::EgammaParameters::ShowerShapeType::weta2    );
-  el->showerShapeValue( m_el_wtots1   , xAOD::EgammaParameters::ShowerShapeType::wtots1  );
-  el->showerShapeValue( m_el_fracs1   , xAOD::EgammaParameters::ShowerShapeType::fracs1   );
-  el->showerShapeValue( m_el_Reta     , xAOD::EgammaParameters::ShowerShapeType::Reta     );
-  el->showerShapeValue( m_el_Rphi     , xAOD::EgammaParameters::ShowerShapeType::Rphi     );
-  el->showerShapeValue( m_el_Eratio   , xAOD::EgammaParameters::ShowerShapeType::Eratio   );
-  el->showerShapeValue( m_el_Rhad     , xAOD::EgammaParameters::ShowerShapeType::Rhad     );
-  el->showerShapeValue( m_el_Rhad1    , xAOD::EgammaParameters::ShowerShapeType::Rhad1    );
-
-  ///Combined track/Cluter information
-  el->trackCaloMatchValue( m_el_deta1     , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta1   );
-  el->trackCaloMatchValue( m_el_deta2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaEta2   );
-  el->trackCaloMatchValue( m_el_dphi2     , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhi2   );
-  el->trackCaloMatchValue( m_el_dphiresc  , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled0 );
-  el->trackCaloMatchValue( m_el_dphiresc2 , xAOD::EgammaParameters::TrackCaloMatchType::deltaPhiRescaled2 );
-
-
-  ///Track particle information
-  const xAOD::TrackParticle *track = el->trackParticle();
-  if(track){
-    m_el_pt                   = track->pt();
-    m_el_d0                   = fabsf(track->d0());
-    m_el_charge               = el->charge();
-    
-    track->summaryValue( m_el_eprobht            , xAOD::SummaryType::eProbabilityHT );
-    track->summaryValue( m_el_nblayerhits        , xAOD::SummaryType::numberOfInnermostPixelLayerHits );
-    track->summaryValue( m_el_nblayerolhits      , xAOD::SummaryType::numberOfInnermostPixelLayerOutliers );
-    track->summaryValue( m_el_npixhits           , xAOD::SummaryType::numberOfPixelHits );
-    track->summaryValue( m_el_npixolhits         , xAOD::SummaryType::numberOfPixelOutliers );
-    track->summaryValue( m_el_nscthits           , xAOD::SummaryType::numberOfSCTHits );
-    track->summaryValue( m_el_nsctolhits         , xAOD::SummaryType::numberOfSCTOutliers );
-    track->summaryValue( m_el_ntrthightreshits   , xAOD::SummaryType::numberOfTRTHighThresholdHits );
-    track->summaryValue( m_el_ntrthits           , xAOD::SummaryType::numberOfTRTHits);
-    track->summaryValue( m_el_ntrthighthresolhits, xAOD::SummaryType::numberOfTRTHighThresholdOutliers );
-    track->summaryValue( m_el_ntrtolhits         , xAOD::SummaryType::numberOfTRTOutliers );
-    track->summaryValue( m_el_ntrtxenonhits      , xAOD::SummaryType::numberOfTRTXenonHits );
-    //track->summaryValue( m_el_expectblayerhit    , xAOD::SummaryType::expectInnermostPixelLayerHit );
-    track->summaryValue( m_el_npixdeadsensors    , xAOD::SummaryType::numberOfPixelDeadSensors);
-    track->summaryValue( m_el_nsctdeadsensors    , xAOD::SummaryType::numberOfSCTDeadSensors);
-
-    m_el_nsideadsensors       = m_el_npixdeadsensors  + m_el_nsctdeadsensors;
-    m_el_nsihits              = m_el_npixhits         + m_el_nscthits;
-  }
-
-  //m_el_loose              = el->passSelection("Loose");
-  //m_el_medium             = el->passSelection("Medium");
-  //m_el_tight              = el->passSelection("Tight");
-  //m_el_lhLoose            = el->passSelection("LHLoose");
-  //m_el_lhMedium           = el->passSelection("LHMedium");
-  //m_el_lhTight            = el->passSelection("LHTight"); 
-  //m_el_rgLoose            = el->passSelection("RGLoose");
-  //m_el_rgMedium           = el->passSelection("RGMedium");
-  //m_el_rgTight            = el->passSelection("RGTight");
-  //m_el_multiLepton        = el->passSelection("MultiLepton");
-  m_el_loose                = ApplyElectronPid(el, "Loose");
-  m_el_medium               = ApplyElectronPid(el, "Medium");
-  m_el_tight                = ApplyElectronPid(el, "Tight");
-  m_el_lhLoose              = ApplyElectronPid(el, "LHLoose");
-  m_el_lhMedium             = ApplyElectronPid(el, "LHMedium");
-  m_el_lhTight              = ApplyElectronPid(el, "LHTight"); 
-  //m_el_rgLoose            = ApplyElectronPid(el, "RGLoose");
-  //m_el_rgMedium           = ApplyElectronPid(el, "RGMedium");
-  //m_el_rgTight            = ApplyElectronPid(el, "RGTight");
-  
-  m_calo_et                 = getCluster_et( el );
-  m_calo_eta                = getCluster_eta( el );
-  m_calo_phi                = getCluster_phi( el );
-  ///Extra information about pileup
-  m_el_nGoodVtx             = getNGoodVertex();
-  m_el_nPileupPrimaryVtx    = getNPVtx();
-
-
-  if(!fillCaloRings( el )){
-    ATH_MSG_WARNING("Could not attach the calorRings information.");
-  }
-
-  return true;
-}
-
-
-/*bool TrigEgammaNavTPNtuple::fillPhoton( const xAOD::Photon *ph ){
-  return true;
-}*/
-
-
-bool TrigEgammaNavTPNtuple::fillMonteCarlo(const xAOD::Egamma *eg){
-
-  if(m_truthContainer){
-    const xAOD::TruthParticle *mc=nullptr;
-    MonteCarlo::PDGID pdg = pdgid(eg, m_truthContainer,mc);
-    if(mc){
-      m_mc_hasMC        = true;
-      m_mc_pt           = mc->pt();
-      m_mc_eta          = mc->eta();
-      m_mc_phi          = mc->phi();
-      m_mc_isTop        = mc->isTop();
-      m_mc_isQuark      = mc->isQuark();
-      m_mc_isParton     = mc->isParton();
-      m_mc_isMeson      = mc->isMeson();
-      m_mc_isTau        = mc->isTau();
-      m_mc_isMuon       = mc->isMuon();
-      m_mc_isPhoton     = mc->isPhoton();
-      m_mc_isElectron   = mc->isElectron();
-      if(pdg == MonteCarlo::PDGID::ZMother)  m_mc_hasZMother   = true;
-      if(pdg == MonteCarlo::PDGID::WMother)  m_mc_hasWMother   = true;
-      return true;
-    }//has match
-  }//has truth container
-  return false;
-}
-
-bool TrigEgammaNavTPNtuple::fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster ){
-  return TrigEgammaAnalysisBaseTool::getTrigCaloRings(emCluster, *m_trig_L2_calo_rings);
-}
-
-
-bool TrigEgammaNavTPNtuple::fillCaloRings( const xAOD::Electron *el ){
-  return TrigEgammaAnalysisBaseTool::getCaloRings(el, *m_el_ringsE );
-}
-
-/*
- * book, link, clear, alloc and release method divide in:
- * trigger, Egamma and MonteCarlo data base.
- */
-
-template <class T> 
-void TrigEgammaNavTPNtuple::InitBranch(TTree* fChain, std::string branch_name, T* param, bool message){
-
-  std::string bname = branch_name;
-  if (fChain->GetAlias(bname.c_str()))
-     bname = std::string(fChain->GetAlias(bname.c_str()));
-
-  if (!fChain->FindBranch(bname.c_str()) && message) {
-    ATH_MSG_WARNING("unknown branch " << bname);
-    return;  
-  }
-  fChain->SetBranchStatus(bname.c_str(), 1.);
-  fChain->SetBranchAddress(bname.c_str(), param);
-}
-
-void TrigEgammaNavTPNtuple::bookEventBranches(TTree *t){
-  
-  t->Branch("RunNumber",        &m_runNumber);
-  t->Branch("EventNumber",      &m_eventNumber);
-  t->Branch("avgmu",            &m_avgmu);
-}
-
-void TrigEgammaNavTPNtuple::bookTriggerBranches(TTree *t){
-
-  // Level L1 cluster
-  t->Branch( "trig_L1_eta",             &m_trig_L1_eta);
-  t->Branch( "trig_L1_phi",             &m_trig_L1_phi);
-  t->Branch( "trig_L1_emClus",          &m_trig_L1_emClus);
-  t->Branch( "trig_L1_tauClus",         &m_trig_L1_tauClus);
-  t->Branch( "trig_L1_emIsol",          &m_trig_L1_emIsol);
-  t->Branch( "trig_L1_hadIsol",         &m_trig_L1_hadIsol);
-  t->Branch( "trig_L1_thrNames",        &m_trig_L1_thrNames);
-  t->Branch( "trig_L1_accept",          &m_trig_L1_accept);
-  t->Branch( "trig_L2_calo_et",         &m_trig_L2_calo_et);
-  t->Branch( "trig_L2_calo_eta",        &m_trig_L2_calo_eta);
-  t->Branch( "trig_L2_calo_phi",        &m_trig_L2_calo_phi);
-  t->Branch( "trig_L2_calo_e237",       &m_trig_L2_calo_e237 );
-  t->Branch( "trig_L2_calo_e277",       &m_trig_L2_calo_e277 );
-  t->Branch( "trig_L2_calo_fracs1",     &m_trig_L2_calo_fracs1);
-  t->Branch( "trig_L2_calo_weta2",      &m_trig_L2_calo_weta2);
-  t->Branch( "trig_L2_calo_ehad1",      &m_trig_L2_calo_ehad1);
-  t->Branch( "trig_L2_calo_emaxs1",     &m_trig_L2_calo_emaxs1);
-  t->Branch( "trig_L2_calo_e2tsts1",    &m_trig_L2_calo_e2tsts1);
-  t->Branch( "trig_L2_calo_wstot",      &m_trig_L2_calo_wstot);
-  t->Branch( "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); 
-  t->Branch( "trig_L2_calo_rnnOutput",  &m_trig_L2_calo_rnnOutput ); 
-  t->Branch( "trig_L2_calo_rings",      &m_trig_L2_calo_rings ); 
-  t->Branch( "trig_L2_calo_accept",     &m_trig_L2_calo_accept);
-  t->Branch( "trig_L2_el_trackAlgID" ,         &m_trig_L2_el_trackAlgID );
-  t->Branch( "trig_L2_el_pt" ,                 &m_trig_L2_el_pt );
-  t->Branch( "trig_L2_el_eta",                 &m_trig_L2_el_eta);
-  t->Branch( "trig_L2_el_phi",                 &m_trig_L2_el_phi );
-  t->Branch( "trig_L2_el_caloEta",             &m_trig_L2_el_caloEta );
-  t->Branch( "trig_L2_el_charge",              &m_trig_L2_el_charge);
-  t->Branch( "trig_L2_el_nTRTHits",            &m_trig_L2_el_nTRTHits);
-  t->Branch( "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits);
-  t->Branch( "trig_L2_el_etOverPt" ,           &m_trig_L2_el_etOverPt );
-  t->Branch( "trig_L2_el_trkClusDeta" ,        &m_trig_L2_el_trkClusDeta );
-  t->Branch( "trig_L2_el_trkClusDphi" ,        &m_trig_L2_el_trkClusDphi );
-  t->Branch( "trig_L2_el_accept",       &m_trig_L2_el_accept );
-  t->Branch( "trig_EF_calo_accept",     &m_trig_EF_calo_accept);
-  t->Branch( "trig_EF_calo_et",         &m_trig_EF_calo_et);
-  t->Branch( "trig_EF_calo_eta",        &m_trig_EF_calo_eta);
-  t->Branch( "trig_EF_el_accept",       &m_trig_EF_el_accept);
-}
-
-void TrigEgammaNavTPNtuple::bookElectronBranches(TTree *t){
- 
-  t->Branch("el_et",                    &m_el_et);
-  t->Branch("el_pt",                    &m_el_pt);
-  t->Branch("el_eta",                   &m_el_eta);
-  t->Branch("el_phi",                   &m_el_phi);
-  t->Branch("el_ethad1",                &m_el_ethad1);
-  t->Branch("el_ehad1",                 &m_el_ehad1);
-  t->Branch("el_f1",                    &m_el_f1);
-  t->Branch("el_f3",                    &m_el_f3);
-  t->Branch("el_f1core",                &m_el_f1core);
-  t->Branch("el_f3core",                &m_el_f3core);
-  t->Branch("el_weta2",                 &m_el_weta2);
-  t->Branch("el_d0",                    &m_el_d0);
-  t->Branch("el_wtots1",                &m_el_wtots1);
-  t->Branch("el_fracs1",                &m_el_fracs1);
-  t->Branch("el_Reta",                  &m_el_Reta);
-  t->Branch("el_Rphi",                  &m_el_Rphi);
-  t->Branch("el_Eratio",                &m_el_Eratio);
-  t->Branch("el_Rhad",                  &m_el_Rhad);
-  t->Branch("el_Rhad1",                 &m_el_Rhad1);
-  t->Branch("el_deta1",                 &m_el_deta1);
-  t->Branch("el_deta2",                 &m_el_deta2);
-  t->Branch("el_dphi2",                 &m_el_dphi2);
-  t->Branch("el_dphiresc",              &m_el_dphiresc);
-  t->Branch("el_dphiresc2",             &m_el_dphiresc2);
-  t->Branch("el_eprobht",               &m_el_eprobht);
-  t->Branch("el_charge",                &m_el_charge);
-  t->Branch("el_nblayerhits",           &m_el_nblayerhits);
-  t->Branch("el_nblayerolhits",         &m_el_nblayerolhits);
-  t->Branch("el_npixhits",              &m_el_npixhits);
-  t->Branch("el_npixolhits",            &m_el_npixolhits);
-  t->Branch("el_nscthits",              &m_el_nscthits);
-  t->Branch("el_nsctolhits",            &m_el_nsctolhits);
-  t->Branch("el_ntrthightreshits",      &m_el_ntrthightreshits);
-  t->Branch("el_ntrthits",              &m_el_ntrthits);
-  t->Branch("el_ntrthighthresolhits",   &m_el_ntrthighthresolhits);
-  t->Branch("el_ntrtolhits",            &m_el_ntrtolhits);
-  t->Branch("el_ntrtxenonhits",         &m_el_ntrtxenonhits);
-  t->Branch("el_expectblayerhit",       &m_el_expectblayerhit); 
-  t->Branch("el_nsihits",               &m_el_nsihits          );
-  t->Branch("el_nsideadsensors",        &m_el_nsideadsensors   );
-  t->Branch("el_npixdeadsensors",       &m_el_npixdeadsensors  );
-  t->Branch("el_nsctdeadsensors",       &m_el_nsctdeadsensors  );
-  t->Branch("el_ringsE",                &m_el_ringsE );
-  t->Branch("el_loose",                 &m_el_loose  );
-  t->Branch("el_medium",                &m_el_medium );
-  t->Branch("el_tight",                 &m_el_tight );
-  t->Branch("el_lhLoose",               &m_el_lhLoose );
-  t->Branch("el_lhMedium",              &m_el_lhMedium ); 
-  t->Branch("el_lhTight",               &m_el_lhTight ); 
-  t->Branch("el_rgLoose",               &m_el_rgLoose );
-  t->Branch("el_rgMedium",              &m_el_rgMedium ); 
-  t->Branch("el_rgTight",               &m_el_rgTight ); 
-  t->Branch("el_multiLepton",           &m_el_multiLepton);
-  t->Branch("el_nGoodVtx",              &m_el_nGoodVtx);
-  t->Branch("el_nPileupPrimaryVtx",     &m_el_nPileupPrimaryVtx);
-  t->Branch("calo_et",                  &m_calo_et);
-  t->Branch("calo_eta",                 &m_calo_eta);
-  t->Branch("calo_phi",                 &m_calo_phi);
- 
-}
-
-
-/*void TrigEgammaNavTPNtuple::bookPhotonBranches(TTree *t){
-} */ 
-  
-void TrigEgammaNavTPNtuple::bookMonteCarloBranches(TTree *t){
-  // Monte Carlo
-  t->Branch("mc_hasMC",       &m_mc_hasMC);
-  t->Branch("mc_pt",          &m_mc_pt);
-  t->Branch("mc_eta",         &m_mc_eta);
-  t->Branch("mc_phi",         &m_mc_phi);
-  t->Branch("mc_isTop",       &m_mc_isTop);
-  t->Branch("mc_isParton",    &m_mc_isParton);
-  t->Branch("mc_isMeson",     &m_mc_isMeson);
-  t->Branch("mc_isTau",       &m_mc_isTau);
-  t->Branch("mc_isMuon",      &m_mc_isMuon);
-  t->Branch("mc_isPhoton",    &m_mc_isPhoton);
-  t->Branch("mc_isElectron",  &m_mc_isElectron);
-  t->Branch("mc_hasZMother",  &m_mc_hasZMother);
-  t->Branch("mc_hasWMother",  &m_mc_hasWMother);
-}
-
-void TrigEgammaNavTPNtuple::linkEventBranches(TTree *t){
-  
-  InitBranch( t, "RunNumber",        &m_runNumber);
-  InitBranch( t, "EventNumber",      &m_eventNumber);
-  InitBranch( t, "avgmu",            &m_avgmu);
-}
-
-void TrigEgammaNavTPNtuple::linkElectronBranches( TTree *t ){
-  
-  InitBranch( t, "el_et",                    &m_el_et);
-  InitBranch( t, "el_pt",                    &m_el_pt);
-  InitBranch( t, "el_eta",                   &m_el_eta);
-  InitBranch( t, "el_phi",                   &m_el_phi);
-  InitBranch( t, "el_ethad1",                &m_el_ethad1);
-  InitBranch( t, "el_ehad1",                 &m_el_ehad1);
-  InitBranch( t, "el_f1",                    &m_el_f1);
-  InitBranch( t, "el_f3",                    &m_el_f3);
-  InitBranch( t, "el_f1core",                &m_el_f1core);
-  InitBranch( t, "el_f3core",                &m_el_f3core);
-  InitBranch( t, "el_weta2",                 &m_el_weta2);
-  InitBranch( t, "el_d0",                    &m_el_d0);
-  InitBranch( t, "el_wtots1",                &m_el_wtots1);
-  InitBranch( t, "el_fracs1",                &m_el_fracs1);
-  InitBranch( t, "el_Reta",                  &m_el_Reta);
-  InitBranch( t, "el_Rphi",                  &m_el_Rphi);
-  InitBranch( t, "el_Eratio",                &m_el_Eratio);
-  InitBranch( t, "el_Rhad",                  &m_el_Rhad);
-  InitBranch( t, "el_Rhad1",                 &m_el_Rhad1);
-  InitBranch( t, "el_deta1",                 &m_el_deta1);
-  InitBranch( t, "el_deta2",                 &m_el_deta2);
-  InitBranch( t, "el_dphi2",                 &m_el_dphi2);
-  InitBranch( t, "el_dphiresc",              &m_el_dphiresc);
-  InitBranch( t, "el_dphiresc2",             &m_el_dphiresc2);
-  InitBranch( t, "el_eprobht",               &m_el_eprobht);
-  InitBranch( t, "el_charge",                &m_el_charge);
-  InitBranch( t, "el_nblayerhits",           &m_el_nblayerhits);
-  InitBranch( t, "el_nblayerolhits",         &m_el_nblayerolhits);
-  InitBranch( t, "el_npixhits",              &m_el_npixhits);
-  InitBranch( t, "el_npixolhits",            &m_el_npixolhits);
-  InitBranch( t, "el_nscthits",              &m_el_nscthits);
-  InitBranch( t, "el_nsctolhits",            &m_el_nsctolhits);
-  InitBranch( t, "el_ntrthightreshits",      &m_el_ntrthightreshits);
-  InitBranch( t, "el_ntrthits",              &m_el_ntrthits);
-  InitBranch( t, "el_ntrthighthresolhits",   &m_el_ntrthighthresolhits);
-  InitBranch( t, "el_ntrtolhits",            &m_el_ntrtolhits);
-  InitBranch( t, "el_ntrtxenonhits",         &m_el_ntrtxenonhits);
-  InitBranch( t, "el_expectblayerhit",       &m_el_expectblayerhit); 
-  InitBranch( t, "el_nsihits",               &m_el_nsihits          );
-  InitBranch( t, "el_nsideadsensors",        &m_el_nsideadsensors   );
-  InitBranch( t, "el_npixdeadsensors",       &m_el_npixdeadsensors  );
-  InitBranch( t, "el_nsctdeadsensors",       &m_el_nsctdeadsensors  );
-  InitBranch( t, "el_ringsE",                &m_el_ringsE );
-  InitBranch( t, "el_loose",                 &m_el_loose  );
-  InitBranch( t, "el_medium",                &m_el_medium );
-  InitBranch( t, "el_tight",                 &m_el_tight );
-  InitBranch( t, "el_lhLoose",               &m_el_lhLoose );
-  InitBranch( t, "el_lhMedium",              &m_el_lhMedium ); 
-  InitBranch( t, "el_lhTight",               &m_el_lhTight ); 
-  InitBranch( t, "el_rgLoose",               &m_el_rgLoose );
-  InitBranch( t, "el_rgMedium",              &m_el_rgMedium ); 
-  InitBranch( t, "el_rgTight",               &m_el_rgTight ); 
-  InitBranch( t, "el_multiLepton",           &m_el_multiLepton);
-  InitBranch( t, "el_nGoodVtx",              &m_el_nGoodVtx);
-  InitBranch( t, "el_nPileupPrimaryVtx",     &m_el_nPileupPrimaryVtx);
-  InitBranch( t, "calo_et",                  &m_calo_et);
-  InitBranch( t, "calo_eta",                 &m_calo_eta);
-  InitBranch( t, "calo_phi",                 &m_calo_phi);
-
-}
-
-
-/*void TrigEgammaNavTPNtuple::linkPhotonBranches( TTree *t ){
-}*/
-
-void TrigEgammaNavTPNtuple::linkTriggerBranches( TTree *t ){
-
-  InitBranch(t, "trig_L1_eta",             &m_trig_L1_eta);
-  InitBranch(t, "trig_L1_phi",             &m_trig_L1_phi);
-  InitBranch(t, "trig_L1_emClus",          &m_trig_L1_emClus);
-  InitBranch(t, "trig_L1_tauClus",         &m_trig_L1_tauClus);
-  InitBranch(t, "trig_L1_emIsol",          &m_trig_L1_emIsol);
-  InitBranch(t, "trig_L1_hadIsol",         &m_trig_L1_hadIsol);
-  InitBranch(t, "trig_L1_thrNames",        &m_trig_L1_thrNames);
-  InitBranch(t, "trig_L1_accept",          &m_trig_L1_accept);
-  InitBranch(t, "trig_L2_calo_et",         &m_trig_L2_calo_et);
-  InitBranch(t, "trig_L2_calo_eta",        &m_trig_L2_calo_eta);
-  InitBranch(t, "trig_L2_calo_phi",        &m_trig_L2_calo_phi);
-  InitBranch(t, "trig_L2_calo_e237",       &m_trig_L2_calo_e237 );
-  InitBranch(t, "trig_L2_calo_e277",       &m_trig_L2_calo_e277 );
-  InitBranch(t, "trig_L2_calo_fracs1",     &m_trig_L2_calo_fracs1);
-  InitBranch(t, "trig_L2_calo_weta2",      &m_trig_L2_calo_weta2);
-  InitBranch(t, "trig_L2_calo_ehad1",      &m_trig_L2_calo_ehad1);
-  InitBranch(t, "trig_L2_calo_emaxs1",     &m_trig_L2_calo_emaxs1);
-  InitBranch(t, "trig_L2_calo_e2tsts1",    &m_trig_L2_calo_e2tsts1);
-  InitBranch(t, "trig_L2_calo_wstot",      &m_trig_L2_calo_wstot);
-  InitBranch(t, "trig_L2_calo_rnnOutput",      &m_trig_L2_calo_rnnOutput ); 
-  InitBranch(t, "trig_L2_calo_rings",      &m_trig_L2_calo_rings ); 
-  InitBranch(t, "trig_L2_calo_energySample",&m_trig_L2_calo_energySample ); 
-  InitBranch(t, "trig_L2_calo_accept",     &m_trig_L2_calo_accept);
-
-  InitBranch(t, "trig_L2_el_trackAlgID" ,         &m_trig_L2_el_trackAlgID );
-  InitBranch(t, "trig_L2_el_pt" ,                 &m_trig_L2_el_pt );
-  InitBranch(t, "trig_L2_el_eta",                 &m_trig_L2_el_eta);
-  InitBranch(t, "trig_L2_el_phi",                 &m_trig_L2_el_phi );
-  InitBranch(t, "trig_L2_el_caloEta",             &m_trig_L2_el_caloEta );
-  InitBranch(t, "trig_L2_el_charge",              &m_trig_L2_el_charge);
-  InitBranch(t, "trig_L2_el_nTRTHits",            &m_trig_L2_el_nTRTHits);
-  InitBranch(t, "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits);
-  InitBranch(t, "trig_L2_el_etOverPt" ,           &m_trig_L2_el_etOverPt );
-  InitBranch(t, "trig_L2_el_trkClusDeta" ,        &m_trig_L2_el_trkClusDeta );
-  InitBranch(t, "trig_L2_el_trkClusDphi" ,        &m_trig_L2_el_trkClusDphi );
-
-  InitBranch(t, "trig_L2_el_accept",       &m_trig_L2_el_accept );
-  InitBranch(t, "trig_EF_el_accept",       &m_trig_EF_el_accept );
-  InitBranch(t, "trig_EF_calo_accept",     &m_trig_EF_calo_accept );
-  InitBranch(t, "trig_EF_calo_et",         &m_trig_EF_calo_et );
-  InitBranch(t, "trig_EF_calo_eta",        &m_trig_EF_calo_eta );
- 
-}
-
-
-void TrigEgammaNavTPNtuple::linkMonteCarloBranches(TTree *t){
- 
-  InitBranch(t, "mc_hasMC",       &m_mc_hasMC);
-  InitBranch(t, "mc_pt",          &m_mc_pt);
-  InitBranch(t, "mc_eta",         &m_mc_eta);
-  InitBranch(t, "mc_phi",         &m_mc_phi);
-  InitBranch(t, "mc_isTop",       &m_mc_isTop);
-  InitBranch(t, "mc_isParton",    &m_mc_isParton);
-  InitBranch(t, "mc_isMeson",     &m_mc_isMeson);
-  InitBranch(t, "mc_isTau",       &m_mc_isTau);
-  InitBranch(t, "mc_isMuon",      &m_mc_isMuon);
-  InitBranch(t, "mc_isPhoton",    &m_mc_isPhoton);
-  InitBranch(t, "mc_isElectron",  &m_mc_isElectron);
-  InitBranch(t, "mc_hasZMother",  &m_mc_hasZMother);
-  InitBranch(t, "mc_hasWMother",  &m_mc_hasWMother); 
-}
-
-void TrigEgammaNavTPNtuple::clear(){
-
-  ///EventInfo
-  m_runNumber             = 0;
-  m_eventNumber           = 0;
-  m_avgmu                 = 0;
-  ///Egamma
-  m_el_et                 = -1;
-  m_el_pt                 = -1;
-  m_el_eta                = -1;
-  m_el_phi                = -1;
-  m_el_ethad1             = -1;
-  m_el_ehad1              = -1;
-  m_el_f1                 = -1;
-  m_el_f3                 = -1;
-  m_el_f1core             = -1;
-  m_el_f3core             = -1;
-  m_el_weta2              = -1;
-  m_el_d0                 = -1;
-  m_el_wtots1             = -1;
-  m_el_fracs1             = -1;
-  m_el_Reta               = -1;
-  m_el_Rphi               = -1;
-  m_el_Eratio             = -1;
-  m_el_Rhad               = -1;
-  m_el_Rhad1              = -1;
-  m_el_deta1              = -1;
-  m_el_deta2              = -1;
-  m_el_dphi2              = -1;
-  m_el_dphiresc           = -1;
-  m_el_dphiresc2          = -1;
-  m_el_eprobht            = -1;
-  m_el_charge             =  0;
-  m_el_nblayerhits        =  0;
-  m_el_nblayerolhits      =  0;
-  m_el_npixhits           =  0;
-  m_el_npixolhits         =  0;
-  m_el_nscthits           =  0;
-  m_el_nsctolhits         =  0;
-  m_el_ntrthightreshits   =  0;
-  m_el_ntrthits           =  0;
-  m_el_ntrthighthresolhits=  0;
-  m_el_ntrtolhits         =  0;
-  m_el_ntrtxenonhits      =  0;
-  m_el_expectblayerhit    =  false;
-  m_el_nsihits            =  0;
-  m_el_nsideadsensors     =  0;
-  m_el_npixdeadsensors    =  0;
-  m_el_nsctdeadsensors    =  0;
-  m_el_loose              = false; 
-  m_el_medium             = false; 
-  m_el_tight              = false; 
-  m_el_lhLoose            = false; 
-  m_el_lhMedium           = false; 
-  m_el_lhTight            = false;  
-  m_el_rgLoose            = false; 
-  m_el_rgMedium           = false; 
-  m_el_rgTight            = false;  
-  m_el_multiLepton        = false;
-  m_el_nGoodVtx           = -1;
-  m_el_nPileupPrimaryVtx  = -1;
-  m_calo_et               = -1; 
-  m_calo_eta              = -1; 
-  m_calo_phi              = -1; 
-
-  ///Trigger
-  m_trig_L1_eta           = -1;
-  m_trig_L1_phi           = -1;
-  m_trig_L1_emClus        = -1;
-  m_trig_L1_tauClus       = -1;
-  m_trig_L1_emIsol        = -1;
-  m_trig_L1_hadIsol       = -1;
-  m_trig_L1_accept        = false;
-  m_trig_L2_calo_et       = -1;
-  m_trig_L2_calo_eta      = -1;
-  m_trig_L2_calo_phi      = -1;
-  m_trig_L2_calo_e237     = -1;
-  m_trig_L2_calo_e277     = -1;
-  m_trig_L2_calo_fracs1   = -1;
-  m_trig_L2_calo_weta2    = -1;
-  m_trig_L2_calo_ehad1    = -1;
-  m_trig_L2_calo_emaxs1   = -1;
-  m_trig_L2_calo_e2tsts1  = -1;
-  m_trig_L2_calo_wstot    = -1; 
-  m_trig_L2_calo_rnnOutput    = 999; 
-
-  m_trig_L1_accept        = false;
-  m_trig_L2_calo_accept   = false;
-  m_trig_L2_el_accept     = false; 
-  m_trig_EF_calo_accept   = false;
-  m_trig_EF_el_accept     = false;
-
-  ///Monte Carlo
-  m_mc_hasMC              = false;
-  m_mc_pt                 = -1;
-  m_mc_eta                = -1;
-  m_mc_phi                = -1;
-  m_mc_isTop              = false;
-  m_mc_isParton           = false;
-  m_mc_isMeson            = false;
-  m_mc_isTau              = false;
-  m_mc_isMuon             = false;
-  m_mc_isPhoton           = false;
-  m_mc_isElectron         = false;
-  m_mc_hasZMother         = false;
-  m_mc_hasWMother         = false;
-
-  ///Some vectors
-  m_trig_L1_thrNames                ->clear(); 
-  m_trig_L2_calo_energySample       ->clear();
-  m_trig_L2_calo_rings              ->clear();  
-
-  m_trig_L2_el_trackAlgID          ->clear(); 
-  m_trig_L2_el_eta                 ->clear(); 
-  m_trig_L2_el_phi                 ->clear(); 
-  m_trig_L2_el_caloEta             ->clear(); 
-  m_trig_L2_el_trkClusDeta         ->clear(); 
-  m_trig_L2_el_trkClusDphi         ->clear(); 
-  m_trig_L2_el_pt                  ->clear(); 
-  m_trig_L2_el_etOverPt            ->clear();         
-  m_trig_L2_el_nTRTHits            ->clear();       
-  m_trig_L2_el_nTRTHiThresholdHits ->clear();       
-  m_trig_L2_el_charge              ->clear();     
-  m_trig_EF_calo_et                ->clear();  
-  m_trig_EF_calo_eta               ->clear();  
- 
-
-}
-
-void TrigEgammaNavTPNtuple::alloc_space(){
-
-  m_el_ringsE                       = new std::vector<float>();
-  m_trig_L1_thrNames                = new std::vector<std::string>();
-  m_trig_L2_calo_energySample       = new std::vector<float>();
-  m_trig_L2_calo_rings              = new std::vector<float>();
-  m_trig_L2_el_trackAlgID           = new std::vector<int>();
-  m_trig_L2_el_eta                  = new std::vector<float>();   
-  m_trig_L2_el_phi                  = new std::vector<float>();   
-  m_trig_L2_el_caloEta              = new std::vector<float>();   
-  m_trig_L2_el_trkClusDeta          = new std::vector<float>();
-  m_trig_L2_el_trkClusDphi          = new std::vector<float>();
-  m_trig_L2_el_pt                   = new std::vector<float>();   
-  m_trig_L2_el_etOverPt             = new std::vector<float>();           
-  m_trig_L2_el_nTRTHits             = new std::vector<float>();         
-  m_trig_L2_el_nTRTHiThresholdHits  = new std::vector<float>();         
-  m_trig_L2_el_charge               = new std::vector<float>();       
-  m_trig_EF_calo_et                 = new std::vector<float>();       
-  m_trig_EF_calo_eta                = new std::vector<float>();       
-  
-}
-
-
-void TrigEgammaNavTPNtuple::release_space(){
-  delete m_el_ringsE              ;
-  delete m_trig_L1_thrNames       ;
-  delete m_trig_L2_calo_energySample;
-  delete m_trig_L2_calo_rings     ;
-  delete m_trig_L2_el_trackAlgID  ;  
-  delete m_trig_L2_el_pt          ;  
-  delete m_trig_L2_el_eta         ;   
-  delete m_trig_L2_el_caloEta     ;   
-  delete m_trig_L2_el_phi         ;   
-  delete m_trig_L2_el_charge      ;       
-  delete m_trig_L2_el_nTRTHits    ;         
-  delete m_trig_L2_el_nTRTHiThresholdHits ;         
-  delete m_trig_L2_el_etOverPt    ;           
-  delete m_trig_L2_el_trkClusDeta ;
-  delete m_trig_L2_el_trkClusDphi ;
-  delete m_trig_EF_calo_et        ;
-  delete m_trig_EF_calo_eta       ;
-}
-
-unsigned TrigEgammaNavTPNtuple::count_HLT_objects( const HLT::TriggerElement *feat )
-{
-  unsigned nobj=0;
-  if(getFeature<xAOD::ElectronContainer>(feat)    ) nobj++; // HLT
-  if(getFeature<xAOD::CaloClusterContainer>(feat) ) nobj++; // EFCalo
-  if(getFeature<xAOD::TrigElectronContainer>(feat)) nobj++; // L2
-  if(getFeature<xAOD::TrigEMCluster>(feat)        ) nobj++; // L2Calo
-  ATH_MSG_DEBUG("Number of objects counted in this feature: " << nobj);
-  return nobj;
-}
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..c5c99d9f982b87994d37284f574100e4f1a8090a
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPhysValBase.cxx
@@ -0,0 +1,1005 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include <iostream>
+#include "TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h"
+using namespace std;
+
+TrigEgammaPhysValBase::TrigEgammaPhysValBase(){
+ 
+  m_el_ringsE=nullptr;
+  m_trig_L1_thrNames=nullptr;          
+  m_trig_L2_calo_energySample=nullptr;
+  m_trig_L2_calo_rings=nullptr;
+  m_trig_L2_el_trackAlgID=nullptr;
+  m_trig_L2_el_pt=nullptr;
+  m_trig_L2_el_eta=nullptr;
+  m_trig_L2_el_caloEta=nullptr;
+  m_trig_L2_el_phi=nullptr;
+  m_trig_L2_el_charge=nullptr;
+  m_trig_L2_el_nTRTHits=nullptr;
+  m_trig_L2_el_nTRTHiThresholdHits=nullptr;
+  m_trig_L2_el_etOverPt=nullptr;
+  m_trig_L2_el_trkClusDeta=nullptr;
+  m_trig_L2_el_trkClusDphi=nullptr;
+  m_trig_EF_calo_et=nullptr;
+  m_trig_EF_calo_eta=nullptr;
+  
+  m_doMCDetailed=false;
+  m_doL2Detailed=false;
+  m_doL2CaloDetailed=false;
+  m_doRecoDetailed=false;
+}
+
+/*
+ * book, link, clear, alloc and release method divide in:
+ * trigger, Egamma and MonteCarlo data base.
+ */
+template <class T> 
+void TrigEgammaPhysValBase::InitBranch(TTree* fChain, std::string branch_name, T* param, bool message){
+
+  std::string bname = branch_name;
+  if (fChain->GetAlias(bname.c_str()))
+     bname = std::string(fChain->GetAlias(bname.c_str()));
+
+  if (!fChain->FindBranch(bname.c_str()) && message) {
+    return;  
+  }
+  fChain->SetBranchStatus(bname.c_str(), 1.);
+  fChain->SetBranchAddress(bname.c_str(), param);
+}
+
+void TrigEgammaPhysValBase::bookEventBranches(TTree *t){
+  
+  t->Branch("RunNumber",        &m_runNumber);
+  t->Branch("EventNumber",      &m_eventNumber);
+  t->Branch("LumiBlock",        &m_lumiBlock);
+  t->Branch("avgmu",            &m_avgmu);
+}
+
+void TrigEgammaPhysValBase::bookTriggerBranches(TTree *t){
+
+  // Level L1 cluster
+  t->Branch( "trig_L1_eta",             &m_trig_L1_eta);
+  t->Branch( "trig_L1_phi",             &m_trig_L1_phi);
+  t->Branch( "trig_L1_emClus",          &m_trig_L1_emClus);
+  t->Branch( "trig_L1_tauClus",         &m_trig_L1_tauClus);
+  t->Branch( "trig_L1_emIsol",          &m_trig_L1_emIsol);
+  t->Branch( "trig_L1_hadIsol",         &m_trig_L1_hadIsol);
+  t->Branch( "trig_L1_hadCore",         &m_trig_L1_hadCore);
+  t->Branch( "trig_L2_calo_et",         &m_trig_L2_calo_et);
+  t->Branch( "trig_L2_calo_eta",        &m_trig_L2_calo_eta);
+  t->Branch( "trig_L2_calo_phi",        &m_trig_L2_calo_phi);
+  
+  if(m_doL2CaloDetailed){
+    t->Branch( "trig_L2_calo_e237",       &m_trig_L2_calo_e237 );
+    t->Branch( "trig_L2_calo_e277",       &m_trig_L2_calo_e277 );
+    t->Branch( "trig_L2_calo_fracs1",     &m_trig_L2_calo_fracs1);
+    t->Branch( "trig_L2_calo_weta2",      &m_trig_L2_calo_weta2);
+    t->Branch( "trig_L2_calo_ehad1",      &m_trig_L2_calo_ehad1);
+    t->Branch( "trig_L2_calo_emaxs1",     &m_trig_L2_calo_emaxs1);
+    t->Branch( "trig_L2_calo_e2tsts1",    &m_trig_L2_calo_e2tsts1);
+    t->Branch( "trig_L2_calo_wstot",      &m_trig_L2_calo_wstot);
+    t->Branch( "trig_L2_calo_energySample",&m_trig_L2_calo_energySample);
+  }
+
+  t->Branch( "trig_L2_calo_rings",      &m_trig_L2_calo_rings ); 
+  t->Branch( "trig_L2_calo_rnnOutput",  &m_trig_L2_calo_rnnOutput ); 
+ 
+
+  if(m_doL2Detailed){
+    t->Branch( "trig_L2_el_pt" ,                 &m_trig_L2_el_pt );
+    t->Branch( "trig_L2_el_eta",                 &m_trig_L2_el_eta);
+    t->Branch( "trig_L2_el_phi",                 &m_trig_L2_el_phi );
+    t->Branch( "trig_L2_el_caloEta",             &m_trig_L2_el_caloEta );
+    t->Branch( "trig_L2_el_charge",              &m_trig_L2_el_charge);
+    t->Branch( "trig_L2_el_nTRTHits",            &m_trig_L2_el_nTRTHits);
+    t->Branch( "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits);
+    t->Branch( "trig_L2_el_etOverPt" ,           &m_trig_L2_el_etOverPt );
+    t->Branch( "trig_L2_el_trkClusDeta" ,        &m_trig_L2_el_trkClusDeta );
+    t->Branch( "trig_L2_el_trkClusDphi" ,        &m_trig_L2_el_trkClusDphi );
+    t->Branch( "trig_L2_el_trackAlgID" ,         &m_trig_L2_el_trackAlgID );
+  }
+
+  t->Branch( "trig_EF_calo_e",            &m_trig_EF_calo_e       );
+  t->Branch( "trig_EF_calo_et",           &m_trig_EF_calo_et      );
+  t->Branch( "trig_EF_calo_eta",          &m_trig_EF_calo_eta     );
+  t->Branch( "trig_EF_calo_phi",          &m_trig_EF_calo_phi     );
+  t->Branch( "trig_EF_calo_etaBE2",       &m_trig_EF_calo_etaBE2  );
+
+#define BRANCH(_name_) t->Branch( #_name_ , & m_##_name_ );\
+
+  BRANCH( trig_EF_calo_tight                      );
+  BRANCH( trig_EF_calo_medium                     );
+  BRANCH( trig_EF_calo_loose                      );
+  BRANCH( trig_EF_calo_lhtight                    );
+  BRANCH( trig_EF_calo_lhmedium                   );
+  BRANCH( trig_EF_calo_lhloose                    );
+  BRANCH( trig_EF_calo_lhvloose                   );
+ 
+  BRANCH( trig_EF_el_calo_e                       ); 
+  BRANCH( trig_EF_el_calo_et                      ); 
+  BRANCH( trig_EF_el_calo_eta                     ); 
+  BRANCH( trig_EF_el_calo_phi                     ); 
+  BRANCH( trig_EF_el_calo_etaBE2                  ); 
+
+  BRANCH( trig_EF_el_hasCalo                      ); 
+  BRANCH( trig_EF_el_hasTrack                     ); 
+  BRANCH( trig_EF_el_e                            ); 
+  BRANCH( trig_EF_el_et                           ); 
+  BRANCH( trig_EF_el_eta                          ); 
+  BRANCH( trig_EF_el_phi                          ); 
+  BRANCH( trig_EF_el_e277                         ); 
+  BRANCH( trig_EF_el_ethad1                       ); 
+  BRANCH( trig_EF_el_ehad1                        ); 
+  BRANCH( trig_EF_el_f1                           ); 
+  BRANCH( trig_EF_el_f3                           ); 
+  BRANCH( trig_EF_el_f1core                       ); 
+  BRANCH( trig_EF_el_f3core                       ); 
+  BRANCH( trig_EF_el_weta1                        ); 
+  BRANCH( trig_EF_el_weta2                        ); 
+  BRANCH( trig_EF_el_wtots1                       ); 
+  BRANCH( trig_EF_el_fracs1                       ); 
+  BRANCH( trig_EF_el_Reta                         ); 
+  BRANCH( trig_EF_el_Rphi                         ); 
+  BRANCH( trig_EF_el_Eratio                       ); 
+  BRANCH( trig_EF_el_Rhad                         ); 
+  BRANCH( trig_EF_el_Rhad1                        ); 
+  BRANCH( trig_EF_el_deta2                        ); 
+  BRANCH( trig_EF_el_dphi2                        ); 
+  BRANCH( trig_EF_el_dphiresc                     ); 
+  BRANCH( trig_EF_el_deltaPhiRescaled2            ); 
+  BRANCH( trig_EF_el_deltaEta1                    ); 
+  BRANCH( trig_EF_el_deltaE                       ); 
+  BRANCH( trig_EF_el_etCone                       ); 
+  BRANCH( trig_EF_el_ptCone                       ); 
+ 
+  BRANCH( trig_EF_el_trk_pt                           ); 
+  BRANCH( trig_EF_el_trk_eta                         ); 
+  BRANCH( trig_EF_el_trk_charge                       ); 
+  BRANCH( trig_EF_el_trk_qOverP                       ); 
+  BRANCH( trig_EF_el_trk_sigd0                        ); 
+  BRANCH( trig_EF_el_trk_d0                           ); 
+  BRANCH( trig_EF_el_trk_eProbabilityHT               ); 
+  BRANCH( trig_EF_el_trk_transformed_eProbabilityHT   ); 
+  BRANCH( trig_EF_el_trk_d0significance               ); 
+  BRANCH( trig_EF_el_trk_deltaPOverP                  ); 
+  BRANCH( trig_EF_el_trk_summaryValues                ); 
+  
+  BRANCH( trig_EF_el_tight                        );
+  BRANCH( trig_EF_el_medium                       );
+  BRANCH( trig_EF_el_loose                        );
+  BRANCH( trig_EF_el_lhtight                      );
+  BRANCH( trig_EF_el_lhmedium                     );
+  BRANCH( trig_EF_el_lhloose                      );
+  BRANCH( trig_EF_el_lhvloose                     );
+
+  
+
+#undef BRANCH
+
+
+
+}
+
+
+
+void TrigEgammaPhysValBase::bookElectronBranches(TTree *t){
+  
+  t->Branch("el_calo_e",                &m_el_calo_e);
+  t->Branch("el_calo_et",               &m_el_calo_et);
+  t->Branch("el_calo_eta",              &m_el_calo_eta);
+  t->Branch("el_calo_etaBE2",           &m_el_calo_etaBE2);
+  t->Branch("el_calo_phi",              &m_el_calo_phi);
+ 
+  t->Branch("el_hasCalo",               &m_el_hasCalo   );
+  t->Branch("el_hasTrack",              &m_el_hasTrack  );
+  t->Branch("el_e",                     &m_el_e         );
+  t->Branch("el_et",                    &m_el_et        );
+  t->Branch("el_eta",                   &m_el_eta       );
+  t->Branch("el_phi",                   &m_el_phi       );
+ 
+  if(m_doRecoDetailed){
+    t->Branch("el_ethad1",                &m_el_ethad1);
+    t->Branch("el_ehad1",                 &m_el_ehad1);
+    t->Branch("el_e277",                  &m_el_e277);
+    t->Branch("el_f1",                    &m_el_f1);
+    t->Branch("el_f3",                    &m_el_f3);
+    t->Branch("el_f1core",                &m_el_f1core);
+    t->Branch("el_f3core",                &m_el_f3core);
+    t->Branch("el_weta1",                 &m_el_weta1);
+    t->Branch("el_weta2",                 &m_el_weta2);
+    t->Branch("el_wtots1",                &m_el_wtots1);
+    t->Branch("el_fracs1",                &m_el_fracs1);
+    t->Branch("el_Reta",                  &m_el_Reta);
+    t->Branch("el_Rphi",                  &m_el_Rphi);
+    t->Branch("el_Eratio",                &m_el_Eratio);
+    t->Branch("el_Rhad",                  &m_el_Rhad);
+    t->Branch("el_Rhad1",                 &m_el_Rhad1);
+    t->Branch("el_deta2",                 &m_el_deta2);
+    t->Branch("el_dphi2",                 &m_el_dphi2);
+    t->Branch("el_dphiresc",              &m_el_dphiresc);
+    t->Branch("el_deltaPhiRescaled2"         , &m_el_deltaPhiRescaled2  );
+    t->Branch("el_deltaEta1"                 , &m_el_deltaEta1          );
+    t->Branch("el_deltaE",                &m_el_deltaE    );
+    t->Branch("el_etCone"                 , &m_el_etCone                 );
+    t->Branch("el_ptCone"                 , &m_el_ptCone                 );
+
+ 
+    t->Branch("el_trk_pt",                         &m_el_trk_pt        );
+    t->Branch("el_trk_eta",                        &m_el_trk_eta   );
+    t->Branch("el_trk_charge",                     &m_el_trk_charge);
+    t->Branch("el_trk_qOverP",                     &m_el_trk_qOverP);
+    t->Branch("el_trk_sigd0"                     , &m_el_trk_sigd0              );
+    t->Branch("el_trk_d0"                        , &m_el_trk_d0                 );
+    t->Branch("el_trk_eProbabilityHT"            , &m_el_trk_eProbabilityHT     );
+    t->Branch("el_trk_transformed_eProbabilityHT", &m_el_trk_transformed_eProbabilityHT);
+    t->Branch("el_trk_d0significance"            , &m_el_trk_d0significance     );
+    t->Branch("el_trk_deltaPOverP"               , &m_el_trk_deltaPOverP        );
+    t->Branch("el_trk_summaryValues"             , &m_el_trk_summaryValues        );
+  }
+
+  t->Branch("el_ringsE",                &m_el_ringsE );
+  t->Branch("el_nGoodVtx",              &m_el_nGoodVtx);
+  t->Branch("el_nPileupPrimaryVtx",     &m_el_nPileupPrimaryVtx);
+
+
+  t->Branch("el_loose",                 &m_el_loose  );
+  t->Branch("el_medium",                &m_el_medium );
+  t->Branch("el_tight",                 &m_el_tight );
+  t->Branch("el_lhvloose",              &m_el_lhVLoose );
+  t->Branch("el_lhloose",               &m_el_lhLoose );
+  t->Branch("el_lhmedium",              &m_el_lhMedium ); 
+  t->Branch("el_lhtight",               &m_el_lhTight ); 
+  t->Branch("el_multiLepton",           &m_el_multiLepton);
+
+
+
+}
+
+
+void TrigEgammaPhysValBase::createTDTMetadata( TTree *t, std::vector<std::string> trigList ){
+
+  std::vector<std::string> *trig_tdt_triggerList;
+  t->Branch("trig_tdt_triggerList", &trig_tdt_triggerList );
+  trig_tdt_triggerList = new std::vector<std::string>();
+  for(auto& trigger : trigList ){
+    trig_tdt_triggerList->push_back(trigger);
+  }
+  t->Fill();
+  delete trig_tdt_triggerList;
+}
+
+
+void TrigEgammaPhysValBase::bookTDTBranches(TTree *t){
+
+  t->Branch("trig_tdt_L1_calo_accept",       &m_trig_tdt_L1_calo_accept);
+  t->Branch("trig_tdt_L2_calo_accept",       &m_trig_tdt_L2_calo_accept);
+  t->Branch("trig_tdt_L2_el_accept",         &m_trig_tdt_L2_el_accept  );
+  t->Branch("trig_tdt_EF_calo_accept",       &m_trig_tdt_EF_calo_accept);
+  t->Branch("trig_tdt_EF_el_accept",         &m_trig_tdt_EF_el_accept  );
+  t->Branch("trig_tdt_emu_L1_calo_accept",   &m_trig_tdt_emu_L1_calo_accept);
+  t->Branch("trig_tdt_emu_L2_calo_accept",   &m_trig_tdt_emu_L2_calo_accept);
+  t->Branch("trig_tdt_emu_L2_el_accept",     &m_trig_tdt_emu_L2_el_accept  );
+  t->Branch("trig_tdt_emu_EF_calo_accept",   &m_trig_tdt_emu_EF_calo_accept);
+  t->Branch("trig_tdt_emu_EF_el_accept",     &m_trig_tdt_emu_EF_el_accept  );
+ 
+}
+
+
+  
+void TrigEgammaPhysValBase::bookMonteCarloBranches(TTree *t){
+  // Monte Carlo
+  t->Branch("mc_hasMC",       &m_mc_hasMC);
+  t->Branch("mc_pt",          &m_mc_pt);
+  t->Branch("mc_eta",         &m_mc_eta);
+  t->Branch("mc_phi",         &m_mc_phi);
+  
+  if(m_doMCDetailed){
+    t->Branch("mc_isTop",       &m_mc_isTop);
+    t->Branch("mc_isParton",    &m_mc_isParton);
+    t->Branch("mc_isMeson",     &m_mc_isMeson);
+    t->Branch("mc_isTau",       &m_mc_isTau);
+    t->Branch("mc_isMuon",      &m_mc_isMuon);
+  }
+  
+  t->Branch("mc_isPhoton",    &m_mc_isPhoton);
+  t->Branch("mc_isElectron",  &m_mc_isElectron);
+  t->Branch("mc_hasZMother",  &m_mc_hasZMother);
+  t->Branch("mc_hasWMother",  &m_mc_hasWMother);
+}
+
+
+void TrigEgammaPhysValBase::linkTDTBranches(TTree *t){
+
+  InitBranch( t, "trig_tdt_L1_calo_accept",       &m_trig_tdt_L1_calo_accept);
+  InitBranch( t, "trig_tdt_L2_calo_accept",       &m_trig_tdt_L2_calo_accept);
+  InitBranch( t, "trig_tdt_L2_el_accept",         &m_trig_tdt_L2_el_accept  );
+  InitBranch( t, "trig_tdt_EF_calo_accept",       &m_trig_tdt_EF_calo_accept);
+  InitBranch( t, "trig_tdt_EF_el_accept",         &m_trig_tdt_EF_el_accept  );
+  InitBranch( t, "trig_tdt_emu_L1_calo_accept",   &m_trig_tdt_emu_L1_calo_accept);
+  InitBranch( t, "trig_tdt_emu_L2_calo_accept",   &m_trig_tdt_emu_L2_calo_accept);
+  InitBranch( t, "trig_tdt_emu_L2_el_accept",     &m_trig_tdt_emu_L2_el_accept  );
+  InitBranch( t, "trig_tdt_emu_EF_calo_accept",   &m_trig_tdt_emu_EF_calo_accept);
+  InitBranch( t, "trig_tdt_emu_EF_el_accept",     &m_trig_tdt_emu_EF_el_accept  );
+ 
+}
+
+
+
+void TrigEgammaPhysValBase::linkEventBranches(TTree *t){
+  
+  InitBranch( t, "RunNumber",        &m_runNumber);
+  InitBranch( t, "EventNumber",      &m_eventNumber);
+  InitBranch( t, "LumiBlock",        &m_lumiBlock);
+  InitBranch( t, "avgmu",            &m_avgmu);
+}
+
+void TrigEgammaPhysValBase::linkElectronBranches( TTree *t ){
+  
+  InitBranch( t, "el_calo_e",                &m_el_calo_e);
+  InitBranch( t, "el_calo_et",               &m_el_calo_et);
+  InitBranch( t, "el_calo_eta",              &m_el_calo_eta);
+  InitBranch( t, "el_calo_etaBE2",           &m_el_calo_etaBE2);
+  InitBranch( t, "el_calo_phi",              &m_el_calo_phi);
+  
+  InitBranch( t, "el_hasCalo",               &m_el_hasCalo);
+  InitBranch( t, "el_hasTrack",              &m_el_hasTrack);
+  InitBranch( t, "el_e",                     &m_el_e);
+  InitBranch( t, "el_et",                    &m_el_et);
+  InitBranch( t, "el_eta",                   &m_el_eta);
+  InitBranch( t, "el_phi",                   &m_el_phi);
+
+
+  if(m_doRecoDetailed){
+    InitBranch( t, "el_ethad1",                &m_el_ethad1);
+    InitBranch( t, "el_ehad1",                 &m_el_ehad1);
+    InitBranch( t, "el_f1",                    &m_el_f1);
+    InitBranch( t, "el_f3",                    &m_el_f3);
+    InitBranch( t, "el_f1core",                &m_el_f1core);
+    InitBranch( t, "el_f3core",                &m_el_f3core);
+    InitBranch( t, "el_weta1",                 &m_el_weta2);
+    InitBranch( t, "el_weta2",                 &m_el_weta2);
+    InitBranch( t, "el_wtots1",                &m_el_wtots1);
+    InitBranch( t, "el_fracs1",                &m_el_fracs1);
+    InitBranch( t, "el_Reta",                  &m_el_Reta);
+    InitBranch( t, "el_Rphi",                  &m_el_Rphi);
+    InitBranch( t, "el_Eratio",                &m_el_Eratio);
+    InitBranch( t, "el_Rhad",                  &m_el_Rhad);
+    InitBranch( t, "el_Rhad1",                 &m_el_Rhad1);
+    InitBranch( t, "el_deta2",                 &m_el_deta2);
+    InitBranch( t, "el_dphi2",                 &m_el_dphi2);
+    InitBranch( t, "el_dphiresc",              &m_el_dphiresc);
+    InitBranch( t, "el_deltaPhiRescaled2"         , &m_el_deltaPhiRescaled2         );
+    InitBranch( t, "el_e277"                      , &m_el_e277                      );
+    InitBranch( t, "el_deltaE"                    , &m_el_e277                      );
+    InitBranch( t, "el_deltaEta1"                 , &m_el_deltaEta1                 );
+    InitBranch( t, "el_etCone"                 , &m_el_etCone                 );
+    InitBranch( t, "el_ptCone"                 , &m_el_ptCone                 );
+
+    InitBranch( t, "el_trk_pt",                         &m_el_trk_pt);
+    InitBranch( t, "el_trk_eta"              ,          &m_el_trk_eta);
+    InitBranch( t, "el_trk_charge",                     &m_el_trk_charge);
+    InitBranch( t, "el_trk_qOverP",                     &m_el_trk_qOverP);
+    InitBranch( t, "el_trk_deltaPOverP"               , &m_el_trk_deltaPOverP               );
+    InitBranch( t, "el_trk_sigd0"                     , &m_el_trk_sigd0                     );
+    InitBranch( t, "el_trk_d0"                        , &m_el_trk_d0                        );
+    InitBranch( t, "el_trk_eProbabilityHT"            , &m_el_trk_eProbabilityHT            );
+    InitBranch( t, "el_trk_transformed_eProbabilityHT", &m_el_trk_transformed_eProbabilityHT);
+    InitBranch( t, "el_trk_d0significance"            , &m_el_trk_d0significance            );
+    InitBranch( t, "el_trk_summaryValues"             , &m_el_trk_summaryValues         );
+ 
+ 
+  }
+  
+  InitBranch( t, "el_nGoodVtx",              &m_el_nGoodVtx);
+  InitBranch( t, "el_ringsE",                &m_el_ringsE );
+  InitBranch( t, "el_nPileupPrimaryVtx",     &m_el_nPileupPrimaryVtx);
+
+  InitBranch( t, "el_loose",                 &m_el_loose  );
+  InitBranch( t, "el_medium",                &m_el_medium );
+  InitBranch( t, "el_tight",                 &m_el_tight );
+  InitBranch( t, "el_lhvloose",              &m_el_lhVLoose );
+  InitBranch( t, "el_lhloose",               &m_el_lhLoose );
+  InitBranch( t, "el_lhmedium",              &m_el_lhMedium ); 
+  InitBranch( t, "el_lhtight",               &m_el_lhTight ); 
+  InitBranch( t, "el_multiLepton",           &m_el_multiLepton);
+}
+
+
+
+void TrigEgammaPhysValBase::linkTriggerBranches( TTree *t ){
+
+  InitBranch(t, "trig_L1_eta",             &m_trig_L1_eta);
+  InitBranch(t, "trig_L1_phi",             &m_trig_L1_phi);
+  InitBranch(t, "trig_L1_emClus",          &m_trig_L1_emClus);
+  InitBranch(t, "trig_L1_tauClus",         &m_trig_L1_tauClus);
+  InitBranch(t, "trig_L1_emIsol",          &m_trig_L1_emIsol);
+  InitBranch(t, "trig_L1_hadIsol",         &m_trig_L1_hadIsol);
+  InitBranch(t, "trig_L1_hadCore",         &m_trig_L1_hadCore);
+  InitBranch(t, "trig_L2_calo_et",         &m_trig_L2_calo_et);
+  InitBranch(t, "trig_L2_calo_eta",        &m_trig_L2_calo_eta);
+  InitBranch(t, "trig_L2_calo_phi",        &m_trig_L2_calo_phi);
+  
+  if(m_doL2CaloDetailed){
+    InitBranch(t, "trig_L2_calo_e237",       &m_trig_L2_calo_e237 );
+    InitBranch(t, "trig_L2_calo_e277",       &m_trig_L2_calo_e277 );
+    InitBranch(t, "trig_L2_calo_fracs1",     &m_trig_L2_calo_fracs1);
+    InitBranch(t, "trig_L2_calo_weta2",      &m_trig_L2_calo_weta2);
+    InitBranch(t, "trig_L2_calo_ehad1",      &m_trig_L2_calo_ehad1);
+    InitBranch(t, "trig_L2_calo_emaxs1",     &m_trig_L2_calo_emaxs1);
+    InitBranch(t, "trig_L2_calo_e2tsts1",    &m_trig_L2_calo_e2tsts1);
+    InitBranch(t, "trig_L2_calo_wstot",      &m_trig_L2_calo_wstot);
+    InitBranch(t, "trig_L2_calo_energySample",      &m_trig_L2_calo_energySample);
+  }
+  
+  InitBranch(t, "trig_L2_calo_rings",      &m_trig_L2_calo_rings ); 
+  InitBranch(t, "trig_L2_calo_rnnOutput",  &m_trig_L2_calo_rnnOutput);
+  
+  if(m_doL2Detailed){
+    InitBranch(t, "trig_L2_el_trackAlgID" ,         &m_trig_L2_el_trackAlgID );
+    InitBranch(t, "trig_L2_el_pt" ,                 &m_trig_L2_el_pt );
+    InitBranch(t, "trig_L2_el_eta",                 &m_trig_L2_el_eta);
+    InitBranch(t, "trig_L2_el_phi",                 &m_trig_L2_el_phi );
+    InitBranch(t, "trig_L2_el_caloEta",             &m_trig_L2_el_caloEta );
+    InitBranch(t, "trig_L2_el_charge",              &m_trig_L2_el_charge);
+    InitBranch(t, "trig_L2_el_nTRTHits",            &m_trig_L2_el_nTRTHits);
+    InitBranch(t, "trig_L2_el_nTRTHiThresholdHits", &m_trig_L2_el_nTRTHiThresholdHits);
+    InitBranch(t, "trig_L2_el_etOverPt" ,           &m_trig_L2_el_etOverPt );
+    InitBranch(t, "trig_L2_el_trkClusDeta" ,        &m_trig_L2_el_trkClusDeta );
+    InitBranch(t, "trig_L2_el_trkClusDphi" ,        &m_trig_L2_el_trkClusDphi );
+
+  }
+  
+
+
+#define INIT(_name_) TrigEgammaPhysValBase::InitBranch(t, #_name_, & m_##_name_);\
+  
+  INIT( trig_EF_calo_et                         ); 
+  INIT( trig_EF_calo_eta                        ); 
+  INIT( trig_EF_calo_phi                        ); 
+  INIT( trig_EF_calo_etaBE2                     ); 
+  INIT( trig_EF_calo_e                          ); 
+  
+  INIT( trig_EF_el_calo_e                       ); 
+  INIT( trig_EF_el_calo_et                      ); 
+  INIT( trig_EF_el_calo_eta                     ); 
+  INIT( trig_EF_el_calo_phi                     ); 
+  INIT( trig_EF_el_calo_etaBE2                  ); 
+  
+  INIT( trig_EF_el_hasCalo                      ); 
+  INIT( trig_EF_el_hasTrack                     ); 
+  INIT( trig_EF_el_et                           ); 
+  INIT( trig_EF_el_eta                          ); 
+  INIT( trig_EF_el_phi                          ); 
+  INIT( trig_EF_el_e                            ); 
+  INIT( trig_EF_el_ethad1                       ); 
+  INIT( trig_EF_el_ehad1                        ); 
+  INIT( trig_EF_el_f1                           ); 
+  INIT( trig_EF_el_f3                           ); 
+  INIT( trig_EF_el_f1core                       ); 
+  INIT( trig_EF_el_f3core                       ); 
+  INIT( trig_EF_el_weta1                        ); 
+  INIT( trig_EF_el_weta2                        ); 
+  INIT( trig_EF_el_wtots1                       ); 
+  INIT( trig_EF_el_fracs1                       ); 
+  INIT( trig_EF_el_Reta                         ); 
+  INIT( trig_EF_el_Rphi                         ); 
+  INIT( trig_EF_el_Eratio                       ); 
+  INIT( trig_EF_el_Rhad                         ); 
+  INIT( trig_EF_el_Rhad1                        ); 
+  INIT( trig_EF_el_deta2                        ); 
+  INIT( trig_EF_el_dphi2                        ); 
+  INIT( trig_EF_el_e277                         ); 
+  INIT( trig_EF_el_deltaE                       ); 
+  INIT( trig_EF_el_dphiresc                     ); 
+  INIT( trig_EF_el_deltaPhiRescaled2            ); 
+  INIT( trig_EF_el_deltaEta1                    ); 
+  INIT( trig_EF_el_etCone                       ); 
+  INIT( trig_EF_el_ptCone                       ); 
+
+  INIT( trig_EF_el_trk_pt                           ); 
+  INIT( trig_EF_el_trk_eta                          ); 
+  INIT( trig_EF_el_trk_charge                       ); 
+  INIT( trig_EF_el_trk_qOverP                       ); 
+  INIT( trig_EF_el_trk_sigd0                        ); 
+  INIT( trig_EF_el_trk_d0                           ); 
+  INIT( trig_EF_el_trk_eProbabilityHT               ); 
+  INIT( trig_EF_el_trk_transformed_eProbabilityHT   ); 
+  INIT( trig_EF_el_trk_d0significance               ); 
+  INIT( trig_EF_el_trk_deltaPOverP                  ); 
+  INIT( trig_EF_el_trk_summaryValues                ); 
+  
+  INIT( trig_EF_calo_tight                      );
+  INIT( trig_EF_calo_medium                     );
+  INIT( trig_EF_calo_loose                      );
+  INIT( trig_EF_calo_lhtight                    );
+  INIT( trig_EF_calo_lhmedium                   );
+  INIT( trig_EF_calo_lhloose                    );
+  INIT( trig_EF_calo_lhvloose                   );
+  INIT( trig_EF_el_tight                        );
+  INIT( trig_EF_el_medium                       );
+  INIT( trig_EF_el_loose                        );
+  INIT( trig_EF_el_lhtight                      );
+  INIT( trig_EF_el_lhmedium                     );
+  INIT( trig_EF_el_lhloose                      );
+  INIT( trig_EF_el_lhvloose                     );
+
+
+
+#undef INIT
+
+
+}  
+
+
+
+void TrigEgammaPhysValBase::linkMonteCarloBranches(TTree *t){
+ 
+  InitBranch(t, "mc_hasMC",       &m_mc_hasMC);
+  InitBranch(t, "mc_pt",          &m_mc_pt);
+  InitBranch(t, "mc_eta",         &m_mc_eta);
+  InitBranch(t, "mc_phi",         &m_mc_phi);
+  
+  if(m_doMCDetailed){
+    InitBranch(t, "mc_isTop",       &m_mc_isTop);
+    InitBranch(t, "mc_isParton",    &m_mc_isParton);
+    InitBranch(t, "mc_isMeson",     &m_mc_isMeson);
+    InitBranch(t, "mc_isTau",       &m_mc_isTau);
+    InitBranch(t, "mc_isMuon",      &m_mc_isMuon);
+  }
+
+  InitBranch(t, "mc_isPhoton",    &m_mc_isPhoton);
+  InitBranch(t, "mc_isElectron",  &m_mc_isElectron);
+  InitBranch(t, "mc_hasZMother",  &m_mc_hasZMother);
+  InitBranch(t, "mc_hasWMother",  &m_mc_hasWMother); 
+}
+
+
+void TrigEgammaPhysValBase::clear(){
+
+  ///EventInfo
+  m_runNumber             = 0;
+  m_eventNumber           = 0;
+  m_lumiBlock             = 0;
+  m_avgmu                 = 0;
+  
+  ///Egamma
+  m_el_hasCalo            = false;
+  m_el_hasTrack           = false;
+  
+  
+  m_el_calo_e             =  0; 
+  m_el_calo_et            =  0; 
+  m_el_calo_eta           =  0; 
+  m_el_calo_phi           =  0; 
+  m_el_calo_etaBE2        =  0;  
+ 
+  m_el_e                  =  0;
+  m_el_et                 =  0;
+  m_el_eta                =  0;
+  m_el_phi                =  0;
+  m_el_ethad1             =  0;
+  m_el_ehad1              =  0;
+  m_el_f1                 =  0;
+  m_el_f3                 =  0;
+  m_el_f1core             =  0;
+  m_el_f3core             =  0;
+  m_el_weta1              =  0;
+  m_el_weta2              =  0;
+  m_el_wtots1             =  0;
+  m_el_fracs1             =  0;
+  m_el_e277               =  0;
+  m_el_Reta               =  0;
+  m_el_Rphi               =  0;
+  m_el_Eratio             =  0;
+  m_el_Rhad               =  0;
+  m_el_Rhad1              =  0;
+  m_el_deta2              =  0;
+  m_el_dphi2              =  0;
+  m_el_dphiresc           =  0;
+  m_el_deltaPhiRescaled2  =  0;
+  m_el_deltaEta1          =  0;
+  m_el_deltaE             =  0;
+  m_el_etCone             ->clear();
+  m_el_ptCone             ->clear();
+
+  m_el_trk_pt                 =  0;
+  m_el_trk_eta                =  0;
+  m_el_trk_charge             =  0;
+  m_el_trk_sigd0              =  0;
+  m_el_trk_d0                 =  0;
+  m_el_trk_eProbabilityHT     =  0;
+  m_el_trk_transformed_eProbabilityHT=0;
+  m_el_trk_d0significance     =  0;
+  m_el_trk_deltaPOverP        =  0;
+  m_el_trk_qOverP             =  0;
+  m_el_trk_summaryValues      ->clear();
+
+
+  
+  m_el_medium             = false; 
+  m_el_tight              = false; 
+  m_el_lhVLoose           = false; 
+  m_el_lhLoose            = false; 
+  m_el_lhMedium           = false; 
+  m_el_lhTight            = false;  
+  m_el_rgLoose            = false; 
+  m_el_rgMedium           = false; 
+  m_el_rgTight            = false;  
+  m_el_multiLepton        = false;
+  
+  m_el_nGoodVtx           = -1;
+  m_el_nPileupPrimaryVtx  = -1;
+  m_el_ringsE             ->clear(); 
+ 
+  // Trigger L1
+  m_trig_L1_eta           = 0;
+  m_trig_L1_phi           = 0;
+  m_trig_L1_emClus        = 0;
+  m_trig_L1_tauClus       = 0;
+  m_trig_L1_emIsol        = 0;
+  m_trig_L1_hadIsol       = 0;
+  m_trig_L1_hadCore       = 0;
+ 
+  // Trigger L2 Calo
+  m_trig_L2_calo_et       = 0;
+  m_trig_L2_calo_eta      = 0;
+  m_trig_L2_calo_phi      = 0;
+  m_trig_L2_calo_e237     = 0;
+  m_trig_L2_calo_e277     = 0;
+  m_trig_L2_calo_fracs1   = 0;
+  m_trig_L2_calo_weta2    = 0;
+  m_trig_L2_calo_ehad1    = 0;
+  m_trig_L2_calo_emaxs1   = 0;
+  m_trig_L2_calo_e2tsts1  = 0;
+  m_trig_L2_calo_wstot    = 0; 
+  
+  
+  m_trig_L2_calo_energySample                ->clear();
+  m_trig_L2_calo_rings                       ->clear();
+  m_trig_L2_calo_rnnOutput                   ->clear();
+  
+  
+  // L2 Electron
+  m_trig_L2_el_pt                            ->clear(); 
+  m_trig_L2_el_eta                           ->clear(); 
+  m_trig_L2_el_phi                           ->clear(); 
+  m_trig_L2_el_charge                        ->clear();     
+  m_trig_L2_el_caloEta                       ->clear(); 
+  m_trig_L2_el_trkClusDeta                   ->clear(); 
+  m_trig_L2_el_trkClusDphi                   ->clear(); 
+  m_trig_L2_el_etOverPt                      ->clear();         
+  m_trig_L2_el_nTRTHits                      ->clear();       
+  m_trig_L2_el_nTRTHiThresholdHits           ->clear();       
+  m_trig_L2_el_trackAlgID                    ->clear(); 
+ 
+  m_trig_EF_el_hasCalo                       ->clear();
+  m_trig_EF_el_hasTrack                      ->clear();
+  
+  // EF Calo
+  m_trig_EF_calo_e                           ->clear();     
+  m_trig_EF_calo_et                          ->clear();     
+  m_trig_EF_calo_eta                         ->clear();     
+  m_trig_EF_calo_phi                         ->clear();     
+  m_trig_EF_calo_etaBE2                      ->clear();     
+  
+  m_trig_EF_calo_tight                       ->clear();
+  m_trig_EF_calo_medium                      ->clear();
+  m_trig_EF_calo_loose                       ->clear();
+  m_trig_EF_calo_lhtight                     ->clear();
+  m_trig_EF_calo_lhmedium                    ->clear();
+  m_trig_EF_calo_lhloose                     ->clear();
+  m_trig_EF_calo_lhvloose                    ->clear();
+ 
+  // HLT electron
+  m_trig_EF_el_calo_e                        ->clear(); 
+  m_trig_EF_el_calo_et                       ->clear(); 
+  m_trig_EF_el_calo_eta                      ->clear(); 
+  m_trig_EF_el_calo_phi                      ->clear(); 
+  m_trig_EF_el_calo_etaBE2                   ->clear(); 
+
+  m_trig_EF_el_e                             ->clear(); 
+  m_trig_EF_el_et                            ->clear(); 
+  m_trig_EF_el_eta                           ->clear(); 
+  m_trig_EF_el_phi                           ->clear(); 
+  m_trig_EF_el_deltaE                        ->clear(); 
+  m_trig_EF_el_ethad1                        ->clear(); 
+  m_trig_EF_el_ehad1                         ->clear(); 
+  m_trig_EF_el_f1                            ->clear(); 
+  m_trig_EF_el_f3                            ->clear(); 
+  m_trig_EF_el_f1core                        ->clear(); 
+  m_trig_EF_el_f3core                        ->clear(); 
+  m_trig_EF_el_weta1                         ->clear(); 
+  m_trig_EF_el_weta2                         ->clear(); 
+  m_trig_EF_el_wtots1                        ->clear(); 
+  m_trig_EF_el_fracs1                        ->clear(); 
+  m_trig_EF_el_Reta                          ->clear(); 
+  m_trig_EF_el_Rphi                          ->clear(); 
+  m_trig_EF_el_Eratio                        ->clear(); 
+  m_trig_EF_el_Rhad                          ->clear(); 
+  m_trig_EF_el_Rhad1                         ->clear(); 
+  m_trig_EF_el_e277                          ->clear(); 
+  m_trig_EF_el_deta2                         ->clear(); 
+  m_trig_EF_el_dphi2                         ->clear(); 
+  m_trig_EF_el_dphiresc                      ->clear(); 
+  m_trig_EF_el_deltaPhiRescaled2             ->clear(); 
+  m_trig_EF_el_deltaEta1                     ->clear(); 
+  m_trig_EF_el_etCone                        ->clear();
+  m_trig_EF_el_ptCone                        ->clear();
+  
+  m_trig_EF_el_trk_pt                        ->clear(); 
+  m_trig_EF_el_trk_eta                       ->clear(); 
+  m_trig_EF_el_trk_charge                    ->clear(); 
+  m_trig_EF_el_trk_qOverP                    ->clear(); 
+  m_trig_EF_el_trk_sigd0                     ->clear(); 
+  m_trig_EF_el_trk_d0                        ->clear(); 
+  m_trig_EF_el_trk_eProbabilityHT            ->clear(); 
+  m_trig_EF_el_trk_transformed_eProbabilityHT->clear(); 
+  m_trig_EF_el_trk_d0significance            ->clear(); 
+  m_trig_EF_el_trk_deltaPOverP               ->clear(); 
+  m_trig_EF_el_trk_summaryValues             ->clear();
+
+
+  m_trig_EF_el_tight                         ->clear();
+  m_trig_EF_el_medium                        ->clear();
+  m_trig_EF_el_loose                         ->clear();
+  m_trig_EF_el_lhtight                       ->clear();
+  m_trig_EF_el_lhmedium                      ->clear();
+  m_trig_EF_el_lhloose                       ->clear();
+  m_trig_EF_el_lhvloose                      ->clear();
+  
+  m_trig_tdt_L1_calo_accept                  ->clear();
+  m_trig_tdt_L2_calo_accept                  ->clear();
+  m_trig_tdt_L2_el_accept                    ->clear();
+  m_trig_tdt_EF_calo_accept                  ->clear();
+  m_trig_tdt_EF_el_accept                    ->clear();
+  m_trig_tdt_emu_L1_calo_accept              ->clear();
+  m_trig_tdt_emu_L2_calo_accept              ->clear();
+  m_trig_tdt_emu_L2_el_accept                ->clear();
+  m_trig_tdt_emu_EF_calo_accept              ->clear();
+  m_trig_tdt_emu_EF_el_accept                ->clear();
+  
+  ///Monte Carlo
+  m_mc_hasMC              = false;
+  m_mc_pt                 = -1;
+  m_mc_eta                = -1;
+  m_mc_phi                = -1;
+  m_mc_isTop              = false;
+  m_mc_isParton           = false;
+  m_mc_isMeson            = false;
+  m_mc_isTau              = false;
+  m_mc_isMuon             = false;
+  m_mc_isPhoton           = false;
+  m_mc_isElectron         = false;
+  m_mc_hasZMother         = false;
+  m_mc_hasWMother         = false;
+
+
+}
+
+void TrigEgammaPhysValBase::alloc_space(){
+  
+  m_el_ringsE                                 = new std::vector<float>();
+  m_el_trk_summaryValues                      = new std::vector<uint8_t>();     
+  m_el_etCone                                 = new std::vector<float>();     
+  m_el_ptCone                                 = new std::vector<float>();     
+
+
+  m_trig_L2_calo_energySample                 = new std::vector<float>();
+  m_trig_L2_calo_rings                        = new std::vector<float>();
+  m_trig_L2_calo_rnnOutput                    = new std::vector<float>();
+ 
+  m_trig_L2_el_trackAlgID                     = new std::vector<int>();
+  m_trig_L2_el_eta                            = new std::vector<float>();   
+  m_trig_L2_el_phi                            = new std::vector<float>();   
+  m_trig_L2_el_caloEta                        = new std::vector<float>();   
+  m_trig_L2_el_trkClusDeta                    = new std::vector<float>();
+  m_trig_L2_el_trkClusDphi                    = new std::vector<float>();
+  m_trig_L2_el_pt                             = new std::vector<float>();   
+  m_trig_L2_el_etOverPt                       = new std::vector<float>();           
+  m_trig_L2_el_nTRTHits                       = new std::vector<float>();         
+  m_trig_L2_el_nTRTHiThresholdHits            = new std::vector<float>();         
+  m_trig_L2_el_charge                         = new std::vector<float>();       
+  
+  m_trig_EF_calo_et                           = new std::vector<float>();     
+  m_trig_EF_calo_eta                          = new std::vector<float>();     
+  m_trig_EF_calo_phi                          = new std::vector<float>();     
+  m_trig_EF_calo_etaBE2                       = new std::vector<float>();     
+  m_trig_EF_calo_e                            = new std::vector<float>();     
+  
+  m_trig_EF_el_calo_et                        = new std::vector<float>();     
+  m_trig_EF_el_calo_eta                       = new std::vector<float>();     
+  m_trig_EF_el_calo_phi                       = new std::vector<float>();     
+  m_trig_EF_el_calo_etaBE2                    = new std::vector<float>();     
+  m_trig_EF_el_calo_e                         = new std::vector<float>();     
+  
+  m_trig_EF_el_hasCalo                        = new std::vector<bool>();
+  m_trig_EF_el_hasTrack                       = new std::vector<bool>();
+ 
+  m_trig_EF_el_et                             = new std::vector<float>();     
+  m_trig_EF_el_eta                            = new std::vector<float>();     
+  m_trig_EF_el_phi                            = new std::vector<float>();     
+  m_trig_EF_el_e                              = new std::vector<float>();     
+  m_trig_EF_el_deltaE                         = new std::vector<float>();     
+  m_trig_EF_el_ethad1                         = new std::vector<float>();     
+  m_trig_EF_el_ehad1                          = new std::vector<float>();     
+  m_trig_EF_el_f1                             = new std::vector<float>();     
+  m_trig_EF_el_f3                             = new std::vector<float>();     
+  m_trig_EF_el_f1core                         = new std::vector<float>();     
+  m_trig_EF_el_f3core                         = new std::vector<float>();     
+  m_trig_EF_el_weta1                          = new std::vector<float>();     
+  m_trig_EF_el_weta2                          = new std::vector<float>();     
+  m_trig_EF_el_wtots1                         = new std::vector<float>();     
+  m_trig_EF_el_fracs1                         = new std::vector<float>();     
+  m_trig_EF_el_e277                           = new std::vector<float>();     
+  m_trig_EF_el_Reta                           = new std::vector<float>();     
+  m_trig_EF_el_Rphi                           = new std::vector<float>();     
+  m_trig_EF_el_Eratio                         = new std::vector<float>();     
+  m_trig_EF_el_Rhad                           = new std::vector<float>();     
+  m_trig_EF_el_Rhad1                          = new std::vector<float>();     
+  m_trig_EF_el_deta2                          = new std::vector<float>();     
+  m_trig_EF_el_dphi2                          = new std::vector<float>();     
+  m_trig_EF_el_dphiresc                       = new std::vector<float>();     
+  m_trig_EF_el_deltaPhiRescaled2              = new std::vector<float>();   
+  m_trig_EF_el_deltaEta1                      = new std::vector<float>();     
+  m_trig_EF_el_etCone                         = new std::vector<float>();     
+  m_trig_EF_el_ptCone                         = new std::vector<float>();     
+
+  m_trig_EF_el_trk_pt                         = new std::vector<float>();     
+  m_trig_EF_el_trk_eta                        = new std::vector<float>();     
+  m_trig_EF_el_trk_charge                     = new std::vector<float>();     
+  m_trig_EF_el_trk_qOverP                     = new std::vector<float>();     
+  m_trig_EF_el_trk_sigd0                      = new std::vector<float>();     
+  m_trig_EF_el_trk_d0                         = new std::vector<float>();     
+  m_trig_EF_el_trk_eProbabilityHT             = new std::vector<float>();   
+  m_trig_EF_el_trk_transformed_eProbabilityHT = new std::vector<float>();   
+  m_trig_EF_el_trk_d0significance             = new std::vector<float>();     
+  m_trig_EF_el_trk_deltaPOverP                = new std::vector<float>();     
+  m_trig_EF_el_trk_summaryValues              = new std::vector<uint8_t>();     
+  
+  m_trig_EF_calo_tight                        = new std::vector<bool>();
+  m_trig_EF_calo_medium                       = new std::vector<bool>();
+  m_trig_EF_calo_loose                        = new std::vector<bool>();
+  m_trig_EF_calo_lhtight                      = new std::vector<bool>();
+  m_trig_EF_calo_lhmedium                     = new std::vector<bool>();
+  m_trig_EF_calo_lhloose                      = new std::vector<bool>();
+  m_trig_EF_calo_lhvloose                     = new std::vector<bool>();
+  
+  m_trig_EF_el_tight                          = new std::vector<bool>();
+  m_trig_EF_el_medium                         = new std::vector<bool>();
+  m_trig_EF_el_loose                          = new std::vector<bool>();
+  m_trig_EF_el_lhtight                        = new std::vector<bool>();
+  m_trig_EF_el_lhmedium                       = new std::vector<bool>();
+  m_trig_EF_el_lhloose                        = new std::vector<bool>();
+  m_trig_EF_el_lhvloose                       = new std::vector<bool>();
+  
+  m_trig_tdt_L1_calo_accept                   = new std::vector<int>();
+  m_trig_tdt_L2_calo_accept                   = new std::vector<int>();
+  m_trig_tdt_L2_el_accept                     = new std::vector<int>();
+  m_trig_tdt_EF_calo_accept                   = new std::vector<int>();
+  m_trig_tdt_EF_el_accept                     = new std::vector<int>();
+
+  m_trig_tdt_emu_L1_calo_accept                   = new std::vector<int>();
+  m_trig_tdt_emu_L2_calo_accept                   = new std::vector<int>();
+  m_trig_tdt_emu_L2_el_accept                     = new std::vector<int>();
+  m_trig_tdt_emu_EF_calo_accept                   = new std::vector<int>();
+  m_trig_tdt_emu_EF_el_accept                     = new std::vector<int>();
+
+
+
+}
+
+void TrigEgammaPhysValBase::release_space(){
+  
+  delete m_el_ringsE            ;
+  delete m_el_trk_summaryValues ;     
+  delete m_el_etCone            ;     
+  delete m_el_ptCone            ;     
+
+
+  
+  delete m_trig_L2_calo_energySample;
+  delete m_trig_L2_calo_rings     ;
+  delete m_trig_L2_calo_rnnOutput ;
+  delete m_trig_L2_el_trackAlgID  ;
+  delete m_trig_L2_el_pt          ;  
+  delete m_trig_L2_el_eta         ;   
+  delete m_trig_L2_el_caloEta     ;   
+  delete m_trig_L2_el_phi         ;   
+  delete m_trig_L2_el_charge      ;       
+  delete m_trig_L2_el_nTRTHits    ;         
+  delete m_trig_L2_el_nTRTHiThresholdHits    ;         
+  delete m_trig_L2_el_etOverPt    ;           
+  delete m_trig_L2_el_trkClusDeta ;
+  delete m_trig_L2_el_trkClusDphi ;
+  
+  delete m_trig_EF_calo_et                        ;     
+  delete m_trig_EF_calo_eta                       ;     
+  delete m_trig_EF_calo_phi                       ;     
+  delete m_trig_EF_calo_etaBE2                    ;     
+  delete m_trig_EF_calo_e                         ;     
+  
+  delete m_trig_EF_el_calo_et                        ;     
+  delete m_trig_EF_el_calo_eta                       ;     
+  delete m_trig_EF_el_calo_phi                       ;     
+  delete m_trig_EF_el_calo_etaBE2                    ;     
+  delete m_trig_EF_el_calo_e                         ;     
+ 
+  delete m_trig_EF_el_et                             ;     
+  delete m_trig_EF_el_eta                            ;     
+  delete m_trig_EF_el_phi                            ;     
+  delete m_trig_EF_el_e                              ;     
+  delete m_trig_EF_el_deltaE                         ;     
+  delete m_trig_EF_el_ethad1                         ;     
+  delete m_trig_EF_el_ehad1                          ;     
+  delete m_trig_EF_el_f1                             ;     
+  delete m_trig_EF_el_f3                             ;     
+  delete m_trig_EF_el_f1core                         ;     
+  delete m_trig_EF_el_f3core                         ;     
+  delete m_trig_EF_el_weta1                          ;     
+  delete m_trig_EF_el_weta2                          ;     
+  delete m_trig_EF_el_wtots1                         ;     
+  delete m_trig_EF_el_fracs1                         ;     
+  delete m_trig_EF_el_e277                           ;     
+  delete m_trig_EF_el_Reta                           ;     
+  delete m_trig_EF_el_Rphi                           ;     
+  delete m_trig_EF_el_Eratio                         ;     
+  delete m_trig_EF_el_Rhad                           ;     
+  delete m_trig_EF_el_Rhad1                          ;     
+  delete m_trig_EF_el_deta2                          ;     
+  delete m_trig_EF_el_dphi2                          ;     
+  delete m_trig_EF_el_dphiresc                       ;     
+  delete m_trig_EF_el_deltaPhiRescaled2              ;   
+  delete m_trig_EF_el_deltaEta1                      ;     
+  delete m_trig_EF_el_etCone                         ;     
+  delete m_trig_EF_el_ptCone                         ;     
+
+  delete m_trig_EF_el_trk_pt                         ;     
+  delete m_trig_EF_el_trk_eta                        ;     
+  delete m_trig_EF_el_trk_charge                     ;     
+  delete m_trig_EF_el_trk_qOverP                     ;     
+  delete m_trig_EF_el_trk_sigd0                      ;     
+  delete m_trig_EF_el_trk_d0                         ;     
+  delete m_trig_EF_el_trk_eProbabilityHT             ;   
+  delete m_trig_EF_el_trk_transformed_eProbabilityHT ;   
+  delete m_trig_EF_el_trk_d0significance             ;     
+  delete m_trig_EF_el_trk_deltaPOverP                ;     
+  delete m_trig_EF_el_trk_summaryValues              ;     
+  
+  delete m_trig_EF_calo_tight                        ;
+  delete m_trig_EF_calo_medium                       ;
+  delete m_trig_EF_calo_loose                        ;
+  delete m_trig_EF_calo_lhtight                      ;
+  delete m_trig_EF_calo_lhmedium                     ;
+  delete m_trig_EF_calo_lhloose                      ;
+  delete m_trig_EF_calo_lhvloose                     ;
+  delete m_trig_EF_el_tight                          ;
+  delete m_trig_EF_el_medium                         ;
+  delete m_trig_EF_el_loose                          ;
+  delete m_trig_EF_el_lhtight                        ;
+  delete m_trig_EF_el_lhmedium                       ;
+  delete m_trig_EF_el_lhloose                        ;
+  delete m_trig_EF_el_lhvloose                       ;
+  
+  delete m_trig_tdt_L1_calo_accept                   ;
+  delete m_trig_tdt_L2_calo_accept                   ;
+  delete m_trig_tdt_L2_el_accept                     ;
+  delete m_trig_tdt_EF_calo_accept                   ;
+  delete m_trig_tdt_EF_el_accept                     ;
+  delete m_trig_tdt_emu_L1_calo_accept                   ;
+  delete m_trig_tdt_emu_L2_calo_accept                   ;
+  delete m_trig_tdt_emu_L2_el_accept                     ;
+  delete m_trig_tdt_emu_EF_calo_accept                   ;
+  delete m_trig_tdt_emu_EF_el_accept                     ;
+
+
+
+  delete m_trig_EF_el_hasCalo                        ;
+  delete m_trig_EF_el_hasTrack                       ;
+ 
+
+}
+
+
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx
index 1b1436394b59689968d6a065e678557e4f98ceee..f384b20e234476eef0a3f3ba83ba72a45fe2d792 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaPlotTool.cxx
@@ -161,23 +161,6 @@ void TrigEgammaPlotTool::setBinning(){
         20,20.5,21,21.5,22,22.5,23,23.5,24,24.5,
         25,25.5};
 
-    /* Ringer bins pdfs for each layer */
-    m_minBin_ringer.assign
-      ({-500 ,-500 ,-1000,-1500,-1500,-1000,-1000,-1000,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-800,
-          -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800,
-          -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800,
-          -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800,
-          -800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-800 ,-500 ,-500 ,-500 ,-500 ,-1000,-1000,-1000,-500,
-          -500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-500 ,-600 ,-1000,-1500,-2000,-400 ,-1000,-1500,-1500,
-          -1000,-2000,-2000,-2000});
-    m_maxBin_ringer.assign
-      ({9000 , 7000, 2000, 2000, 2000, 2000, 2000, 2000, 20000, 20000, 6000, 4000, 3000, 2000, 2000, 800,
-          800  , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800  , 800  , 800 , 800 , 800 , 800 , 800 , 800,
-          800  , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800  , 800  , 800 , 800 , 800 , 800 , 800 , 800,
-          800  , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 800  , 800  , 800 , 800 , 800 , 800 , 800 , 800,
-          800  , 800 , 800 , 800 , 800 , 800 , 800 , 800 , 40000, 40000, 6000, 4000, 2000, 2000, 2000, 2000,
-          500  , 500 , 500 , 500 , 500 , 500  ,500  , 500 , 3000 , 3000 , 3000 ,3000, 2000, 2000, 2000, 2000,
-          8000, 5000 ,4000 ,3000});
 
     if(m_doJpsiee){
         m_nEtbins=51;
@@ -608,24 +591,13 @@ TTree *TrigEgammaPlotTool::tree(const std::string &treeName, const std::string &
     return treeItr->second;
 }
 
-void TrigEgammaPlotTool::parseCaloRingsLayers( unsigned layer, unsigned &minRing, 
-                                                                       unsigned &maxRing, std::string &caloLayerName)
-{
-  if(layer == 0){minRing = 0;   maxRing = 7 ; caloLayerName = "PreSampler";}
-  if(layer == 1){minRing = 8;   maxRing = 71; caloLayerName = "EM1";}
-  if(layer == 2){minRing = 72;  maxRing = 79; caloLayerName = "EM2";}
-  if(layer == 3){minRing = 80;  maxRing = 87; caloLayerName = "EM3";}
-  if(layer == 4){minRing = 88;  maxRing = 91; caloLayerName = "HAD1";}
-  if(layer == 5){minRing = 92;  maxRing = 95; caloLayerName = "HAD2";}
-  if(layer == 6){minRing = 96;  maxRing = 99; caloLayerName = "HAD3";}
-}
 
-void TrigEgammaPlotTool::bookAbsResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookAbsResolutionHistos(const std::string &directory){
     cd(directory);    
     addHistogram(new TH1F("res_pt", "HLT p_{T} resolution; (p_{T}(on)-p_{T}(off)) ; Count", 200, -1.5, 1.5));
     addHistogram(new TH1F("res_et", "HLT E_{T} resolution; (E_{T}(on)-E_{T}(off)) ; Count", 200, -0.5, 0.5));
-    addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off)) ; Count", 40, -0.2, 0.2));
-    addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off)) ; Count", 40, -0.2, 0.2));
+    addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off)) ; Count", 40, -0.001, 0.001));
+    addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off)) ; Count", 40, -0.001, 0.001));
 
     addHistogram(new TH2F("res_etVsEta", "HLT E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off)); Count",
                 50, -2.47, 2.47,
@@ -696,11 +668,11 @@ void TrigEgammaPlotTool::bookAbsResolutionHistos(const std::string directory){
 
 }
 
-void TrigEgammaPlotTool::bookResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookResolutionHistos(const std::string &directory){
     cd(directory);
     addHistogram(new TH1F("res_et", "E_{T} resolution; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 100, -0.1, 0.1));
-    addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off))/#eta(off) ; Count", 40, -0.2, 0.2));
-    addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off))/#phi(off) ; Count", 40, -0.2, 0.2));
+    addHistogram(new TH1F("res_eta", "#eta resolution; (#eta(on)-#eta(off))/#eta(off) ; Count", 40, -0.001, 0.001));
+    addHistogram(new TH1F("res_phi", "#phi resolution; (#phi(on)-#phi(off))/#phi(off) ; Count", 40, -0.001, 0.001));
     addHistogram(new TH2F("res_etVsEta", "E_{T} resolution as function of #eta; #eta; (E_{T}(on)-E_{T}(off))/E_{T}(off); Count",
                 25, -2.5, 2.5,
                 50, -0.1, 0.1));
@@ -721,7 +693,7 @@ void TrigEgammaPlotTool::bookResolutionHistos(const std::string directory){
 
 }
 
-void TrigEgammaPlotTool::bookElectronResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookElectronResolutionHistos(const std::string &directory){
     cd(directory);    
     //Electron
     addHistogram(new TH1F("res_pt", "p_{T} resolution; (p_{T}(on)-p_{T}(off))/p_{T}(off) ; Count", 120, -1.5, 1.5));
@@ -743,7 +715,7 @@ void TrigEgammaPlotTool::bookElectronResolutionHistos(const std::string director
                 50, 0., 1.));
 }
 
-void TrigEgammaPlotTool::bookElectronIsoResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookElectronIsoResolutionHistos(const std::string &directory){
     cd(directory);
     addHistogram(new TH1F("res_ptcone20", "resolution ptcone20; ptcone20 (on-off)/off; Count", 200, -0.1, 0.1));
     addHistogram(new TH1F("res_ptcone20_rel", "resolution ptcone20/pt; ptcone20/pt (on-off)/off; Count", 100, -0.1, 0.1));
@@ -789,7 +761,7 @@ void TrigEgammaPlotTool::bookElectronIsoResolutionHistos(const std::string direc
 
 }
 
-void TrigEgammaPlotTool::bookPhotonResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookPhotonResolutionHistos(const std::string &directory){
     cd(directory);    
     addHistogram(new TH1F("res_et_cnv", "HLT E_{T} resolution for converted Photons; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1));
     addHistogram(new TH1F("res_et_uncnv", "HLT E_{T} resolution for unconverted Photons; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1));
@@ -818,7 +790,7 @@ void TrigEgammaPlotTool::bookPhotonResolutionHistos(const std::string directory)
     addHistogram(new TH1F("res_uncnv_etInEta3", "HLT E_{T} resolution in #eta = [1.8,2.45]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1));
 
 }
-void TrigEgammaPlotTool::bookPhotonIsoResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookPhotonIsoResolutionHistos(const std::string &directory){
     cd(directory);
     addHistogram(new TH1F("res_topoetcone20", "resolution topoetcone20; ptcone20 (on-off)/off; Count", 200, -0.1, 0.1));
     addHistogram(new TH1F("res_topoetcone20_rel", "resolution topoetcone20/pt; ptcone20/pt (on-off)/off; Count", 100, -0.1, 0.1));
@@ -834,15 +806,21 @@ void TrigEgammaPlotTool::bookPhotonIsoResolutionHistos(const std::string directo
     addHistogram(new TH2F("res_topoetcone20_relVsMu", "HLT topoetcone20/pt resolution as function of avg #mu; #mu; (on-off)/off; Count",
                 50, 0, 100,
                 100, -0.1, 0.1));
-    addHistogram(new TH2F("res_topoetcone20_onVsOff", "online topoetcone20 vs offline topoetcone20; offline [MeV]; online [MeV]; Count",
-                100, 0.0, 10000.0,
-                100, 0.0, 10000.0));
+    addHistogram(new TH2F("res_topoetcone20_onVsOff", "online topoetcone20 vs offline topoetcone20; offline [GeV]; online [GeV]; Count",
+                100, -10.0, 10.0,
+                100, -10.0, 10.0));
     addHistogram(new TH2F("res_topoetcone20_rel_onVsOff", "online topoetcone20/pt vs offline topoetcone20/pt; offline; online; Count",
-                100, 0.0, 0.2,
-                100, 0.0, 0.2));
+                100, -0.5, 0.5,
+                100, -0.5, 0.5));
+    addHistogram(new TH2F("res_topoetcone40_shift_onVsOff", "online topoetcone40-2.45 GeV vs offline topoetcone40-2.45 GeV; offline [GeV]; online [GeV]; Count",
+                100, -10.0, 10.0,
+                100, -10.0, 10.0));
+    addHistogram(new TH2F("res_topoetcone40_shift_rel_onVsOff", "online (topoetcone40-2.45 GeV)/pt vs offline (topoetcone40-2.45 GeV)/pt; offline; online; Count",
+                100, -0.5, 0.5,
+                100, -0.5, 0.5));
 }
 
-void TrigEgammaPlotTool::bookExpertResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookExpertResolutionHistos(const std::string &directory){
     cd(directory);    
     
     addHistogram(new TH1F("res_etInEta0", "HLT E_{T} resolution in #eta = [0,1.37]; (E_{T}(on)-E_{T}(off))/E_{T}(off) ; Count", 200, -0.1, 0.1));
@@ -943,7 +921,7 @@ void TrigEgammaPlotTool::bookExpertResolutionHistos(const std::string directory)
     }
 }
 
-void TrigEgammaPlotTool::bookExpertL2CaloResolutionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookExpertL2CaloResolutionHistos(const std::string &directory){
     cd(directory);
     addHistogram(new TH2F("res_f3VsEta", "L2Calo f3 resolution as function of #eta; #eta; (f3(on)-f3(off))/f3(off); Count",
                 50, -2.47, 2.47,
@@ -1007,14 +985,14 @@ void TrigEgammaPlotTool::bookExpertL2CaloResolutionHistos(const std::string dire
                 50, -0.001, 0.001));
 }
 
-void TrigEgammaPlotTool::bookDistributionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookDistributionHistos(const std::string &directory){
     cd(directory);
     addHistogram(new TH1F("et", "ET; ET [GeV] ; Count", 100, 0., 100.));
     addHistogram(new TH1F("eta", "eta; eta ; Count", m_nEtabins,m_etabins.data())); 
     addHistogram(new TH1F("phi", "phi; phi ; Count", 20, -3.2, 3.2));
 }
 
-void TrigEgammaPlotTool::bookEgammaDistributionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookEgammaDistributionHistos(const std::string &directory){
     cd(directory);
     addHistogram(new TH1F("highet", "Offline E_{T}; E_{T} [GeV] ; Count", 100, 0., 2000.));
     //addHistogram(new TH1F("e011", "e011; e011 ; Count", 165, -15., 150.));
@@ -1033,11 +1011,13 @@ void TrigEgammaPlotTool::bookEgammaDistributionHistos(const std::string director
     addHistogram(new TH1F("Rhad", "Rhad; Rhad ; Count", 35, -0.3, 0.3));
     addHistogram(new TH1F("Rhad1", "Rhad1; Rhad1 ; Count", 30, -0.3, 0.3));
     addHistogram(new TH1F("eratio","eratio; eratio; Count",20, 0, 2));
-    addHistogram(new TH1F("topoetcone20", "topoetcone20; topoetcone20; Count", 50, 0.0, 5.0));
-    addHistogram(new TH1F("topoetcone20_rel", "topoetcone20/pt; topoetcone20/pt; Count", 50, 0.0, 1.0));
+    addHistogram(new TH1F("topoetcone20", "topoetcone20; topoetcone20 [GeV] ; Count", 100, -10.0, 10.0));
+    addHistogram(new TH1F("topoetcone20_rel", "topoetcone20/pt; topoetcone20/pt ; Count", 100, -0.5, 0.5));
+    addHistogram(new TH1F("topoetcone40_shift", "topoetcone40-2.45 GeV; topoetcone40-2.45 GeV [GeV] ; Count", 100, -10.0, 10.0));
+    addHistogram(new TH1F("topoetcone40_shift_rel", "(topoetcone40-2.45 GeV)/pt; (topoetcone40-2.45 GeV)/pt ; Count", 100, -0.5, 0.5));
 }
 
-void TrigEgammaPlotTool::bookElectronDistributionHistos(const std::string directory){
+void TrigEgammaPlotTool::bookElectronDistributionHistos(const std::string &directory){
     cd(directory);
     addHistogram(new TH1F("pt", "p_{T}; p_{T} [GeV] ; Count", 100,0.,100.)); 
     addHistogram(new TH1F("deta1", "deta1; deta1 ; Count", 40, -0.01, 0.01));
@@ -1067,7 +1047,7 @@ void TrigEgammaPlotTool::bookElectronDistributionHistos(const std::string direct
 
 }
 
-void TrigEgammaPlotTool::bookEfficiency2DHistos(const std::string directory){
+void TrigEgammaPlotTool::bookEfficiency2DHistos(const std::string &directory){
     cd(directory);
     
     addHistogram(new TH2F("match_coarse_et_eta","Trigger Matched Offline #eta vs et; E_{T} GeV ;#eta; Count",
@@ -1088,7 +1068,7 @@ void TrigEgammaPlotTool::bookEfficiency2DHistos(const std::string directory){
 
 }
 
-void TrigEgammaPlotTool::bookEfficiencyTProfile(const std::string directory){
+void TrigEgammaPlotTool::bookEfficiencyTProfile(const std::string &directory){
     cd(directory);
     addHistogram(new TProfile("eff_pt", "#epsilon(p_T); p_{T} ; Efficiency",m_nEtbins,m_etbins.data())); 
     addHistogram(new TProfile("eff_et", "#epsilon(E_T); E_{T} [GeV] ; Efficiency", m_nEtbins,m_etbins.data())); 
@@ -1101,7 +1081,7 @@ void TrigEgammaPlotTool::bookEfficiencyTProfile(const std::string directory){
       addHistogram(new TProfile("eff_npvtx", "#epsilon(npvtx); npvtx ; Efficiency", 16, 0, 80));
 }
 
-void TrigEgammaPlotTool::bookEfficiencyHistos(const std::string directory){ 
+void TrigEgammaPlotTool::bookEfficiencyHistos(const std::string &directory){ 
     cd(directory);
     bookEfficiencyTProfile(directory);
     // Numerator
@@ -1185,6 +1165,7 @@ void TrigEgammaPlotTool::bookL1Histos(TrigInfo trigInfo){
 
 }
 
+
 void TrigEgammaPlotTool::bookExpertHistos(TrigInfo trigInfo){
     
     const std::string basePath=m_baseDir+"/Expert/"+trigInfo.trigName;
@@ -1338,29 +1319,6 @@ void TrigEgammaPlotTool::bookExpertHistos(TrigInfo trigInfo){
     dirnames.push_back(dirname);
     addDirectory(dirname);
 
-    // Store ringer in trigInfo
-    if(boost::contains(trigInfo.trigName,"ringer") || trigInfo.trigEtcut || trigInfo.trigPerf){ 
-        addHistogram(new TH1F("ringer_nnOutput", "Discriminator distribution; nnOutput ; Count", 100, -1, 1));
-        addHistogram(new TH2F("ringer_etVsEta", "ringer count as function of #eta and E_{t}; #eta; E_{t} [GeV]; Count",
-                     m_ndefaultEtabins,m_defaultEtabins.data(), m_ndefaultEtbins, m_defaultEtbins.data() ));
-        if(m_detailedHists){
-            unsigned rCount=0; 
-            for(unsigned layer =0; layer < 7; ++layer){
-                unsigned minRing, maxRing;  std::string strLayer;
-                parseCaloRingsLayers( layer, minRing, maxRing, strLayer );
-                addDirectory(dirname+"/rings_"+strLayer);
-                for(unsigned r=minRing; r<=maxRing; ++r){
-                    std::stringstream ss_title, ss;
-                    ss_title << "ringer_ring#" << r;  ss << "L2Calo ringer ("<< strLayer <<"); ring#" << r << " E [MeV]; Count";
-                    addHistogram(new TH1F(ss_title.str().c_str(), ss.str().c_str(), 100, m_minBin_ringer[rCount], m_maxBin_ringer[rCount]));
-                    rCount++;
-                }
-            }///Loop for each calo layers    
-        }
-    }
-
-
-
     //Book the kinematic plots for each trigger level
     for(const auto dir:dirnames) 
         bookDistributionHistos(dir);
@@ -1376,7 +1334,7 @@ void TrigEgammaPlotTool::bookExpertHistos(TrigInfo trigInfo){
     }
     if(trigInfo.trigType=="photon"){
         bookPhotonResolutionHistos(dirname);
-        if(boost::contains(trigInfo.trigName,"iloose"))
+        if(boost::contains(trigInfo.trigName,"icaloloose") ||boost::contains(trigInfo.trigName,"icalovloose") || boost::contains(trigInfo.trigName,"icalotight"))
             bookPhotonIsoResolutionHistos(dirname);
     }
     
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx
index c2d851d919f7ed4f46e9f8ac0f9b5c691291f37c..66e0a7441e5df957ab7f70c2aa54730dc16949ff 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/Root/TrigEgammaResolutionTool.cxx
@@ -47,6 +47,7 @@ StatusCode TrigEgammaResolutionTool::toolExecute(const std::string basePath,Trig
     const std::string dir = basePath+"/"+info.trigName;
     bool filliso=false;
     if(boost::contains(info.trigName,"iloose") || boost::contains(info.trigName,"ivarloose")) filliso=true;
+    if(boost::contains(info.trigName,"icaloloose") || boost::contains(info.trigName,"icalovloose") || boost::contains(info.trigName,"icalotight")) filliso=true;
     ATH_MSG_DEBUG("Executing resolution for " << dir);
     for(const auto pairObj : pairObjs){
         const xAOD::Egamma* eg =pairObj.first;
@@ -142,14 +143,17 @@ void TrigEgammaResolutionTool::resolutionElectron(const std::string basePath,std
 
 void TrigEgammaResolutionTool::resolutionL2Photon(const std::string dir,std::pair< const xAOD::Egamma*,const HLT::TriggerElement*> pairObj){
     cd(dir);
+    ATH_MSG_DEBUG("L2 Photon Resolution");
     float dRmax = 100;
     const xAOD::TrigPhoton *phL2 = nullptr;
-    if(pairObj.second){
-        if(ancestorPassed<xAOD::TrigPhotonContainer>(pairObj.second))
-            phL2=closestObject<xAOD::TrigPhoton,xAOD::TrigPhotonContainer>(pairObj,dRmax);
-        if(phL2){    
-            if(dRmax < 0.05){
-                //Do something here
+    if(getSGContainsTrigPhoton()){
+        if(pairObj.second){
+            if(ancestorPassed<xAOD::TrigPhotonContainer>(pairObj.second))
+                phL2=closestObject<xAOD::TrigPhoton,xAOD::TrigPhotonContainer>(pairObj,dRmax);
+            if(phL2){    
+                if(dRmax < 0.05){
+                    //Do something here
+                }
             }
         }
     }
@@ -498,8 +502,6 @@ void TrigEgammaResolutionTool::fillIsolationResolution(const std::string dir,con
         float etoff=off->pt();
         if (val_off > 0.) {
             hist1("res_topoetcone20")->Fill((getIsolation_topoetcone20(onl)-val_off)/val_off);
-            hist2("res_topoetcone20_onVsOff")->Fill(getIsolation_topoetcone20(off),
-                    getIsolation_topoetcone20(onl));
             if (etonl > 0. && etoff > 0.) {
                 const float reliso_onl=getIsolation_topoetcone20(onl)/etonl;
                 const float reliso_off=getIsolation_topoetcone20(off)/etoff;
@@ -512,10 +514,18 @@ void TrigEgammaResolutionTool::fillIsolationResolution(const std::string dir,con
                         (reliso_onl-reliso_off)/reliso_off);
                 hist2("res_topoetcone20VsMu")->Fill(getAvgMu(),
                         (reliso_onl-reliso_off)/reliso_off);
-                hist2("res_topoetcone20_rel_onVsOff")->Fill(getIsolation_topoetcone20(off)/etoff,
-                        getIsolation_topoetcone20(onl)/etonl);
             }
         }
+        hist2("res_topoetcone20_onVsOff")->Fill(getIsolation_topoetcone20(off)/1e3,
+                    getIsolation_topoetcone20(onl)/1e3);
+        hist2("res_topoetcone40_shift_onVsOff")->Fill((getIsolation_topoetcone40(off)-2450)/1e3,
+                    (getIsolation_topoetcone40(onl)-2450)/1e3);
+        if (etonl > 0. && etoff > 0.) {
+            hist2("res_topoetcone20_rel_onVsOff")->Fill(getIsolation_topoetcone20(off)/etoff,
+                        getIsolation_topoetcone20(onl)/etonl);
+            hist2("res_topoetcone40_shift_rel_onVsOff")->Fill((getIsolation_topoetcone40(off)-2450)/etoff,
+                        (getIsolation_topoetcone40(onl)-2450)/etonl);
+        }
     }
 }
 
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h
index 366d3441c265dbbe286b6e097faa9703cf5d98a0..2b201ce53549c6654068388fb981a6ba798fb4f1 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/ITrigEgammaAnalysisBaseTool.h
@@ -42,6 +42,8 @@ public:
   virtual void setEmulationTool(ToolHandle<Trig::ITrigEgammaEmulationTool>)=0;
   virtual void setAvgMu(const float, const float)=0;
   virtual void setPVertex(const float, const float)=0;
+  virtual void setSGContainsRnn(bool)=0;
+  virtual void setSGContainsTrigPhoton(bool)=0; 
   
   virtual StatusCode childInitialize(){return StatusCode::SUCCESS;};
   virtual StatusCode childBook(){return StatusCode::SUCCESS;};
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h
index 5a67bcefb1e402147f282fcb5b5e86b363879c60..2057c3376397b60fce660b5311c7b3b89a75d7e8 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaAnalysisBaseTool.h
@@ -27,20 +27,16 @@
 #include "xAODEgamma/ElectronAuxContainer.h"
 #include "xAODTrigRinger/TrigRingerRings.h"
 #include "xAODTrigRinger/TrigRingerRingsContainer.h"
+#include "xAODTrigRinger/TrigRNNOutput.h"
+#include "xAODTrigRinger/TrigRNNOutputContainer.h"
 #include "xAODTracking/TrackParticleContainer.h"
 #include "xAODTrigger/TrigPassBits.h"
 #include "xAODEgamma/PhotonAuxContainer.h"
-
-/*
- Ringer offline to be include for future
-/////////////////////////////////////////////////////////
-#include "xAODCaloRings/RingSet.h"                     //
-#include "xAODCaloRings/RingSetContainer.h"            //
-#include "xAODCaloRings/CaloRings.h"                   //
-#include "xAODCaloRings/CaloRingsContainer.h"          //
-#include "xAODCaloRings/tools/getCaloRingsDecorator.h" //
-/////////////////////////////////////////////////////////
-*/
+#include "xAODCaloRings/RingSet.h"                     
+#include "xAODCaloRings/RingSetContainer.h"            
+#include "xAODCaloRings/CaloRings.h"                   
+#include "xAODCaloRings/CaloRingsContainer.h"          
+#include "xAODCaloRings/tools/getCaloRingsDecorator.h" 
 
 class TrigEgammaAnalysisBaseTool
 : public asg::AsgTool,
@@ -50,12 +46,12 @@ ASG_TOOL_CLASS(TrigEgammaAnalysisBaseTool, ITrigEgammaAnalysisBaseTool)
 public:
 
   TrigEgammaAnalysisBaseTool( const std::string& myname);
-  virtual ~TrigEgammaAnalysisBaseTool() {};
+  ~TrigEgammaAnalysisBaseTool() {};
 
-  virtual StatusCode initialize() override;
-  virtual StatusCode book() override;
-  virtual StatusCode execute() override;
-  virtual StatusCode finalize() override;
+  StatusCode initialize() ;
+  StatusCode book() ;
+  StatusCode execute() ;
+  StatusCode finalize() ;
   template<class T, class B> std::unique_ptr<xAOD::TrigPassBits> createBits(const T* CONT, const B* BITS);
   template<class T> std::unique_ptr<xAOD::TrigPassBits> getBits(const HLT::TriggerElement* te,const T* CONT);
   template<class T> const T* getFeature(const HLT::TriggerElement* te,const std::string key="");
@@ -63,15 +59,18 @@ public:
   template <class T1, class T2> const T1* closestObject(const std::pair<const xAOD::Egamma *, const HLT::TriggerElement *>, 
                                                         float &, bool usePassbits=true,const std::string key="");
   // Interface class methods needed to pass information to additional tools or to set common tools
-  virtual void setParent(IHLTMonTool *parent) override { m_parent = parent;};
-  virtual void setPlotTool(ToolHandle<ITrigEgammaPlotTool> tool) override {m_plot=tool;}
-  virtual void setDetail(bool detail) override {m_detailedHists=detail;}
-  virtual void setTP(bool tp) override {m_tp=tp;}
-  virtual void setEmulation(bool doEmu) override {m_doEmulation=doEmu;}
-  virtual void setEmulationTool(ToolHandle<Trig::ITrigEgammaEmulationTool> tool) override {m_emulationTool=tool;}
-  virtual void setPVertex(const float onvertex, const float ngoodvertex) override {m_nPVertex = onvertex; m_nGoodVertex = ngoodvertex;}
-  virtual void setAvgMu(const float onlmu, const float offmu) override {m_onlmu=onlmu; m_offmu=offmu;} //For tools called by tools
-
+  void setParent(IHLTMonTool *parent)  { m_parent = parent;};
+  void setPlotTool(ToolHandle<ITrigEgammaPlotTool> tool)  {m_plot=tool;}
+  void setDetail(bool detail)  {m_detailedHists=detail;}
+  void setTP(bool tp)  {m_tp=tp;}
+  void setEmulation(bool doEmu)  {m_doEmulation=doEmu;}
+  void setEmulationTool(ToolHandle<Trig::ITrigEgammaEmulationTool> tool)  {m_emulationTool=tool;}
+  void setPVertex(const float onvertex, const float ngoodvertex)  {m_nPVertex = onvertex; m_nGoodVertex = ngoodvertex;}
+  void setAvgMu(const float onlmu, const float offmu)  {m_onlmu=onlmu; m_offmu=offmu;} //For tools called by tools
+  
+  void setSGContainsRnn(bool contains)  {m_sgContainsRnn=contains;}
+  void setSGContainsTrigPhoton(bool contains)  {m_sgContainsTrigPhoton=contains;}
+  
   // Set current MonGroup
   void cd(const std::string &dir);
   // Accessor members
@@ -112,7 +111,10 @@ private:
   float m_offmu;
   float m_nGoodVertex; 
   float m_nPVertex;
- 
+  
+  /*! Hook to check for RNN features in SG */
+  bool m_sgContainsRnn;
+  bool m_sgContainsTrigPhoton;
   // Properties  
   ToolHandle<Trig::TrigDecisionTool> m_trigdec;
   ToolHandle<Trig::ITrigEgammaMatchingTool> m_matchTool;
@@ -137,6 +139,8 @@ protected:
   void bookAnalysisHistos(const std::string);
 
   void setTrigInfo(const std::string);
+  void setTrigEmulation(){m_forceTrigEmulation=true;};
+  
   TrigInfo getTrigInfo(const std::string);
   std::map<std::string,TrigInfo> getTrigInfoMap() { return m_trigInfo; }
  
@@ -169,7 +173,11 @@ protected:
   float getNPVtx(){return m_nPVertex;}
   float getNGoodVertex(){return m_nGoodVertex;}
  
-  /* trig rings and offline rings helper method for feature extraction from xaod */
+  /* Protection for Holders not in AOD */
+  bool getSGContainsRnn() { return m_sgContainsRnn;}
+  bool getSGContainsTrigPhoton() { return m_sgContainsTrigPhoton;}
+
+  /* trig rings and offline rings helper method for feature extraction from xaod */ 
   bool getCaloRings( const xAOD::Electron *, std::vector<float> & );
   bool getTrigCaloRings( const xAOD::TrigEMCluster *, std::vector<float> & );
   void parseCaloRingsLayers( unsigned layer, unsigned &minRing, unsigned &maxRing, std::string &caloLayerName);
@@ -213,6 +221,11 @@ protected:
   bool m_tp;
   /*! Emulation Analysis */
   bool m_doEmulation;
+  /*! force emulation trigger */
+  bool m_forceTrigEmulation;
+  /* force trigger attachment into the list */
+  bool m_forceTrigAttachment;
+
   // Infra-structure members
   std::string m_file;
   /*! String for offline container key */
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h
index 56a0eeb5119e60d389dc1f9262b6dc3b77b3a1f4..24d996c39876363fa9bca776b08977f2671d4735 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaDistTool.h
@@ -27,13 +27,12 @@ public:
 protected:
 private:
   /*! fill kinematic histograms, et,eta,phi,lumi and efficiency */
-  void fillShowerShapes(const std::string, const xAOD::Egamma *); // Online and Offline fillers
-  void fillTracking(const std::string, const xAOD::Electron *); // Online and Offline fillers
-  void fillEFCalo(const std::string,const xAOD::CaloCluster *);
-  void fillL2Electron(const std::string,const xAOD::TrigElectron *);
-  void fillL2Calo(const std::string,const xAOD::TrigEMCluster *);
-  void fillRinger(const std::string,const xAOD::TrigEMCluster *);
-  void fillL1Calo(const std::string,const xAOD::EmTauRoI *);
+  void fillShowerShapes(const std::string &, const xAOD::Egamma *); // Online and Offline fillers
+  void fillTracking(const std::string &, const xAOD::Electron *); // Online and Offline fillers
+  void fillEFCalo(const std::string &,const xAOD::CaloCluster *);
+  void fillL2Electron(const std::string &,const xAOD::TrigElectron *);
+  void fillL2Calo(const std::string &,const xAOD::TrigEMCluster *);
+  void fillL1Calo(const std::string &,const xAOD::EmTauRoI *);
    /*! Include more detailed histograms */
   bool m_detailedHists;
 };
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h
new file mode 100644
index 0000000000000000000000000000000000000000..eb112b0d1a4a571e8d52a7f94788e6d52eee4ea7
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaEventSelection.h
@@ -0,0 +1,118 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H
+#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H
+
+#include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h"
+#include "TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h"
+#include "xAODTracking/TrackParticle.h"
+#include "xAODTracking/Vertex.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODEgamma/EgammaEnums.h"
+#include "xAODTracking/TrackingPrimitives.h"
+#include <map>
+
+class TrigEgammaEventSelection : public TrigEgammaNavTPBaseTool, public TrigEgammaPhysValBase,
+                          virtual public ITrigEgammaAnalysisBaseTool
+{
+  ASG_TOOL_CLASS(TrigEgammaEventSelection, ITrigEgammaAnalysisBaseTool)
+
+  public:
+  
+    TrigEgammaEventSelection( const std::string& myname );
+    ~TrigEgammaEventSelection() {}; 
+    StatusCode childInitialize();
+    StatusCode childBook();
+    StatusCode childExecute();
+    StatusCode childFinalize();
+ 
+  private:
+    
+    /* Dump trigger and offline probe object */
+    bool EventSelectionZ();
+    bool EventSelectionFakes();
+
+    bool ApplyFireTriggers( const xAOD::Electron *el);
+    bool isTruthElectronAny(const xAOD::Egamma *eg );
+    
+    bool fill(TTree *t, const xAOD::Electron *el );
+
+    /* parse between objects and local variables connected to the 
+     * ttree pointer */
+    bool fillEvent        ( );
+    bool fillMonteCarlo   ( const xAOD::Egamma        *eg         );
+    bool fillElectron     ( const xAOD::Electron      *el         );
+    bool fillCaloRings    ( const xAOD::Electron      *el         );
+    bool fillEmTauRoI     ( const xAOD::EmTauRoI      *emTauRoI   );
+    bool fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster  );
+    bool fillTrigElectron ( const xAOD::TrigElectron  *trigEl     );
+    bool fillCaloCluster  ( const xAOD::CaloCluster   *cluster    );
+    bool fillAccept       ( const HLT::TriggerElement *           );
+    bool fillTrigCaloRings( const HLT::TriggerElement *feat       );
+    bool fillHLTElectron  ( const xAOD::Electron      *el         );
+    bool fillTDT          ( const xAOD::Electron      *el      , const HLT::TriggerElement *te   );
+
+    // Helper methods
+    double get_el_sigd0(const xAOD::Electron *el);
+    double get_el_d0(const xAOD::Electron *el);
+    double get_el_eProbabilityHT(const xAOD::Electron *el);
+    double get_el_transformed_eProbabilityHT(const xAOD::Electron *el);
+    double get_el_d0significance(const xAOD::Electron *el);
+    double get_el_deltaPhiRescaled2(const xAOD::Electron *el);
+    double get_el_deltaEta1(const xAOD::Electron *el);
+    double get_el_DeltaPOverP(const xAOD::Electron *el);
+
+
+  private:
+    
+    std::map<std::string, unsigned >m_countMap;
+
+    void count( std::string key ){
+      if(m_countMap.find(key) == m_countMap.end()){
+        m_countMap[key]= 1;
+      }else{
+        m_countMap[key]++;
+      }
+    }
+
+
+
+
+    ToolHandleArray<IAsgElectronIsEMSelector>   m_EFCaloElectronIsEMSelectors;
+    ToolHandleArray<IAsgElectronIsEMSelector>   m_HLTElectronIsEMSelectors;
+    ToolHandleArray<IAsgElectronLikelihoodTool> m_EFCaloElectronLHSelectors;
+    ToolHandleArray<IAsgElectronLikelihoodTool> m_HLTElectronLHSelectors;
+    ToolHandle<IAsgElectronLikelihoodTool>      m_electronLHVLooseTool;
+
+    std::vector<std::string> m_supportingTrigList;
+    int  m_detailedDataLevel; 
+    bool m_selectionZ;
+    bool m_selectionW;
+    bool m_selectionMC;
+    bool m_selectionJpsi;
+    bool m_selectionFakes;
+    bool m_doCaloRings;
+    bool m_dumpTags;
+
+#define GETTER(_name_)  void get_##_name_(const xAOD::Electron*, float);
+  GETTER(trig_EF_calo_isLHTightCaloOnly_rel21_20170217 )
+  GETTER(trig_EF_calo_isLHMediumCaloOnly_rel21_20170217)
+  GETTER(trig_EF_calo_isLHLooseCaloOnly_rel21_20170217 )
+  GETTER(trig_EF_calo_isLHVLooseCaloOnly_rel21_20170217)
+  GETTER(trig_EF_el_isLHTight_rel21_20170217 )
+  GETTER(trig_EF_el_isLHMedium_rel21_20170217)
+  GETTER(trig_EF_el_isLHLoose_rel21_20170217 )
+  GETTER(trig_EF_el_isLHVLoose_rel21_20170217)
+  GETTER(trig_EF_el_isLHTightNoD0_rel21_20170217 )
+  GETTER(trig_EF_el_isLHMediumNoD0_rel21_20170217)
+  GETTER(trig_EF_el_isLHLooseNoD0_rel21_20170217 )
+  GETTER(trig_EF_el_isLHVLooseNoD0_rel21_20170217)
+#undef GETTER
+
+  
+};
+
+
+
+#endif
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h
index b977da3bd5acd45f4af971f1fb16d443b2acbd51..8f6e1f62c7a2f9d1b7f74ca9a7e3a2a35bd1c7df 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaInfo.h
@@ -16,6 +16,7 @@ typedef struct _triginfo
     bool trigEtcut; // Et cut only chain
     float trigThrHLT; // HLT Et threshold
     float trigThrL1; // L1 Et threshold
+    bool trigIsEmulation;
 } TrigInfo;
 
 // Enums
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h
index 850ed18d98bd213822bbd8bbcc3d891768e8324b..9952cbcdc6ed932c6097a8d0f830542af00eb667 100755
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h
@@ -26,6 +26,8 @@
 #include "xAODTracking/TrackParticleContainer.h"
 #include "xAODTracking/TrackParticleAuxContainer.h"
 #include "xAODTrigCalo/TrigEMCluster.h"
+#include "xAODTrigRinger/TrigRNNOutput.h"
+#include "xAODTrigRinger/TrigRNNOutputContainer.h"
 #include "xAODCaloEvent/CaloClusterContainer.h"
 #include "xAODCaloEvent/CaloClusterAuxContainer.h"
 #include "xAODJet/JetContainer.h"
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h
deleted file mode 100755
index 4383d5db040eb9a4038318c750247bd5df56f42c..0000000000000000000000000000000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-
-#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVNTUPLE_H
-#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVNTUPLE_H
-
-#include "TrigEgammaAnalysisTools/TrigEgammaNavBaseTool.h"
-#include "xAODTruth/TruthParticle.h"
-#include "xAODTruth/TruthParticleContainer.h"
-#include "xAODEventInfo/EventInfo.h"
-#include "xAODEgamma/EgammaEnums.h"
-#include "xAODTracking/TrackingPrimitives.h"
-
-class TrigEgammaNavNtuple : public TrigEgammaNavBaseTool,
-                          virtual public ITrigEgammaAnalysisBaseTool
-{
-  ASG_TOOL_CLASS(TrigEgammaNavNtuple, ITrigEgammaAnalysisBaseTool)
-
-  public:
-  
-    TrigEgammaNavNtuple( const std::string& myname );
-    ~TrigEgammaNavNtuple() {};
-    StatusCode childInitialize ();
-    StatusCode childBook();
-    StatusCode childExecute();
-    StatusCode childFinalize();
- 
-  private: 
-
-    /* Dump offline photons */
-    bool executePhotonDump();
-    /* Dump offline electrons */
-    bool executeElectronDump();
-    /* Dump Trigger, electron and photons matched with the trigger object */
-    bool executeTrigItemDump();
-    /* Dump using trigger supports */
-    bool executeTrigSupportDump();
-
-
-    /* helper function */ 
-    template <class T> void InitBranch(TTree* fChain, std::string branch_name, T* param, bool message = true);
-   
-    unsigned count_HLT_objects(const HLT::TriggerElement *);
-
-    /* Create branches */
-    void bookEventBranches( TTree *t );
-    void bookElectronBranches( TTree *t );
-    //void bookPhotonBranches( TTree *t );
-    void bookTriggerBranches( TTree *t );
-    void bookMonteCarloBranches( TTree *t );
-    
-    /* uses InitBranch to connect the local variable and ttree pointer */
-    void linkEventBranches( TTree *t);
-    void linkElectronBranches( TTree *t);
-    //void linkPhotonBranches( TTree *t);
-    void linkTriggerBranches( TTree *t);
-    void linkMonteCarloBranches( TTree *t);    
-    
-    /* parse between objects and local variables connected to the 
-     * ttree pointer */
-    bool fillEvent        ( );
-    bool fillMonteCarlo   ( const xAOD::Egamma        *eg );
-    bool fillElectron     ( const xAOD::Electron      *el );
-    //bool fillPhoton       ( const xAOD::Photon        *ph );
-    
-    bool fillCaloRings    ( const xAOD::Electron      *el         );
-    bool fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster  );
-    bool fillEmTauRoI     ( const xAOD::EmTauRoI      *emTauRoI   );
-    bool fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster  );
-    bool fillTrigElectron ( const xAOD::TrigElectron  *trigEl     );
-    bool fillCaloCluster  ( const xAOD::CaloCluster   *cluster    );
-
-    /* Space memory manager */
-    void alloc_space();
-    void release_space();
-    void clear();
-
-
-
-  private:
-
-    /* Offline variables only */
-    bool  m_doOfflineDump;
-    bool  m_doSupport;
-    bool  m_forceMCMatch;
-    float m_minEt; // default is -1 
-    
-    /* Branch variables */
-    uint32_t            m_runNumber{};
-    unsigned long long  m_eventNumber{};
-    unsigned int        m_eventCounter{};   
-    float               m_avgmu{};    
-    
-    /* Egamma */
-    float               m_el_et{};
-    float               m_el_pt{};
-    float               m_el_eta{};
-    float               m_el_phi{};
-    float               m_el_ethad1{};
-    float               m_el_ehad1{};
-    float               m_el_f1{};
-    float               m_el_f3{};
-    float               m_el_d0{};
-    float               m_el_f1core{};
-    float               m_el_f3core{};
-    float               m_el_weta2{};
-    float               m_el_wtots1{};
-    float               m_el_fracs1{};
-    float               m_el_Reta{};
-    float               m_el_Rphi{};
-    float               m_el_Eratio{};
-    float               m_el_Rhad{};
-    float               m_el_Rhad1{};
-    float               m_el_deta1{};
-    float               m_el_deta2{};
-    float               m_el_dphi2{};
-    float               m_el_dphiresc{};
-    float               m_el_dphiresc2{};
-    float               m_el_eprobht{};
-    float               m_el_charge{};
-    uint8_t             m_el_nblayerhits{};
-    uint8_t             m_el_nblayerolhits{};
-    uint8_t             m_el_npixhits{};
-    uint8_t             m_el_npixolhits{};
-    uint8_t             m_el_nscthits{};
-    uint8_t             m_el_nsctolhits{};
-    uint8_t             m_el_ntrthightreshits{};
-    uint8_t             m_el_ntrthits{};
-    uint8_t             m_el_ntrthighthresolhits{};
-    uint8_t             m_el_ntrtolhits{};
-    uint8_t             m_el_ntrtxenonhits{};
-    bool                m_el_expectblayerhit{};
-    uint8_t             m_el_nsihits{}         ;
-    uint8_t             m_el_nsideadsensors{}  ;
-    uint8_t             m_el_npixdeadsensors{} ;
-    uint8_t             m_el_nsctdeadsensors{} ;
-    bool                m_el_loose{};
-    bool                m_el_medium{};
-    bool                m_el_tight{};
-    bool                m_el_lhLoose{};
-    bool                m_el_lhMedium{};
-    bool                m_el_lhTight{}; 
-    bool                m_el_rgLoose{};
-    bool                m_el_rgMedium{};
-    bool                m_el_rgTight{};
-    bool                m_el_multiLepton{};
-    std::vector<float> *m_el_ringsE;
-    int                 m_el_nGoodVtx{};
-    int                 m_el_nPileupPrimaryVtx{};
-    ///Egamma Calo
-    float               m_calo_et{};
-    float               m_calo_eta{};
-    float               m_calo_phi{};
-
-    // Level 1     
-    float               m_trig_L1_eta{};
-    float               m_trig_L1_phi{};
-    float               m_trig_L1_emClus{};
-    float               m_trig_L1_tauClus{};
-    float               m_trig_L1_emIsol{};
-    float               m_trig_L1_hadIsol{};
-    std::vector<std::string> *m_trig_L1_thrNames;          
-    bool                m_trig_L1_accept{};
-    // Level 2 Calo
-    float               m_trig_L2_calo_et{};         
-    float               m_trig_L2_calo_eta{};        
-    float               m_trig_L2_calo_phi{};        
-    float               m_trig_L2_calo_e237{};       
-    float               m_trig_L2_calo_e277{};      
-    float               m_trig_L2_calo_fracs1{};     
-    float               m_trig_L2_calo_weta2{};      
-    float               m_trig_L2_calo_ehad1{};      
-    float               m_trig_L2_calo_emaxs1{};     
-    float               m_trig_L2_calo_e2tsts1{};    
-    float               m_trig_L2_calo_wstot{};      
-    float               m_trig_L2_calo_rnnOutput{};      
-    std::vector<float> *m_trig_L2_calo_energySample;
-    std::vector<float> *m_trig_L2_calo_rings;
-    bool                m_trig_L2_calo_accept{};     
-    // level 2 id
-    std::vector<int>   *m_trig_L2_el_trackAlgID;          
-    std::vector<float> *m_trig_L2_el_pt;          
-    std::vector<float> *m_trig_L2_el_caloEta;         
-    std::vector<float> *m_trig_L2_el_eta;         
-    std::vector<float> *m_trig_L2_el_phi;         
-    std::vector<float> *m_trig_L2_el_charge;      
-    std::vector<float> *m_trig_L2_el_nTRTHits;        
-    std::vector<float> *m_trig_L2_el_nTRTHiThresholdHits;        
-    std::vector<float> *m_trig_L2_el_etOverPt;          
-    std::vector<float> *m_trig_L2_el_trkClusDeta; 
-    std::vector<float> *m_trig_L2_el_trkClusDphi;
-    bool                m_trig_L2_el_accept{};
-    // Level EF
-    bool                m_trig_EF_calo_accept{};
-    std::vector<float> *m_trig_EF_calo_et;
-    std::vector<float> *m_trig_EF_calo_eta;
-    bool                m_trig_EF_el_accept{};
-
-
-    // Monte Carlo
-    bool                m_mc_hasMC{}     ;
-    float               m_mc_pt{}        ;
-    float               m_mc_eta{}       ;
-    float               m_mc_phi{}       ;
-    bool                m_mc_isTop{}     ;
-    bool                m_mc_isParton{}  ;
-    bool                m_mc_isMeson{}   ;
-    bool                m_mc_isQuark{}   ;
-    bool                m_mc_isTau{}     ;
-    bool                m_mc_isMuon{}    ;
-    bool                m_mc_isPhoton{}  ;
-    bool                m_mc_isElectron{};
-    bool                m_mc_hasZMother{};
-    bool                m_mc_hasWMother{};
-
-};
-
-
-#endif
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h
index 317521db5d47f6ac02bc32ebd26abb8ec1f37e78..aa6a54f060ec62062a82269b26b8afee1a1e8b00 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h
@@ -1,7 +1,6 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
 */
-
 #ifndef TrigEgammaNavTPBaseTool_H
 #define TrigEgammaNavTPBaseTool_H
 
@@ -25,9 +24,12 @@
 #include "xAODTracking/TrackParticleContainer.h"
 #include "xAODTracking/TrackParticleAuxContainer.h"
 #include "xAODTrigCalo/TrigEMCluster.h"
+#include "xAODTrigRinger/TrigRNNOutput.h"
+#include "xAODTrigRinger/TrigRNNOutputContainer.h"
 #include "xAODCaloEvent/CaloClusterContainer.h"
 #include "xAODCaloEvent/CaloClusterAuxContainer.h"
 #include "xAODJet/JetContainer.h"
+#include "xAODMissingET/MissingETContainer.h"
 #include "xAODTrigger/EmTauRoIContainer.h"
 #include "EgammaAnalysisInterfaces/IAsgElectronIsEMSelector.h"
 #include "EgammaAnalysisInterfaces/IAsgPhotonIsEMSelector.h"
@@ -37,125 +39,139 @@ namespace Trig{
             class FeatureContainer;
 }
 
-class TrigEgammaNavTPBaseTool
-: public TrigEgammaAnalysisBaseTool,
+class TrigEgammaNavTPBaseTool: public TrigEgammaAnalysisBaseTool,
     virtual public ITrigEgammaAnalysisBaseTool {
         ASG_TOOL_CLASS(TrigEgammaNavTPBaseTool, ITrigEgammaAnalysisBaseTool)
 
-public:
-
-  TrigEgammaNavTPBaseTool( const std::string& myname );
-  ~TrigEgammaNavTPBaseTool() {};
-
-  StatusCode childInitialize();
-  StatusCode childBook();
-  StatusCode childExecute();
-  StatusCode childFinalize();
-protected:
-  /*! things like LAr-error, Tile-error, etc, should come here */
-  bool EventWiseSelection(); 
-  /*! at least one chain should pass. e28_tight_iloose? */
-  bool MinimalTriggerRequirement ();
-  /*! Tag and Probe method called by derived classes */
-  void executeTandP(); 
-  /*! Match probes called by derived classes */
-  void matchObjects(const std::string trigItem); 
-  /*! Tag Electron selection */
-  bool isTagElectron(const xAOD::Electron *el);
-  /*! Rerun offline selection */
-  bool ApplyElectronPid(const xAOD::Electron *eg,const std::string);
-  /*! Rerun offline selection */
-  void DressPid(const xAOD::Electron *eg);
-  /*! Probe selection */
-  bool isGoodProbeElectron(const xAOD::Electron *el);//,const std::string,const float,const std::string); 
-  /*! Event-wise trigger selection */
-  bool passedTrigger(const HLT::TriggerElement* obj); 
-  /*! Clears list of probes after each trigger item per event */
-  void clearProbeList(); 
-  /*! Clears list of matched probes after each trigger item per event */
-  void clearPairList();
-  /* Clears decorations offline objects */
-  void clearDecorations();
-  /*! Return pseudo-lifetime of Jpsi */
-  float GetPseudoLifetime(const xAOD::Electron*,const xAOD::Electron*);
-  /*! Calculate the displacement of the Jpsi vertex w.r.t. the primary vertex in the transverse plane */
-  double simple_lxy(int ,double, double, double , double , double , double , double, double );
-  /*! vector of electron probes */
-  std::vector<const xAOD::Electron*> m_probeElectrons;
-  /*! vector of photon probes */
-  std::vector<const xAOD::Photon*> m_probePhotons;
-  /*! vector of offline electron probe and matched TE */
-  std::vector<std::pair<const xAOD::Egamma*,const HLT::TriggerElement*> > m_pairObj;
-  /* vector of offline photon probe and matched TE */
-  //std::vector<std::pair<const xAOD::Photon*,const HLT::TriggerElement*> > m_probePhotons; 
-  /*! List of triggers from menu */
-  std::vector<std::string> m_trigInputList;
- /*! List of trigger categories for MaM */
-  std::vector<std::string> m_categories; 
-  /*! List of triggers to study */
-  std::vector<std::string> m_trigList; 
-  /*! Zee lower mass cut */
-  float m_ZeeMassMin;
-  /*! Zee upper mass cut */
-  float m_ZeeMassMax;
-  /*! Remove crack region for Probe default True */
-  bool m_rmCrack;
-  /*! Directory name for each algorithm */
-  std::string m_dir;
-  /*! Directory name for each algorithm */
-  std::string m_anatype;
+  public:
   
-  const xAOD::EventInfo* m_eventInfo;
-  const xAOD::TruthParticleContainer* m_truthContainer;
-
-
-private:
-  // ToolHandles
-  //
-  //Offline ++ selectors
-  // In python order will matter. Should always be tight, medium, loose
-  // Order no longer important since using a map
-  ///*! Offline isEM Selectors */
-  ToolHandleArray<IAsgElectronIsEMSelector> m_electronIsEMTool;
-  /*! Offline LH Selectors */
-  ToolHandleArray<IAsgElectronLikelihoodTool> m_electronLHTool;
+    TrigEgammaNavTPBaseTool( const std::string& myname );
+    ~TrigEgammaNavTPBaseTool() {};
+  
+    StatusCode childInitialize();
+    StatusCode childBook();
+    StatusCode childExecute();
+    StatusCode childFinalize();
+  
+  protected:
+    
+    /*! things like LAr-error, Tile-error, etc, should come here */
+    bool EventWiseSelection(); 
+    /*! pass without detector errors */
+    bool passesEventCleaning();
+    /*! at least one chain should pass. e28_tight_iloose? */
+    bool MinimalTriggerRequirement ();
+    /*! Tag and Probe method called by derived classes */
+    void executeTandP(); 
+    /*! Match probes called by derived classes */
+    void matchObjects(const std::string trigItem); 
+    /*! Tag Electron selection */
+    bool isTagElectron(const xAOD::Electron *el);
+    /*! Rerun offline selection */
+    bool ApplyElectronPid(const xAOD::Electron *eg,const std::string);
+    /*! Rerun offline selection */
+    void DressPid(const xAOD::Electron *eg);
+    /*! Probe selection */
+    bool isGoodProbeElectron(const xAOD::Electron *el);//,const std::string,const float,const std::string); 
+    /*! Event-wise trigger selection */
+    bool passedTrigger(const HLT::TriggerElement* obj); 
+    /*! Clears list of probes after each trigger item per event */
+    void clearProbeList(); 
+    /*! Clears list of matched probes after each trigger item per event */
+    void clearPairList();
+    /* Clears decorations offline objects */
+    void clearDecorations();
+    /*! Return pseudo-lifetime of Jpsi */
+    float GetPseudoLifetime(const xAOD::Electron*,const xAOD::Electron*);
+    /*! Calculate the displacement of the Jpsi vertex w.r.t. the primary vertex in the transverse plane */
+    double simple_lxy(int ,double, double, double , double , double , double , double, double );
+    /*! get the W mass */
+    float getWTransverseMass( const xAOD::Electron *el );
+    /*! Return MissingEt obj */
+    const xAOD::MissingET* getMET(){
+      return (*m_METContainer)["FinalClus"];
+    }
 
-  std::map< std::string, unsigned int > m_PidToolMap; /*! Pass a string to pick up correct selector */
-  //std::map< std::string, std::string > m_PidMap; /*! Map trigger pid to selector pid */ 
-  //
-  /*! Event Wise offline ElectronContainer Access and end iterator */
-  const xAOD::ElectronContainer* m_offElectrons;
-  /*! Jet container for probe selection */
-  const xAOD::JetContainer* m_jets;
-  /* TP selection properties */
+    /*! The pair index for each electron */
+    std::vector<std::pair<unsigned,unsigned>> m_Z;
+    /*! vector of electron probes */
+    std::vector<const xAOD::Electron*> m_probeElectrons;
+    /*! vector of photon probes */
+    std::vector<const xAOD::Photon*> m_probePhotons;
+    /*! vector of offline electron probe and matched TE */
+    std::vector<std::pair<const xAOD::Egamma*,const HLT::TriggerElement*> > m_pairObj;
+    /* vector of offline photon probe and matched TE */
+    //std::vector<std::pair<const xAOD::Photon*,const HLT::TriggerElement*> > m_probePhotons; 
+    /*! List of triggers from menu */
+    std::vector<std::string> m_trigInputList;
+   /*! List of trigger categories for MaM */
+    std::vector<std::string> m_categories; 
+    /*! List of triggers to study */
+    std::vector<std::string> m_trigList; 
+    /*! Zee lower mass cut */
+    float m_ZeeMassMin;
+    /*! Zee upper mass cut */
+    float m_ZeeMassMax;
+    /*! Remove crack region for Probe default True */
+    bool m_rmCrack;
+    /*! Enable the requirement of triggers */
+    bool m_applyMinimalTrigger;
+    /*! Directory name for each algorithm */
+    std::string m_dir;
+    /*! Directory name for each algorithm */
+    std::string m_anatype;
+    /*! Select opposite or same-sign pairs -- for background studies */
+    bool m_oppositeCharge;
+     /*! Minimum tag Et */
+    float m_tagMinEt;
+    /*! Minimum probe Et */
+    float m_probeMinEt;
+ 
+    // Containers 
+    /*! Event Wise offline ElectronContainer Access and end iterator */
+    const xAOD::ElectronContainer* m_offElectrons;
+    /*! Jet container for probe selection */
+    const xAOD::JetContainer* m_jets;
+    /*! Missing Et container */
+    const xAOD::MissingETContainer* m_METContainer;
+    /*! EventInfo Container */
+    const xAOD::EventInfo* m_eventInfo;
+    /* Truth Container */
+    const xAOD::TruthParticleContainer* m_truthContainer;
  
-  /*! Not needed */
-  // unsigned int m_isEMoffTag;
-  /*! Define the PID for tag electron */
-  std::string m_offTagTightness;
-  /*! define the Pid of Probe from the trigger name */ 
-  std::string m_offProbeTightness;
-  /*! define the Pid of Probe from the user */ 
-  std::string m_defaultProbeTightness;
-  /*! force user defined probe for pid triggers */
-  bool m_forceProbePid;
-  /*! Select opposite or same-sign pairs -- for background studies */
-  bool m_oppositeCharge;
-  /*! Minimum tag Et */
-  float m_tagMinEt;
-  /*! Minimum probe Et */
-  float m_probeMinEt;
-  /*! Trigger for tag and event wise selection */
-  std::vector<std::string> m_tagTrigList;
-  /*! Apply nearby jet selection */
-  bool m_applyJetNearProbeSelection; 
-  /*! force probe isolation */
-  bool m_forceProbeIsolation;
-  /*! Define isolation working point for Probe electron */
-  std::string m_offProbeIsolation;
-  /*! skip trigger for offline Tag and Probe analysis */
-  bool m_skipTrigger;
+  private:
 
+    // In python order will matter. Should always be tight, medium, loose
+    // Order no longer important since using a map
+    ///*! Offline isEM Selectors */
+    ToolHandleArray<IAsgElectronIsEMSelector> m_electronIsEMTool;
+    /*! Offline LH Selectors */
+    ToolHandleArray<IAsgElectronLikelihoodTool> m_electronLHTool;
+  
+    std::map< std::string, unsigned int > m_PidToolMap; /*! Pass a string to pick up correct selector */
+    //std::map< std::string, std::string > m_PidMap; /*! Map trigger pid to selector pid */ 
+ 
+    /* TP selection properties */
+    /*! Not needed */
+    // unsigned int m_isEMoffTag;
+    /*! Define the PID for tag electron */
+    std::string m_offTagTightness;
+    /*! define the Pid of Probe from the trigger name */ 
+    std::string m_offProbeTightness;
+    /*! define the Pid of Probe from the user */ 
+    std::string m_defaultProbeTightness;
+    /*! force user defined probe for pid triggers */
+    bool m_forceProbePid;
+    /*! Trigger for tag and event wise selection */
+    std::vector<std::string> m_tagTrigList;
+    /*! Apply nearby jet selection */
+    bool m_applyJetNearProbeSelection; 
+    /*! force probe isolation */
+    bool m_forceProbeIsolation;
+    /*! Define isolation working point for Probe electron */
+    std::string m_offProbeIsolation;
+    /*! skip trigger for offline Tag and Probe analysis */
+    bool m_skipTrigger;
 };
 
 #endif
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h
deleted file mode 100755
index cfe8b5a74cec06131cf3851270c4ea7b6bb1464f..0000000000000000000000000000000000000000
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H
-#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMANAVTPNTUPLE_H
-
-#include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h"
-#include "xAODTracking/TrackParticle.h"
-#include "xAODTracking/Vertex.h"
-#include "xAODEventInfo/EventInfo.h"
-#include "xAODEgamma/EgammaEnums.h"
-#include "xAODTracking/TrackingPrimitives.h"
-
-class TrigEgammaNavTPNtuple : public TrigEgammaNavTPBaseTool,
-                          virtual public ITrigEgammaAnalysisBaseTool
-{
-  ASG_TOOL_CLASS(TrigEgammaNavTPNtuple, ITrigEgammaAnalysisBaseTool)
-
-  public:
-  
-    TrigEgammaNavTPNtuple( const std::string& myname );
-    ~TrigEgammaNavTPNtuple() {}; 
-    StatusCode childInitialize();
-    StatusCode childBook();
-    StatusCode childExecute();
-    StatusCode childFinalize();
- 
-  private:
-    
-    /* Dump trigger and offline probe object */
-    bool executeProbesDump();
-    bool executeProbesSupportDump();
-    bool executeProbesItemDump();
-
-
-    /* helper function */ 
-    template <class T> void InitBranch(TTree* fChain, std::string branch_name, T* param, bool message = true);
-
-    unsigned count_HLT_objects(const HLT::TriggerElement *);
-    
-    /* Create branches */
-    void bookEventBranches( TTree *t );
-    void bookElectronBranches( TTree *t );
-    //void bookPhotonBranches( TTree *t );
-    void bookTriggerBranches( TTree *t );
-    void bookMonteCarloBranches( TTree *t );
-
-    /* uses InitBranch to connect the local variable and ttree pointer */
-    void linkEventBranches( TTree *t);
-    void linkElectronBranches( TTree *t);
-    void linkPhotonBranches( TTree *t);
-    void linkTriggerBranches( TTree *t);
-    void linkMonteCarloBranches( TTree *t);    
-
-    /* parse between objects and local variables connected to the 
-     * ttree pointer */
-    bool fillEvent        ( );
-    bool fillMonteCarlo   ( const xAOD::Egamma        *eg );
-    bool fillElectron     ( const xAOD::Electron      *el );
-    //bool fillPhoton       ( const xAOD::Photon        *ph );
-
-    bool fillCaloRings    ( const xAOD::Electron      *el         );
-    bool fillTrigCaloRings( const xAOD::TrigEMCluster *emCluster  );
-    bool fillEmTauRoI     ( const xAOD::EmTauRoI      *emTauRoI   );
-    bool fillTrigEMCluster( const xAOD::TrigEMCluster *emCluster  );
-    bool fillTrigElectron ( const xAOD::TrigElectron  *trigEl     );
-    bool fillCaloCluster  ( const xAOD::CaloCluster   *cluster    );
-
-
-    /* Space memory manager */
-    void alloc_space();
-    void release_space();
-    void clear();
-
-
-  private:
-
-    
-    /* Offline variables only */
-    bool  m_doOfflineDump;
-    /* Support triggers dump */
-    bool  m_doSupport;
-    float m_probeMinEt;
-
-     /* Branch variables */
-    uint32_t            m_runNumber{};
-    unsigned long long  m_eventNumber{};
-    unsigned int        m_eventCounter{};    
-    float               m_avgmu{};    
-     /* Egamma */
-    float               m_el_et{};
-    float               m_el_pt{};
-    float               m_el_eta{};
-    float               m_el_phi{};
-    float               m_el_ethad1{};
-    float               m_el_ehad1{};
-    float               m_el_f1{};
-    float               m_el_f3{};
-    float               m_el_d0{};
-    float               m_el_f1core{};
-    float               m_el_f3core{};
-    float               m_el_weta2{};
-    float               m_el_wtots1{};
-    float               m_el_fracs1{};
-    float               m_el_Reta{};
-    float               m_el_Rphi{};
-    float               m_el_Eratio{};
-    float               m_el_Rhad{};
-    float               m_el_Rhad1{};
-    float               m_el_deta1{};
-    float               m_el_deta2{};
-    float               m_el_dphi2{};
-    float               m_el_dphiresc{};
-    float               m_el_dphiresc2{};
-    float               m_el_eprobht{};
-    float               m_el_charge{};
-    uint8_t             m_el_nblayerhits{};
-    uint8_t             m_el_nblayerolhits{};
-    uint8_t             m_el_npixhits{};
-    uint8_t             m_el_npixolhits{};
-    uint8_t             m_el_nscthits{};
-    uint8_t             m_el_nsctolhits{};
-    uint8_t             m_el_ntrthightreshits{};
-    uint8_t             m_el_ntrthits{};
-    uint8_t             m_el_ntrthighthresolhits{};
-    uint8_t             m_el_ntrtolhits{};
-    uint8_t             m_el_ntrtxenonhits{};
-    bool                m_el_expectblayerhit{};
-    uint8_t             m_el_nsihits{}         ;
-    uint8_t             m_el_nsideadsensors{}  ;
-    uint8_t             m_el_npixdeadsensors{} ;
-    uint8_t             m_el_nsctdeadsensors{} ;
-    bool                m_el_loose{};
-    bool                m_el_medium{};
-    bool                m_el_tight{};
-    bool                m_el_lhLoose{};
-    bool                m_el_lhMedium{};
-    bool                m_el_lhTight{};     
-    bool                m_el_rgLoose{};
-    bool                m_el_rgMedium{};
-    bool                m_el_rgTight{};
-    bool                m_el_multiLepton{};
-    std::vector<float> *m_el_ringsE;
-    int                 m_el_nGoodVtx{};
-    int                 m_el_nPileupPrimaryVtx{};
-    ///Egamma Calo
-    float               m_calo_et{};
-    float               m_calo_eta{};
-    float               m_calo_phi{};
-    
-    // Level 1     
-    float               m_trig_L1_eta{};
-    float               m_trig_L1_phi{};
-    float               m_trig_L1_emClus{};
-    float               m_trig_L1_tauClus{};
-    float               m_trig_L1_emIsol{};
-    float               m_trig_L1_hadIsol{};
-    std::vector<std::string> *m_trig_L1_thrNames;          
-    bool                m_trig_L1_accept{};
-    // Level 2 Calo
-    float               m_trig_L2_calo_et{};         
-    float               m_trig_L2_calo_eta{};        
-    float               m_trig_L2_calo_phi{};        
-    float               m_trig_L2_calo_e237{};       
-    float               m_trig_L2_calo_e277{};      
-    float               m_trig_L2_calo_fracs1{};     
-    float               m_trig_L2_calo_weta2{};      
-    float               m_trig_L2_calo_ehad1{};      
-    float               m_trig_L2_calo_emaxs1{};     
-    float               m_trig_L2_calo_e2tsts1{};    
-    float               m_trig_L2_calo_wstot{};      
-    float               m_trig_L2_calo_rnnOutput{};      
-    std::vector<float> *m_trig_L2_calo_energySample;
-    std::vector<float> *m_trig_L2_calo_rings;
-    bool                m_trig_L2_calo_accept{};     
-    // level 2 id
-    std::vector<int>   *m_trig_L2_el_trackAlgID;          
-    std::vector<float> *m_trig_L2_el_pt;          
-    std::vector<float> *m_trig_L2_el_caloEta;         
-    std::vector<float> *m_trig_L2_el_eta;         
-    std::vector<float> *m_trig_L2_el_phi;         
-    std::vector<float> *m_trig_L2_el_charge;      
-    std::vector<float> *m_trig_L2_el_nTRTHits;        
-    std::vector<float> *m_trig_L2_el_nTRTHiThresholdHits;        
-    std::vector<float> *m_trig_L2_el_etOverPt;          
-    std::vector<float> *m_trig_L2_el_trkClusDeta; 
-    std::vector<float> *m_trig_L2_el_trkClusDphi;
-
-
-    bool                m_trig_L2_el_accept{};
-    // Level EF
-    bool                m_trig_EF_calo_accept{};
-    std::vector<float> *m_trig_EF_calo_et;
-    std::vector<float> *m_trig_EF_calo_eta;
-    bool                m_trig_EF_el_accept{};
-
-
-    // Monte Carlo
-    bool                m_mc_hasMC{}     ;
-    float               m_mc_pt{}        ;
-    float               m_mc_eta{}       ;
-    float               m_mc_phi{}       ;
-    bool                m_mc_isTop{}     ;
-    bool                m_mc_isQuark{}   ;
-    bool                m_mc_isParton{}  ;
-    bool                m_mc_isMeson{}   ;
-    bool                m_mc_isTau{}     ;
-    bool                m_mc_isMuon{}    ;
-    bool                m_mc_isPhoton{}  ;
-    bool                m_mc_isElectron{};
-    bool                m_mc_hasZMother{};
-    bool                m_mc_hasWMother{};
-
-  
-};
-
-
-
-#endif
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h
new file mode 100644
index 0000000000000000000000000000000000000000..6b77c0d095ad3a618aafaa64ea4996f86faa60e5
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPhysValBase.h
@@ -0,0 +1,276 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMAPHYSVALBASE_H
+#define TRIGEGAMMAANALYSISTOOLS_TRIGEGAMMAPHYSVALBASE_H
+
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODTruth/TruthParticle.h"
+#include "xAODTruth/TruthParticleContainer.h"
+#include "xAODEventInfo/EventInfo.h"
+#include "xAODEgamma/EgammaEnums.h"
+#include "xAODTracking/TrackingPrimitives.h"
+#include "TrigDecisionTool/TrigDecisionTool.h"
+#include "TTree.h"
+
+class TrigEgammaPhysValBase
+{
+  public:
+    TrigEgammaPhysValBase();
+    ~TrigEgammaPhysValBase() {};
+ 
+  protected: 
+    /* helper function */ 
+    template <class T> void InitBranch(TTree* fChain, std::string branch_name, T* param, bool message = true);
+   
+    /* Create branches */
+    void bookEventBranches( TTree *t );
+    void bookElectronBranches( TTree *t );
+    void bookTriggerBranches( TTree *t );
+    void bookMonteCarloBranches( TTree *t );
+    void bookTDTBranches( TTree *t );
+    
+    /* uses InitBranch to connect the local variable and ttree pointer */
+    void linkEventBranches( TTree *t);
+    void linkElectronBranches( TTree *t);
+    void linkTriggerBranches( TTree *t);
+    void linkSelectorBranches( TTree *t);
+    void linkMonteCarloBranches( TTree *t);    
+    void linkTDTBranches( TTree *t);    
+    
+    /* Space memory manager */
+    void alloc_space();
+    void release_space();
+    void clear();
+    void createTDTMetadata( TTree *t, std::vector<std::string> trigList );
+    
+    bool                m_doMCDetailed;
+    bool                m_doL2Detailed;
+    bool                m_doL2CaloDetailed;
+    bool                m_doRecoDetailed;
+
+    /* Branch variables */
+    uint32_t            m_runNumber{};
+    unsigned long long  m_eventNumber{};
+    unsigned int        m_eventCounter{};   
+    float               m_avgmu{};    
+    float               m_lumiBlock{};    
+    
+    /* Egamma */
+     
+    bool                m_el_hasCalo   ;
+    bool                m_el_hasTrack  ;
+    float               m_el_e;
+    float               m_el_et;
+    float               m_el_eta;
+    float               m_el_phi;
+    float               m_el_ethad1;
+    float               m_el_ehad1;
+    float               m_el_f1;
+    float               m_el_f3;
+    float               m_el_f1core;
+    float               m_el_f3core;
+    float               m_el_weta1;
+    float               m_el_weta2;
+    float               m_el_wtots1;
+    float               m_el_fracs1;
+    float               m_el_Reta;
+    float               m_el_Rphi;
+    float               m_el_Eratio;
+    float               m_el_Rhad;
+    float               m_el_Rhad1;
+    float               m_el_deta1;
+    float               m_el_deta2;
+    float               m_el_dphi2;
+    float               m_el_dphiresc;
+    float               m_el_deltaPhiRescaled2;
+    float               m_el_deltaEta1;
+    float               m_el_deltaE;
+    float               m_el_e277;
+    std::vector<float> *m_el_etCone;
+    std::vector<float> *m_el_ptCone;
+   
+    
+
+    float               m_el_trk_pt;
+    float               m_el_trk_eta; 
+    float               m_el_trk_charge; 
+    float               m_el_trk_sigd0;
+    float               m_el_trk_d0;
+    float               m_el_trk_eProbabilityHT;
+    float               m_el_trk_transformed_eProbabilityHT;
+    float               m_el_trk_d0significance;
+    float               m_el_trk_deltaPOverP;
+    float               m_el_trk_qOverP;
+    std::vector<uint8_t> *m_el_trk_summaryValues;
+
+    bool                m_el_loose{};
+    bool                m_el_medium{};
+    bool                m_el_tight{};
+    bool                m_el_lhVLoose{};
+    bool                m_el_lhLoose{};
+    bool                m_el_lhMedium{};
+    bool                m_el_lhTight{}; 
+    bool                m_el_rgLoose{};
+    bool                m_el_rgMedium{};
+    bool                m_el_rgTight{};
+    bool                m_el_multiLepton{};
+    std::vector<float> *m_el_ringsE;
+    int                 m_el_nGoodVtx{};
+    int                 m_el_nPileupPrimaryVtx{};
+    ///Egamma Calo
+    float               m_el_calo_et{};
+    float               m_el_calo_eta{};
+    float               m_el_calo_phi{};
+    float               m_el_calo_etaBE2{};
+    float               m_el_calo_e{};
+    // Level 1     
+    float               m_trig_L1_eta{};
+    float               m_trig_L1_phi{};
+    float               m_trig_L1_emClus{};
+    float               m_trig_L1_tauClus{};
+    float               m_trig_L1_emIsol{};
+    float               m_trig_L1_hadIsol{};
+    float               m_trig_L1_hadCore{};
+    std::vector<std::string> *m_trig_L1_thrNames;          
+
+    // Level 2 Calo
+    float               m_trig_L2_calo_et{};         
+    float               m_trig_L2_calo_eta{};        
+    float               m_trig_L2_calo_phi{};        
+    float               m_trig_L2_calo_e237{};       
+    float               m_trig_L2_calo_e277{};      
+    float               m_trig_L2_calo_fracs1{};     
+    float               m_trig_L2_calo_weta2{};      
+    float               m_trig_L2_calo_ehad1{};      
+    float               m_trig_L2_calo_emaxs1{};     
+    float               m_trig_L2_calo_e2tsts1{};    
+    float               m_trig_L2_calo_wstot{};      
+    float               m_trig_L2_calo_nnOutput{};      
+    std::vector<float> *m_trig_L2_calo_energySample;
+    std::vector<float> *m_trig_L2_calo_rings;
+    std::vector<float> *m_trig_L2_calo_rnnOutput;
+    // level 2 id
+    std::vector<int>   *m_trig_L2_el_trackAlgID;          
+    std::vector<float> *m_trig_L2_el_pt;          
+    std::vector<float> *m_trig_L2_el_caloEta;         
+    std::vector<float> *m_trig_L2_el_eta;         
+    std::vector<float> *m_trig_L2_el_phi;         
+    std::vector<float> *m_trig_L2_el_charge;      
+    std::vector<float> *m_trig_L2_el_nTRTHits;        
+    std::vector<float> *m_trig_L2_el_nTRTHiThresholdHits;        
+    std::vector<float> *m_trig_L2_el_etOverPt;          
+    std::vector<float> *m_trig_L2_el_trkClusDeta; 
+    std::vector<float> *m_trig_L2_el_trkClusDphi;
+   
+    // EFCalo and HLT steps
+    
+    std::vector<float>               *m_trig_EF_calo_e;
+    std::vector<float>               *m_trig_EF_calo_et;
+    std::vector<float>               *m_trig_EF_calo_eta;
+    std::vector<float>               *m_trig_EF_calo_phi;
+    std::vector<float>               *m_trig_EF_calo_etaBE2;
+    
+    std::vector<float>               *m_trig_EF_el_calo_e;
+    std::vector<float>               *m_trig_EF_el_calo_et;
+    std::vector<float>               *m_trig_EF_el_calo_eta;
+    std::vector<float>               *m_trig_EF_el_calo_phi;
+    std::vector<float>               *m_trig_EF_el_calo_etaBE2;
+    
+    std::vector<float>               *m_trig_EF_el_e;
+    std::vector<float>               *m_trig_EF_el_et;
+    std::vector<float>               *m_trig_EF_el_eta;
+    std::vector<float>               *m_trig_EF_el_phi;
+    std::vector<float>               *m_trig_EF_el_ethad1;
+    std::vector<float>               *m_trig_EF_el_ehad1;
+    std::vector<float>               *m_trig_EF_el_f1;
+    std::vector<float>               *m_trig_EF_el_f3;
+    std::vector<float>               *m_trig_EF_el_f1core;
+    std::vector<float>               *m_trig_EF_el_f3core;
+    std::vector<float>               *m_trig_EF_el_weta1;
+    std::vector<float>               *m_trig_EF_el_weta2;
+    std::vector<float>               *m_trig_EF_el_wtots1;
+    std::vector<float>               *m_trig_EF_el_fracs1;
+    std::vector<float>               *m_trig_EF_el_Reta;
+    std::vector<float>               *m_trig_EF_el_Rphi;
+    std::vector<float>               *m_trig_EF_el_Eratio;
+    std::vector<float>               *m_trig_EF_el_Rhad;
+    std::vector<float>               *m_trig_EF_el_Rhad1;
+    std::vector<float>               *m_trig_EF_el_deta2;
+    std::vector<float>               *m_trig_EF_el_dphi2;
+    std::vector<float>               *m_trig_EF_el_dphiresc;
+    std::vector<float>               *m_trig_EF_el_e277;
+    std::vector<float>               *m_trig_EF_el_deltaPhiRescaled2;
+    std::vector<float>               *m_trig_EF_el_deltaEta1;
+    std::vector<float>               *m_trig_EF_el_deltaE;
+    std::vector<float>               *m_trig_EF_el_etCone;
+    std::vector<float>               *m_trig_EF_el_ptCone;
+    
+   
+    std::vector<float>               *m_trig_EF_el_trk_pt;
+    std::vector<float>               *m_trig_EF_el_trk_eta; 
+    std::vector<float>               *m_trig_EF_el_trk_charge; 
+    std::vector<float>               *m_trig_EF_el_trk_sigd0;
+    std::vector<float>               *m_trig_EF_el_trk_d0;
+    std::vector<float>               *m_trig_EF_el_trk_eProbabilityHT;
+    std::vector<float>               *m_trig_EF_el_trk_transformed_eProbabilityHT;
+    std::vector<float>               *m_trig_EF_el_trk_d0significance;
+    std::vector<float>               *m_trig_EF_el_trk_deltaPOverP;
+    std::vector<float>               *m_trig_EF_el_trk_qOverP;
+    std::vector<uint8_t>              *m_trig_EF_el_trk_summaryValues;
+
+   
+    std::vector<bool>                *m_trig_EF_el_hasCalo   ;
+    std::vector<bool>                *m_trig_EF_el_hasTrack  ;
+ 
+
+    
+    std::vector<bool>                *m_trig_EF_el_loose;
+    std::vector<bool>                *m_trig_EF_el_medium;
+    std::vector<bool>                *m_trig_EF_el_tight;
+    std::vector<bool>                *m_trig_EF_el_lhvloose;
+    std::vector<bool>                *m_trig_EF_el_lhloose;
+    std::vector<bool>                *m_trig_EF_el_lhmedium;
+    std::vector<bool>                *m_trig_EF_el_lhtight; 
+    std::vector<bool>                *m_trig_EF_calo_loose;
+    std::vector<bool>                *m_trig_EF_calo_medium;
+    std::vector<bool>                *m_trig_EF_calo_tight;
+    std::vector<bool>                *m_trig_EF_calo_lhvloose;
+    std::vector<bool>                *m_trig_EF_calo_lhloose;
+    std::vector<bool>                *m_trig_EF_calo_lhmedium;
+    std::vector<bool>                *m_trig_EF_calo_lhtight; 
+ 
+    std::vector<int>                  *m_trig_tdt_L1_calo_accept;
+    std::vector<int>                  *m_trig_tdt_L2_calo_accept;
+    std::vector<int>                  *m_trig_tdt_L2_el_accept  ;
+    std::vector<int>                  *m_trig_tdt_EF_calo_accept;
+    std::vector<int>                  *m_trig_tdt_EF_el_accept  ;
+    std::vector<int>                  *m_trig_tdt_emu_L1_calo_accept;
+    std::vector<int>                  *m_trig_tdt_emu_L2_calo_accept;
+    std::vector<int>                  *m_trig_tdt_emu_L2_el_accept  ;
+    std::vector<int>                  *m_trig_tdt_emu_EF_calo_accept;
+    std::vector<int>                  *m_trig_tdt_emu_EF_el_accept  ;
+
+
+
+    // Monte Carlo
+    bool                m_mc_hasMC{}     ;
+    float               m_mc_pt{}        ;
+    float               m_mc_eta{}       ;
+    float               m_mc_phi{}       ;
+    bool                m_mc_isTop{}     ;
+    bool                m_mc_isParton{}  ;
+    bool                m_mc_isMeson{}   ;
+    bool                m_mc_isQuark{}   ;
+    bool                m_mc_isTau{}     ;
+    bool                m_mc_isMuon{}    ;
+    bool                m_mc_isPhoton{}  ;
+    bool                m_mc_isElectron{};
+    bool                m_mc_hasZMother{};
+    bool                m_mc_hasWMother{};
+
+};
+
+
+#endif
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h
index c1cd6fa59b9bd0efde9f3486ce30e7153f136f28..fd45b130a13977445e14be86be6493d91a44acfe 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/TrigEgammaAnalysisTools/TrigEgammaPlotTool.h
@@ -73,8 +73,6 @@ class TrigEgammaPlotTool
           int m_ncoarseEtabins; //2D
           std::vector<float>  m_etbins;
           std::vector<float>  m_etabins;
-          std::vector<float>  m_minBin_ringer;
-          std::vector<float>  m_maxBin_ringer;
           std::vector<double> m_defaultEtbins;
           std::vector<double> m_defaultEtabins;
           std::vector<double> m_coarseEtbins;
@@ -117,21 +115,20 @@ class TrigEgammaPlotTool
           void bookL1Histos(TrigInfo);
           void bookShifterHistos();
           //void bookAnalysisHistos(const std::string dir);
-          void bookEfficiencyTProfile(const std::string dir);
-          void bookEfficiencyHistos(const std::string dir);
-          void bookEfficiency2DHistos(const std::string dir);
-          void bookEgammaDistributionHistos(const std::string dir);
-          void bookElectronDistributionHistos(const std::string dir);
-          void bookDistributionHistos(const std::string dir);
-          void bookResolutionHistos(const std::string dir);
-          void bookElectronResolutionHistos(const std::string dir);
-          void bookElectronIsoResolutionHistos(const std::string dir);
-          void bookPhotonResolutionHistos(const std::string dir);
-          void bookPhotonIsoResolutionHistos(const std::string dir);
-          void bookExpertResolutionHistos(const std::string dir);
-          void bookExpertL2CaloResolutionHistos(const std::string dir);
-          void bookAbsResolutionHistos(const std::string dir);
-          void parseCaloRingsLayers( unsigned layer, unsigned &minRing, unsigned &maxRing, std::string &caloLayerName);
+          void bookEfficiencyTProfile(const std::string &dir);
+          void bookEfficiencyHistos(const std::string &dir);
+          void bookEfficiency2DHistos(const std::string &dir);
+          void bookEgammaDistributionHistos(const std::string &dir);
+          void bookElectronDistributionHistos(const std::string &dir);
+          void bookDistributionHistos(const std::string &dir);
+          void bookResolutionHistos(const std::string &dir);
+          void bookElectronResolutionHistos(const std::string &dir);
+          void bookElectronIsoResolutionHistos(const std::string &dir);
+          void bookPhotonResolutionHistos(const std::string &dir);
+          void bookPhotonIsoResolutionHistos(const std::string &dir);
+          void bookExpertResolutionHistos(const std::string &dir);
+          void bookExpertL2CaloResolutionHistos(const std::string &dir);
+          void bookAbsResolutionHistos(const std::string &dir);
   };
 #endif
 
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py
index 2159a9dd78156d32bf3c67810a0ee605bc4ddf7b..6b5d24fa7d7f24ed6f0031425b39433c008f53e1 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaAnalysisToolsConfig.py
@@ -1,10 +1,11 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
 
 from TrigEgammaAnalysisTools import TrigEgammaAnalysisToolsConf
 from AthenaCommon import CfgMgr
 from AthenaCommon.AppMgr import ToolSvc
 
-from egammaRec.Factories import ToolFactory,FcnWrapper,AlgFactory, getPropertyValue 
+from egammaRec.Factories import PublicToolFactory,FcnWrapper,AlgFactory, getPropertyValue 
 
 import PyUtils.RootUtils as ru
 ROOT = ru.import_root()
@@ -29,22 +30,29 @@ MediumElectronSelector            = CfgMgr.AsgElectronIsEMSelector("T0HLTMediumE
 TightElectronSelector             = CfgMgr.AsgElectronIsEMSelector("T0HLTTightElectronSelector")
 LooseLHSelector                   = CfgMgr.AsgElectronLikelihoodTool("T0HLTLooseLHSelector")
 MediumLHSelector                  = CfgMgr.AsgElectronLikelihoodTool("T0HLTMediumLHSelector")
-MediumLHHISelector                  = CfgMgr.AsgElectronLikelihoodTool("T0HLTMediumLHHISelector")
 TightLHSelector                   = CfgMgr.AsgElectronLikelihoodTool("T0HLTTightLHSelector")
+VeryLooseLHSelector               = CfgMgr.AsgElectronLikelihoodTool("T0HLTVeryLooseLHSelector")
+
+# see the configuration calib paths below
 LooseElectronSelector.ConfigFile  = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf"
 MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf"
 TightElectronSelector.ConfigFile  = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf"
+# 2018 (vtest)
 LooseLHSelector.ConfigFile        = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodLooseOfflineConfig2017_CutBL_Smooth.conf"
 MediumLHSelector.ConfigFile       = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodMediumOfflineConfig2017_Smooth.conf"
-MediumLHHISelector.ConfigFile       = "ElectronPhotonSelectorTools/offline/mc15_20160907_HI/ElectronLikelihoodMediumOfflineConfig2016_HI.conf"
 TightLHSelector.ConfigFile        = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodTightOfflineConfig2017_Smooth.conf"
+VeryLooseLHSelector.ConfigFile    = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodVeryLooseOfflineConfig2017_Smooth.conf"
+
+
+
+
 ToolSvc+=LooseElectronSelector
 ToolSvc+=MediumElectronSelector
 ToolSvc+=TightElectronSelector
 ToolSvc+=LooseLHSelector
 ToolSvc+=MediumLHSelector
-ToolSvc+=MediumLHHISelector
 ToolSvc+=TightLHSelector
+ToolSvc+=VeryLooseLHSelector
 
 
 #from LumiBlockComps.LuminosityToolDefault import LuminosityToolOnline
@@ -69,81 +77,43 @@ EgammaMatchTool = Trig__TrigEgammaMatchingTool()
 ToolSvc += EgammaMatchTool
 
 # Plot Tool sets the base path for histograms of all tools
-TrigEgammaPlotTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaPlotTool, name="TrigEgammaPlotTool",
+TrigEgammaPlotTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaPlotTool, name="TrigEgammaPlotTool",
         DirectoryPath="/HLT/Egamma",
         MaM=monitoring_mam,
         Efficiency=["eff_et","eff_eta","eff_mu"],
         Distribution=["et","eta"],
         Resolution=["res_et","res_eta"],
         OutputLevel=0)
-EfficiencyTool = ToolFactory(TrigEgammaAnalysisToolsConf.EfficiencyTool, 
+
+EfficiencyTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.EfficiencyTool, 
         name="EfficiencyTool",
         PlotTool=TrigEgammaPlotTool,
         isEMResultNames=["Tight","Medium","Loose"],
         LHResultNames=["LHTight","LHMedium","LHLoose"],
         OutputLevel=0)
-ResolutionTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaResolutionTool, 
+
+ResolutionTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaResolutionTool, 
         name="ResolutionTool",
         PlotTool=TrigEgammaPlotTool,
         OutputLevel=0)
-DistTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaDistTool, 
+
+DistTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaDistTool, 
         name="DistTool",
         PlotTool=TrigEgammaPlotTool,
         OutputLevel=0)
 
 # import emulator egamma trigger tool
-from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool
+#from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool
 # Copy the default config w/ list
 # Allows factories below to instantiate emulator once Factories are instantiated
-EmulationTool = TrigEgammaEmulationTool.copy( name = "TrigEgammaEmulationTool",
-                                         TriggerList = monitoringTP_electron)
-
-TrigEgammaNavTPNtuple = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPNtuple, name ="TrigEgammaNavTPNtuple",
-        Analysis='ZeeTPNtuple',
-        ElectronKey = 'Electrons',
-        MatchTool = EgammaMatchTool,
-        PlotTool=TrigEgammaPlotTool,
-        EmulationTool=EmulationTool,
-        Tools=[],
-        isEMResultNames=["Tight","Medium","Loose"],
-        LHResultNames=["LHTight","LHMedium","LHLoose"],
-        ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
-        ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
-        ZeeLowerMass=80,
-        ZeeUpperMass=100,
-        doOfflineDump=False,
-        doEmulation=False,
-        OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose 
-        OfflineProbeSelector='Loose', 
-        ForceProbePid=False, 
-        OppositeCharge=True,
-        OfflineTagMinEt=25,
-        CutLabels=["Events","LAr","RetrieveElectrons","TwoElectrons","PassTrigger","EventWise","Success"],
-        TagTriggerList=["e24_tight_iloose"],
-        TriggerList=monitoringTP_electron
+#EmulationTool = TrigEgammaEmulationTool.copy( name = "TrigEgammaEmulationTool",
+#                                         TriggerList = monitoringTP_electron)
 
-        )
+################################################################################################
+# Build factory
 
-TrigEgammaNavNtuple = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavNtuple, name ="TrigEgammaNavNtuple",
-        Analysis='Ntuple',
-        ElectronKey = 'Electrons',
-        MatchTool = EgammaMatchTool,
-        PlotTool=TrigEgammaPlotTool,
-        EmulationTool=EmulationTool,
-        Tools=[],
-        ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
-        ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
-        TriggerList=monitoringTP_electron,
-        doOfflineDump=False,
-        doEmulation=False,
-        ForcePidSelection=True,
-        ForceProbeIsolation=False,
-        ForceEtThreshold=True,
-        ForceMCEnhancedBias=False,
-        RemoveCrack=True,
-        )
 
-TrigEgammaNavTPAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool, name = "TrigEgammaNavTPAnalysisTool",
+TrigEgammaNavTPAnalysisTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool, name = "TrigEgammaNavTPAnalysisTool",
         Analysis='Zee',
         ElectronKey = 'Electrons',
         MatchTool = EgammaMatchTool,
@@ -162,6 +132,7 @@ TrigEgammaNavTPAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgamma
         OppositeCharge=True,
         doJpsiee=False,
         doEmulation=False,
+        ForceTrigAttachment=False,
         TPTrigger=False,
         OfflineTagMinEt=25,
         RemoveCrack=True,
@@ -173,7 +144,7 @@ TrigEgammaNavTPAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgamma
         TagLabels=["Electrons","HasTrack","HasCluster","GoodPid","Et","Eta","IsGoodOQ","PassTrigger","MatchTrigger"],
         )
 
-TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool,
+TrigEgammaNavTPJpsieeAnalysisTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavTPAnalysisTool,
         name = "TrigEgammaNavTPJpsieeAnalysisTool",
         Analysis='Jpsiee',
         ElectronKey = 'Electrons',
@@ -184,7 +155,7 @@ TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.Trig
         isEMResultNames=["Tight","Medium","Loose"],
         LHResultNames=["LHTight","LHMedium","LHLoose"],
         ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
-        ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector, MediumLHHISelector], 
+        ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
         ZeeLowerMass=2,
         ZeeUpperMass=5,
         OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose 
@@ -193,6 +164,7 @@ TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.Trig
         OppositeCharge=True,
         doJpsiee=True,
         doEmulation=False,
+        ForceTrigAttachment=False,
         TPTrigger=False,
         OfflineTagMinEt=5,
         RemoveCrack=True,
@@ -204,7 +176,7 @@ TrigEgammaNavTPJpsieeAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.Trig
         TagLabels=["Electrons","HasTrack","HasCluster","GoodPid","Et","Eta","PassTrigger","MatchTrigger"],
         )
 
-TrigEgammaNavAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavAnalysisTool, name ="TrigEgammaNavAnalysisTool",
+TrigEgammaNavAnalysisTool = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavAnalysisTool, name ="TrigEgammaNavAnalysisTool",
         Analysis='Analysis',
         ElectronKey = 'Electrons',
         MatchTool = EgammaMatchTool,
@@ -212,42 +184,140 @@ TrigEgammaNavAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNa
         #EmulationTool=EmulationTool,
         Tools=[EfficiencyTool,ResolutionTool,DistTool],
         ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
-        ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector,MediumLHHISelector], 
+        ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
+        ElectronLHVLooseTool=VeryLooseLHSelector,
         IsEMLabels=IneffLabels,
         TriggerList=monitoring_electron + monitoring_photon,
         ForcePidSelection=True,
         ForceProbeIsolation=False,
         ForceEtThreshold=True,
+        ForceTrigAttachment=False,
         RemoveCrack=True,
         doEmulation=False,
         )
 
-TrigEgammaNavEnhancedBiasAnalysisTool = ToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaNavAnalysisTool, name ="TrigEgammaNavEnhancedBiasAnalysisTool",
-        Analysis='EnhancedBias',
-        ElectronKey = 'Electrons',
-        MatchTool = EgammaMatchTool,
-        EmulationTool=EmulationTool,
-        PlotTool=TrigEgammaPlotTool,
-        Tools=[EfficiencyTool,ResolutionTool,DistTool],
-        ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
-        ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
-        IsEMLabels=IneffLabels,
-        TriggerList=monitoring_electron + monitoring_photon,
-        ForcePidSelection=False,
-        ForceProbeIsolation=False,
-        ForceEtThreshold=False,
-        ForceMCEnhancedBias=False,
-        RemoveCrack=False,
-        doEmulation=False,
-        )
+#############################################################################################
+# Functions
 
 # Function to return triggerlist tools
 def getAllTools():
     return [TrigEgammaNavZeeTPCounts(),TrigEgammaNavZeeTPEff(),TrigEgammaNavZeeTPIneff(),TrigEgammaNavZeeTPRes(),]
 
+
+def setRunFlag( runFlag ):
+  if runFlag == '2018':
+    # cut based
+    LooseElectronSelector.ConfigFile  = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf"
+    MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf"
+    TightElectronSelector.ConfigFile  = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf"
+
+    # 2018 (vtest)
+    LooseLHSelector.ConfigFile        = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodLooseOfflineConfig2017_CutBL_Smooth.conf"
+    MediumLHSelector.ConfigFile       = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodMediumOfflineConfig2017_Smooth.conf"
+    TightLHSelector.ConfigFile        = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodTightOfflineConfig2017_Smooth.conf"
+    VeryLooseLHSelector.ConfigFile    = "ElectronPhotonSelectorTools/offline/mc16_20170828/ElectronLikelihoodVeryLooseOfflineConfig2017_Smooth.conf"
+  elif runFlag == '2017':
+    # cut based
+    LooseElectronSelector.ConfigFile  = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMLooseSelectorCutDefs.conf"
+    MediumElectronSelector.ConfigFile = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMMediumSelectorCutDefs.conf"
+    TightElectronSelector.ConfigFile  = "ElectronPhotonSelectorTools/offline/mc15_20150712/ElectronIsEMTightSelectorCutDefs.conf"
+
+    # 2017 (v11)
+    LooseLHSelector.ConfigFile        = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodLooseOfflineConfig2016_CutBL_Smooth.conf"
+    MediumLHSelector.ConfigFile       = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodMediumOfflineConfig2016_Smooth.conf"
+    TightLHSelector.ConfigFile        = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodTightOfflineConfig2016_Smooth.conf"
+    VeryLooseLHSelector.ConfigFile    = "ElectronPhotonSelectorTools/offline/mc15_20160512/ElectronLikelihoodVeryLooseOfflineConfig2016_Smooth.conf"
+  else:
+    print 'Wrong run flag configuration'
+
+
+
 # The main algorithm
 # Add triggerlist tools to ToolHandleArray 
 TrigEgammaAnalysisAlg = AlgFactory(TrigEgammaAnalysisToolsConf.TrigEgammaAnalysisAlg, 
         name='TrigEgammaAnalysisAlg',
         Tools = FcnWrapper(getAllTools),
         )
+
+
+
+# This function will be used to collect events from Zee,JF17 and PhysicsMain samples.
+# Use this if you really know. (for experts)
+def getEventSelectionTool(runFlag):
+
+  from TrigEgammaEmulationTool.TrigEgammaEmulationPidToolsConfig import getEgammaIsEMSelectorCaloOnly, \
+                                                                        getElectronIsEMSelector,\
+                                                                        getEgammaLikelihoodSelectorCaloOnly, \
+                                                                        getElectronLikelihoodSelector2015,\
+                                                                        getElectronLikelihoodSelectorNoD0
+  from AthenaCommon import CfgMgr
+  from AthenaCommon.AppMgr import ToolSvc
+  # create all selector list. Here, the order is matter. Please check the 
+  
+  setRunFlag(runFlag)
+  if runFlag == '2017':
+
+    # trigger configuration
+    EFCaloIsEMSelectorList       = getEgammaIsEMSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20170217")
+    HLTIsEMSelectorList          = getElectronIsEMSelector( "ElectronPhotonSelectorTools/trigger/rel21_20170217")
+    EFCaloLikelihoodSelectorList = getEgammaLikelihoodSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20170217")
+    HLTLikelihoodSelectorList    = getElectronLikelihoodSelectorNoD0( "ElectronPhotonSelectorTools/trigger/rel21_20170217")
+
+  elif runFlag == '2018':
+    # trigger configuration
+    EFCaloIsEMSelectorList       = getEgammaIsEMSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20180312")
+    HLTIsEMSelectorList          = getElectronIsEMSelector( "ElectronPhotonSelectorTools/trigger/rel21_20180312")
+    EFCaloLikelihoodSelectorList = getEgammaLikelihoodSelectorCaloOnly( "ElectronPhotonSelectorTools/trigger/rel21_20180312")
+    HLTLikelihoodSelectorList    = getElectronLikelihoodSelectorNoD0( "ElectronPhotonSelectorTools/trigger/rel21_20180312")
+
+  else:
+    print 'Wrong run flag configuration'
+ 
+  # create the event selection tool
+  TrigEgammaEventSelection = PublicToolFactory(TrigEgammaAnalysisToolsConf.TrigEgammaEventSelection, name ="TrigEgammaEventSelection",
+          Analysis='EventsSelection',
+          ElectronKey = 'Electrons',
+          MatchTool = EgammaMatchTool,
+          PlotTool=TrigEgammaPlotTool,
+          EmulationTool=EmulationTool, # The emulation must be on in this tool.
+          doEmulation=True,
+          Tools=[],
+          isEMResultNames=["Tight","Medium","Loose"],
+          LHResultNames=["LHTight","LHMedium","LHLoose"],
+          ElectronLHVLooseTool=VeryLooseLHSelector,
+          ZeeLowerMass=80,
+          ZeeUpperMass=100,
+          OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose 
+          OfflineProbeSelector='Loose', 
+          ForceProbePid=False, 
+          OppositeCharge=True,
+          RemoveCrack=False,
+          OfflineTagMinEt=25,
+          OfflineProbeMinEt=4,
+          CutLabels=["Events","LAr","RetrieveElectrons","TwoElectrons","PassTrigger","EventWise","Success"],
+          TagTriggerList=["e24_tight_iloose"],
+          TriggerList=monitoringTP_electron,
+          ApplyMinimalTrigger = False,
+          SelectionZ=True,
+          SelectionW=False,
+          SelectionJpsi=False,
+          SelectionFakes=False,
+          SelectionMC=False,
+          ForceTrigAttachment=True,
+          DetailedDataLevel=0, # 0 = VerySlim, 1 = Slim and 2 = Full
+          # Asg selectors to decorate my final skimmed ntuple.
+          EFCaloElectronLikelihoodSelector=EFCaloLikelihoodSelectorList,
+          EFCaloElectronIsEMSelector=EFCaloIsEMSelectorList,
+          HLTElectronLikelihoodSelector=HLTLikelihoodSelectorList,
+          HLTElectronIsEMSelector=HLTIsEMSelectorList,
+          ElectronIsEMSelector =[TightElectronSelector,MediumElectronSelector,LooseElectronSelector],
+          ElectronLikelihoodTool =[TightLHSelector,MediumLHSelector,LooseLHSelector], 
+ 
+          )
+  
+  
+  # Return the template
+  return TrigEgammaEventSelection
+
+
+
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py
index c0e9cfe8cca733442ba604187a026c2f51a0bdcf..be86a3aa05aee9ad112d55350dde2e3caac6bb9c 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/python/TrigEgammaProbelist.py
@@ -484,6 +484,7 @@ defaultJpsi=[
   "HLT_e5_lhvloose",
 ]
 
+
 # Lowest single electron triggers for TP analysis
 monitoringTP_electron_extra =[
   'HLT_e24_lhmedium_L1EM18VH',
@@ -547,5 +548,3 @@ supportingTriggerList.extend( [
 
 
 
-
-
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py
new file mode 100644
index 0000000000000000000000000000000000000000..8dc82ce612d578237100e11f346d5d4291163087
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaAnalysisTools_emulator.py
@@ -0,0 +1,250 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+####################################################################################################
+# Job options for standalone and Tier0 running of AnalysisTools 
+# Authors: 
+# Ryan Mackenzie White <ryan.white@cern.ch>
+# Joao Victor Pinto    <jodafons@cern.ch>
+# 
+# Tool and algorithm configuration done using egamma Factories
+#
+# To run
+# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/\
+#                     valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" 
+#                 -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py
+# where NOV is the number of events to run
+####################################################################################################
+
+
+from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
+from RecExConfig.RecFlags import rec
+from RecExConfig.RecAlgsFlags import recAlgs
+from AthenaCommon.AppMgr import ToolSvc
+import os
+
+# Define triggers for tagging 
+tagList = ['HLT_e24_lhtight_nod0_ivarloose',
+           'HLT_e26_lhtight_nod0_ivarloose',
+           'HLT_e28_lhtight_nod0_ivarloose']
+
+triggerList_commissioning_v1 = [
+          
+         # standard monitoring chains
+         #'HLT_e17_lhvloose_nod0_L1EM15VHI',
+         'HLT_e17_lhvloose_nod0',
+         'HLT_e26_lhloose_nod0',
+         'HLT_e26_lhmedium_nod0',
+         #'HLT_e26_lhtight_nod0',
+         #'HLT_e26_lhtight_nod0_ivarloose',
+         'HLT_e28_lhtight_nod0_ivarloose',
+         'HLT_e60_lhmedium_nod0_L1EM24VHI',
+         'HLT_e140_lhloose_nod0_L1EM24VHI',
+         # ringer chains for the commissioning...
+         #'HLT_e17_lhvloose_nod0_ringer_L1EM15VHI',
+         'HLT_e17_lhvloose_nod0_ringer',
+         'HLT_e26_lhloose_nod0_ringer',
+         'HLT_e26_lhmedium_nod0_ringer',
+         #'HLT_e26_lhtight_nod0_ringer',
+         #'HLT_e26_lhtight_nod0_ringer_ivarloose',
+         'HLT_e28_lhtight_nod0_ringer_ivarloose',
+         'HLT_e60_lhmedium_nod0_ringer_L1EM24VHI',
+         'HLT_e140_lhloose_nod0_ringer_L1EM24VHI',
+    ]
+
+
+triggerList_monitoring_v1 = [
+         # standard monitoring chains
+         'HLT_e17_lhvloose_nod0_L1EM15VHI',
+         'HLT_e26_lhtight_nod0_ivarloose',
+         'HLT_e28_lhtight_nod0_icaloloose',
+         'HLT_e60_lhmedium_nod0_L1EM24VHI',
+         'HLT_e140_lhloose_nod0_L1EM24VHI',
+         # no ringer chains for pos-commissioning...
+         'HLT_e17_lhvloose_nod0_noringer_L1EM15VHI',
+         'HLT_e26_lhtight_nod0_noringer_ivarloose',
+         'HLT_e28_lhtight_nod0_noringer_ivarloose',
+         'HLT_e60_lhmedium_nod0_noringer_L1EM24VHI',
+         'HLT_e140_lhloose_nod0_noringer_L1EM24VHI',
+
+      ]
+
+
+triggerList = triggerList_monitoring_v1
+
+doGRL=False
+doEmulation=True
+DetailedHistograms=False
+####################################################################################################
+dirtouse = str()
+finallist=[]
+grllist=[]
+
+from AthenaCommon.AthenaCommonFlags import athenaCommonFlags as acf
+from glob import glob
+
+if ('FILE' in dir()):
+    acf.FilesInput=[FILE]
+elif ('DIR' in dir()):
+    inputFiles = glob(DIR+'*')
+    acf.FilesInput=inputFiles
+if 'NOV' in dir():
+    nov=NOV
+else :
+    nov=500
+if 'GRL' in dir():
+  grllist.append(GRL)
+else:
+  #grllist.append('/afs/cern.ch/work/j/jodafons/public/data/data15_13TeV.periodAllYear_DetStatus-v79-repro20-02_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
+  #grllist.append('data15_13TeV.periodAllYear_DetStatus-v79-repro20-02_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
+  #grllist.append('/afs/cern.ch/work/j/jodafons/public/data/data16_13TeV.periodAllYear_DetStatus-v81-pro20-10_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
+  #grllist.append('data16_13TeV.periodAllYear_DetStatus-v81-pro20-10_DQDefects-00-02-02_PHYS_StandardGRL_All_Good_25ns.xml')
+  grllist.append('data17_13TeV.periodAllYear_DetStatus-v92-pro21-05_Unknown_PHYS_StandardGRL_All_Good_25ns_Triggerno17e33prim.xml')
+
+####################################################################################################
+
+acf.EvtMax=nov
+rec.readAOD=True
+# switch off detectors
+rec.doForwardDet=False
+rec.doInDet=False
+rec.doCalo=False
+rec.doMuon=False
+rec.doEgamma=False
+rec.doTrigger=True
+recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off)
+rec.doMuon=False
+rec.doMuonCombined=False
+rec.doWriteAOD=True
+rec.doWriteESD=False
+rec.doDPD=False
+rec.doTruth=False
+# autoconfiguration might trigger undesired feature
+rec.doESD.set_Value_and_Lock(False)      # uncomment if do not run ESD making algorithms
+rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD
+rec.doAOD.set_Value_and_Lock(True)       # uncomment if do not run AOD making algorithms
+rec.doWriteAOD.set_Value_and_Lock(False) # uncomment if do not write AOD
+rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG
+
+# main jobOption
+include ("RecExCommon/RecExCommon_topOptions.py")
+MessageSvc.debugLimit = 20000000
+MessageSvc.infoLimit  = 20000000
+
+# Add Trigger Decision Tool 
+from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool
+tdt = Trig__TrigDecisionTool( "TrigDecisionTool" )
+tdt.TrigDecisionKey='xTrigDecision'
+tdt.Navigation.ReadonlyHolders=True
+ToolSvc+=tdt
+
+try:
+  include ("AthenaMonitoring/DataQualityInit_jobOptions.py")
+except Exception:
+  treatException("Could not load AthenaMonitoring/DataQualityInit_jobOptions.py")
+
+
+
+
+# Call top sequence
+from AthenaCommon.AlgSequence import AlgSequence, AthSequencer
+topSequence = AlgSequence()
+
+
+##################################### GRL Tools ##########################################
+# Good Run List (GRL)
+if doGRL:
+  from RecExConfig.InputFilePeeker import inputFileSummary
+  try:
+    if inputFileSummary['evt_type'][0] == "IS_DATA":
+      from GoodRunsLists.GoodRunsListsConf import *
+      ToolSvc += GoodRunsListSelectorTool()
+      GoodRunsListSelectorTool.GoodRunsListVec = grllist 
+      from GoodRunsListsUser.GoodRunsListsUserConf import *
+      seq = AthSequencer("AthFilterSeq")
+      seq += GRLTriggerSelectorAlg('GRLTriggerAlg1')
+      #seq.GRLTriggerAlg1.GoodRunsListArray = ['PHYS_StandardGRL_All_Good_25ns']  
+      seq.GRLTriggerAlg1.GoodRunsListArray = [grllist[0].replace('.xml','')]  
+  except:
+    print "GRL not available!"
+  
+##################################### Mon Tools ##########################################
+
+from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
+topSequence += AthenaMonManager( "HLTMonManager")
+HLTMonManager = topSequence.HLTMonManager
+################ Mon Tools #################
+#Global HLTMonTool
+from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool
+HLTMon = HLTMonTool(name  = 'HLTMon', histoPathBase = "HLT");
+ToolSvc += HLTMon;
+HLTMonManager.AthenaMonTools += [ "HLTMonTool/HLTMon" ];
+
+####################################################################################################
+#Define the base path for all histograms
+
+
+
+basePath = '/HLT/Egamma'
+#Configure the TrigEgammaPlotTool
+from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaNavTPAnalysisTool, TrigEgammaPlotTool, EfficiencyTool, DistTool, ResolutionTool
+from TrigEgammaAnalysisTools.TrigEgammaProbelist           import monitoring_mam, monitoring_electron, monitoring_photon 
+from TrigEgammaAnalysisTools.TrigEgammaProbelist           import probeListLowMidPtSupportingTriggers, probeListHighPtSupportingTriggers
+
+PlotTool = TrigEgammaPlotTool.copy( name="TrigEgammaPlotTool",
+                                    DirectoryPath=basePath,
+                                    MaM=monitoring_mam,
+                                    Efficiency=[],
+                                    Distribution=[],
+                                    Resolution=[])
+
+EffTool = EfficiencyTool.copy(name="EfficiencyTool",
+                              PlotTool=PlotTool,
+                              isEMResultNames=["Tight","Medium","Loose"],
+                              LHResultNames=["LHTight","LHMedium","LHLoose"],
+                              OutputLevel=0)
+
+
+
+####################################################################################################
+from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool
+from TrigEgammaEmulationTool.TrigEgammaEmulationEFConfig   import EgammaEFElectronDefaultEmulator,EgammaEFElectronNoD0Emulator
+from TriggerJobOpts.TriggerFlags import TriggerFlags
+
+# Force this emulation selector path
+TriggerFlags.EgammaSlice.pidVersion.set_Value_and_Lock("ElectronPhotonSelectorTools/trigger/rel21_20170217/")
+TriggerFlags.EgammaSlice.ringerVersion.set_Value_and_Lock("RingerSelectorTools/TrigL2_20170505_v6")
+
+EmulationElectronTool = TrigEgammaEmulationTool.copy( name="TrigEgammaEmulationTool",
+                                                      TriggerList = triggerList,
+                                                      DoL2ElectronFex=True,
+                                                      DoEFCaloPid=False,
+                                                      DoRinger=True,
+                                                      OutputLevel=0)
+
+####################################################################################################
+
+AnalysisTool = TrigEgammaNavTPAnalysisTool( name = "TrigEgammaNavTPAnalysisTool",
+                                            Analysis='Zee',
+                                            PlotTool=PlotTool,
+                                            Tools=[EffTool],
+                                            OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose
+                                            OfflineProbeSelector='Loose', 
+                                            DefaultProbePid='LHMedium',
+                                            doEmulation=doEmulation,
+                                            DetailedHistograms=DetailedHistograms,
+                                            EmulationTool=EmulationElectronTool,
+                                            TPTrigger=False,
+                                            RemoveCrack=False,
+                                            TagTriggerList=tagList,
+                                            TriggerList=triggerList,
+                                            OutputLevel=0)
+
+####################################################################################################
+Tools=['TrigEgammaNavTPAnalysisTool/TrigEgammaNavTPAnalysisTool']
+from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool
+TrigEgammaMonTool = TrigEgammaMonTool( name = "HLTEgammaMon", histoPathBase=basePath, Tools=Tools)
+ToolSvc += TrigEgammaMonTool
+HLTMonManager.AthenaMonTools += [ "TrigEgammaMonTool/HLTEgammaMon" ]
+HLTMonManager.FileKey = "GLOBAL"
+ToolSvc.TrigDecisionTool.Navigation.OutputLevel = WARNING
+####################################################################################################
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py
new file mode 100644
index 0000000000000000000000000000000000000000..ba72df178c83f6d1e99bf66c96169841bb2868a5
--- /dev/null
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/share/testTrigEgammaEventSelectionTool.py
@@ -0,0 +1,195 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+# Job options for standalone and Tier0 running of AnalysisTools 
+# Authors: 
+# Ryan Mackenzie White <ryan.white@cern.ch>
+# 
+# Tool and algorithm configuration done using egamma Factories
+# Default configurations found in TrigEgammaAnalysisToolsConfig
+#
+# To run
+# athena -l DEBUG -c "DIR='/afs/cern.ch/work/j/jolopezl/datasets/valid1.147406.PowhegPythia8_AZNLO_Zee.recon.AOD.e3099_s2578_r6220_tid05203475_00'" 
+#                 -c "NOV=50" test_ZeeElectronLowPtSupportingTrigAnalysis.py
+# where NOV is the number of events to run
+
+from AthenaCommon.AthenaCommonFlags import athenaCommonFlags
+from RecExConfig.RecFlags import rec
+from RecExConfig.RecAlgsFlags import recAlgs
+from AthenaCommon.AppMgr import ToolSvc
+import os
+
+doZ=True
+doFakes=True
+
+# Define triggers for tagging 
+triggerTags     = ['HLT_e24_lhtight_nod0_ivarloose',
+                   'HLT_e26_lhtight_nod0_ivarloose',
+                   'HLT_e28_lhtight_nod0_ivarloose']
+
+triggerList = [
+         # standard monitoring chains
+         'HLT_e26_lhtight_nod0_ivarloose',
+         'HLT_e28_lhtight_nod0_ivarloose',
+         'HLT_e60_lhmedium_nod0_L1EM24VHI',
+         # no ringer chains for pos-commissioning...
+         'HLT_e26_lhtight_nod0_noringer_ivarloose_L1EM22VHI',
+         'HLT_e28_lhtight_nod0_noringer_ivarloose', # get real TDT
+         'HLT_e28_lhtight_nod0_noringer_ivarloose_L1EM24VHI',
+         'HLT_e60_lhmedium_nod0_noringer_L1EM24VHI',
+      ]
+
+
+
+#print 'Set some variables for job'
+dirtouse = str()
+finallist=[]
+
+if 'FILE' in dir() :
+     finallist.append(FILE)
+
+if 'DIR' in dir() :
+     dirtouse=DIR      
+     print 'DIR = ',dirtouse
+     while( dirtouse.endswith('/') ) :
+          dirtouse= dirtouse.rstrip('/')
+     listfiles=os.listdir(dirtouse)
+     for ll in listfiles:
+          finallist.append(dirtouse+'/'+ll)
+
+if 'NOV' in dir():
+    nov=NOV
+else :
+    nov=-1
+
+
+print  finallist 
+athenaCommonFlags.FilesInput=finallist
+athenaCommonFlags.EvtMax=nov
+rec.readAOD=True
+# switch off detectors
+rec.doForwardDet=False
+rec.doInDet=False
+rec.doCalo=False
+rec.doMuon=False
+rec.doEgamma=False
+rec.doTrigger = True; recAlgs.doTrigger=False # disable trigger (maybe necessary if detectors switched off)
+rec.doMuon=False
+rec.doAOD=False
+rec.doMuonCombined=False
+rec.doWriteAOD=False
+rec.doWriteESD=False
+rec.doDPD=False
+rec.doTruth=False
+
+# autoconfiguration might trigger undesired feature
+rec.doESD.set_Value_and_Lock(False) # uncomment if do not run ESD making algorithms
+rec.doWriteESD.set_Value_and_Lock(False) # uncomment if do not write ESD
+rec.doAOD.set_Value_and_Lock(True) # uncomment if do not run AOD making algorithms
+rec.doWriteAOD.set_Value_and_Lock(False) # uncomment if do not write AOD
+rec.doWriteTAG.set_Value_and_Lock(False) # uncomment if do not write TAG
+
+# main jobOption
+include ("RecExCommon/RecExCommon_topOptions.py")
+MessageSvc.debugLimit = 20000000
+MessageSvc.infoLimit  = 20000000
+# TDT
+from TrigDecisionTool.TrigDecisionToolConf import Trig__TrigDecisionTool
+tdt = Trig__TrigDecisionTool( "TrigDecisionTool" )
+tdt.TrigDecisionKey='xTrigDecision'
+tdt.Navigation.ReadonlyHolders=True
+ToolSvc+=tdt
+
+try:
+  include ("AthenaMonitoring/DataQualityInit_jobOptions.py")
+except Exception:
+  treatException("Could not load AthenaMonitoring/DataQualityInit_jobOptions.py")
+
+from AthenaCommon.AlgSequence import AlgSequence
+topSequence = AlgSequence()
+
+from AthenaMonitoring.AthenaMonitoringConf import AthenaMonManager
+topSequence += AthenaMonManager( "HLTMonManager")
+HLTMonManager = topSequence.HLTMonManager
+
+################ Mon Tools #################
+#Global HLTMonTool
+
+from TrigHLTMonitoring.TrigHLTMonitoringConf import HLTMonTool
+HLTMon = HLTMonTool(name  = 'HLTMon', histoPathBase = "HLT");
+
+ToolSvc += HLTMon;
+HLTMonManager.AthenaMonTools += [ "HLTMonTool/HLTMon" ];
+    
+from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConfig import TrigEgammaPlotTool, getEventSelectionTool
+#Define the base path for all histograms
+basePath = '/HLT/Physval'
+
+#Configure the TrigEgammaPlotTool
+PlotTool = TrigEgammaPlotTool.copy( name="TrigEgammaPlotTool",
+                                    DirectoryPath=basePath,
+                                    #MaM=monitoring_mam,
+                                    Efficiency=[],
+                                    Distribution=[],
+                                    Resolution=[])
+
+TrigEgammaEventSelection = getEventSelectionTool()
+
+####################################################################################################
+
+from TrigEgammaEmulationTool.TrigEgammaEmulationToolConfig import TrigEgammaEmulationTool
+from TrigEgammaEmulationTool.TrigEgammaEmulationEFConfig   import EgammaEFElectronDefaultEmulator,EgammaEFElectronNoD0Emulator
+from TriggerJobOpts.TriggerFlags import TriggerFlags
+
+# Force this emulation selector path
+TriggerFlags.EgammaSlice.pidVersion.set_Value_and_Lock("ElectronPhotonSelectorTools/trigger/rel21_20170217/")
+TriggerFlags.EgammaSlice.ringerVersion.set_Value_and_Lock("RingerSelectorTools/TrigL2_20170505_v6")
+
+EmulationElectronTool = TrigEgammaEmulationTool.copy( name="TrigEgammaEmulationTool",
+                                                      TriggerList = triggerList,
+                                                      DoL2ElectronFex=True,
+                                                      DoEFCaloPid=False,
+                                                      DoRinger=True,
+                                                      OutputLevel=0)
+
+####################################################################################################
+
+
+Tool = TrigEgammaEventSelection( name='EventSelection',
+                              Analysis='Probes',
+                              PlotTool=PlotTool,
+                              EmulationTool=EmulationElectronTool,
+                              File="",
+                              OutputLevel=0,
+                              DetailedHistograms=False,
+                              isEMResultNames=["Tight","Medium","Loose"],
+                              LHResultNames=["LHTight","LHMedium","LHLoose"],
+                              ZeeLowerMass=80,
+                              ZeeUpperMass=100,
+                              OfflineTagSelector='Tight', # 1=tight, 2=medium, 3=loose
+                              OfflineProbeSelector='Loose', 
+                              ForceProbePid=False, 
+                              OppositeCharge=True,
+                              OfflineTagMinEt=25,
+                              TagTriggerList=triggerTags,
+                              SelectionZ=doZ,
+                              SelectionFakes=doFakes,
+                              ApplyMinimalTrigger=False,
+                              DetailedDataLevel=2,
+                              DumpTags=False,
+                              TriggerList=triggerList)
+
+Tools=['TrigEgammaEventSelection/EventSelection']
+
+from TrigEgammaAnalysisTools.TrigEgammaAnalysisToolsConf import TrigEgammaMonTool
+TrigEgammaMonTool = TrigEgammaMonTool( name = "HLTEgammaMon", 
+                                       histoPathBase=basePath,
+                                       Tools=Tools)
+
+ToolSvc += TrigEgammaMonTool
+
+#TrigEgammaMonToolConfig.TrigEgammaMonTool()
+HLTMonManager.AthenaMonTools += [ "TrigEgammaMonTool/HLTEgammaMon" ]
+HLTMonManager.FileKey = "GLOBAL"
+
+
+    
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx
index dd7bd078d5cafd27abcf966fe9f249a9caf90725..84c3551dfebaa04a6d898a422187b459a61147ac 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/TrigEgammaMonTool.cxx
@@ -27,20 +27,23 @@ TrigEgammaMonTool( const std::string & type, const std::string & name, const IIn
 }
 
 TrigEgammaMonTool::~TrigEgammaMonTool(){}
-StatusCode TrigEgammaMonTool::init(){
-   
+
+
+StatusCode TrigEgammaMonTool::init(){   
   return StatusCode::SUCCESS; 
 }
 
 StatusCode TrigEgammaMonTool::book(){
     ATH_MSG_INFO("Initializing " << name() << "...");
-    ATH_MSG_INFO("Retrieving tools...");
+    ATH_MSG_INFO("Retrieving tools..." << m_asgToolNames.size());
 
     for(const auto toolname : m_asgToolNames){
+        ATH_MSG_INFO("Add "<<toolname<<"..." );
         m_asgtools.push_back(ToolHandle<ITrigEgammaAnalysisBaseTool>(toolname));
     }
     for ( ToolHandleArray<ITrigEgammaAnalysisBaseTool>::const_iterator itoo=m_asgtools.begin();
             itoo!=m_asgtools.end(); ++itoo ) {
+        ATH_MSG_INFO("Initializing..." );
         ToolHandle<ITrigEgammaAnalysisBaseTool> htool = *itoo;
         htool->setParent(this);
         StatusCode sc = htool->initialize();
@@ -56,8 +59,6 @@ StatusCode TrigEgammaMonTool::book(){
     }
     
     ATH_MSG_INFO("Tool retrieval completed.");
-
-
     return StatusCode::SUCCESS;
 }
 
diff --git a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx
index 77b8a9677f6efc5eeab05dc99eb9e46bd6699c90..9facf0a35fafc63e7a0002d0f270795aacfbb8bc 100644
--- a/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx
+++ b/Trigger/TrigAnalysis/TrigEgammaAnalysisTools/src/components/TrigEgammaAnalysisTools_entries.cxx
@@ -5,28 +5,25 @@
 #include "TrigEgammaAnalysisTools/TrigEgammaNavAnalysisTool.h"
 #include "TrigEgammaAnalysisTools/TrigEgammaNavTPBaseTool.h"
 #include "TrigEgammaAnalysisTools/TrigEgammaNavTPAnalysisTool.h"
-#include "TrigEgammaAnalysisTools/TrigEgammaNavNtuple.h"
-#include "TrigEgammaAnalysisTools/TrigEgammaNavTPNtuple.h"
 #include "TrigEgammaAnalysisTools/EfficiencyTool.h"
 #include "TrigEgammaAnalysisTools/TrigEgammaResolutionTool.h"
 #include "TrigEgammaAnalysisTools/TrigEgammaDistTool.h"
 #include "TrigEgammaAnalysisTools/TrigEgammaPlotTool.h"
+#include "TrigEgammaAnalysisTools/TrigEgammaEventSelection.h"
 #include "../TrigEgammaAnalysisAlg.h"
 #include "../TrigEgammaTDToolTest.h"
 
-DECLARE_COMPONENT( TrigEgammaAnalysisBaseTool )
-DECLARE_COMPONENT( TrigEgammaMonTool )
-DECLARE_COMPONENT( TrigEgammaPhysValMonTool )
-DECLARE_COMPONENT( TrigEgammaNavTPBaseTool )
-DECLARE_COMPONENT( TrigEgammaNavTPNtuple )
-DECLARE_COMPONENT( TrigEgammaNavAnalysisTool )
-DECLARE_COMPONENT( TrigEgammaNavTPAnalysisTool )
-DECLARE_COMPONENT( TrigEgammaNavNtuple )
-DECLARE_COMPONENT( EfficiencyTool ) 
-DECLARE_COMPONENT( TrigEgammaResolutionTool ) 
-DECLARE_COMPONENT( TrigEgammaDistTool ) 
-DECLARE_COMPONENT( TrigEgammaPlotTool ) 
-DECLARE_COMPONENT( TrigEgammaAnalysisAlg )
-DECLARE_COMPONENT( TrigEgammaTDToolTest )
-    
+DECLARE_COMPONENT(TrigEgammaAnalysisBaseTool)
+DECLARE_COMPONENT(TrigEgammaMonTool)
+DECLARE_COMPONENT(TrigEgammaPhysValMonTool)
+DECLARE_COMPONENT(TrigEgammaNavTPBaseTool)
+DECLARE_COMPONENT(TrigEgammaNavAnalysisTool)
+DECLARE_COMPONENT(TrigEgammaNavTPAnalysisTool)
+DECLARE_COMPONENT(EfficiencyTool) 
+DECLARE_COMPONENT(TrigEgammaResolutionTool) 
+DECLARE_COMPONENT(TrigEgammaDistTool) 
+DECLARE_COMPONENT(TrigEgammaPlotTool) 
+DECLARE_COMPONENT(TrigEgammaEventSelection) 
+DECLARE_COMPONENT(TrigEgammaAnalysisAlg)
+DECLARE_COMPONENT(TrigEgammaTDToolTest)