ROOT logo
//#define __COMPILE__
//#ifdef __COMPILE__
#if !defined(__CINT__) || defined(__MAKECINT__)
//-- --- standard headers------------- 
#include <iostream.h>
//--------Root headers ---------------
#include <TSystem.h>
#include <TFile.h>
#include <TString.h>
#include <TStopwatch.h>
#include <TObject.h>
#include <TVector3.h>
#include <TTree.h>
#include <TParticle.h>
#include <TArray.h>
//----- AliRoot headers ---------------
#include "alles.h"
#include "AliRun.h"
#include "AliKalmanTrack.h"
#include "AliITStrackV2.h"
#include "AliHeader.h"
#include "AliGenEventHeader.h"
#include "AliV0vertex.h"
#include "AliV0vertexer.h"
#include "AliITSVertex.h"
#include "AliITSVertexer.h"
#include "AliITSVertexerTracks.h"
#include "AliD0Trigger.h"
#endif
//-------------------------------------
// field (T)
const Double_t kBz = 0.4;

// primary vertex
Double_t primaryvertex[3] = {0.,0.,0,};

// sigle track cuts
const Double_t kPtCut = 0.5;      // GeV/c
const Double_t kd0Cut = 50.;      // micron
const Double_t kd0CutHigh = 200.; // micron


//cuts for combined tracks
const Double_t cuts[5] = {0.005,  // cuts[0] = lowest V0 cut  (cm)
			  200,    // cuts[1] = highest V0 cut (cm) //0.02
			  0.1,    // cuts[2] = inv. mass cut (diferense) (Gev/c)
			  0.95,   // cuts[3] = max cosine value for pointing angle
                          -5000}; // cuts[4] = max cosine value for pointing angle

Int_t iTrkP,iTrkN,itsEntries;
Char_t trksName[100];
Int_t nTrksP=0,nTrksN=0;
Int_t nD0=0;
int ev=0;

void RunD0Trigger(Int_t evFirst=0,Int_t evLast=1,Char_t* path="./") {

  const Char_t *name="AliD0Trigger";
  cerr<<'\n'<<name<<"...\n";
  gBenchmark->Start(name); 

  AliKalmanTrack::SetConvConst(100/0.299792458/kBz);

  // Open file with ITS tracks
  Char_t fnameTrack[1024];
  sprintf(fnameTrack,"%s/AliITStracksV2.root",path);
  TFile* itstrks = TFile::Open(fnameTrack);

   // tracks from ITS
  sprintf(trksName,"TreeT_ITS_%d",ev);
  TTree *itsTree=(TTree*)itstrks->Get(trksName);
  if(!itsTree) continue;
  itsEntries = (Int_t)itsTree->GetEntries();
  printf("+++\n+++ Number of tracks in ITS: %d\n+++\n\n",itsEntries);

  //Getting primary Vertex
  GetPrimaryVertex(0,path);

  // call function which applies sigle track selection and
  // separetes positives and negatives
  TObjArray trksP(itsEntries/2);
  Int_t *itsEntryP = new Int_t[itsEntries];
  TObjArray trksN(itsEntries/2);
  Int_t *itsEntryN = new Int_t[itsEntries];
  SelectTracks(*itsTree,trksP,itsEntryP,nTrksP,trksN,itsEntryN,nTrksN); 

  cout<<"#pos: "<<nTrksP<<endl;
  cout<<"#neg: "<<nTrksN<<endl;

  AliD0Trigger * D0 = new AliD0Trigger(cuts,kBz,primaryvertex);

  for(iTrkP=0; iTrkP<nTrksP; iTrkP++) {
    postrack = (AliITStrackV2*)trksP.At(iTrkP);
    for(iTrkN=0; iTrkN<nTrksN; iTrkN++) {
      negtrack = (AliITStrackV2*)trksN.At(iTrkN);
      D0.SetTracks(postrack,negtrack);
      if(D0.FindV0()){
	D0.FindMomentaAtVertex();
	if(D0.FindInvMass()){
	  if(D0.PointingAngle()){
	    nD0++;
	  }
	}
      } 
    }
  }
  cout<<"#D0: "<<nD0<<endl;
  gBenchmark->Stop(name);
  gBenchmark->Show(name);
}
//___________________________________________________________________________
void   SelectTracks(TTree& itsTree,
                    TObjArray& trksP,Int_t* itsEntryP,Int_t& nTrksP,
                    TObjArray& trksN,Int_t* itsEntryN,Int_t& nTrksN) {
//
// this function creates two TObjArrays with positive and negative tracks
//
  nTrksP=0,nTrksN=0;

 
  Int_t entr = (Int_t)itsTree.GetEntries();

  // trasfer tracks from tree to arrays
  for(Int_t i=0; i<entr; i++) {

    AliITStrackV2 *itstrack = new AliITStrackV2; 
    itsTree.SetBranchAddress("tracks",&itstrack);

    itsTree.GetEvent(i);

    // single track selection
    if(!TrkCuts(*itstrack)) { delete itstrack; continue; }

    if(itstrack->Get1Pt()>0.) { // negative track
      trksN.AddLast(itstrack);
      itsEntryN[nTrksN] = i;
      nTrksN++;
    } else {                    // positive track
      trksP.AddLast(itstrack);
      itsEntryP[nTrksP] = i;
      nTrksP++;
    }

  }

  return;
}
//____________________________________________________________________________
Bool_t TrkCuts(const AliITStrackV2& trk) {
// 
// this function tells if track passes some kinematical cuts  
//
  if(TMath::Abs(1./trk.Get1Pt()) < kPtCut)                return kFALSE;
  if(TMath::Abs(10000.*trk.GetD(primaryvertex[0],primaryvertex[1])) < kd0Cut) return kFALSE;
  if(TMath::Abs(10000.*trk.GetD(primaryvertex[0],primaryvertex[1])) > kd0CutHigh) return kFALSE;

  return kTRUE;
}
//____________________________________________________________________________
void GetPrimaryVertex(int i,Char_t* path="./") {

  int event=i;

  Char_t falice[1024];
  sprintf(falice,"%s/galice.root",path);
  TFile * galice = new TFile(falice);
  
  TDirectory * curdir;  

  Char_t vname[20];
  galice->cd();
  
  sprintf(vname,"Vertex_%d",event);
  TArrayF o = 0;
  o.Set(3);
  AliHeader * header = 0;
  
  TTree * treeE = (TTree*)gDirectory->Get("TE");
  treeE->SetBranchAddress("Header",&header);
  treeE->GetEntry(event);
  AliGenEventHeader* genHeader = header->GenEventHeader();
  if(genHeader){
    genHeader->PrimaryVertex(o);
    primaryvertex[0] = (Double_t)o[0];
    primaryvertex[1] = (Double_t)o[1];
    primaryvertex[2] = (Double_t)o[2];
  }
  else{
    printf("Can't find Header");
  }
  delete header;
  delete galice;
}
 RunD0Trigger.C:1
 RunD0Trigger.C:2
 RunD0Trigger.C:3
 RunD0Trigger.C:4
 RunD0Trigger.C:5
 RunD0Trigger.C:6
 RunD0Trigger.C:7
 RunD0Trigger.C:8
 RunD0Trigger.C:9
 RunD0Trigger.C:10
 RunD0Trigger.C:11
 RunD0Trigger.C:12
 RunD0Trigger.C:13
 RunD0Trigger.C:14
 RunD0Trigger.C:15
 RunD0Trigger.C:16
 RunD0Trigger.C:17
 RunD0Trigger.C:18
 RunD0Trigger.C:19
 RunD0Trigger.C:20
 RunD0Trigger.C:21
 RunD0Trigger.C:22
 RunD0Trigger.C:23
 RunD0Trigger.C:24
 RunD0Trigger.C:25
 RunD0Trigger.C:26
 RunD0Trigger.C:27
 RunD0Trigger.C:28
 RunD0Trigger.C:29
 RunD0Trigger.C:30
 RunD0Trigger.C:31
 RunD0Trigger.C:32
 RunD0Trigger.C:33
 RunD0Trigger.C:34
 RunD0Trigger.C:35
 RunD0Trigger.C:36
 RunD0Trigger.C:37
 RunD0Trigger.C:38
 RunD0Trigger.C:39
 RunD0Trigger.C:40
 RunD0Trigger.C:41
 RunD0Trigger.C:42
 RunD0Trigger.C:43
 RunD0Trigger.C:44
 RunD0Trigger.C:45
 RunD0Trigger.C:46
 RunD0Trigger.C:47
 RunD0Trigger.C:48
 RunD0Trigger.C:49
 RunD0Trigger.C:50
 RunD0Trigger.C:51
 RunD0Trigger.C:52
 RunD0Trigger.C:53
 RunD0Trigger.C:54
 RunD0Trigger.C:55
 RunD0Trigger.C:56
 RunD0Trigger.C:57
 RunD0Trigger.C:58
 RunD0Trigger.C:59
 RunD0Trigger.C:60
 RunD0Trigger.C:61
 RunD0Trigger.C:62
 RunD0Trigger.C:63
 RunD0Trigger.C:64
 RunD0Trigger.C:65
 RunD0Trigger.C:66
 RunD0Trigger.C:67
 RunD0Trigger.C:68
 RunD0Trigger.C:69
 RunD0Trigger.C:70
 RunD0Trigger.C:71
 RunD0Trigger.C:72
 RunD0Trigger.C:73
 RunD0Trigger.C:74
 RunD0Trigger.C:75
 RunD0Trigger.C:76
 RunD0Trigger.C:77
 RunD0Trigger.C:78
 RunD0Trigger.C:79
 RunD0Trigger.C:80
 RunD0Trigger.C:81
 RunD0Trigger.C:82
 RunD0Trigger.C:83
 RunD0Trigger.C:84
 RunD0Trigger.C:85
 RunD0Trigger.C:86
 RunD0Trigger.C:87
 RunD0Trigger.C:88
 RunD0Trigger.C:89
 RunD0Trigger.C:90
 RunD0Trigger.C:91
 RunD0Trigger.C:92
 RunD0Trigger.C:93
 RunD0Trigger.C:94
 RunD0Trigger.C:95
 RunD0Trigger.C:96
 RunD0Trigger.C:97
 RunD0Trigger.C:98
 RunD0Trigger.C:99
 RunD0Trigger.C:100
 RunD0Trigger.C:101
 RunD0Trigger.C:102
 RunD0Trigger.C:103
 RunD0Trigger.C:104
 RunD0Trigger.C:105
 RunD0Trigger.C:106
 RunD0Trigger.C:107
 RunD0Trigger.C:108
 RunD0Trigger.C:109
 RunD0Trigger.C:110
 RunD0Trigger.C:111
 RunD0Trigger.C:112
 RunD0Trigger.C:113
 RunD0Trigger.C:114
 RunD0Trigger.C:115
 RunD0Trigger.C:116
 RunD0Trigger.C:117
 RunD0Trigger.C:118
 RunD0Trigger.C:119
 RunD0Trigger.C:120
 RunD0Trigger.C:121
 RunD0Trigger.C:122
 RunD0Trigger.C:123
 RunD0Trigger.C:124
 RunD0Trigger.C:125
 RunD0Trigger.C:126
 RunD0Trigger.C:127
 RunD0Trigger.C:128
 RunD0Trigger.C:129
 RunD0Trigger.C:130
 RunD0Trigger.C:131
 RunD0Trigger.C:132
 RunD0Trigger.C:133
 RunD0Trigger.C:134
 RunD0Trigger.C:135
 RunD0Trigger.C:136
 RunD0Trigger.C:137
 RunD0Trigger.C:138
 RunD0Trigger.C:139
 RunD0Trigger.C:140
 RunD0Trigger.C:141
 RunD0Trigger.C:142
 RunD0Trigger.C:143
 RunD0Trigger.C:144
 RunD0Trigger.C:145
 RunD0Trigger.C:146
 RunD0Trigger.C:147
 RunD0Trigger.C:148
 RunD0Trigger.C:149
 RunD0Trigger.C:150
 RunD0Trigger.C:151
 RunD0Trigger.C:152
 RunD0Trigger.C:153
 RunD0Trigger.C:154
 RunD0Trigger.C:155
 RunD0Trigger.C:156
 RunD0Trigger.C:157
 RunD0Trigger.C:158
 RunD0Trigger.C:159
 RunD0Trigger.C:160
 RunD0Trigger.C:161
 RunD0Trigger.C:162
 RunD0Trigger.C:163
 RunD0Trigger.C:164
 RunD0Trigger.C:165
 RunD0Trigger.C:166
 RunD0Trigger.C:167
 RunD0Trigger.C:168
 RunD0Trigger.C:169
 RunD0Trigger.C:170
 RunD0Trigger.C:171
 RunD0Trigger.C:172
 RunD0Trigger.C:173
 RunD0Trigger.C:174
 RunD0Trigger.C:175
 RunD0Trigger.C:176
 RunD0Trigger.C:177
 RunD0Trigger.C:178
 RunD0Trigger.C:179
 RunD0Trigger.C:180
 RunD0Trigger.C:181
 RunD0Trigger.C:182
 RunD0Trigger.C:183
 RunD0Trigger.C:184
 RunD0Trigger.C:185
 RunD0Trigger.C:186
 RunD0Trigger.C:187
 RunD0Trigger.C:188
 RunD0Trigger.C:189
 RunD0Trigger.C:190
 RunD0Trigger.C:191
 RunD0Trigger.C:192
 RunD0Trigger.C:193
 RunD0Trigger.C:194