ATLAS Offline Software
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.
5 import sys
6 import optparse
7 from glob import glob
8 from datetime import date
9 
10 #import AthenaPoolCnvSvc.ReadAthenaPool #read xAOD files
11 
12 parser = optparse.OptionParser()
13 #
14 parser.add_option('--driver', dest = 'driver', choices = ['direct','grid','lxplus'], default = 'direct')
15 parser.add_option('--gridTag', dest = 'gridTag')
16 parser.add_option('--submitFlags', dest = 'submitFlags')
17 parser.add_option('--express', dest = 'express', default = False, action = 'store_true' )
18 parser.add_option('-n', '--dryrun', dest = 'dryrun', default=False, action = 'store_true' )
19 #
20 parser.add_option('--log-level', dest = 'log_level', default = 'INFO', choices = ['ALWAYS','FATAL','ERROR','WARNING','INFO','DEBUG','VERBOSE'])
21 parser.add_option('--dosyst', dest = 'dosyst', default = False, action = 'store_true')
22 parser.add_option( '-s', '--submission-dir', dest = 'submission_dir', default = 'submitDir', help = 'Submission directory for EventLoop' )
23 parser.add_option('-t', '--type', dest = 'type', default = 'mc20e', help = 'Job type. (mc20a, mc20d, mc20e, mc21a, mc23a, data18, data22, data23)', choices = ['mc20a', 'mc20d', 'mc20e', 'mc21a', 'mc23a', 'data18', 'data22','data23'])
24 parser.add_option('--AF', dest = 'AF', default = False, action = 'store_true' )
25 parser.add_option('-d', '--daod', dest = 'daod', type = 'int', default = 0, help = 'input DAOD type. Do not specify for xAOD input' )
26 parser.add_option('-f', '--flav', dest = 'flav', default = 'PHYS', help = 'input DAOD flavour' )
27 parser.add_option('-m', '--maxEvts', dest = 'maxEvts', type = 'int', default = -1, help = 'Max events (-1 is all)' )
28 parser.add_option('-M', '--maxEvtsManual', dest = 'maxEvtsManual', type = 'int')
29 parser.add_option('-p', '--ptag', dest = 'ptag', default = 'p5855', help = 'ptag' )
30 parser.add_option('--grl', dest = 'grl')
31 parser.add_option('--inputDir', dest = 'inputDir')
32 parser.add_option('--inputFile', dest = 'inputFile')
33 parser.add_option('--inputGrid', dest = 'inputGrid')
34 parser.add_option('--inputXRD', dest = 'inputXRD')
35 parser.add_option('--overwrite', dest = 'overwrite', default = False, action = 'store_true' )
36 ( options, args ) = parser.parse_args()
37 print("Configured input data ptag: %s"%(options.ptag))
38 ptageqdata = {'p5511':'p5514','p5631':'p5632','p5737':'p5740','p5855':'p5858'}
39 if 'data2' in options.type and options.ptag in ptageqdata:
40  options.ptag = ptageqdata[options.ptag]
41  print("Overriding ptag to equivalent data ptag: -> %s"%(options.ptag))
42 print("Configured input data type: %s"%(options.type))
43 print("Configured input data DAOD flavour: %s"%('SUSY%d'%options.daod if options.daod>0 else options.flav))
44 print("Configured input data sim type: %s"%('FullSim' if not options.AF else 'AF'))
45 
46 # Set up (Py)ROOT.
47 import ROOT
48 ROOT.xAOD.Init().ignore()
49 
50 # for logging
51 outputlvl = {'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}
52 
53 # Set up the sample handler object. See comments from the C++ macro
54 # for the details about these lines.
55 import os
56 sh = ROOT.SH.SampleHandler()
57 sh.setMetaString( 'nc_tree', 'CollectionTree' )
58 
59 import shutil
60 if options.overwrite and os.path.exists(options.submission_dir): shutil.rmtree(options.submission_dir)
61 
62 # set up file sources
63 cvmfsInputArea = [
64 '/cvmfs/atlas-nightlies.cern.ch/repo/data/data-art/SUSYTools/',
65 '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/dev/SUSYTools/ART/ARTInput/',
66 ]
67 inputFiles = {}
68 inputFiles['mc20e'] = 'mc20_13TeV.410470.FS_mc20e_%s.%s.pool.root'%(options.ptag,options.flav)
69 inputFiles['mc21a'] = 'mc21_13p6TeV.601229.FS_mc21a_%s.%s.pool.root'%(options.ptag,options.flav)
70 inputFiles['mc23a'] = 'mc23_13p6TeV.601229.FS_mc23a_%s.%s.pool.root'%(options.ptag,options.flav)
71 inputFiles['data18'] = 'data18_13TeV.00356250_%s.%s.pool.root'%(options.ptag,options.flav)
72 inputFiles['data22'] = 'data22_13p6TeV.00440543_%s.%s.pool.root'%(options.ptag,options.flav)
73 inputFiles['data23'] = 'data23_13p6TeV.00456314_%s.%s.pool.root'%(options.ptag,options.flav)
74 if options.daod == 0 and not '%s%s'%(options.type,'_AF' if options.AF else '') in inputFiles: sys.exit('No input file configured for type %s%s. Exiting.'%(options.type,'_AF' if options.AF else ''))
75 
76 inputDir = ''
77 inputFile = ''
78 
79 # configure test type
80 if options.inputXRD:
81  print("Using inputXRD: ",options.inputXRD)
82  pref,server,fname = options.inputXrootd.plit('//')
83  dl = ROOT.SH.DiskListXRD(server,fname)
84  ROOT.SH.ScanDir().scan(sh,dl)
85 elif options.inputGrid:
86  print("Using inputGrid: ",options.inputGrid)
87  dsname = options.inputGrid.split(':')[-1].rstrip() # drop scope if present, and not trailing spaces
88  ROOT.SH.addGrid(sh,dsname)
89 else:
90  if options.daod == 0:
91  inputDir = cvmfsInputArea[0]
92  ifile = options.type + ('_AF' if options.AF else '')
93  inputFile = inputFiles[ifile] if ifile in inputFiles else ''
94  else:
95  inputDir = cvmfsInputArea[1]
96  inputFile = 'DAOD_%s%s%s.%s.art.merge.root'%(options.type,'%s%d'%(options.flav,options.daod) if options.flav=='SUSY' else options.flav,'AF' if options.AF else '',options.ptag)
97 
98  if options.inputDir: inputDir = options.inputDir
99  if options.inputFile: inputFile = options.inputFile
100 
101  print("Using inputDir: ",inputDir)
102  print("Using inputFile:",inputFile)
103  ROOT.SH.ScanDir().filePattern(inputFile).scan(sh, inputDir)
104 sh.printContent()
105 
106 # Create an EventLoop job.
107 job = ROOT.EL.Job()
108 job.sampleHandler( sh )
109 job.options().setDouble( ROOT.EL.Job.optMaxEvents, options.maxEvts )
110 
111 # Create the algorithm's configuration. Note that we'll be able to add
112 # algorithm property settings here later on.
113 from AnaAlgorithm.AnaAlgorithmConfig import AnaAlgorithmConfig
114 config = AnaAlgorithmConfig( 'SUSYToolsAlg' )
115 config.addPrivateTool("SUSYTools","ST::SUSYObjDef_xAOD")
116 
117 config.SUSYTools.ConfigFile = "SUSYTools/SUSYTools_Default.conf"
118 if ("data2" in options.type or "mc21" in options.type or "mc23" in options.type): config.SUSYTools.ConfigFile = "SUSYTools/SUSYTools_Default_Run3.conf"
119 if ("data" not in options.type): config.DoSyst = options.dosyst
120 config.SUSYTools.DataSource = 1
121 config.OutputLevel = outputlvl[options.log_level]
122 config.SUSYTools.OutputLevel = outputlvl[options.log_level]
123 config.SUSYTools.PRWLumiCalcFiles = []
124 config.SUSYTools.AutoconfigurePRWTool = True
125 config.SUSYTools.PRWUseCommonMCFiles = True
126 if options.flav == "PHYSLITE":
127  print("Running on PHYSLITE : ", inputFile)
128  STconfig_lite = str(config.SUSYTools.ConfigFile).replace(".conf","_LITE.conf")
129  config.SUSYTools.ConfigFile = STconfig_lite
130  config.SUSYTools.IsPHYSLITE = True
131 
132 # set datasource if AtlasFastII or 3
133 if options.AF:
134  config.SUSYTools.DataSource = 2
135 
136 # set mcCampaign
137 if 'mc' in options.type:
138  mcCampaign = options.type
139  config.SUSYTools.mcCampaign = options.type
140 elif options.type == 'data18':
141  mcCampaign = 'mc20e'
142  config.SUSYTools.mcCampaign = options.type
143  config.SUSYTools.DataSource = 0
144 elif options.type == 'data22':
145  mcCampaign = 'mc23a'
146  config.SUSYTools.mcCampaign = options.type
147  config.SUSYTools.DataSource = 0
148 elif options.type == 'data23':
149  mcCampaign = 'mc23c'
150  config.SUSYTools.mcCampaign = options.type
151  config.SUSYTools.DataSource = 0
152 
153 
154 # set lumicalc info
155 PRWLumiCalc = {}
156 PRWLumiCalc['mc20a'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data16_13TeV/20180129/PHYS_StandardGRL_All_Good_25ns_297730-311481_OflLumi-13TeV-009.root',
157  '/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data15_13TeV/20170619/PHYS_StandardGRL_All_Good_25ns_276262-284484_OflLumi-13TeV-008.root']
158 PRWLumiCalc['mc20d'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data17_13TeV/20180619/physics_25ns_Triggerno17e33prim.lumicalc.OflLumi-13TeV-010.root']
159 PRWLumiCalc['mc20e'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data18_13TeV/20190318/ilumicalc_histograms_None_348885-364292_OflLumi-13TeV-010.root']
160 PRWLumiCalc['mc21a'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data22_13p6TeV/20220820/ilumicalc_histograms_None_427882-428855_OflLumi-Run3-001.root']
161 PRWLumiCalc['mc23a'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data22_13p6TeV/20220820/ilumicalc_histograms_None_427882-428855_OflLumi-Run3-001.root']
162 PRWLumiCalc['mc23c'] = ['/cvmfs/atlas.cern.ch/repo/sw/database/GroupData/GoodRunsLists/data23_13p6TeV/20230828/ilumicalc_histograms_None_451587-456749_OflLumi-Run3-003.root']
163 
164 config.SUSYTools.PRWLumiCalcFiles = PRWLumiCalc[mcCampaign]
165 
166 if options.grl: config.GRLFiles = options.grl.split(',')
167 if options.maxEvtsManual: config.maxEvts = options.maxEvtsManual
168 
169 # submit
170 job.algsAdd( config )
171 if options.driver == 'direct':
172  # Run the job using the direct driver.
173  driver = ROOT.EL.DirectDriver()
174  if not options.dryrun:
175  driver.submit( job, options.submission_dir )
176 elif options.driver == 'grid':
177  driver = ROOT.EL.PrunDriver()
178  submitFlags = ['--addNthFieldOfInDSToLFN=2,6']
179  if options.submitFlags: submitFlags += [options.submitFlags]
180  if not options.gridTag: options.gridTag = date.today().strftime('%y%m%d')
181  outName = 'user.%s.%%in:name[1]%%.%%in:name[2]%%.%%in:name[3]%%.STAlg_%s'%(os.environ['USER'],options.gridTag)
182  driver.options().setString("nc_outputSampleName", outName );
183  driver.options().setString("nc_EventLoop_SubmitFlags", ' '.join(submitFlags))
184  driver.options().setDouble(ROOT.EL.Job.optGridMergeOutput, 0)
185  if not options.dryrun:
186  if options.express: driver.options().setDouble(ROOT.EL.Job.optGridExpress, 1)
187  driver.submitOnly( job, options.submission_dir )
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:54
test_AnalysisBaseEventLoopJob.filePattern
string filePattern
Definition: test_AnalysisBaseEventLoopJob.py:17
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
scan
void scan(TDirectory *td=0, int depth=0)
Definition: listroot.cxx:440
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
str
Definition: BTagTrackIpAccessor.cxx:11