diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/CMakeLists.txt b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/CMakeLists.txt index fd6061475a3bf9753ff4bea525f8908096f16bdd..e6b3cc2f6dfe8fe27b00dab250cb51d7f1aaab25 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/CMakeLists.txt +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/CMakeLists.txt @@ -13,28 +13,28 @@ if( XAOD_STANDALONE ) atlas_install_scripts( share/*_eljob.py ) atlas_add_test( testJobData - SCRIPT FullCPAlgorithmsTest_eljob.py --data-type data --unit-test + SCRIPT FullCPAlgorithmsTest_eljob.py --data-type data --unit-test --direct-driver POST_EXEC_SCRIPT nopost.sh PROPERTIES TIMEOUT 600 ) atlas_add_test( testJobFullSim - SCRIPT FullCPAlgorithmsTest_eljob.py --data-type mc --unit-test + SCRIPT FullCPAlgorithmsTest_eljob.py --data-type mc --unit-test --direct-driver POST_EXEC_SCRIPT nopost.sh PROPERTIES TIMEOUT 600 ) atlas_add_test( testJobFastSim - SCRIPT FullCPAlgorithmsTest_eljob.py --data-type afii --unit-test + SCRIPT FullCPAlgorithmsTest_eljob.py --data-type afii --unit-test --direct-driver POST_EXEC_SCRIPT nopost.sh PROPERTIES TIMEOUT 600 ) atlas_add_test( testJobDataConfig - SCRIPT FullCPAlgorithmsTest_eljob.py --data-type data --unit-test --block-config + SCRIPT FullCPAlgorithmsTest_eljob.py --data-type data --unit-test --direct-driver --block-config POST_EXEC_SCRIPT nopost.sh PROPERTIES TIMEOUT 600 ) atlas_add_test( testJobFullSimConfig - SCRIPT FullCPAlgorithmsTest_eljob.py --data-type mc --unit-test --block-config + SCRIPT FullCPAlgorithmsTest_eljob.py --data-type mc --unit-test --direct-driver --block-config POST_EXEC_SCRIPT nopost.sh PROPERTIES TIMEOUT 600 ) atlas_add_test( testJobFastSimConfig - SCRIPT FullCPAlgorithmsTest_eljob.py --data-type afii --unit-test --block-config + SCRIPT FullCPAlgorithmsTest_eljob.py --data-type afii --unit-test --direct-driver --block-config POST_EXEC_SCRIPT nopost.sh PROPERTIES TIMEOUT 600 ) diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py index 74a24b211cb6456a5da1d444b71256a931af194e..568eefb28b2da9dc3a62666d8e501dbc2189a667 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/python/FullCPAlgorithmsTest.py @@ -8,7 +8,53 @@ from AsgAnalysisAlgorithms.AsgAnalysisAlgorithmsTest import pileupConfigFiles from AnalysisAlgorithmsConfig.ConfigSequence import ConfigSequence from AnalysisAlgorithmsConfig.ConfigAccumulator import ConfigAccumulator -def makeSequenceOld (dataType, algSeq) : +# Config: +triggerChains = [ + 'HLT_2mu14', + 'HLT_mu20_mu8noL1', + 'HLT_2e17_lhvloose_nod0' +] + + +def makeSequenceOld (dataType, algSeq, forCompare) : + + # Include, and then set up the pileup analysis sequence: + prwfiles, lumicalcfiles = pileupConfigFiles(dataType) + + from AsgAnalysisAlgorithms.PileupAnalysisSequence import \ + makePileupAnalysisSequence + pileupSequence = makePileupAnalysisSequence( + dataType, + userPileupConfigs=prwfiles, + userLumicalcFiles=lumicalcfiles, + ) + pileupSequence.configure( inputName = {}, outputName = {} ) + + # Add the pileup sequence to the job: + algSeq += pileupSequence + + + # Include, and then set up the jet analysis algorithm sequence: + from JetAnalysisAlgorithms.JetAnalysisSequence import makeJetAnalysisSequence + jetContainer = 'AntiKt4EMPFlowJets' + jetSequence = makeJetAnalysisSequence( dataType, jetContainer, enableCutflow=True, enableKinematicHistograms=True ) + + from FTagAnalysisAlgorithms.FTagAnalysisSequence import makeFTagAnalysisSequence + makeFTagAnalysisSequence( jetSequence, dataType, jetContainer, noEfficiency = True, legacyRecommendations = True, + enableCutflow=True ) + + jetSequence.configure( inputName = jetContainer, outputName = 'AnaJetsBase_%SYS%' ) + + # Include, and then set up the jet analysis algorithm sequence: + from JetAnalysisAlgorithms.JetJvtAnalysisSequence import makeJetJvtAnalysisSequence + jvtSequence = makeJetJvtAnalysisSequence( dataType, jetContainer, enableCutflow=True ) + jvtSequence.configure( inputName = { 'jets' : 'AnaJetsBase_%SYS%' }, + outputName = { 'jets' : 'AnaJets_%SYS%' } ) + + # Add the sequences to the job: + algSeq += jetSequence + algSeq += jvtSequence + # Include, and then set up the muon analysis algorithm sequence: from MuonAnalysisAlgorithms.MuonAnalysisSequence import makeMuonAnalysisSequence @@ -16,7 +62,7 @@ def makeSequenceOld (dataType, algSeq) : workingPoint = 'Medium.Iso', postfix = 'medium', enableCutflow=True, enableKinematicHistograms=True ) muonSequenceMedium.configure( inputName = 'Muons', - outputName = 'AnalysisMuonsMedium_%SYS%' ) + outputName = 'AnaMuonsMedium_%SYS%' ) # Add the sequence to the job: algSeq += muonSequenceMedium @@ -25,37 +71,138 @@ def makeSequenceOld (dataType, algSeq) : workingPoint = 'Tight.Iso', postfix = 'tight', enableCutflow=True, enableKinematicHistograms=True ) muonSequenceTight.removeStage ("calibration") - muonSequenceTight.configure( inputName = 'AnalysisMuonsMedium_%SYS%', - outputName = 'AnalysisMuons_%SYS%') + muonSequenceTight.configure( inputName = 'AnaMuonsMedium_%SYS%', + outputName = 'AnaMuons_%SYS%') # Add the sequence to the job: algSeq += muonSequenceTight + # Include, and then set up the electron analysis sequence: + from EgammaAnalysisAlgorithms.ElectronAnalysisSequence import \ + makeElectronAnalysisSequence + likelihood = True + recomputeLikelihood=False + if likelihood: + workingpoint = 'LooseLHElectron.Loose_VarRad' + else: + workingpoint = 'LooseDNNElectron.Loose_VarRad' + electronSequence = makeElectronAnalysisSequence( dataType, workingpoint, postfix = 'loose', + recomputeLikelihood=recomputeLikelihood, enableCutflow=True, enableKinematicHistograms=True ) + electronSequence.configure( inputName = 'Electrons', + outputName = 'AnaElectrons_%SYS%' ) + algSeq += electronSequence -def makeSequenceBlocks (dataType, algSeq) : - # Include, and then set up the muon analysis algorithm sequence: - from MuonAnalysisAlgorithms.MuonAnalysisConfig import makeMuonCalibrationConfig, makeMuonWorkingPointConfig + # Include, and then set up the photon analysis sequence: + from EgammaAnalysisAlgorithms.PhotonAnalysisSequence import \ + makePhotonAnalysisSequence + photonSequence = makePhotonAnalysisSequence( dataType, 'Tight.FixedCutTight', postfix = 'tight', + recomputeIsEM=False, enableCutflow=True, enableKinematicHistograms=True ) + photonSequence.configure( inputName = 'Photons', + outputName = 'AnaPhotons_%SYS%' ) + algSeq += photonSequence - configSeq = ConfigSequence () - makeMuonCalibrationConfig (configSeq, 'AnalysisMuons') - makeMuonWorkingPointConfig (configSeq, 'AnalysisMuons', workingPoint='Medium.Iso', postfix='medium') - makeMuonWorkingPointConfig (configSeq, 'AnalysisMuons', workingPoint='Tight.Iso', postfix='tight') + # Include, and then set up the tau analysis algorithm sequence: + from TauAnalysisAlgorithms.TauAnalysisSequence import makeTauAnalysisSequence + tauSequence = makeTauAnalysisSequence( dataType, 'Tight', postfix = 'tight', + enableCutflow=True, enableKinematicHistograms=True ) + tauSequence.configure( inputName = 'TauJets', outputName = 'AnaTauJets_%SYS%' ) - configAccumulator = ConfigAccumulator (dataType, algSeq) - configSeq.fullConfigure (configAccumulator) + # Add the sequence to the job: + algSeq += tauSequence + # temporarily disabled until di-taus are supported in R22 + # # Include, and then set up the tau analysis algorithm sequence: + # from TauAnalysisAlgorithms.DiTauAnalysisSequence import makeDiTauAnalysisSequence + # diTauSequence = makeDiTauAnalysisSequence( dataType, 'Tight', postfix = 'tight' ) + # diTauSequence.configure( inputName = 'DiTauJets', outputName = 'AnaDiTauJets_%SYS%' ) + # Add the sequence to the job: + # disabling this, the standard test files don't have DiTauJets + # algSeq += diTauSequence -def makeSequence (dataType, useBlocks) : - algSeq = AlgSequence() + from AnaAlgorithm.DualUseConfig import addPrivateTool, createAlgorithm + # Set up a selection alg for demonstration purposes + # Also to avoid warnings from building MET with very soft electrons - # Set up the systematics loader/handler service: - sysService = createService( 'CP::SystematicsSvc', 'SystematicsSvc', sequence = algSeq ) - sysService.sigmaRecommended = 1 + selalg = createAlgorithm( 'CP::AsgSelectionAlg', 'METEleSelAlg' ) + addPrivateTool( selalg, 'selectionTool', 'CP::AsgPtEtaSelectionTool' ) + selalg.selectionTool.minPt = 10e3 + selalg.selectionTool.maxEta = 2.47 + selalg.selectionDecoration = 'selectPtEta' + selalg.particles = 'AnaElectrons_%SYS%' + algSeq += selalg + + # Now make a view container holding only the electrons for the MET calculation + viewalg = createAlgorithm( 'CP::AsgViewFromSelectionAlg','METEleViewAlg' ) + viewalg.selection = [ 'selectPtEta' ] + viewalg.input = 'AnaElectrons_%SYS%' + viewalg.output = 'METElectrons_%SYS%' + algSeq += viewalg + + # Include, and then set up the met analysis algorithm sequence: + from MetAnalysisAlgorithms.MetAnalysisSequence import makeMetAnalysisSequence + metSequence = makeMetAnalysisSequence( dataType, metSuffix = jetContainer[:-4] ) + metSequence.configure( inputName = { 'jets' : 'AnaJets_%SYS%', + 'muons' : 'AnaMuons_%SYS%', + 'electrons' : 'METElectrons_%SYS%' }, + outputName = 'AnaMET_%SYS%' ) + + # Add the sequence to the job: + algSeq += metSequence + + + # Include, and then set up the overlap analysis algorithm sequence: + from AsgAnalysisAlgorithms.OverlapAnalysisSequence import \ + makeOverlapAnalysisSequence + overlapSequence = makeOverlapAnalysisSequence( dataType, doMuPFJetOR=True, doTaus=False, enableCutflow=True ) + overlapSequence.configure( + inputName = { + 'electrons' : 'AnaElectrons_%SYS%', + 'photons' : 'AnaPhotons_%SYS%', + 'muons' : 'AnaMuons_%SYS%', + 'jets' : 'AnaJets_%SYS%', + # 'taus' : 'AnaTauJets_%SYS%' + }, + outputName = { + 'electrons' : 'AnaElectronsOR_%SYS%', + 'photons' : 'AnaPhotonsOR_%SYS%', + 'muons' : 'AnaMuonsOR_%SYS%', + 'jets' : 'AnaJetsOR_%SYS%', + # 'taus' : 'AnaTauJetsOR_%SYS%' + } ) + + # FIX ME: temporarily disabling this for data, as there are some + # errors with missing primary vertices + if dataType != 'data' : + algSeq += overlapSequence + + + if dataType != 'data' : + # Include, and then set up the generator analysis sequence: + from AsgAnalysisAlgorithms.GeneratorAnalysisSequence import \ + makeGeneratorAnalysisSequence + generatorSequence = makeGeneratorAnalysisSequence( dataType, saveCutBookkeepers=True, runNumber=284500, cutBookkeepersSystematics=True ) + algSeq += generatorSequence + + + # Include, and then set up the trigger analysis sequence: + from TriggerAnalysisAlgorithms.TriggerAnalysisSequence import \ + makeTriggerAnalysisSequence + triggerSequence = makeTriggerAnalysisSequence( dataType, triggerChains=triggerChains ) + # FIXME: temporarily disabling this for comparisons, as there is no + # corresponding configuration block. also, maybe it should be possible + # to disable filtering in the algorithm, i.e. just store the trigger + # decision without throwing away events. + if not forCompare : + algSeq += triggerSequence + + + +def makeSequenceBlocks (dataType, algSeq, forCompare) : # Include, and then set up the pileup analysis sequence: prwfiles, lumicalcfiles = pileupConfigFiles(dataType) @@ -72,10 +219,33 @@ def makeSequence (dataType, useBlocks) : # Add the pileup sequence to the job: algSeq += pileupSequence + + # Include, and then set up the muon analysis algorithm sequence: + from MuonAnalysisAlgorithms.MuonAnalysisConfig import makeMuonCalibrationConfig, makeMuonWorkingPointConfig + + configSeq = ConfigSequence () + + makeMuonCalibrationConfig (configSeq, 'AnaMuons') + makeMuonWorkingPointConfig (configSeq, 'AnaMuons', workingPoint='Medium.Iso', postfix='medium') + makeMuonWorkingPointConfig (configSeq, 'AnaMuons', workingPoint='Tight.Iso', postfix='tight') + + configAccumulator = ConfigAccumulator (dataType, algSeq) + configSeq.fullConfigure (configAccumulator) + + + +def makeSequence (dataType, useBlocks, forCompare) : + + algSeq = AlgSequence() + + # Set up the systematics loader/handler service: + sysService = createService( 'CP::SystematicsSvc', 'SystematicsSvc', sequence = algSeq ) + sysService.sigmaRecommended = 1 + if not useBlocks : - makeSequenceOld (dataType, algSeq) + makeSequenceOld (dataType, algSeq, forCompare=forCompare) else : - makeSequenceBlocks (dataType, algSeq) + makeSequenceBlocks (dataType, algSeq, forCompare=forCompare) # Add an ntuple dumper algorithm: @@ -89,17 +259,54 @@ def makeSequence (dataType, useBlocks) : algSeq += ntupleMaker ntupleMaker = createAlgorithm( 'CP::AsgxAODNTupleMakerAlg', 'NTupleMakerMuons' ) ntupleMaker.TreeName = 'analysis' - ntupleMaker.Branches = [ 'AnalysisMuons_NOSYS.eta -> mu_eta', - 'AnalysisMuons_NOSYS.phi -> mu_phi', - 'AnalysisMuons_%SYS%.pt -> mu_pt_%SYS%', ] - # These branches are temporarily excluded as they make the test - # fail. The differences between sequence and block configuration - # need to be addressed and then these need to be reenabled. - # ntupleMaker.Branches = [ 'AnalysisMuons_%SYS%.baselineSelection_medium -> mu_select_medium_%SYS%', - # 'AnalysisMuons_%SYS%.baselineSelection_tight -> mu_select_tight_%SYS%', ] - # if dataType != 'data': - # ntupleMaker.Branches += [ 'AnalysisMuons_%SYS%.muon_effSF_medium_%SYS% -> mu_effSF_medium_%SYS%' ] - # ntupleMaker.Branches += [ 'AnalysisMuons_%SYS%.muon_effSF_tight_%SYS% -> mu_effSF_tight_%SYS%' ] + ntupleMaker.Branches = [ 'EventInfo.runNumber -> runNumber', + 'EventInfo.eventNumber -> eventNumber', + 'AnaMuons_NOSYS.eta -> muon_eta', + 'AnaMuons_NOSYS.phi -> muon_phi', + 'AnaMuons_%SYS%.pt -> muon_pt_%SYS%', ] + + # These branches are temporarily excluded for the comparison + # between sequences and blocks as they are either not yet + # implemented or make the test fail. The differences between + # sequence and block configuration need to be addressed and then + # these need to be reenabled. + if not forCompare and not useBlocks : + ntupleMaker.Branches += [ + 'AnaJets_%SYS%.pt -> jet_%SYS%_pt', + 'AnaJets_NOSYS.phi -> jet_phi', + 'AnaJets_NOSYS.eta -> jet_eta', + 'AnaMuons_%SYS%.baselineSelection_medium -> muon_select_medium_%SYS%', + 'AnaMuons_%SYS%.baselineSelection_tight -> muon_select_tight_%SYS%', + 'AnaElectrons_%SYS%.pt -> electron_%SYS%_pt', + 'AnaElectrons_NOSYS.phi -> electron_phi', + 'AnaElectrons_NOSYS.eta -> electron_eta', + 'AnaElectrons_%SYS%.baselineSelection_loose -> electron_select_loose_%SYS%', + 'AnaPhotons_%SYS%.pt -> photon_%SYS%_pt', + 'AnaPhotons_NOSYS.phi -> photon_phi', + 'AnaPhotons_NOSYS.eta -> photon_eta', + 'AnaPhotons_%SYS%.baselineSelection_tight -> photon_select_tight_%SYS%', + 'AnaTauJets_%SYS%.pt -> tau_jet_%SYS%_pt', + 'AnaTauJets_NOSYS.phi -> tau_jet_phi', + 'AnaTauJets_NOSYS.eta -> tau_jet_eta', + 'AnaTauJets_%SYS%.baselineSelection_tight -> tau_select_tight_%SYS%', + ] + if dataType != 'data': + ntupleMaker.Branches += [ + # 'EventInfo.jvt_effSF_%SYS% -> jvtSF_%SYS%', + # 'EventInfo.fjvt_effSF_%SYS% -> fjvtSF_%SYS%', + 'AnaJets_%SYS%.jvt_effSF_%SYS% -> jet_%SYS%_jvtEfficiency', + # 'AnaJets_%SYS%.fjvt_effSF_NOSYS -> jet_%SYS%_fjvtEfficiency', + 'AnaMET_%SYS%.mpx -> met_%SYS%_mpx', + 'AnaMET_%SYS%.mpy -> met_%SYS%_mpy', + 'AnaMET_%SYS%.sumet -> met_%SYS%_sumet', + 'AnaMET_%SYS%.name -> met_%SYS%_name', + ] + + ntupleMaker.Branches += ['EventInfo.trigPassed_' + t + ' -> trigPassed_' + t for t in triggerChains] + if dataType != 'data': + ntupleMaker.Branches += [ 'EventInfo.generatorWeight_%SYS% -> generatorWeight_%SYS%', ] + ntupleMaker.Branches += [ 'AnaMuons_%SYS%.muon_effSF_medium_%SYS% -> muon_effSF_medium_%SYS%' ] + ntupleMaker.Branches += [ 'AnaMuons_%SYS%.muon_effSF_tight_%SYS% -> muon_effSF_tight_%SYS%' ] # ntupleMaker.OutputLevel = 2 # For output validation algSeq += ntupleMaker treeFiller = createAlgorithm( 'CP::TreeFillerAlg', 'TreeFiller' ) diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/BlockConfigurationAthenaTest.sh b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/BlockConfigurationAthenaTest.sh index 22f6a7b075a7899275972dcbe37db02add72663d..4ce807978229e4a72a216728c159bc3d3242ea98 100755 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/BlockConfigurationAthenaTest.sh +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/BlockConfigurationAthenaTest.sh @@ -9,8 +9,8 @@ set -e set -u dataType=$1 -athena.py AnalysisAlgorithmsConfig/FullCPAlgorithmsTest_jobOptions.py --evtMax=500 - --data-type $dataType -athena.py AnalysisAlgorithmsConfig/FullCPAlgorithmsTest_jobOptions.py --evtMax=500 - --data-type $dataType --block-config +athena.py AnalysisAlgorithmsConfig/FullCPAlgorithmsTest_jobOptions.py --evtMax=500 - --data-type $dataType --for-compare +athena.py AnalysisAlgorithmsConfig/FullCPAlgorithmsTest_jobOptions.py --evtMax=500 - --data-type $dataType --for-compare --block-config acmd.py diff-root --enforce-leaves -t analysis FullCPAlgorithmsTest.$dataType.hist.root FullCPAlgorithmsConfigTest.$dataType.hist.root diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py index 4db8e621c2fa418da4c9b2be426cb2d08de5d51e..7fb3acc3ae27bf3f5df558430c9170cc6f764e1b 100755 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_eljob.py @@ -18,9 +18,18 @@ parser.add_option( '-s', '--submission-dir', dest = 'submission_dir', parser.add_option( '-u', '--unit-test', dest='unit_test', action = 'store_true', default = False, help = 'Run the job in "unit test mode"' ) +parser.add_option( '--direct-driver', dest='direct_driver', + action = 'store_true', default = False, + help = 'Run the job with the direct driver' ) +parser.add_option( '--algorithm-timer', dest='algorithm_timer', + action = 'store_true', default = False, + help = 'Run the job with a timer for each algorithm' ) parser.add_option( '--block-config', dest='block_config', action = 'store_true', default = False, help = 'Run the job in "unit test mode"' ) +parser.add_option( '--for-compare', dest='for_compare', + action = 'store_true', default = False, + help = 'Configure the job for comparison of sequences vs blocks' ) ( options, args ) = parser.parse_args() # Set up (Py)ROOT. @@ -35,6 +44,7 @@ ROOT.xAOD.TauJetContainer() dataType = options.data_type blockConfig = options.block_config +forCompare = options.for_compare if dataType not in ["data", "mc", "afii"] : raise Exception ("invalid data type: " + dataType) @@ -61,10 +71,12 @@ sh.printContent() job = ROOT.EL.Job() job.sampleHandler( sh ) job.options().setDouble( ROOT.EL.Job.optMaxEvents, 500 ) +if options.algorithm_timer : + job.options().setBool( ROOT.EL.Job.optAlgorithmTimer, True ) from AnalysisAlgorithmsConfig.FullCPAlgorithmsTest import makeSequence -algSeq = makeSequence (dataType, blockConfig) +algSeq = makeSequence (dataType, blockConfig, forCompare=forCompare) print( algSeq ) # For debugging algSeq.addSelfToJob( job ) @@ -76,13 +88,20 @@ submitDir = options.submission_dir if options.unit_test: import os import tempfile - submitDir = tempfile.mkdtemp( prefix = 'muonTest_'+dataType+'_', dir = os.getcwd() ) + submitDir = tempfile.mkdtemp( prefix = 'fullCPTest_'+dataType+'_', dir = os.getcwd() ) os.rmdir( submitDir ) pass + # Run the job using the local driver. This is intentionally the local # driver, unlike most other tests that use the direct driver. That # way it tests whether the code works correctly with that driver, # which is a lot more similar to the way the batch/grid drivers work. driver = ROOT.EL.LocalDriver() + +if options.direct_driver : + # this is for testing purposes, as only the direct driver respects + # the limit on the number of events. + driver = ROOT.EL.DirectDriver() + driver.submit( job, submitDir ) diff --git a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py index 911c5cccc57a747a8a65299fe672bab0b06b875d..bf4234ecbabe5651b9fb595903d6fbde9cf738a9 100644 --- a/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py +++ b/PhysicsAnalysis/Algorithms/AnalysisAlgorithmsConfig/share/FullCPAlgorithmsTest_jobOptions.py @@ -12,10 +12,14 @@ athArgsParser.add_argument("--data-type", action = "store", dest = "data_type", athArgsParser.add_argument( '--block-config', dest='block_config', action = 'store_true', default = False, help = 'Configure the job with block configuration' ) +athArgsParser.add_argument( '--for-compare', dest='for_compare', + action = 'store_true', default = False, + help = 'Configure the job for comparison of sequences vs blocks' ) athArgs = athArgsParser.parse_args() dataType = athArgs.data_type blockConfig = athArgs.block_config +forCompare = athArgs.for_compare if not dataType in ["data", "mc", "afii"] : raise Exception ("invalid data type: " + dataType) @@ -32,7 +36,7 @@ testFile = os.getenv ( inputfile[dataType] ) svcMgr.EventSelector.InputCollections = [testFile] from AnalysisAlgorithmsConfig.FullCPAlgorithmsTest import makeSequence -algSeq = makeSequence (dataType, blockConfig) +algSeq = makeSequence (dataType, blockConfig, forCompare=forCompare) print (algSeq) # For debugging # Add all algorithms from the sequence to the job.