Skip to content
Snippets Groups Projects
Forked from atlas / athena
93392 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ConfiguredSecondaryVertexCuts.py 21.11 KiB
# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration

from __future__ import print_function


########################################################################
# ConfiguredSecondaryVertexCuts class
#########################################################################
# Python Setup Class for finding V0s
#
#########################################################################

import AthenaCommon.SystemOfUnits as Units

class ConfiguredSecondaryVertexCuts :
   
  def __init__ (self, mode = "PileUp", minPt = 0.0):

    self.__mode      = mode
    self.__extension = ""
    self.__set_indetflags()    # pointer to InDetFlags, don't use them directly
 			       # to allow sharing this code with the trigger
    
    from AthenaCommon.GlobalFlags import globalflags
    from AthenaCommon.DetFlags import DetFlags
    from AthenaCommon.BeamFlags import jobproperties
    from RecExConfig.RecFlags import rec

    # ------------------------------------------------
    # --- secondary vertexing setup of cuts
    # ------------------------------------------------

    if mode == "PileUp" or mode == "StartUp":

      #InDetSecVxFitterTool
      self.__Fitter_IterationNumber            = 10
      self.__Fitter_MakeExtendedVertex         = False
      self.__Fitter_FirstMeasuredPoint         = True
      self.__Fitter_Robustness                 = 6
      self.__Fitter_InputParticleMasses        = [139.57018,139.57018]
      self.__Fitter_VertexForConstraint        = [0.,0.,0.]
      self.__Fitter_CovVrtForConstraint        = [0.015*0.015,0.,0.015*0.015,0.,0.,10000.*10000.]
      self.__Fitter_FirstMeasuredPointLimit    = False
      self.__Fitter_usePhiCnst                 = False
      self.__Fitter_useThetaCnst               = False

      # Track selector tool
      self.__TrkSel_maxSiD0                    = 80.0
      self.__TrkSel_maxTrtD0                   = 10000.
      self.__TrkSel_maxSiZ0                    = 10000.
      self.__TrkSel_maxTrtZ0                   = 10000.
      self.__TrkSel_minPt                      = minPt
      self.__TrkSel_RatioCut1                  = 0.0
      self.__TrkSel_RatioCut2                  = 0.0
      self.__TrkSel_RatioCut3                  = 0.0
      self.__TrkSel_RatioTRT                   = 0.0
      self.__TrkSel_IsConversion               = False
      self.__TrkSel_significanceD0_Si          = 2.   
      self.__TrkSel_RatioV0                    = 0.95  
      
      # Track pairs selector
      self.__TrkPairSel_MaxFirstHitRadius      = 510.
      self.__TrkPairSel_MaxDistBetweenTracks   = [4.,90.,30.] 
      self.__TrkPairSel_MaxEta                 = [1.2,0.9,0.4]
      self.__TrkPairSel_MaxInitDistance        = [100000.,640.,80.]
      self.__TrkPairSel_MinTrackAngle          = 0.6  
      
      # Vertex point estimator
      self.__VtxPt_MinDeltaR                   = [-10000.,-10000.,-10000.]
      self.__VtxPt_MaxDeltaR                   = [10000.,10000.,10000.]
      self.__VtxPt_MaxPhi                      = [10000., 10000., 10000.]
      
      # Secondary Vertex post selector
      self.__SecVtxPost_MaxChi2Vtx             = [15.,50.,25.]
      self.__SecVtxPost_MaxInvariantMass       = [10000.,50.,25.]
      self.__SecVtxPost_MinFitMomentum         = [1100.,2000.,2000.]
      self.__SecVtxPost_MinRadius              = [0.,35.,350.] 
      self.__SecVtxPost_MinPt                  = 0.0       # off
      self.__SecVtxPost_MaxdR                  = -10000.   # off
      self.__SecVtxPost_MaxPhiVtxTrk           = 10000.
    
      # Single track secondary vertex tool
      self.__SingleTrk_MaxBLayerHits              = 0
      self.__SingleTrk_MinInitialHitRadius        = 0.0
      self.__SingleTrk_MinInitialHitRadius_noBlay = 0.0
      self.__SingleTrk_MinRatioOfHLhits           = 0.0
    
      #  InDetSecVtxFinderTool 
      self.__Finder_RemoveTrtTracks            = True
      self.__Finder_IsConversion               = False
      self.__Finder_MinDistVtxHit              = -200.
      self.__Finder_MaxDistVtxHit              = 50.
      self.__Finder_MinFlightAngle             = -0.5
      self.__Finder_MinInitVtxR                = 5.
    
      if mode == "StartUp": #Loose selection for 900GeV (minbias) collisions
        # Track selector tool
        self.__TrkSel_maxSiD0                  = 10000.
        self.__TrkSel_significanceD0_Si        = 3.
        self.__TrkSel_RatioV0                  = 1.
        
        # Track pairs selector
        self.__TrkPairSel_MaxDistBetweenTracks = [10.,10.,10.]
        self.__TrkPairSel_MaxEta               = [4.,4.,4.] 
        self.__TrkPairSel_MinTrackAngle        = -10000.
        
        # Secondary Vertex post selector
        self.__SecVtxPost_MinFitMomentum       = [0.,0.,0.]
        self.__SecVtxPost_MinRadius            = [5.,5.,5.]
        
        #  InDetSecVtxFinderTool 
        self.__Finder_MinDistVtxHit            = -10000.
        self.__Finder_MaxDistVtxHit            = 10000.
        self.__Finder_MinInitVtxR              = 0.
      pass
      
    elif mode == "ConversionStartUp" or mode == "ConversionPileUp" or mode == "EGammaStartUp" or mode == "EGammaPileUp" :

      #InDetSecVxFitterTool
      self.__Fitter_IterationNumber            = 30    # huge number of iterations ?
      self.__Fitter_MakeExtendedVertex         = True
      self.__Fitter_FirstMeasuredPoint         = True
      self.__Fitter_Robustness                 = 6
      self.__Fitter_InputParticleMasses        = [0.511,0.511]
      self.__Fitter_VertexForConstraint        = [0.,0.,0.]
      self.__Fitter_CovVrtForConstraint        = [0.015*0.015,0.,0.015*0.015,0.,0.,10000.*10000.]
      self.__Fitter_FirstMeasuredPointLimit    = True
      self.__Fitter_usePhiCnst                 = True
      self.__Fitter_useThetaCnst               = True            
    
      # Track selector tool
      self.__TrkSel_maxSiD0                    = 10000. # off ?
      self.__TrkSel_maxTrtD0                   = 10000. # off ?
      self.__TrkSel_maxSiZ0                    = 10000. # off ?
      self.__TrkSel_maxTrtZ0                   = 10000. # off ?
      self.__TrkSel_minPt                      = minPt
      self.__TrkSel_RatioCut1                  = 0.0    # e-prob: Ntrt < 15
      self.__TrkSel_RatioCut2                  = 0.0    # e-prob: 15 < Ntrt < 25  
      self.__TrkSel_RatioCut3                  = 0.0    # e-prob: Ntrt > 25 
      self.__TrkSel_RatioTRT                   = 0.0    # e-prob cut for TRT only
      self.__TrkSel_IsConversion               = True
      self.__TrkSel_significanceD0_Si          = -1.    # V0 only cuts
      self.__TrkSel_RatioV0                    = -1.    # V0 only cuts
      
      # Track pairs selector
      self.__TrkPairSel_MaxFirstHitRadius      = 500.                         # hacky way to determine if TRT only of SI
      self.__TrkPairSel_MaxDistBetweenTracks   = [10.,50.,50.]                # minimum distance cut at vertex
      self.__TrkPairSel_MaxEta                 = [0.3,0.5,0.5]                # delta cotan(theta) cuts, no cut in barrel for TRT only in code
      self.__TrkPairSel_MaxInitDistance        = [10000.0, 10000.0, 10000.0]  # off
      self.__TrkPairSel_MinTrackAngle          = 0.0                          # off, V0 cut
      
      # Vertex point estimator
      self.__VtxPt_MinDeltaR                   = [-5.,-25.,-50.]              # D-R1-R2 min cut
      self.__VtxPt_MaxDeltaR                   = [5.,10.,10.]                 # D-R1-R2 max cut
      self.__VtxPt_MaxPhi                      = [0.05, 0.5, 0.5]             # dphi cut at vertex
      
      # Secondary Vertex post selector
      self.__SecVtxPost_MaxChi2Vtx             = [50.,50.,50.]                  # was [40.,100.,80.]
      self.__SecVtxPost_MaxInvariantMass       = [10000.,10000.,10000.]         # off, was [60.,60.,30.]
      self.__SecVtxPost_MinFitMomentum         = [0.,0.,0.]                     # off, was [2000.,2000.,2000.]
      self.__SecVtxPost_MinRadius              = [-10000.0, -10000.0, -10000.0] # off
      self.__SecVtxPost_MinPt                  = 0.                             # off
      self.__SecVtxPost_MaxdR                  = -10000.                        # off, -250.
      self.__SecVtxPost_MaxPhiVtxTrk           = 10000.                         # off, was 0.2
    
      # Single track secondary vertex tool
      self.__SingleTrk_MaxBLayerHits              = 0
      self.__SingleTrk_MinInitialHitRadius        = 70.
      self.__SingleTrk_MinInitialHitRadius_noBlay = 70.
      self.__SingleTrk_MinRatioOfHLhits           = 0.95
    
      #  InDetSecVtxFinderTool 
      self.__Finder_RemoveTrtTracks            = False
      self.__Finder_IsConversion               = True
      self.__Finder_MinDistVtxHit              = -350.0     # off
      self.__Finder_MaxDistVtxHit              = 250.0      # off
      self.__Finder_MinFlightAngle             = 0.0        # off
      self.__Finder_MinInitVtxR                = 0.0        # off

      if mode == "ConversionPileUp" or mode == "EGammaPileUp":
        # ------------------------------------
        # --- cut tuning for 21.X
        # ------------------------------------

        # Track selector tool
        self.__TrkSel_minPt                      = minPt
        self.__TrkSel_RatioCut1                  = 0.0    # UNCHANGED, e-prob: Ntrt < 15
        self.__TrkSel_RatioCut2                  = 0.1    # UNCHANGED, e-prob: 15 < Ntrt < 25  
        self.__TrkSel_RatioCut3                  = 0.1    # UNCHANGED, e-prob: Ntrt > 25
        self.__TrkSel_RatioTRT                   = 0.75   # new e-prob cut for TRT-TRT only conversion
        
        # Track pairs selector
        self.__TrkPairSel_MaxDistBetweenTracks   = [10.*Units.mm,50.*Units.mm,50.*Units.mm]       # UNCHANGED, minimum distance cut at vertex (Mauro 10,100,50)
        self.__TrkPairSel_MaxEta                 = [0.3,0.5,0.5]                                  # UNCHANGED, is delta cotan(theta) cuts, no cut in barrel for TRT only in code
        # ----> replace this with a d(eta) cut by Bruno ?
        # ----> we need a dphi cut at perigee 

        # Vertex point estimator
        self.__VtxPt_MinDeltaR                   = [-5.*Units.mm,-25.*Units.mm,-50.*Units.mm]     # UNCHANGED, D-R1-R2 min cut
        self.__VtxPt_MaxDeltaR                   = [ 5.*Units.mm, 10.*Units.mm, 10.*Units.mm]     # UNCHANGED, D-R1-R2 max cut
        self.__VtxPt_MaxPhi                      = [0.05, 0.2, 0.2]                               # dphi cut at vertex tune for SI+TRT, TRT+TRT
      
        # Secondary Vertex post selector
        self.__SecVtxPost_MaxChi2Vtx             = [50.,50.,50.]                               # UNCHANGED, (Mauro 80,50,50)
        self.__SecVtxPost_MaxInvariantMass       = [10000.,10000.,10000.]                      # UNCHANGED, off
        self.__SecVtxPost_MinFitMomentum         = [0.,0.,0.]                                  # UNCHANGED, off
        self.__SecVtxPost_MinRadius              = [20.*Units.mm,70.*Units.mm,250.*Units.mm]   # new vertex R cuts to remove backgrounds
        self.__SecVtxPost_MinPt                  = 0.                                          # UNCHANGED, off
        self.__SecVtxPost_MaxdR                  = -250.*Units.mm                              # remove vertices way behind last hit, should not cut much
        self.__SecVtxPost_MaxPhiVtxTrk           = 0.2                                         # back to Mauro's cut
    
        # Single track secondary vertex tool
        self.__SingleTrk_MaxBLayerHits              = 0                # UNCHANGED, no blayer hits on single track conversion
        self.__SingleTrk_MinInitialHitRadius        =  70.*Units.mm    # UNCHANGED, start conversion in layer 1
        self.__SingleTrk_MinInitialHitRadius_noBlay = 120.*Units.mm    # but allow for conversion tracks starting in layer 2 if blayer is dead        
        self.__SingleTrk_MinRatioOfHLhits           = 0.85             # e-prob cut single-TRT converison 

    else:
      print("*********************** ERROR, wrong configuration for Configured Secondary Vertex Cuts !!!")
      print(" mode given : ", mode)
      
# ----------------------------------------------------------------------------
# --- private method
  def __set_indetflags(self):
    from InDetRecExample.InDetJobProperties import InDetFlags
    self.__indetflags = InDetFlags

# ----------------------------------------------------------------------------
# --- return methods for the cut values - the main purpose of this class
# ----------------------------------------------------------------------------

  def mode( self ) :
    return self.__mode

  def extension( self ) :
    return self.__extension

  def Fitter_IterationNumber( self ) :
    return self.__Fitter_IterationNumber

  def Fitter_MakeExtendedVertex( self ) :
    return self.__Fitter_MakeExtendedVertex

  def Fitter_FirstMeasuredPoint( self ) :
    return self.__Fitter_FirstMeasuredPoint

  def Fitter_Robustness( self ) :
    return self.__Fitter_Robustness

  def Fitter_InputParticleMasses( self ) :
    return self.__Fitter_InputParticleMasses

  def Fitter_VertexForConstraint( self ) :
    return self.__Fitter_VertexForConstraint

  def Fitter_CovVrtForConstraint( self ) :
    return self.__Fitter_CovVrtForConstraint

  def FirstMeasuredPointLimit( self ) :
    return self.__Fitter_FirstMeasuredPointLimit

  def usePhiCnst( self ) :
    return self.__Fitter_usePhiCnst

  def useThetaCnst( self ) :
    return self.__Fitter_useThetaCnst

  def TrkSel_maxSiD0( self ) :
    return self.__TrkSel_maxSiD0

  def TrkSel_maxTrtD0( self ) :
    return self.__TrkSel_maxTrtD0

  def TrkSel_maxSiZ0( self ) :
    return self.__TrkSel_maxSiZ0

  def TrkSel_maxTrtZ0( self ) :
    return self.__TrkSel_maxTrtZ0

  def TrkSel_minPt( self ) :
    return self.__TrkSel_minPt

  def TrkSel_RatioCut1 ( self ) :
    return self.__TrkSel_RatioCut1 

  def TrkSel_RatioCut2( self ) :
    return self.__TrkSel_RatioCut2

  def TrkSel_RatioCut3( self ) :
    return self.__TrkSel_RatioCut3

  def TrkSel_RatioTRT( self ) :
    return self.__TrkSel_RatioTRT

  def TrkSel_IsConversion( self ) :
    return self.__TrkSel_IsConversion

  def TrkSel_significanceD0_Si( self ) :
    return self.__TrkSel_significanceD0_Si

  def TrkSel_RatioV0( self ) :
    return self.__TrkSel_RatioV0

  def TrkPairSel_MaxFirstHitRadius( self ) :
    return self.__TrkPairSel_MaxFirstHitRadius

  def TrkPairSel_MaxDistBetweenTracks( self ) :
    return self.__TrkPairSel_MaxDistBetweenTracks

  def TrkPairSel_MaxEta( self ) :
    return self.__TrkPairSel_MaxEta

  def TrkPairSel_MaxInitDistance( self ) :
    return self.__TrkPairSel_MaxInitDistance

  def TrkPairSel_MinTrackAngle( self ) :
    return self.__TrkPairSel_MinTrackAngle

  def VtxPt_MinDeltaR( self ) :
    return self.__VtxPt_MinDeltaR

  def VtxPt_MaxDeltaR( self ) :
    return self.__VtxPt_MaxDeltaR

  def VtxPt_MaxPhi( self ) :
    return self.__VtxPt_MaxPhi

  def SecVtxPost_MaxChi2Vtx( self ) :
    return self.__SecVtxPost_MaxChi2Vtx

  def SecVtxPost_MaxInvariantMass( self ) :
    return self.__SecVtxPost_MaxInvariantMass

  def SecVtxPost_MinFitMomentum( self ) :
    return self.__SecVtxPost_MinFitMomentum

  def SecVtxPost_MinPt( self ) : 
    return self.__SecVtxPost_MinPt
  
  def SecVtxPost_MinRadius( self ) :
    return self.__SecVtxPost_MinRadius

  def SecVtxPost_MaxdR( self ) :
    return self.__SecVtxPost_MaxdR

  def SecVtxPost_MaxPhiVtxTrk( self ) :
    return self.__SecVtxPost_MaxPhiVtxTrk

  def SingleTrk_MaxBLayerHits( self ) :
    return self.__SingleTrk_MaxBLayerHits

  def SingleTrk_MinInitialHitRadius( self ) :
    return self.__SingleTrk_MinInitialHitRadius

  def SingleTrk_MinInitialHitRadius_noBlay( self ) :
    return self.__SingleTrk_MinInitialHitRadius_noBlay

  def SingleTrk_MinRatioOfHLhits( self ) :
    return self.__SingleTrk_MinRatioOfHLhits

  def Finder_RemoveTrtTracks( self ) :
    return self.__Finder_RemoveTrtTracks

  def Finder_IsConversion( self ) :
    return self.__Finder_IsConversion

  def Finder_MinDistVtxHit( self ) :
    return self.__Finder_MinDistVtxHit

  def Finder_MaxDistVtxHit( self ) :
    return self.__Finder_MaxDistVtxHit

  def Finder_MinFlightAngle( self ) :
    return self.__Finder_MinFlightAngle

  def Finder_MinInitVtxR( self ) :
    return self.__Finder_MinInitVtxR

  def printInfo( self ) :
    print('****** Inner Detector Secondary Vertex Reconstruction Cuts ****************************')
    print('*')
    print('* secondary vertex mode               : ',self.__mode )
    print('*')
    print('* Vertex Fitter settings')
    print('* - Iteration Number                  : ',self.__Fitter_IterationNumber )
    print('* - Make Extended Vertex              : ',self.__Fitter_MakeExtendedVertex  )
    print('* - First Measured Point              : ',self.__Fitter_FirstMeasuredPoint  )
    print('* - Robustness                        : ',self.__Fitter_Robustness          )
    print('* - Input Particle Masses             : ',self.__Fitter_InputParticleMasses )
    print('* - Vertex for constraint             : ',self.__Fitter_VertexForConstraint )
    print('* - Cov for constraint                : ',self.__Fitter_CovVrtForConstraint )
    print('* - First measured point limit        : ',self.__Fitter_FirstMeasuredPointLimit)
    print('* - use Phi constraint                : ',self.__Fitter_usePhiCnst)
    print('* - use Theta constraint              : ',self.__Fitter_useThetaCnst)
    print('*'    )
    print('* cuts for Track selector tool')
    print('* - Track max Si  d0                  : ',self.__TrkSel_maxSiD0           )
    print('* - Track max TRT d0                  : ',self.__TrkSel_maxTrtD0          )
    print('* - Track max Si  Z0                  : ',self.__TrkSel_maxSiZ0           )
    print('* - Track max TRT Z0                  : ',self.__TrkSel_maxTrtZ0          )
    print('* - Track min pt                      : ',self.__TrkSel_minPt )
    print('* - Track Ratio Cut1                  : ',self.__TrkSel_RatioCut1         )
    print('* - Track Ratio Cut2                  : ',self.__TrkSel_RatioCut2         )
    print('* - Track Ratio Cut3                  : ',self.__TrkSel_RatioCut3         )
    print('* - Track Ratio TRT                   : ',self.__TrkSel_RatioTRT)
    print('* - Track IsConverion                 : ',self.__TrkSel_IsConversion      )
    print('* - track Si sig d0                   : ',self.__TrkSel_significanceD0_Si )
    print('* - Track Ratio V0                    : ',self.__TrkSel_RatioV0           )
    print('*'    )
    print('* Track pairs selector [SI+SI,SI+TRT,TRT+TRT]')
    print('* - Track Pair Max First Hit Radius   : ',self.__TrkPairSel_MaxFirstHitRadius    )
    print('* - Track Pair Max Dist btw Tracks    : ',self.__TrkPairSel_MaxDistBetweenTracks )
    print('* - Track Pair Max Eta                : ',self.__TrkPairSel_MaxEta               )
    print('* - Track Pair Max Init Distance      : ',self.__TrkPairSel_MaxInitDistance      )
    print('* - Track Pair Min Track Angle        : ',self.__TrkPairSel_MinTrackAngle        )
    print('*')
    print('* Vertex point estimator')
    print('* - Vertex Point Min Delta R          : ',self.__VtxPt_MinDeltaR)
    print('* - Vertex Point Max Delta R          : ',self.__VtxPt_MaxDeltaR)
    print('* - Vertex Point Max Phi              : ',self.__VtxPt_MaxPhi   )
    print('*')
    print('* Secondary Vertex post selector')
    print('* - SVPostSel Max Chi2 Vtx            : ',self.__SecVtxPost_MaxChi2Vtx      )
    print('* - SVPostSel Max Inv Mass            : ',self.__SecVtxPost_MaxInvariantMass)
    print('* - SVPostSel Max Min Fit P           : ',self.__SecVtxPost_MinFitMomentum)
    print('* - SVPostSel Min Pt                  : ',self.__SecVtxPost_MinPt)
    print('* - SVPostSel Min Radius              : ',self.__SecVtxPost_MinRadius       )
    print('* - SVPostSel Max dR                  : ',self.__SecVtxPost_MaxdR)
    print('* - SVPostSel Max Phi Vtx             : ',self.__SecVtxPost_MaxPhiVtxTrk    )
    print('*')
    print('* Single track secondary vertex tool')
    print('* - Max Blayer hits for conversions   : ',self.__SingleTrk_MaxBLayerHits  )
    print('* - Single tr. Min Initial Hit Radius : ',self.__SingleTrk_MinInitialHitRadius)
    print('*     - same for no blayer            : ',self.__SingleTrk_MinInitialHitRadius_noBlay)
    print('* - Single tr. Min Ratio HL hits      : ',self.__SingleTrk_MinRatioOfHLhits   )
    print('*')
    print('* InDetSecVtxFinderTool ')
    print('* - Finder Remove TRT Tracks          : ',self.__Finder_RemoveTrtTracks   )
    print('* - Finder IsConversions              : ',self.__Finder_IsConversion      )
    print('* - Finder Min Dist Vtx Hit           : ',self.__Finder_MinDistVtxHit     )
    print('* - Finder Max Dist Vtx Hit           : ',self.__Finder_MaxDistVtxHit     )
    print('* - Finder Min Flight Angle           : ',self.__Finder_MinFlightAngle    )
    print('* - Finder Min Init Vtx R             : ',self.__Finder_MinInitVtxR       )
    print('*')
    print('************************ General Configuration *************************************')
    if self.__mode == "StartUp":
      print('No luminosity mode: single collision, loosen cuts to get as many V0 as possible')

    if self.__mode == "PileUp":
      print('Pile Up luminosity mode: multiple collisions')

    print('************************************************************************************')