//
// 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