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

from AthenaCommon import CfgMgr,CfgGetter
import AthenaCommon.SystemOfUnits as Units
from InDetRecExample.TrackingCommon import setDefaults

def setTool(prop,tool_name,kwargs) :
    if tool_name is None :
        kwargs.setdefault(prop, tool_name )
        return

    if prop not in kwargs :
        from AthenaCommon import CfgGetter
        if isinstance(tool_name, list) :
            tools=[]
            for a_tool_name in tool_name :
                tools.append( CfgGetter.getPublicTool(a_tool_name) )
            kwargs.setdefault(prop,tools)
        else:
            kwargs.setdefault(prop, CfgGetter.getPublicTool(tool_name) )

def KalmanCompetingPixelClustersTool(name='KalmanCompetingPixelClustersTool',**kwargs):
    kwargs.setdefault('WeightCutValueBarrel',5.5)
    kwargs.setdefault('WeightCutValueEndCap',5.5)
    from InDetCompetingRIOsOnTrackTool.InDetCompetingRIOsOnTrackToolConf import InDet__CompetingPixelClustersOnTrackTool
    return InDet__CompetingPixelClustersOnTrackTool(name, **kwargs)

def KalmanCompetingSCT_ClustersTool(name='KalmanCompetingSCT_ClustersTool',**kwargs) :
    from InDetCompetingRIOsOnTrackTool.InDetCompetingRIOsOnTrackToolConf import InDet__CompetingSCT_ClustersOnTrackTool
    kwargs.setdefault('WeightCutValueBarrel',5.5)
    kwargs.setdefault('WeightCutValueEndCap',5.5)
    return InDet__CompetingSCT_ClustersOnTrackTool(name,**kwargs)

def KalmanCompetingRIOsTool(name='KalmanCompetingRIOsTool',**kwargs) :
    from TrkCompetingRIOsOnTrackTool.TrkCompetingRIOsOnTrackToolConf import Trk__CompetingRIOsOnTrackTool
    setTool('ToolForCompPixelClusters','KalmanCompetingPixelClustersTool', kwargs )
    setTool('ToolForCompSCT_Clusters', 'KalmanCompetingSCT_ClustersTool', kwargs )
    return Trk__CompetingRIOsOnTrackTool(name,**kwargs)

def InDetDNAdjustor(name='InDetDNAdjustor',**kwargs) :
    from TrkDynamicNoiseAdjustor.TrkDynamicNoiseAdjustorConf import Trk__InDetDynamicNoiseAdjustment
    return Trk__InDetDynamicNoiseAdjustment(name,**kwargs)

def InDetDNASeparator(name='InDetDNASeparator',**kwargs) :
    from InDetDNASeparator.InDetDNASeparatorConf import InDet__InDetDNASeparator
    return InDet__InDetDNASeparator(name,**kwargs)

def InDetAnnealFKFRef(name='InDetAnnealFKFRef',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__ForwardRefTrackKalmanFitter
    return Trk__ForwardRefTrackKalmanFitter(name,**kwargs)

def InDetFKFRef(name='InDetFKFRef',**kwargs) :
    kwargs.setdefault('StateChi2PerNDFPreCut',30.0)
    return InDetAnnealFKF(name,**kwargs)

def InDetAnnealFKF(name='InDetAnnealFKF',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__ForwardKalmanFitter
    return Trk__ForwardKalmanFitter(name,**kwargs)

def InDetFKF(name='InDetFKF',**kwargs) :
    kwargs.setdefault('StateChi2PerNDFPreCut',30.0)
    return InDetAnnealFKF(name,**kwargs)

def InDetBKS(name='InDetBKS',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanSmoother
    kwargs.setdefault('InitialCovarianceSeedFactor',200.)

    return Trk__KalmanSmoother(name,**kwargs)

def InDetAnnealBKS(name='InDetAnnealBKS',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanSmoother
    kwargs.setdefault('InitialCovarianceSeedFactor',200.)

    return Trk__KalmanSmoother(name,**kwargs)

def KalmanInternalDAF(name='KalmanInternalDAF',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanPiecewiseAnnealingFilter
    setTool('CompetingRIOsOnTrackCreator', 'KalmanCompetingRIOsTool',kwargs)
    setTool('BackwardSmoother', 'InDetAnnealBKS',kwargs)
    return Trk__KalmanPiecewiseAnnealingFilter(name,**kwargs)

def KalmanInternalDAFRef(name='KalmanInternalDAFRef',**kwargs) :
    setTool('ForwardFitter','InDetAnnealFKF',kwargs)
    setTool('BackwardSmoother','InDetBKS',kwargs)  # same tuning so far
    return KalmanInternalDAF(name,**kwargs)


def KOL_RecoveryID(name='KOL_RecoveryID',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanOutlierRecovery_InDet
    return Trk__KalmanOutlierRecovery_InDet(name,**kwargs)

def InDetKOL(name='InDetKOL',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanOutlierLogic
    kwargs.setdefault('TrackChi2PerNDFCut', 17.0)
    kwargs.setdefault('StateChi2PerNDFCut', 12.5)
    return Trk__KalmanOutlierLogic(name,**kwargs)

# def KalmanInternalDAFBase(name='KalmanInternalDAFBase',**kwargs) :
#     from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanPiecewiseAnnealingFilter
#    setTool('CompetingRIOsOnTrackCreator','KalmanCompetingRIOsTool',kwargs )
#    setTool('BackwardSmoother','InDetBKS',kwargs )
#    return Trk__KalmanPiecewiseAnnealingFilter(name,**kwargs)

def InDetMeasRecalibST(name='InDetMeasRecalibST',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__MeasRecalibSteeringTool

    split_cluster_map_extension = kwargs.pop('SplitClusterMapExtension','')

    from InDetRecExample import TrackingCommon as TrackingCommon
    if 'BroadPixelClusterOnTrackTool' not in kwargs :
        kwargs = setDefaults(kwargs,
                             BroadPixelClusterOnTrackTool = TrackingCommon.getInDetBroadPixelClusterOnTrackTool(nameSuffix               = split_cluster_map_extension,
                                                                                                 SplitClusterMapExtension = split_cluster_map_extension))
    if 'BroadSCT_ClusterOnTrackTool' not in kwargs :
        kwargs = setDefaults(kwargs,
                             BroadSCT_ClusterOnTrackTool  = TrackingCommon.getInDetBroadSCT_ClusterOnTrackTool())

    if 'CommonRotCreator' not in kwargs :
        kwargs=setDefaults(kwargs,
                           CommonRotCreator = TrackingCommon.getInDetRefitRotCreator(
                                              SplitClusterMapExtension = split_cluster_map_extension))

    return Trk__MeasRecalibSteeringTool(name,**kwargs)

def InDetKalmanTrackFitterBase(name='InDetKalmanTrackFitterBase',**kwargs) :
    from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanFitter
    from AthenaCommon.AppMgr import ToolSvc
    split_cluster_map_extension = kwargs.get('SplitClusterMapExtension','')

    kwargs.setdefault('ExtrapolatorHandle', TrackingCommon.getInDetExtrapolator())
    if 'RIO_OnTrackCreatorHandle' not in kwargs :
        from InDetRecExample import TrackingCommon as TrackingCommon
        kwargs=setDefaults(kwargs,
                           RIO_OnTrackCreatorHandle = TrackingCommon.getInDetRefitRotCreator(
                               SplitClusterMapExtension = split_cluster_map_extension))

    kwargs.setdefault('MeasurementUpdatorHandle', ToolSvc.InDetUpdator)
    setTool('KalmanSmootherHandle', 'InDetBKS', kwargs )
    setTool('KalmanOutlierLogicHandle', 'InDetKOL',kwargs )
    kwargs.setdefault('DynamicNoiseAdjustorHandle', None)
    kwargs.setdefault('BrempointAnalyserHandle', None)
    kwargs.setdefault('AlignableSurfaceProviderHandle',None)
    if len(split_cluster_map_extension)>0 :
        if 'RecalibratorHandle' not in kwargs :
            the_tool_name = 'InDetMeasRecalibST'
            kwargs.setdefault('RecalibratorHandle', CfgGetter.getPublicToolClone(the_tool_name+split_cluster_map_extension,the_tool_name, SplitClusterMapExtension = split_cluster_map_extension) )
    else :
        setTool('RecalibratorHandle', 'InDetMeasRecalibST', kwargs )
    # setTool('InternalDAFHandle','KalmanInternalDAF',kwargs )
    # from InDetRecExample.InDetJobProperties import InDetFlags
    # kwargs.setdefault('DoDNAForElectronsOnly', True if InDetFlags.doBremRecovery() and InDetFlags.trackFitterType() is 'KalmanFitter' else False)
    return Trk__KalmanFitter(name,**kwargs)

# def InDetKalmanDNATrackFitter(name='InDetKalmanDNATrackFitter',**kwargs) :
#        from TrkKalmanFitter.TrkKalmanFitterConf import Trk__KalmanFitter as ConfiguredKalmanFitter
#        setTool('ForwardKalmanFitterHandle','InDetFKF', kwargs )
#        setTool('DynamicNoiseAdjustorHandle','InDetDNAdjustor',kwargs)
#        setTool('BrempointAnalyserHandle','InDetDNASeparator',kwargs)
#        return InDetKalmanTrackFitterBase(name,**kwargs)

#def InDetKalmanTrackFitter(name='InDetKalmanTrackFitter',**kwargs) :
#    setTool('ForwardKalmanFitterHandle','InDetFKF', kwargs )
#    setTool('InternalDAFHandle','KalmanInternalDAF',kwargs )
#    return InDetKalmanTrackFitterBase(name,**kwargs)

def KalmanFitter(name='KalmanFitter',**kwargs) :
    setTool('ForwardKalmanFitterHandle','InDetFKF', kwargs )    
    from InDetRecExample.InDetJobProperties import InDetFlags
    setTool('DynamicNoiseAdjustorHandle', 'InDetDNAdjustor' if InDetFlags.doBremRecovery() else None,kwargs)
    setTool('BrempointAnalyserHandle', 'InDetDNASeparator' if InDetFlags.doBremRecovery() else None,kwargs)
    setTool('InternalDAFHandle','KalmanInternalDAF',kwargs )
    if InDetFlags.doBremRecovery() :
        kwargs.setdefault('DoDNAForElectronsOnly',True)
    return InDetKalmanTrackFitterBase(name,**kwargs)

def ReferenceKalmanFitter(name='ReferenceKalmanFitter',**kwargs) :
    setTool('ForwardKalmanFitterHandle','InDetFKFRef', kwargs )
    setTool('InternalDAFHandle','KalmanInternalDAFRef',kwargs )
    return InDetKalmanTrackFitterBase(name,**kwargs)

def KalmanDNAFitter(name='KalmanDNAFitter',**kwargs) :
    setTool('ForwardKalmanFitterHandle','InDetFKF', kwargs )
    setTool('DynamicNoiseAdjustorHandle', 'InDetDNAdjustor',kwargs )
    setTool('BrempointAnalyserHandle', 'InDetDNASeparator', kwargs )
    setTool('InternalDAFHandle','KalmanInternalDAF',kwargs )
    return InDetKalmanTrackFitterBase(name,**kwargs)

def DistributedKalmanFilter(name="DistributedKalmanFilter", **kwargs) :
    split_cluster_map_extension = kwargs.pop('SplitClusterMapExtension','')

    from InDetRecExample.TrackingCommon          import setDefaults
    if 'ExtrapolatorTool' not in kwargs :
        kwargs = setDefaults(kwargs, ExtrapolatorTool = TrackingCommon.getInDetExtrapolator())

    from InDetRecExample import TrackingCommon as TrackingCommon
    if 'ROTcreator' not in kwargs :
        kwargs=setDefaults(kwargs,
                           ROTcreator = TrackingCommon.getInDetRotCreator(
                               nameSuffix               = split_cluster_map_extension,
                               SplitClusterMapExtension = split_cluster_map_extension))

    # @TODO set sortingReferencePoint = ???
    from TrkDistributedKalmanFilter.TrkDistributedKalmanFilterConf import Trk__DistributedKalmanFilter
    return Trk__DistributedKalmanFilter(name = name, **kwargs)


def InDetGlobalChi2FitterBase(name='GlobalChi2FitterBase', **kwargs) :
    from TrkDetDescrSvc.AtlasTrackingGeometrySvc import AtlasTrackingGeometrySvc
    from InDetRecExample.TrackingCommon          import setDefaults
    from AthenaCommon.AppMgr                     import ToolSvc
    from InDetRecExample.InDetJobProperties      import InDetFlags
    import InDetRecExample.TrackingCommon as TrackingCommon

    kwargs=setDefaults(kwargs,
                       ExtrapolationTool      = TrackingCommon.getInDetExtrapolator(),
                       NavigatorTool          = TrackingCommon.getInDetNavigator(),
                       PropagatorTool         = TrackingCommon.getInDetPropagator(),
                       MultipleScatteringTool = TrackingCommon.getInDetMultipleScatteringUpdator(),
                       MeasurementUpdateTool  = ToolSvc.InDetUpdator,
                       TrackingGeometrySvc    = AtlasTrackingGeometrySvc,
                       MaterialUpdateTool     = TrackingCommon.getInDetMaterialEffectsUpdator(),
                       StraightLine           = not InDetFlags.solenoidOn(),
                       OutlierCut             = 4,
                       SignedDriftRadius      = True,
                       ReintegrateOutliers    = True,
                       RecalibrateSilicon     = True,
                       RecalibrateTRT         = True,
                       TRTTubeHitCut          = TrackingCommon.default_ScaleHitUncertainty,
                       MaxIterations          = 40,
                       Acceleration           = True,
                       RecalculateDerivatives = InDetFlags.doMinBias() or InDetFlags.doCosmics() or InDetFlags.doBeamHalo(),
                       TRTExtensionCuts       = True,
                       TrackChi2PerNDFCut     = 7)
    from TrkGlobalChi2Fitter.TrkGlobalChi2FitterConf import Trk__GlobalChi2Fitter
    return Trk__GlobalChi2Fitter(name, **kwargs)

def InDetGlobalChi2Fitter(name='InDetGlobalChi2Fitter', **kwargs) :
    split_cluster_map_extension = kwargs.pop('SplitClusterMapExtension','')

    from InDetRecExample import TrackingCommon as TrackingCommon
    if 'RotCreatorTool' not in kwargs :
        kwargs=setDefaults(kwargs,
                           RotCreatorTool        = TrackingCommon.getInDetRotCreator(
                               nameSuffix               = split_cluster_map_extension,
                               SplitClusterMapExtension = split_cluster_map_extension))

    from InDetRecExample.InDetJobProperties import InDetFlags
    use_broad_cluster_any = InDetFlags.useBroadClusterErrors() and (not InDetFlags.doDBMstandalone())
    if 'BroadRotCreatorTool' not in kwargs and  not InDetFlags.doRefit():
        kwargs=setDefaults(kwargs,
                           BroadRotCreatorTool   = TrackingCommon.getInDetBroadRotCreator(
                               nameSuffix               = split_cluster_map_extension,
                               SplitClusterMapExtension = split_cluster_map_extension))

    if InDetFlags.doDBMstandalone():
        kwargs=setDefaults(kwargs,
                           StraightLine        = True,
                           OutlierCut          = 5,
                           RecalibrateTRT      = False,
                           TRTExtensionCuts    = False,
                           TrackChi2PerNDFCut  = 20)

    if InDetFlags.doRefit() or use_broad_cluster_any is True:
        kwargs=setDefaults(kwargs,
                           RecalibrateSilicon  = False)
    if InDetFlags.doRefit():
        kwargs=setDefaults(kwargs,
                           BroadRotCreatorTool = None,
                           ReintegrateOutliers = False,
                           RecalibrateTRT      = False)
    if InDetFlags.doRobustReco():
        kwargs=setDefaults(kwargs,
                           # BroadRotCreatorTool = None
                           OutlierCut          = 10.0,
                           TrackChi2PerNDFCut  = 20)

    if InDetFlags.doRobustReco() or InDetFlags.doCosmics():
        kwargs=setDefaults(kwargs,
                           MaxOutliers         = 99)
    if InDetFlags.doCosmics() or InDetFlags.doBeamHalo():
        kwargs=setDefaults(kwargs,
                           Acceleration        = False)

    if InDetFlags.materialInteractions() and not InDetFlags.solenoidOn():
        kwargs=setDefaults(kwargs,
                           Momentum            = 1000.*Units.MeV)
    return InDetGlobalChi2FitterBase(name, **kwargs)

def InDetGlobalChi2FitterLowPt(name='InDetGlobalChi2FitterLowPt', **kwargs) :
    # @TODO TrackingGeometrySvc was not set but is set now
    #       RotCreatorTool and BroadRotCreatorTool not set
    split_cluster_map_extension = kwargs.pop('SplitClusterMapExtension','')

    from InDetRecExample import TrackingCommon as TrackingCommon
    if 'RotCreatorTool' not in kwargs :
        kwargs=setDefaults(kwargs,
                           RotCreatorTool        = TrackingCommon.getInDetRotCreator(
                               nameSuffix               = split_cluster_map_extension,
                               SplitClusterMapExtension = split_cluster_map_extension))

    from InDetRecExample.InDetJobProperties import InDetFlags
    use_broad_cluster_any = InDetFlags.useBroadClusterErrors() and (not InDetFlags.doDBMstandalone())
    if 'BroadRotCreatorTool' not in kwargs and  not InDetFlags.doRefit():
        kwargs=setDefaults(kwargs,
                           BroadRotCreatorTool   = TrackingCommon.getInDetBroadRotCreator(
                               nameSuffix               = split_cluster_map_extension,
                               SplitClusterMapExtension = split_cluster_map_extension))

    return  InDetGlobalChi2FitterBase(name, **setDefaults(kwargs,
                                                          OutlierCut             = 5.0,
                                                          Acceleration           = False, # default
                                                          RecalculateDerivatives = True,
                                                          TrackChi2PerNDFCut     = 10))


def InDetGlobalChi2FitterTRT(name='InDetGlobalChi2FitterTRT', **kwargs) :
    '''
    Global Chi2 Fitter for TRT segments with different settings
    '''
    split_cluster_map_extension = kwargs.pop('SplitClusterMapExtension','')

    if 'RotCreatorTool' not in kwargs :
        from InDetRecExample import TrackingCommon as TrackingCommon
        kwargs=setDefaults(kwargs,
                           RotCreatorTool = TrackingCommon.getInDetRefitRotCreator(
                                nameSuffix               = split_cluster_map_extension,
                                SplitClusterMapExtension = split_cluster_map_extension))

    from InDetRecExample.InDetJobProperties import InDetFlags
    return  InDetGlobalChi2FitterBase(name, **setDefaults(
        kwargs,
        MaterialUpdateTool     = '',       # default
        TrackingGeometrySvc    = '',       # default
        SignedDriftRadius      = True,     # default,
        RecalibrateSilicon     = False,    # default,
        RecalibrateTRT         = False,    # default,
        TRTTubeHitCut          = 2.5,      # default,
        MaxIterations          = 10,
        Acceleration           = False,    # default,
        RecalculateDerivatives = False,
        TRTExtensionCuts       = True,     # default,
        TrackChi2PerNDFCut     = 999999,
        Momentum               = 1000.*Units.MeV   if InDetFlags.materialInteractions() and not InDetFlags.solenoidOn() else  0,     # default,
        OutlierCut             = 5,        # default
        MaxOutliers            = 99                if InDetFlags.doRobustReco() or InDetFlags.doCosmics()               else  10,    # default,
        ReintegrateOutliers    = False             if InDetFlags.doRefit()                                              else  False  # default
       ))

def InDetGlobalChi2FitterDBM(name='InDetGlobalChi2FitterDBM', **kwargs) :
    split_cluster_map_extension = kwargs.pop('SplitClusterMapExtension','')
    if 'RotCreatorTool' not in kwargs :
        from InDetRecExample import TrackingCommon as TrackingCommon
        kwargs=setDefaults(kwargs, RotCreatorTool = TrackingCommon.getInDetRotCreatorDBM(SplitClusterMapExtension = split_cluster_map_extension))

    return  InDetGlobalChi2FitterBase(name, **setDefaults(kwargs,
                                                          BroadRotCreatorTool   = None,
                                                          StraightLine          = True,
                                                          OutlierCut            = 5,
                                                          RecalibrateTRT        = False,
                                                          RecalculateDerivatives= False,
                                                          TRTExtensionCuts      = False,
                                                          TrackChi2PerNDFCut    = 20,
                                                          Momentum              = 1000.*Units.MeV))

def GaussianSumFitter(name='GaussianSumFitter', **kwargs) :
    split_cluster_map_extension = kwargs.pop('SplitClusterMapExtension','')

    from InDetRecExample import TrackingCommon as TrackingCommon
    if 'ToolForROTCreation' not in kwargs :
        kwargs=setDefaults(kwargs,
                           ToolForROTCreation           = TrackingCommon.getInDetRotCreator(
                               nameSuffix               = split_cluster_map_extension,
                               SplitClusterMapExtension = split_cluster_map_extension))

    if 'ToolForExtrapolation' not in kwargs :
        kwargs=setDefaults(kwargs, ToolForExtrapolation = TrackingCommon.getInDetGsfExtrapolator())

    #if 'MeasurementUpdatorType' not in kwargs :
    #    kwargs=setDefaults(kwargs, MeasurementUpdatorType = InDetGsfMeasurementUpdator #TrackingCommon.getInDetGsfMeasurementUpdator())

    from TrkGaussianSumFilter.TrkGaussianSumFilterConf import Trk__GaussianSumFitter
    return Trk__GaussianSumFitter(name = name, **setDefaults(kwargs,
                                                                 ReintegrateOutliers     = False,
                                                                 MakePerigee             = True,
                                                                 RefitOnMeasurementBase  = True,
                                                                 DoHitSorting            = True))

def InDetTrackFitter(name='InDetTrackFitter', **kwargs) :
    from InDetRecExample.InDetJobProperties import InDetFlags
    return {
        'KalmanFitter'            : KalmanFitter,
        'KalmanDNAFitter'         : KalmanDNAFitter,
        'ReferenceKalmanFitter'   : ReferenceKalmanFitter,
        'DistributedKalmanFilter' : DistributedKalmanFilter,
        'GlobalChi2Fitter'        : InDetGlobalChi2Fitter,
        'GaussianSumFilter'       : GaussianSumFitter
    }[InDetFlags.trackFitterType()](name,**kwargs)

def InDetTrackFitterLowPt(name='InDetTrackFitter', **kwargs) :
    from InDetRecExample.InDetJobProperties import InDetFlags
    if InDetFlags.trackFitterType() != 'GlobalChi2Fitter' :
        return InDetTrackFitter(name,**kwargs)
    else :
        return InDetGlobalChi2FitterLowPt(name,**kwargs)

def InDetTrackFitterTRT(name='InDetTrackFitterTRT', **kwargs) :
    from InDetRecExample.InDetJobProperties import InDetFlags
    if InDetFlags.trackFitterType() != 'GlobalChi2Fitter' :
        return InDetTrackFitter(name,**kwargs)
    else :
        return InDetGlobalChi2FitterTRT(name,**kwargs)

def InDetTrackFitterDBM(name='InDetTrackFitterDBM', **kwargs) :
    return InDetGlobalChi2FitterDBM(name,**kwargs)