diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h
index f0e5c20cb8eff382b8de49f459ff943106ffcb41..2da3574a105fa47d21b466e220b5d65eb4138c73 100644
--- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h
+++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/LVL1TGCTrigger.h
@@ -114,7 +114,7 @@ namespace LVL1TGCTrigger {
     void recordRdoInner(TGCSector *);
     
     // record bare-RDO for R-phi coincidences (on m_OutputTgcRDO=True):
-    void recordRdoSL(TGCSector *, unsigned int );
+    void recordRdoSL(TGCSector *);
     
     std::map<std::pair<int, int>, TgcRdo*>  m_tgcrdo;
     
@@ -130,7 +130,7 @@ namespace LVL1TGCTrigger {
     bool addRawData(TgcRawData *);
     int getLPTTypeInRawData(int type);
     void FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicData* sldata,
-			     const TGCSLSelectorOut *selectorOut,
+			     const TGCSLSelectorOut* out,
 			     unsigned int subsystem);
     void FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicDataPhase1* sldata,
 			     const TGCTrackSelectorOut *trackSelectorOut);
diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h
index 7e00e886906186a7a33fe67ddcee8eeb2003938f..5e436d92824a1ef887af1bdaad4a6aee8e684a88 100644
--- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h
+++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelector.h
@@ -1,9 +1,11 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
-#ifndef TGCSLSelector_hh
-#define TGCSLSelector_hh
+#ifndef TrigT1TGC_TGCSLSelector_h
+#define TrigT1TGC_TGCSLSelector_h
+
+#include <memory>
 
 namespace LVL1TGCTrigger {
 
@@ -11,21 +13,19 @@ class TGCSectorLogic;
 class TGCSLSelectorOut;
 class TGCSLPreSelectorOut;
 
-class TGCSLSelector {
-public:
-
+class TGCSLSelector
+{
+ public:
   TGCSLSelector(const TGCSectorLogic* sL=0); 
-  virtual ~TGCSLSelector(){} 
+  virtual ~TGCSLSelector();
 
-  TGCSLSelectorOut* select(TGCSLPreSelectorOut* PSOut, TGCSLSelectorOut* out);
-
-private:
+  bool select(TGCSLPreSelectorOut* in, std::shared_ptr<TGCSLSelectorOut> out);
 
+ private:
   const TGCSectorLogic* m_sectorLogic;
-
 };
 
 
-} //end of namespace bracket
+}   // end of namespace
 
-#endif // TGCSLSelector_hh
+#endif
diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h
index 041f580ae5b0aa047107ab2ca5c1badd47b62ac1..56e0fbd91f7de45b2ec62bcb202760b5850f0f17 100644
--- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h
+++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSLSelectorOut.h
@@ -13,6 +13,8 @@ class TGCSLSelectorOut
   static constexpr int s_NCandidateInSLSelector = 2;
 
  public:
+  void reset();
+
   void setPtLevel(int order, int ptLevel);
   void setR(int order, int rIn) { m_r[order]=rIn;};
   void setPhi(int order, int phiIn) {m_phi[order]=phiIn;};
diff --git a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h
index 0ae0faf5c14fac551333e04a1e68227db514d717..8afb4b341e2e54e12c30dc02ba7255fbde7ad7b8 100644
--- a/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h
+++ b/Trigger/TrigT1/TrigT1TGC/TrigT1TGC/TGCSectorLogic.h
@@ -54,16 +54,14 @@ class TGCSectorLogic
 
   TGCSectorLogic(const TGCSectorLogic& right);
 
-  const TGCSLSelectorOut* getSelectorOutput() const { return m_selectorOut; }
-  void getTrackSelectorOutput(std::shared_ptr<TGCTrackSelectorOut> &trackSelectorOut)const ;
+  const TGCSLSelectorOut* getSelectorOutput() const { return m_selectorOut.get(); }
+  void getTrackSelectorOutput(std::shared_ptr<TGCTrackSelectorOut> &trackSelectorOut) const;
 
   int  getTileMuonWord() const;
   int  getInnerStationWord() const;
 
-  void eraseSelectorOut(); 
-
   void clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCondKey,
-               int bidIn);
+               int bidIn, bool process=true);
 
   int getId() const;
   int getModuleID() const;
@@ -80,7 +78,7 @@ class TGCSectorLogic
 
   void setTMDB(const TGCTMDB* tmdb);
   void setNSW(std::shared_ptr<const TGCNSW> nsw);
-  void showResult(TGCSLSelectorOut* out);
+  void showResult();
  
   int getNumberOfSubSectorCluster() const; 
   int getNumberOfSubSector() const; 
@@ -144,7 +142,7 @@ private:
   // for Run2
   TGCSLPreSelector m_preSelector; 
   TGCSLSelector m_selector;
-  TGCSLSelectorOut* m_selectorOut;
+  std::shared_ptr<TGCSLSelectorOut> m_selectorOut;
   
   // for Run3
   TGCTrackSelector m_trackSelector;
diff --git a/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx b/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx
index e8227f4b7b9ee0b69b5d6afa84b8f7bf8fb1a000..ca058158562cec3fc4266fe9d78f59f86da8ed5c 100644
--- a/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx
+++ b/Trigger/TrigT1/TrigT1TGC/src/LVL1TGCTrigger.cxx
@@ -299,35 +299,35 @@ namespace LVL1TGCTrigger {
           TGCSector* sector = m_system->getSector(i,j,k);
           if(sector==0) continue;
 
-          if((sector->hasHit())){
-            m_TimingManager->startHighPtBoard(sector);
-            if (m_OutputTgcRDO.value()) recordRdoHPT(sector);
+          m_TimingManager->startHighPtBoard(sector);
+          if (m_OutputTgcRDO.value()) recordRdoHPT(sector);
 
-            // EIFI trigger bits are checked if Endcap
-            if(sector->getRegionType()==Endcap && sector->getSL()) {
+          // EIFI trigger bits are checked if Endcap
+          if(sector->getRegionType()==Endcap && sector->getSL()) {
+            if((sector->hasHit())){
               // Pointers to store EIFI trigger bits for Endcap SL
               const TGCInnerTrackletSlot* innerTrackletSlots[TGCInnerTrackletSlotHolder::NUMBER_OF_SLOTS_PER_TRIGGER_SECTOR]
                 = {0, 0, 0, 0};
               m_innerTrackletSlotHolder.getInnerTrackletSlots(i, j, k, innerTrackletSlots);
               sector->getSL()->setInnerTrackletSlots(innerTrackletSlots);
             }
-
-            m_TimingManager->startSectorLogic(sector);
-            sector->clearNumberOfHit();
           }
+          m_TimingManager->startSectorLogic(sector);
+          if(sector->hasHit()) sector->clearNumberOfHit();
 
           // Fill inner (EIFI/Tile) words
           if (m_OutputTgcRDO.value() && m_tgcArgs.USE_INNER()) recordRdoInner(sector);
 
           // Fill Lvl1MuCTPInput
+          if (m_OutputTgcRDO.value()) recordRdoSL(sector);
+
           size_t tgcsystem=0,subsystem=0;
           if(i==0) subsystem = LVL1MUONIF::Lvl1MuCTPIInput::idSideA();
           if(i==1) subsystem = LVL1MUONIF::Lvl1MuCTPIInput::idSideC();
-          if (m_OutputTgcRDO.value()) recordRdoSL(sector, subsystem);
 
           const TGCSLSelectorOut* selectorOut = sector->getSL()->getSelectorOutput();
 	  std::shared_ptr<TGCTrackSelectorOut>  trackSelectorOut;
-	  sector->getSL()->getTrackSelectorOutput(trackSelectorOut); 
+	  sector->getSL()->getTrackSelectorOutput(trackSelectorOut);
 
           if(sector->getRegionType()==Endcap){
             if(m_tgcArgs.useRun3Config()){
@@ -338,7 +338,7 @@ namespace LVL1TGCTrigger {
             }else{
               LVL1MUONIF::Lvl1MuEndcapSectorLogicData sldata;
               tgcsystem = LVL1MUONIF::Lvl1MuCTPIInput::idEndcapSystem();
-              if(selectorOut!=0) FillSectorLogicData(&sldata,selectorOut,subsystem);
+              if(selectorOut!=0) FillSectorLogicData(&sldata, selectorOut, subsystem);
               muctpiinput->setSectorLogicData(sldata,tgcsystem,subsystem,sectoraddr_endcap++,muctpiBcId);
             }
           } else if(sector->getRegionType()==Forward){
@@ -350,19 +350,12 @@ namespace LVL1TGCTrigger {
             }else{
               LVL1MUONIF::Lvl1MuForwardSectorLogicData sldata;
               tgcsystem = LVL1MUONIF::Lvl1MuCTPIInput::idForwardSystem();
-              if(selectorOut!=0) FillSectorLogicData(&sldata,selectorOut,subsystem);
+              if(selectorOut!=0) FillSectorLogicData(&sldata, selectorOut, subsystem);
               muctpiinput->setSectorLogicData(sldata,tgcsystem,subsystem,sectoraddr_forward++,muctpiBcId);
             }
           }
 
-	  //** Selector in  Run2
-          // delete selectorOut
-          sector->getSL()->eraseSelectorOut();
-          if (selectorOut != 0 ) delete selectorOut;
-          selectorOut=0;
-	  
 	  //** Selector in  Run3
-          // delete selectorOut
 	  trackSelectorOut.get()->reset();
 
 
@@ -499,61 +492,61 @@ namespace LVL1TGCTrigger {
     }
   }
 
-  ////////////////////////////////////////////////////////
-  void LVL1TGCTrigger::FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicData *sldata,
-                                           const TGCSLSelectorOut* selectorOut, unsigned int subsystem)
-  {
-    if(selectorOut ==0) return;
-    int Zdir= (subsystem==LVL1MUONIF::Lvl1MuCTPIInput::idSideA() ? 1 : -1);
+////////////////////////////////////////////////////////
+void LVL1TGCTrigger::FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicData *sldata,
+                                         const TGCSLSelectorOut* out, unsigned int subsystem)
+{
+  if(out == nullptr) return;
+  int Zdir= (subsystem==LVL1MUONIF::Lvl1MuCTPIInput::idSideA() ? 1 : -1);
     
-    sldata->clear2candidatesInSector();// for temporary
+  sldata->clear2candidatesInSector(); // clear >2 candidates bit at first.
 
-    const int muctpiBcId_offset = TgcDigit::BC_CURRENT;
-    sldata->bcid(m_bctagInProcess - muctpiBcId_offset);
+  const int muctpiBcId_offset = TgcDigit::BC_CURRENT;
+  sldata->bcid(m_bctagInProcess - muctpiBcId_offset);
 
-    if ((selectorOut->getNCandidate()) >= 1) {
-      sldata->roi(0,((selectorOut->getR(0))<<2)+(selectorOut->getPhi(0)));
+  if ((out->getNCandidate()) >= 1) {
+      sldata->roi(0, ((out->getR(0))<<2)+(out->getPhi(0)));
       //      ovl --> veto
       //      sldata->ovl(0,0);
-      if (selectorOut->getInnerVeto(0)) sldata->ovl(0,1);
+      if (out->getInnerVeto(0)) sldata->ovl(0,1);
       else                              sldata->ovl(0,0);
-      sldata->pt(0,selectorOut->getPtLevel(0));
-      sldata->charge(0, getCharge(selectorOut->getDR(0),Zdir));
-    } else {
+      sldata->pt(0, out->getPtLevel(0));
+      sldata->charge(0, getCharge(out->getDR(0),Zdir));
+  } else {
       // no entry
-    }
-    if ((selectorOut->getNCandidate()) == 2) {
-      sldata->roi(1,((selectorOut->getR(1))<<2)+(selectorOut->getPhi(1)));
+  }
+  if ((out->getNCandidate()) == 2) {
+      sldata->roi(1, ((out->getR(1))<<2)+(out->getPhi(1)));
       //      ovl --> veto
       //      sldata->ovl(1,0);
-      if (selectorOut->getInnerVeto(1)) sldata->ovl(1,1);
+      if (out->getInnerVeto(1)) sldata->ovl(1,1);
       else                              sldata->ovl(1,0);
-      sldata->pt(1,selectorOut->getPtLevel(1));
-      sldata->charge(1, getCharge(selectorOut->getDR(1),Zdir));
-    }
-    sldata->set2candidates(0);// not used for TGC
-    sldata->clear2candidates(0);// not used for TGC
-    sldata->set2candidates(1);// not used for TGC
-    sldata->clear2candidates(1);// not used for TGC
+      sldata->pt(1, out->getPtLevel(1));
+      sldata->charge(1, getCharge(out->getDR(1), Zdir));
+  }
+  sldata->set2candidates(0);// not used for TGC
+  sldata->clear2candidates(0);// not used for TGC
+  sldata->set2candidates(1);// not used for TGC
+  sldata->clear2candidates(1);// not used for TGC
     
-    // Print
-    if(m_debuglevel) {
-      if ((selectorOut->getNCandidate()) >= 1) {
+  // Print
+  if(m_debuglevel) {
+      if ((out->getNCandidate()) >= 1) {
         ATH_MSG_DEBUG( "SectorLogic: 1st candidate   "
-                       << " roi:" << (selectorOut->getR(0))<<2 + selectorOut->getPhi(0)
-                       << " pt:" << selectorOut->getPtLevel(0)
-                       << " charge:" << getCharge(selectorOut->getDR(0),Zdir)
+                       << " roi:" << (out->getR(0))<<2 + out->getPhi(0)
+                       << " pt:" << out->getPtLevel(0)
+                       << " charge:" << getCharge(out->getDR(0),Zdir)
                        << " veto:" << sldata->ovl(0));
       }
-      if ((selectorOut->getNCandidate()) == 2) {
+      if ((out->getNCandidate()) == 2) {
         ATH_MSG_DEBUG( "SectorLogic: 2nd candidate   "
-                       << " roi:" << (selectorOut->getR(1))<<2 + selectorOut->getPhi(1)
-                       << " pt:" << selectorOut->getPtLevel(1)
-                       << " charge:" << getCharge(selectorOut->getDR(1),Zdir)
+                       << " roi:" << (out->getR(1))<<2 + out->getPhi(1)
+                       << " pt:" << out->getPtLevel(1)
+                       << " charge:" << getCharge(out->getDR(1), Zdir)
                        << " veto:" << sldata->ovl(1));
       }
-    }
   }
+}
 
   ////////////////////////////////////////////////////////
   void LVL1TGCTrigger::FillSectorLogicData(LVL1MUONIF::Lvl1MuSectorLogicDataPhase1 *sldata,
@@ -711,9 +704,11 @@ namespace LVL1TGCTrigger {
     }   // end loop for SLB type
   }
   
-  ////////////////////////////////////////////////////////
-  void LVL1TGCTrigger::recordRdoHPT(TGCSector * sector)
-  {
+////////////////////////////////////////////////////////
+void LVL1TGCTrigger::recordRdoHPT(TGCSector* sector)
+{
+  if(sector->hasHit() == false) return;
+
     // readoutID
     int subDetectorId, rodId, sswId, sbLoc, secId;
     
@@ -840,7 +835,7 @@ namespace LVL1TGCTrigger {
 
       }   // end loop for # of HPB per sector
     }   // end loop for HPB type
-  }
+}
 
   
   ////////////////////////////////////////////////////////
@@ -925,26 +920,22 @@ namespace LVL1TGCTrigger {
     
   }
   
-  ///////////////////////////////////////////////////////
-  void LVL1TGCTrigger::recordRdoSL(TGCSector * sector, unsigned int subsystem)
-  {
-    // check if whether trigger exists or not
+///////////////////////////////////////////////////////
+void LVL1TGCTrigger::recordRdoSL(TGCSector* sector)
+{
+    // check if whether trigger output exists or not
     const TGCSLSelectorOut* selectorOut = sector->getSL()->getSelectorOutput();
-    if (selectorOut ==0) return;
-    if (selectorOut->getNCandidate()==0) return;
-    
-    // readoutID
-    int subDetectorId=0, rodId=0, sswId=0, sbLoc=0, secId=0;
+    if (selectorOut == nullptr) return;
+    if (selectorOut->getNCandidate() == 0) return;
     
     // trigger info
-    bool cand3plus=0, isEndcap=0, isAside=0, muplus=0, overlap=0, veto=0;
+    bool cand3plus = 0;
+    bool isEndcap = (sector->getRegionType() == Endcap);
+    bool isAside = (sector->getSideId()==0);
+    bool veto=0;
     int phi=0, index=0, threshold=0, roi=0;
-    int Zdir= (subsystem==LVL1MUONIF::Lvl1MuCTPIInput::idSideA() ? 1 : -1);
-    
-    isAside = (sector->getSideId()==0);
-    isEndcap = (sector->getRegionType()==Endcap);
-    cand3plus = 0;
-    
+    int Zdir= (isAside) ? 1 : -1;
+
     //  sector Id = 0..47 (Endcap) 0..23 (forward)
     int module = sector->getModuleId();
     int sectorId;
@@ -959,13 +950,14 @@ namespace LVL1TGCTrigger {
     //  0-5(EC), 0-2(FWD) for new TGCcabling (octant)
     int startEndcapSector, coverageOfEndcapSector;
     int startForwardSector, coverageOfForwardSector;
-    rodId = 1;
+    int rodId = 1;
     m_cabling->getCoveragefromRodID(rodId,
                                     startEndcapSector,
                                     coverageOfEndcapSector,
                                     startForwardSector,
                                     coverageOfForwardSector
                                     ) ;
+    int secId = 0;
     if (isEndcap){
       secId = sectorId % coverageOfEndcapSector;
     } else {
@@ -976,6 +968,7 @@ namespace LVL1TGCTrigger {
     phi = (isEndcap ? (sectorId+46)%48+1 : (sectorId+23)%24+1);
     
     // get readout ID
+    int subDetectorId = 0, sswId = 0, sbLoc = 0;
     bool status = m_cabling->getReadoutIDfromSLID(phi, isAside, isEndcap,
                                                   subDetectorId, rodId, sswId, sbLoc);
     if (!status) {
@@ -985,11 +978,12 @@ namespace LVL1TGCTrigger {
                       << "  phi=" << phi );
       return;
     }
-    
+
+    bool overlap = 0;
     uint16_t bcTag=m_CurrentBunchTag, l1Id=0, bcId=0;
     for (int icand=0; icand < selectorOut->getNCandidate(); icand +=1) {
       index=icand;
-      muplus = getCharge(selectorOut->getDR(icand), Zdir)==1 ? 1 : 0;
+      bool muplus = getCharge(selectorOut->getDR(icand), Zdir)==1 ? 1 : 0;
       threshold = selectorOut->getPtLevel(icand);
       roi = ((selectorOut->getR(icand))<<2)+(selectorOut->getPhi(icand));
       if (selectorOut->getInnerVeto(icand)) veto = 1;
diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx
index 2ba7cc883bfa403b2f04225658db74233930a922..2d988c94b21459a8a496c705954cd3c571cd4bbc 100644
--- a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx
+++ b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelector.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "TrigT1TGC/TGCSLSelector.h"
@@ -9,35 +9,37 @@
 
 namespace LVL1TGCTrigger {
 
+TGCSLSelector::TGCSLSelector(const TGCSectorLogic* sl)
+ : m_sectorLogic(sl)
+{}
+
+TGCSLSelector::~TGCSLSelector()
+{}
+
 // select Highest Pt tracks from all Pt Level. 
-TGCSLSelectorOut* TGCSLSelector::select(TGCSLPreSelectorOut* PSOut,
-					TGCSLSelectorOut* out)
+bool TGCSLSelector::select(TGCSLPreSelectorOut* in, std::shared_ptr<TGCSLSelectorOut> out)
 {
-  int pt,i,j,nCan=0;
+  int nCan=0;
   int ptStart=NumberOfPtLevel;
-  for( i=0;(i<NumberOfPtLevel)&&(nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); i+=1){
-    pt=ptStart-i;
-    for( j=0;(j<TGCSLPreSelectorOut::NCandidateInSLPreSelector)&&
-	   (nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); j+=1) {
+  for(int i=0; (i<NumberOfPtLevel)&&(nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); i++) {
+    int pt = ptStart - i;
+    for(int j=0; (j<TGCSLPreSelectorOut::NCandidateInSLPreSelector)&&
+	         (nCan<TGCSLSelectorOut::s_NCandidateInSLSelector); j++) {
 
-      if(PSOut->getHit(pt,j)){
+      if(in->getHit(pt, j)){
 	out->setPtLevel(nCan,pt);
-	int R= 2*PSOut->getIdSSC(pt,j)+PSOut->getR(pt,j) - (m_sectorLogic->getRegion()==Endcap ? 1 : 0);
-	out->setR(nCan,R);
-	out->setPhi(nCan,PSOut->getPhi(pt,j));
-	out->setDR(nCan,2*PSOut->getDR(pt,j));
-	out->setDPhi(nCan,PSOut->getDPhi(pt,j));
-	out->setInnerVeto(nCan,PSOut->getInnerVeto(pt,j));
+	int R = 2 * in->getIdSSC(pt,j) + in->getR(pt,j) - (m_sectorLogic->getRegion()==Endcap ? 1 : 0);
+	out->setR(nCan, R);
+	out->setPhi(nCan, in->getPhi(pt,j));
+	out->setDR(nCan, 2 * in->getDR(pt,j));
+	out->setDPhi(nCan, in->getDPhi(pt,j));
+	out->setInnerVeto(nCan, in->getInnerVeto(pt,j));
 	nCan++;
       }
 
     }
   }
-  return out;
+  return (nCan>0) ? true : false;
 }
-TGCSLSelector::TGCSLSelector( const TGCSectorLogic* sL): 
-  m_sectorLogic(sL) 
-{ 
-} 
 
-} //end of namespace bracket
+}   // end of namespace
diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx
index 246504098f8d0c1066631c0b0439196a109844d8..7a97cf4499b24d2490039076aa0f3efa5e8a45e4 100644
--- a/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx
+++ b/Trigger/TrigT1/TrigT1TGC/src/TGCSLSelectorOut.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "TrigT1TGC/TGCSLSelectorOut.h"
@@ -7,7 +7,8 @@
 
 namespace LVL1TGCTrigger {
 
-TGCSLSelectorOut::TGCSLSelectorOut():m_nCandidate(0)
+TGCSLSelectorOut::TGCSLSelectorOut()
+ : m_nCandidate(0)
 {
   for( int i=0; i<s_NCandidateInSLSelector; i+=1){
     m_ptLevel[i]=0;
@@ -19,6 +20,19 @@ TGCSLSelectorOut::TGCSLSelectorOut():m_nCandidate(0)
   }
 }
 
+void TGCSLSelectorOut::reset()
+{
+  for(int i=0; i<s_NCandidateInSLSelector; i++) {
+    m_ptLevel[i]=0;
+    m_r[i]=0;
+    m_phi[i]=0;
+    m_dr[i]=99;
+    m_dphi[i]=99;
+    m_iVeto[i]=false;
+  }
+  m_nCandidate=0;
+}
+
 void TGCSLSelectorOut::setPtLevel(int order, int ptLevelIn)
 {
   if(order<s_NCandidateInSLSelector){
diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx
index e0ee10634e0c14f1aa06dac0e570e67ac6ffa30e..3fb8c9bff71a9f4b02d960feff75bf6a61c2952f 100644
--- a/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx
+++ b/Trigger/TrigT1/TrigT1TGC/src/TGCSectorLogic.cxx
@@ -36,10 +36,9 @@ TGCSectorLogic::TGCSectorLogic(TGCArguments* tgcargs, const TGCDatabaseManager*
    m_SSCController(tgcargs,this), 
    m_matrix(tgcargs,this),
    m_pTMDB(0),
-   m_preSelector(this), // for Run2 
-   m_selector(this),//for Run2  
-   m_selectorOut(0), //for Run2
-   m_trackSelector(this),// for Run3
+   m_preSelector(this),      // for Run2
+   m_selector(this),         // for Run2
+   m_trackSelector(this),    // for Run3
    m_wordTileMuon(0),
    m_wordInnerStation(0),
    m_stripHighPtBoard(0),
@@ -79,6 +78,7 @@ TGCSectorLogic::TGCSectorLogic(TGCArguments* tgcargs, const TGCDatabaseManager*
   m_mapGoodMF = db->getGoodMFMap();
   m_mapNSW = db->getNSWCoincidenceMap(m_sideId, m_octantId, m_moduleId);
 
+  m_selectorOut.reset(new TGCSLSelectorOut);
   m_trackSelectorOut.reset(new TGCTrackSelectorOut());//for Run3
 
   for(int i=0; i<MaxNumberOfWireHighPtBoard; i++){
@@ -97,9 +97,7 @@ TGCSectorLogic::TGCSectorLogic(TGCArguments* tgcargs, const TGCDatabaseManager*
 }
 
 TGCSectorLogic::~TGCSectorLogic()
-{
-  if(m_selectorOut) delete m_selectorOut;
-}
+{}
 
 void TGCSectorLogic::setTMDB(const TGCTMDB* tmdb)
 {
@@ -129,15 +127,14 @@ void TGCSectorLogic::getTrackSelectorOutput(std::shared_ptr<TGCTrackSelectorOut>
   trackSelectorOut=m_trackSelectorOut;
 }
 
-void TGCSectorLogic::eraseSelectorOut()
-{
-  m_selectorOut=0;
-}
-
 void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCondKey,
-                             int bidIn)
+                             int bidIn, bool process)
 {
-  int SSCid, phiposInSSC;
+  // reset output at the previous bunch crossing
+  m_selectorOut.get()->reset();
+  // skip to process if want. (e.g. no hit in TGC)
+  if(!process) return;
+
   m_bid=bidIn;
 
   collectInput();
@@ -151,13 +148,13 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon
 
   m_preSelector.init();
 
-  for(SSCid=0; SSCid<getNumberOfSubSectorCluster(); SSCid+=1){
+  for(int SSCid=0; SSCid<getNumberOfSubSectorCluster(); SSCid+=1){
     TGCRPhiCoincidenceOut* coincidenceOut = 0;
     if(SSCCOut->hasHit(SSCid)){
       m_matrix.clear();
       m_matrix.setSSCId(SSCid);
       m_matrix.inputR(SSCCOut->getR(SSCid),SSCCOut->getDR(SSCid),SSCCOut->getPtR(SSCid));
-      for(phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){
+      for(int phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){
         if(SSCCOut->hasHit(SSCid, phiposInSSC)){
           m_matrix.inputPhi(SSCCOut->getPhi(SSCid,phiposInSSC),
                           SSCCOut->getDPhi(SSCid,phiposInSSC),
@@ -171,7 +168,7 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon
       m_matrix.clear();
       m_matrix.setSSCId(SSCid);
       m_matrix.inputR(SSCCOut->getR(SSCid),SSCCOut->getDR(SSCid),SSCCOut->getPtR(SSCid));
-      for(phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){
+      for(int phiposInSSC = 0 ;phiposInSSC < TGCSSCControllerOut::MaxNumberOfPhiInSSC; phiposInSSC++){
         if(SSCCOut->hasHit(SSCid, phiposInSSC, true)){
           m_matrix.inputPhi(SSCCOut->getPhi(SSCid,phiposInSSC,true),
                           SSCCOut->getDPhi(SSCid,phiposInSSC,true),
@@ -231,8 +228,8 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon
   if(tgcArgs()->useRun3Config()){
     //Track selector in Run3. max 4 tracks ,which are send to MUCTPI, are selected. 
     m_trackSelector.select(m_trackSelectorOut);
-  }
-  else{
+
+  } else{
 #ifdef TGCDEBUG
     m_preSelector.dumpInput();
 #endif
@@ -245,14 +242,12 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon
     preSelectorOut->print();
 #endif
 
-    // delete SLSelectorOut if exists
-    if(m_selectorOut!=0) delete m_selectorOut;
-    // create new  SLSelectorOut
-    m_selectorOut = new TGCSLSelectorOut;
+    // reset output at the previous bunch crossing
+    m_selectorOut.get()->reset();
 
     if(preSelectorOut!=0){
       // select final canidates
-      m_selector.select(preSelectorOut,m_selectorOut);
+      m_selector.select(preSelectorOut, m_selectorOut);
     
       // delete SLPreSelectorOut
       delete preSelectorOut;
@@ -263,27 +258,6 @@ void TGCSectorLogic::clockIn(const SG::ReadCondHandleKey<TGCTriggerData> readCon
 #ifdef TGCDEBUG
   showResult(m_selectorOut);
 #endif
-  // EIFI trigger information is dumped when we have Endcap SL trigger
-  /*
-  if(m_region==ENDCAP && m_selectorOut!=0 && m_selectorOut->getNCandidate()) {
-    for(unsigned int iSlot=0; iSlot<TGCInnerTrackletSlotHolder::NUMBER_OF_SLOTS_PER_TRIGGER_SECTOR; iSlot++) {
-      std::cout << " innerTrackletSlots[" << iSlot << "]"; 
-      if(m_innerTrackletSlots[iSlot]) {
-	std::cout << " m_sideId " << m_innerTrackletSlots[iSlot]->getSideId() 
-		  << " slotId " << m_innerTrackletSlots[iSlot]->getSlotId()
-		  << " triggerBits ";
-	for(unsigned int iRegion=0; iRegion<TGCInnerTrackletSlot::NUMBER_OF_REGIONS; iRegion++) {
-	  for(unsigned int readout=0; readout<TGCInnerTrackletSlot::NUMBER_OF_READOUTS; readout++) {
-	    for(unsigned int iBit=0; iBit<TGCInnerTrackletSlot::NUMBER_OF_TRIGGER_BITS; iBit++) {
-	      std::cout << (m_innerTrackletSlots[iSlot]->getTriggerBit(iRegion,readout,iBit) ? 1 : 0);
-	    }
-	  }
-	}
-      } 
-      std::cout << std::endl;
-    }
-  }
-  */
 }
 
 void TGCSectorLogic::collectInput()
@@ -311,18 +285,17 @@ void TGCSectorLogic::deleteHPBOut()
 }
 
 
-void TGCSectorLogic::showResult(TGCSLSelectorOut* out)
+void TGCSectorLogic::showResult()
 {
-  int i;
   std::cout<<"#SL O"<<" BID:"<<m_bid
 	   <<" region:"<<((m_region==FORWARD) ? "FWD" : "END")
 	   <<" SLid:"<<m_id<<" ";
 
-  for( i=0; i<out->getNCandidate(); i+=1){
+  for(int i=0; i<m_selectorOut->getNCandidate(); i+=1){
     std::cout<<"  "<<i<<" "
-	     <<out->getPtLevel(i)<<" "
-	     <<out->getR(i)<<" "
-	     <<out->getPhi(i)<<std::endl;
+	     <<m_selectorOut->getPtLevel(i)<<" "
+	     <<m_selectorOut->getR(i)<<" "
+	     <<m_selectorOut->getPhi(i)<<std::endl;
   }
   std::cout<<std::endl;
 
@@ -330,7 +303,7 @@ void TGCSectorLogic::showResult(TGCSLSelectorOut* out)
 
 
 TGCSectorLogic::TGCSectorLogic(const TGCSectorLogic& right)
- : m_bid(right.m_id), m_id(right.m_id),
+ : m_bid(right.m_bid), m_id(right.m_id),
    m_sectorId(right.m_sectorId), m_moduleId(right.m_moduleId),
    m_sideId(right.m_sideId), m_octantId(right.m_octantId),
    m_region(right.m_region),
@@ -342,7 +315,6 @@ TGCSectorLogic::TGCSectorLogic(const TGCSectorLogic& right)
    m_mapEIFI(right.m_mapEIFI),
    m_pTMDB(right.m_pTMDB),
    m_preSelector(this), m_selector(this),
-   m_selectorOut(0),
    m_wordTileMuon(0), m_wordInnerStation(0),
    m_stripHighPtBoard(right.m_stripHighPtBoard), 
    m_stripHighPtChipOut(0),
@@ -377,8 +349,6 @@ TGCSectorLogic::operator=(const TGCSectorLogic& right)
     m_NumberOfWireHighPtBoard=right.m_NumberOfWireHighPtBoard;
     m_mapEIFI=right.m_mapEIFI;
     m_pTMDB=right.m_pTMDB;
-    delete m_selectorOut;
-    m_selectorOut=0;
     m_wordTileMuon=0;
     m_wordInnerStation=0;
     m_stripHighPtBoard=right.m_stripHighPtBoard;  
diff --git a/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx b/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx
index f1cd893ae063a689056dc5c7da02a996ad6d9fe3..9e326fb2ebe22c3d700939ff7e8e03fcb677984c 100644
--- a/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx
+++ b/Trigger/TrigT1/TrigT1TGC/src/TGCTimingManager.cxx
@@ -75,9 +75,7 @@ void TGCTimingManager::startSlaveBoard(TGCSector* sector)
 
 void TGCTimingManager::startHighPtBoard(TGCSector* sector)
 {
-#ifdef TGCDEBUG
-  std::cout << "Start  HighPt Board" <<std::endl; 
-#endif
+  if(sector->hasHit() == false) return;
 
   // collect input signals by 1st clockIn,
   // perform coincidence by 2nd clockIn.
@@ -92,12 +90,9 @@ void TGCTimingManager::startHighPtBoard(TGCSector* sector)
 
 void TGCTimingManager::startSectorLogic(TGCSector* sector)
 {
-#ifdef TGCDEBUG
-  std::cout << "Start  Sector Logic" <<std::endl; 
-#endif
-
   TGCSectorLogic* sl= sector->getSL();
-  if(sl!=0) sl->clockIn(m_readCondKey, m_bunchCounter);
+
+  if(sl!=0) sl->clockIn(m_readCondKey, m_bunchCounter, sector->hasHit());
 }
 
 } //end of namespace bracket