/**************************************************************************** * * * This macro determines the impact parameter of each track in pp event * * with respect to the primaty vertex position reconstructed using all * * the other tracks in the event. This procedure is necessary to avoid * * biases in the impact parameter estimate. * * * * Output: TNtuple (ntd0) on file ImpactParameters.root * * There is one entry per track. The elements of the ntuple are: * * 1) Event: Event number * * 2) nTraks: Number of tracks for this event * * 3) pt: Transverse momentum for the current track * * 4) d0rphi: transverse impact parameter of the current track * * 5) vx: x coordinate of the vertex * * 6) vy: y coordinate of the vertex * * origin: A.Dainese andrea.dainese@pd.infn.it * ****************************************************************************/ #if !defined(__CINT__) || defined(__MAKECINT__) //-- --- standard headers------------- #include //--------Root headers --------------- #include #include #include #include #include #include #include #include #include #include //----- 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" #endif //------------------------------------- // field (T) const Double_t kBz = 0.4; // this function ckecks file existence Bool_t GetInputFile(); void MoveTracks(TTree& itsTree,TObjArray& array); void AliITSImpactParametersPP(Int_t evFirst=0,Int_t evLast=0) { const Char_t *name="AliITSImpactParametersPP"; cerr<<'\n'<Start(name); AliKalmanTrack::SetConvConst(100/0.299792458/kBz); // check existence of input file if(!GetInputFile()) { cerr<<"No tracks file found"<SetMinTracks(3); vertexer1->SetDebug(0); Int_t skipped[2]; // Open file with ITS tracks TFile* itstrks = TFile::Open("AliITStracksV2.root"); // loop on events in file for(ev=evFirst; ev<=evLast; ev++) { printf(" --- Processing event %d ---\n",ev); sprintf(trksName,"TreeT_ITS_%d",ev); // tracks from ITS 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); TObjArray tArray(itsEntries); MoveTracks(*itsTree,tArray); // count the total number of events nTotEv++; // loop on tracks for(i=0; iPt(); // primary vertex from other tracks in event Bool_t goodVtx = kFALSE; vertexer1->SetVtxStart(0.,0.); skipped[0] = i; skipped[1] = -1; vertexer1->SetSkipTracks(1,skipped); AliITSVertex *vertex1 = (AliITSVertex*)vertexer1->VertexOnTheFly(*itsTree); if(vertex1->GetNContributors()>0) goodVtx = kTRUE; vertex1->GetXYZ(v1); //vertex1->PrintStatus(); // impact parameter w.r.t. v1 (in microns) d0rphi = 10000.*itstrack->GetD(v1[0],v1[1]); delete vertex1; // fill ntuple if (goodVtx) ntd0->Fill(ev,itsEntries,pt,d0rphi,v1[0],v1[1]); itstrack = 0; } // loop on tracks delete itsTree; } // loop on events in file printf("\n+++\n+++ Total number of events: %d\n+++\n",nTotEv); delete vertexer1; itstrks->Close(); // store ntuple in a file TFile* outroot = new TFile(outName.Data(),"recreate"); ntd0->Write(); outroot->Close(); delete outroot; gBenchmark->Stop(name); gBenchmark->Show(name); return; } //___________________________________________________________________________ Bool_t GetInputFile() { TString itsName("AliITStracksV2.root"); if(gSystem->AccessPathName(itsName.Data(),kFileExists)) return kFALSE; return kTRUE; } //___________________________________________________________________________ void MoveTracks(TTree& itsTree,TObjArray& array) { // // this function creates two TObjArrays with tracks // Int_t entr = (Int_t)itsTree.GetEntries(); // trasfer tracks from tree to array for(Int_t i=0; i