ROOT logo
//
// This macro checks a few basic properties of MC pileup vertices
//

#if !defined(__CINT__) || defined(__MAKECINT__)
   #include <Riostream.h>
   #include <TFile.h>
   #include <TTree.h>
   #include <TH1F.h>
   #include <TCanvas.h>
   #include <TMath.h>
   #include <TClonesArray.h>
   #include <TParticle.h>
   #include <TParticlePDG.h>

   #include "AliRunLoader.h"
   #include "AliHeader.h"
   #include "AliStack.h"
   #include "AliGenCocktailEventHeader.h"
#endif



Int_t FindContributors(Float_t t, AliStack *stack) {
  Int_t ntrk=0;
  Int_t np=stack->GetNtrack();
  for (Int_t i=0; i<np; i++) {
      if (!stack->IsPhysicalPrimary(i)) continue;
      TParticle *part=stack->Particle(i);
      if (!part) continue;
      TParticlePDG *partPDG = part->GetPDG();
      if (!partPDG) continue;
      if (TMath::Abs(partPDG->Charge())<1e-10) continue;
      if (part->Pt()<0.5) continue;
      Float_t dt=0.5*(t - part->T())/(t + part->T());
      if (TMath::Abs(dt)>1e-5) continue;
      ntrk++;
  }
  return ntrk;
}


void CheckPileupVerticesMC() {
    TH1F *hnv=new TH1F("hnv","Number of vertices",100,0,300);
    TH1F *hnt=new TH1F("hnt","Number of tracks per vertex",100,0,200);
    TH1F *ht=new TH1F("ht","Interaction time;t (sec);", 100,-0.05e-3,0.05e-3);
    TH1F *hdt=new TH1F("hdt","Difference in time between interactions; #Deltat (sec)",100,0,0.01e-3);
    TH1F *hz=new TH1F("hz","Z position of vertices; Z (cm)",100,-20,20);
    TH1F *hdz=new TH1F("hdz","Difference in Z position between vertices; #DeltaZ (cm)",100,0,2.5);

    AliRunLoader *rl = AliRunLoader::Open("galice.root","something");
    rl->LoadHeader();
    rl->LoadKinematics();

    Int_t nEvents=rl->GetNumberOfEvents();
    for (Int_t i=0; i<nEvents; i++) {
        cout<<"Event "<<i<<" out of "<<nEvents<<endl;
        rl->GetEvent(i);
        AliStack *stack=rl->Stack();    

        AliHeader *ah=rl->GetHeader();
        AliGenCocktailEventHeader *cock=
            (AliGenCocktailEventHeader*)ah->GenEventHeader();
        TList *headers=cock->GetHeaders();
        const Int_t nvtx=headers->GetEntries();

        hnv->Fill(nvtx);
        Double_t *z=new Double_t[nvtx];
        Double_t *t=new Double_t[nvtx];
        Int_t *idx=new Int_t[nvtx];
        for (Int_t v=0; v<nvtx; v++) {
            AliGenEventHeader *h=(AliGenEventHeader *)headers->At(v);
            t[v]=h->InteractionTime();
            ht->Fill(t[v]);
            Int_t nt=FindContributors(t[v],stack);
            hnt->Fill(nt);

            TArrayF vtx(3); h->PrimaryVertex(vtx);
            z[v]=vtx[2];
            hz->Fill(z[v]);
        }

	TMath::Sort(nvtx,t,idx);
        for (Int_t v=0; v<nvtx-1; v++) {
	  Int_t i1=idx[v];
	  Int_t i2=idx[v+1];
          Float_t dt=t[i1]-t[i2];
          hdt->Fill(dt);
	}        
	TMath::Sort(nvtx,z,idx);
        for (Int_t v=0; v<nvtx-1; v++) {
	  Int_t i1=idx[v];
	  Int_t i2=idx[v+1];
          Float_t dz=z[i1]-z[i2];
          hdz->Fill(dz);
	}        

        delete[] t;
        delete[] z;
        delete[] idx;

    }

    TCanvas *c1=new TCanvas("c1","",0,0,750,1000); c1->Divide(1,2); 
    c1->cd(1); hnv->Draw();
    c1->cd(2); gPad->SetLogy(); hnt->Draw();

    TCanvas *c2=new TCanvas("c2","",0,0,750,1000); c2->Divide(1,2); 
    c2->cd(1); ht->Draw();
    c2->cd(2); hdt->Fit("expo");

    TCanvas *c3=new TCanvas("c3","",0,0,750,1000); c3->Divide(1,2); 
    c3->cd(1); hz->Fit("gaus");
    c3->cd(2); hdz->Draw(); //hdz->Fit("expo");

}
 CheckPileupVerticesMC.C:1
 CheckPileupVerticesMC.C:2
 CheckPileupVerticesMC.C:3
 CheckPileupVerticesMC.C:4
 CheckPileupVerticesMC.C:5
 CheckPileupVerticesMC.C:6
 CheckPileupVerticesMC.C:7
 CheckPileupVerticesMC.C:8
 CheckPileupVerticesMC.C:9
 CheckPileupVerticesMC.C:10
 CheckPileupVerticesMC.C:11
 CheckPileupVerticesMC.C:12
 CheckPileupVerticesMC.C:13
 CheckPileupVerticesMC.C:14
 CheckPileupVerticesMC.C:15
 CheckPileupVerticesMC.C:16
 CheckPileupVerticesMC.C:17
 CheckPileupVerticesMC.C:18
 CheckPileupVerticesMC.C:19
 CheckPileupVerticesMC.C:20
 CheckPileupVerticesMC.C:21
 CheckPileupVerticesMC.C:22
 CheckPileupVerticesMC.C:23
 CheckPileupVerticesMC.C:24
 CheckPileupVerticesMC.C:25
 CheckPileupVerticesMC.C:26
 CheckPileupVerticesMC.C:27
 CheckPileupVerticesMC.C:28
 CheckPileupVerticesMC.C:29
 CheckPileupVerticesMC.C:30
 CheckPileupVerticesMC.C:31
 CheckPileupVerticesMC.C:32
 CheckPileupVerticesMC.C:33
 CheckPileupVerticesMC.C:34
 CheckPileupVerticesMC.C:35
 CheckPileupVerticesMC.C:36
 CheckPileupVerticesMC.C:37
 CheckPileupVerticesMC.C:38
 CheckPileupVerticesMC.C:39
 CheckPileupVerticesMC.C:40
 CheckPileupVerticesMC.C:41
 CheckPileupVerticesMC.C:42
 CheckPileupVerticesMC.C:43
 CheckPileupVerticesMC.C:44
 CheckPileupVerticesMC.C:45
 CheckPileupVerticesMC.C:46
 CheckPileupVerticesMC.C:47
 CheckPileupVerticesMC.C:48
 CheckPileupVerticesMC.C:49
 CheckPileupVerticesMC.C:50
 CheckPileupVerticesMC.C:51
 CheckPileupVerticesMC.C:52
 CheckPileupVerticesMC.C:53
 CheckPileupVerticesMC.C:54
 CheckPileupVerticesMC.C:55
 CheckPileupVerticesMC.C:56
 CheckPileupVerticesMC.C:57
 CheckPileupVerticesMC.C:58
 CheckPileupVerticesMC.C:59
 CheckPileupVerticesMC.C:60
 CheckPileupVerticesMC.C:61
 CheckPileupVerticesMC.C:62
 CheckPileupVerticesMC.C:63
 CheckPileupVerticesMC.C:64
 CheckPileupVerticesMC.C:65
 CheckPileupVerticesMC.C:66
 CheckPileupVerticesMC.C:67
 CheckPileupVerticesMC.C:68
 CheckPileupVerticesMC.C:69
 CheckPileupVerticesMC.C:70
 CheckPileupVerticesMC.C:71
 CheckPileupVerticesMC.C:72
 CheckPileupVerticesMC.C:73
 CheckPileupVerticesMC.C:74
 CheckPileupVerticesMC.C:75
 CheckPileupVerticesMC.C:76
 CheckPileupVerticesMC.C:77
 CheckPileupVerticesMC.C:78
 CheckPileupVerticesMC.C:79
 CheckPileupVerticesMC.C:80
 CheckPileupVerticesMC.C:81
 CheckPileupVerticesMC.C:82
 CheckPileupVerticesMC.C:83
 CheckPileupVerticesMC.C:84
 CheckPileupVerticesMC.C:85
 CheckPileupVerticesMC.C:86
 CheckPileupVerticesMC.C:87
 CheckPileupVerticesMC.C:88
 CheckPileupVerticesMC.C:89
 CheckPileupVerticesMC.C:90
 CheckPileupVerticesMC.C:91
 CheckPileupVerticesMC.C:92
 CheckPileupVerticesMC.C:93
 CheckPileupVerticesMC.C:94
 CheckPileupVerticesMC.C:95
 CheckPileupVerticesMC.C:96
 CheckPileupVerticesMC.C:97
 CheckPileupVerticesMC.C:98
 CheckPileupVerticesMC.C:99
 CheckPileupVerticesMC.C:100
 CheckPileupVerticesMC.C:101
 CheckPileupVerticesMC.C:102
 CheckPileupVerticesMC.C:103
 CheckPileupVerticesMC.C:104
 CheckPileupVerticesMC.C:105
 CheckPileupVerticesMC.C:106
 CheckPileupVerticesMC.C:107
 CheckPileupVerticesMC.C:108
 CheckPileupVerticesMC.C:109
 CheckPileupVerticesMC.C:110
 CheckPileupVerticesMC.C:111
 CheckPileupVerticesMC.C:112
 CheckPileupVerticesMC.C:113
 CheckPileupVerticesMC.C:114
 CheckPileupVerticesMC.C:115
 CheckPileupVerticesMC.C:116
 CheckPileupVerticesMC.C:117