3 #if !defined(__CINT__) || defined(__MAKECINT__)
4 //-- --- standard headers-------------
6 //--------Root headers ---------------
10 #include <TStopwatch.h>
14 #include <TParticle.h>
16 //----- AliRoot headers ---------------
19 #include "AliKalmanTrack.h"
20 #include "AliITStrackV2.h"
21 #include "AliHeader.h"
22 #include "AliGenEventHeader.h"
23 #include "AliV0vertex.h"
24 #include "AliV0vertexer.h"
25 #include "AliITSVertex.h"
26 #include "AliITSVertexer.h"
27 #include "AliITSVertexerTracks.h"
28 #include "AliD0Trigger.h"
30 //-------------------------------------
32 const Double_t kBz = 0.4;
35 Double_t primaryvertex[3] = {0.,0.,0,};
38 const Double_t kPtCut = 0.5; // GeV/c
39 const Double_t kd0Cut = 50.; // micron
40 const Double_t kd0CutHigh = 200.; // micron
43 //cuts for combined tracks
44 // cuts[0] = lowest V0 cut
45 // cuts[1] = highest V0 cut
46 // cuts[2] = inv. mass cut (diiferense)
47 // cuts[3] = max value for pointing angle
48 const Double_t cuts[4] = {0.005,
53 // this function applies single track cuts
54 Bool_t TrkCuts(const AliITStrackV2& trk);
56 // this function creates TObjArrays with positive and negative tracks
57 void SelectTracks(TTree& itsTree,
58 TObjArray& trksP,Int_t* itsEntryP,Int_t& nTrksP,
59 TObjArray& trksN,Int_t* itsEntryN,Int_t& nTrksN);
61 //void GetPrimaryVertex(int i,Char_t* path="./");
63 Int_t iTrkP,iTrkN,itsEntries;
65 Int_t nTrksP=0,nTrksN=0;
69 void RunD0Trigger(Int_t evFirst=0,Int_t evLast=1,Char_t* path="./") {
71 const Char_t *name="AliD0Trigger";
72 cerr<<'\n'<<name<<"...\n";
73 gBenchmark->Start(name);
75 AliKalmanTrack::SetConvConst(100/0.299792458/kBz);
77 // Open file with ITS tracks
78 Char_t fnameTrack[1024];
79 sprintf(fnameTrack,"%s/AliITStracksV2.root",path);
80 TFile* itstrks = TFile::Open(fnameTrack);
83 sprintf(trksName,"TreeT_ITS_%d",ev);
84 TTree *itsTree=(TTree*)itstrks->Get(trksName);
85 if(!itsTree) continue;
86 itsEntries = (Int_t)itsTree->GetEntries();
87 printf("+++\n+++ Number of tracks in ITS: %d\n+++\n\n",itsEntries);
89 //Getting primary Vertex
90 GetPrimaryVertex(0,path);
92 // call function which applies sigle track selection and
93 // separetes positives and negatives
94 TObjArray trksP(itsEntries/2);
95 Int_t *itsEntryP = new Int_t[itsEntries];
96 TObjArray trksN(itsEntries/2);
97 Int_t *itsEntryN = new Int_t[itsEntries];
98 SelectTracks(*itsTree,trksP,itsEntryP,nTrksP,trksN,itsEntryN,nTrksN);
100 cout<<"#pos: "<<nTrksP<<endl;
101 cout<<"#neg: "<<nTrksN<<endl;
103 AliD0Trigger * D0 = new AliD0Trigger(cuts,kBz,primaryvertex);
105 for(iTrkP=0; iTrkP<nTrksP; iTrkP++) {
106 postrack = (AliITStrackV2*)trksP.At(iTrkP);
107 for(iTrkN=0; iTrkN<nTrksN; iTrkN++) {
108 negtrack = (AliITStrackV2*)trksN.At(iTrkN);
109 D0.SetTracks(postrack,negtrack);
111 D0.FindMomentaAtVertex();
112 if(D0.FindInvMass()){
113 if(D0.PointingAngle()){
120 cout<<"#D0: "<<nD0<<endl;
121 gBenchmark->Stop(name);
122 gBenchmark->Show(name);
124 //___________________________________________________________________________
125 void SelectTracks(TTree& itsTree,
126 TObjArray& trksP,Int_t* itsEntryP,Int_t& nTrksP,
127 TObjArray& trksN,Int_t* itsEntryN,Int_t& nTrksN) {
129 // this function creates two TObjArrays with positive and negative tracks
134 Int_t entr = (Int_t)itsTree.GetEntries();
136 // trasfer tracks from tree to arrays
137 for(Int_t i=0; i<entr; i++) {
139 AliITStrackV2 *itstrack = new AliITStrackV2;
140 itsTree.SetBranchAddress("tracks",&itstrack);
144 // single track selection
145 if(!TrkCuts(*itstrack)) { delete itstrack; continue; }
147 if(itstrack->Get1Pt()>0.) { // negative track
148 trksN.AddLast(itstrack);
149 itsEntryN[nTrksN] = i;
151 } else { // positive track
152 trksP.AddLast(itstrack);
153 itsEntryP[nTrksP] = i;
161 //____________________________________________________________________________
162 Bool_t TrkCuts(const AliITStrackV2& trk) {
164 // this function tells if track passes some kinematical cuts
166 if(TMath::Abs(1./trk.Get1Pt()) < kPtCut) return kFALSE;
167 if(TMath::Abs(10000.*trk.GetD(primaryvertex[0],primaryvertex[1])) < kd0Cut) return kFALSE;
168 if(TMath::Abs(10000.*trk.GetD(primaryvertex[0],primaryvertex[1])) > kd0CutHigh) return kFALSE;
172 //____________________________________________________________________________
173 void GetPrimaryVertex(int i,Char_t* path="./") {
178 sprintf(falice,"%s/galice.root",path);
179 TFile * galice = new TFile(falice);
186 sprintf(vname,"Vertex_%d",event);
189 AliHeader * header = 0;
191 TTree * treeE = (TTree*)gDirectory->Get("TE");
192 treeE->SetBranchAddress("Header",&header);
193 treeE->GetEntry(event);
194 AliGenEventHeader* genHeader = header->GenEventHeader();
196 genHeader->PrimaryVertex(o);
197 primaryvertex[0] = (Double_t)o[0];
198 primaryvertex[1] = (Double_t)o[1];
199 primaryvertex[2] = (Double_t)o[2];
202 printf("Can't find Header");