diff --git a/Trigger/TrigTools/IDScanHitFilter/ATLAS_CHECK_THREAD_SAFETY b/Trigger/TrigTools/IDScanHitFilter/ATLAS_CHECK_THREAD_SAFETY
deleted file mode 100644
index 61d96e367e6069905544cb36c5d86e1fdbbb4a16..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/ATLAS_CHECK_THREAD_SAFETY
+++ /dev/null
@@ -1 +0,0 @@
-Trigger/TrigTools/IDScanHitFilter
diff --git a/Trigger/TrigTools/IDScanHitFilter/CMakeLists.txt b/Trigger/TrigTools/IDScanHitFilter/CMakeLists.txt
deleted file mode 100644
index 215a0e7e35fa869d5f089d2b47ac830f72104d74..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-
-# Declare the package name:
-atlas_subdir( IDScanHitFilter )
-
-# Component(s) in the package:
-atlas_add_component( IDScanHitFilter
-                     src/*.cxx src/components/*.cxx
-                     LINK_LIBRARIES AthenaBaseComps CxxUtils GaudiKernel IRegionSelector TrigInDetEvent TrigInDetToolInterfacesLib )
diff --git a/Trigger/TrigTools/IDScanHitFilter/doc/packagedoc.h b/Trigger/TrigTools/IDScanHitFilter/doc/packagedoc.h
deleted file mode 100644
index d4bcebb285441a06d5f9055407b436fa24511540..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/doc/packagedoc.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
-*/
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-/**
-
-@page IDScanHitFilter_page IDScanHitFilter Package
-@author Nikos.Konstantinidis@cern.ch Dmitry.Emeliyanov@cern.ch
-@section IDScanHitFilter_IntroIDScanHitFilter Introduction
-
-This package contains the AlgTool that does the main part of pattern recognition of IDScan. For a full discription of all the 
-pattern recognition steps of IDScan, please look at 
-
-https://twiki.cern.ch/twiki/bin/view/Atlas/IDScanHowTo
-
-@section IDScanHitFilter_IDScanHitFilterProps IDScanHitFilter Properties:
-
-   - PrintDiagnosticMessages : extra diagnostic printing to std::cout ( default false )
-   - phiHalfWidth : RoI size in phi ( default 0.1 rads )
-   - etaHalfWidth : RoI size in eta ( default 0.1 rads )
-   - PhiBinSize : Size of the phi bins in the (phi,eta) histogram used at the main step of pattern recognition. The phi bin size is linked to how low-pT tracks can be reconstructed ( default 2.4 degrees ) 
-   - EtaBinSize : Size of the eta bins in the (phi,eta) histogram used at the main step of pattern recognition ( default 0.005 )
-   - LayerThreshold : Min. number of SPs in different Si layers in order to accept a group of SPs as a possible track candidate ( default 3.5 )
-   - EnhanceLayer0 : By setting this parameter to TRUE you have a better chance of finding the Pixel Layer0 spacepoint of a track ( default true )
-   - RemoveDuplicates : Apply a basic removal of duplicate tracks ( default true )
-   - CloneRemovalCut : Between tracks sharing 3 (default) spacepoints or more, only the longest one is kept ( default 3 )
-   - UsePtSign : Used to find clone tracks more efficiently ( default true )
-
-   - LooseTightBoundary : Number of SPs in a group below which we use the loose set of cuts for the groupCleaner ( default 20.5 )
-   - deltadzdrCut_loose : The difference in d_z/d_rho between hits 12 and 23 in a triplet, used to decide if the triplet comes from a track ( default 0.04 )
-   - deltadzdrCut_tight : As above, but tighter, for when origianl group of hits is large, i.e. containing hits from several tracks ( default 0.01 )
-   - etaCutInner_loose : The difference in eta between two hits (1-2), used to decide if they come from the same track ( default 0.008 )
-   - etaCutInner_tight : As above, but tighter, for when origianl group of hits is large ( default 0.004 )
-   - etaCutOuter_loose : The difference in eta between two hits (2-3), used to decide if they come from the same track ( default 0.02 )
-   - etaCutOuter_tight : As above, but tighter, for when origianl group of hits is large ( default 0.01 )
-   - d0Cut_loose : The track d0 calculated from a triplet of hits, used to decide if a triplet could come from a reasonable track ( default 4.0 )
-   - d0Cut_tight : As above, but tighter, for when origianl group of hits is large ( default 1.0 )
-   - dPhidRBins_loose : Number of 1/pT bins in the (1/pT,phi0) histogram used in the final step of pattern recognition ( default 200 )
-   - dPhidRBins_tight : As above, but tighter, for when origianl group of hits is large ( default 250 )
-   - phi0Bins_loose : Number of phi0 bins in the (1/pT,phi0) histogram used in the final step of pattern recognition ( default 16000 )
-   - phi0Bins_tight : As above, but tighter, for when origianl group of hits is large ( default 20000 )
-
-
-
-
-*/
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/FilterBin.cxx b/Trigger/TrigTools/IDScanHitFilter/src/FilterBin.cxx
deleted file mode 100644
index 59b6feb0d1d740b26eb3c0200a2069eb4c7ca992..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/FilterBin.cxx
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-//
-//   @file    FilterBin.cxx         
-//            set static variables for the FilterBin class   
-//
-//   @author M.Sutton
-// 
-//
-//   $Id: FilyterBin.cxx, v0.0   Sun 17 Mar 2013 10:06:51 GMT sutt $
-
-
-#include "FilterBin.h"
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/FilterBin.h b/Trigger/TrigTools/IDScanHitFilter/src/FilterBin.h
deleted file mode 100644
index c93b01262fdce05f830d9f4abc13d7d473e0cb20..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/FilterBin.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: FilterBin.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// 
-// Description: - The (eta,phi) bins for the HitFilter
-// 
-// date: 29/07/2003
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-#if ! defined( IDSCAN_FILTERBIN_H )
-#define IDSCAN_FILTERBIN_H
-
-#include "FixedBitSet.h"
-#include "IdScanSpPoint.h"
-
-#include "CxxUtils/checker_macros.h"
-
-#include <iostream>
-#include <list>
-#include <map>
-
-class FilterBin 
-{
- public:
-  
-  long NumberOfHits()   const;
-  long NumberOfLayers() const;
-
-  void AddLdirect( long layer_id );
-  void AddLindirect( FixedBitSet& bits );
-
-  void AddHit( IdScanSpPoint* spptr, long maxLayers, long maxBarrelLayer);
-  void AddTriplet( IdScanSpPoint* iPtr,
-		   IdScanSpPoint* jPtr,
-		   IdScanSpPoint* kPtr );
-
-  void exchangeBits( FilterBin& otherBin );
-  std::list<IdScanSpPoint* >&       hitList();
-  const std::list<IdScanSpPoint* >& hitList() const;
-
-private:
-  void neighborKeys( long key, long* np ) const; 
-
-private:
-  std::list<IdScanSpPoint* > m_HitList;   // "list" of ptrs to SpPs falling in bin
-
-  FixedBitSet m_Ldirect;                        // keeps direct layers
-  FixedBitSet m_Ltotal;                         // keeps direct+indirect layers
-};
-
-
-inline std::ostream& operator<<(std::ostream& s, const FilterBin& f) { 
-  s << "[ Nhits="    << f.NumberOfHits() 
-    << "\t Nlayers=" << f.NumberOfLayers() << "\taddr=" << (void*)&f << "\t]";
-
-  for (const IdScanSpPoint* hit : f.hitList()) {
-    s << "\n\t" << *hit;
-  }
-  return s;
-}
-
-
-typedef std::map<int, FilterBin>         FilterMap;
-
-
-inline long FilterBin::NumberOfHits()   const { 
-  return m_HitList.size();  
-}
-
-
-inline long FilterBin::NumberOfLayers() const {
-  return m_Ltotal.count();  
-}
-
-
-inline void FilterBin::AddLdirect( long layer_id ) { 
-  m_Ldirect.set( layer_id );     
-  m_Ltotal.set( layer_id );     
-}
-
-
-inline void FilterBin::AddLindirect( FixedBitSet& bits ) { 
-  m_Ltotal.Or( bits );   
-}
-
-
-inline void FilterBin::AddHit(IdScanSpPoint* spptr, long maxLayers, long maxBarrelLayer) 
-{ 
-
-  m_HitList.push_back( spptr ); 
-  long lr = spptr->layer();
-  this->AddLdirect( lr );
-  if ( lr==0 || lr==maxBarrelLayer ){
-    this->AddLdirect( maxLayers+lr );
-  }
-
-}
-
-
-inline void FilterBin::AddTriplet( IdScanSpPoint* ip, 
-				   IdScanSpPoint* jp, 
-				   IdScanSpPoint* kp ) 
-{ 
-
-  m_HitList.push_back( ip );  this->AddLdirect( ip->layer() );
-  m_HitList.push_back( jp );  this->AddLdirect( jp->layer() );
-  m_HitList.push_back( kp );  this->AddLdirect( kp->layer() );
- 
-}
-
-
-inline void FilterBin::exchangeBits( FilterBin& otherBin )
-{
-  m_Ltotal.Or( otherBin.m_Ldirect ); 
-  otherBin.AddLindirect(m_Ldirect);
-}
-
-
-inline std::list<IdScanSpPoint* >& FilterBin::hitList()
-{
-  return m_HitList;
-}
-
-inline const std::list<IdScanSpPoint* >& FilterBin::hitList() const
-{
-  return m_HitList;
-}
-
-#endif
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/FixedBitSet.h b/Trigger/TrigTools/IDScanHitFilter/src/FixedBitSet.h
deleted file mode 100755
index da4311ccd464bb58e15478a9f27e6795cb583223..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/FixedBitSet.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: FixedBitSet.h
-// 
-// author:           Nikos Konstantinidis
-//                   nk@hep.ucl.ac.uk
-//
-// athena migration: Malte Muller
-//                   mm@hep.ucl.ac.uk
-//		 
-// Description: defines the FixedBitSet class, used to store layer-information
-// 
-// date: 29/10/2002
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-
-#if ! defined( IDSCAN_FIXEDBITSET_H )
-#define IDSCAN_FIXEDBITSET_H
-
-
-  // Create the masks for each bit.
-  static const unsigned int setMask[] = { 
-    (1u<< 0), (1u<< 1), (1u<< 2), (1u<< 3), 
-    (1u<< 4), (1u<< 5), (1u<< 6), (1u<< 7), 
-    (1u<< 8), (1u<< 9), (1u<<10), (1u<<11), 
-    (1u<<12), (1u<<13), (1u<<14), (1u<<15), 
-    (1u<<16), (1u<<17), (1u<<18), (1u<<19), 
-    (1u<<20), (1u<<21), (1u<<22), (1u<<23), 
-    (1u<<24), (1u<<25), (1u<<26), (1u<<27), 
-    (1u<<28), (1u<<29), (1u<<30), (1u<<31)};
-  
-  static const unsigned int clearMask[] = { 
-    ~(1u<< 0),~(1u<< 1),~(1u<< 2),~(1u<< 3), 
-    ~(1u<< 4),~(1u<< 5),~(1u<< 6),~(1u<< 7), 
-    ~(1u<< 8),~(1u<< 9),~(1u<<10),~(1u<<11), 
-    ~(1u<<12),~(1u<<13),~(1u<<14),~(1u<<15), 
-    ~(1u<<16),~(1u<<17),~(1u<<18),~(1u<<19), 
-    ~(1u<<20),~(1u<<21),~(1u<<22),~(1u<<23), 
-    ~(1u<<24),~(1u<<25),~(1u<<26),~(1u<<27), 
-    ~(1u<<28),~(1u<<29),~(1u<<30),~(1u<<31)};
-
-  static const int countLUT0[] = 
-  {0,2,1,3,1,3,2,4,1,3,2,4,2,4,3,5,1,3,2,4,2,4,3,5,2,4,3,5,3,5,4,6,
-   1,3,2,4,2,4,3,5,2,4,3,5,3,5,4,6,2,4,3,5,3,5,4,6,3,5,4,6,4,6,5,7,
-   2,4,3,5,3,5,4,6,3,5,4,6,4,6,5,7,3,5,4,6,4,6,5,7,4,6,5,7,5,7,6,8,
-   3,5,4,6,4,6,5,7,4,6,5,7,5,7,6,8,4,6,5,7,5,7,6,8,5,7,6,8,6,8,7,9,
-   1,3,2,4,2,4,3,5,2,4,3,5,3,5,4,6,2,4,3,5,3,5,4,6,3,5,4,6,4,6,5,7,
-   2,4,3,5,3,5,4,6,3,5,4,6,4,6,5,7,3,5,4,6,4,6,5,7,4,6,5,7,5,7,6,8,
-   3,5,4,6,4,6,5,7,4,6,5,7,5,7,6,8,4,6,5,7,5,7,6,8,5,7,6,8,6,8,7,9,
-   4,6,5,7,5,7,6,8,5,7,6,8,6,8,7,9,5,7,6,8,6,8,7,9,6,8,7,9,7,9,8,10};
-
-  static const int countLUT1[] = 
-  {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4,1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,
-   1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
-   1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
-   2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
-   1,2,2,3,2,3,3,4,2,3,3,4,3,4,4,5,2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,
-   2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
-   2,3,3,4,3,4,4,5,3,4,4,5,4,5,5,6,3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,
-   3,4,4,5,4,5,5,6,4,5,5,6,5,6,6,7,4,5,5,6,5,6,6,7,5,6,6,7,6,7,7,8};
-
-  
-class FixedBitSet {
-
-	public:
-
-		FixedBitSet()                       { m_bits = s_clearAllMask; };
-		FixedBitSet(const FixedBitSet& set) { m_bits = set.m_bits; };
-
-		bool get(const int bitIndex) const   { return ((m_bits&setMask[bitIndex]) != 0); };
-		int length() const                   { return 32; };
-		int size() const                     { return 32; };
-		int count() const
-		{
-			return ( countLUT1[m_bits & s_maskByte]+
-			         countLUT1[(m_bits>>8) & s_maskByte]+
-			         countLUT1[(m_bits>>16) & s_maskByte]+
-			         countLUT1[(m_bits>>24) & s_maskByte] );
-		};
-
-		void set(const int bitIndex)     { m_bits |= setMask[bitIndex]; };
-		void setAll()                    { m_bits = s_setAllMask; };
-		void clear(const int bitIndex)   { m_bits &= clearMask[bitIndex]; };
-		void clearAll()                  { m_bits = s_clearAllMask; };
-
-		void And  (FixedBitSet& set)   { m_bits &= set.m_bits; };
-		void NAnd (FixedBitSet& set)   { m_bits &= ~set.m_bits; };
-		void Or   (FixedBitSet& set)   { m_bits |= set.m_bits; };
-		void XOr  (FixedBitSet& set)   { m_bits ^= set.m_bits; };
-
-		bool operator==(const FixedBitSet& set) const   { return (m_bits == set.m_bits); };
-
-	private:
-
-		static const int s_clearAllMask = 0;
-		static const int s_setAllMask = ~((int) 0);
-		static const int s_maskByte = 255;
-
-		// The m_bits used to store this FixedBitSet.  
-		int m_bits;
-
-};
-
-
-#endif
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/GC_Constants.h b/Trigger/TrigTools/IDScanHitFilter/src/GC_Constants.h
deleted file mode 100755
index 3abc58a073c1539577758daf4e169d3ecb12c15d..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/GC_Constants.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: GC_Constants.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// Description: parameters for group cleaner 
-// 
-// date: 29/07/2003
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-
-#if ! defined( IDSCAN_GCCONSTANTS_H )
-#define IDSCAN_GCCONSTANTS_H
-
-// to convert GeV to MeV and cm to mm
-//#include "CLHEP/Units/PhysicalConstants.h"
-#include <cmath>
-
-struct groupCleanerParams
-{
-	const double dPhidRCut, deltadZdRCut;
-	const double etaCutInner, etaCutOuter;
-	const double d0Cut;
-	const double phi0Offset;
-	const double invdPhidRBinSize, invPhi0BinSize;
-	
-	groupCleanerParams( const double ddZdR, const double etaI, 
-			    const double etaO,  const double d0, 
-			    const double dPhidRBinSize, const long phi0Bins, const double delPhidelRCut=0.0003 ) :
-
-	  //		dPhidRCut          ( 0.0003 ), /* was 0.003 in cm  */
-		dPhidRCut          ( delPhidelRCut ), /* was 0.003 in cm  */
-		deltadZdRCut       ( ddZdR ),
-		etaCutInner        ( etaI ),
-		etaCutOuter        ( etaO ),
-		d0Cut              ( d0 ),
-		phi0Offset         ( 0.155/0.0003 ),
-       //	invdPhidRBinSize   ( dPhidRBins/(2*dPhidRCut) ),
-                invdPhidRBinSize   ( 1.0/dPhidRBinSize ),
-		invPhi0BinSize     ( phi0Bins/(2.0*M_PI) )
-		{};
-};
-
-struct GCP_loose : public groupCleanerParams
-{
-	GCP_loose(double deltadzdrCut, 
-		  double etaCutInner,
-		  double etaCutOuter,
-		  double d0Cut,
-		  double dPhidRBinSize,
-		  long   phi0Bins,
-		  double delPhidelRCut ) :
-		groupCleanerParams(
-				   deltadzdrCut,
-				   etaCutInner,
-				   etaCutOuter,
-				   d0Cut,
-				   dPhidRBinSize,
-				   phi0Bins,
-				   delPhidelRCut
-		)   {};
-};
-
-struct GCP_tight : public groupCleanerParams
-{
-        GCP_tight(double deltadzdrCut,
-		  double etaCutInner,
-		  double etaCutOuter,
-		  double d0Cut,
-		  double dPhidRBinSize,
-		  long   phi0Bins,
-		  double delPhidelRCut ) :
-		groupCleanerParams(
-				   deltadzdrCut,
-				   etaCutInner,
-				   etaCutOuter,
-				   d0Cut,
-				   dPhidRBinSize,
-				   phi0Bins,
-				   delPhidelRCut
-		)   {};
-};
-
-
-#endif
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/Group.h b/Trigger/TrigTools/IDScanHitFilter/src/Group.h
deleted file mode 100644
index b7467307baf99e47eb586f433a808a1cce95ebfa..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/Group.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: Group.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// 
-// Description: - The Groups of IdScanSpPoints after pattern recognition
-// 
-// date: 29/07/2003
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-#if ! defined( IDSCAN_GROUP_H )
-#define IDSCAN_GROUP_H
-
-
-#include <list>
-#include <iostream>
-#include <iomanip>
-
-
-#include "IdScanSpPoint.h"
-
-typedef std::vector<IdScanSpPoint*> hitVec;
-
-class Group 
-{
- public:
-
- Group() : m_bin1(0), m_bin2(0), m_nEntries(0), 
-    m_eta(0), m_phi0(0), m_d0(0), m_z0(0) { };
-
-  void AddHits( std::list<IdScanSpPoint* >& binhits, long bin1, long bin2 );
-  long NumberOfHits() const;
-  std::list< IdScanSpPoint* >&       groupHits();
-  const std::list< IdScanSpPoint* >& groupHits() const;
-  double bin1() const;
-  double bin2() const;
-
-  double getEta()   const { return m_eta;   };
-  double getPhi0()  const { return m_phi0;  };
-  double getPtInv() const { return m_ptInv; };
-  double getd0()    const { return m_d0;    };
-  double getz0()    const { return m_z0;    };
-  double getChi2()  const { return m_chi2;  };
-
-  void setEta( double eta)     { m_eta   = eta;   };
-  void setPhi0( double phi0)   { m_phi0  = phi0;  };
-  void setPtInv( double ptinv) { m_ptInv = ptinv; };
-  void setd0( double d0)       { m_d0    = d0;    };
-  void setz0( double z0)       { m_z0    = z0;    };
-  void setChi2( double chi2)   { m_chi2    = chi2;};
-
-  void removeDuplicates();
-
-  bool operator < (const Group& rhs)
-    { return fabs(m_ptInv) > fabs(rhs.m_ptInv); };
-
- private:
-  std::list< IdScanSpPoint* > m_HitList;   // "list" of ptrs to SpPs making the group
-  long m_bin1;
-  long m_bin2;
-  long m_nEntries;
-
-  double m_eta;
-  double m_phi0;
-  double m_ptInv;
-  double m_d0;
-  double m_z0;
-  double m_chi2;
-
-};
-
-
-typedef std::list< Group >             GroupList;
-
-
-
-inline std::ostream& operator<<(std::ostream& s, const Group& g)
-{ 
-  const std::list<IdScanSpPoint*>&           hits = g.groupHits(); 
-  s << "[ eta="   << g.getEta() 
-    << "\tphi="   << g.getPhi0() 
-    << "\tzed="   << g.getz0() 
-    << "\tnhits=" << hits.size() 
-    << "\taddr=" << std::hex << (void*)&g << std::dec << "\t]";
-  std::list<IdScanSpPoint*>::const_iterator  hitr(hits.begin());   
-  std::list<IdScanSpPoint*>::const_iterator  hend(hits.end());   
-  while ( hitr!=hend ) s << "\n\t" << *(*hitr++); 
-  return s;
-}
-
-
-
-
-inline double Group::bin1() const
-{
-  return double(m_bin1)/double(m_nEntries);
-}
-
-
-inline double Group::bin2() const
-{
-  return double(m_bin2)/double(m_nEntries);
-}
-
-inline void Group::AddHits( std::list< IdScanSpPoint* >& binhits, long bin1, long bin2 ) 
-{ 
-  long entries = binhits.size();
-  m_nEntries += entries;
-  m_bin1 += entries*bin1;
-  m_bin2 += entries*bin2;
-
-  m_HitList.splice(m_HitList.end(), binhits); 
-}
-
-  
-inline long Group::NumberOfHits() const 
-{ 
-  return m_HitList.size(); 
-}
-
-
-inline const std::list< IdScanSpPoint* >& Group::groupHits() const 
-{ 
-  return m_HitList;
-}
-
-
-inline std::list< IdScanSpPoint* >& Group::groupHits()
-{
-  return m_HitList;
-}
-
-
-inline void Group::removeDuplicates()
-{
-  //  m_HitList.sort( );
-  // m_HitList.unique();
-  m_HitList.sort(orderInIndex());
-  m_HitList.unique(equalIds());
-  m_HitList.sort(orderInLayer());
-}
-
-#endif
-
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/HF_Constants.h b/Trigger/TrigTools/IDScanHitFilter/src/HF_Constants.h
deleted file mode 100755
index 6ef1ce70f187d759f2fb9eccc0c067525fe23afb..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/HF_Constants.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: HF_Constants.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// Description: contains HitFilter constants
-// 
-// date: 24/07/2003
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-
-#if ! defined( IDSCAN_HFCONSTANTS_H )
-#define IDSCAN_HFCONSTANTS_H
-
-const long   HashKeyCoeff  = 1000;
-
-#endif
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/IDScanHitFilter.cxx b/Trigger/TrigTools/IDScanHitFilter/src/IDScanHitFilter.cxx
deleted file mode 100755
index 57304efd3e9aa4eb8c4e6b76b26dc4176eee8238..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/IDScanHitFilter.cxx
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-// IDScanHitFilter
-// ( see header-file for details )
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-#include <iostream>
-
-#include "GaudiKernel/MsgStream.h"
-#include "CxxUtils/checker_macros.h"
-
-#include "TrigInDetEvent/TrigVertex.h"
-#include "TrigInDetEvent/TrigSiSpacePoint.h"
-#include "TrigInDetEvent/TrigInDetTrack.h"
-#include "TrigInDetEvent/TrigInDetTrackCollection.h"
-#include "IRegionSelector/IRoiDescriptor.h"
-
-#include "IDScanHitFilter.h"
-#include "IdScanSpPoint.h"
-#include "Group.h"
-
-
-IDScanHitFilter::IDScanHitFilter(const std::string& t, 
-		     const std::string& n,
-		     const IInterface*  p ): 
-  AthAlgTool(t,n,p),
-  m_numberingTool("TrigL2LayerNumberTool")
-{
-  declareInterface< ITrigHitFilter >( this );
-
-  declareProperty( "PrintDiagnosticMessages", m_printDiagnosticMessages = false );
-  declareProperty( "phiHalfWidth",            m_ROIphiHalfWidth = 0.1     );
-  declareProperty( "etaHalfWidth",            m_ROIetaHalfWidth = 0.1     );
-
-  declareProperty( "PhiBinSize",              m_phiBinSize = 2.4          );
-  declareProperty( "EtaBinSize",              m_etaBinSize = 0.005        );
-  declareProperty( "LayerThreshold",          m_layerThreshold = 3.5      );
-  declareProperty( "EnhanceLayer0",           m_enhanceLayer0 = true      );
-  declareProperty( "RemoveDuplicates",        m_cloneRemoval = true       );
-  declareProperty( "CloneRemovalCut",         m_cloneRemovalCut = 3       );
-  declareProperty( "UsePtSign",               m_usePtSign = true          );
-
-  declareProperty( "LooseTightBoundary",      m_looseTight = 20.5         );
-
-  declareProperty( "deltadzdrCut_loose",      m_loose_deltadzdrCut = 0.04 );
-  declareProperty( "deltadzdrCut_tight",      m_tight_deltadzdrCut = 0.01 );
-  declareProperty( "etaCutInner_loose",       m_loose_etaCutInner = 0.008 );
-  declareProperty( "etaCutInner_tight",       m_tight_etaCutInner = 0.004 );
-  declareProperty( "etaCutOuter_loose",       m_loose_etaCutOuter = 0.02  );
-  declareProperty( "etaCutOuter_tight",       m_tight_etaCutOuter = 0.01  );
-  declareProperty( "d0Cut_loose",             m_loose_d0Cut = 4.0         );
-  declareProperty( "d0Cut_tight",             m_tight_d0Cut = 1.0         );
-  declareProperty( "dPhidRBinSize_loose",     m_loose_dPhidRBinSize = 0.0000030 );
-  declareProperty( "dPhidRBinSize_tight",     m_tight_dPhidRBinSize = 0.0000024 );
-  declareProperty( "pTcutInMeV",              m_pTcutInMeV = 1000.0       );
-  declareProperty( "phi0Bins_loose",          m_loose_phi0Bins = 16000    );
-  declareProperty( "phi0Bins_tight",          m_tight_phi0Bins = 20000    );
-
-  declareProperty( "maxBeamSpotShift",        m_maxBeamSpotShift = 4.0    );
-  declareProperty( "fullScan",                m_fullScan = false    );
-
-}
-
-StatusCode IDScanHitFilter::initialize()
-{
-  m_dPhidRCut = 0.3/m_pTcutInMeV;
-
-  ATH_MSG_INFO( "IDScanHitFilter constructed "                        );
-  ATH_MSG_INFO( "phiBinSize       set to " << m_phiBinSize      );
-  ATH_MSG_INFO( "etaBinSize       set to " << m_etaBinSize      );
-  ATH_MSG_INFO( "layerThreshold   set to " << m_layerThreshold  );
-  ATH_MSG_INFO( "enhanceZeroLayer set to " << m_enhanceLayer0   );
-  ATH_MSG_INFO( "Clone removal    set to " << m_cloneRemoval    );
-  ATH_MSG_INFO( "dphidrcut    set to " << m_dPhidRCut    );
-
-  ATH_CHECK( m_numberingTool.retrieve() );
-
-  /// get first endcap layer, so we know how
-  /// barrel layers there are 
-  int offsetEndcapPixels = m_numberingTool->offsetEndcapPixels();
-  int maxSiliconLayerNum = m_numberingTool->maxSiliconLayerNum(); 
-  //  int offsetBarrelSCT    = m_numberingTool->offsetBarrelSCT(); 
- 
-  /// Set the layer variables for the FilterBin class
-  /// NB: decrement the endcap pixels, as we want the layer number 
-  ///     of the last barrel layer, not the number of the first 
-  ///     endcap pixel layer
-  /// initialise the HitFilter with the correct number of layers
-  /// NB: DO NOT pass in the max eta here, but remember that it can be set here!!
-  ///     the parameter initialisation is very messy for this stuff 
-  iHitFilter::initialise( maxSiliconLayerNum, offsetEndcapPixels-1 ); /// , 3.0 ); 
-
-  // NB: Now set the other way - ie, set m_fullScan=true, 
-  //     then this will enforce m_ROIphiHalfWidth=M_PI, but in 
-  //     iHitFilterinitialise() where it should have been in any 
-  //     case 
-  //  
-  //  m_fullScan = (2*m_ROIphiHalfWidth > 6.28);
-
-  return StatusCode::SUCCESS;
-}
-
-
-  //Luke: edit this to take recoTracks as an input pointer, passed by reference 
-void IDScanHitFilter::findTracks( std::vector<const TrigSiSpacePoint* > spVec, TrigInDetTrackCollection& recoTracks, 
-	                          const IRoiDescriptor* RoI, double zVertex,
-				  double shiftx=0, double shifty=0,
-				  const int missing_layers=0 )
-{
-  setLayerThresholdTmp(getLayerThreshold()-double(missing_layers));
-  ATH_MSG_DEBUG( "m_layerThreshold="      << m_layerThreshold
-                 << "\tm_layerThresholdTmp=" << m_layerThresholdTmp  );
-
-  // 0. check if RoI is in [0,2pi] boundary (boundary for the space point definition!)
-  //    and calculate phi offset <- now done in spacepoints themselves!!!
-
-  // 1. make internal IDScan SPs
-  if (RoI!=nullptr) {
-		makeIDScanSPs( spVec, RoI->eta(), 0.5*fabs(RoI->etaPlus()-RoI->etaMinus()),
-				RoI->phi(), 0.5*fabs(RoI->phiPlus()-RoI->phiMinus()), 
-				zVertex );
-	}
-	else {
-		makeIDScanSPs( spVec, 0, 3,
-				0, M_PI, 
-				zVertex );
-	}
-
-  ATH_MSG_DEBUG( "REGTEST / Made " << m_internalSPs->size() 
-                 << " IdScanSpPoints. Proceeding to HitFilter."  );
-  if (m_printDiagnosticMessages) std::cout << "IdScanMain DIAGNOSTIC " <<  " Made " << m_internalSPs->size() 
-					   << " IdScanSpPoints. Proceeding to HitFilter." << std::endl;
-
-  // 2. run HitFilter & GroupCleaner
-
-  GroupList cleanGroups = execute();
-
-  // 3. turn groups into TrigInDetTracks
-  
-  //Luke: delete this line
-  //TrigInDetTrackCollection* recoTracks=NULL;
-  if ( !cleanGroups.empty() ) {
-    makeTracks( cleanGroups, recoTracks, zVertex, shiftx, shifty);
-  }
-
-  cleanInternalSPs();
-  
-  //return recoTracks;
-}
-
-
-//Luke: need to pass recoTracks by reference to this or have it as a member variable or something?
-void IDScanHitFilter::makeTracks( GroupList& idScanGroups, TrigInDetTrackCollection& recoTracks,  double zPosition, 
-				  double shiftx=0, double shifty=0)
-{
-    //  recoTracks->reserve( idScanGroups.size() );
-
-  // Since the FilterMap is a hashmap and hash tables are not guaranteed
-  // to be sorted, running the code twice sometimes ends up producing
-  // differently ordered REGTEST output files. So sort them is debugging:
-
-  if ( msgLvl(MSG::DEBUG) ) idScanGroups.sort();
-
-  for ( GroupList::iterator gItr( idScanGroups.begin() ) ; gItr != idScanGroups.end(); ++gItr ) {
-    if(gItr->groupHits().size()==0) continue;
-    gItr->groupHits().sort(orderInRho());
-    double phi0 = gItr->getPhi0();
-    if(phi0<-M_PI) 
-      { 
-	phi0+=2.0*M_PI;
-      }
-    else if(phi0>M_PI) 
-      {
-	phi0-=2.0*M_PI;
-      }
-    ATH_MSG_DEBUG( "REGTEST / group phi0/ptInv/eta: " 
-                   << phi0 << " / " 
-                   << gItr->getPtInv() << " / " 
-                   << gItr->getEta()  );
-
-    if (m_printDiagnosticMessages) std::cout << "IdScanMain DIAGNOSTIC " << " group phi0/ptInv/eta: " 
-					     << phi0 << " / " 
-					     << gItr->getPtInv() << " / " 
-					     << gItr->getEta() << std::endl;
-
-    double ptInv=gItr->getPtInv();   
-    if(fabs(ptInv)<1e-9) ptInv=1e-9; 
-
-    double input_d0 = 0;
-    if (shiftx || shifty){
-      input_d0 = -shiftx*sin(phi0)+shifty*cos(phi0);
-    }
-
-    TrigInDetTrackFitPar* perigee = new TrigInDetTrackFitPar( input_d0, 
-							      phi0, 
-							      zPosition, 
-							      gItr->getEta(), 
-							      1.0/ptInv );
-
-    std::vector<const TrigSiSpacePoint*> spacePointsOnTrack;
-    for (IdScanSpPoint* sp : gItr->groupHits())
-      {
-	spacePointsOnTrack.push_back( sp->commonSP() );
-      }
-    std::vector<const TrigSiSpacePoint*>* spv = new std::vector<const TrigSiSpacePoint*>;
-    spv->assign(spacePointsOnTrack.begin(),spacePointsOnTrack.end());
-    TrigInDetTrack* newTrack = new TrigInDetTrack(spv, perigee, NULL, gItr->getChi2());
-    newTrack->algorithmId(TrigInDetTrack::IDSCANID);
-    recoTracks.push_back( newTrack );
-  }
-
-  //return recoTracks;
-
-}
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/IDScanHitFilter.h b/Trigger/TrigTools/IDScanHitFilter/src/IDScanHitFilter.h
deleted file mode 100644
index 0042993d2c815eccf93f76e836d7b96b9ba9beee..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/IDScanHitFilter.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// emacs: this is -*- c++ -*-
-
-/*
-  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: IDScanHitFilter.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// 
-// Description: - main pattern recognition algorithm of IdScan 
-// 
-// date: 28/07/2003
-//
-// migrated to an AlgTool 28/01/2007 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-
-#ifndef IDSCANHITFILTER_IDSCANHITFILTER_H
-#define IDSCANHITFILTER_IDSCANHITFILTER_H
-
-#include <vector>
-#include <list>
-#include <string>
-
-#include "AthenaBaseComps/AthAlgTool.h"
-
-#include "iHitFilter.h"
-#include "TrigInDetEvent/TrigInDetTrackCollection.h"
-#include "TrigInDetToolInterfaces/ITrigHitFilter.h"
-
-#include "GaudiKernel/ToolHandle.h"
-#include "TrigInDetToolInterfaces/ITrigL2LayerNumberTool.h"
-
-class TrigSiSpacePoint;
-class IRoiDescriptor;
-class Group;
-class IdScanSpacePoint;
-
-////////////////////////////////////////////////////////////////////////////////
-////    IDScanHitFilter
-////////////////////////////////////////////////////////////////////////////////
-
-class IDScanHitFilter: public iHitFilter, public AthAlgTool, virtual public ITrigHitFilter
-{
- public:
-  
-  IDScanHitFilter( const std::string&, const std::string&, const IInterface* );
-  virtual ~IDScanHitFilter(){ };
-
-  virtual StatusCode initialize() override;
-
-  virtual
-  void findTracks( std::vector<const TrigSiSpacePoint* >, 
-		   TrigInDetTrackCollection&, 
-		   const IRoiDescriptor*, double zvertex,
-		   double shiftx, double shifty,
-		   const int missing_layers) override;
-
- private:
-
-  void makeTracks( std::list<Group>&, TrigInDetTrackCollection&, double zvertex, double shiftx, double shifty);
-
-  /// actually, need the TrigL2LayerNumberTool so we can configure with the 
-  /// correct number of layers when including the IBL etc
-  ToolHandle<ITrigL2LayerNumberTool> m_numberingTool;  
-
-};
-
-#endif
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/IdScanSpPoint.h b/Trigger/TrigTools/IDScanHitFilter/src/IdScanSpPoint.h
deleted file mode 100644
index d9912c2b17d5e32f0b5b963cc7eafd6dd51d1047..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/IdScanSpPoint.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: IdScanSpPoint.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// 
-// Description: - Internal IdScan space point
-// 
-// date: 24/07/2003
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-
-#if ! defined( IDSCAN_IDSCANSPPOINT_H )
-#define IDSCAN_IDSCANSPPOINT_H
-
-#include <vector>
-#include <iostream>
-
-#include "tIdScanSpPoint.h"
-#include "TrigInDetEvent/TrigSiSpacePoint.h"
-
-
-typedef TrigSiSpacePoint ExternalSpacePoint;
-
-typedef tIdScanSpPoint<ExternalSpacePoint>   IdScanSpPoint;
-
-
-typedef std::vector< IdScanSpPoint* >  hitVec;
-typedef torderInRho<IdScanSpPoint>     orderInRho;
-typedef torderInLayer<IdScanSpPoint>   orderInLayer;
-typedef torderInIndex<IdScanSpPoint>   orderInIndex;
-typedef tequalIds<IdScanSpPoint>       equalIds;
-
-
-#endif
-
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/components/IDScanHitFilter_entries.cxx b/Trigger/TrigTools/IDScanHitFilter/src/components/IDScanHitFilter_entries.cxx
deleted file mode 100644
index 170355fa38f0bc80a8f6e8fe30844a72a4c94078..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/components/IDScanHitFilter_entries.cxx
+++ /dev/null
@@ -1,10 +0,0 @@
-////////////////////////////////////////////////////////////////////////////////
-// IDScanHitFilter
-// -------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-#include "../IDScanHitFilter.h"
-
-DECLARE_COMPONENT( IDScanHitFilter )
-
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/iHitFilter.cxx b/Trigger/TrigTools/IDScanHitFilter/src/iHitFilter.cxx
deleted file mode 100755
index 8812d32fc30732ea6106a8c72cefff4be574e4e3..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/iHitFilter.cxx
+++ /dev/null
@@ -1,1469 +0,0 @@
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-// iHitFilter
-// ( see header-file for details )
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-// IdScan stuff
-#include "GC_Constants.h"
-#include "IdScanSpPoint.h"
-#include "Group.h"
-#include "FilterBin.h"
-#include "iHitFilter.h"
-
-#include <iostream>
-#include <algorithm>
-
-#include <cmath>
-#include <cstring>
-
-//#define IDSCAN_DEBUG 1
-
-using std::log;
-using std::exp;
-using std::atan;
-using std::fabs;
-using std::cerr;
-using std::endl;
-using std::memset;
-
-int iHitFilter::initialise(long maxlayers, long maxBarrelLayer, double maxeta) 
-{
-
-  m_IdScan_MaxNumLayers = maxlayers;
-  m_maxBarrelLayer      = maxBarrelLayer;
-  m_IdScan_MaxEta       = maxeta;
-
-  if ( m_fullScan ) m_useROIphiHalfWidth = M_PI;
-  else              m_useROIphiHalfWidth = m_ROIphiHalfWidth;
-
-  //in some cases I got 360/3.6 = 99, so divide with something a bit less than m_phiBinSize
-  m_maxPhiBins = long(360./(m_phiBinSize-1e-6));
-
-  // avoid obliging the user to use phi bin size that is an integer multiple of 360.
-  double tmp_phiBinSize = 360./double(m_maxPhiBins);
-
-  m_invPhiBinSize = 180./(M_PI*tmp_phiBinSize);
-  m_invEtaBinSize = 1./m_etaBinSize;
-
-  m_binMap = new FilterMap;
-
-  m_tight = new GCP_tight(m_tight_deltadzdrCut, 
-			  m_tight_etaCutInner, 
-			  m_tight_etaCutOuter,
-			  m_tight_d0Cut,
-			  m_tight_dPhidRBinSize,
-			  m_tight_phi0Bins,
-			  m_dPhidRCut
-			  );
-
-#ifdef IDSCAN_DEBUG
-  std::cout << "tight params: ddzdr,etainner,etaouter,d0,dphidrbinsize,dpdrcut: " << m_tight_deltadzdrCut
-	    << " / " <<   m_tight_etaCutInner 
-	    << " / " <<	  m_tight_etaCutOuter
-	    << " / " <<	  m_tight_d0Cut
-	    << " / " <<	  m_tight_dPhidRBinSize
-	    << " / " <<	  m_tight_phi0Bins
-	    << " / " <<    m_dPhidRCut << std::endl;
-#endif
-
-
-  m_loose = new GCP_loose(m_loose_deltadzdrCut,
-			  m_loose_etaCutInner,
-			  m_loose_etaCutOuter,
-			  m_loose_d0Cut,
-			  m_loose_dPhidRBinSize,
-			  m_loose_phi0Bins,
-			  m_dPhidRCut
-			  );
-
-#ifdef IDSCAN_DEBUG
-  std::cout << "loose params: ddzdr,etainner,etaouter,d0,dphidrbinsize,dpdrcut: " << m_loose_deltadzdrCut
-	    << " / " <<   m_loose_etaCutInner 
-	    << " / " <<	  m_loose_etaCutOuter
-	    << " / " <<	  m_loose_d0Cut
-	    << " / " <<	  m_loose_dPhidRBinSize
-	    << " / " <<	  m_loose_phi0Bins
-	    << " / " <<    m_dPhidRCut << std::endl;
-#endif
-
-  return 0;
-}
-
-iHitFilter::~iHitFilter()
- { 
-   if (m_binMap) delete m_binMap; 
-   if (m_loose)  delete m_loose;
-   if (m_tight)  delete m_tight;
- }
-
-
-void iHitFilter::makeIDScanSPs( std::vector<const ExternalSpacePoint* > spVec, 
-				double meanEta, double deltaEta,
-				double meanPhi, double deltaPhi,
-				double zVertex) 
-{
-
-  int Counter=1;
-  
-  m_zVertex = zVertex;
-
-  double roiPhiMin, roiPhiMax;
-
-  if ( m_fullScan ) { 
-    meanPhi=0;
-    meanEta=0;
-    roiPhiMin=-M_PI;
-    roiPhiMax= M_PI;
-  }
-  else { 
-
-    // If we trust that all the SPs are properly input, we determine the RoI phi width
-    //  using the SPs themselves.
-    //  If the RoI phi range is wider than pi, ie. if the RoI is large enough, we keep everything as usual.
-    //   if ( 2 * m_useROIphiHalfWidth < M_PI )
-    if ( 2 * deltaPhi < M_PI )
-      {
-	double roiPhiPosMin( 9.9), roiPhiPosMax(0);
-	double roiPhiNegMin(-9.9), roiPhiNegMax(0);  // least negative and most negative
-	
-	std::vector<const ExternalSpacePoint* >::const_iterator SpItr( spVec.begin() );
-	for(unsigned int i=0; i<spVec.size(); ++i, ++SpItr)
-	  {
-	    double spphi = (*SpItr)->phi();
-	    if ( spphi>0  &&  spphi>roiPhiPosMax )  roiPhiPosMax = spphi;
-	    if ( spphi>0  &&  spphi<roiPhiPosMin )  roiPhiPosMin = spphi;
-	    
-	    if ( spphi<0  &&  spphi<roiPhiNegMax )  roiPhiNegMax = spphi;
-	    if ( spphi<0  &&  spphi>roiPhiNegMin )  roiPhiNegMin = spphi;
-	  }
-	
-	// if all SPs are in (0, pi):
-	if ( roiPhiNegMax > roiPhiNegMin )  { roiPhiMin = roiPhiPosMin; roiPhiMax = roiPhiPosMax; }
-	// if all SPs are in (-pi, 0):
-	else if ( roiPhiPosMax < roiPhiPosMin )  { roiPhiMin = roiPhiNegMax; roiPhiMax = roiPhiNegMin; }
-	// if we have an RoI that covers phi=0 axis
-	else if ( roiPhiPosMin - roiPhiNegMin < M_PI )  { roiPhiMin = roiPhiNegMax; roiPhiMax = roiPhiPosMax; }
-	// if we have an RoI that covers phi=pi axis
-	else  { roiPhiMin = roiPhiPosMin; roiPhiMax = roiPhiNegMin; }
-	
-	roiPhiMin -= 1e-10;
-	roiPhiMax += 1e-10;
-	//double ROIphiWidth = roiPhiMax - roiPhiMin;
-	//if ( ROIphiWidth < 0 )  ROIphiWidth += 2*M_PI;
-	//m_useROIphiHalfWidth = ROIphiWidth / 2.;
-      }
-    else
-      {
-	//	roiPhiMin = meanPhi - m_useROIphiHalfWidth;
-	//	roiPhiMax = meanPhi + m_useROIphiHalfWidth;
-	roiPhiMin = meanPhi - deltaPhi;
-	roiPhiMax = meanPhi + deltaPhi;
-      }
-    
-    if ( roiPhiMin < -M_PI ) roiPhiMin += 2.0*M_PI;
-    if ( roiPhiMax >  M_PI ) roiPhiMax -= 2.0*M_PI;
-
-    //    std::cout << "TrigIDSCAN IDScanHitFilter roiPhiMin " << roiPhiMin << std::endl;
-    //    std::cout << "TrigIDSCAN IDScanHitFilter roiPhiMax " << roiPhiMax << std::endl;
-
-  }
-
-  bool boundary = (roiPhiMin>roiPhiMax);
-  
-  if ( m_internalSPs!=NULL ) cleanInternalSPs();
-  m_internalSPs = new hitVec;
-  m_internalSPs->reserve( spVec.size() );
-  
-  //   Now that we know the z of the pp vertex, we can move from a trapezium shape RoI 
-  //   to a triangle shape and get rid of some extra hits that are of no interest
-  //
-
-
-  //  std::cout << "TrigIDSCAN IDScanHitFilter  m_ROIetaHalfWidth " << m_ROIetaHalfWidth << std::endl;
-  //  std::cout << "TrigIDSCAN IDScanHitFilter  roi->etaHalfWidth " << deltaEta << std::endl;
-
-  // NB: should set a default full scan range when m_fullScan==true but it is 
-  // etaHalfWidth=3 for the fullscan slice and etaHalfWidth=5 for the cosmic, 
-  // so which to chose? left as it is for the moment
-  //  double dEta = m_ROIetaHalfWidth;
-  double dEta = deltaEta;
-
-  // The 'core' resolution from muFast is ~0.015
-  dEta += 0.045;
-
-  // SP etas can change significantly when shifted to account for an offset beamspot.
-  // Offset BS affects most the hits on the B-layer ==> 50mm.
-  dEta += (  std::fabs(meanEta)  +
-	     log(tan(atan(50./((50-m_maxBeamSpotShift)/tan(2.*atan(exp(-std::fabs(meanEta))))))/2.))  );
-
-  // An extra eta range to account for the fact that the RoI eta is computed with for z=0
-  // Assume that the eta of the RoI is computed at the radius of the calorimeter and compute
-  //   the eta of an RoI which is said to be at eta=0.
-  double extraEta(0);
-  if ( zVertex!=0 )  extraEta -= log(tan(atan(2800./std::fabs(zVertex))/2));
-
-  //  std::cout << "TrigIDSCAN IDScanHitFilter  dEta "     << dEta     << std::endl;
-  //  std::cout << "TrigIDSCAN IDScanHitFilter  extraEta " << extraEta << std::endl;
-  
-  std::vector<const ExternalSpacePoint* >::const_iterator siSpItr( spVec.begin() );
-  for ( ; siSpItr!=spVec.end(); ++siSpItr ) {
-    double eta = (*siSpItr)->eta(zVertex);
-
-    if ( std::fabs(eta)>m_IdScan_MaxEta ) continue;
-    if ( zVertex<=0 && ( eta-meanEta>dEta+extraEta || meanEta-eta>dEta ) ) continue;
-    if ( zVertex> 0 && ( meanEta-eta>dEta+extraEta || eta-meanEta>dEta ) ) continue;
-
-    IdScanSpPoint* pSP=new IdScanSpPoint( *siSpItr, eta );
-    pSP->index(Counter++);
-    m_internalSPs->push_back( pSP );
-  }
-
-  long nSPs = m_internalSPs->size();
-  std::vector<double> rotatedPhi(nSPs);
-
-  hitVec::iterator SpItr = m_internalSPs->begin();
-  for ( long i=0; i<nSPs; ++i, ++SpItr ) {
-    rotatedPhi[i] = (*SpItr)->phi() - roiPhiMin;
-  }
-
-  if ( boundary ){ 
-    for ( long i=0; i<nSPs; ++i ) {
-      if(rotatedPhi[i]<0.0) rotatedPhi[i]+=2.0*M_PI;
-    }
-  }
-
-  SpItr = m_internalSPs->begin();
-  for ( long i=0; i<nSPs; ++i, ++SpItr ) {
-    (*SpItr)->setRotatedPhi( rotatedPhi[i] );
-  }
-
-}
-
-
-void iHitFilter::cleanInternalSPs() { 
-  for ( hitVec::iterator spItr( m_internalSPs->begin() ); spItr != m_internalSPs->end(); ++spItr ) {
-    delete (*spItr);
-  }
-  m_internalSPs->clear();
-  delete m_internalSPs;
-  m_internalSPs = NULL;
-}    
-
-
-GroupList iHitFilter::execute()
-{
-
-  if ( m_internalSPs==NULL ) { 
-    cerr << "iHitFilter::execute() m_internalSPs=NULL" << endl;
-  }
-
-  m_HF = true; // we are in hitFilter; becomes false when we go to groupCleaner
-
-//   1. Loop over the hits to make bins and fill the binMap
-//
-  long sp_key;
-  hitVec::iterator hitItr( m_internalSPs->begin() ); 
-  hitVec::iterator hitEnd( m_internalSPs->end() );
-
-  for ( ; hitItr != hitEnd;  ++hitItr ) {
-    sp_key = makeHashKey( (*hitItr)->rotatedPhi(), (*hitItr)->eta() );
-    (*m_binMap)[sp_key].AddHit( *hitItr, m_IdScan_MaxNumLayers, m_maxBarrelLayer );
-#ifdef IDSCAN_DEBUG
-    std::cout << "IDSCAN_DEBUG hitfilter: layer/phi/z/eta/sp_key: " 
-	      << (*hitItr)->layer() << " / " << (*hitItr)->phi() << " / " << (*hitItr)->z() << " / " << sp_key << std::endl;
-#endif
-  }
-
-//   Special treatment for hits at pixel layer 0. Optionally enter them two more times
-//   in the binMap, at +/- 2 bins in eta, as their eta is affected most by mis-measurements
-//   in the ZFinder. Important mostly for low p_T tracks (B physics, b-tagging).
-//
-
-  if ( m_enhanceLayer0 ) {
-    long offset = 2*HashKeyCoeff;
-    for ( hitItr = m_internalSPs->begin(); hitItr != hitEnd;  ++hitItr ) {
-      if ( (*hitItr)->layer() == 0 ) {
- 	sp_key = this->makeHashKey( (*hitItr)->rotatedPhi(), (*hitItr)->eta() );
-	(*m_binMap)[sp_key+offset].AddHit( *hitItr, m_IdScan_MaxNumLayers, m_maxBarrelLayer );
-	(*m_binMap)[sp_key-offset].AddHit( *hitItr, m_IdScan_MaxNumLayers, m_maxBarrelLayer );
-      }
-    }
-  }
-
-//   2. Loop over bins to form groups
-//
-  GroupList gList, cleanGroups;
-  this->clusterBins( gList );
-  m_HF = false;
-
-//   3. Loop over groups to delete "small" groups and run second level filter (group cleaner)
-//
-  GroupList::iterator gItr( gList.begin() ), gEnd( gList.end() );
-  while( gItr != gEnd ) {
-    if ( m_enhanceLayer0 ) {    // if 0 layer hits entered 3 times, remove duplicates first
-      gItr->removeDuplicates();
-    }
-    if ( gItr->NumberOfHits()>m_layerThresholdTmp ) {
-
-#ifdef IDSCAN_DEBUG
-      std::cout << "IDSCAN_DEBUG: " << std::endl;
-      std::cout << "IDSCAN_DEBUG: Group entering the groupCleaner - number of sps: " 
-		<< gItr->NumberOfHits() << std::endl;
-      std::list<IdScanSpPoint *> hitList = gItr->groupHits();
-      for ( std::list<IdScanSpPoint *>::const_iterator i = hitList.begin(); i != hitList.end(); ++i ) {
-	std::cout << "IDSCAN_DEBUG: layer = " << (*i)->layer()
-		  << " phi= " << (*i)->phi()
-		  << " rho= " << (*i)->rho()
-		  << " zed= " << (*i)->z()
-		  << std::endl;
-      }
-#endif
-
-      this->groupCleaner( gItr, cleanGroups );
-      gList.erase( gItr++ );
-    }
-    else {
-      gList.erase( gItr++ );
-    }
-  }
-
-//   4. Loop over cleaned groups to delete "small" groups
-//
-  GroupList::iterator gItr2( cleanGroups.begin() ), gEnd2( cleanGroups.end() );
-  for ( ; gItr2 != gEnd2; ) { 
-    if(gItr2->NumberOfHits()!=0)
-      {
-	if ( gItr2->NumberOfHits() > m_layerThresholdTmp ) {
-	  ++gItr2;
-	}
-	else {
-	  cleanGroups.erase(gItr2++);
-	}
-      }
-    else cleanGroups.erase(gItr2++);
-  }
-
-  return cleanGroups;
-}
-
-void iHitFilter::groupCleaner( GroupList::iterator& inputItr, GroupList& cleanGroups )
-{
-
-  groupCleanerParams* params;
-  if( inputItr->NumberOfHits() > m_looseTight ) {
-    params = m_tight;
-
-#ifdef IDSCAN_DEBUG
-    std::cout << "IDSCAN_DEBUG: tight set of grouCleaner parameters" << std::endl;
-#endif
-
-  }
-  else {
-    params = m_loose;
-
-#ifdef IDSCAN_DEBUG
-    std::cout << "IDSCAN_DEBUG: loose set of grouCleaner parameters" << std::endl;
-#endif
-
-  }
- 
-
-  // deal with phi wrap-around when in full scan mode
-  if ( m_fullScan) {
-    double posPhi = 0;
-    double negPhi = 0;
-    std::list<IdScanSpPoint *> hitList = inputItr->groupHits();
-    for ( std::list<IdScanSpPoint *>::const_iterator i = hitList.begin(); 
-	  i != hitList.end(); ++i ) {
-      if ((*i)->phi()<-3.0) negPhi++;
-      if ((*i)->phi()> 3.0) posPhi++;
-    }
-
-    if (negPhi>0 && posPhi>0) {   // this group is in the phi wrap-around 
-
-#ifdef IDSCAN_DEBUG
-      std::cout << "IDSCAN_DEBUG: had to deal with phi wrap-around: " << posPhi<< "/" << negPhi << std::endl;
-#endif
-
-      for ( std::list<IdScanSpPoint *>::const_iterator i = hitList.begin(); 
-	    i != hitList.end(); ++i ) {
-	if ((*i)->phi()<0) ((*i)->setRotatedPhi(((*i)->rotatedPhi()+2.0*M_PI)));
-      }
-    }
-  }
-
-  this->fillMapGC1( inputItr, params );
-  //  this->fillMapGC2(inputItr, params );
-
-// Same clustering algo as before: Loop over bins to form groups
-//
-  unsigned long groupsBefore = cleanGroups.size();
-  this->clusterBins( cleanGroups );
-  unsigned long newGroups = cleanGroups.size()-groupsBefore;
-
-#ifdef IDSCAN_DEBUG
-  std::cout << "IDSCAN_DEBUG: grouCleaner found " << newGroups << " groups in the original group." << std::endl;
-#endif
-
-  if (newGroups!=0)
-    {
-      double eta = (inputItr->bin1()+0.5)/m_invEtaBinSize-m_IdScan_MaxEta;
-      GroupList::reverse_iterator gItr2=cleanGroups.rbegin();
-      for ( unsigned long i=0; i<newGroups;++i,++gItr2)
-	{
-	  double dfdrho = ((gItr2->bin2()+0.5)/params->invdPhidRBinSize)-params->dPhidRCut;
-	  double ptinv =  -dfdrho/params->dPhidRCut/1000.;
-	  double phi0 = (gItr2->bin1()+0.5)/params->invPhi0BinSize - dfdrho*params->phi0Offset;
-	  gItr2->setPhi0( phi0 );
-	  gItr2->setPtInv( ptinv );
-	  gItr2->setEta( eta );
-          gItr2->setz0( m_zVertex );
-	  gItr2->removeDuplicates();
-
-#ifdef IDSCAN_DEBUG
-	  std::cout << "IDSCAN_DEBUG: New grouCleaner group with number of hits = " << gItr2->NumberOfHits() 
-		    << " 1/pT= " << ptinv 
-		    << " phi0= " << phi0
-		    << " eta= " << eta 
-		    << " z0= " << m_zVertex
-		    << std::endl;
-#endif
-
-          for (IdScanSpPoint* pSP : gItr2->groupHits()) {
-	    pSP->setUsed(1);
-#ifdef IDSCAN_DEBUG
-	    std::cout << "IDSCAN_DEBUG: new group - layer = " << pSP->layer()
-		      << " phi= " << pSP->phi()
-		      << " rho= " << pSP->rho()
-		      << " zed= " << pSP->z()
-		      << std::endl;
-#endif
-	  }
-	  
-	  int badHit=0;
-	  //setting used=0 to spacepoints in the same layer
-	  for(std::list<IdScanSpPoint *>::iterator phIt1=(*gItr2).groupHits().begin();
-	      phIt1!=(*gItr2).groupHits().end();++phIt1) 
-	    {
-	      //if((*phIt1)->used()==0) continue;
-	      int lay1=(*phIt1)->layer();
-	      int type1=((*phIt1)->dz()<(*phIt1)->dr())?1:0;
-	      std::list<IdScanSpPoint *>::iterator phIt2=phIt1;
-	      ++phIt2;
-	      for(;phIt2!=(*gItr2).groupHits().end();++phIt2)
-		{
-		  //if((*phIt2)->used()==0) continue;
-		  int lay2=(*phIt2)->layer();
-		  int type2=((*phIt2)->dz()<(*phIt2)->dr())?1:0;
-		  if((lay2==lay1)&&(type2==type1))
-		    {
- 		      if(((type1==0)&&(std::fabs((*phIt2)->rho()-(*phIt1)->rho())<5.0))
- 			 ||((type1==1)&&(std::fabs((*phIt2)->z()-(*phIt1)->z())<2.0)))
- 			{
-			  if((*phIt2)->used()!=0) 
-			    {
-			      badHit++;
-			      (*phIt2)->setUsed(0);
-			    }
-			  if((*phIt1)->used()!=0) 
-			    {
-			      badHit++;
-			      (*phIt1)->setUsed(0);
-			    }
- 			}
-		    }
-		}
-	    }
-	  //printf("%d duplicated hits detected...\n",badHit);
-	  fitGroup((*gItr2));
-	  //fitGroupWithoutHitRemoval((*gItr2));
-
-	  //deleting spacepoints that have used==0
-	  if(badHit!=0)
-	    {
-	      std::list<IdScanSpPoint *>::iterator hitItr=(*gItr2).groupHits().begin();
-	      while(hitItr!=(*gItr2).groupHits().end())
-		{
-		  IdScanSpPoint* pSP=(*hitItr);
-		  if(pSP->used()==0)
-		    {
-		      (*gItr2).groupHits().erase(hitItr++);pSP->setUsed(1);
-		    }
-		  else 
-		    {
-		      ++hitItr;pSP->setUsed(1);
-		    }
-		}
-	    }
-
-	  if (badHit!=0)
-            {
-	      gItr2->setChi2(1e9);
-            }
-          else
-            {
-	      gItr2->setChi2(0);
-            }
-
-#ifdef IDSCAN_DEBUG
-	  std::cout << "IDSCAN_DEBUG: after ambig. resol. - number of hits = " << (*gItr2).NumberOfHits() << std::endl;
-	  for( hitItr=(*gItr2).groupHits().begin(); hitItr!=(*gItr2).groupHits().end(); hitItr++) {
-	    IdScanSpPoint* pSP=(*hitItr);
-	    std::cout << "IDSCAN_DEBUG: after ambig. resol. - layer = " << pSP->layer()
-		      << " phi= " << pSP->phi()
-		      << " rho= " << pSP->rho()
-		      << " zed= " << pSP->z()
-		      << std::endl;
-	  }
-#endif
-	}
-
-
-      if((newGroups>1)&&m_cloneRemoval)
-	{
-	  TrackFilterClass* pTF = new TrackFilterClass(m_usePtSign);
-	  gItr2=cleanGroups.rbegin();
-	  for ( unsigned long i=0; i<newGroups;++i,++gItr2)
-	    {
-	      pTF->addNewTrackCandidate(&(*gItr2));
-	    }
-	  pTF->removeClones(m_cloneRemovalCut);
-	  delete pTF;
-	}
-#ifdef IDSCAN_DEBUG
-	  std::cout << "IDSCAN_DEBUG: after clone removal remaining groups = " << cleanGroups.size()-groupsBefore << std::endl;
-
-	  gItr2=cleanGroups.rbegin();
-	  for ( unsigned long i=0; i<cleanGroups.size()-groupsBefore; ++i,++gItr2) {
-	    std::cout << "IDSCAN_DEBUG: Final group after clone rem. with number of hits = " << gItr2->NumberOfHits() 
-		      << " 1/pT= " << gItr2->getPtInv()
-		      << " phi0= " << gItr2->getPhi0()
-		      << " eta= " << gItr2->getEta()
-		      << " z0= " << gItr2->getz0()
-		      << std::endl;
-	  }
-
-#endif
-
-    }
-}
-
-
-void iHitFilter::fillMapGC1( GroupList::iterator& inputItr, groupCleanerParams* params ) const
-{
-//   Make hit triplets from different layer and if they satisfy certain cuts 
-//   fill the 2D histogram/map in (phi0,dPhidRho).
-//   This is the fancy way of making triplets. It is faster than fillMapGC1 for nHits > ~20
-//
-  std::vector<long> used(m_IdScan_MaxNumLayers,0);
-  std::vector<std::list<IdScanSpPoint*> > ll(m_IdScan_MaxNumLayers);
-  std::list<IdScanSpPoint*> hitList = inputItr->groupHits();
-  for ( std::list<IdScanSpPoint*>::const_iterator i = hitList.begin(); 
-       i != hitList.end(); ++i ) {
-    long lr = (*i)->layer();
-    ll[lr].push_back(*i);
-    used[lr]=1;
-  }
-  std::vector<long> filled(m_IdScan_MaxNumLayers);
-  long nf = 0;
-  for ( long i = 0; i < m_IdScan_MaxNumLayers; ++i ) {
-    if ( used[i] ) {
-      filled[nf++] = i;
-    }
-  }
-
-  double rr1,fr1, dzdr21, k21, ddzdr;
-  long sp_key;
-  double r[3],z[3],f[3],e[3];
-  for ( long i = 0; i < nf-2; ++i ) {
-    for ( std::list<IdScanSpPoint *>::const_iterator iit = ll[filled[i]].begin(); 
-	 iit != ll[filled[i]].end(); ++iit ) {
-
-#ifdef IDSCAN_DEBUG
-      std::cout << "layer1: " << filled[i] << std::endl;
-#endif
-
-      f[0] = (*iit)->rotatedPhi();
-      r[0] = (*iit)->rho();
-      z[0] = (*iit)->z();
-      e[0] = (*iit)->eta();
-      rr1 = r[0]*r[0];
-      fr1 = r[0]*f[0];
-      for ( long j = i+1; j < nf-1; ++j ) {
-	for ( std::list<IdScanSpPoint *>::const_iterator jit = ll[filled[j]].begin(); 
-	     jit != ll[filled[j]].end(); ++jit ) {
-
-#ifdef IDSCAN_DEBUG
-	  std::cout << "layer1/2: " << filled[i] << "/" << filled[j] << std::endl;
-#endif
-
-	  e[1] = (*jit)->eta();
-
-#ifdef IDSCAN_DEBUG
-	  std::cout << " d_etacutInner/21: " << 1000*(params->etaCutInner) << " / " << 1000*(e[1]-e[0]) << std::endl;
-#endif
-
- 	  if ( std::fabs(e[1]-e[0]) > params->etaCutInner ) continue;
- 	  f[1] = (*jit)->rotatedPhi();
-	  r[1] = (*jit)->rho();
-	  z[1] = (*jit)->z();
-	  dzdr21 = dzdr( r, z );
-	  k21 = ktemp( r, f );
-	  for ( long k = j+1; k < nf; ++k ) {
-	    for ( std::list<IdScanSpPoint *>::const_iterator kit = ll[filled[k]].begin(); 
-		 kit != ll[filled[k]].end(); ++kit ) {
-
-#ifdef IDSCAN_DEBUG
-	      std::cout << "layer1/2/3: " << filled[i] << "/" << filled[j] << "/" << filled[k] << std::endl;
-#endif
-
-	      e[2] = (*kit)->eta();
-
-#ifdef IDSCAN_DEBUG
-	      std::cout << " d_etacutOuter/321: " << 1000*(params->etaCutOuter) << " / " << 1000*(e[2]-e[1]) << std::endl;
-#endif
-
-   	      if ( std::fabs(e[2]-e[1]) > params->etaCutOuter ) continue;
-	      r[2] = (*kit)->rho();
-	      z[2] = (*kit)->z();
-	      ddzdr = dzdr21-dzdr( &r[1], &z[1] );
-
-#ifdef IDSCAN_DEBUG
-	      std::cout << "   1000ddzdr, 1000deltadZdRCut " << 1000*params->deltadZdRCut << 1000*ddzdr << " / "  << std::endl;
-#endif
-
- 	      if ( std::fabs(ddzdr) > params->deltadZdRCut ) continue;
- 	      f[2] = (*kit)->rotatedPhi();
-	      sp_key = this->makeHashKey( r, f, k21, rr1, fr1, params );
-	      if ( sp_key ) {
-		(*m_binMap)[sp_key].AddTriplet( *iit, *jit, *kit );
-
-#ifdef IDSCAN_DEBUG
-		std::cout << "                Made sp_key: " << sp_key << std::endl;
-#endif
-
-	      }
-	    }
-	  }
-	}
-      }
-    }
-  }
-
-  for (long i = 0; i < nf; ++i ) {
-    ll[filled[i]].clear();
-  }
-
-}
-
-
-void iHitFilter::fillMapGC2(GroupList::iterator& inputItr, groupCleanerParams* params ) const
-{
-//   Make hit triplets from different layer and if they satisfy certain cuts 
-//   fill the 2D histogram/map in (phi0,dPhidRho).
-//   This is the brute force way of making triplets, which is the fastest for nHits < ~20
-//
-  long nHits = inputItr->NumberOfHits();
-  std::list<IdScanSpPoint *> hitList = inputItr->groupHits();
-
-
-  std::list<IdScanSpPoint *>::const_iterator Itr0( hitList.begin() );
-  std::list<IdScanSpPoint *>::const_iterator Itr1, Itr2;
-
-  long sp_key, l[3];
-  double rr1, fr1, dzdr21, k21, ddzdr;
-  double r[3],z[3],f[3],e[3];
-
-  for ( long i=0; i<nHits-2; ++i, ++Itr0 ) {
-    f[0] = (*Itr0)->rotatedPhi();
-    r[0] = (*Itr0)->rho();
-    z[0] = (*Itr0)->z();
-    e[0] = (*Itr0)->eta();
-    l[0] = (*Itr0)->layer();
-    rr1 = r[0]*r[0];
-    fr1 = r[0]*f[0];
-
-    Itr1 = Itr0; ++Itr1;
-    for ( long j=i+1; j<nHits-1; ++j, ++Itr1 ) {
-      l[1] = (*Itr1)->layer();
-      if ( l[1]==l[0] ) continue;
-
-      e[1] = (*Itr1)->eta();
-      if ( std::fabs(e[1]-e[0])>params->etaCutInner ) continue;
-
-      f[1] = (*Itr1)->rotatedPhi();
-      r[1] = (*Itr1)->rho();
-      z[1] = (*Itr1)->z();
-      dzdr21 = dzdr( r, z );
-      k21 = ktemp( r, f );
-
-      Itr2 = Itr1; ++Itr2;
-      for ( long k=j+1; k<nHits; ++k, ++Itr2 ) {
-	l[2] = (*Itr2)->layer();
-	if ( l[2]==l[1] ) continue;
-
-	e[2] = (*Itr2)->eta();
-	if ( std::fabs(e[2]-e[1]) > params->etaCutOuter ) continue;
-
-	r[2] = (*Itr2)->rho();
-	z[2] = (*Itr2)->z();
-	ddzdr = dzdr21-dzdr( &r[1], &z[1] );
-	if ( std::fabs(ddzdr) > params->deltadZdRCut ) continue;
-
-	f[2] = (*Itr2)->rotatedPhi();
-	sp_key = this->makeHashKey( r, f, k21, rr1, fr1, params );
-
-	if (sp_key) {
-	  (*m_binMap)[sp_key].AddTriplet( *Itr0, *Itr1, *Itr2 );
-	}
-      }
-    }
-  }
-
-}
-
-
-void iHitFilter::clusterBins( GroupList& gList )
-{
-//   Loop over all the bins in the map and cluster them into groups. As soon as
-//   bins are processed they get deleted with the fancy m_binMap->erase( binItr++ ) 
-//   so at the end of this loop m_binMap is empty and there is no need to .clear()!
-//
-  FilterMap::iterator binItr( m_binMap->begin() ), mapEnd( m_binMap->end() );
-  for ( ;  binItr != mapEnd; m_binMap->erase( binItr++ ) ) {
-    if ( (binItr->second).NumberOfHits() > 0 ) {
-      m_binCounter = 0;
-      this->joinGroup( binItr->first, binItr->second, gList.end(), gList );
-      //      int binCounter = 0;
-      //      this->joinGroup( binItr->first, binItr->second, gList.end(), gList, bincounter);
-    }
-  }
-}
-
-
-void iHitFilter::joinGroup( long key, FilterBin& bin, 
-			   GroupList::iterator giter, GroupList& glist )
-{
-//   1. Find the 8 neighbouring bins and exchange layer numbers
-//
-  long np[8], Nneigh( 0 );
-  this->neighborKeys(key, np );
-
-#ifdef IDSCAN_DEBUG
-  std::cout << "IDSCAN_DEBUG: in join groups - bincounter/key = " << m_binCounter << " / " << key << std::endl;
-#endif
-
-  FilterMap::iterator miter, mneigh[8], mEnd( m_binMap->end() );
-  for( long i = 0; i < 8; ++i ) {
-
-#ifdef IDSCAN_DEBUG
-    std::cout << "IDSCAN_DEBUG: neighbour = " << i << " / " << np[i] << std::endl;
-#endif
-
-    if ( ( miter=m_binMap->find(np[i]) ) != mEnd ){
-      mneigh[Nneigh++] = miter;
-      bin.exchangeBits( miter->second ); 
-    }
-  }
-  
-//   2. Knowing the total number of layers in this bin, decide whether to proceed in 
-//   forming/joining a group; if not, get out of here!
-//
-  if ( bin.NumberOfLayers() > m_layerThresholdTmp ) {
-
-//   if the GroupList iterator giter is in the end, it means that this bin should start
-//   the formation of a new group; if not, it means that it should join the group pointed
-//   to by giter
-// 
-    if (giter == glist.end()){
-      glist.push_back( Group() );
-      giter-- = glist.end();
-    }
-    long bin1 = key/HashKeyCoeff;
-    long bin2 = key%HashKeyCoeff;
-    giter->AddHits( bin.hitList(), bin1, bin2 ); //   pass all hits from the bin to the group...
-    
-//   Now all the neighbours should follow the same procedure...
-//
-    for(long i=0; i<Nneigh; ++i){
-      if ( (mneigh[i]->second).NumberOfHits() > 0 && m_binCounter<25){
-	m_binCounter++;
-	this->joinGroup( mneigh[i]->first, mneigh[i]->second, giter, glist );
-      }
-    }      
-  }    
-  
-}
-
-
-long iHitFilter::makeHashKey( double* r,  double* f, 
-			     double k21, double rr1, 
-			     double fr1, groupCleanerParams* params ) const
-{
-//   Makes the hash key for the (phi0,dPhidRho) map of the group cleaner.
-//   Unlike before, here we calculate d0 and dPhidRho and make cuts on them,
-//   so hash key = 0 means "ignore this hit-triplet". 
-//
-  double k32 = ktemp(&r[1],&f[1]);
-
-  double dfdr = (k32-k21)/(r[2]-r[0]);
-
-#ifdef IDSCAN_DEBUG
-  std::cout << "makeHashKey 1: 1000*dfdrcut(<)dfdr " << 1000*(params->dPhidRCut) << " / " << 1000*dfdr << std::endl;
-#endif
-
-  if ( std::fabs(dfdr)>params->dPhidRCut ) return 0;
-
-  double f0 = k21 - dfdr*(r[0]+r[1]);
-
-  double d0 = fr1-dfdr*rr1-f0*r[0];
-
-#ifdef IDSCAN_DEBUG
-  std::cout << "makeHashKey 2: 1000*d0cut/d0 " << 1000*(params->d0Cut) << " / " << 1000*d0 << std::endl;
-#endif
-
-  if ( std::fabs(d0)>params->d0Cut ) return 0;
-
-  f0 += dfdr*params->phi0Offset;
-
-  long dfdrbin = (long) ( ( dfdr + params->dPhidRCut ) * params->invdPhidRBinSize );
-  long f0bin = (long) ( f0*params->invPhi0BinSize );
-
-#ifdef IDSCAN_DEBUG
-  std::cout << "f0bin/dfdrbin:  " << f0bin << " / " << dfdrbin << std::endl;
-#endif
-
-  return HashKeyCoeff*f0bin + dfdrbin;
-}
-
-
-TrackCandidateClass::TrackCandidateClass(Group* grp)
-{
-  m_pGroup=grp;
-  m_nHitShift=0;
-  m_nSharedHits=0;
-  m_nSharedTotal=0;
-  m_fom=1.0*grp->groupHits().size();
-}
-
-TrackFilterClass::TrackFilterClass(bool usePtSign)
-{
-  m_vpTCC.clear();
-  m_usePtSign=usePtSign;
-}
-
-TrackFilterClass::~TrackFilterClass()
-{
-  for(std::vector<TrackCandidateClass*>::iterator pTCCIt=m_vpTCC.begin();
-      pTCCIt!=m_vpTCC.end();++pTCCIt)
-    {
-      delete (*pTCCIt);
-    }
-  m_vpTCC.clear();
-}
-
-void TrackFilterClass::addNewTrackCandidate(Group* pGrp)
-{
-  TrackCandidateClass* pTCC;
-  pTCC=new TrackCandidateClass(pGrp);
-  pTCC->m_pt=1.0/pGrp->getPtInv();
-  m_vpTCC.push_back(pTCC);
-}
-
-bool compareTrackCandidates(const TrackCandidateClass* pTCC1, const TrackCandidateClass* pTCC2)
-{
-  if ( pTCC1->m_fom == pTCC2->m_fom ) return (std::fabs(pTCC1->m_pt) > std::fabs(pTCC2->m_pt) );
-  return (pTCC1->m_fom > pTCC2->m_fom );
-}
-
-void TrackFilterClass::removeClones(int cut)
-{
-  int nTrackCounter=1;
-  int nSign,nBinNum;
-  char nContribHisto[1000];
-
-  std::sort(m_vpTCC.begin(),m_vpTCC.end(),compareTrackCandidates);
-  for(std::vector<TrackCandidateClass*>::iterator pTCCIt=m_vpTCC.begin();
-      pTCCIt!=m_vpTCC.end();++pTCCIt)
-    { 
-      nTrackCounter++;
-      nSign=((*pTCCIt)->m_pt<0)?-1:1;
-      (*pTCCIt)->m_nHitShift=nTrackCounter*nSign;
-      memset(nContribHisto,0,sizeof(nContribHisto));
-
-      for (IdScanSpPoint* pSP : (*pTCCIt)->m_pGroup->groupHits())
-	{
-	  if(pSP->used()==0) continue;
-	  if(pSP->used()==1)
-	    pSP->setUsed((*pTCCIt)->m_nHitShift);
-	  else
-	    {
-	      if((((pSP->used()*nSign)>0)&&(m_usePtSign))||(!m_usePtSign))
-	      {
-		nBinNum=abs(pSP->used())-1;
-		if(nBinNum<1000)
-		  {
-		    nContribHisto[nBinNum]++;
-		    if(nContribHisto[nBinNum]>(*pTCCIt)->m_nSharedHits)
-		      (*pTCCIt)->m_nSharedHits++;
-		  }
-	      }
-	      (*pTCCIt)->m_nSharedTotal++;
-	    }
-	}
-    }
-  for(std::vector<TrackCandidateClass*>::iterator pTCCIt=m_vpTCC.begin();
-      pTCCIt!=m_vpTCC.end();++pTCCIt)
-    {
-      if( (*pTCCIt)->m_nSharedHits>=cut || (*pTCCIt)->m_nSharedTotal > 0.45*(*pTCCIt)->m_pGroup->NumberOfHits() )
-	(*pTCCIt)->m_pGroup->groupHits().clear();
-    }
-}
-
-typedef std::vector<IdScanSpPoint*> HIT_VECTOR;
-
-bool CompareSpByLayer(const IdScanSpPoint* point1, const IdScanSpPoint* point2)
-{
-  return (point1->layer() < point2->layer());
-}
-
-void iHitFilter::fitGroup(Group& G)
-{
-  const double C=0.029997;
-  const double maxChi2=500.0;
-  const double maxChi2inGroup=6000.0;
-  const double minPt=600.0;
-
-  double Rk[5],Gk[5][5],Hk[2][5],Kk[5][2],resid[2],
-    Bk[5][2],Vk[2][2],sigma[2][2],Dk[2][2];
-  double chi2,dchi2,Bz,fConst,x,y,detr,bestChi2,averagePhi0=0.0,theta;
-  int i,j,m,nAmbiLayers=0,nHits=0;
-
-  HIT_VECTOR arrAmbiLayers[20];
-  HIT_VECTOR spVec;
-  int arrAmbiIdx[20];
-
-  IdScanSpPoint* pBestSP;
-  spVec.clear();
-
-  theta=2.0*atan(exp(-G.getEta()));
-
-  Rk[0]=0.0;
-  //  Rk[1]=0.0;
-  Rk[1]=G.getz0();
-  Rk[2]=0.0;
-  Rk[3]=cos(theta)/sin(theta);
-  Rk[4]=G.getPtInv();
-
-  memset(&Gk[0][0],0,sizeof(Gk));
-  Gk[0][0]=100.0;
-  Gk[1][1]=100.0;
-  Gk[2][2]=100.0;
-  Gk[3][3]=100.0;
-  Gk[4][4]=0.01;
-  memset(&arrAmbiIdx[0],0,sizeof(arrAmbiIdx));
-
-  chi2=0.0;Bz=20.84;fConst=C*Bz;
-
-  double minPhi=(*G.groupHits().begin())->phi();
-
-  for (IdScanSpPoint* pSP : G.groupHits())
-    {
-      if(minPhi>pSP->phi()) minPhi=pSP->phi();
-      spVec.push_back(pSP);
-    }
-  std::sort(spVec.begin(),spVec.end(),CompareSpByLayer);
-
-  for (IdScanSpPoint* pSP : spVec)
-    {
-      nHits++;
-      double delta=pSP->phi()-minPhi;
-      if(std::fabs(delta)>M_PI) delta-=2.0*M_PI;
-      averagePhi0+=delta;
-    }
-  averagePhi0/=nHits;averagePhi0+=minPhi;
-
-#ifdef IDSCAN_DEBUG
-  printf("Average PHI0=%f Initial Pt=%f\n",averagePhi0,1.0/G.getPtInv());
-#endif
-
-  for(std::vector<IdScanSpPoint *>::reverse_iterator hitItr=spVec.rbegin();hitItr!=spVec.rend();++hitItr) 
-    {
-      IdScanSpPoint* pSP=(*hitItr);
-      if(pSP->used()!=0)
-	{
-	  x=pSP->rho()*cos(pSP->phi()-averagePhi0);
-	  y=pSP->rho()*sin(pSP->phi()-averagePhi0);
-#ifdef IDSCAN_DEBUG
-	  printf("x=%f y=%f z=%f\n",x,y,pSP->z());
-#endif
-	  Hk[0][0]=1.0;Hk[0][1]=0.0;Hk[0][2]=x;
-	  Hk[0][3]=0.0;Hk[0][4]=-0.5*x*x*fConst;
-	  Hk[1][0]=0.0;Hk[1][1]=1.0;
-	  Hk[1][2]=0.0;Hk[1][3]=x;Hk[1][4]=0.0;
-	  for(i=0;i<5;i++)
-	    for(j=0;j<2;j++) 
-	      {
-		Bk[i][j]=0.0;for(m=0;m<5;m++) Bk[i][j]+=Gk[i][m]*Hk[j][m];
-	      }
-	  for(i=0;i<2;i++)
-	    for(j=0;j<2;j++)
-	      {
-		Vk[i][j]=0.0;for(m=0;m<5;m++) Vk[i][j]+=Hk[i][m]*Bk[m][j];
-	      }
-
-	  if(pSP->layer()<7)
-	    {
-	      sigma[0][0]=x*pSP->dphi();
-	      sigma[1][1]=pSP->dz();
-	      for(i=0;i<2;i++)
-		Vk[i][i]+=sigma[i][i]*sigma[i][i];
-	    }
-	  else
-	    {
-	      sigma[1][1]=pSP->dr()*Rk[3]/cos(Rk[2]);
-	      sigma[1][1]=sigma[1][1]*sigma[1][1];
-	      double a=Rk[2]-x*fConst*Rk[4]-sin(pSP->phi()-averagePhi0);
-	      sigma[0][0]=x*x*pSP->dphi()*pSP->dphi()+
-		a*a*pSP->dr()*pSP->dr();
-	      sigma[0][1]=sigma[1][0]=a*Rk[3]*pSP->dr()*pSP->dr();
-	      for(i=0;i<2;i++)
-		for(j=0;j<2;j++)
-		  Vk[i][j]+=sigma[i][j];
-	    }
-
-	  detr=Vk[0][0]*Vk[1][1]-Vk[0][1]*Vk[1][0];detr=1.0/detr;
-	  Dk[0][0]=Vk[1][1]*detr;Dk[0][1]=Dk[1][0]=-Vk[0][1]*detr;
-	  Dk[1][1]=Vk[0][0]*detr;
-	  
-	  for(i=0;i<2;i++)
-	    {
-	      resid[i]=0.0;for(j=0;j<5;j++) resid[i]+=Hk[i][j]*Rk[j];
-	    }
-	  resid[0]=y-resid[0];
-	  resid[1]=pSP->z()-resid[1];
-	  dchi2=resid[0]*resid[0]*Dk[0][0]+2.0*Dk[0][1]*resid[0]*resid[1]+
-	    resid[1]*resid[1]*Dk[1][1];
-	  //	  printf("r1=%f r2=%f dchi2=%f\n",resid[0],resid[1],dchi2);
-	  //printf("dchi2phi=%f dchi2z=%f\n",
-	  //	 resid[0]*resid[0]*Dk[0][0],resid[1]*resid[1]*Dk[1][1]);
-	  if(dchi2<maxChi2)
-	    {
-	      chi2+=dchi2;
-	      for(i=0;i<5;i++)
-		for(j=0;j<2;j++)
-		  {
-		    Kk[i][j]=0.0;for(m=0;m<2;m++) Kk[i][j]+=Bk[i][m]*Dk[m][j];
-		  }
-	      for(i=0;i<5;i++)
-		Rk[i]+=Kk[i][0]*resid[0]+Kk[i][1]*resid[1];
-	      for(i=0;i<5;i++)
-		for(j=i;j<5;j++) 
-		  {
-		    Gk[i][j]-=Kk[i][0]*Bk[j][0]+Kk[i][1]*Bk[j][1];
-		    Gk[j][i]=Gk[i][j];
-		  }
-	    }
-	}
-      else
-	{
-	  int LayId=pSP->layer();
-	  arrAmbiIdx[LayId]++;
-	  arrAmbiLayers[LayId].push_back(pSP);
-	}
-    }
-#ifdef IDSCAN_DEBUG        
-  printf("Estimates before amb.resolving : d0=%f z0=%f phi0=%f theta=%f pT=%f\n",
-	 Rk[0],Rk[1],Rk[2],theta,1.0/Rk[4]);
-  printf("Chi2 = %f Total %d ambiguities\n",
-	 chi2,nAmbiLayers);
-#endif
-
-  for(i=0;i<20;i++) nAmbiLayers+=arrAmbiIdx[i];
-  if(nAmbiLayers!=0)
-    {
-      for(int layId=19;layId>=0;layId--) 
-	{
-	  if(arrAmbiIdx[layId]==0) continue;
-	  pBestSP=NULL;
-	  bestChi2=maxChi2;
-#ifdef IDSCAN_DEBUG
-	  printf("Analyzing layer %d ...\n",layId);
-#endif
-	  for(std::vector<IdScanSpPoint *>::iterator hitItr=arrAmbiLayers[layId].begin();
-	      hitItr!=arrAmbiLayers[layId].end();++hitItr)
-	    {
-	      IdScanSpPoint* pSP=(*hitItr);
-	      x=pSP->rho()*cos(pSP->phi()-averagePhi0);
-	      y=pSP->rho()*sin(pSP->phi()-averagePhi0);
-	      Hk[0][0]=1.0;Hk[0][1]=0.0;Hk[0][2]=x;
-	      Hk[0][3]=0.0;Hk[0][4]=-0.5*x*x*fConst;
-	      Hk[1][0]=0.0;Hk[1][1]=1.0;
-	      Hk[1][2]=0.0;Hk[1][3]=x;Hk[1][4]=0.0;
-	      for(i=0;i<5;i++)
-		for(j=0;j<2;j++) 
-		  {
-		    Bk[i][j]=0.0;for(m=0;m<5;m++) Bk[i][j]+=Gk[i][m]*Hk[j][m];
-		  }
-	      for(i=0;i<2;i++)
-		for(j=0;j<2;j++)
-		  {
-		    Vk[i][j]=0.0;for(m=0;m<5;m++) Vk[i][j]+=Hk[i][m]*Bk[m][j];
-		  }
-	      if(pSP->layer()<7)
-		{
-		  sigma[0][0]=pSP->rho()*pSP->dphi();
-		  sigma[1][1]=pSP->dz();
-		  for(i=0;i<2;i++)
-		    Vk[i][i]+=sigma[i][i]*sigma[i][i];
-		}
-	      else
-		{
-		  sigma[1][1]=pSP->dr()*Rk[3]/cos(Rk[2]);
-		  sigma[1][1]=sigma[1][1]*sigma[1][1];
-		  double a=Rk[2]-x*fConst*Rk[4]-sin(pSP->phi()-averagePhi0);
-		  sigma[0][0]=x*x*pSP->dphi()*pSP->dphi()+
-		    a*a*pSP->dr()*pSP->dr();
-		  sigma[0][1]=sigma[1][0]=a*Rk[3]*pSP->dr()*pSP->dr();
-		  for(i=0;i<2;i++)
-		    for(j=0;j<2;j++)
-		      Vk[i][j]+=sigma[i][j];
-		}
-
-	      detr=Vk[0][0]*Vk[1][1]-Vk[0][1]*Vk[1][0];detr=1.0/detr;
-	      Dk[0][0]=Vk[1][1]*detr;Dk[0][1]=Dk[1][0]=-Vk[0][1]*detr;
-	      Dk[1][1]=Vk[0][0]*detr;
-	      for(i=0;i<2;i++)
-		{
-		  resid[i]=0.0;for(j=0;j<5;j++) resid[i]+=Hk[i][j]*Rk[j];
-		}
-	      resid[0]=y-resid[0];
-	      resid[1]=pSP->z()-resid[1];
-	      dchi2=resid[0]*resid[0]*Dk[0][0]+2.0*Dk[0][1]*resid[0]*resid[1]+
-		resid[1]*resid[1]*Dk[1][1];
-#ifdef IDSCAN_DEBUG
-	      printf("          dchi2=%f\n",dchi2);
-#endif
-	      if(dchi2<bestChi2)
-		{
-		  bestChi2=dchi2;
-		  pBestSP=pSP;
-		}
-	    }
-	  if(pBestSP!=NULL)
-	    {
-#ifdef IDSCAN_DEBUG
-	      printf("Best spacepoint with dchi2=%f\n",bestChi2);
-#endif
-	      IdScanSpPoint* pSP=pBestSP;
-	      pSP->setUsed(1);
-	      x=pSP->rho()*cos(pSP->phi()-averagePhi0);
-	      y=pSP->rho()*sin(pSP->phi()-averagePhi0);
-	      Hk[0][0]=1.0;Hk[0][1]=0.0;Hk[0][2]=x;
-	      Hk[0][3]=0.0;Hk[0][4]=-0.5*x*x*fConst;
-	      Hk[1][0]=0.0;Hk[1][1]=1.0;
-	      Hk[1][2]=0.0;Hk[1][3]=x;Hk[1][4]=0.0;
-	      for(i=0;i<5;i++)
-		for(j=0;j<2;j++) 
-		  {
-		    Bk[i][j]=0.0;for(m=0;m<5;m++) Bk[i][j]+=Gk[i][m]*Hk[j][m];
-		  }
-	      for(i=0;i<2;i++)
-		for(j=0;j<2;j++)
-		  {
-		    Vk[i][j]=0.0;for(m=0;m<5;m++) Vk[i][j]+=Hk[i][m]*Bk[m][j];
-		  }
-	      if(pSP->layer()<7)
-		{
-		  sigma[0][0]=x*pSP->dphi();
-		  sigma[1][1]=pSP->dz();
-		  for(i=0;i<2;i++)
-		    Vk[i][i]+=sigma[i][i]*sigma[i][i];
-		}
-	      else
-		{
-		  sigma[1][1]=pSP->dr()*Rk[3]/cos(Rk[2]);
-		  sigma[1][1]=sigma[1][1]*sigma[1][1];
-		  double a=Rk[2]-x*fConst*Rk[4]-sin(pSP->phi()-averagePhi0);
-		  sigma[0][0]=x*x*pSP->dphi()*pSP->dphi()+
-		    a*a*pSP->dr()*pSP->dr();
-		  sigma[0][1]=sigma[1][0]=a*Rk[3]*pSP->dr()*pSP->dr();
-		  for(i=0;i<2;i++)
-		    for(j=0;j<2;j++)
-		      Vk[i][j]+=sigma[i][j];
-		}
-
-	      detr=Vk[0][0]*Vk[1][1]-Vk[0][1]*Vk[1][0];detr=1.0/detr;
-	      Dk[0][0]=Vk[1][1]*detr;Dk[0][1]=Dk[1][0]=-Vk[0][1]*detr;
-	      Dk[1][1]=Vk[0][0]*detr;
-	      
-	      for(i=0;i<2;i++)
-		{
-		  resid[i]=0.0;for(j=0;j<5;j++) resid[i]+=Hk[i][j]*Rk[j];
-		}
-	      resid[0]=y-resid[0];
-	      resid[1]=pSP->z()-resid[1];
-	      dchi2=resid[0]*resid[0]*Dk[0][0]+2.0*Dk[0][1]*resid[0]*resid[1]+
-		resid[1]*resid[1]*Dk[1][1];
-	      //  printf("r1=%f r2=%f dchi2=%f\n",resid[0],resid[1],dchi2);
-	      chi2+=dchi2;
-	      for(i=0;i<5;i++)
-		for(j=0;j<2;j++)
-		  {
-		    Kk[i][j]=0.0;for(m=0;m<2;m++) Kk[i][j]+=Bk[i][m]*Dk[m][j];
-		  }
-	      for(i=0;i<5;i++)
-		Rk[i]+=Kk[i][0]*resid[0]+Kk[i][1]*resid[1];
-	      for(i=0;i<5;i++)
-		for(j=i;j<5;j++) 
-		  {
-		    Gk[i][j]-=Kk[i][0]*Bk[j][0]+Kk[i][1]*Bk[j][1];
-		    Gk[j][i]=Gk[i][j];
-		  }
-	    }
-#ifdef IDSCAN_DEBUG
-	  else 
-	    printf("All SPs are rejected\n");
-#endif
-	}
-    }
-  theta=atan(1.0/Rk[3]);
-  if(theta<0.0) theta+=M_PI;
-  Rk[2]+=averagePhi0;
-#ifdef IDSCAN_DEBUG        
-  printf("Final estimates: d0=%f z0=%f phi0=%f theta=%f pT=%f\n",
-	 Rk[0],Rk[1],Rk[2],theta,1.0/Rk[4]);
-  printf("Chi2 = %f Total %d ambiguities\n",
-	 chi2,nAmbiLayers);
-#endif
-  if((chi2>maxChi2inGroup)||(std::fabs(1.0/Rk[4])<minPt))
-    {
-      G.groupHits().clear();
-#ifdef IDSCAN_DEBUG        
-      printf("Large Chi2 or very low pT - the group is rejected\n");
-#endif
-    }
-  G.setPtInv(Rk[4]);
-  G.setChi2(chi2);
-  G.setPhi0(Rk[2]);
-  G.setz0(Rk[1]);
-  G.setEta(-log(sin(0.5*theta)/cos(0.5*theta)));
-
-  for(i=0;i<20;i++)
-    {
-      if(arrAmbiIdx[i]!=0) 
-	{
-	  arrAmbiLayers[i].clear();
-	}
-    }
-}
-void iHitFilter::fitGroupWithoutHitRemoval(Group& G)
-{
-  const double C=0.029997;
-  const double maxChi2=500.0;
-  const double maxChi2inGroup=6000.0;
-  const double minPt=600.0;
-
-  double Rk[5],Gk[5][5],Hk[2][5],Kk[5][2],resid[2],
-    Bk[5][2],Vk[2][2],sigma[2][2],Dk[2][2];
-  double chi2,dchi2,Bz,fConst,x,y,z,detr,averagePhi0=0.0,theta,
-    phiErr,rhoErr,zErr;
-  int i,j,m,nAmbiLayers=0,nHits=0;
-
-  HIT_VECTOR arrAmbiLayers[20];
-  HIT_VECTOR spVec;
-  int arrAmbiIdx[20];
-
-  spVec.clear();
-
-  theta=2.0*atan(exp(-G.getEta()));
-
-  Rk[0]=0.0;
-  //  Rk[1]=0.0;
-  Rk[1]=G.getz0();
-  Rk[2]=0.0;
-  Rk[3]=cos(theta)/sin(theta);
-  Rk[4]=G.getPtInv();
-
-  memset(&Gk[0][0],0,sizeof(Gk));
-  Gk[0][0]=100.0;
-  Gk[1][1]=100.0;
-  Gk[2][2]=100.0;
-  Gk[3][3]=100.0;
-  Gk[4][4]=0.01;
-  memset(&arrAmbiIdx[0],0,sizeof(arrAmbiIdx));
-
-  chi2=0.0;Bz=20.84;fConst=C*Bz;
-
-  double minPhi=(*G.groupHits().begin())->phi();
-
-  for (IdScanSpPoint* pSP : G.groupHits())
-    {
-      if(minPhi>pSP->phi()) minPhi=pSP->phi();
-      spVec.push_back(pSP);
-    }
-  std::sort(spVec.begin(),spVec.end(),CompareSpByLayer);
-
-  for (IdScanSpPoint* pSP : spVec)
-    {
-      if(pSP->used()==0)
-	pSP->setUsed(1);
-      nHits++;
-      double delta=pSP->phi()-minPhi;
-      if(std::fabs(delta)>M_PI) delta-=2.0*M_PI;
-      averagePhi0+=delta;
-    }
-  averagePhi0/=nHits;averagePhi0+=minPhi;
-
-#ifdef IDSCAN_DEBUG
-  printf("Average PHI0=%f Initial Pt=%f\n",averagePhi0,1.0/G.getPtInv());
-#endif
-
-  for(std::vector<IdScanSpPoint *>::reverse_iterator hitItr=spVec.rbegin();hitItr!=spVec.rend();++hitItr) 
-    {
-      IdScanSpPoint* pSP=(*hitItr);
-      int LayId=pSP->layer();
-      arrAmbiIdx[LayId]++;
-      arrAmbiLayers[LayId].push_back(pSP);
-    }
-  for(int LayId=0;LayId<20;LayId++)
-    {
-      if(arrAmbiIdx[LayId]==0) continue;
-
-      if(arrAmbiIdx[LayId]==1)
-	{
-	  IdScanSpPoint* pSP=(*arrAmbiLayers[LayId].begin());
-	  x=pSP->rho()*cos(pSP->phi()-averagePhi0);
-	  y=pSP->rho()*sin(pSP->phi()-averagePhi0);
-	  z=pSP->z();
-	  phiErr=pSP->dphi();
-	  rhoErr=pSP->dr();
-	  zErr=pSP->dz();
-#ifdef IDSCAN_DEBUG
-	  printf("x=%f y=%f z=%f of a spacepoint\n",x,y,z);
-#endif
-	}
-      else
-	{
-	  x=0.0;y=0.0;z=0.0;
-	  int nHitLayer=0;
-	  for(HIT_VECTOR::iterator hitItr=arrAmbiLayers[LayId].begin();hitItr!=arrAmbiLayers[LayId].end();++hitItr)
-	    {
-	      IdScanSpPoint* pSP=(*hitItr);
-	      nHitLayer++;
-	      x+=pSP->rho()*cos(pSP->phi()-averagePhi0);
-	      y+=pSP->rho()*sin(pSP->phi()-averagePhi0);
-	      z+=pSP->z();nAmbiLayers++;
-	    }
-	  x=x/nHitLayer;y=y/nHitLayer;z=z/nHitLayer;
-#ifdef IDSCAN_DEBUG
-	  printf("x=%f y=%f z=%f of spacepoint combination\n",x,y,z);
-#endif
-	  IdScanSpPoint* pSP=(*arrAmbiLayers[LayId].begin());
-	  phiErr=10.0*pSP->dphi();
-	  rhoErr=10.0*pSP->dr();
-	  zErr=10.0*pSP->dz();
-	}
-      Hk[0][0]=1.0;Hk[0][1]=0.0;Hk[0][2]=x;
-      Hk[0][3]=0.0;Hk[0][4]=-0.5*x*x*fConst;
-      Hk[1][0]=0.0;Hk[1][1]=1.0;
-      Hk[1][2]=0.0;Hk[1][3]=x;Hk[1][4]=0.0;
-      for(i=0;i<5;i++)
-	for(j=0;j<2;j++) 
-	  {
-	    Bk[i][j]=0.0;for(m=0;m<5;m++) Bk[i][j]+=Gk[i][m]*Hk[j][m];
-	  }
-      for(i=0;i<2;i++)
-	for(j=0;j<2;j++)
-	  {
-	    Vk[i][j]=0.0;for(m=0;m<5;m++) Vk[i][j]+=Hk[i][m]*Bk[m][j];
-	  }
-      if(LayId<7)
-	{
-	  sigma[0][0]=x*phiErr;
-	  sigma[1][1]=zErr;
-	  for(i=0;i<2;i++)
-	    Vk[i][i]+=sigma[i][i]*sigma[i][i];
-	}
-      else
-	{
-	  sigma[1][1]=rhoErr*Rk[3]/cos(Rk[2]);
-	  sigma[1][1]=sigma[1][1]*sigma[1][1];
-	  double phii = atan2(y,x);
-	  double a=Rk[2]-x*fConst*Rk[4]-sin(phii);
-	  sigma[0][0]=x*x*phiErr*phiErr+a*a*rhoErr*rhoErr;
-	  sigma[0][1]=sigma[1][0]=a*Rk[3]*rhoErr*rhoErr;
-	  for(i=0;i<2;i++)
-	    for(j=0;j<2;j++)
-	      Vk[i][j]+=sigma[i][j];
-	    }
-
-	  detr=Vk[0][0]*Vk[1][1]-Vk[0][1]*Vk[1][0];detr=1.0/detr;
-	  Dk[0][0]=Vk[1][1]*detr;Dk[0][1]=Dk[1][0]=-Vk[0][1]*detr;
-	  Dk[1][1]=Vk[0][0]*detr;
-	  
-	  for(i=0;i<2;i++)
-	    {
-	      resid[i]=0.0;for(j=0;j<5;j++) resid[i]+=Hk[i][j]*Rk[j];
-	    }
-	  resid[0]=y-resid[0];
-	  resid[1]=z-resid[1];
-	  dchi2=resid[0]*resid[0]*Dk[0][0]+2.0*Dk[0][1]*resid[0]*resid[1]+
-	    resid[1]*resid[1]*Dk[1][1];
-	  //	  printf("r1=%f r2=%f dchi2=%f\n",resid[0],resid[1],dchi2);
-	  //printf("dchi2phi=%f dchi2z=%f\n",
-	  //	 resid[0]*resid[0]*Dk[0][0],resid[1]*resid[1]*Dk[1][1]);
-	  if(dchi2<maxChi2)
-	    {
-	      chi2+=dchi2;
-	      for(i=0;i<5;i++)
-		for(j=0;j<2;j++)
-		  {
-		    Kk[i][j]=0.0;for(m=0;m<2;m++) Kk[i][j]+=Bk[i][m]*Dk[m][j];
-		  }
-	      for(i=0;i<5;i++)
-		Rk[i]+=Kk[i][0]*resid[0]+Kk[i][1]*resid[1];
-	      for(i=0;i<5;i++)
-		for(j=i;j<5;j++) 
-		  {
-		    Gk[i][j]-=Kk[i][0]*Bk[j][0]+Kk[i][1]*Bk[j][1];
-		    Gk[j][i]=Gk[i][j];
-		  }
-	    }
-    }
-  theta=atan(1.0/Rk[3]);
-  if(theta<0.0) theta+=M_PI;
-  Rk[2]+=averagePhi0;
-#ifdef IDSCAN_DEBUG        
-  printf("Final estimates: d0=%f z0=%f phi0=%f theta=%f pT=%f\n",
-	 Rk[0],Rk[1],Rk[2],theta,1.0/Rk[4]);
-  printf("Chi2 = %f Total %d ambiguities\n",
-	 chi2,nAmbiLayers);
-#endif
-  if((chi2>maxChi2inGroup)||(std::fabs(1.0/Rk[4])<minPt))
-    {
-      G.groupHits().clear();
-#ifdef IDSCAN_DEBUG        
-      printf("Large Chi2 or very low pT - the group is rejected\n");
-#endif
-    }
-  G.setPtInv(Rk[4]);
-  G.setChi2(chi2);
-  G.setPhi0(Rk[2]);
-  G.setz0(Rk[1]);
-  G.setEta(-log(sin(0.5*theta)/cos(0.5*theta)));
-
-  for(i=0;i<20;i++)
-    {
-      if(arrAmbiIdx[i]!=0) 
-	{
-	  arrAmbiLayers[i].clear();
-	}
-    }
-}
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/iHitFilter.h b/Trigger/TrigTools/IDScanHitFilter/src/iHitFilter.h
deleted file mode 100644
index 99b92cf2816b3fbc71001480844406b186be26d8..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/iHitFilter.h
+++ /dev/null
@@ -1,244 +0,0 @@
-// emacs: this is -*- c++ -*-
-
-/*
-  Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: HitFilter.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// 
-// Description: - main pattern recognition algorithm of IdScan 
-// 
-// date: 28/07/2003
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-
-#if ! defined( IDSCAN_IHITFILTER_H )
-#define IDSCAN_IHITFILTER_H
-
-#include <vector>
-
-#include "HF_Constants.h"
-
-#include "FilterBin.h"
-#include "Group.h"
-#include "IdScanSpPoint.h"
-
-struct groupCleanerParams;
-struct GCP_loose;
-struct GCP_tight;
-
-
-////////////////////////////////////////////////////////////////////////////////
-////    HitFilter
-////////////////////////////////////////////////////////////////////////////////
-
-class iHitFilter
-{
-public:
-  
-  iHitFilter() 
-    : m_fullScan(false), m_binMap(NULL), m_loose(NULL), m_tight(NULL), m_internalSPs(NULL), m_zVertex(0),
-      m_IdScan_MaxNumLayers(19), m_IdScan_MaxEta(3.0) { }
- 
-  ~iHitFilter();
-  
-  int initialise(long maxlayers, long maxBarrelLayer, double maxeta=3.0);
-
-  double  getLayerThreshold() const { return m_layerThreshold; }
-
-  void setLayerThresholdTmp(double d) { m_layerThresholdTmp = d; }
-
-protected:                      // member functions
-
-  //  GroupList execute( hitVec& );
-  GroupList execute();
-  
-  long makeHashKey( double phi, double eta ) const;
-  long makeHashKey( double* r,  double* f, 
-		    double k21, double rr1, 
-		    double fr1, groupCleanerParams* params) const;
-  void neighborKeys( long key, long* np ) const;
-
-  void clusterBins( GroupList& gList );
-  void joinGroup( long key, FilterBin& bin, GroupList::iterator giter, GroupList& glist );
-
-  void groupCleaner( GroupList::iterator& gItr, GroupList& cleangroups ) ;
-  void fillMapGC1( GroupList::iterator& inputItr, groupCleanerParams* params ) const;
-  void fillMapGC2( GroupList::iterator& inputItr, groupCleanerParams* params ) const;
-
-  double dzdr(double* r, double* z)  const;
-  double ktemp(double* r, double* f) const;
-  void fitGroup(Group&); 
-  void fitGroupWithoutHitRemoval(Group&);
-  
-  void cleanInternalSPs();
-
-  void  makeIDScanSPs( std::vector<const ExternalSpacePoint* >, double, double, double, double, double );
-
-protected:                      // data members
-  
-  // to be read in from jobOptions
-  
-  double m_ROIphiHalfWidth;
-  double m_ROIetaHalfWidth;
-
-  double m_useROIphiHalfWidth;
-
-  bool   m_fullScan;
-  long   m_maxPhiBins;
-  bool   m_HF;
-
-  double m_phiBinSize;
-  double m_etaBinSize;
-  double m_layerThreshold;    // This is the value that you set once.
-  double m_layerThresholdTmp; // This value is set for each RoI, depending on number of missing layers
-  bool   m_enhanceLayer0;
-  bool   m_cloneRemoval;
-  bool   m_usePtSign;
-  long   m_cloneRemovalCut;
-  double m_invPhiBinSize;
-  double m_invEtaBinSize;
-
-  double m_looseTight;
-  double m_pTcutInMeV;
-  double m_dPhidRCut;
-
-  double m_loose_deltadzdrCut;
-  double m_loose_etaCutInner;
-  double m_loose_etaCutOuter;
-  double m_loose_d0Cut;
-  double m_loose_dPhidRBinSize;
-  long   m_loose_phi0Bins;
-
-  double m_tight_deltadzdrCut;
-  double m_tight_etaCutInner;
-  double m_tight_etaCutOuter;
-  double m_tight_d0Cut;
-  double m_tight_dPhidRBinSize;
-  long   m_tight_phi0Bins;
-
-  FilterMap* m_binMap;
-
-  GCP_loose* m_loose;         // loose set of parameters for group cleaner (look at GC_Constants.h)
-  GCP_tight* m_tight;         // tight set of parameters for group cleaner
-
-  bool       m_printDiagnosticMessages;
-
-  hitVec*    m_internalSPs;
-
-  double     m_zVertex;  // roi z vertex 
-
-  long m_binCounter;
-
-  double m_maxBeamSpotShift;
-
-
-  /// locally set parameters for number of layers (and max eta ??)
-  long   m_IdScan_MaxNumLayers;
-  double m_IdScan_MaxEta;
-
-  long m_maxBarrelLayer = 6;
-};
-
-
-class TrackCandidateClass
-{
- public:
-  TrackCandidateClass(class Group*);
-  ~TrackCandidateClass(){};
-  Group* m_pGroup;
-  int m_nHitShift;
-  int m_nSharedHits;
-  int m_nSharedTotal;
-  double m_fom;
-  double m_pt;
-};
-
-class TrackFilterClass   
-{
- public:
-  void addNewTrackCandidate(class Group*);
-  void removeClones(int);
-  TrackFilterClass(bool);
-  ~TrackFilterClass();
- private:
-  std::vector<TrackCandidateClass*> m_vpTCC;
-  bool m_usePtSign;
-};
-
-
-inline long iHitFilter::makeHashKey( double phi, double eta ) const
-{
-//  makes the hash key for the (eta,phi) mapping in the hit filter...
-//
-  long etabin = (long) ( (eta+m_IdScan_MaxEta)*m_invEtaBinSize );
-  long phibin = (long) ( phi*m_invPhiBinSize); 
-
-  return (HashKeyCoeff*etabin + phibin);
-
-}
-
-
-inline void iHitFilter::neighborKeys( long key, long* np ) const
-{
-//   Finds the hash keys for the 8 neighbouring bins. Look at HitFilter::makeHashKey 
-//   to understand the decoding...
-//
-  long bin1 = key/HashKeyCoeff;  // eta bin for hitFilter, phi0 bin for groupCleaner
-  long bin2 = key%HashKeyCoeff;  // phi bin for hitFilter, dphi/drho bin for groupCleaner
-
-  long bin1m1 = bin1 - 1;
-  long bin1p1 = bin1 + 1;
-
-  long bin2m1 = bin2 - 1;
-  long bin2p1 = bin2 + 1;
-
-  if ( m_fullScan && m_HF ) {
-    if ( bin2m1 < 0 ) bin2m1 += m_maxPhiBins;
-    if ( bin2p1 > m_maxPhiBins-1) bin2p1 -= m_maxPhiBins;
-  }
-
-  np[0] = HashKeyCoeff*bin1m1 + bin2m1;
-  np[1] = HashKeyCoeff*bin1m1 + bin2;
-  np[2] = HashKeyCoeff*bin1m1 + bin2p1;
-  np[3] = HashKeyCoeff*bin1 + bin2m1;
-  np[4] = HashKeyCoeff*bin1 + bin2p1;
-  np[5] = HashKeyCoeff*bin1p1 + bin2m1;
-  np[6] = HashKeyCoeff*bin1p1 + bin2;
-  np[7] = HashKeyCoeff*bin1p1 + bin2p1;
-
-  /*
-  for (long i=-1; i<2; ++i) {
-    for (long j=-1; j<2; ++j) {
-      if ( i||j ) {
-	*np++ = HashKeyCoeff*(bin1+i) + (bin2+j);
-      }
-    }
-  }
-  */
-
-}
-
-
-inline double iHitFilter::dzdr(double* r, double* z) const
-{
-  return (z[1]-z[0])/(r[1]-r[0]);
-}
-
-
-inline double iHitFilter::ktemp(double* r, double* f) const
-{
-  return (f[1]*r[1]-f[0]*r[0])/(r[1]-r[0]);
-}
-
-
-#endif
diff --git a/Trigger/TrigTools/IDScanHitFilter/src/tIdScanSpPoint.h b/Trigger/TrigTools/IDScanHitFilter/src/tIdScanSpPoint.h
deleted file mode 100755
index be0a76c0735e2898a8e62820a4422697120a3eb0..0000000000000000000000000000000000000000
--- a/Trigger/TrigTools/IDScanHitFilter/src/tIdScanSpPoint.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
-*/
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// filename: IdScanSpPoint.h
-// 
-// author: Nikos Konstantinidis
-//         nk@hep.ucl.ac.uk
-//		 
-// 
-// Description: - Internal IdScan space point
-// 
-// date: 24/07/2003
-// 
-// -------------------------------
-// ATLAS Collaboration
-////////////////////////////////////////////////////////////////////////////////
-
-
-#if ! defined( IDSCAN_TIDSCANSPPOINT_H )
-#define IDSCAN_TIDSCANSPPOINT_H
-
-#include <iostream>
-
-
-template<class SpacePointClass> class tIdScanSpPoint
-{
- public:
-
-  tIdScanSpPoint( const SpacePointClass* spPtr, double eta ) :
-    m_commonSP(spPtr),
-    m_eta(eta)
-    { };
-
-  int index()      const { return m_index; } 
-  int index(int i)       { return m_index=i; }
-
-  const SpacePointClass* commonSP() const {  return m_commonSP; };
-
-  double phi()  const {  return m_commonSP->phi(); };
-  double rho()  const {  return m_commonSP->r();   };
-  double z()    const {  return m_commonSP->z();   };
-
-  double eta()        const {  return m_eta;        };
-  double rotatedPhi() const {  return m_rotatedPhi; };
-
-  long   layer()      const {  return m_commonSP->layer(); };
-
-  double dphi() const {  return m_commonSP->dphi(); };
-  double dr()   const {  return m_commonSP->dr();   };
-  double dz()   const {  return m_commonSP->dz();   };
-
-  int  used() const    { return m_used; };
-  void setUsed(int u)  { m_used=u; };
-
-  void setRotatedPhi(double phi) { m_rotatedPhi = phi; }
-
- private:
-  
-  const SpacePointClass* m_commonSP;
-
-  double   m_eta;
-  double   m_rotatedPhi;
-
-  int m_used;
-  int m_index;
-};
-
-
-template<class SpacePointClass>
-inline std::ostream& operator<<(std::ostream& s, 
-                                const tIdScanSpPoint<SpacePointClass>& sp) 
-{ 
-  return   s << "[ i="     << sp.index() 
-	     << "\tlyr="   << sp.layer() 
-	     << "\trho="   << sp.rho() 
-	     << "\tphi="   << sp.phi() 
-	     << "\tzed="   << sp.z() 
-	     << "\t( eta=" << sp.eta() << " )\t]";
-}
-
-
-
-template<class SpacePointClass> 
-struct torderInRho
-{
-//  this is a comparison function needed by std::sort to sort the hits of a list in increasing rho
-//
-  bool operator()(const SpacePointClass* sp1, const SpacePointClass* sp2) const
-  {
-    return ( sp1->rho() < sp2->rho() );
-  }
-};
-
-template<class SpacePointClass> 
-struct torderInLayer
-{
-  bool operator()(SpacePointClass* sp1, SpacePointClass* sp2) const
-  {
-    return ( sp1->layer() < sp2->layer() );
-  }
-};
-
-template<class SpacePointClass> 
-struct torderInIndex
-{
-  bool operator()(SpacePointClass* sp1, SpacePointClass* sp2) const
-  {
-    return ( sp1->index() < sp2->index() );
-  }
-};
-
-template<class SpacePointClass> 
-struct tequalIds
-{
-  bool operator()(SpacePointClass* sp1, SpacePointClass* sp2) const
-  {
-    return ( sp1->index() == sp2->index() );
-  }
-};
-
-
-#endif
-