Source code for bsmart.collider.MA5aux

"""

Auxiliary routines for MadAnalysis

"""


import math


[docs] def ReadCutFlow(cffile): try: IF=open(cffile,'r') except: raise NameError('Could not open cutflow file '+cffile) myN0=-1 myNf=-1 myNN=-1 efficiencies=[] alleffs=[] cutname="" IsInitial=False IsCounter=False for line in IF: #print(line) if "<InitialCounter>" in line: IsInitial = True continue elif "</InitialCounter>" in line: IsInitial = False continue elif "<Counter>" in line: IsCounter = True continue elif "</Counter>" in line: cutname="" myNf=-1 IsCounter = False continue if IsInitial and "sum of weights" in line and not '^2' in line: #print('Found N0') myN0 = float(line.split()[0])+float(line.split()[1]) if IsCounter and line.startswith('\"'): #print(line.strip().find('#')) cutname=line[:line.strip().find('#')] if IsCounter and "sum of weights" in line and not '^2' in line: myNf = float(line.split()[0])+float(line.split()[1]) if myN0 <=0.0 : raise NameError('Found cutflow but no initial events') eff=myNf/myN0 if(eff > 0): err=math.sqrt((1-eff)/(eff*myNN)) else: err=0.0 #efficiencies.append([cutname,eff,err]) efficiencies=[cutname,eff,err] ### return just the last line alleffs.append(efficiencies) if IsInitial and "nentries" in line: myNN=int(line.split()[0]) #print(efficiencies) #close(IF) IF.close() #if efficiencies[1]>0.0001 and efficiencies[2] > 0.15: # print('Uncertainty %.1f %% on efficiency %.2e for cutflow %s!' % (efficiencies[2]*100.0,efficiencies[1],cffile)) #return {"efficiency": efficiencies[1], "uncertainty": efficiencies[2], "Total Weights": myN0, "Events": myNN} lasteff={"efficiency": efficiencies[1], "uncertainty": efficiencies[2], "Total Weights": myN0, "Events": myNN} return alleffs,lasteff
if __name__ == "__main__": import sys import os if len(sys.argv) < 2 or not os.path.exists(sys.argv[1]): print("Specify a cutflow filename!") raise SystemExit try: alleff,leff=ReadCutFlow(sys.argv[1]) except Exception as e: print("Failed: "+str(e)) print("=====================================") print("File: %s" % sys.argv[1]) print("Events: %d" % leff["Events"]) for cut in alleff: print("%s: %.4e (=/- %.4f rel. error)" %(cut[0],cut[1],cut[2]))