ATLAS Offline Software
Loading...
Searching...
No Matches
PURW_create_mc_default_profile.py
Go to the documentation of this file.
1#!/usr/bin/env python
2# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3
4import argparse
5import os
6import sys
7import ROOT
8
9if __name__== '__main__':
10
11 parser = argparse.ArgumentParser(description='Create a default config file for a specific mu profile file')
12 parser.add_argument('--outfile', type=str,
13 help='Output file for PURW tool (default: purw.root)',
14 default='purw.root')
15 parser.add_argument('--lcRunNum',type=int,default=0,help="if specified, create a matching dummy lumicalc file")
16 parser.add_argument('profileFile', type=str,help="name of the config file - will automatically obtain with get_files")
17
18
19
20 args = parser.parse_args()
21
22 if not os.path.exists(args.profileFile):
23 os.system("get_files {}".format(args.profileFile))
24 if not os.path.exists(args.profileFile):
25 print("Could not obtain profile file:",args.profileFile)
26 sys.exit(1)
27
28 RunDMC_testing_configuration = True
29 def include(s) : return
30 exec(open(args.profileFile).read())
31
32 if "JobMaker" not in dir():
33 print("Could not find mu profile in",args.profileFile)
34 sys.exit(1)
35
36 tool = ROOT.CP.TPileupReweighting("tool")
37 tool.UsePeriodConfig("Run2")
38 # decide binning based on if first mu is half int or not (override Run2 default)
39 if (JobMaker[0]["mu"] * 2) % 2 == 1:
40 tool.SetUniformBinning(100,0,100) # half-integer mu values so use this binning
41 else:
42 tool.SetUniformBinning(100,-0.5,99.5)
43
44 for d in JobMaker:
45 # d is a dict, want run, evts, and mu
46 tool.Fill(d['run'],0,d['evts'],d['mu'])
47
48 tool.WriteToFile(args.outfile)
49
50 if args.lcRunNum > 0:
51 # create a dummy lumicalc file too
52 f = ROOT.TFile(f"dummy.lumicalc.{args.lcRunNum}.root","RECREATE")
53 t = ROOT.TTree("LumiMetaData","LumiMetaData")
54 from array import array
55 RunNbr = array('I',[args.lcRunNum]) # unsigned int
56 AvergeInteractionPerXing = array('f',[0.])
57 IntLumi = array('f',[0.])
58 LBStart = array('I',[0])
59 t.Branch("RunNbr",RunNbr,"RunNbr/i")
60 t.Branch("AvergeInteractionPerXing",AvergeInteractionPerXing,"AvergeInteractionPerXing/F")
61 t.Branch("IntLumi",IntLumi,"IntLumi/F")
62 t.Branch("LBStart",LBStart,"LBStart/i")
63 for d in JobMaker:
64 IntLumi[0] = d['evts']
65 AvergeInteractionPerXing[0] = d['mu']
66 t.Fill()
67 t.Write()
68 f.Close()
69
70 print("Testing the files",args.outfile,f.GetName())
71 ROOT.AAH() # makes possible to use ToolHandles
72 testTool = ROOT.ToolHandle['CP::IPileupReweightingTool']("CP::PileupReweightingTool/tool")
73 ROOT.AAH.setProperty(testTool,"ConfigFiles",f"['{args.outfile}']")
74 ROOT.AAH.setProperty(testTool,"LumiCalcFiles",f"['{f.GetName()}']")
75 # must also 'reset' the following properties that have become equal to run2-analysis specific defaults
76 ROOT.AAH.setProperty(testTool,"PeriodAssignments","[]")
77 ROOT.AAH.setProperty(testTool,"DataScaleFactor","1")
78 testTool.retrieve()
79
80 for d in JobMaker:
81 weight = testTool.expert().GetCombinedWeight(d['run'],45,d['mu'])
82 if abs(weight - 1.)>1e-9:
83 print("Unexpected pileup weight",weight,"for mu=",d['mu'])
84 sys.exit(-1)
85 rrn = testTool.expert().GetRandomRunNumber(d['run'],d['mu'])
86 if rrn != args.lcRunNum:
87 print("Unexpected random run number",rrn)
88 sys.exit(-1)
89
90 print("Test passed")
91
92
void print(char *figname, TCanvas *c1)
STL class.
IovVectorMap_t read(const Folder &theFolder, const SelectionCriterion &choice, const unsigned int limit=10)