diff --git a/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py b/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py index cb7501eb978684994dacdbe47e52309c65186568..6b38ab88087a105b0cc872b84dba2aa0a8c8b005 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py +++ b/Tracker/TrackerRecAlgs/PairVertex/scripts/NtupleReader.py @@ -29,20 +29,19 @@ BASELINE={ 'Calo_total_E_EM':[500,None,None,None] } -DATAONLY={'distanceToCollidingBCID ':[None,None,0,None],} - PHOTONCONV={ 'Preshower0_charge':[12,None,None,None], 'Preshower1_charge':[12,None,None,None], + 'nClusters0':[None,8,None,None], + 'nClusters2':[14,None,None,None], 'nClusters3':[14,None,None,None], - 'Calo_total_E_EM':[None,5000000,None,None] - + 'Calo_total_E_EM':[None,5000000,None,None] } PHOTONCONV_L=[ lambda event: (event.Timing0_charge+event.Timing1_charge>120) or (event.Timing2_charge+event.Timing3_charge>120), lambda event: (event.Calo_total_E_EM-330)/(sum(event.Track_p0)-max(event.Track_p0))>0.7 -] +] #Also: BoolOrphanTSegSt3, #LAMBDAS AND CONDITIONALS @@ -50,9 +49,6 @@ PHOTONCONV_L=[ REALLAMBDAS=[ 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>0] -# lambda event: AnyCaloThreshold, -# lambda event: all([event.Track_nLayers[i]>6 for i in event.longTracks]) -# ] WAVEFORMLAMBDAS=[ lambda event: event.Timing0_charge+event.Timing1_charge+event.Timing2_charge+event.Timing3_charge>0, @@ -103,7 +99,7 @@ def BoolGoodTracks(event): tests+=[sqrt(event.Track_x0[i]**2+event.Track_y0[i]**2)<R and sqrt(event.Track_x1[i]**2+event.Track_y1[i]**2)<R and sqrt(event.Track_X_atVetoNu[i]**2+event.Track_Y_atVetoNu[i]**2)<R] if all(tests): gt_i+=[i] - return len(gt_i)>=2 + return len(gt_i)==event.longTracks #iterate over all tracks #count tracks that are good @@ -515,21 +511,117 @@ def GetepenSep(event): def testst0(event): return [i for i in event.TrackSegment_z] -# +def FloatPtleInFirst10(event): + exclude=[] + tp0list=[j for j in event.Track_p0] + for i in range(event.longTracks): + if tp0list.count(tp0list[i])>1: exclude+=[i] + + t10=[] + for j in event.truthParticleBarcode: + if len(t10)<=10: t10+=[j] + + doublecheck=[] + dci=[] + dcount=0 + dp=[] + for i in range(event.longTracks): + if i not in exclude: + bc = event.t_barcode[i] + if bc in doublecheck: + #print(event.t_pdg) + #print("Double-counted!") + dp+=[event.Track_p0[i]] + dcount+=1 + elif i not in doublecheck: + doublecheck+=[bc] + dci+=[i] + + return dp#dcount/len(event.t_barcode) + +def BoolCorrectSignalPhConv(event): + return -11 in event.t_pdg and 11 in event.t_pdg and (13 in event.t_pdg or -13 in event.t_pdg) + +def BoolCloseSignalPhConv(event): + return (-11 in event.t_pdg or 11 in event.t_pdg) and (13 in event.t_pdg or -13 in event.t_pdg) + +def FloatGetDiffVertex(event): + #are the electrons in the event from the same vertex? + #get indicies of electron tracks + ei=[i for i in range(event.longTracks) if abs(event.t_pdg[i])==11] + dist=sqrt(((event.truth_prod_x[ei[0]]-event.truth_prod_x[ei[1]])**2)+((event.truth_prod_y[ei[0]]-event.truth_prod_y[ei[1]])**2)) #+((event.truth_prod_z[ei[0]]-event.truth_prod_z[ei[1]])**2) + return dist + +def BoolIsMaxMomMuon(event): + plist=[i for i in event.Track_p0] + mi=plist.index(max(plist)) + return event.t_pdg[mi] in [-13,13] + +def GetMaxPIndex(event): + plist=[i for i in event.Track_p0] + return plist.index(max(plist)) + +# def GetTrackSepEE(event): +# mi=GetMaxPIndex(event) +# tri = [i for i in range(event.longTracks) if i!=mi] +# return + +def GetAllNonMuonMom(event): + mi=GetMaxPIndex(event) + p=[] + for i in range(event.longTracks): + if i!=mi: p+=[event.Track_p0[i]] + + return p + +def GetAllNonMuonMomTruth(event): + mi=GetMaxPIndex(event) + p=[] + if event.t_pdg[mi] not in [-13,13]: return p + for i in range(event.longTracks): + if i!=mi: + p+=[event.truth_P[i]] + + return p + +def PolarMomCoord(event): + p=[0,0,0] + + for pi in range(event.longTracks): + p[0]+=event.Track_px0[pi] + p[1]+=event.Track_py0[pi] + p[2]+=event.Track_pz0[pi] + + return arctan(sqrt(p[0]**2+p[1]**2)/p[2]) + +def PolarMomCoordTruth(event): + p=[0,0,0] + + for pi in range(event.longTracks): + p[0]+=event.t_px[pi] + p[1]+=event.t_py[pi] + p[2]+=event.t_pz[pi] + + return arctan(sqrt(p[0]**2+p[1]**2)/p[2]) + + + + + MainArrDict={ 'CutTest':{ 'array':[], 'lambda': ApplyAllCuts, - 'lkwargs':{'dcuts':[],'lcuts':[]}, #{'dcuts':[BASELINE],'lcuts':[BoolGoodTracks,BoolTimingBaseline]}, + 'lkwargs':{'dcuts':[],'lcuts':[BoolIsMaxMomMuon]}, #{'dcuts':[BASELINE],'lcuts':[BoolGoodTracks,BoolTimingBaseline]}, 'plotterfunc': PrintBoolPercent, 'plotkwargs' : {}, 'descr':'Check how much a cut cuts.' }, 'BasicHist':{ 'array':[], - 'lambda': testst0, + 'lambda': FloatPtleInFirst10, 'plotterfunc': configBasicHist, - 'plotkwargs' : {}, + 'plotkwargs' : {'pckwargs':{'xscale':'log'}}, 'descr':'Single variable tests.' }, 'HighestMomentumUp':{ @@ -747,6 +839,41 @@ MainArrDict={ 'plotkwargs' : {}, 'descr':'Single variable tests.' }, + 'VertexDiff':{ + 'array':[], + 'lambda': FloatGetDiffVertex, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {}, + 'descr':'Single variable tests.' + }, + 'NonMuonMom':{ + 'array':[], + 'lambda': GetAllNonMuonMom, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {'kwargs':{'range':[10**3,10**8]},'pckwargs':{'xscale':'log','xlabel':"Momentum (MeV)",'ylabel':"#Tracks",'legend':True}},# + 'descr':'Look at momentum tracks upstream' + }, + 'AllNonMuonMomTruth':{ + 'array':[], + 'lambda': GetAllNonMuonMomTruth, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {'kwargs':{'range':[10**3,10**8]},'pckwargs':{'xscale':'log','xlabel':"Momentum (MeV)",'ylabel':"#Tracks",'legend':True}},# + 'descr':'Look at momentum tracks upstream' + }, + 'PolarMomCoord':{ + 'array':[], + 'lambda': PolarMomCoord, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {'kwargs':{'range':[0,0.01]},'pckwargs':{}}, + 'descr':'Single variable tests.' + }, + 'PolarMomCoordTruth':{ + 'array':[], + 'lambda': PolarMomCoordTruth, + 'plotterfunc': configBasicHist, + 'plotkwargs' : {'kwargs':{'range':[0,0.01]},'pckwargs':{}}, + 'descr':'Single variable tests.' + }, } TestArrDict=dict() @@ -758,8 +885,8 @@ TestArrDict[testname]=MainArrDict[testname] def getRunFiles(rnum): #/eos/home-s/sshively/CALYPZONE/run/MC-tuple-110038.root - dataDir=f"/eos/experiment/faser/sim/mc22/foresee/{rnum}/phy/r0013/" #f"{dataDir}{rnum}/" - return sorted(glob(f"{dataDir}/Faser*-r0013-PHYS.root")) + dataDir=f"/eos/experiment/faser/sim/mc22/foresee/{rnum}/phy/r0014/" #f"{dataDir}{rnum}/" + return sorted(glob(f"{dataDir}/Faser*-PHYS.root")) def getFlukaFile(rnum): dataDir=f"/eos/experiment/faser/sim/mc22/particle_gun/{rnum}/phy/s0010-r0013/" #f"{dataDir}{rnum}/" @@ -801,7 +928,7 @@ def GetPDG(t): #EXECUTE if __name__ == "__main__": - #ITERATE OVER SKIMMED DATA + #ITERATE OVER SKIMMED DATA (phConv) # t = TChain("nt") # nfiles = 0 # fgrab='' @@ -813,19 +940,19 @@ if __name__ == "__main__": # fgrab=f # nfiles += t.Add(f) - #ITERATE OVER SKIMMED MC - t = TChain("nt") - nfiles = 0 - fgrab='' - for runnum in getRunNums(dataDir='/eos/home-s/sshively/SKIMMED_STUFF/'): - if runnum=='r0013' or int(runnum) not in [100041,100042]: continue # - files = sorted(glob(f"/eos/home-s/sshively/SKIMMED_STUFF/{runnum}/test_0.root")) - for f in files: - print(f) - fgrab=f - nfiles += t.Add(f) + #ITERATE OVER SKIMMED MC (phConv) + # t = TChain("nt") + # nfiles = 0 + # fgrab='' + # for runnum in getRunNums(dataDir='/eos/home-s/sshively/SKIMMED_STUFF/'): + # if runnum=='r0013' or int(runnum) not in [100041,100042]: continue # + # files = sorted(glob(f"/eos/home-s/sshively/SKIMMED_STUFF/{runnum}/test_0.root")) + # for f in files: + # print(f) + # fgrab=f + # nfiles += t.Add(f) - #ITERATE OVER FULL DATA + #ITERATE OVER FULL DATA (phConv) # t = TChain("nt") # nfiles = 0 # fgrab='' @@ -836,7 +963,7 @@ if __name__ == "__main__": # fgrab=f # nfiles += t.Add(f) - #ITERATE OVER FULL MC + #ITERATE OVER FULL MC (phConv) # t = TChain("nt") # nfiles = 0 # fgrab='' @@ -846,27 +973,28 @@ if __name__ == "__main__": # print(f) # fgrab=f # nfiles += t.Add(f) - - #for runnum in [f'1100{ri}' for ri in [52,60,48,61,62,49,50,41,63,64,42,43,44,45,73,74,75,37,38,39,32]]:#,52,55,35,42,49,36,43,50,37,44,31,45]]:#getRunNums(): - # + + #FULL DP SAMPLE + for runnum in [f'1100{ri}' for ri in [52,60,48,61,62,49,50,41,63,64,42,43,44,45,73,74,75,37,38,39,32]]:#,52,55,35,42,49,36,43,50,37,44,31,45]]:#getRunNums(): + # if int(runnum[-2:]) in [28,33,38,51]: continue + if int(runnum[-2:]) != 38: continue + # if int(runnum[-2:]) not in [48,49]: continue# - #if int(runnum[-2:]) in [28,33,38,51]: continue - #if int(runnum[-2:]) != 38: continue - #if int(runnum[-2:]) not in [48,49]: continue# - #if runnum=='r0013' or int(runnum) in [100042,100041]: continue #skip MC files - # if runnum=='r0013' or int(runnum) not in [100041]: continue + files = getRunFiles(runnum) # getAnyFile(runnum) # getRunFiles(runnum) getAnyRunFiles(runnum,"/eos/experiment/faser/phys/2022/r0014/") getFlukaFile('100041') + user_input=f'Ntuple_Run{runnum}' - # files = getRunFiles(runnum) # getAnyFile(runnum) # getRunFiles(runnum) getAnyRunFiles(runnum,"/eos/experiment/faser/phys/2022/r0014/") getFlukaFile('100041') - # user_input=f'Ntuple_Run{runnum}' - - # for f in files: - # print(f) - # fgrab=f - # nfiles += t.Add(f) #t.Add("/eos/experiment/faser/phys/2022/r0011/"+user_input+".root") + t = TChain("nt") + nfiles = 0 + fgrab='' + for f in files: + print(f) + fgrab=f + nfiles += t.Add(f) #t.Add("/eos/experiment/faser/phys/2022/r0011/"+user_input+".root") #print(files[0]) - #GeneralPlotter(t,MakePlotDict('CutTest'),dcuts=[],lcuts=[BoolBothDaughtersFiducial]) + GeneralPlotter(t,MakePlotDict('PolarMomCoord'),dcuts=[BASELINE,{'longTracks':[0,3,None,None],}],lcuts=[BoolTimingBaseline,BoolGoodTracks],label='Reco',showplot=False) + GeneralPlotter(t,MakePlotDict('PolarMomCoordTruth'),dcuts=[BASELINE,{'longTracks':[0,3,None,None],}],lcuts=[BoolTimingBaseline,BoolGoodTracks],label='Truth') #GetProb(t,runnum) @@ -921,22 +1049,32 @@ if __name__ == "__main__": #ShowTrackSepVsRecoMom(t) #3-3-2023 - # x=GetTrackEfficiency(t,dcutN=[PHOTONCONV,{'longTracks':[None,None,3,None]}],dcutD=[PHOTONCONV,{'longTracks':[1,None,None,None]}],lcutN=PHOTONCONV_L+[BoolOrphanTSegSt3,BoolMultiTrack],lcutD=PHOTONCONV_L+[BoolOrphanTSegSt3,BoolMultiTrack]) + # x=GetTrackEfficiency(t,dcutN=[PHOTONCONV,{'longTracks':[None,None,3,None]}],dcutD=[PHOTONCONV,{'longTracks':[1,None,None,None]}],lcutN=PHOTONCONV_L+[BoolOrphanTSegSt3],lcutD=PHOTONCONV_L+[BoolOrphanTSegSt3]) # print(x) # GeneralPlotter(t,MakePlotDict('NTSegs'),dcuts=[{'longTracks':[1,None,None,None]},PHOTONCONV],lcuts=PHOTONCONV_L) # GeneralPlotter(t,MakePlotDict('TSeg_z'),dcuts=[{'longTracks':[1,None,None,None]},PHOTONCONV],lcuts=PHOTONCONV_L) # GeneralPlotter(t,MakePlotDict('TSeg_z'),dcuts=[{'longTracks':[1,None,None,None]}],lcuts=[]) #3-6-2023 - #CutEfficiencyArrays(t,lambda event:event.Track_p0[1],dcutN=[PHOTONCONV,{'longTracks':[None,None,3,None]}],dcutD=[PHOTONCONV,{'longTracks':[1,None,None,None]}],lcutN=PHOTONCONV_L+[BoolOrphanTSegSt3,BoolMultiTrack],lcutD=PHOTONCONV_L+[BoolOrphanTSegSt3,BoolMultiTrack],title='Max Momentum test eff',bins=15,hmin=0,hmax=500000) + # CutEfficiencyArrays(t,lambda event:event.Track_p0[1],dcutN=[PHOTONCONV,{'longTracks':[None,None,3,None]}],dcutD=[PHOTONCONV,{'longTracks':[1,None,None,None]}],lcutN=PHOTONCONV_L+[BoolOrphanTSegSt3],lcutD=PHOTONCONV_L+[BoolOrphanTSegSt3],title='Max Momentum test eff',bins=15,hmin=0,hmax=500000) #repeat but w/ 2>? Use skimmed events from jamie #3-7-2023 # GeneralPlotter(t,MakePlotDict('epenSep'),dcuts=[PHOTONCONV,{'longTracks':[None,None,None,3]}],lcuts=PHOTONCONV_L+[BoolOrphanTSegSt3,BoolMultiTrack,BoolHas1TrackIn4St]) # print('Muons: ',COUNTMUON,' NotMu: ',COUNTNOTMUON) - GeneralPlotter(t,MakePlotDict('BasicHist'),dcuts=[{'longTracks':[1,None,None,None]}],lcuts=[]) + #GeneralPlotter(t,MakePlotDict('CutTest'),dcuts=[{'longTracks':[1,None,None,None]},PHOTONCONV],lcuts=PHOTONCONV_L+[BoolOrphanTSegSt3])#BoolCorrectSignalPhConv + #GeneralPlotter(t,MakePlotDict('VertexDiff'),dcuts=[{'longTracks':[None,None,3,None]},PHOTONCONV],lcuts=PHOTONCONV_L+[BoolOrphanTSegSt3,BoolCorrectSignalPhConv]) #print('Muons: ',COUNTMUON,' NotMu: ',COUNTNOTMUON) + + #3-9-2023 + # GeneralPlotter(t,MakePlotDict('NonMuonMom'),dcuts=[{'longTracks':[None,None,2,None]},PHOTONCONV],lcuts=PHOTONCONV_L+[BoolOrphanTSegSt3],label='==2 tracks',showplot=False) + # GeneralPlotter(t,MakePlotDict('NonMuonMom'),dcuts=[{'longTracks':[None,None,3,None]},PHOTONCONV],lcuts=PHOTONCONV_L+[BoolOrphanTSegSt3],label='==3 tracks') + + # GeneralPlotter(t,MakePlotDict('AllNonMuonMomTruth'),dcuts=[{'longTracks':[None,None,2,None]},PHOTONCONV],lcuts=PHOTONCONV_L+[BoolOrphanTSegSt3],label='==2 tracks',showplot=False) + # GeneralPlotter(t,MakePlotDict('AllNonMuonMomTruth'),dcuts=[{'longTracks':[None,None,3,None]},PHOTONCONV],lcuts=PHOTONCONV_L+[BoolOrphanTSegSt3],label='==3 tracks') + + # MODELS IN NEW PARAM SPACE # 52,60,48,61,62,49,50,41,63,64,42,43,44,45,73,74,75,37,38,39,32 diff --git a/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py b/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py index 326e7fff657f3d385843eb38ed6f41f9d52797a2..4a42d281f91589d59fb65b54266ccb81ecdb897b 100644 --- a/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py +++ b/Tracker/TrackerRecAlgs/PairVertex/scripts/PlotHelper.py @@ -146,10 +146,10 @@ def CorrectBinsForLog(arr,bins,xscale,rrange=None): if minx==maxx: maxx+=1 bins=1 - minx=1 - maxx=10.0**4 + minx=10**3 + maxx=10.0**8 #bins=25 - bins2 = [10**e for e in range(-5,4,1)]#logspace(start=log10(minx), stop=log10(maxx), num=bins) + bins2 = logspace(start=log10(minx), stop=log10(maxx), num=bins)# [10**e for e in range(-5,4,1)] #print(type(bins2),bins2) if xscale=='symlog': bins2 = [0]+list(logspace(start=log10(1), stop=log10(maxx), num=bins-1))