]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/Alieve/KineTools.cxx
Optimize reading of track references.
[u/mrichter/AliRoot.git] / EVE / Alieve / KineTools.cxx
1 // $Header$
2
3 #include "KineTools.h"
4
5 #include <TObject.h>
6 #include <TTree.h>
7 #include <TBranchElement.h>
8 #include <TClonesArray.h>
9
10 #include <AliStack.h>
11 #include <AliTrackReference.h>
12
13 #include "Reve/Track.h"
14 #include "Reve/RenderElement.h"
15
16 #include <algorithm>
17 #include <map>
18
19 //______________________________________________________________________
20 // KineTools
21 //
22
23 using namespace Reve;
24 using namespace Alieve;
25 using namespace std;
26
27 ClassImp(KineTools)
28
29 KineTools::KineTools()
30 {}
31
32 /**************************************************************************/
33
34 void KineTools::SetDaughterPathMarks(TrackList* cont,  AliStack* stack)
35 {
36   // Import daughters birth points.
37
38   RenderElement::List_i  iter = cont->BeginChildren();
39
40   while(iter != cont->EndChildren())
41   {
42     Track* track = dynamic_cast<Track*>(*iter); 
43     TParticle* p = stack->Particle(track->GetLabel());
44     if(p->GetNDaughters()) {
45       Int_t d0 = p->GetDaughter(0), d1 = p->GetDaughter(1);
46       for(int d=d0; d>0 && d<=d1;++d) 
47       { 
48         TParticle* dp = stack->Particle(d);
49         Reve::PathMark* pm = new PathMark(PathMark::Daughter);
50         pm->V.Set(dp->Vx(),dp->Vy(), dp->Vz());
51         pm->P.Set(dp->Px(),dp->Py(), dp->Pz()); 
52         pm->time = dp->T();
53         track->AddPathMark(pm);
54       }
55     }
56     ++iter;
57   }
58 }
59
60 /**************************************************************************/
61
62 namespace {
63 struct cmp_pathmark {
64   bool operator()(PathMark* const & a, PathMark* const & b)
65   { return a->time < b->time; }
66 };
67 }
68
69 void KineTools::SetTrackReferences(TrackList* cont, TTree* treeTR)
70 {
71   // set decay and reference points
72
73   static const Exc_t eH("KineTools::ImportPathMarks");
74
75   // fill map
76   map<Int_t, Track* >      tracks;
77   RenderElement::List_i  citer = cont->BeginChildren();
78   while(citer != cont->EndChildren())
79   { 
80     Track* track = dynamic_cast<Track*>(*citer); 
81     tracks[track->GetLabel()] = track;
82     ++citer;
83   }
84  
85   Int_t nPrimaries = (Int_t) treeTR->GetEntries();
86   TIter next(treeTR->GetListOfBranches());
87   TBranchElement* el;
88   Bool_t isRef = kTRUE;
89
90   while ((el = (TBranchElement*) next()))
91   {
92     if (strcmp("AliRun",el->GetName()) == 0)
93       isRef = kFALSE;
94
95     TClonesArray* arr = 0;
96     el->SetAddress(&arr);
97     for (Int_t iPrimPart = 0; iPrimPart<nPrimaries; iPrimPart++) 
98     {
99       el->GetEntry(iPrimPart);
100
101       Int_t last_label = -1;
102       map<Int_t, Track*>::iterator iter = tracks.end(); 
103       Int_t Nent =  arr->GetEntriesFast();
104       for (Int_t iTrackRef = 0; iTrackRef < Nent; iTrackRef++) 
105       {
106         AliTrackReference* atr = (AliTrackReference*)arr->UncheckedAt(iTrackRef);
107
108         Int_t label = atr->GetTrack();
109         if (label < 0)
110           throw(eH + Form("negative label for entry %d in branch %s.",
111                           iTrackRef, el->GetName()));
112         
113         if(label != last_label) {
114           iter = tracks.find(label);
115           last_label = label;
116         }
117
118         if (iter != tracks.end()) {
119           PathMark* pm = new PathMark(isRef ? PathMark::Reference : PathMark::Decay);
120           pm->V.Set(atr->X(),atr->Y(), atr->Z());
121           pm->P.Set(atr->Px(),atr->Py(), atr->Pz());  
122           pm->time = atr->GetTime();
123           Track* track  = iter->second;
124           track->AddPathMark(pm);
125         }
126       } // loop track refs 
127     } // loop primaries, clones arrays
128     delete arr;
129   } // end loop through top branches
130
131   // sort 
132   for(map<Int_t, Track*>::iterator j=tracks.begin(); j!=tracks.end(); ++j) {
133     (j->second)->SortPathMarksByTime();
134   }
135 }