ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/RateMonShiftTool_dev/DatabaseRatePredictor.py
Revision: 1.92
Committed: Wed Dec 5 09:52:04 2012 UTC (12 years, 4 months ago) by awoodard
Content type: text/x-python
Branch: MAIN
Changes since 1.91: +8 -6 lines
Log Message:
don't allow negative predictions

File Contents

# User Rev Content
1 grchrist 1.3 #!/usr/bin/env python
2    
3 abrinke1 1.1 from DatabaseParser import *
4 abrinke1 1.5 from GetListOfRuns import *
5 abrinke1 1.1 import sys
6     import os
7     from numpy import *
8     import pickle
9 amott 1.18 import getopt
10 awoodard 1.47 from StreamMonitor import StreamMonitor
11 awoodard 1.72 from itertools import groupby
12     from operator import itemgetter
13 grchrist 1.78 from collections import deque
14 grchrist 1.29
15 abrinke1 1.1 from ROOT import gROOT, TCanvas, TF1, TGraph, TGraphErrors, TPaveStats, gPad, gStyle
16 amott 1.18 from ROOT import TFile, TPaveText, TBrowser
17 abrinke1 1.1 from ROOT import gBenchmark
18     import array
19     import math
20 grchrist 1.8 from ReadConfig import RateMonConfig
21 muell149 1.46 from TablePrint import *
22 abrinke1 1.5 from selectionParser import selectionParser
23    
24 amott 1.18 def usage():
25     print sys.argv[0]+" [options] <list of runs>"
26     print "This script is used to generate fits and do secondary shifter validation"
27     print "<list of runs> this is a list of the form: a b c-d e f-g, specifying individual runs and/or run ranges"
28     print " be careful with using ranges (c-d), it is highly recommended to use a JSON in this case"
29     print "options: "
30     print "--makeFits run in fit making mode"
31     print "--secondary run in secondary shifter mode"
32 grchrist 1.28 print "--TMD put in TMD predictions"
33 amott 1.18 print "--fitFile=<path> path to the fit file"
34     print "--json=<path> path to the JSON file"
35     print "--TriggerList=<path> path to the trigger list (without versions!)"
36 grchrist 1.26 print "--maxdt=<max deadtime> Mask LS above max deadtime threshold"
37     print "--All Mask LS with any red LS on WBM LS page (not inc castor zdc etc)"
38     print "--Mu Mask LS with Mu off"
39     print "--HCal Mask LS with HCal barrel off"
40     print "--Tracker Mask LS with Tracker barrel off"
41     print "--ECal Mask LS with ECal barrel off"
42     print "--EndCap Mask LS with EndCap sys off, used in combination with other subsys"
43     print "--Beam Mask LS with Beam off"
44 grchrist 1.34 print "--NoVersion Ignore version numbers"
45 grchrist 1.35 print "--linear Force Linear fits"
46 grchrist 1.38 print "--inst Fits using inst not delivered"
47     print "--TMDerr Use errors from TMD predictions"
48 muell149 1.46 print "--write Writes fit info into csv, for ranking nonlinear triggers"
49 awoodard 1.50 print "--AllTriggers Run for all triggers instead of specifying a trigger list"
50 muell149 1.46
51 amott 1.18 class Modes:
52 grchrist 1.29 none,fits,secondary = range(3)
53    
54     def pickYear():
55     global thisyear
56 grchrist 1.32 thisyear="2012"
57 grchrist 1.29 print "Year set to ",thisyear
58    
59 abrinke1 1.1 def main():
60 awoodard 1.83 gROOT.SetBatch(True)
61 amott 1.18 try:
62 grchrist 1.32 ##set year to 2012
63 grchrist 1.29 pickYear()
64 awoodard 1.47
65 grchrist 1.22 try:
66 grchrist 1.61 opt, args = getopt.getopt(sys.argv[1:],"",["makeFits","secondary","fitFile=","json=","TriggerList=","maxdt=","All","Mu","HCal","Tracker","ECal","EndCap","Beam","NoVersion","linear","inst","TMDerr","write","AllTriggers","UsePSCol="])
67 grchrist 1.22
68     except getopt.GetoptError, err:
69     print str(err)
70     usage()
71     sys.exit(2)
72    
73 grchrist 1.25 ##### RUN LIST ########
74 grchrist 1.22 run_list=[]
75 grchrist 1.23
76 grchrist 1.22 if len(args)<1:
77     inputrunlist=[]
78     print "No runs specified"
79     runinput=raw_input("Enter run range in form <run1> <run2> <run3> or <run1>-<run2>:")
80     inputrunlist.append(runinput)
81    
82     if runinput.find(' ')!=-1:
83     args=runinput.split(' ')
84     else:
85     args.append(runinput)
86    
87     for r in args:
88     if r.find('-')!=-1: # r is a run range
89     rrange = r.split('-')
90     if len(rrange)!=2:
91     print "Invalid run range %s" % (r,)
92     sys.exit(0)
93     try:
94     for rr in range(int(rrange[0]),int(rrange[1])+1):
95     run_list.append(rr)
96     except:
97     print "Invalid run range %s" % (r,)
98     sys.exit(0)
99     else: # r is not a run range
100     try:
101     run_list.append(int(r))
102     except:
103     print "Invalid run %s" % (r,)
104 grchrist 1.21
105 grchrist 1.25 ##### READ CMD LINE ARGS #########
106 grchrist 1.22 mode = Modes.none
107     fitFile = ""
108     jsonfile = ""
109     trig_list = []
110 grchrist 1.25 max_dt=-1.0
111     subsys=-1.0
112 grchrist 1.61 NoVersion=True
113 grchrist 1.35 linear=False
114 grchrist 1.38 do_inst=False
115     TMDerr=False
116 muell149 1.46 wp_bool=False
117 grchrist 1.59 all_triggers=False
118 abrinke1 1.85 DoL1=True
119 grchrist 1.61 UsePSCol=-1
120 grchrist 1.25 SubSystemOff={'All':False,'Mu':False,'HCal':False,'ECal':False,'Tracker':False,'EndCap':False,'Beam':False}
121 grchrist 1.22 for o,a in opt:
122     if o == "--makeFits":
123     mode = Modes.fits
124     elif o == "--secondary":
125     mode = Modes.secondary
126     elif o == "--fitFile":
127     fitFile = str(a)
128     elif o == "--json":
129     jsonfile = a
130 grchrist 1.26 elif o=="--maxdt":
131     max_dt = float(a)
132 grchrist 1.25 elif o=="--All":
133     subsys=1
134     SubSystemOff["All"]=True
135     elif o=="--Mu":
136     subsys=1
137     SubSystemOff["Mu"]=True
138     elif o=="--HCal":
139     SubSystemOff["HCal"]=True
140     subsys=1
141     elif o=="--Tracker":
142     SubSystemOff["Tracker"]=True
143     subsys=1
144 grchrist 1.26 elif o=="--ECal":
145     SubSystemOff["ECal"]=True
146     subsys=1
147 grchrist 1.25 elif o=="--EndCap":
148     SubSystemOff["EndCap"]=True
149     subsys=1
150     elif o=="--Beam":
151     SubSystemOff["Beam"]=True
152     subsys=1
153 grchrist 1.34 elif o=="--NoVersion":
154     NoVersion=True
155 grchrist 1.35 elif o=="--linear":
156     linear=True
157 grchrist 1.38 elif o=="--inst":
158     do_inst=True
159     elif o=="--TMDerr":
160     TMDerr=True
161 muell149 1.46 elif o=="--write":
162     wp_bool=True
163 awoodard 1.50 elif o=="--AllTriggers":
164 grchrist 1.61 all_triggers=True
165     elif o=="--UsePSCol":
166     UsePSCol=int(a)
167 grchrist 1.22 elif o == "--TriggerList":
168     try:
169     f = open(a)
170     for entry in f:
171     if entry.startswith('#'):
172     continue
173     if entry.find(':')!=-1:
174     entry = entry[:entry.find(':')] ## We can point this to the existing monitor list, just remove everything after ':'!
175     if entry.find('#')!=-1:
176     entry = entry[:entry.find('#')] ## We can point this to the existing monitor list, just remove everything after ':'!
177     trig_list.append( entry.rstrip('\n'))
178     except:
179     print "\nInvalid Trigger List\n"
180     sys.exit(0)
181     else:
182     print "\nInvalid Option %s\n" % (str(o),)
183     usage()
184     sys.exit(2)
185    
186     print "\n\n"
187 grchrist 1.25 ###### MODES #########
188    
189 grchrist 1.22 if mode == Modes.none: ## no mode specified
190     print "\nNo operation mode specified!\n"
191     modeinput=raw_input("Enter mode, --makeFits or --secondary:")
192     print "modeinput=",modeinput
193     if not (modeinput=="--makeFits" or modeinput=="--secondary"):
194     print "not either"
195     usage()
196 amott 1.18 sys.exit(0)
197 grchrist 1.22 elif modeinput == "--makeFits":
198     mode=Modes.fits
199     elif modeinput =="--secondary":
200     mode=Modes.secondary
201     else:
202     print "FATAL ERROR: No Mode specified"
203 amott 1.18 sys.exit(0)
204 grchrist 1.22
205     if mode == Modes.fits:
206     print "Running in Fit Making mode\n\n"
207     elif mode == Modes.secondary:
208     print "Running in Secondary Shifter mode\n\n"
209     else: ## should never get here, but exit if we do
210 grchrist 1.21 print "FATAL ERROR: No Mode specified"
211     sys.exit(0)
212 grchrist 1.22
213     if fitFile=="" and not mode==Modes.fits:
214     print "\nPlease specify fit file. These are available:\n"
215 grchrist 1.29 path="Fits/%s/" % (thisyear) # insert the path to the directory of interest
216 grchrist 1.22 dirList=os.listdir(path)
217     for fname in dirList:
218     print fname
219 grchrist 1.24 fitFile = path+raw_input("Enter fit file in format Fit_HLT_10LS_Run176023to180252.pkl: ")
220    
221 grchrist 1.22 elif fitFile=="":
222 grchrist 1.39 NoVstr=""
223     if NoVersion:
224     NoVstr="NoV_"
225 grchrist 1.38 if not do_inst:
226 grchrist 1.39 fitFile="Fits/%s/Fit_HLT_%s10LS_Run%sto%s.pkl" % (thisyear,NoVstr,min(run_list),max(run_list))
227 grchrist 1.38 else:
228 grchrist 1.39 fitFile="Fits/%s/Fit_inst_HLT_%s10LS_Run%sto%s.pkl" % (thisyear,NoVstr,min(run_list),max(run_list))
229 grchrist 1.26
230 grchrist 1.39 if "NoV" in fitFile:
231     NoVersion=True
232 grchrist 1.25
233     ###### TRIGGER LIST #######
234 grchrist 1.24
235 awoodard 1.50 if trig_list == [] and not all_triggers:
236 grchrist 1.22
237     print "\nPlease specify list of triggers\n"
238     print "Available lists are:"
239     dirList=os.listdir(".")
240     for fname in dirList:
241     entry=fname
242     if entry.find('.')!=-1:
243     extension = entry[entry.find('.'):] ## We can point this to the existing monitor list, just remove everything after ':'!
244     if extension==".list":
245     print fname
246 grchrist 1.26 trig_input=raw_input("\nEnter triggers in format HLT_IsoMu30_eta2p1 or a .list file: ")
247 grchrist 1.21
248 grchrist 1.22 if trig_input.find('.')!=-1:
249     extension = trig_input[trig_input.find('.'):]
250 grchrist 1.21 if extension==".list":
251 grchrist 1.22 try:
252     fl=open(trig_input)
253     except:
254     print "Cannot open file"
255     usage()
256     sys.exit(0)
257 grchrist 1.21
258 grchrist 1.22 for line in fl:
259     if line.startswith('#'):
260     continue
261     if len(line)<1:
262     continue
263 grchrist 1.21
264 grchrist 1.22 if len(line)>=2:
265     arg=line.rstrip('\n').rstrip(' ').lstrip(' ')
266     trig_list.append(arg)
267     else:
268     arg=''
269     else:
270     trig_list.append(trig_input)
271 grchrist 1.21
272 abrinke1 1.5 ## Can use any combination of LowestRunNumber, HighestRunNumber, and NumberOfRuns -
273     ## just modify "ExistingRuns.sort" and for "run in ExistingRuns" accordingly
274    
275 grchrist 1.22 if jsonfile=="":
276     JSON=[]
277     else:
278     print "Using JSON: %s" % (jsonfile,)
279     JSON = GetJSON(jsonfile) ##Returns array JSON[runs][ls_list]
280 abrinke1 1.5
281 grchrist 1.22 ###### TO CREATE FITS #########
282     if mode == Modes.fits:
283     trig_name = "HLT"
284 grchrist 1.34 num_ls = 10
285 grchrist 1.22 physics_active_psi = True ##Requires that physics and active be on, and that the prescale column is not 0
286     #JSON = [] ##To not use a JSON file, just leave the array empty
287     debug_print = False
288     no_versions=False
289 grchrist 1.34 min_rate = 0.0
290 grchrist 1.22 print_table = False
291     data_clean = True ##Gets rid of anomalous rate points, reqires physics_active_psi (PAP) and deadtime < 20%
292     ##plot_properties = [varX, varY, do_fit, save_root, save_png, fit_file]
293 grchrist 1.38 if not do_inst:
294     plot_properties = [["delivered", "rate", True, True, False, fitFile]]
295 awoodard 1.54 # plot_properties = [["delivered", "rawrate", True, True, False, fitFile]]
296 grchrist 1.38 else:
297     plot_properties = [["inst", "rate", True, True, False, fitFile]]
298 amott 1.18
299 grchrist 1.34 masked_triggers = ["AlCa_", "DST_", "HLT_L1", "HLT_Zero"]
300 grchrist 1.22 save_fits = True
301 grchrist 1.25 if max_dt==-1.0:
302     max_dt=0.08 ## no deadtime cutuse 2.0
303 grchrist 1.22 force_new=True
304     print_info=True
305 grchrist 1.25 if subsys==-1.0:
306     SubSystemOff={'All':False,'Mu':False,'HCal':False,'ECal':False,'Tracker':False,'EndCap':False,'Beam':True}
307 grchrist 1.22
308     ###### TO SEE RATE VS PREDICTION ########
309     if mode == Modes.secondary:
310     trig_name = "HLT"
311     num_ls = 1
312     physics_active_psi = True
313     debug_print = False
314     no_versions=False
315 grchrist 1.34 min_rate = 0.0
316 grchrist 1.22 print_table = False
317     data_clean = True
318     ##plot_properties = [varX, varY, do_fit, save_root, save_png, fit_file]
319 awoodard 1.91 plot_properties = [["ls", "rate", False, True, False,fitFile]]
320 awoodard 1.52 ## rate is calculated as: (measured rate, deadtime corrected) * prescale [prediction not dt corrected]
321     ## rawrate is calculated as: measured rate [prediction is dt corrected]
322 grchrist 1.22
323 grchrist 1.34 masked_triggers = ["AlCa_", "DST_", "HLT_L1", "HLT_Zero"]
324 grchrist 1.22 save_fits = False
325 grchrist 1.25 if max_dt==-1.0:
326     max_dt=2.0 ## no deadtime cut=2.0
327 grchrist 1.22 force_new=True
328     print_info=True
329 grchrist 1.25 if subsys==-1.0:
330     SubSystemOff={'All':True,'Mu':False,'HCal':False,'ECal':False,'Tracker':False,'EndCap':False,'Beam':True}
331 grchrist 1.13
332 grchrist 1.26 for k in SubSystemOff.iterkeys():
333     print k,"=",SubSystemOff[k]," ",
334     print " "
335 grchrist 1.76 L1SeedChangeFit=True
336 grchrist 1.22 ######## END PARAMETERS - CALL FUNCTIONS ##########
337 abrinke1 1.85 #[Rates,LumiPageInfo, L1_trig_list,nps]= GetDBRates(run_list, trig_name, trig_list, num_ls, max_dt, physics_active_psi, JSON, debug_print, force_new, SubSystemOff,NoVersion,all_triggers, DoL1,UsePSCol,L1SeedChangeFit)
338 awoodard 1.84 [Rates, LumiPageInfo, L1_trig_list, nps]= GetDBRates(run_list, trig_name, trig_list, num_ls, max_dt, physics_active_psi, JSON, debug_print, force_new, SubSystemOff, NoVersion, all_triggers, DoL1,UsePSCol,L1SeedChangeFit, save_fits)
339 grchrist 1.59 if DoL1:
340     trig_list=L1_trig_list
341 grchrist 1.78
342     MakePlots(Rates, LumiPageInfo, run_list, trig_name, trig_list, num_ls, min_rate, max_dt, print_table, data_clean, plot_properties, masked_triggers, save_fits, debug_print,SubSystemOff, print_info,NoVersion, linear, do_inst, TMDerr,wp_bool,all_triggers,L1SeedChangeFit,nps)
343 awoodard 1.47
344 grchrist 1.22 except KeyboardInterrupt:
345     print "Wait... come back..."
346 abrinke1 1.1
347 awoodard 1.47
348 abrinke1 1.85 #def GetDBRates(run_list,trig_name,trig_list, num_ls, max_dt, physics_active_psi,JSON,debug_print, force_new, SubSystemOff,NoVersion,all_triggers, DoL1,UsePSCol,L1SeedChangeFit):
349 awoodard 1.84 def GetDBRates(run_list, trig_name, trig_list, num_ls, max_dt, physics_active_psi, JSON, debug_print, force_new, SubSystemOff, NoVersion, all_triggers, DoL1,UsePSCol, L1SeedChangeFit, save_fits):
350 abrinke1 1.1
351     Rates = {}
352 grchrist 1.10 LumiPageInfo={}
353 abrinke1 1.5 ## Save in RefRuns with name dependent on trig_name, num_ls, JSON, and physics_active_psi
354     if JSON:
355 amott 1.18 #print "Using JSON file"
356 abrinke1 1.5 if physics_active_psi:
357 grchrist 1.29 RefRunNameTemplate = "RefRuns/%s/Rates_%s_%sLS_JPAP.pkl"
358 abrinke1 1.5 else:
359 grchrist 1.29 RefRunNameTemplate = "RefRuns/%s/Rates_%s_%sLS_JSON.pkl"
360 abrinke1 1.5 else:
361 grchrist 1.14 print "Using Physics and Active ==1"
362 abrinke1 1.5 if physics_active_psi:
363 grchrist 1.29 RefRunNameTemplate = "RefRuns/%s/Rates_%s_%sLS_PAP.pkl"
364 abrinke1 1.5 else:
365 grchrist 1.29 RefRunNameTemplate = "RefRuns/%s/Rates_%s_%sLS.pkl"
366 grchrist 1.10
367 grchrist 1.29 RefRunFile = RefRunNameTemplate % (thisyear,trig_name,num_ls)
368     RefRunFileHLT = RefRunNameTemplate % (thisyear,"HLT",num_ls)
369 grchrist 1.10
370     print "RefRun=",RefRunFile
371     print "RefRunFileHLT",RefRunFileHLT
372 grchrist 1.11 if not force_new:
373     try: ##Open an existing RefRun file with the same parameters and trigger name
374     pkl_file = open(RefRunFile, 'rb')
375     Rates = pickle.load(pkl_file)
376     pkl_file.close()
377     os.remove(RefRunFile)
378     print "using",RefRunFile
379    
380 abrinke1 1.5 except:
381 grchrist 1.11 try: ##Open an existing RefRun file with the same parameters and HLT for trigger name
382     pkl_file = open(RefRunFileHLT)
383     HLTRates = pickle.load(pkl_file)
384     for key in HLTRates:
385     if trig_name in str(key):
386     Rates[key] = HLTRates[key]
387     #print str(RefRunFile)+" does not exist. Creating ..."
388     except:
389     print str(RefRunFile)+" does not exist. Creating ..."
390 grchrist 1.10
391     ## try the lumis file
392 grchrist 1.29 RefLumiNameTemplate = "RefRuns/%s/Lumis_%s_%sLS.pkl"
393     RefLumiFile= RefLumiNameTemplate % (thisyear,"HLT",num_ls)
394 grchrist 1.11 if not force_new:
395     try:
396     pkl_lumi_file = open(RefLumiFile, 'rb')
397     LumiPageInfo = pickle.load(pkl_lumi_file)
398     pkl_lumi_file.close()
399     os.remove(RefLumiFile)
400     print "using",RefLumiFile
401     except:
402     print str(RefLumiFile)+" doesn't exist. Make it..."
403 grchrist 1.34
404     trig_list_noV=[]
405     for trigs in trig_list:
406     trig_list_noV.append(StripVersion(trigs))
407 grchrist 1.40
408 grchrist 1.34 if NoVersion:
409     trig_list=trig_list_noV
410    
411 abrinke1 1.5 for RefRunNum in run_list:
412     if JSON:
413     if not RefRunNum in JSON:
414     continue
415 awoodard 1.47 try:
416 abrinke1 1.1 ExistsAlready = False
417     for key in Rates:
418     if RefRunNum in Rates[key]["run"]:
419     ExistsAlready = True
420     break
421 grchrist 1.10
422     LumiExistsLAready=False
423     for v in LumiPageInfo.itervalues():
424     if RefRunNum == v["Run"]:
425     LumiExistsAlready=True
426     break
427     if ExistsAlready and LumiExistsAlready:
428 abrinke1 1.1 continue
429 grchrist 1.10
430 abrinke1 1.1 except:
431     print "Getting info for run "+str(RefRunNum)
432    
433     if RefRunNum < 1:
434     continue
435 grchrist 1.30 ColRunNum,isCol,isGood = GetLatestRunNumber(RefRunNum)
436     if not isGood:
437     print "Run ",RefRunNum, " is not Collisions"
438    
439     continue
440 awoodard 1.50
441 grchrist 1.26 if not isCol:
442     print "Run ",RefRunNum, " is not Collisions"
443    
444     continue
445    
446 grchrist 1.17 print "calculating rates and green lumis for run ",RefRunNum
447 grchrist 1.73
448 abrinke1 1.5 if True: ##Placeholder
449 abrinke1 1.1 if True: #May replace with "try" - for now it's good to know when problems happen
450     RefParser = DatabaseParser()
451     RefParser.RunNumber = RefRunNum
452     RefParser.ParseRunSetup()
453 abrinke1 1.5 RefLumiRangePhysicsActive = RefParser.GetLSRange(1,9999) ##Gets array of all LS with physics and active on
454     RefLumiArray = RefParser.GetLumiInfo() ##Gets array of all existing LS and their lumi info
455 abrinke1 1.2 RefLumiRange = []
456 grchrist 1.17 RefMoreLumiArray = RefParser.GetMoreLumiInfo()#dict with keys as bits from lumisections WBM page and values are dicts with key=LS:value=bit
457 grchrist 1.73 L1HLTseeds=RefParser.GetL1HLTseeds()
458     HLTL1PS=RefParser.GetL1PSbyseed()
459 grchrist 1.81 ###Add all triggers to list if all trigger
460     try:
461     TriggerRatesCheck = RefParser.GetHLTRates([1])##just grab from 1st LS
462     except:
463     print "ERROR: unable to get HLT triggers for this run"
464     exit(2)
465     for HLTkey in TriggerRatesCheck:
466     if NoVersion:
467     name = StripVersion(HLTkey)
468     else:
469     name=HLTkey
470     if not name in trig_list:
471     if all_triggers:
472     trig_list.append(name)
473    
474     ###add L1 triggers to list if Do L1
475 grchrist 1.59 if DoL1:
476 grchrist 1.73
477 grchrist 1.59 for HLTkey in trig_list:
478     #print name
479 abrinke1 1.85 # if "L1" in HLTkey:
480     # continue
481     if not HLTkey.startswith('HLT'):
482 grchrist 1.59 continue
483     else:
484     try:
485     for L1seed in L1HLTseeds[HLTkey]:
486     if L1seed not in trig_list:
487     trig_list.append(L1seed)
488     except:
489 abrinke1 1.85 print "Failed on trigger "+str(HLTkey)
490 grchrist 1.59 pass
491 abrinke1 1.5 for iterator in RefLumiArray[0]: ##Makes array of LS with proper PAP and JSON properties
492 grchrist 1.11 ##cheap way of getting PSCol None-->0
493 amott 1.18 if RefLumiArray[0][iterator] not in range(1,9):
494 grchrist 1.11 RefLumiArray[0][iterator]=0
495 grchrist 1.15
496 grchrist 1.61 if not UsePSCol==-1:
497     if not RefLumiArray[0][iterator]==UsePSCol:
498     print "skipping LS",iterator
499     continue
500    
501 grchrist 1.17 if not physics_active_psi or (RefLumiArray[5][iterator] == 1 and RefLumiArray[6][iterator] == 1 and RefMoreLumiArray["b1pres"][iterator]==1 and RefMoreLumiArray["b2pres"][iterator]==1 and RefMoreLumiArray["b1stab"][iterator] and RefMoreLumiArray["b2stab"][iterator]==1):
502 abrinke1 1.5 if not JSON or RefRunNum in JSON:
503     if not JSON or iterator in JSON[RefRunNum]:
504     RefLumiRange.append(iterator)
505 grchrist 1.9
506 abrinke1 1.5 try:
507     nls = RefLumiRange[0]
508     LSRange = {}
509     except:
510     print "Run "+str(RefRunNum)+" has no good LS"
511     continue
512     if num_ls > len(RefLumiRange):
513 abrinke1 1.1 print "Run "+str(RefRunNum)+" is too short: from "+str(nls)+" to "+str(RefLumiRange[-1])+", while num_ls = "+str(num_ls)
514     continue
515 abrinke1 1.85 while nls < RefLumiRange[-1]-num_ls:
516 abrinke1 1.5 LSRange[nls] = []
517     counter = 0
518     for iterator in RefLumiRange:
519     if iterator >= nls and counter < num_ls:
520     LSRange[nls].append(iterator)
521     counter += 1
522 abrinke1 1.85 nls = LSRange[nls][-1]+1
523     [HLTL1_seedchanges,nps]=checkL1seedChangeALLPScols(trig_list,HLTL1PS) #for L1prescale changes
524    
525 grchrist 1.81
526 grchrist 1.80 #print HLTL1_seedchanges
527     #print "nps=",nps
528 grchrist 1.17 #print "Run "+str(RefRunNum)+" contains LS from "+str(min(LSRange))+" to "+str(max(LSRange))
529 grchrist 1.8 for nls in sorted(LSRange.iterkeys()):
530 abrinke1 1.1 TriggerRates = RefParser.GetHLTRates(LSRange[nls])
531 grchrist 1.59 #L1Rate=RefParser.GetDeadTimeBeamActive(LSRange[nls])
532 awoodard 1.47
533     ## Clumsy way to append Stream A. Should choose correct method for calculating stream a based on ps column used in data taking.
534 grchrist 1.59
535 awoodard 1.57 if ('HLT_Stream_A' in trig_list) or all_triggers:
536     config = RateMonConfig(os.path.abspath(os.path.dirname(sys.argv[0])))
537     config.ReadCFG()
538     stream_mon = StreamMonitor()
539     core_a_rates = stream_mon.getStreamACoreRatesByLS(RefParser,LSRange[nls],config).values()
540     avg_core_a_rate = sum(core_a_rates)/len(LSRange[nls])
541     TriggerRates['HLT_Stream_A'] = [1,1,avg_core_a_rate,avg_core_a_rate]
542 awoodard 1.84 HLTL1_seedchanges["HLT_Stream_A"] = [[ps_col] for ps_col in range(0,nps)]
543 abrinke1 1.85 # dummylist=[]
544     # for pscol in range(0,nps):
545     # doubledummylist=[]
546     # doubledummylist.append(pscol)
547     # dummylist.append(doubledummylist)
548     # HLTL1_seedchanges["HLT_Stream_A"]=dummylist
549 grchrist 1.59
550     if DoL1:
551 abrinke1 1.85 L1RatesALL=RefParser.GetL1RatesALL(LSRange[nls])
552    
553 grchrist 1.59 for L1seed in L1RatesALL.iterkeys():
554 abrinke1 1.85 TriggerRates[L1seed]=L1RatesALL[L1seed]
555 abrinke1 1.5
556     [inst, live, delivered, dead, pscols] = RefParser.GetAvLumiInfo(LSRange[nls])
557 grchrist 1.17 deadtimebeamactive=RefParser.GetDeadTimeBeamActive(LSRange[nls])
558 grchrist 1.59
559 abrinke1 1.2 physics = 1
560     active = 1
561 abrinke1 1.5 psi = 99
562 awoodard 1.84 if save_fits and (max(pscols) != min(pscols)):#kick out points which average over two ps columns if doing running in fit making mode
563     continue
564 abrinke1 1.5 for iterator in LSRange[nls]: ##Gets lowest value of physics, active, and psi in the set of lumisections
565 abrinke1 1.2 if RefLumiArray[5][iterator] == 0:
566     physics = 0
567     if RefLumiArray[6][iterator] == 0:
568     active = 0
569 abrinke1 1.5 if RefLumiArray[0][iterator] < psi:
570     psi = RefLumiArray[0][iterator]
571 abrinke1 1.2
572 abrinke1 1.5 if inst < 0 or live < 0 or delivered < 0:
573     print "Run "+str(RefRunNum)+" LS "+str(nls)+" inst lumi = "+str(inst)+" live lumi = "+str(live)+", delivered = "+str(delivered)+", physics = "+str(physics)+", active = "+str(active)
574 grchrist 1.10
575 awoodard 1.84 LumiPageInfo[nls] = LumiRangeGreens(RefMoreLumiArray,LSRange,nls,RefRunNum,deadtimebeamactive)
576 grchrist 1.10
577 abrinke1 1.1 for key in TriggerRates:
578 abrinke1 1.85
579 grchrist 1.34 if NoVersion:
580     name = StripVersion(key)
581     else:
582     name=key
583 grchrist 1.59
584 grchrist 1.26 if not name in trig_list:
585 abrinke1 1.85 if all_triggers and name.startswith('HLT_Stream_A'):
586     trig_list.append(name) ##Only triggers in trig_list have HLTL1_seedchanges filled
587     else:
588 awoodard 1.50 continue
589 grchrist 1.59
590 abrinke1 1.1 if not Rates.has_key(name):
591     Rates[name] = {}
592     Rates[name]["run"] = []
593     Rates[name]["ls"] = []
594     Rates[name]["ps"] = []
595     Rates[name]["inst_lumi"] = []
596     Rates[name]["live_lumi"] = []
597     Rates[name]["delivered_lumi"] = []
598     Rates[name]["deadtime"] = []
599     Rates[name]["rawrate"] = []
600     Rates[name]["rate"] = []
601     Rates[name]["rawxsec"] = []
602     Rates[name]["xsec"] = []
603 abrinke1 1.2 Rates[name]["physics"] = []
604     Rates[name]["active"] = []
605 abrinke1 1.5 Rates[name]["psi"] = []
606 grchrist 1.75 Rates[name]["L1seedchange"]=[]
607 abrinke1 1.1 [avps, ps, rate, psrate] = TriggerRates[key]
608     Rates[name]["run"].append(RefRunNum)
609     Rates[name]["ls"].append(nls)
610     Rates[name]["ps"].append(ps)
611     Rates[name]["inst_lumi"].append(inst)
612     Rates[name]["live_lumi"].append(live)
613     Rates[name]["delivered_lumi"].append(delivered)
614 grchrist 1.17 Rates[name]["deadtime"].append(deadtimebeamactive)
615 abrinke1 1.1 Rates[name]["rawrate"].append(rate)
616 grchrist 1.75 Rates[name]["L1seedchange"].append(HLTL1_seedchanges[name])
617 abrinke1 1.2 if live == 0:
618 awoodard 1.56 Rates[name]["rate"].append(0.0)
619 abrinke1 1.2 Rates[name]["rawxsec"].append(0.0)
620     Rates[name]["xsec"].append(0.0)
621     else:
622 awoodard 1.56 try:
623     Rates[name]["rate"].append(psrate/(1.0-deadtimebeamactive))
624     except:
625     Rates[name]["rate"].append(0.0)
626 abrinke1 1.2 Rates[name]["rawxsec"].append(rate/live)
627     Rates[name]["xsec"].append(psrate/live)
628     Rates[name]["physics"].append(physics)
629     Rates[name]["active"].append(active)
630 abrinke1 1.5 Rates[name]["psi"].append(psi)
631 grchrist 1.9
632 grchrist 1.10 RateOutput = open(RefRunFile, 'wb') ##Save new Rates[] to RefRuns
633     pickle.dump(Rates, RateOutput, 2)
634     RateOutput.close()
635     LumiOutput = open(RefLumiFile,'wb')
636     pickle.dump(LumiPageInfo,LumiOutput, 2)
637     LumiOutput.close()
638    
639 abrinke1 1.85 return [Rates,LumiPageInfo,trig_list,nps]
640 grchrist 1.78
641     def MakePlots(Rates, LumiPageInfo, run_list, trig_name, trig_list, num_ls, min_rate, max_dt, print_table, data_clean, plot_properties, masked_triggers, save_fits, debug_print, SubSystemOff, print_info,NoVersion, linear,do_inst, TMDerr,wp_bool,all_triggers,L1SeedChangeFit,nps):
642    
643     [min_run, max_run, priot, InputFit, OutputFit, OutputFitPS, failed_paths, first_trigger, varX, varY, do_fit, save_root, save_png, fit_file, RootNameTemplate, RootFile, InputFitPS]=InitMakePlots(run_list, trig_name, num_ls, plot_properties, nps, L1SeedChangeFit)
644     ##modify for No Version and check the trigger list
645 abrinke1 1.85 trig_list=InitTrigList(trig_list, save_fits, NoVersion, InputFit)
646 grchrist 1.78
647     for print_trigger in sorted(Rates):
648 abrinke1 1.85 [trig_list, passchecktriglist, meanrawrate]=CheckTrigList(trig_list, print_trigger, all_triggers, masked_triggers, min_rate, Rates, run_list, trig_name)
649 grchrist 1.78 if not passchecktriglist:
650 abrinke1 1.85 print str(print_trigger)+" did not passchecktriglist"
651 grchrist 1.78 continue
652    
653     [meanrate, meanxsec, meanlumi, sloperate, slopexsec, nlow, nhigh, lowrate, lowxsec, lowlumi, highrate, highxsec, highlumi]=GetMeanRates(Rates, print_trigger, max_dt)
654     chioffset=1.0 ##chioffset now a fraction; must be 10% better to use expo rather than quad, quad rather than line
655     width = max([len(trigger_name) for trigger_name in trig_list])
656     for psi in range(0,nps):
657     OutputFitPS[psi][print_trigger]=[]##define empty list for each trigger
658    
659     ####START OF L1 SEED LOOP####
660     #print "LIST L1 seed changes",Rates[print_trigger]["L1seedchange"][0]
661    
662 grchrist 1.79 if L1SeedChangeFit and do_fit:
663 grchrist 1.78 dummyPSColslist=Rates[print_trigger]["L1seedchange"][0]
664 awoodard 1.90 #print print_trigger, dummyPSColslist
665 abrinke1 1.85 if len(dummyPSColslist)!=1:
666 grchrist 1.78 dummyPSColslist.append(range(0,nps))
667     else:
668     dummyPSColslist=[]
669     dummyPSColslist.append(range(0,nps))
670    
671 abrinke1 1.1
672 grchrist 1.78 if not do_fit:
673     [fitparams, passedGetFit, failed_paths, fitparamsPS]=GetFit(do_fit, InputFit, failed_paths, print_trigger, num_ls,L1SeedChangeFit, InputFitPS,nps)
674     if not passedGetFit:
675 abrinke1 1.85 print str(print_trigger)+" did not passedGetFit"
676 grchrist 1.78 continue
677     else:
678     fitparams=["unset",0,0,0,0,0,0]
679     fitparamsPS=["unset",{},{},{},{},{},{}]
680    
681     for PSColslist in dummyPSColslist:
682     #print print_trigger, PSColslist
683     passPSinCol=0
684 abrinke1 1.85 for iterator in range (len(Rates[print_trigger]["run"])):
685 grchrist 1.78 if Rates[print_trigger]["psi"][iterator] in PSColslist:
686     passPSinCol=1
687     #print PSColslist, Rates[print_trigger]["run"][iterator], Rates[print_trigger]["psi"][iterator]
688     if not passPSinCol:
689     ##for when there are no LS in some PS col (pretty common!)
690     #print print_trigger, "No data for",PSColslist
691     continue
692    
693    
694 abrinke1 1.85 AllPlotArrays=DoAllPlotArrays(Rates, print_trigger, run_list, data_clean, meanxsec, num_ls, LumiPageInfo, SubSystemOff, max_dt, print_info, trig_list, do_fit, do_inst, debug_print, fitparams, fitparamsPS, TMDerr, L1SeedChangeFit, PSColslist, first_trigger)
695 grchrist 1.78 [VX, VXE, x_label, VY, VYE, y_label, VF, VFE] = GetVXVY(plot_properties, fit_file, AllPlotArrays, L1SeedChangeFit)
696    
697    
698     ####defines gr1 and failure if no graph in OutputFit ####
699 abrinke1 1.85 defgrapass = False
700     if len(VX) > 0:
701     [OutputFit,gr1, gr3, failed_paths, defgrapass]=DefineGraphs(print_trigger,OutputFit,do_fit,varX,varY,x_label,y_label,VX,VY,VXE,VYE,VF,VFE,fit_file, failed_paths,PSColslist)
702 grchrist 1.78 if not defgrapass:
703     continue
704     if do_fit:
705 abrinke1 1.85 [f1a,f1b,f1c,f1d,first_trigger]= Fitter(gr1,VX,VY,sloperate,nlow,Rates,print_trigger, first_trigger, varX, varY,linear,lowrate)
706 grchrist 1.78
707    
708     if print_table or save_fits:
709 abrinke1 1.85 ###aditional info from f1 params
710     [f1a_Chi2, f1b_Chi2, f1c_Chi2,f1d_Chi2, f1a_BadMinimum, f1b_BadMinimum, f1c_BadMinimum, meanps, av_rte, passmorefitinfo]=more_fit_info(f1a,f1b,f1c,f1d,VX,VY,print_trigger,Rates)
711 grchrist 1.78 if not passmorefitinfo:
712     OutputFit[print_trigger] = ["fit failed","Zero NDF"]
713     ###output fit params
714     else:
715 abrinke1 1.86 [OutputFit,first_trigger, failed_paths]=output_fit_info(do_fit,f1a,f1b,f1c,f1d,varX,varY,VX,VY,linear,print_trigger,first_trigger,Rates,width,chioffset,wp_bool,num_ls,meanrawrate,OutputFit, failed_paths, PSColslist, dummyPSColslist)
716 grchrist 1.78 if do_fit:
717     for PSI in PSColslist:
718     if not OutputFitPS[PSI][print_trigger]:
719     OutputFitPS[PSI][print_trigger]=OutputFit[print_trigger]
720 grchrist 1.79
721 grchrist 1.80 PSlist=deque(PSColslist)
722     PSmin=PSlist.popleft()
723     if not PSlist:
724     PSmax=PSmin
725     else:
726     PSmax=PSlist.pop()
727    
728 grchrist 1.79 first_trigger=False
729     if save_root or save_png:
730     c1 = TCanvas(str(varX),str(varY))
731 grchrist 1.80 c1.SetName(str(print_trigger)+"_ps"+str(PSmin)+"_"+str(PSmax)+"_"+str(varY)+"_vs_"+str(varX))
732 grchrist 1.79 gr1.Draw("APZ")
733     if not do_fit:
734     gr3.Draw("P3")
735     c1.Update()
736     else:
737     c1=DrawFittedCurve(f1a, f1b,f1c, f1d, chioffset,do_fit,c1,VX ,VY,print_trigger,Rates)
738    
739     if save_root:
740     myfile = TFile( RootFile, 'UPDATE' )
741     c1.Write()
742 grchrist 1.80
743    
744 grchrist 1.79 myfile.Close()
745     if save_png:
746     c1.SaveAs(str(print_trigger)+"_"+str(varY)+"_vs_"+str(varX)+".png")
747 grchrist 1.78
748    
749    
750     EndMkrootfile(failed_paths, save_fits, save_root, fit_file, RootFile, OutputFit, OutputFitPS, L1SeedChangeFit)
751    
752    
753    
754    
755    
756     ############# SUPPORTING FUNCTIONS ################
757    
758     def InitMakePlots(run_list, trig_name, num_ls, plot_properties, nps, L1SeedChangeFit):
759 abrinke1 1.1 min_run = min(run_list)
760     max_run = max(run_list)
761 muell149 1.46
762     priot.has_been_called=False
763 grchrist 1.11
764 abrinke1 1.5 InputFit = {}
765 grchrist 1.78 InputFitPS = {}
766 abrinke1 1.5 OutputFit = {}
767 awoodard 1.72 failed_paths = []
768 grchrist 1.14 first_trigger=True
769 grchrist 1.78 OutputFitPS={}
770     for ii in range(0,nps):
771     OutputFitPS[ii]={}
772 grchrist 1.37
773     [[varX, varY, do_fit, save_root, save_png, fit_file]] = plot_properties
774    
775     RootNameTemplate = "%s_%sLS_%s_vs_%s_Run%s-%s.root"
776     RootFile = RootNameTemplate % (trig_name, num_ls, varX, varY, min_run, max_run)
777 abrinke1 1.1
778 amott 1.20 if not do_fit:
779     try:
780 abrinke1 1.1 pkl_file = open(fit_file, 'rb')
781 abrinke1 1.5 InputFit = pickle.load(pkl_file)
782 grchrist 1.78 print "opening fit_file"
783     pkl_file.close()
784 amott 1.20 except:
785     print "ERROR: could not open fit file: %s" % (fit_file,)
786 grchrist 1.78 exit(2)
787     if L1SeedChangeFit:
788     try:
789     PSfitfile=fit_file.replace("HLT_NoV","HLT_NoV_ByPS")
790     print "opening",PSfitfile
791     pklfilePS = open(PSfitfile, 'rb')
792     InputFitPS = pickle.load(pklfilePS)
793     except:
794     print "ERROR: could not open fit file: %s" % (PSfitfile,)
795     exit(2)
796    
797 amott 1.20 if save_root:
798     try:
799     os.remove(RootFile)
800     except:
801     pass
802 grchrist 1.78
803    
804     return [min_run, max_run, priot, InputFit, OutputFit, OutputFitPS, failed_paths, first_trigger, varX, varY, do_fit, save_root, save_png, fit_file, RootNameTemplate, RootFile, InputFitPS]
805 amott 1.20
806 grchrist 1.78 def InitTrigList(trig_list, save_fits, NoVersion, InputFit):
807 grchrist 1.38 trig_list_noV=[]
808     for trigs in trig_list:
809     trig_list_noV.append(StripVersion(trigs))
810     if NoVersion:
811     trig_list=trig_list_noV
812 grchrist 1.40
813 amott 1.20 ## check that all the triggers we ask to plot are in the input fit
814     if not save_fits:
815     goodtrig_list = []
816 grchrist 1.40 FitInputNoV={}
817 amott 1.20 for trig in trig_list:
818 grchrist 1.40
819     if NoVersion:
820     for trigger in InputFit.iterkeys():
821     FitInputNoV[StripVersion(trigger)]=InputFit[trigger]
822     InputFit=FitInputNoV
823 awoodard 1.56
824 amott 1.20 else:
825 grchrist 1.40 if not InputFit.has_key(trig):
826     print "WARNING: No Fit Prediction for Trigger %s, SKIPPING" % (trig,)
827     else:
828     goodtrig_list.append(trig)
829     trig_list = goodtrig_list
830 grchrist 1.78 return trig_list
831    
832     def CheckTrigList(trig_list, print_trigger, all_triggers, masked_triggers, min_rate, Rates, run_list, trig_name):
833     ##Limits Rates[] to runs in run_list
834     NewTrigger = {}
835     Passed=1 ##to replace continue
836     meanrawrate=0
837     if not print_trigger in trig_list:
838     if all_triggers:
839     trig_list.append(print_trigger)
840     else:
841     print "not in trig_list:",print_trigger, trig_list
842     Passed=0
843     return [trig_list, Passed, meanrawrate]
844    
845     for key in Rates[print_trigger]:
846     NewTrigger[key] = []
847     for iterator in range (len(Rates[print_trigger]["run"])):
848     if Rates[print_trigger]["run"][iterator] in run_list:
849     for key in Rates[print_trigger]:
850     NewTrigger[key].append(Rates[print_trigger][key][iterator])
851     Rates[print_trigger] = NewTrigger
852    
853     #print print_trigger, Rates[print_trigger]
854     meanrawrate = sum(Rates[print_trigger]["rawrate"])/len(Rates[print_trigger]["rawrate"])
855    
856     if not trig_name in print_trigger:
857     #print "failed does not contain HLT",trig_name, print_trigger
858     pass
859    
860     if meanrawrate < min_rate:
861     Passed=0
862     return [trig_list, Passed, meanrawrate]
863    
864    
865     masked_trig = False
866     for mask in masked_triggers:
867     if str(mask) in print_trigger:
868     masked_trig = True
869     if masked_trig:
870     Passed=0
871     return [trig_list, Passed, meanrawrate]
872    
873     return [trig_list, Passed, meanrawrate]
874    
875    
876    
877     def GetMeanRates(Rates, print_trigger, max_dt):
878     lowlumi = 0
879     meanlumi_init = median(Rates[print_trigger]["live_lumi"])
880     meanlumi = 0
881     highlumi = 0
882     lowrate = 0
883     meanrate = 0
884     highrate = 0
885     lowxsec = 0
886     meanxsec = 0
887     highxsec = 0
888     nlow = 0
889     nhigh = 0
890    
891     for iterator in range(len(Rates[print_trigger]["rate"])):
892     if Rates[print_trigger]["live_lumi"][iterator] <= meanlumi_init:
893     if ( Rates[print_trigger]["rawrate"][iterator] > 0.04 and Rates[print_trigger]["physics"][iterator] == 1 and Rates[print_trigger]["active"][iterator] == 1 and Rates[print_trigger]["deadtime"][iterator] < max_dt and Rates[print_trigger]["psi"][iterator] > 0 and Rates[print_trigger]["live_lumi"] > 500):
894     meanrate+=Rates[print_trigger]["rate"][iterator]
895     lowrate+=Rates[print_trigger]["rate"][iterator]
896     meanxsec+=Rates[print_trigger]["xsec"][iterator]
897     lowxsec+=Rates[print_trigger]["xsec"][iterator]
898     meanlumi+=Rates[print_trigger]["live_lumi"][iterator]
899     lowlumi+=Rates[print_trigger]["live_lumi"][iterator]
900     nlow+=1
901     if Rates[print_trigger]["live_lumi"][iterator] > meanlumi_init:
902     if ( Rates[print_trigger]["rawrate"][iterator] > 0.04 and Rates[print_trigger]["physics"][iterator] == 1 and Rates[print_trigger]["active"][iterator] == 1 and Rates[print_trigger]["deadtime"][iterator] < max_dt and Rates[print_trigger]["psi"][iterator] > 0 and Rates[print_trigger]["live_lumi"] > 500):
903     meanrate+=Rates[print_trigger]["rate"][iterator]
904     highrate+=Rates[print_trigger]["rate"][iterator]
905     meanxsec+=Rates[print_trigger]["xsec"][iterator]
906     highxsec+=Rates[print_trigger]["xsec"][iterator]
907     meanlumi+=Rates[print_trigger]["live_lumi"][iterator]
908     highlumi+=Rates[print_trigger]["live_lumi"][iterator]
909     nhigh+=1
910     try:
911     meanrate = meanrate/(nlow+nhigh)
912     meanxsec = meanxsec/(nlow+nhigh)
913     meanlumi = meanlumi/(nlow+nhigh)
914     if (nlow==0):
915     sloperate = (highrate/nhigh) / (highlumi/nhigh)
916     slopexsec = (highxsec/nhigh) / (highlumi/nhigh)
917     elif (nhigh==0):
918     sloperate = (lowrate/nlow) / (lowlumi/nlow)
919     slopexsec = (lowxsec/nlow) / (lowlumi/nlow)
920     else:
921     sloperate = ( (highrate/nhigh) - (lowrate/nlow) ) / ( (highlumi/nhigh) - (lowlumi/nlow) )
922     slopexsec = ( (highxsec/nhigh) - (lowxsec/nlow) ) / ( (highlumi/nhigh) - (lowlumi/nlow) )
923     except:
924     # print str(print_trigger)+" has no good datapoints - setting initial xsec slope estimate to 0"
925     meanrate = median(Rates[print_trigger]["rate"])
926     meanxsec = median(Rates[print_trigger]["xsec"])
927     meanlumi = median(Rates[print_trigger]["live_lumi"])
928     sloperate = meanxsec
929     slopexsec = 0
930     return [meanrate, meanxsec, meanlumi, sloperate, slopexsec, nlow, nhigh, lowrate, lowxsec, lowlumi, highrate, highxsec, highlumi]
931    
932    
933     ################
934     def GetFit(do_fit, InputFit, failed_paths, print_trigger, num_ls, L1SeedChangeFit, InputFitPS,nps):
935    
936     passed=1
937     FitTypePS={}
938     X0PS={}
939     X1PS={}
940     X2PS={}
941     X3PS={}
942     sigmaPS={}
943     X0errPS={}
944    
945     try:
946     FitType = InputFit[print_trigger][0]
947     except:
948     failed_paths.append([print_trigger,"This path did not exist in the monitorlist used to create the fit"])
949     FitType = "parse failed"
950     passed=0
951     fitparams=[FitType, 0, 0, 0, 0, 0, 0]
952     if FitType == "fit failed":
953     failure_comment = InputFit[print_trigger][1]
954     failed_paths.append([print_trigger, failure_comment])
955     passed=0
956     fitparams=[FitType, 0, 0, 0, 0, 0, 0]
957 abrinke1 1.85 elif FitType == "parse failed":
958     failure_comment = "This path did not exist in the monitorlist used to create the fit"
959 grchrist 1.78 else:
960     X0 = InputFit[print_trigger][1]
961     X1 = InputFit[print_trigger][2]
962     X2 = InputFit[print_trigger][3]
963     X3 = InputFit[print_trigger][4]
964     sigma = InputFit[print_trigger][5]/math.sqrt(num_ls)*3#Display 3 sigma band to show outliers more clearly
965     X0err= InputFit[print_trigger][7]
966     fitparams=[FitType, X0, X1, X2, X3, sigma, X0err]
967 amott 1.18
968 grchrist 1.80
969 grchrist 1.78 if L1SeedChangeFit:
970    
971     for psi in range(0,nps):
972 grchrist 1.79 #print psi, print_trigger, InputFitPS[psi][print_trigger]
973 grchrist 1.78 try:
974     FitTypePS[psi] = InputFitPS[psi][print_trigger][0]
975     except:
976 awoodard 1.91 failed_paths.append([print_trigger+'_PS_'+str(psi),"This path did not exist in the monitorlist used to create the fit"])
977 grchrist 1.78 FitTypePS[psi] = "parse failed"
978     passed=0
979     fitparamsPS=[FitTypePS, X0PS, X1PS, X2PS, X3PS, sigmaPS, X0errPS]
980     if FitTypePS[psi] == "fit failed":
981     failure_comment = InputFitPS[psi][print_trigger][1]
982     failed_paths.append([print_trigger+str(psi), failure_comment])
983     passed=0
984     fitparamsPS=[FitTypePS, X0PS, X1PS, X2PS, X3PS, sigmaPS, X0errPS]
985 awoodard 1.50 else:
986 grchrist 1.82 try:
987     X0PS[psi] = InputFitPS[psi][print_trigger][1]
988     X1PS[psi] = InputFitPS[psi][print_trigger][2]
989     X2PS[psi] = InputFitPS[psi][print_trigger][3]
990     X3PS[psi] = InputFitPS[psi][print_trigger][4]
991     sigmaPS[psi] = InputFitPS[psi][print_trigger][5]/math.sqrt(num_ls)*3#Display 3 sigma band to show outliers more clearly
992     X0errPS[psi]= InputFitPS[psi][print_trigger][7]
993     fitparamsPS=[FitTypePS, X0PS, X1PS, X2PS, X3PS, sigmaPS, X0errPS]
994     except:
995     #print "ERROR: unable to get fits by PS for",print_trigger," in col",psi, "skipping."
996     pass
997 grchrist 1.78
998 grchrist 1.80
999 grchrist 1.78
1000     return [fitparams, passed, failed_paths, fitparamsPS]
1001    
1002     ## we are 2 lumis off when we start! -gets worse when we skip lumis
1003 grchrist 1.79 def DoAllPlotArrays(Rates, print_trigger, run_list, data_clean, meanxsec, num_ls, LumiPageInfo, SubSystemOff, max_dt, print_info, trig_list, do_fit, do_inst, debug_print, fitparams, fitparamsPS, TMDerr, L1SeedChangeFit, PSColslist, first_trigger):
1004 grchrist 1.78
1005     ###init arrays ###
1006     [run_t,ls_t,ps_t,inst_t,live_t,delivered_t,deadtime_t,rawrate_t,rate_t,rawxsec_t,xsec_t,psi_t,e_run_t,e_ls_t,e_ps_t,e_inst_t,e_live_t,e_delivered_t,e_deadtime_t,e_rawrate_t,e_rate_t,e_rawxsec_t,e_xsec_t,e_psi_t,rawrate_fit_t,rate_fit_t,rawxsec_fit_t,xsec_fit_t,e_rawrate_fit_t,e_rate_fit_t,e_rawxsec_fit_t,e_xsec_fit_t] = MakePlotArrays()
1007    
1008 abrinke1 1.85
1009    
1010 grchrist 1.78 it_offset=0
1011     ###loop over each LS ###
1012     for iterator in range(len(Rates[print_trigger]["rate"])):
1013     if not Rates[print_trigger]["run"][iterator] in run_list:
1014 abrinke1 1.1 continue
1015 grchrist 1.78 if not Rates[print_trigger]["psi"][iterator] in PSColslist:
1016 abrinke1 1.1 continue
1017 grchrist 1.80
1018 grchrist 1.78 #else:
1019     #print iterator, Rates[print_trigger]["psi"][iterator], PSColslist
1020     ##Old Spike-killer: used average-xsec method, too clumsy, esp. for nonlinear triggers
1021     #prediction = meanxsec + slopexsec * (Rates[print_trigger]["live_lumi"][iterator] - meanlumi)
1022     #realvalue = Rates[print_trigger]["xsec"][iterator]
1023 abrinke1 1.1
1024 grchrist 1.78 ##New Spike-killer: gets average of nearest 4 LS
1025 abrinke1 1.7 try:
1026 grchrist 1.78 if (iterator > 2 and iterator+2 < len(Rates[print_trigger]["rate"])): ##2 LS before, 2 after
1027     prediction = (Rates[print_trigger]["rate"][iterator-2]+Rates[print_trigger]["rate"][iterator-1]+Rates[print_trigger]["rate"][iterator+1]+Rates[print_trigger]["rate"][iterator+2])/4.0
1028     elif (iterator > 2 and len(Rates[print_trigger]["rate"]) > 4 ): ##4 LS before
1029     prediction = (Rates[print_trigger]["rate"][iterator-4]+Rates[print_trigger]["rate"][iterator-3]+Rates[print_trigger]["rate"][iterator-2]+Rates[print_trigger]["rate"][iterator-1])/4.0
1030     elif (iterator+2 < len(Rates[print_trigger]["rate"]) and len(Rates[print_trigger]["rate"]) > 4 ): ##4 LS after
1031     prediction = (Rates[print_trigger]["rate"][iterator+1]+Rates[print_trigger]["rate"][iterator+2]+Rates[print_trigger]["rate"][iterator+3]+Rates[print_trigger]["rate"][iterator+4])/4.0
1032 abrinke1 1.67 else:
1033 grchrist 1.78 prediction = Rates[print_trigger]["rate"][iterator]
1034     realvalue = Rates[print_trigger]["rate"][iterator]
1035 abrinke1 1.7 except:
1036 grchrist 1.78 print "Error calculating prediction. Setting rates to defaults."
1037     prediction = Rates[print_trigger]["rate"][iterator]
1038     realvalue = Rates[print_trigger]["rate"][iterator]
1039 grchrist 1.11
1040 grchrist 1.79 if pass_cuts(data_clean, realvalue, prediction, meanxsec, Rates, print_trigger, iterator, num_ls,LumiPageInfo,SubSystemOff,max_dt,print_info, trig_list, first_trigger):
1041 grchrist 1.78 run_t.append(Rates[print_trigger]["run"][iterator])
1042     ls_t.append(Rates[print_trigger]["ls"][iterator])
1043     ps_t.append(Rates[print_trigger]["ps"][iterator])
1044     inst_t.append(Rates[print_trigger]["inst_lumi"][iterator])
1045     live_t.append(Rates[print_trigger]["live_lumi"][iterator])
1046     delivered_t.append(Rates[print_trigger]["delivered_lumi"][iterator])
1047     deadtime_t.append(Rates[print_trigger]["deadtime"][iterator])
1048     rawrate_t.append(Rates[print_trigger]["rawrate"][iterator])
1049     rate_t.append(Rates[print_trigger]["rate"][iterator])
1050     rawxsec_t.append(Rates[print_trigger]["rawxsec"][iterator])
1051     xsec_t.append(Rates[print_trigger]["xsec"][iterator])
1052     psi_t.append(Rates[print_trigger]["psi"][iterator])
1053    
1054     e_run_t.append(0.0)
1055     e_ls_t.append(0.0)
1056     e_ps_t.append(0.0)
1057     e_inst_t.append(14.14)
1058     e_live_t.append(14.14)
1059     e_delivered_t.append(14.14)
1060     e_deadtime_t.append(0.01)
1061     e_rawrate_t.append(math.sqrt(Rates[print_trigger]["rawrate"][iterator]/(num_ls*23.3)))
1062     e_rate_t.append(Rates[print_trigger]["ps"][iterator]*math.sqrt(Rates[print_trigger]["rawrate"][iterator]/(num_ls*23.3)))
1063     e_psi_t.append(0.0)
1064 awoodard 1.89
1065 grchrist 1.78 if live_t[-1] == 0:
1066     e_rawxsec_t.append(0)
1067     e_xsec_t.append(0)
1068     else:
1069     try:
1070     e_rawxsec_t.append(math.sqrt(Rates[print_trigger]["rawrate"][iterator]/(num_ls*23.3))/Rates[print_trigger]["live_lumi"][iterator])
1071     e_xsec_t.append(Rates[print_trigger]["ps"][iterator]*math.sqrt(Rates[print_trigger]["rawrate"][iterator]/(num_ls*23.3))/Rates[print_trigger]["live_lumi"][iterator])
1072     except:
1073     e_rawxsec_t.append(0.)
1074     e_xsec_t.append(0.)
1075 awoodard 1.91
1076     if not do_fit:
1077     [FitType, X0, X1, X2, X3, sigma, X0err] = GetCorrectFitParams(fitparams,fitparamsPS,Rates,L1SeedChangeFit,iterator,print_trigger)
1078     if not do_inst:
1079     if FitType == "expo":
1080     rate_prediction = X0 + X1*math.exp(X2+X3*delivered_t[-1])
1081     else:
1082     rate_prediction = X0 + X1*delivered_t[-1] + X2*delivered_t[-1]*delivered_t[-1] + X3*delivered_t[-1]*delivered_t[-1]*delivered_t[-1]
1083    
1084     else:
1085     if FitType == "expo":
1086     rate_prediction = X0 + X1*math.exp(X2+X3*inst_t[-1])
1087     else:
1088     rate_prediction = X0 + X1*inst_t[-1] + X2*inst_t[-1]*inst_t[-1] + X3*inst_t[-1]*inst_t[-1]*inst_t[-1]
1089 awoodard 1.89
1090 awoodard 1.91 if rate_prediction != abs(rate_prediction):
1091     rate_prediction = 0
1092     print 'Problem calculating rate prediction. Setting to 0 for '+print_trigger+': lumisection '+ls_t[-1]
1093    
1094 grchrist 1.78 if live_t[-1] == 0:
1095     rawrate_fit_t.append(0)
1096     rate_fit_t.append(0)
1097     rawxsec_fit_t.append(0)
1098     xsec_fit_t.append(0)
1099     e_rawrate_fit_t.append(0)
1100     e_rate_fit_t.append(sigma)
1101     e_rawxsec_fit_t.append(0)
1102     e_xsec_fit_t.append(0)
1103 abrinke1 1.67
1104 grchrist 1.78 else:
1105     if ps_t[-1]>0.0:
1106     rawrate_fit_t.append(rate_prediction*(1.0-deadtime_t[-1])/(ps_t[-1]))
1107 abrinke1 1.2 else:
1108 grchrist 1.78 rawrate_fit_t.append(0.0)
1109 grchrist 1.11
1110 grchrist 1.78 rate_fit_t.append(rate_prediction)
1111 abrinke1 1.87 e_rate_fit_t.append(sigma*math.sqrt(rate_prediction))
1112 grchrist 1.78 rawxsec_fit_t.append(rawrate_fit_t[-1]/live_t[-1])
1113     xsec_fit_t.append(rate_prediction*(1.0-deadtime_t[-1])/live_t[-1])
1114     try:
1115 grchrist 1.38
1116 grchrist 1.78 if not TMDerr:
1117 abrinke1 1.87 e_rawrate_fit_t.append(sigma*math.sqrt(rate_fit_t[-1])*rawrate_fit_t[-1]/rate_fit_t[-1])
1118     e_rawxsec_fit_t.append(sigma*math.sqrt(rate_fit_t[-1])*rawxsec_fit_t[-1]/rate_fit_t[-1])
1119     e_xsec_fit_t.append(sigma*math.sqrt(rate_fit_t[-1])*xsec_fit_t[-1]/rate_fit_t[-1])
1120 grchrist 1.78
1121 grchrist 1.38 ###error from TMD predictions, calculated at 5e33
1122 grchrist 1.78
1123     else:
1124     e_rawrate_fit_t.append(X0err*inst_t[-1]/5000.)
1125     e_rawxsec_fit_t.append(X0err/live_t[-1]*inst_t[-1]/5000.)
1126     e_xsec_fit_t.append(X0err/live_t[-1]*inst_t[-1]/5000.)
1127    
1128 grchrist 1.38
1129 grchrist 1.78 except:
1130     print print_trigger, "has no fitted rate for LS", Rates[print_trigger]["ls"][iterator]
1131     e_rawrate_fit_t.append(sigma)
1132     e_rawxsec_fit_t.append(sigma)
1133     e_xsec_fit_t.append(sigma)
1134 abrinke1 1.5
1135 grchrist 1.16
1136 grchrist 1.78 if (print_info and num_ls==1 and (fabs(rawrate_fit_t[-1]-rawrate_t[-1])>2.5*sqrt(sum(Rates[print_trigger]["rawrate"])/len(Rates[print_trigger]["rawrate"])))):
1137 grchrist 1.38 pass
1138 grchrist 1.8
1139 grchrist 1.78 else: ##If the data point does not pass the data_clean filter
1140     if debug_print:
1141     print str(print_trigger)+" has xsec "+str(round(Rates[print_trigger]["xsec"][iterator],6))+" at lumi "+str(round(Rates[print_trigger]["live_lumi"][iterator],2))+" where the expected value is "+str(prediction)
1142 abrinke1 1.1
1143 grchrist 1.78 ## End "for iterator in range(len(Rates[print_trigger]["rate"])):" loop
1144     return [run_t,ls_t,ps_t,inst_t,live_t,delivered_t,deadtime_t,rawrate_t,rate_t,rawxsec_t,xsec_t,psi_t,e_run_t,e_ls_t,e_ps_t,e_inst_t,e_live_t,e_delivered_t,e_deadtime_t,e_rawrate_t,e_rate_t,e_rawxsec_t,e_xsec_t,e_psi_t,rawrate_fit_t,rate_fit_t,rawxsec_fit_t,xsec_fit_t,e_rawrate_fit_t,e_rate_fit_t,e_rawxsec_fit_t,e_xsec_fit_t]
1145 abrinke1 1.1
1146 grchrist 1.79 def GetCorrectFitParams(fitparams,fitparamsPS,Rates,L1SeedChangeFit,iterator,print_trigger):
1147     if not L1SeedChangeFit:
1148     return fitparams
1149     else:
1150     psi=Rates[print_trigger]["psi"][iterator]
1151     [FitTypePS, X0PS, X1PS, X2PS, X3PS, sigmaPS, X0errPS]=fitparamsPS
1152     return [FitTypePS[psi], X0PS[psi], X1PS[psi], X2PS[psi], X3PS[psi], sigmaPS[psi], X0errPS[psi]]
1153     #[FitType, X0, X1, X2, X3, sigma, X0err]
1154 abrinke1 1.5
1155    
1156 abrinke1 1.86 def CalcSigma(var_x, var_y, func, do_high_lumi):
1157 awoodard 1.47 residuals = []
1158 abrinke1 1.86 residuals_high_lumi = []
1159     res_frac = []
1160     res_frac_high_lumi = []
1161 awoodard 1.47 for x, y in zip(var_x,var_y):
1162 awoodard 1.92 y_predicted = func.Eval(x,0,0)
1163     if y_predicted != abs(y_predicted):
1164     y_predicted = 0
1165     residuals.append(y - y_predicted)
1166     res_frac.append((y - y_predicted)/math.sqrt(y_predicted))
1167     if x > 6000:
1168     residuals_high_lumi.append(y - y_predicted)
1169     res_frac_high_lumi.append((y - y_predicted)/math.sqrt(y_predicted))
1170 awoodard 1.47
1171     res_squared = [i*i for i in residuals]
1172 abrinke1 1.86 res_frac_squared = [i*i for i in res_frac]
1173     res_high_lumi_squared = [i*i for i in residuals_high_lumi]
1174     res_frac_high_lumi_squared = [i*i for i in res_frac_high_lumi]
1175     dev_high_lumi_squared = [i*fabs(i) for i in residuals_high_lumi]
1176     dev_frac_high_lumi_squared = [i*fabs(i) for i in res_frac_high_lumi]
1177    
1178 awoodard 1.53 if len(res_squared) > 2:
1179 abrinke1 1.86 sigma = math.sqrt(sum(res_squared)/(1.0*len(res_squared)-2.0))
1180     sigma_frac = math.sqrt(sum(res_frac_squared)/(1.0*len(res_frac_squared)-2.0))
1181 awoodard 1.53 else:
1182     sigma = 0
1183 abrinke1 1.87 sigma_frac = 0
1184 abrinke1 1.86
1185     if len(res_high_lumi_squared) > 10 and do_high_lumi:
1186     high_lumi_sigma_frac = math.sqrt(sum(res_frac_high_lumi_squared)/(1.0*len(res_frac_high_lumi_squared))) ##Statistics limited, don't subtract 2
1187     high_lumi_dev_frac = math.sqrt( fabs( sum(dev_frac_high_lumi_squared)/(1.0*len(dev_frac_high_lumi_squared)) ) ) ##Statistics limited, don't subtract 2
1188     if high_lumi_sigma_frac > 1.25*sigma_frac:
1189     #print "high_lumi_sigma_frac is higher by "+str(100*round((high_lumi_sigma_frac/sigma_frac)-1,2))+"% than sigma_frac ("+str(round(sigma_frac,2))+")"
1190     sigma = sigma*( 0.5 + 0.5*(high_lumi_sigma_frac/sigma_frac) )
1191     sigma_frac = sigma_frac*( 0.5 + 0.5*(high_lumi_sigma_frac/sigma_frac) )
1192     if high_lumi_dev_frac > 4.0*math.sqrt(1.0/(1.0*len(res_frac_high_lumi_squared)-2.0))*sigma_frac:
1193     #print "Total points: "+str(len(res_frac_squared))
1194     #print "High lumi points: "+str(len(res_frac_high_lumi_squared))
1195     #print "high_lumi_dev_frac is "+str(100*round(high_lumi_dev_frac/sigma_frac,2))+"% of sigma_frac ("+str(round(sigma_frac,2))+")"
1196     sigma = sigma*(1.0 + 0.5*(high_lumi_dev_frac/sigma_frac) )
1197 abrinke1 1.87 sigma_frac = sigma_frac*(1.0 + 0.5*(high_lumi_dev_frac/sigma_frac) )
1198 abrinke1 1.86
1199 abrinke1 1.87 return sigma_frac
1200 awoodard 1.47
1201 abrinke1 1.5 def GetJSON(json_file):
1202    
1203     input_file = open(json_file)
1204     file_content = input_file.read()
1205     inputRange = selectionParser(file_content)
1206     JSON = inputRange.runsandls()
1207     return JSON
1208     ##JSON is an array: JSON[run_number] = [1st ls, 2nd ls, 3rd ls ... nth ls]
1209    
1210     def MakePlotArrays():
1211     run_t = array.array('f')
1212     ls_t = array.array('f')
1213     ps_t = array.array('f')
1214     inst_t = array.array('f')
1215     live_t = array.array('f')
1216     delivered_t = array.array('f')
1217     deadtime_t = array.array('f')
1218     rawrate_t = array.array('f')
1219     rate_t = array.array('f')
1220     rawxsec_t = array.array('f')
1221     xsec_t = array.array('f')
1222     psi_t = array.array('f')
1223    
1224     e_run_t = array.array('f')
1225     e_ls_t = array.array('f')
1226     e_ps_t = array.array('f')
1227     e_inst_t = array.array('f')
1228     e_live_t = array.array('f')
1229     e_delivered_t = array.array('f')
1230     e_deadtime_t = array.array('f')
1231     e_rawrate_t = array.array('f')
1232     e_rate_t = array.array('f')
1233     e_rawxsec_t = array.array('f')
1234     e_xsec_t = array.array('f')
1235     e_psi_t = array.array('f')
1236    
1237     rawrate_fit_t = array.array('f')
1238     rate_fit_t = array.array('f')
1239     rawxsec_fit_t = array.array('f')
1240     xsec_fit_t = array.array('f')
1241     e_rawrate_fit_t = array.array('f')
1242     e_rate_fit_t = array.array('f')
1243     e_rawxsec_fit_t = array.array('f')
1244     e_xsec_fit_t = array.array('f')
1245    
1246     return [run_t,ls_t,ps_t,inst_t,live_t,delivered_t,deadtime_t,rawrate_t,rate_t,rawxsec_t,xsec_t,psi_t,e_run_t,e_ls_t,e_ps_t,e_inst_t,e_live_t,e_delivered_t,e_deadtime_t,e_rawrate_t,e_rate_t,e_rawxsec_t,e_xsec_t,e_psi_t,rawrate_fit_t,rate_fit_t,rawxsec_fit_t,xsec_fit_t,e_rawrate_fit_t,e_rate_fit_t,e_rawxsec_fit_t,e_xsec_fit_t]
1247    
1248    
1249 grchrist 1.78 def GetVXVY(plot_properties, fit_file, AllPlotArrays, L1SeedChangeFit):
1250 abrinke1 1.5
1251     VF = "0"
1252     VFE = "0"
1253    
1254     [run_t,ls_t,ps_t,inst_t,live_t,delivered_t,deadtime_t,rawrate_t,rate_t,rawxsec_t,xsec_t,psi_t,e_run_t,e_ls_t,e_ps_t,e_inst_t,e_live_t,e_delivered_t,e_deadtime_t,e_rawrate_t,e_rate_t,e_rawxsec_t,e_xsec_t,e_psi_t,rawrate_fit_t,rate_fit_t,rawxsec_fit_t,xsec_fit_t,e_rawrate_fit_t,e_rate_fit_t,e_rawxsec_fit_t,e_xsec_fit_t] = AllPlotArrays
1255     for varX, varY, do_fit, save_root, save_png, fit_file in plot_properties:
1256     if varX == "run":
1257     VX = run_t
1258     VXE = run_t_e
1259 awoodard 1.63 x_label = "Run Number"
1260 abrinke1 1.5 elif varX == "ls":
1261     VX = ls_t
1262     VXE = e_ls_t
1263 awoodard 1.63 x_label = "Lumisection"
1264 abrinke1 1.5 elif varX == "ps":
1265     VX = ps_t
1266     VXE = e_ps_t
1267 awoodard 1.63 x_label = "Prescale"
1268 abrinke1 1.5 elif varX == "inst":
1269     VX = inst_t
1270     VXE = e_inst_t
1271 abrinke1 1.67 x_label = "Instantaneous Luminosity [10^{30} Hz/cm^{2}]"
1272    
1273 abrinke1 1.5 elif varX == "live":
1274     VX = live_t
1275     VXE = e_live_t
1276 abrinke1 1.67 x_label = "Instantaneous Luminosity [10^{30} Hz/cm^{2}]"
1277    
1278 abrinke1 1.5 elif varX == "delivered":
1279     VX = delivered_t
1280     VXE = e_delivered_t
1281 abrinke1 1.67 x_label = "Instantaneous Luminosity [10^{30} Hz/cm^{2}]"
1282    
1283 abrinke1 1.5 elif varX == "deadtime":
1284     VX = deadtime_t
1285     VXE = e_deadtime_t
1286 awoodard 1.63 x_label = "Deadtime"
1287 abrinke1 1.5 elif varX == "rawrate":
1288     VX = rawrate_t
1289     VXE = e_rawrate_t
1290 awoodard 1.63 x_label = "Raw Rate [Hz]"
1291 abrinke1 1.5 elif varX == "rate":
1292     VX = rate_t
1293     VXE = e_rate_t
1294 awoodard 1.63 x_label = "Rate [Hz]"
1295 abrinke1 1.5 elif varX == "rawxsec":
1296     VX = rawxsec_t
1297     VXE = e_rawxsec_t
1298 grchrist 1.65 x_label = "Cross Section"
1299 abrinke1 1.5 elif varX == "xsec":
1300     VX = xsec_t
1301     VXE = e_xsec_t
1302 grchrist 1.65 x_label = "Cross Section"
1303 abrinke1 1.5 elif varX == "psi":
1304     VX = psi_t
1305     VXE = e_psi_t
1306 awoodard 1.63 x_label = "Prescale Index"
1307 abrinke1 1.5 else:
1308     print "No valid variable entered for X"
1309     continue
1310     if varY == "run":
1311     VY = run_t
1312     VYE = run_t_e
1313 awoodard 1.63 y_label = "Run Number"
1314 abrinke1 1.5 elif varY == "ls":
1315     VY = ls_t
1316     VYE = e_ls_t
1317 awoodard 1.63 y_label = "Lumisection"
1318 abrinke1 1.5 elif varY == "ps":
1319     VY = ps_t
1320     VYE = e_ps_t
1321 awoodard 1.63 y_label = "Prescale"
1322 abrinke1 1.5 elif varY == "inst":
1323     VY = inst_t
1324     VYE = e_inst_t
1325 grchrist 1.65 y_label = "Instantaneous Luminosity"
1326 abrinke1 1.5 elif varY == "live":
1327     VY = live_t
1328     VYE = e_live_t
1329 grchrist 1.65 y_label = "Instantaneous Luminosity"
1330 abrinke1 1.5 elif varY == "delivered":
1331     VY = delivered_t
1332     VYE = e_delivered_t
1333 grchrist 1.65 y_label = "Instantaneous Luminosity"
1334 abrinke1 1.5 elif varY == "deadtime":
1335     VY = deadtime_t
1336     VYE = e_deadtime_t
1337 awoodard 1.63 y_label = "Deadtime"
1338 abrinke1 1.5 elif varY == "rawrate":
1339     VY = rawrate_t
1340     VYE = e_rawrate_t
1341 awoodard 1.63 y_label = "Raw Rate [Hz]"
1342 abrinke1 1.5 if fit_file:
1343     VF = rawrate_fit_t
1344     VFE = e_rawrate_fit_t
1345     elif varY == "rate":
1346     VY = rate_t
1347     VYE = e_rate_t
1348 awoodard 1.63 y_label = "Rate [Hz]"
1349 abrinke1 1.5 if fit_file:
1350     VF = rate_fit_t
1351     VFE = e_rate_fit_t
1352     elif varY == "rawxsec":
1353     VY = rawxsec_t
1354     VYE = e_rawxsec_t
1355 grchrist 1.65 y_label = "Cross Section"
1356 abrinke1 1.5 if fit_file:
1357     VF = rawxsec_fit_t
1358     VFE = e_rawxsec_fit_t
1359     elif varY == "xsec":
1360     VY = xsec_t
1361     VYE = e_xsec_t
1362 grchrist 1.65 y_label = "Cross Section"
1363 abrinke1 1.5 if fit_file:
1364     VF = xsec_fit_t
1365     VFE = e_xsec_fit_t
1366     elif varY == "psi":
1367     VY = psi_t
1368     VYE = e_psi_t
1369 awoodard 1.63 y_label = "Prescale Index"
1370 abrinke1 1.5 else:
1371     print "No valid variable entered for Y"
1372     continue
1373    
1374 awoodard 1.63 return [VX, VXE, x_label, VY, VYE, y_label, VF, VFE]
1375 abrinke1 1.5
1376 grchrist 1.79 def pass_cuts(data_clean, realvalue, prediction, meanxsec, Rates, print_trigger, iterator, num_ls,LumiPageInfo,SubSystemOff, max_dt, print_info, trig_list, first_trigger):
1377 grchrist 1.17 it_offset=0
1378 grchrist 1.15 Passed=True
1379     subsystemfailed=[]
1380 grchrist 1.11
1381 grchrist 1.8 if num_ls==1:
1382     ##fit is 2 ls ahead of real rate
1383 grchrist 1.10 LS=Rates[print_trigger]["ls"][iterator]
1384     LSRange=LumiPageInfo[LS]["LSRange"]
1385     LS2=LSRange[-1]
1386     lumidict={}
1387     lumidict=LumiPageInfo[LS]
1388 grchrist 1.11
1389     if print_info:
1390 grchrist 1.79 if (iterator==0 and print_trigger==trig_list[0] and first_trigger):
1391 grchrist 1.69 print '%10s%10s%10s%10s%10s%10s%10s%15s%20s%15s' % ("Status", "Run", "LS", "Physics", "Active", "Deadtime", " MaxDeadTime", " Passed all subsystems?", " List of Subsystems", " Spike killing")
1392 grchrist 1.11
1393     ## if SubSystemOff["All"]:
1394     ## for keys in LumiPageInfo[LS]:
1395     ## #print LS, keys, LumiPageInfo[LS][keys]
1396     ## if not LumiPageInfo[LS][keys]:
1397     ## Passed=False
1398     ## subsystemfailed.append(keys)
1399     ## break
1400     ## else:
1401     if SubSystemOff["Mu"] or SubSystemOff["All"]:
1402 grchrist 1.38 if not (LumiPageInfo[LS]["rpc"] and LumiPageInfo[LS]["dt0"] and LumiPageInfo[LS]["dtp"] and LumiPageInfo[LS]["dtm"] and LumiPageInfo[LS]["cscp"] and LumiPageInfo[LS]["cscm"]):
1403 grchrist 1.11 Passed=False
1404     subsystemfailed.append("Mu")
1405     if SubSystemOff["HCal"] or SubSystemOff["All"]:
1406     if not (LumiPageInfo[LS]["hbhea"] and LumiPageInfo[LS]["hbheb"] and LumiPageInfo[LS]["hbhec"]):
1407     Passed=False
1408     subsystemfailed.append("HCal")
1409     if (SubSystemOff["EndCap"] or SubSystemOff["All"]) and not (LumiPageInfo[LS]["hf"]):
1410     Passed=False
1411     subsystemfailed.append("HCal-EndCap")
1412     if SubSystemOff["ECal"] or SubSystemOff["All"]:
1413     if not (LumiPageInfo[LS]["ebp"] and LumiPageInfo[LS]["ebm"]):
1414     Passed=False
1415     subsystemfailed.append("ECal")
1416     if (SubSystemOff["EndCap"] or SubSystemOff["All"]) and not (LumiPageInfo[LS]["eep"] and LumiPageInfo[LS]["eem"] and LumiPageInfo[LS]["esp"] or LumiPageInfo[LS]["esm"]):
1417     Passed=False
1418     subsystemfailed.append("ECal-EndCap")
1419     if SubSystemOff["Tracker"] or SubSystemOff["All"]:
1420     if not (LumiPageInfo[LS]["tob"] and LumiPageInfo[LS]["tibtid"] and LumiPageInfo[LS]["bpix"] and LumiPageInfo[LS]["fpix"]):
1421     Passed=False
1422     subsystemfailed.append("Tracker")
1423     if (SubSystemOff["EndCap"] or SubSystemOff["All"]) and not (LumiPageInfo[LS]["tecp"] and LumiPageInfo[LS]["tecm"]):
1424     Passed=False
1425     subsystemfailed.append("Tracker-EndCap")
1426     if SubSystemOff["Beam"] or SubSystemOff["All"]:
1427     if not(LumiPageInfo[LS]["b1pres"] and LumiPageInfo[LS]["b2pres"] and LumiPageInfo[LS]["b1stab"] and LumiPageInfo[LS]["b2stab"]):
1428     Passed=False
1429     subsystemfailed.append("Beam")
1430 grchrist 1.12 else:
1431     Passed=True
1432 grchrist 1.10
1433 awoodard 1.72 if not data_clean or (
1434 grchrist 1.11 Rates[print_trigger]["physics"][iterator] == 1
1435 grchrist 1.8 and Rates[print_trigger]["active"][iterator] == 1
1436 grchrist 1.17 and Rates[print_trigger]["deadtime"][iterator] < max_dt
1437 grchrist 1.11 #and Rates[print_trigger]["psi"][iterator] > 0
1438 grchrist 1.10 and Passed
1439 abrinke1 1.67 and (realvalue >0.6*prediction and realvalue<1.5*prediction)
1440     and Rates[print_trigger]["rawrate"][iterator] > 0.04
1441 grchrist 1.8 ):
1442 grchrist 1.26 if (print_info and num_ls==1 and (realvalue <0.4*prediction or realvalue>2.5*prediction)):
1443     pass
1444 grchrist 1.59 ##print '%-50s%10s%10s%10s%10s%10s%10s%10s%15s%20s' % (print_trigger,"Passed", Rates[print_trigger]["run"][iterator], LS, Rates[print_trigger]["physics"][iterator], Rates[print_trigger]["active"][iterator], round(Rates[print_trigger]["deadtime"][iterator],2), max_dt, Passed, subsystemfailed)
1445 grchrist 1.8 return True
1446     else:
1447 grchrist 1.79 if (print_info and print_trigger==trig_list[0] and num_ls==1 and first_trigger):
1448 grchrist 1.69 prediction_match=True
1449     if (realvalue >0.6*prediction and realvalue<1.5*prediction):
1450     prediction_match=False
1451     print '%10s%10s%10s%10s%10s%10s%10s%15s%20s%15s' % ("Failed", Rates[print_trigger]["run"][iterator], LS, Rates[print_trigger]["physics"][iterator], Rates[print_trigger]["active"][iterator], round(Rates[print_trigger]["deadtime"][iterator],2), max_dt, Passed, subsystemfailed, prediction_match )
1452 grchrist 1.26
1453 grchrist 1.8 return False
1454 abrinke1 1.5
1455 grchrist 1.10
1456     #### LumiRangeGreens ####
1457     ####inputs: RefMoreLumiArray --dict with lumi page info in LS by LS blocks,
1458     #### LRange --list range over lumis,
1459     #### nls --number of lumisections
1460     #### RefRunNum --run number
1461     ####
1462     ####outputs RangeMoreLumi --lumi page info in dict LSRange blocks with lumi, added items Run and LSRange
1463 grchrist 1.17 def LumiRangeGreens(RefMoreLumiArray,LSRange,nls,RefRunNum,deadtimebeamactive):
1464 grchrist 1.9
1465     RangeMoreLumi={}
1466     for keys,values in RefMoreLumiArray.iteritems():
1467     RangeMoreLumi[keys]=1
1468 grchrist 1.10
1469 grchrist 1.9 for iterator in LSRange[nls]:
1470     for keys, values in RefMoreLumiArray.iteritems():
1471     if RefMoreLumiArray[keys][iterator]==0:
1472     RangeMoreLumi[keys]=0
1473 grchrist 1.10 RangeMoreLumi['LSRange']=LSRange[nls]
1474     RangeMoreLumi['Run']=RefRunNum
1475 grchrist 1.17 RangeMoreLumi['DeadTimeBeamActive']=deadtimebeamactive
1476 grchrist 1.9 return RangeMoreLumi
1477    
1478 grchrist 1.10 #### CheckLumis ####
1479     ####inputs:
1480     #### PageLumiInfo --dict of LS with dict of some lumipage info
1481     #### Rates --dict of triggernames with dict of info
1482     def checkLS(Rates, PageLumiInfo,trig_list):
1483     rateslumis=Rates[trig_list[-1]]["ls"]
1484     keys=PageLumiInfo.keys()
1485     print "lumi run=",PageLumiInfo[keys[-1]]["Run"]
1486     ll=0
1487     for ls in keys:
1488     print ls,rateslumis[ll]
1489     ll=ll+1
1490     return False
1491    
1492    
1493 grchrist 1.71 def checkL1seedChangeALLPScols(trig_list,HLTL1PS):
1494 abrinke1 1.85
1495 grchrist 1.71 nps=0
1496 grchrist 1.74 HLTL1_seedchanges={}
1497 abrinke1 1.85
1498 grchrist 1.71 for HLTkey in trig_list:
1499     if HLTkey=='HLT_Stream_A':
1500     continue
1501 grchrist 1.78 #print HLTkey
1502 abrinke1 1.85 if not HLTkey.startswith('HLT'):
1503     nps=9
1504     HLTL1_seedchanges[HLTkey]=[[0, 1, 2, 3, 4, 5, 6, 7, 8]]
1505     continue
1506    
1507 grchrist 1.71 try:
1508     dict=HLTL1PS[StripVersion(HLTkey)]
1509     #print "dict=",dict
1510     except:
1511 abrinke1 1.85 print HLTkey, StripVersion(HLTkey)
1512 grchrist 1.74 print "exception, in getting dict"
1513 grchrist 1.71 exit(2)
1514 grchrist 1.74
1515 grchrist 1.71 HLTL1dummy={}
1516     for L1seed in dict.iterkeys():
1517     #print L1seed
1518     dummyL1seedlist=[]
1519     #print dict[L1seed]
1520     dummy=dict[L1seed]
1521     L1seedchangedummy=[]
1522     L1fulldummy=[]
1523     nps=len(dict[L1seed])
1524     #print "nps=",nps
1525     for PScol in range(0,len(dict[L1seed])):
1526     PScoldummy=PScol+1
1527 grchrist 1.80 #print "PScoldummy=",PScoldummy
1528     if PScoldummy>(len(dict[L1seed])-1):
1529     PScoldummy=len(dict[L1seed])-1
1530     #print "changed PScoldummy=",PScoldummy
1531 grchrist 1.71 #print PScol, PScoldummy, dummy[PScol]
1532    
1533     if dummy[PScol]==dummy[PScoldummy]:
1534 grchrist 1.80 #print PScol, "same"
1535 grchrist 1.71 L1seedchangedummy.append(PScol)
1536     else:
1537 grchrist 1.80 #print PScol, PScoldummy, "diff", dummy[PScol], dummy[PScoldummy]
1538 grchrist 1.71 L1seedchangedummy.append(PScol)
1539     for ps in L1seedchangedummy:
1540     L1fulldummy.append(L1seedchangedummy)
1541     #print "L1seed change ", L1seedchangedummy, "full=",L1fulldummy
1542     L1seedchangedummy=[]
1543     for ps in L1seedchangedummy:
1544     L1fulldummy.append(L1seedchangedummy)
1545     #print "L1full=",L1fulldummy
1546     HLTL1dummy[L1seed]=L1fulldummy
1547     #print HLTL1dummy
1548 grchrist 1.74 HLTL1_seedchanges[HLTkey]=commonL1PS(HLTL1dummy,nps)
1549 grchrist 1.78 #print HLTkey, HLTL1_seedchanges[HLTkey]
1550     return HLTL1_seedchanges,nps
1551 grchrist 1.74
1552 grchrist 1.71
1553     def commonL1PS(HLTL1dummy, nps):
1554     ### find commmon elements in L1 seeds
1555     HLTL1_seedchanges=[]
1556     for PScol in range(0,nps):
1557    
1558     L1seedslist=HLTL1dummy.keys()
1559     L1tupletmp=set(tuple(HLTL1dummy[L1seedslist.pop()][PScol]))
1560     while len(L1seedslist)>0:
1561     L1tupletmp2=set(tuple(HLTL1dummy[L1seedslist.pop()][PScol]))
1562     L1tupletmp=L1tupletmp & L1tupletmp2
1563 grchrist 1.80 if sorted(list(tuple(L1tupletmp))) not in HLTL1_seedchanges:
1564     HLTL1_seedchanges.append(sorted(list(tuple(L1tupletmp))))
1565 grchrist 1.71 #print HLTL1_seedchanges
1566     return HLTL1_seedchanges
1567 grchrist 1.9
1568 grchrist 1.75 def Fitter(gr1,VX,VY,sloperate,nlow,Rates,print_trigger, first_trigger, varX, varY,linear,lowrate):
1569     if "rate" in varY and not linear:
1570     f1d=0
1571     f1d = TF1("f1d","pol1",0,8000)#linear
1572     f1d.SetParameters(0.01,min(sum(VY)/sum(VX),sloperate)) ##Set Y-intercept near 0, slope either mean_rate/mean_lumi or est. slope (may be negative)
1573     f1d.SetLineColor(4)
1574     f1d.SetLineWidth(2)
1575     if nlow>0:
1576     f1d.SetParLimits(0,0,1.5*lowrate/nlow) ##Keep Y-intercept in range of low-lumi rate points
1577     else:
1578     f1d.SetParLimits(0,0,1.5*sum(VY)/len(VY))
1579     if (sloperate > 0):
1580     if (sloperate > 0.5*sum(VY)/sum(VX)): ##Slope is substantially positive
1581     f1d.SetParLimits(1,min(0.5*sloperate,0.5*sum(VY)/sum(VX)),1.5*sum(VY)/sum(VX))
1582     else: ##Slope is somewhat positive or flat
1583     f1d.SetParLimits(1,-0.1*sloperate,1.5*sum(VY)/sum(VX))
1584     else: ##Slope is negative or flat
1585     f1d.SetParLimits(1,1.5*sloperate,-0.1*sloperate)
1586     gr1.Fit("f1d","QN","rob=0.90")
1587 abrinke1 1.85
1588    
1589 grchrist 1.75 f1a=0
1590     f1a = TF1("f1a","pol2",0,8000)#quadratic
1591     f1a.SetParameters(f1d.GetParameter(0),f1d.GetParameter(1),0) ##Initial values from linear fit
1592     f1a.SetLineColor(6)
1593     f1a.SetLineWidth(2)
1594     if nlow>0 and sloperate < 0.5*sum(VY)/sum(VX): ##Slope is not substantially positive
1595     f1a.SetParLimits(0,0,1.5*lowrate/nlow) ##Keep Y-intercept in range of low-lumi rate points
1596     else:
1597     f1a.SetParLimits(0,0,max(min(VY),0.3*sum(VY)/len(VY))) ##Keep Y-intercept reasonably low
1598     f1a.SetParLimits(1,-2.0*(max(VY)-min(VY))/(max(VX)-min(VX)),2.0*(max(VY)-min(VY))/(max(VX)-min(VX))) ##Reasonable bounds
1599     f1a.SetParLimits(2,-2.0*max(VY)/(max(VX)*max(VX)),2.0*max(VY)/(max(VX)*max(VX))) ##Reasonable bounds
1600     gr1.Fit("f1a","QN","rob=0.90")
1601 abrinke1 1.85
1602    
1603 grchrist 1.75 f1b = 0
1604 abrinke1 1.85 f1c = 0
1605    
1606    
1607 grchrist 1.75 if True:
1608     f1b = TF1("f1b","pol3",0,8000)#cubic
1609     f1b.SetParameters(f1a.GetParameter(0),f1a.GetParameter(1),f1a.GetParameter(2),0) ##Initial values from quadratic fit
1610     f1b.SetLineColor(2)
1611     f1b.SetLineWidth(2)
1612     f1b.SetParLimits(0,0,max(min(VY),0.3*sum(VY)/len(VY))) ##Keep Y-intercept reasonably low
1613     f1b.SetParLimits(1,-2.0*(max(VY)-min(VY))/(max(VX)-min(VX)),2.0*(max(VY)-min(VY))/(max(VX)-min(VX))) ##Reasonable bounds
1614     f1b.SetParLimits(2,-2.0*max(VY)/(max(VX)*max(VX)),2.0*max(VY)/(max(VX)*max(VX))) ##Reasonable bounds
1615     f1b.SetParLimits(3,0,2.0*max(VY)/(max(VX)*max(VX)*max(VX))) ##Reasonable bounds
1616     gr1.Fit("f1b","QN","rob=0.90")
1617 abrinke1 1.85
1618 grchrist 1.75
1619 abrinke1 1.85
1620 grchrist 1.75 f1c = TF1("f1c","[0]+[1]*expo(2)",0,8000)
1621     f1c.SetLineColor(3)
1622     f1c.SetLineWidth(2)
1623     #f1c.SetParLimits(0,0,max(min(VY),0.3*sum(VY)/len(VY)))
1624     f1c.SetParLimits(0,0,max(min(VY),0.01*sum(VY)/len(VY))) ##Exponential fits should start low
1625     f1c.SetParLimits(1,max(VY)/math.exp(15.0),max(VY)/math.exp(2.0))
1626     f1c.SetParLimits(2,0.0,0.0000000001)
1627     f1c.SetParLimits(3,2.0/max(VX),15.0/max(VX))
1628     gr1.Fit("f1c","QN","rob=0.90")
1629 grchrist 1.76
1630    
1631 grchrist 1.75 ##Some fits are so exponential, the graph ends early and returns a false low Chi2 value
1632    
1633     else: ##If this is not a rate plot
1634     f1a = TF1("f1a","pol1",0,8000)
1635     f1a.SetLineColor(4)
1636     f1a.SetLineWidth(2)
1637     if "xsec" in varY:
1638     f1a.SetParLimits(0,0,meanxsec*1.5)
1639     if slopexsec > 0:
1640     f1a.SetParLimits(1,0,max(VY)/max(VX))
1641     else:
1642     f1a.SetParLimits(1,2*slopexsec,-2*slopexsec)
1643     else:
1644     f1a.SetParLimits(0,-1000,1000)
1645     gr1.Fit("f1a","Q","rob=0.80")
1646 grchrist 1.29
1647 grchrist 1.75 if (first_trigger):
1648     print '%-50s %4s x0 x1 x2 x3 chi2 ndf chi2/ndf' % ('trigger', 'type')
1649     first_trigger=False
1650     try:
1651 grchrist 1.76 print '%-50s | line | % .2f | +/-%.2f | % .2e | +/-%.1e | % .2e | +/-%.1e | % .2e | +/-%.1e | %7.0f | %4.0f | %5.2f | ' % (print_trigger, f1a.GetParameter(0), f1a.GetParError(0), f1a.GetParameter(1), f1a.GetParError(1), 0 , 0 , 0 , 0 , f1a.GetChisquare(), f1a.GetNDF(), f1a_GetChisquare()/f1a.GetNDF())
1652 grchrist 1.75 except:
1653     pass
1654 grchrist 1.76 return [f1a,f1b,f1c,f1d,first_trigger]
1655    
1656     def more_fit_info(f1a,f1b,f1c,f1d,VX,VY,print_trigger,Rates):
1657    
1658     meanps = median(Rates[print_trigger]["ps"])
1659     av_rte = mean(VY)
1660 grchrist 1.78 passed=1
1661 grchrist 1.76 #except ZeroDivisionError:
1662 grchrist 1.78 try:
1663     f1a_Chi2 = f1a.GetChisquare()/f1a.GetNDF()
1664     f1b_Chi2 = f1b.GetChisquare()/f1b.GetNDF()
1665     f1c_Chi2 = f1c.GetChisquare()/f1c.GetNDF()
1666     f1d_Chi2 = f1d.GetChisquare()/f1d.GetNDF()
1667     except ZeroDivisionError:
1668     print "Zero DOF for", print_trigger
1669     passed=0
1670 grchrist 1.76 f1a_BadMinimum = (f1a.GetMinimumX(5,7905,10)>2000 and f1a.GetMinimumX(5,7905,10)<7000) ##Don't allow minimum between 2000 and 7000
1671     f1b_BadMinimum = (f1b.GetMinimumX(5,7905,10)>2000 and f1b.GetMinimumX(5,7905,10)<7000)
1672     f1c_BadMinimum = ((f1c.GetMinimumX(5,7905,10)>2000 and f1c.GetMinimumX(5,7905,10)<7000)) or f1c.GetMaximum(min(VX),max(VX),10)/max(VY) > 2.0
1673    
1674 grchrist 1.78 return [f1a_Chi2, f1b_Chi2, f1c_Chi2,f1d_Chi2, f1a_BadMinimum, f1b_BadMinimum, f1c_BadMinimum, meanps, av_rte, passed]
1675 grchrist 1.76
1676 abrinke1 1.86 def output_fit_info(do_fit,f1a,f1b,f1c,f1d,varX,varY,VX,VY,linear,print_trigger,first_trigger,Rates,width,chioffset,wp_bool,num_ls,meanrawrate,OutputFit, failed_paths, PSColslist, dummyPSColslist):
1677 grchrist 1.78 [f1a_Chi2, f1b_Chi2, f1c_Chi2,f1d_Chi2, f1a_BadMinimum, f1b_BadMinimum, f1c_BadMinimum, meanps, av_rte,passed]=more_fit_info(f1a,f1b,f1c,f1d,VX,VY,print_trigger,Rates)
1678 grchrist 1.76 OutputFit[print_trigger] = {}
1679    
1680     if not do_fit:
1681     failure_comment= "Can't have save_fits = True and do_fit = False"
1682     [OutputFit,first_trigger]
1683 grchrist 1.78 failed_paths.append([print_trigger+str(PSColslist),failure_comment])
1684 grchrist 1.76 OutputFit[print_trigger] = ["fit failed",failure_comment]
1685     return [OutputFit,first_trigger]
1686     if min([f1a_Chi2,f1b_Chi2,f1c_Chi2,f1d_Chi2]) > 500:#require a minimum chi^2/nDOF of 500
1687     failure_comment = "There were events for this path in the runs specified during the creation of the fit file, but the fit failed to converge"
1688 grchrist 1.78 failed_paths.append([print_trigger+str(PSColslist),failure_comment])
1689 grchrist 1.76 OutputFit[print_trigger] = ["fit failed",failure_comment]
1690     return [OutputFit,first_trigger]
1691     if "rate" in varY and not linear:
1692     if first_trigger:
1693 grchrist 1.78 print '\n%-*s | TYPE | %-8s | %-11s | %-7s | %-10s | %-7s | %-10s | %-8s | %-10s | %-6s | %-4s |%-7s| %-6s |' % (width,"TRIGGER", "X0","X0 ERROR","X1","X1 ERROR","X2","X2 ERROR","X3","X3 ERROR","CHI^2","DOF","CHI2/DOF","PScols")
1694 grchrist 1.76 first_trigger = False
1695    
1696     if ((f1c_Chi2 < (f1a_Chi2*chioffset) or f1a_BadMinimum) and ((f1c_Chi2 < f1b_Chi2) or f1b_BadMinimum) and f1c_Chi2 < (f1d_Chi2*chioffset) and not f1c_BadMinimum and len(VX)>1):
1697     graph_fit_type="expo"
1698 abrinke1 1.86 [f1c,OutputFit]=graph_output_info(f1c,graph_fit_type,print_trigger,width,num_ls,VX,VY,meanrawrate,OutputFit,PSColslist,dummyPSColslist)
1699     priot(wp_bool,print_trigger,meanps,f1d,f1c,graph_fit_type,av_rte)
1700 grchrist 1.76
1701     elif ((f1b_Chi2 < (f1a_Chi2*chioffset) or f1a_BadMinimum) and f1b_Chi2 < (f1d_Chi2*chioffset) and not f1b_BadMinimum and len(VX)>1):
1702     graph_fit_type="cube"
1703 abrinke1 1.86 [f1b,OutputFit]=graph_output_info(f1b,graph_fit_type,print_trigger,width,num_ls,VX,VY,meanrawrate,OutputFit,PSColslist,dummyPSColslist)
1704 grchrist 1.76 priot(wp_bool,print_trigger,meanps,f1d,f1b,graph_fit_type,av_rte)
1705    
1706     elif (f1a_Chi2 < (f1d_Chi2*chioffset)):
1707     graph_fit_type="quad"
1708 abrinke1 1.86 [f1a,OutputFit]=graph_output_info(f1a,graph_fit_type,print_trigger,width,num_ls,VX,VY,meanrawrate,OutputFit,PSColslist,dummyPSColslist)
1709 grchrist 1.76 priot(wp_bool,print_trigger,meanps,f1d,f1a,graph_fit_type,av_rte)
1710    
1711     else:
1712     graph_fit_type="line"
1713 abrinke1 1.86 [f1d,OutputFit]=graph_output_info(f1d,graph_fit_type,print_trigger,width,num_ls,VX,VY,meanrawrate,OutputFit,PSColslist,dummyPSColslist)
1714 grchrist 1.76 priot(wp_bool,print_trigger,meanps,f1d,f1d,graph_fit_type,av_rte)
1715    
1716     else:
1717     graph_fit_type="quad"
1718 abrinke1 1.86 [f1a,OutputFit]=graph_output_info(f1a,graph_fit_type,print_trigger,width,num_ls,VX,VY,meanrawrate,OutputFit,PSColslist,dummyPSColslist)
1719 grchrist 1.76 #priot(wp_bool,print_trigger,meanps,f1d,f1a,"quad",av_rte)
1720    
1721 grchrist 1.78 return [OutputFit,first_trigger, failed_paths]
1722 awoodard 1.89
1723 abrinke1 1.86 def graph_output_info(graph1,graph_fit_type,print_trigger,width,num_ls,VX, VY,meanrawrate,OutputFit,PSColslist,dummyPSColslist):
1724 grchrist 1.78 PSlist=deque(PSColslist)
1725     PSmin=PSlist.popleft()
1726     if not PSlist:
1727     PSmax=PSmin
1728     else:
1729     PSmax=PSlist.pop()
1730    
1731     print '%-*s | %s | %-8.1f | +/-%-8.1f | %8.1e | +/-%.1e | %8.1e | +/-%.1e | %-8.1e | +/-%.1e | %6.0f | %4.0f | %5.2f | %d-%d' % (width,print_trigger, graph_fit_type,graph1.GetParameter(0) , graph1.GetParError(0) , graph1.GetParameter(1) , graph1.GetParError(1) , graph1.GetParameter(2), graph1.GetParError(2) ,graph1.GetParameter(3), graph1.GetParError(3) ,graph1.GetChisquare() , graph1.GetNDF() , graph1.GetChisquare()/graph1.GetNDF(), PSmin, PSmax)
1732 grchrist 1.76 graph1.SetLineColor(1)
1733 abrinke1 1.86 #priot(wp_bool,print_trigger,meanps,f1d,f1c,"expo",av_rte)
1734     do_high_lumi = print_trigger.startswith('HLT_') and ((len(dummyPSColslist)==1 or ( max(PSColslist)>=5 and min(PSColslist)==3) ))
1735 awoodard 1.89 sigma = CalcSigma(VX, VY, graph1, do_high_lumi)*math.sqrt(num_ls)
1736 grchrist 1.76 OutputFit[print_trigger] = [graph_fit_type, graph1.GetParameter(0) , graph1.GetParameter(1) , graph1.GetParameter(2) ,graph1.GetParameter(3) , sigma , meanrawrate, graph1.GetParError(0) , graph1.GetParError(1) , graph1.GetParError(2) , graph1.GetParError(3)]
1737 awoodard 1.89
1738 grchrist 1.76 return [graph1,OutputFit]
1739    
1740 grchrist 1.77
1741 grchrist 1.78 def DrawFittedCurve(f1a, f1b,f1c, f1d, chioffset,do_fit,c1,VX,VY,print_trigger,Rates):
1742     [f1a_Chi2, f1b_Chi2, f1c_Chi2,f1d_Chi2, f1a_BadMinimum, f1b_BadMinimum, f1c_BadMinimum, meanps, av_rte, passed]=more_fit_info(f1a,f1b,f1c,f1d,VX,VY,print_trigger,Rates)
1743 abrinke1 1.85
1744 grchrist 1.78
1745 grchrist 1.77 if do_fit:
1746     try:
1747     if ((f1c_Chi2 < (f1a_Chi2*chioffset) or f1a_BadMinimum ) and (f1c_Chi2 < f1b_Chi2 or f1b_BadMinimum ) and not f1c_BadMinimum ):
1748     f1c.Draw("same")
1749     elif ( (f1b_Chi2 < (f1a_Chi2*chioffset) or f1a_BadMinimum) and not f1b_BadMinimum):
1750     f1b.Draw("same")
1751     else:
1752     f1a.Draw("same")
1753 abrinke1 1.85
1754 grchrist 1.77 f1d.Draw("same")
1755     except:
1756     True
1757    
1758     c1.Update()
1759 grchrist 1.78
1760     return c1
1761    
1762     def EndMkrootfile(failed_paths, save_fits, save_root, fit_file, RootFile, OutputFit,OutputFitPS,L1SeedChangeFit):
1763    
1764     if len(failed_paths) > 0:
1765     if save_fits:
1766     print "\n***************NO FIT RECORDED FOR THE FOLLOWING PATHS***************"
1767     else:
1768     print "\n***************THE FOLLOWING PATHS HAVE BEEN SKIPPED BECAUSE THE FIT WAS MISSING***************"
1769     sorted_failed_paths = sorted(failed_paths, key=itemgetter(1))
1770     for error_comment, entries in groupby(sorted_failed_paths, key=itemgetter(1)):
1771     error_comment = error_comment.replace('this path','these paths')
1772     print '\n'+error_comment+'.'
1773     for entry in entries:
1774     print entry[0]
1775    
1776     if save_root:
1777     print "\nOutput root file is "+str(RootFile)
1778     #print "DONE:",OutputFit
1779     if save_fits:
1780     if os.path.exists(fit_file):
1781     os.remove(fit_file)
1782     FitOutputFile = open(fit_file, 'wb')
1783     pickle.dump(OutputFit, FitOutputFile, 2)
1784     FitOutputFile.close()
1785     print "Output fit file is "+str(fit_file)
1786     if save_fits and L1SeedChangeFit:
1787     PSfitfile=fit_file.replace("HLT_NoV","HLT_NoV_ByPS")
1788 awoodard 1.89 print "A corresponding PS fit file has been saved."
1789 grchrist 1.78 if os.path.exists(PSfitfile):
1790     os.remove(PSfitfile)
1791     FitOutputFilePS= open(PSfitfile, 'wb')
1792     pickle.dump(OutputFitPS,FitOutputFilePS,2)
1793     FitOutputFilePS.close()
1794    
1795     ##### NEED BETTER gr1 def for failure#####
1796     def DefineGraphs(print_trigger,OutputFit,do_fit,varX,varY,x_label,y_label,VX,VY,VXE,VYE,VF,VFE,fit_file, failed_paths,PSColslist):
1797     passed=1
1798     try:
1799     gr1 = TGraphErrors(len(VX), VX, VY, VXE, VYE)
1800    
1801     except:
1802     failure_comment = "In runs specified during creation of the fit file, there were no events for this path: probably due to high deadtime or low raw (prescaled) rate"
1803     failed_paths.append([print_trigger,failure_comment])
1804     if do_fit:
1805     OutputFit[print_trigger] = ["fit failed",failure_comment]
1806     #gr1 = TGraphErrors(1, VX, VY, VXE, VYE)
1807     #gr3 = TGraphErrors(1, VX, VF, VXE, VFE)
1808     ###replaces continue in main fucntion
1809     passed=0
1810     return [OutputFit,0, 0, failed_paths, passed]
1811     try:
1812     if not do_fit:
1813     gr3 = TGraphErrors(len(VX), VX, VF, VXE, VFE)
1814     else:
1815     ##fake defn (will not be used)
1816     gr3 =TGraphErrors(len(VX), VX, VY, VXE, VYE)
1817     except:
1818     print "gr3 failed to define!"
1819    
1820     exit(2)
1821    
1822    
1823     if not do_fit:
1824     gr3.SetMarkerStyle(8)
1825     gr3.SetMarkerSize(0.4)
1826     gr3.SetMarkerColor(4)
1827     gr3.SetFillColor(4)
1828     gr3.SetFillStyle(3003)
1829    
1830    
1831     if (len(VX)<10 and do_fit):
1832     failure_comment = "In runs specified during creation of the fit file, there were few datapoints for this path: probably due to high deadtime or low raw (prescaled) rate"
1833     failed_paths.append([print_trigger+str(PSColslist),failure_comment])
1834     OutputFit[print_trigger] = ["fit failed",failure_comment]
1835     gr1 = TGraphErrors(1, VX, VY, VXE, VYE)
1836     ###replaces continue in main fucntion
1837     passed=0
1838     return [OutputFit,gr1, gr3,failed_paths, passed]
1839    
1840     gr1.SetName("Graph_"+str(print_trigger)+"_"+str(varY)+"_vs_"+str(varX))
1841     gr1.GetXaxis().SetTitle(x_label)
1842     gr1.GetYaxis().SetTitle(y_label)
1843     gr1.SetTitle(str(print_trigger))
1844     gr1.SetMinimum(0)
1845     gr1.SetMaximum(1.2*max(VY))
1846     #gr1.GetXaxis().SetLimits(min(VX)-0.2*max(VX),1.2*max(VX))
1847     gr1.GetXaxis().SetLimits(0,1.2*max(VX))
1848     gr1.SetMarkerStyle(8)
1849    
1850     if fit_file:
1851     gr1.SetMarkerSize(0.8)
1852     else:
1853     gr1.SetMarkerSize(0.5)
1854     gr1.SetMarkerColor(2)
1855    
1856    
1857     return [OutputFit,gr1, gr3, failed_paths, passed]
1858    
1859     def DrawSave(save_root, save_png, var, varY, print_trigger, do_fit, gr1, gr3, chioffset, f1a, f1b, f1c, f1d, RootFile):
1860     if save_root or save_png:
1861     c1 = TCanvas(str(varX),str(varY))
1862     c1.SetName(str(print_trigger)+"_"+str(varY)+"_vs_"+str(varX))
1863     gr1.Draw("APZ")
1864     if not do_fit:
1865     gr3.Draw("P3")
1866     c1.Update()
1867     else:
1868     c1=DrawFittedCurve(f1a, f1b, f1c, f1d, chioffset,do_fit,c1)
1869    
1870 grchrist 1.77 if save_root:
1871     myfile = TFile( RootFile, 'UPDATE' )
1872     c1.Write()
1873     myfile.Close()
1874     if save_png:
1875     c1.SaveAs(str(print_trigger)+"_"+str(varY)+"_vs_"+str(varX)+".png")
1876 grchrist 1.78
1877 grchrist 1.76
1878 abrinke1 1.1 if __name__=='__main__':
1879 grchrist 1.29 global thisyear
1880 abrinke1 1.1 main()