diff --git a/Tracker/TrackerRecAlgs/PairVertex/scripts/CutNtuple.py b/Tracker/TrackerRecAlgs/PairVertex/scripts/CutNtuple.py new file mode 100644 index 0000000000000000000000000000000000000000..ea69111172c5a38f2c27608b68d0b3a1d11b2c0a --- /dev/null +++ b/Tracker/TrackerRecAlgs/PairVertex/scripts/CutNtuple.py @@ -0,0 +1,55 @@ +import ROOT +from glob import glob + +dataDir="/eos/experiment/faser/phys/2022/r0011/" +RunDirs = sorted(glob(dataDir+'*')) + +outFile = ROOT.TFile.Open('ReNtuple.root',"RECREATE") +outtree = 0 + +fcount=0 + +for runnum in RunDirs: + files = sorted(glob(f"{dataDir}{runnum}/Faser*")) + for f in files: + inFile = ROOT.TFile.Open(f,"READ") + intree = inFile.Get('nt') + if fcount==0: outtree=intree.CloneTree(0) + outtree.CopyEntries(intree) + inFile.Close() + break + break + +outFile.Write() + +# t = TChain("nt") +# nfiles = 0 +# for f in files: +# nfiles += t.Add(f) #t.Add("/eos/experiment/faser/phys/2022/r0011/"+user_input+".root") +# print(f) + + +# #---------------------------- +# # Get old file, old tree and set top branch address +# ofilename="/eos/experiment/faser/phys/2022/r0011/" #.... +# oldfile= ROOT.TFile.Open(ofilename,"READ") +# oldtree = oldfile.Get("nt") + +# nentries = oldtree.GetEntries() + +# event = 0 +# oldtree.SetBranchAddress("event", &event) + +# # Create a new file + a clone of old tree in new file +# TFile newfile("small.root", "recreate"); +# auto newtree = oldtree->CloneTree(0); + +# for (auto i : ROOT::TSeqI(nentries)) { +# oldtree->GetEntry(i); +# if (event->GetNtrack() > 605) +# newtree->Fill(); +# event->Clear(); +# } + +# #newtree.Print(); +# newfile.Write(); \ No newline at end of file diff --git a/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py b/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py index ba1696276cf4c9f37fb6b1fb5be9bbb657f7f558..08f0888f95902674676d71761872774141bacdaa 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py +++ b/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py @@ -1,10 +1,12 @@ #!/usr/bin/env python from PlotHelper import * from Utilities import * +from glob import glob #CUTS +#attr: [>,<,==,!=] if none --> skip REALCUT={ - 'longTracks':[2,None,None,None],} + 'longTracks':[1,None,None,None],} # 'Track_nLayers':[6,None,None,None], # 'Track_nDoF':[0,None,None,None], # 'Track_Chi2':[0,None,None,None], @@ -12,16 +14,20 @@ REALCUT={ # 'Preshower1_charge':[0,None,None,None] # } +#LAMBDAS AND CONDITIONALS + REALLAMBDAS=[ - lambda event: event.Timing0_charge+Timing1_charge+Timing2_charge+Timing3_charge>0, - lambda event: event.Calo0_charge+Calo1_charge+Calo2_charge+Calo3_charge>0, - lambda event: all([event.Track_nLayers[i]>6 for i in event.longTracks]) -] + lambda event: event.Timing0_charge+event.Timing1_charge+event.Timing2_charge+event.Timing3_charge>0, + lambda event: event.Calo0_charge+event.Calo1_charge+event.Calo2_charge+event.Calo3_charge>20000] +# lambda event: AnyCaloThreshold, +# lambda event: all([event.Track_nLayers[i]>6 for i in event.longTracks]) +# ] def GeneralPlotter(arrDict,dcuts=[],lcuts=[],showplot=True,savefig=False): nans=0 - + ecount=0 for event in t: + if ApplyAllCuts(event,dcuts,lcuts): for name in arrDict.keys(): value=nan @@ -39,6 +45,8 @@ def GeneralPlotter(arrDict,dcuts=[],lcuts=[],showplot=True,savefig=False): arrDict[name]['array'][iv]+=[value[iv]] elif checkReal: arrDict[name]['array']+=[value] else: nans+=1 + if ecount%100000==0:print(ecount,' events processed') + ecount+=1 print(f"# of NaNs:{nans}") for name in arrDict.keys(): @@ -65,7 +73,7 @@ MainArrDict={ 'CutTest':{ 'array':[], 'lambda': ApplyAllCuts, - 'lkwargs':{'dcuts':[REALCUT],'lcuts':[]}, + 'lkwargs':{'dcuts':[REALCUT],'lcuts':REALLAMBDAS}, 'plotterfunc': PrintBoolPercent, 'plotkwargs' : {}, 'descr':'Check how much a cut cuts.' @@ -76,22 +84,44 @@ MainArrDict={ 'plotterfunc': configBasicHist, 'plotkwargs' : {}, 'descr':'Single variable tests.' + }, + 'HighestMomentumUp':{ + 'array':[[],[]], + 'lambda': lambda event: sorted([p for p in event.Track_p0]), + 'plotterfunc': configMultiHist, + 'plotkwargs' : {'label':['Lowest','Highest'],'pckwargs':{'xscale':'symlog','xlabel':"Momentum (MeV)",'legend':True}}, + 'descr':'Look at 2 highest momentum tracks upstream' + }, + 'HighestMomentumDown':{ + 'array':[[],[]], + 'lambda': lambda event: sorted([p for p in event.Track_p1]), + 'plotterfunc': configMultiHist, + 'plotkwargs' : {'label':['Lowest','Highest'],'pckwargs':{'xscale':'symlog','xlabel':"Momentum (MeV)",'legend':True}}, + 'descr':'Look at 2 highest momentum tracks downstream' },} TestArrDict=dict() -testname='BasicHist' #Any key from MainArrDict +testname='HighestMomentumDown' #Any key from MainArrDict TestArrDict[testname]=MainArrDict[testname] +def getRunFiles(rnum,dataDir="/eos/experiment/faser/phys/2022/r0011/"): + dataDir=f"{dataDir}{rnum}/" + return sorted(glob(f"{dataDir}/Faser*")) + +def getRunNums(dataDir="/eos/experiment/faser/phys/2022/r0011/"): + return [rn.split(dataDir)[1] for rn in sorted(glob(f"{dataDir}*"))] #EXECUTE if __name__ == "__main__": - DP_fnames=['008301/Faser-Physics-008301-00000-00049-r0011-PHYS'] - for f in DP_fnames: - user_input=f - t = TChain("nt") - nfiles = 0 - nfiles += t.Add("/eos/experiment/faser/phys/2022/r0011/"+user_input+".root") - print(f) - - GeneralPlotter(TestArrDict,dcuts=[{}],lcuts=[]) \ No newline at end of file + #runnum = '008301' + t = TChain("nt") + nfiles = 0 + for runnum in getRunNums(): + files = getRunFiles(runnum) + for f in files: + print(f) + nfiles += t.Add(f) #t.Add("/eos/experiment/faser/phys/2022/r0011/"+user_input+".root") + + + GeneralPlotter(TestArrDict,dcuts=[{'longTracks':[None,None,2,None],}],lcuts=[],savefig=True) \ No newline at end of file diff --git a/Tracker/TrackerRecAlgs/PairVertex/scripts/PairVertexReader.py b/Tracker/TrackerRecAlgs/PairVertex/scripts/PairVertexReader.py index f585d0e61a539b8015ca4897b51f5a231c9804ac..7bb21a7e3f961033da2b3b2d2c244d7eed784fbe 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/scripts/PairVertexReader.py +++ b/Tracker/TrackerRecAlgs/PairVertex/scripts/PairVertexReader.py @@ -103,6 +103,82 @@ def GetAllTrackMomentum(event): return finalval +def CountSharedCluster(event,filter=None): + #How many clusters have energy contributions from both daughter particles? + sharedcount=0 + for c in range(len(event.clusterEFracPos)): + if event.clusterETotPos[c]>0 and event.clusterETotNeg[c]>0 and event.clusterEFracPos[c]<0.99 and event.clusterEFracNeg[c]<0.99: sharedcount+=1 + if (filter and filter(event)) or not filter: + return sharedcount + else: return nan + +def CountSharedClusterCompare(event): + #How many clusters have energy contributions from both daughter particles? + sharedcount=0 + sharedcountarr=[0,0,0] #[No filter, pass, fail] + for c in range(len(event.clusterEFracPos)): + if event.clusterETotPos[c]>0 and event.clusterETotNeg[c]>0 and event.clusterEFracPos[c]<0.99 and event.clusterEFracNeg[c]<0.99: + sharedcount+=1 + + filters = [lambda e:True,BoolDaughterCut2,BoolDaughterCut3] + for i in range(len(filters)): + if filters[i](event): sharedcountarr[i]=sharedcount + else: sharedcountarr[i]=nan + + return sharedcountarr + +def VertexZCompare(event): + val = event.vertexPos[2] + countarr=[0,0,0] #[No filter, HasShared, NoShared] + filters = [lambda e:True,BoolHasSharedCluster,BoolNotHasSharedCluster] + for i in range(len(filters)): + if filters[i](event): countarr[i]=val + else: countarr[i]=nan + + return countarr + +def ClusterLocation(event): + starr=[] + for loc in event.clusterLocation: + starr+=[int(str(loc).split()[0])] + return starr + +def MakeCompareArray(event,getvaluelambda,filters): + val = getvaluelambda(event) + countarr=[0 for i in range(len(filters))] + for fi in range(len(filters)): + if filters[i](event): countarr[i]=val + else: countarr[i]=nan + + return countarr + +def BoolDaughterCut(event): + #both daughter particles are matched to tracks + if event.TrackCount>=2 and len(event.tracksTruthBarcode)>=2: + return 2 in event.tracksTruthBarcode and 3 in event.tracksTruthBarcode + else: return False + +def BoolDaughterCut2(event): + #passes track cuts and is fiducial + return event.TrackCount>=2 and 2 in event.tracksTruthBarcode and 3 in event.tracksTruthBarcode and event.truthd0_IsFiducial and event.truthd1_IsFiducial + +def BoolDaughterCut3(event): + #fails track cuts and is not fiducial + return any([event.TrackCount<2, 2 not in event.tracksTruthBarcode, 3 not in event.tracksTruthBarcode]) and event.truthd0_IsFiducial and event.truthd1_IsFiducial + +def BoolHasSharedCluster(event): + #Does the event have shared clusters? + sharedcount=0 + for c in range(len(event.clusterEFracPos)): + if event.clusterETotPos[c]>0 and event.clusterETotNeg[c]>0 and event.clusterEFracPos[c]<0.99 and event.clusterEFracNeg[c]<0.99: sharedcount+=1 + return sharedcount>0 + +def BoolNotHasSharedCluster(event): + #Does the event have shared clusters? + sharedcount=0 + for c in range(len(event.clusterEFracPos)): + if event.clusterETotPos[c]>0 and event.clusterETotNeg[c]>0 and event.clusterEFracPos[c]<0.99 and event.clusterEFracNeg[c]<0.99: sharedcount+=1 + return sharedcount==0 #For storing different plot configurations MainArrDict={ @@ -191,12 +267,68 @@ MainArrDict={ 'plotterfunc': configBasicHist, 'plotkwargs' : {'bins':20,'kwargs':{'range':[-10,11]},'pckwargs':{'xscale':'linear','xlabel':"Residual"}} }, + 'CountSharedCluster':{ + 'array':[], + 'lambda': CountSharedCluster, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {'bins':25,'kwargs':{'range':[0,26]}}, + 'descr':'How many clusters have energy deposits from both daughter particles and fail track cuts?' + }, + 'CountSharedCluster_PassTrackCuts':{ + 'array':[], + 'lambda': CountSharedCluster, + 'lkwargs':{'filter':BoolDaughterCut2}, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {'bins':25,'kwargs':{'range':[0,26]}}, + 'descr':'How many clusters have energy deposits from both daughter particles and pass track cuts?' + }, + 'CountSharedCluster_FailTrackCuts':{ + 'array':[], + 'lambda': CountSharedCluster, + 'lkwargs':{'filter':BoolDaughterCut3}, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {'bins':25,'kwargs':{'range':[0,26]}}, + 'descr':'How many clusters have energy deposits from both daughter particles and fail track cuts?' + }, + 'CountSharedCluster_Compare':{ + 'array':[[],[],[]], + 'lambda': CountSharedClusterCompare, + 'plotterfunc': configMultiHist, + 'plotkwargs' : {'label':['No Cuts','Passes Track Cuts','Fails Track Cuts'],'bins':25,'kwargs':{'range':[0,26]},'pckwargs':{'xscale':'linear','legend':True}}, + 'descr':'How many clusters have energy deposits from both daughter particles?', + 'SepHist':'arrays allowed to have different lengths' + }, + 'DPDecayVertexZ':{ + 'array':[], + 'lambda': lambda event: event.vertexPos[2], + 'plotterfunc': configBasicHist, + 'plotkwargs' : {}, + 'descr':'Dark photon decay vertex coordinate along beamline' + }, + 'DPDecayVertexZ_Compare':{ + 'array':[[],[],[]], + 'lambda': VertexZCompare, + 'plotterfunc': configMultiHist, + 'plotkwargs' : {'label':['No Cuts','Has Shared Clusters','No Shared Clusters'],'bins':25,'kwargs':{'range':[-1600,0]},'pckwargs':{'xscale':'linear','legend':True,'legloc':'center right'}}, + 'descr':'Compare dp-decay z-coordinate cuts', + 'SepHist':'arrays allowed to have different lengths' + }, + 'AllClusterLocations':{ + 'array':[], + 'lambda': ClusterLocation, + 'plotterfunc': configBasicHist, + 'plotkwargs' :{'bins':5,'kwargs':{'range':[0,5]}}, + }, } + + #energy deposited hist + #frac of energy deposited hist + # TestArrDict=dict() -testname='NormalizedResidualSum' #Any key from MainArrDict +testname='DPDecayVertexZ_Compare' #Any key from MainArrDict TestArrDict[testname]=MainArrDict[testname] # for k in MainArrDict.keys(): # if 'Check' in k: @@ -215,6 +347,8 @@ def GeneralPlotter(arrDict,dcuts=[],lcuts=[],showplot=True,savefig=False): checkReal=True if type(value)==list: checkReal = all([v != inf and v !=nan and v !=-1*inf for v in value]) else: checkReal = value != inf and value !=nan and value !=-1*inf + #if 'SepHist' in list(arrDict[name].keys()): checkReal=False + if checkReal and type(value)==list: if arrDict[name]['plotterfunc'] in [configBasicHist]: arrDict[name]['array']+=value @@ -222,6 +356,16 @@ def GeneralPlotter(arrDict,dcuts=[],lcuts=[],showplot=True,savefig=False): for iv in range(len(value)): arrDict[name]['array'][iv]+=[value[iv]] elif checkReal: arrDict[name]['array']+=[value] + elif 'SepHist' in list(arrDict[name].keys()): + # if type(value[0])==list: + # for vi in range(len(value)): + # checkList=[v != inf and v !=nan and v !=-1*inf for v in value[vi]] + # for ivch in len(checkList): + # if checkList[ivch]: arrDict[name]['array'][vi]+=[value[vi][ivch]] + checkList=[v != inf and v !=nan and v !=-1*inf for v in value] + for ich in len(checkList): + if checkList[ich]: arrDict[name]['array'][ich]+=[value[ich]] + else: nans+=1 print(f"# of NaNs:{nans}") @@ -237,13 +381,13 @@ def GeneralPlotter(arrDict,dcuts=[],lcuts=[],showplot=True,savefig=False): #EXECUTE if __name__ == "__main__": - DP_fnames=['Ntuple_Aee_100MeV_1Em5_']# Ntuple_Aee_10MeV_1Em5_ Ntuple_Amm_316MeV_2Em6_ Ntuple_Aee_10MeV_1Em4_ + DP_fnames=['Ntuple_Amm_316MeV_2Em6_']# Ntuple_Aee_10MeV_1Em5_ Ntuple_Amm_316MeV_2Em6_ Ntuple_Aee_10MeV_1Em4_ Ntuple_Aee_100MeV_1Em5_ for f in DP_fnames: user_input=f t = TChain("events") nfiles = 0 - nfiles += t.Add("/eos/home-s/sshively/CALYPZONE/run/BackUp2/"+user_input+".root") + nfiles += t.Add("/eos/home-s/sshively/CALYPZONE/run/"+user_input+".root") print(f) - GeneralPlotter(TestArrDict,dcuts=[{}],lcuts=[BoolDaughterCut]) + GeneralPlotter(TestArrDict,dcuts=[{}],lcuts=[]) #print(GetPBounds(lcuts=[BoolDaughterCut])) diff --git a/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py b/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py index 8597d9cab9779c8ff2fd2e04744730a6f2f3efa7..5ebbdf55462c15b5d2f31ce8c326fdadaa41c298 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py +++ b/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py @@ -3,7 +3,7 @@ from cmcrameri import cm import matplotlib.pyplot as plt from ROOT import TEfficiency, TH1F -def PlotConfigs(xscale='linear',yscale='linear',xlim=None,ylim=None,title=None,show=False,xticks=None,xlabel=None,ylabel='#Events',legend=False,legloc='best'): +def PlotConfigs(xscale='linear',yscale='linear',xlim=None,ylim=None,title=None,show=False,xticks=None,xlabel=None,ylabel='#Events',legend=False,legloc='best',save=False): plt.xscale(xscale) plt.yscale(yscale) if xticks: plt.xticks(xticks) @@ -12,6 +12,9 @@ def PlotConfigs(xscale='linear',yscale='linear',xlim=None,ylim=None,title=None,s if legend: plt.legend(loc=legloc) if title:plt.title(title) if show: plt.show() + #filename = title.replace(" ", "_").replace("(", "").replace(")", "") + #if save: plt.savefig(filename) + def configHitMap(arrays,bins=(50,50),pckwargs={'xlabel':"X (mm)",'ylabel':"Y (mm)"},counts=False,kwargs={}): #2D Histogram with colors diff --git a/Tracker/TrackerRecAlgs/PairVertex/scripts/Utilities.py b/Tracker/TrackerRecAlgs/PairVertex/scripts/Utilities.py index 43eba0369ec626cf87400a803d4ca6d0655dbdce..03d4cba8a24fb251b0dcb9e478860eff90c4fe1f 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/scripts/Utilities.py +++ b/Tracker/TrackerRecAlgs/PairVertex/scripts/Utilities.py @@ -22,15 +22,6 @@ BASICCUT={ } - - -def BoolDaughterCut(event): - if event.TrackCount>=2 and len(event.tracksTruthBarcode)>=2: - return 2 in event.tracksTruthBarcode and 3 in event.tracksTruthBarcode - else: return False - - - def ApplyCut(event, cut): tests=[gt,lt,eq,ne] bool1=[]