-
- """
- High level configuration tools for Kepler
- """
- __version__ = ""
- __author__ = ""
-
- from Gaudi.Configuration import *
- import GaudiKernel.ProcessJobOptions
- from Configurables import LHCbConfigurableUser, LHCbApp
-
- class Kepler(LHCbConfigurableUser):
-
- __slots__ = {
- # Input
- "AlignmentFile" : "", # Name of input alignment file
- "PixelConfigFile" : [], # Names of pixel configuration files
- "TimingConfigFile" : "", # Name of file that configures time offsets
- "EtaConfigFiles" : [], # Names of files with eta correction parameters
- "InputFiles" : [], # Names of input files or directories
- "EvtMax" : -1, # Max. number of events to process
- # Output
- "HistogramFile" : "", # Name of output histogram file
- "TupleFile" : "", # Name of output tuple file
- "WriteTuples" : False, # Flag to write out tuple file or not
- # Options
- "Tracking" : True, # Flag to run tracking or not
- "UseSimpleTracking" : True, # Flag to use Heinrich's Track finding method
- "Alignment" : False, # Flag to run alignment or not
- "Monitoring" : True, # Flag to run the monitoring sequence
- "Sim" : False,
- "UT" : False, # Flag to run the UT reconstruction sequence
- "UserAlgorithms" : [] # List of user algorithms not typically run
- }
-
- _propertyDocDct = {
- 'AlignmentFile' : """ Name of input alignment file """,
- 'PixelConfigFile' : """ Names of input pixel configuration files """,
- 'TimingConfigFile': """ Name of input timing configuration file """,
- 'EtaConfigFiles' : """ Names of files with eta correction parameters """,
- 'InputFiles' : """ Names of input raw data files or directories """,
- 'EvtMax' : """ Maximum number of events to process """,
- 'HistogramFile' : """ Name of output histogram file """,
- 'TupleFile' : """ Name of output tuple file """,
- 'WriteTuples' : """ Flag to write out tuple files or not """,
- 'Tracking' : """ Flag to run tracking or not """,
- 'Alignment' : """ Flag to activate alignment or not """,
- 'Monitoring' : """ Flag to run the monitoring sequence or not """,
- 'Sim' : """ Flag to simulate tracks rather than read in """,
- 'UT' : """ Flag to run the UT sequence or not """,
- 'UserAlgorithms' : """ List of user algorithms """
- }
-
- __used_configurables__ = [LHCbApp,LHCbConfigurableUser]
-
- def configureServices(self):
- # Pass the input file names to the data service.
- from Configurables import TbDataSvc
- TbDataSvc().Input = self.getProp("InputFiles")
- TbDataSvc().AlignmentFile = self.getProp("AlignmentFile")
- TbDataSvc().PixelConfigFile = self.getProp("PixelConfigFile")
- TbDataSvc().TimingConfigFile = self.getProp("TimingConfigFile")
- TbDataSvc().EtaConfigFiles = self.getProp("EtaConfigFiles")
- ApplicationMgr().ExtSvc += [TbDataSvc()]
-
- # Add the geometry service which keeps track of alignment,
- # the timing service, which tracks event boundaries,
- # and the pixel service, which stores masked pixels,
- # clock phases and per column timing offsets.
- from Configurables import TbGeometrySvc, TbTimingSvc, TbPixelSvc
- ApplicationMgr().ExtSvc += [TbGeometrySvc(), TbTimingSvc(), TbPixelSvc()]
-
- # Use TimingAuditor for timing, suppress printout from SequencerTimerTool
- from Configurables import AuditorSvc, SequencerTimerTool
- ApplicationMgr().ExtSvc += ['ToolSvc', 'AuditorSvc']
- ApplicationMgr().AuditAlgorithms = True
- AuditorSvc().Auditors += ['TimingAuditor']
- if not SequencerTimerTool().isPropertySet("OutputLevel"):
- SequencerTimerTool().OutputLevel = 4
-
- def configureSequence(self):
- """
- Set up the top level sequence and its phases
- """
- keplerSeq = GaudiSequencer("KeplerSequencer")
- ApplicationMgr().TopAlg = [keplerSeq]
- telescopeSeq = GaudiSequencer("Telescope")
- self.configureTelescope(telescopeSeq)
- keplerSeq.Members = [telescopeSeq]
- if self.getProp("UT") == True:
- utSeq = GaudiSequencer("UT")
- self.configureUT(utSeq)
- keplerSeq.Members += [utSeq]
- if self.getProp("Monitoring") == True:
- monitoringSeq = GaudiSequencer("Monitoring")
- self.configureMonitoring(monitoringSeq)
- keplerSeq.Members += [monitoringSeq]
- outputSeq = GaudiSequencer("Output")
- self.configureOutput(outputSeq)
- keplerSeq.Members += [outputSeq]
- UserAlgorithms = self.getProp("UserAlgorithms")
- if (len(UserAlgorithms) != 0):
- userSeq = GaudiSequencer("UserSequence")
- userSeq.Members = UserAlgorithms
- keplerSeq.Members += [userSeq]
- def configureTelescope(self, seq):
- if self.getProp("Sim") == False:
- from Configurables import TbEventBuilder
- seq.Members += [TbEventBuilder()]
- else :
- from Configurables import TbTestMC
- seq.Members += [TbTestMC()]
- from Configurables import TbClustering
- seq.Members += [TbClustering()]
- if self.getProp("Tracking") == True:
- from Configurables import TbSimpleTracking, TbTracking
- trackingSeq = GaudiSequencer("Tracking")
- if self.getProp("UseSimpleTracking") == True :
- trackingSeq.Members = [TbSimpleTracking()]
- else :
- trackingSeq.Members = [TbTracking()]
- seq.Members += [trackingSeq]
- from Configurables import TbTriggerAssociator
- seq.Members += [TbTriggerAssociator()]
- from Configurables import TbClusterAssociator
- seq.Members += [TbClusterAssociator()]
- if self.getProp("Alignment") == True:
- from Configurables import TbAlignment
- seq.Members += [TbAlignment()]
-
- def configureMonitoring(self, seq):
- from Configurables import TbHitMonitor, TbClusterPlots, TbTrackPlots
- if self.getProp("Tracking") == True :
- seq.Members += [TbHitMonitor(), TbClusterPlots(), TbTrackPlots()]
- from Configurables import TbTriggerMonitor
- seq.Members += [TbTriggerMonitor()]
- from Configurables import TbDUTMonitor
- seq.Members += [TbDUTMonitor()]
- else :
- seq.Members += [TbHitMonitor(), TbClusterPlots()]
-
- def configureUT(self, seq):
- # UT algorithms
- seq.Members = []
-
- def configureInput(self):
- # No events are read as input
- ApplicationMgr().EvtSel = 'NONE'
- # Delegate handling of max. number of events to ApplicationMgr
- self.setOtherProps(ApplicationMgr(), ["EvtMax"])
- # Transient store setup
- EventDataSvc().ForceLeaves = True
- EventDataSvc().RootCLID = 1
- # Suppress warning message from EventLoopMgr
- from Configurables import MessageSvc
- MessageSvc().setError += ['EventLoopMgr']
-
- def configureOutput(self, seq):
- # ROOT persistency for histograms
- ApplicationMgr().HistogramPersistency = "ROOT"
- # Set histogram file name.
- histoFile = "Kepler-histos.root"
- if (self.isPropertySet("HistogramFile") and self.getProp("HistogramFile") != ""):
- histoFile = self.getProp("HistogramFile")
- HistogramPersistencySvc().OutputFile = histoFile
- # Set tuple file name.
- tupleFile = "Kepler-tuple.root"
- if (self.isPropertySet('TupleFile') and self.getProp("TupleFile") != ""):
- tupleFile = self.getProp("TupleFile")
- ApplicationMgr().ExtSvc += [NTupleSvc()]
- tupleStr = "FILE1 DATAFILE='%s' TYP='ROOT' OPT='NEW'" % tupleFile
- NTupleSvc().Output += [tupleStr]
- from Configurables import MessageSvc
- MessageSvc().setWarning += ['RFileCnv', 'RCWNTupleCnv']
- # If requested add TbTupleWriter to the output sequence
- if self.getProp("WriteTuples") == True:
- from Configurables import TbTupleWriter
- seq.Members += [TbTupleWriter()]
-
- def evtMax(self):
- return LHCbApp().evtMax()
-
- def __apply_configuration__(self):
- GaudiKernel.ProcessJobOptions.PrintOn()
- self.configureServices()
- self.configureSequence()
- self.configureInput()
- GaudiKernel.ProcessJobOptions.PrintOn()
- log.info(self)
- GaudiKernel.ProcessJobOptions.PrintOff()
-
- def addAlignment(self, a):
- from Configurables import TbAlignment
- counter = len(TbAlignment().AlignmentTechniques)
- name = "s%d" % (counter)
- algname = type(a).__name__
- print "Added tool: %s (%d)" % (algname, counter)
- TbAlignment().addTool(a, name = name)
- TbAlignment().AlignmentTechniques.append(algname)
-
-
-