def initpoints():
   points = { 
              "IsSig" : {1:[],2:[],3:[],4:[]},
              "TrkId" : {1:[],2:[],3:[],4:[]},
              "Cls"   : {1:TPolyMarker3D(),2:TPolyMarker3D(),3:TPolyMarker3D(),4:TPolyMarker3D()}
   }   
   return points
def GetTrackPoints(rlist, color=ROOT.kOrange):
    n = len(rlist)
    track = TPolyMarker3D(n + 1)
    track.SetMarkerColor(color)
    for i in range(n):
        track.SetPoint(i, rlist[i][0], rlist[i][1], rlist[i][2])
    return track
def getwidewindow(cluster,i):
   x1,y1,z1 = getpoint(cluster,i)
   particles = "electrons" if(x1>0) else "positrons"
   x1min = 0
   x1max = 0
   window_pts = TPolyMarker3D()
   if(particles=="electrons"): 
      x1min = x1-xAbsMargins if((x1-xAbsMargins)>xEsideL) else xEsideL ## must be within stave volume
      x1max = x1+xAbsMargins if((x1+xAbsMargins)<xEsideR) else xEsideR ## must be within stave volume
      window_pts.SetNextPoint(x1min,y1,z1) ## top left
      window_pts.SetNextPoint(x1max,y1,z1) ## top right
      # window_pts.SetNextPoint(xDipoleExitMaxAbs,y1,zDipoleExit) ## bottom right
      window_pts.SetNextPoint(x1max*0.99,y1,zDipoleExit) ## bottom right
      window_pts.SetNextPoint(xDipoleExitMinAbs,y1,zDipoleExit) ## bottom left
   else:
      x1min = x1-xAbsMargins if((x1-xAbsMargins)>xPsideL) else xPsideL ## must be within stave volume
      x1max = x1+xAbsMargins if((x1+xAbsMargins)<xPsideR) else xPsideR ## must be within stave volume
      window_pts.SetNextPoint(x1min,y1,z1) ## top left
      window_pts.SetNextPoint(x1max,y1,z1) ## top right
      # window_pts.SetNextPoint(-xDipoleExitMinAbs,y1,zDipoleExit) ## bottom right
      window_pts.SetNextPoint(-xDipoleExitMinAbs,y1,zDipoleExit) ## bottom right
      window_pts.SetNextPoint(x1min*0.99,y1,zDipoleExit) ## bottom left
  
   window_lin = windowline(window_pts)
   window_lin.SetLineWidth(1)
   window_lin.SetLineColor(ROOT.kBlack)
   return window_pts,window_lin
def getnarrwindow(cluster1,cluster2,i1,i2):
   x1,y1,z1 = getpoint(cluster1,i1)   
   x2,y2,z2 = getpoint(cluster2,i2)
   window_pts = TPolyMarker3D()
   window_pts.SetNextPoint(x1-xAbsMargins,y1,z1) ## top left
   window_pts.SetNextPoint(x1+xAbsMargins,y1,z1) ## top right
   window_pts.SetNextPoint(x2+xAbsMargins,y2,z2) ## bottom right
   window_pts.SetNextPoint(x2-xAbsMargins,y2,z2) ## bottom left
   window_lin = windowline(window_pts)
   window_lin.SetLineWidth(1)
   window_lin.SetLineColor(ROOT.kBlue)
   return window_pts,window_lin
def getyzwindow(cluster,i):
   x1,y1,z1 = getpoint(cluster,i)
   particles = "electrons" if(x1>0) else "positrons"
   y1min = y1-yAbsMargins if((y1-yAbsMargins)>-0.75) else -0.75 ## must be within stave volume
   y1max = y1+yAbsMargins if((y1+yAbsMargins)<+0.75) else +0.75 ## must be within stave volume
   window_pts = TPolyMarker3D()
   window_pts.SetNextPoint(x1,y1min,z1)
   window_pts.SetNextPoint(x1,y1max,z1)
   xmiddle = +xDipoleExitMinAbs+(abs(x1)*0.99-xDipoleExitMinAbs)/2
   if(particles=="electrons"):
      # window_pts.SetNextPoint(xDipoleExitAbs,yDipoleExitMax,zDipoleExit)
      window_pts.SetNextPoint(+xmiddle,yDipoleExitMax,zDipoleExit)
      # window_pts.SetNextPoint(xDipoleExitAbs,yDipoleExitMin,zDipoleExit)
      window_pts.SetNextPoint(+xmiddle,yDipoleExitMin,zDipoleExit)
   else:
      # window_pts.SetNextPoint(-xDipoleExitAbs,yDipoleExitMax,zDipoleExit)
      window_pts.SetNextPoint(-xmiddle,yDipoleExitMax,zDipoleExit)
      # window_pts.SetNextPoint(-xDipoleExitAbs,yDipoleExitMin,zDipoleExit)
      window_pts.SetNextPoint(-xmiddle,yDipoleExitMin,zDipoleExit)
   window_lin = windowline(window_pts)
   window_lin.SetLineWidth(1)
   window_lin.SetLineColor(ROOT.kBlack)
   return window_pts,window_lin
Exemplo n.º 6
0
numberOfCircles = 40

# create and open a canvas
sky = TCanvas('sky', 'Tornado', 300, 10, 700, 500)
sky.SetFillColor(14)

# creating view
view = TView.CreateView()
rng = numberOfCircles * d
view.SetRange(0, 0, 0, 4.0 * rng, 2.0 * rng, rng)

polymarkers = []
for j in range(d, numberOfCircles * d, d):

    # create a PolyMarker3D
    pm3d = TPolyMarker3D(numberOfPoints)

    # set points
    for i in range(1, numberOfPoints):
        csin = sin(2 * pi / numberOfPoints * i) + 1
        ccos = cos(2 * pi / numberOfPoints * i) + 1
        esin = sin(2 * pi / (numberOfCircles * d) * j) + 1
        x = j * (csin + esin)
        y = j * ccos
        z = j
        pm3d.SetPoint(i, x, y, z)

# set marker size, color & style
    pm3d.SetMarkerSize(1)
    pm3d.SetMarkerColor(2 + (d == (j & d)))
    pm3d.SetMarkerStyle(3)
def main():
    ##########################################################################################
    ##########################################################################################
    ##########################################################################################
    ### read fits to root file
    # fitsEx = GetFits()

    svd0Seed = ROOT.std.vector( float )()
    svd1Seed = ROOT.std.vector( float )()
    svd2Seed = ROOT.std.vector( float )()
    chi2xzSeed = ROOT.std.vector( float )()
    chi2yzSeed = ROOT.std.vector( float )()
    residxzSeed = ROOT.std.vector( float )()
    residyzSeed = ROOT.std.vector( float )()
    issigSeed = ROOT.std.vector( int )()
    iGenMatch = ROOT.std.vector( int )()
    x1Seed = ROOT.std.vector( float )()
    y1Seed = ROOT.std.vector( float )()
    z1Seed = ROOT.std.vector( float )()
    x2Seed = ROOT.std.vector( float )()
    y2Seed = ROOT.std.vector( float )()
    z2Seed = ROOT.std.vector( float )()
    x3Seed = ROOT.std.vector( float )()
    y3Seed = ROOT.std.vector( float )()
    z3Seed = ROOT.std.vector( float )()
    x4Seed = ROOT.std.vector( float )()
    y4Seed = ROOT.std.vector( float )()
    z4Seed = ROOT.std.vector( float )()
    pxSeed = ROOT.std.vector( float )()
    pySeed = ROOT.std.vector( float )()
    pzSeed = ROOT.std.vector( float )()
    eSeed  = ROOT.std.vector( float )()
    pxGen  = ROOT.std.vector( float )()
    pyGen  = ROOT.std.vector( float )()
    pzGen  = ROOT.std.vector( float )()
    eGen   = ROOT.std.vector( float )()
    qGen   = ROOT.std.vector( float )()
    iGen   = ROOT.std.vector( int )()
    tF = TFile("../data/root/seeds_"+proc+".root","RECREATE")
    tF.cd()
    tT = TTree("seeds","seeds")

    tT.Branch('svd0Seed',svd0Seed)
    tT.Branch('svd1Seed',svd1Seed)
    tT.Branch('svd2Seed',svd2Seed)
    tT.Branch('chi2xzSeed',chi2xzSeed)
    tT.Branch('chi2yzSeed',chi2yzSeed)
    tT.Branch('residxzSeed',residxzSeed)
    tT.Branch('residyzSeed',residyzSeed)
    tT.Branch('issigSeed',issigSeed)
    tT.Branch('iGenMatch',iGenMatch)
    tT.Branch('x1Seed',x1Seed)
    tT.Branch('y1Seed',y1Seed)
    tT.Branch('z1Seed',z1Seed)
    tT.Branch('x2Seed',x2Seed)
    tT.Branch('y2Seed',y2Seed)
    tT.Branch('z2Seed',z2Seed)
    tT.Branch('x3Seed',x3Seed)
    tT.Branch('y3Seed',y3Seed)
    tT.Branch('z3Seed',z3Seed)
    tT.Branch('x4Seed',x4Seed)
    tT.Branch('y4Seed',y4Seed)
    tT.Branch('z4Seed',z4Seed)
    tT.Branch('pxSeed',pxSeed)
    tT.Branch('pySeed',pySeed)
    tT.Branch('pzSeed',pzSeed)
    tT.Branch('eSeed',eSeed)
    tT.Branch('pxGen',pxGen)
    tT.Branch('pyGen',pyGen)
    tT.Branch('pzGen',pzGen)
    tT.Branch('eGen',eGen)
    tT.Branch('qGen',qGen)
    tT.Branch('iGen',iGen)


    histos = { "h_residuals_xz_sig": TH1D("residuals_xz_sig",";residuals_{xz};Tracks", 500,0,0.5),
            "h_residuals_yz_sig": TH1D("residuals_yz_sig",";residuals_{yz};Tracks", 500,0,500), 
            "h_residuals_xz_bkg": TH1D("residuals_xz_bkg",";residuals_{xz};Tracks", 500,0,0.5),
            "h_residuals_yz_bkg": TH1D("residuals_yz_bkg",";residuals_{yz};Tracks", 500,0,500),
            
            "h_svd_dd0_sig": TH1D("svd_dd0_sig",";svd_{dd0};Tracks", 500,21,24),
            "h_svd_dd0_bkg": TH1D("svd_dd0_bkg",";svd_{dd0};Tracks", 500,21,24), 
            "h_svd_dd1_sig": TH1D("svd_dd1_sig",";svd_{dd1};Tracks", 500,0,0.1),
            "h_svd_dd1_bkg": TH1D("svd_dd1_bkg",";svd_{dd1};Tracks", 500,0,0.1),
            "h_svd_dd2_sig": TH1D("svd_dd2_sig",";svd_{dd2};Tracks", 500,0,0.05),
            "h_svd_dd2_bkg": TH1D("svd_dd2_bkg",";svd_{dd2};Tracks", 500,0,0.05),
            
            "h_prob_xz_sig": TH1D("prob_xz_sig",";prob_{xz};Tracks", 500,0,1.0),
            "h_prob_yz_sig": TH1D("prob_yz_sig",";prob_{yz};Tracks", 500,0,1.0), 
            "h_prob_xz_bkg": TH1D("prob_xz_bkg",";prob_{xz};Tracks", 500,0,1.0),
            "h_prob_yz_bkg": TH1D("prob_yz_bkg",";prob_{yz};Tracks", 500,0,1.0),
            
            "h_chi2ndf_xz_sig": TH1D("chi2ndf_xz_sig",";chi2ndf_{xz};Tracks", 500,0,0.001),
            "h_chi2ndf_yz_sig": TH1D("chi2ndf_yz_sig",";chi2ndf_{yz};Tracks", 500,0,0.001), 
            "h_chi2ndf_xz_bkg": TH1D("chi2ndf_xz_bkg",";chi2ndf_{xz};Tracks", 500,0,0.001),
            "h_chi2ndf_yz_bkg": TH1D("chi2ndf_yz_bkg",";chi2ndf_{yz};Tracks", 500,0,0.001),
            
            "h_seed_resE" : TH1D("seed_resE", ";(E_{seed}-E_{gen})/E_{gen};Tracks",    100,-3,+3),
            "h_seed_resPz": TH1D("seed_resPz",";(Pz_{seed}-Pz_{gen})/Pz_{gen};Tracks", 100,-3,+3), 
            "h_seed_resPy": TH1D("seed_resPy",";(Py_{seed}-Py_{gen})/Py_{gen};Tracks", 100,-10,+10),
            
            "h_seed_resE_vs_x"  : TH2D("seed_resE_vs_x",  ";x;(E_{seed}-E_{gen})/E_{gen};Tracks",    100,detXmin,detXmax, 100,-5,+5),
            "h_seed_resPy_vs_x" : TH2D("seed_resPy_vs_x", ";x;(Py_{seed}-Py_{gen})/Py_{gen};Tracks", 100,detXmin,detXmax, 100,-10,+10),
            
            "h_N_sigacc":        TH1D("N_sigacc",        ";Track multiplicity;Events", 40,30,190),
            "h_N_all_seeds":     TH1D("N_all_seeds",     ";Track multiplicity;Events", 40,30,190),
            "h_N_matched_seeds": TH1D("N_matched_seeds", ";Track multiplicity;Events", 40,30,190),
            "h_N_good_seeds":    TH1D("N_good_seeds",    ";Track multiplicity;Events", 40,30,190),
            
            "h_seeding_score": TH1D("h_seeding_score", ";N_{seeds}^{matched}/N_{signa}^{in.acc} [%];Events", 20,91,101),
            "h_seeding_pool":  TH1D("h_seeding_pool",  ";N_{seeds}^{all}/N_{signa}^{in.acc} [%];Events", 50,90,590),
    }
    sidesarr = getLogicSidesArr()
    pdfname = "../output/pdf/seedingdemo_"+proc+".pdf"
    intfile = TFile("../data/root/rec_"+proc+".root","READ")
    intree = intfile.Get("res")
    nevents = intree.GetEntries()
    print("with %d events" % nevents)
    nmax = 100000
    n=0 ### init n
    for event in intree:
    Nsigall = 0
    Nsigacc = 0
    Nseeds = 0
    Nmatched = 0
    Ngood = 0
    
    ## clear the output vectors
    svd0Seed.clear()
    svd1Seed.clear()
    svd2Seed.clear()
    chi2xzSeed.clear()
    chi2yzSeed.clear()
    residxzSeed.clear()
    residyzSeed.clear()
    issigSeed.clear()
    iGenMatch.clear()
    x1Seed.clear()
    y1Seed.clear()
    z1Seed.clear()
    x2Seed.clear()
    y2Seed.clear()
    z2Seed.clear()
    x3Seed.clear()
    y3Seed.clear()
    z3Seed.clear()
    x4Seed.clear()
    y4Seed.clear()
    z4Seed.clear()
    
    pxSeed.clear()
    pySeed.clear()
    pzSeed.clear()
    eSeed.clear()
    
    pxGen.clear()
    pyGen.clear()
    pzGen.clear()
    eGen.clear()
    qGen.clear()
    iGen.clear()
    
    
    
    ### start the loop
    if(n>nmax): break
    
    ### draw?
    dodraw = (n<=NeventsToDraw)
    
    ### container for all clusters
    allpointsEside = initpoints()
    allpointsPside = initpoints()
    
    ## clusters' vectors are always written out (even if empty) for all gen tracks!
    ## each generated track in the vector always has 4 clusters accessed via TPolyMarker3D::GetPoint()
    for i in range(event.polm_clusters.size()):
        
        ###############################################################
        if(proc=="bppp"):
            if(sides=="e+" and event.qgen[i]<0): continue ## only positrons
            if(sides=="e-" and event.qgen[i]>0): continue ## only electrons
        if(proc=="trident" and event.qgen[i]<0): continue ## only positrons
        ###############################################################
        
        Nsigall += 1
        
        wgt  = event.wgtgen[i]
        pgen = event.pgen[i]
        ### cut on acceptance
        if(event.acctrkgen[i]!=1): continue
        
        Nsigacc += 1
        
        ### write the truth track momentum and its index
        pxGen.push_back(pgen.Px())
        pyGen.push_back(pgen.Py())
        pzGen.push_back(pgen.Pz())
        eGen.push_back(pgen.E())
        qGen.push_back(event.qgen[i])
        iGen.push_back(i)
        
        ### loop over all clusters of the track and put in the allpoints classified by the layer
        for jxy in range(event.polm_clusters[i].GetN()):
            rcls = [ ROOT.Double(), ROOT.Double(), ROOT.Double() ]
            event.polm_clusters[i].GetPoint(jxy,rcls[0],rcls[1],rcls[2]) ### the clusters
            if(rcls[0]>0): AddPoint(allpointsEside,rcls,True,i)
            if(rcls[0]<0): AddPoint(allpointsPside,rcls,True,i)
    Nsig4 = getNnon0(allpointsEside["Cls"][4])+getNnon0(allpointsPside["Cls"][4])
    
    
    ### embed some noise clusters
    rnd = TRandom()
    rnd.SetSeed()
    for kN in range(NnoiseClusters):
        for layer in layers:
            for side in sidesarr:
                x = 0
                if(side=="Pside"): x = rnd.Uniform(xPsideL,xPsideR)
                if(side=="Eside"): x = rnd.Uniform(xEsideL,xEsideR)
                y = rnd.Uniform(-0.75,+0.75)
                if(layer==1): z = 300
                if(layer==2): z = 310
                if(layer==3): z = 320
                if(layer==4): z = 330
                rnoise = [x,y,z]
                if(side=="Pside"): AddPoint(allpointsPside,rnoise)
                if(side=="Eside"): AddPoint(allpointsEside,rnoise)
    Nbkgsig4 = getNnon0(allpointsEside["Cls"][4])+getNnon0(allpointsPside["Cls"][4])
    
    
    ### just draw the full event
    drawall(pdfname+"(",allpointsEside,allpointsPside,dodraw)
    
    
    ### loop on the 2 sides
    for side in sidesarr:
        allpoints = allpointsEside if(side=="Eside") else allpointsPside
        
        ### the initial pool for pivot clusters
        Nall4 = getNnon0(allpoints["Cls"][4])
        
        ### loop over the clusters and start the seeding
        for j4 in range(Nall4):
            r4 = getpoint(allpoints["Cls"][4],j4)
            xpivot = r4[0]
            ### electron / positron?
            particlename = getparticlename(allpoints["Cls"][4],j4)
            ### get the yz window
            winpts_yz,winlin_yz = getyzwindow(allpoints["Cls"][4],j4)
            ### set the wide window starting from cluster_seed1 (window corners must be added clockwise!)
            winpts_xz_wide,winlin_xz_wide = getwidewindow(allpoints["Cls"][4],j4)
            ### discard all clusters which are not in the wide window
            widepoints = initpoints()
            trimwide(allpoints,widepoints,winpts_xz_wide,winpts_yz,xpivot)
            Nwide1 = getNnon0(widepoints["Cls"][1])
            # if(Nwide1<1): print("Failed Nwide1")
            ### draw the wide window
            draw(pdfname,widepoints,dodraw,particlename,winlin_yz,winlin_xz_wide)
            
            ### choose one cluster in layer 1 as the second seed
            for j1 in range(Nwide1):
                ### get the narrow window  (window corners must be added clockwise!)
                winpts_xz_narr,winlin_xz_narr = getnarrwindow(allpoints["Cls"][4],widepoints["Cls"][1],j4,j1)
                ### discard all clusters which are not in the narrow window
                narrpoints = initpoints()
                trimnarr(widepoints,narrpoints,winpts_xz_narr)
                Nnarr2 = getNnon0(narrpoints["Cls"][2])
                Nnarr3 = getNnon0(narrpoints["Cls"][3])
                
                ### check if there are at least 1 cluster in both layer 2 and layer 3 within the narrow window
                if(Nnarr2<1 or Nnarr3<1): continue
                
                ### draw the narrow window
                draw(pdfname,narrpoints,dodraw,particlename,None,winlin_xz_narr)
                
                ### get the seed - note: could be that there are several combinations but the seed momentum would be identical
                pseed = makeseed(allpoints["Cls"][4],widepoints["Cls"][1],j4,j1,particlename)
                # if(pseed.E()>Emax or pseed.E()<Emin): print("pseed.E()>Emax or pseed.E()<Emin")
                if(pseed.E()>Emax or pseed.E()<Emin): continue
                
                ### set the cluster in layer 1
                r1 = getpoint(widepoints["Cls"][1],j1)
                
                ### loop on the clusters in layer 2 and 3:
                for j2 in range(Nnarr2):
                # for j2 in range(narrpoints["Cls"][2].GetN()):
                r2 = getpoint(narrpoints["Cls"][2],j2)
                for j3 in range(Nnarr3):
                # for j3 in range(narrpoints["Cls"][3].GetN()):
                    r3 = getpoint(narrpoints["Cls"][3],j3)
                    Nseeds += 1
                    
                    issig1 = widepoints["IsSig"][1][j1]
                    issig2 = narrpoints["IsSig"][2][j2]
                    issig3 = narrpoints["IsSig"][3][j3]
                    issig4 = allpoints["IsSig"][4][j4]
                    
                    trkid4 = allpoints["TrkId"][4][j4]
                    trkid3 = narrpoints["TrkId"][3][j3]
                    trkid2 = narrpoints["TrkId"][2][j2]
                    trkid1 = widepoints["TrkId"][1][j1]
                    issig = (issig4 and issig1 and issig2 and issig3)
                    trkid = str(trkid4) if(trkid4==trkid1 and trkid1==trkid2 and trkid2==trkid3) else "mult"
                    issiguniq = (issig and trkid!="mult")
                    if(issiguniq): Nmatched += 1
        
                    ### two independent 2d fits
                    chi2_xz,prob_xz,chi2_yz,prob_yz = seed2dfit(pdfname,r1,r2,r3,r4,dodraw)
                    if(issiguniq):
                        histos["h_chi2ndf_xz_sig"].Fill(chi2_xz)
                        histos["h_chi2ndf_yz_sig"].Fill(chi2_yz)
                        histos["h_prob_xz_sig"].Fill(prob_xz)
                        histos["h_prob_yz_sig"].Fill(prob_yz)
                    else:
                        histos["h_chi2ndf_xz_bkg"].Fill(chi2_xz)
                        histos["h_chi2ndf_yz_bkg"].Fill(chi2_yz)
                        histos["h_prob_xz_bkg"].Fill(prob_xz)
                        histos["h_prob_yz_bkg"].Fill(prob_yz)
        
                    ### a single 3d fit
                    res_xz, res_yz = seed3dfit(pdfname,r1,r2,r3,r4,dodraw)
                    if(issiguniq):
                        histos["h_residuals_xz_sig"].Fill(res_xz)
                        histos["h_residuals_yz_sig"].Fill(res_yz)
                    else:
                        histos["h_residuals_xz_bkg"].Fill(res_xz)
                        histos["h_residuals_yz_bkg"].Fill(res_yz)
                        
                    ### a single 3d fit SVD
                    lfitpts, dd = seed3dfitSVD(pdfname,r1,r2,r3,r4,dodraw)
                    
                    ### set again the pseed according to lfit
                    cluster1 = TPolyMarker3D()
                    cluster2 = TPolyMarker3D()
                    cluster1.SetNextPoint(lfitpts[0][0],lfitpts[0][1],lfitpts[0][2])
                    cluster2.SetNextPoint(lfitpts[1][0],lfitpts[1][1],lfitpts[1][2])
                    if(isel(lfitpts[0][0])): pseed = makeseed(cluster2,cluster1,0,0,particlename)
                    else:                    pseed = makeseed(cluster1,cluster2,0,0,particlename)
                    if(pseed.E()>Emax or pseed.E()<Emin): continue
                    
                    ### the SVD alg
                    if(issiguniq):
                        histos["h_svd_dd0_sig"].Fill(dd[0])
                        histos["h_svd_dd1_sig"].Fill(dd[1])
                        histos["h_svd_dd2_sig"].Fill(dd[2])
                    else:
                        histos["h_svd_dd0_bkg"].Fill(dd[0])
                        histos["h_svd_dd1_bkg"].Fill(dd[1])
                        histos["h_svd_dd2_bkg"].Fill(dd[2])
                    
                    ### get the generated matched track momentum
                    pgen = TLorentzVector()
                    igen = -1
                    for k in range(iGen.size()):
                        if(iGen[k]==j4):
                            igen = k
                            break
                    
                    ### write out the good seeds
                    svd0Seed.push_back(dd[0])
                    svd1Seed.push_back(dd[1])
                    svd2Seed.push_back(dd[2])
                    chi2xzSeed.push_back(chi2_xz)
                    chi2yzSeed.push_back(chi2_yz)
                    residxzSeed.push_back(res_xz)
                    residyzSeed.push_back(res_yz)
                    issigSeed.push_back(issiguniq)
                    iGenMatch.push_back(igen)
                    x1Seed.push_back(r1[0])
                    y1Seed.push_back(r1[1])
                    z1Seed.push_back(r1[2])
                    x2Seed.push_back(r2[0])
                    y2Seed.push_back(r2[1])
                    z2Seed.push_back(r2[2])
                    x3Seed.push_back(r3[0])
                    y3Seed.push_back(r3[1])
                    z3Seed.push_back(r3[2])
                    x4Seed.push_back(r4[0])
                    y4Seed.push_back(r4[1])
                    z4Seed.push_back(r4[2])
                    pxSeed.push_back(pseed.Px())
                    pySeed.push_back(pseed.Py())
                    pzSeed.push_back(pseed.Pz())
                    eSeed.push_back(pseed.E())
                    
                    ### cut on some quality
                    isgood = (dd[1]<0.005 and dd[2]<0.0025)
                    if(not isgood): continue
                    Ngood += 1
                    
                    ### check perforrmance of seeding
                    pgen.SetPxPyPzE(pxGen[igen],pyGen[igen],pzGen[igen],eGen[igen])
                    resE = (pseed.E()-pgen.E())/pgen.E()
                    resPz = (pseed.Pz()-pgen.Pz())/pgen.Pz()
                    resPy = (pseed.Py()-pgen.Py())/pgen.Py()
                    histos["h_seed_resE"].Fill(resE)
                    histos["h_seed_resPz"].Fill(resPz)
                    histos["h_seed_resPy"].Fill(resPy)
                    histos["h_seed_resE_vs_x"].Fill(r4[0],resE)
                    histos["h_seed_resPy_vs_x"].Fill(r4[0],resPy)
                    
    histos["h_N_sigacc"].Fill(Nsigacc)       
    histos["h_N_all_seeds"].Fill(Nseeds)       
    histos["h_N_matched_seeds"].Fill(Nmatched)       
    histos["h_N_good_seeds"].Fill(Ngood)
    histos["h_seeding_score"].Fill(Nmatched/Nsigacc*100)
    histos["h_seeding_pool"].Fill(Nseeds/Nsigacc*100)
        
    if(dodraw):
        cnv = TCanvas("","",2000,2000)
        cnv.SaveAs(pdfname+")")
    print("Event: %g --> Nsigall=%g, Nsigacc=%g, Nseeds=%g, Nmatched=%g, Ngood=%g --> Seeds matching performance: Nmatched/Nsigacc=%5.1f%%" % (n,Nsigall,Nsigacc,Nseeds,Nmatched,Ngood,Nmatched/Nsigacc*100))

    tT.Fill()
    if(n%10==0 and n>0): print("  processed %d events" % n)
    n+=1
    print("Total events processed: ",n)










    cnv = TCanvas("","",1000,1000)
    cnv.Divide(2,2)
    cnv.cd(1)
    histos["h_chi2ndf_xz_sig"].SetLineColor(ROOT.kRed);   histos["h_chi2ndf_xz_sig"].Draw()
    histos["h_chi2ndf_xz_bkg"].SetLineColor(ROOT.kBlack); histos["h_chi2ndf_xz_bkg"].Draw("same")
    cnv.cd(2)
    histos["h_chi2ndf_yz_sig"].SetLineColor(ROOT.kRed);   histos["h_chi2ndf_yz_sig"].Draw()
    histos["h_chi2ndf_yz_bkg"].SetLineColor(ROOT.kBlack); histos["h_chi2ndf_yz_bkg"].Draw("same")
    cnv.cd(3)
    histos["h_prob_xz_sig"].SetLineColor(ROOT.kRed);   histos["h_prob_xz_sig"].Draw()
    histos["h_prob_xz_bkg"].SetLineColor(ROOT.kBlack); histos["h_prob_xz_bkg"].Draw("same")
    cnv.cd(4)
    histos["h_prob_yz_sig"].SetLineColor(ROOT.kRed);   histos["h_prob_yz_sig"].Draw()
    histos["h_prob_yz_bkg"].SetLineColor(ROOT.kBlack); histos["h_prob_yz_bkg"].Draw("same")
    cnv.SaveAs("../output/pdf/chi2ndf_"+proc+".pdf")

    cnv = TCanvas("","",1000,500)
    cnv.Divide(2,1)
    cnv.cd(1)
    histos["h_residuals_xz_sig"].SetLineColor(ROOT.kRed);   histos["h_residuals_xz_sig"].Draw()
    histos["h_residuals_xz_bkg"].SetLineColor(ROOT.kBlack); histos["h_residuals_xz_bkg"].Draw("same")
    cnv.cd(2)
    histos["h_residuals_yz_sig"].SetLineColor(ROOT.kRed);   histos["h_residuals_yz_sig"].Draw()
    histos["h_residuals_yz_bkg"].SetLineColor(ROOT.kBlack); histos["h_residuals_yz_bkg"].Draw("same")
    cnv.SaveAs("../output/pdf/resid3dfit_"+proc+".pdf")

    cnv = TCanvas("","",1500,500)
    cnv.Divide(3,1)
    cnv.cd(1)
    histos["h_svd_dd0_sig"].SetLineColor(ROOT.kRed);   histos["h_svd_dd0_sig"].Draw()
    histos["h_svd_dd0_bkg"].SetLineColor(ROOT.kBlack); histos["h_svd_dd0_bkg"].Draw("same")
    cnv.cd(2)
    histos["h_svd_dd1_sig"].SetLineColor(ROOT.kRed);   histos["h_svd_dd1_sig"].Draw()
    histos["h_svd_dd1_bkg"].SetLineColor(ROOT.kBlack); histos["h_svd_dd1_bkg"].Draw("same")
    cnv.cd(3)
    histos["h_svd_dd2_sig"].SetLineColor(ROOT.kRed);   histos["h_svd_dd2_sig"].Draw()
    histos["h_svd_dd2_bkg"].SetLineColor(ROOT.kBlack); histos["h_svd_dd2_bkg"].Draw("same")
    cnv.SaveAs("../output/pdf/svd3dfit_"+proc+".pdf")

    cnv = TCanvas("","",1000,1000)
    cnv.Divide(2,2)
    cnv.cd(1); histos["h_seed_resE"].Draw("hist")
    cnv.cd(2); histos["h_seed_resPy"].Draw("hist")
    cnv.cd(3); histos["h_seed_resE_vs_x"].Draw("col")
    cnv.cd(4); histos["h_seed_resPy_vs_x"].Draw("col")
    cnv.SaveAs("../output/pdf/seedsres_"+proc+".pdf")

    cnv = TCanvas("","",1500,500)
    cnv.Divide(3,1)
    cnv.cd(1)
    histos["h_N_sigacc"].SetLineColor(ROOT.kBlack); histos["h_N_sigacc"].Draw()
    histos["h_N_all_seeds"].SetLineColor(ROOT.kBlue); histos["h_N_all_seeds"].Draw("same")
    histos["h_N_matched_seeds"].SetLineColor(ROOT.kGreen); histos["h_N_matched_seeds"].Draw("same")
    histos["h_N_good_seeds"].SetLineColor(ROOT.kRed); histos["h_N_good_seeds"].Draw("same")
    cnv.cd(2)
    histos["h_seeding_pool"].Draw("hist")
    cnv.cd(3)
    histos["h_seeding_score"].Draw("hist")
    cnv.SaveAs("../output/pdf/seedsmult_"+proc+".pdf")

    tF.cd()
    tT.Write()
    tF.Write()
    tF.Close()


if __name__=="__main__":
    main()