ATLAS Offline Software
Loading...
Searching...
No Matches
TestSUSYToolsAlg.py
Go to the documentation of this file.
1#!/usr/bin/env python
2
3# Read the submission directory as a command line argument. You can
4# extend the list of arguments with your private ones later on.
5import sys
6import optparse
7from glob import glob
8from datetime import date
9
10#import AthenaPoolCnvSvc.ReadAthenaPool #read xAOD files
11
12parser = optparse.OptionParser()
13#
14parser.add_option('--driver', dest = 'driver', choices = ['direct','grid','lxplus'], default = 'direct')
15parser.add_option('--gridTag', dest = 'gridTag')
16parser.add_option('--submitFlags', dest = 'submitFlags')
17parser.add_option('--express', dest = 'express', default = False, action = 'store_true' )
18parser.add_option('-n', '--dryrun', dest = 'dryrun', default=False, action = 'store_true' )
19#
20parser.add_option('--log-level', dest = 'log_level', default = 'INFO', choices = ['ALWAYS','FATAL','ERROR','WARNING','INFO','DEBUG','VERBOSE'])
21parser.add_option('--dosyst', dest = 'dosyst', default = False, action = 'store_true')
22parser.add_option( '-s', '--submission-dir', dest = 'submission_dir', default = 'submitDir', help = 'Submission directory for EventLoop' )
23parser.add_option('-t', '--type', dest = 'type', default = 'mc20e', help = 'Job type. (mc20a, mc20d, mc20e, mc23a, mc23d, mc23e, mc23g, data18, data22, data23, data24)', choices = ['mc20a', 'mc20d', 'mc20e', 'mc23a', 'mc23d', 'mc23e', 'mc23g', 'data18', 'data22', 'data23', 'data24'])
24parser.add_option('--AF', dest = 'AF', default = False, action = 'store_true' )
25parser.add_option('-f', '--flav', dest = 'flav', default = 'PHYS', choices = ["PHYS", "PHYSLITE"], help = 'input DAOD flavour' )
26parser.add_option('-m', '--maxEvts', dest = 'maxEvts', type = 'int', default = -1, help = 'Max events (-1 is all)' )
27parser.add_option('-M', '--maxEvtsManual', dest = 'maxEvtsManual', type = 'int')
28parser.add_option('-p', '--ptag', dest = 'ptag', default = 'p7266', help = 'ptag' )
29parser.add_option('-c', '--configFile', dest = 'configFile', help = 'Override configfile' )
30parser.add_option('--grl', dest = 'grl')
31parser.add_option('--inputDir', dest = 'inputDir')
32parser.add_option('--inputFile', dest = 'inputFile')
33parser.add_option('--inputGrid', dest = 'inputGrid')
34parser.add_option('--inputXRD', dest = 'inputXRD', default="root://eosatlas.cern.ch///eos/atlas/atlascerngroupdisk/data-art/large-input/SUSYTools")
35parser.add_option('--overwrite', dest = 'overwrite', default = False, action = 'store_true' )
36( options, args ) = parser.parse_args()
37
38# Print configuration
39print("Configured input data ptag: %s"%(options.ptag))
40ptageqdata = {'p7266':'p7267'}
41if 'data2' in options.type and options.ptag in ptageqdata:
42 options.ptag = ptageqdata[options.ptag]
43 print("Overriding ptag to equivalent data ptag: -> %s"%(options.ptag))
44print("Configured input data type: %s"%(options.type))
45print("Configured input data DAOD flavour: %s"%(options.flav))
46print("Configured input data sim type: %s"%('FullSim' if not options.AF else 'AF'))
47
48# Set up (Py)ROOT.
49import ROOT
50ROOT.xAOD.Init().ignore()
51
52# for logging
53outputlvl = {'INFO':ROOT.MSG.INFO,'DEBUG':ROOT.MSG.DEBUG,'VERBOSE':ROOT.MSG.VERBOSE,'FATAL':ROOT.MSG.FATAL,'ALWAYS':ROOT.MSG.ALWAYS,'ERROR':ROOT.MSG.ERROR,'WARNING':ROOT.MSG.WARNING}
54
55# Set up the sample handler object. See comments from the C++ macro
56# for the details about these lines.
57import os
58sh = ROOT.SH.SampleHandler()
59sh.setMetaString( 'nc_tree', 'CollectionTree' )
60
61import shutil
62if options.overwrite and os.path.exists(options.submission_dir): shutil.rmtree(options.submission_dir)
63
64# set up file source
65sim_type = "FS" if not options.AF else "AF3"
66inputFiles = {}
67inputFiles['mc20e'] = 'mc20_13TeV.410470.%s_mc20e_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
68inputFiles['mc23a'] = 'mc23_13p6TeV.601229.%s_mc23a_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
69inputFiles['mc23d'] = 'mc23_13p6TeV.601229.%s_mc23d_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
70inputFiles['mc23e'] = 'mc23_13p6TeV.601229.%s_mc23e_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
71inputFiles['mc23g'] = 'mc23_13p6TeV.601229.%s_mc23g_%s.%s.pool.root'%(sim_type, options.ptag, options.flav)
72inputFiles['data18'] = 'data18_13TeV.00364292_%s.%s.pool.root'%(options.ptag,options.flav)
73inputFiles['data22'] = 'data22_13p6TeV.00440613_%s.%s.pool.root'%(options.ptag,options.flav)
74inputFiles['data23'] = 'data23_13p6TeV.00456749_%s.%s.pool.root'%(options.ptag,options.flav)
75inputFiles['data24'] = 'data24_13p6TeV.00486706_%s.%s.pool.root'%(options.ptag,options.flav)
76# to come
77#inputFiles['data25'] = 'data25_13p6TeV.00509849_%s.%s.pool.root'%(options.ptag,options.flav)
78
79inputFile = ''
80
81# configure test type
82if options.inputDir:
83 inputDir = options.inputDir
84 if options.inputFile:
85 inputFile = options.inputFile
86 else:
87 inputFile = inputFiles[options.type] if options.type in inputFiles else ''
88 print("Using inputDir: ",inputDir)
89 print("Using inputFile:",inputFile)
90 ROOT.SH.ScanDir().filePattern(inputFile).scan(sh, inputDir)
91elif options.inputGrid:
92 print("Using inputGrid: ",options.inputGrid)
93 dsname = options.inputGrid.split(':')[-1].rstrip() # drop scope if present, and not trailing spaces
94 ROOT.SH.addGrid(sh,dsname)
95elif options.inputXRD:
96 print("Using inputXRD: ",options.inputXRD)
97 pref,server,fname = options.inputXRD.split('//')
98 dl = ROOT.SH.DiskListXRD(server,fname)
99 inputFile = inputFiles[options.type] if options.type in inputFiles else ''
100 ROOT.SH.ScanDir().filePattern(inputFile).scan(sh,dl)
101sh.printContent()
102
103# Create an EventLoop job.
104job = ROOT.EL.Job()
105job.sampleHandler( sh )
106job.options().setDouble( ROOT.EL.Job.optMaxEvents, options.maxEvts )
107
108# Create the algorithm's configuration. Note that we'll be able to add
109# algorithm property settings here later on.
110from AnaAlgorithm.AnaAlgorithmConfig import AnaAlgorithmConfig
111config = AnaAlgorithmConfig( 'SUSYToolsAlg' )
112config.addPrivateTool("SUSYTools","ST::SUSYObjDef_xAOD")
113
114config.SUSYTools.ConfigFile = "SUSYTools/SUSYTools_Default.conf"
115if ("data2" in options.type or "mc23" in options.type): config.SUSYTools.ConfigFile = "SUSYTools/SUSYTools_Default_Run3.conf"
116if ("data" not in options.type): config.DoSyst = options.dosyst
117config.SUSYTools.DataSource = 1
118config.OutputLevel = outputlvl[options.log_level]
119config.SUSYTools.OutputLevel = outputlvl[options.log_level]
120config.SUSYTools.PRWLumiCalcFiles = []
121config.SUSYTools.AutoconfigurePRWTool = True
122config.SUSYTools.PRWUseCommonMCFiles = True
123if options.flav == "PHYSLITE":
124 print("Running on PHYSLITE : ", inputFile)
125 STconfig_lite = str(config.SUSYTools.ConfigFile).replace(".conf","_LITE.conf")
126 config.SUSYTools.ConfigFile = STconfig_lite
127 config.SUSYTools.IsPHYSLITE = True
128
129if options.configFile:
130 config.SUSYTools.ConfigFile = options.configFile
131
132# The config file is also needed directly in SUSYToolsAlg
133config.ConfigFile = config.SUSYTools.ConfigFile
134
135# set datasource if AF3
136if options.AF:
137 config.SUSYTools.DataSource = 2
138
139# set mcCampaign
140if 'mc' in options.type:
141 mcCampaign = options.type
142 config.SUSYTools.mcCampaign = options.type
143elif options.type == 'data18':
144 mcCampaign = 'mc20e'
145 config.SUSYTools.mcCampaign = options.type
146 config.SUSYTools.DataSource = 0
147elif options.type == 'data22':
148 mcCampaign = 'mc23a'
149 config.SUSYTools.mcCampaign = options.type
150 config.SUSYTools.DataSource = 0
151elif options.type == 'data23':
152 mcCampaign = 'mc23d'
153 config.SUSYTools.mcCampaign = options.type
154 config.SUSYTools.DataSource = 0
155elif options.type == 'data24':
156 mcCampaign = 'mc23e'
157 config.SUSYTools.mcCampaign = options.type
158 config.SUSYTools.DataSource = 0
159elif options.type == 'data25':
160 mcCampaign = 'mc23g'
161 config.SUSYTools.mcCampaign = options.type
162 config.SUSYTools.DataSource = 0
163
164# set lumicalc info
165PRWLumiCalc = {}
166PRWLumiCalc['mc20a'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root',
167 '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root']
168PRWLumiCalc['mc20d'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root']
169PRWLumiCalc['mc20e'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data18_13TeV/20190318/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root']
170PRWLumiCalc['mc23a'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data22_13p6TeV/20250321/ilumicalc_histograms_None_431810-440613_OflLumi-Run3-004.root']
171PRWLumiCalc['mc23d'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data23_13p6TeV/20250321/ilumicalc_histograms_None_451587-456749_OflLumi-Run3-004.root']
172PRWLumiCalc['mc23e'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data24_13p6TeV/20260127/ilumicalc_histograms_None_473235-486706_OflLumi-Run3-008.root']
173PRWLumiCalc['mc23g'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data25_13p6TeV/20260129/ilumicalc_histograms_None_497924-509849_OflLumi-Run3-006.root']
174
175config.SUSYTools.PRWLumiCalcFiles = PRWLumiCalc[mcCampaign]
176
177if options.grl: config.GRLFiles = options.grl.split(',')
178if options.maxEvtsManual: config.maxEvts = options.maxEvtsManual
179
180# submit
181job.algsAdd( config )
182if options.driver == 'direct':
183 # Run the job using the direct driver.
184 driver = ROOT.EL.DirectDriver()
185 if not options.dryrun:
186 driver.submit( job, options.submission_dir )
187elif options.driver == 'grid':
188 driver = ROOT.EL.PrunDriver()
189 submitFlags = ['--addNthFieldOfInDSToLFN=2,6']
190 if options.submitFlags: submitFlags += [options.submitFlags]
191 if not options.gridTag: options.gridTag = date.today().strftime('%y%m%d')
192 outName = 'user.%s.%%in:name[1]%%.%%in:name[2]%%.%%in:name[3]%%.STAlg_%s'%(os.environ['USER'],options.gridTag)
193 driver.options().setString("nc_outputSampleName", outName );
194 driver.options().setString("nc_EventLoop_SubmitFlags", ' '.join(submitFlags))
195 driver.options().setDouble(ROOT.EL.Job.optGridMergeOutput, 0)
196 if not options.dryrun:
197 if options.express: driver.options().setDouble(ROOT.EL.Job.optGridExpress, 1)
198 driver.submitOnly( job, options.submission_dir )
void print(char *figname, TCanvas *c1)
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:312
void scan(TDirectory *td=0, int depth=0)
Definition listroot.cxx:440