]> git.uio.no Git - u/mrichter/AliRoot.git/blame - EVE/EveBase/AliEveKineTools.cxx
From Antonin:
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveKineTools.cxx
CommitLineData
d810d0de 1// $Id$
2// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
c63fcc1d 3
d810d0de 4/**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
51346b82 7 * full copyright notice. *
d810d0de 8 **************************************************************************/
9
10#include "AliEveKineTools.h"
0e33c639 11#include "AliEveTrack.h"
7704f096 12
c63fcc1d 13#include <AliStack.h>
14#include <AliTrackReference.h>
15
0e33c639 16#include <TTree.h>
17#include <TBranchElement.h>
18#include <TClonesArray.h>
c63fcc1d 19
7704f096 20#include <map>
c63fcc1d 21
57ffa5fb 22//______________________________________________________________________________
d810d0de 23// AliEveKineTools
c63fcc1d 24//
d4369ead 25// Tools for import of kinematics.
40790e5b 26//
d810d0de 27
d810d0de 28ClassImp(AliEveKineTools)
c63fcc1d 29
40790e5b 30namespace {
31
2142305c 32 // Map to store label-to-track association.
33 //
34 // multimap is used as there are cases when initial particles (in
35 // particular resonances) are not assigned proper status-codes
36 // and can thus be found several times in the eve-track-list.
37
0e33c639 38 typedef std::multimap<Int_t, AliEveTrack*> TrackMap_t;
39 typedef std::multimap<Int_t, AliEveTrack*>::const_iterator TrackMap_ci;
40790e5b 40
41 void MapTracks(TrackMap_t& map, TEveElement* cont, Bool_t recurse)
42 {
43 TEveElement::List_i i = cont->BeginChildren();
44 while (i != cont->EndChildren()) {
0e33c639 45 AliEveTrack* track = dynamic_cast<AliEveTrack*>(*i);
2142305c 46 map.insert(std::make_pair(track->GetLabel(), track));
40790e5b 47 if (recurse)
48 MapTracks(map, track, recurse);
49 ++i;
50 }
51 }
52}
53
54/**************************************************************************/
76461dad 55
d810d0de 56void AliEveKineTools::SetDaughterPathMarks(TEveElement* cont, AliStack* stack, Bool_t recurse)
c63fcc1d 57{
76461dad 58 // Import daughters birth points.
59
84aff7a4 60 TEveElement::List_i iter = cont->BeginChildren();
c63fcc1d 61 while(iter != cont->EndChildren())
62 {
0e33c639 63 AliEveTrack* track = dynamic_cast<AliEveTrack*>(*iter);
c63fcc1d 64 TParticle* p = stack->Particle(track->GetLabel());
a15e6d7d 65 if (p->GetNDaughters())
66 {
c63fcc1d 67 Int_t d0 = p->GetDaughter(0), d1 = p->GetDaughter(1);
a15e6d7d 68 for(int d = d0; d > 0 && d <= d1; ++d)
51346b82 69 {
c63fcc1d 70 TParticle* dp = stack->Particle(d);
a15e6d7d 71 track->AddPathMark(TEvePathMark(TEvePathMark::kDaughter,
72 TEveVector(dp->Vx(), dp->Vy(), dp->Vz()),
73 TEveVector(dp->Px(), dp->Py(), dp->Pz()),
74 dp->T()));
d4369ead 75 // printf("Daughter path-mark for %d, %d, t=%e, r=%f,%f,%f\n",
76 // track->GetLabel(), d, dp->T(), dp->Vx(), dp->Vy(), dp->Vz());
c63fcc1d 77 }
804bb570 78
79 // Check last process, set decay if needed.
80 Int_t lp = stack->Particle(d1)->GetUniqueID();
81 if (lp != kPBrem && lp != kPDeltaRay && lp < kPCerenkov)
82 {
83 TParticle* dp = stack->Particle(d1);
84 track->AddPathMark(TEvePathMark(TEvePathMark::kDecay,
85 TEveVector(dp->Vx(), dp->Vy(), dp->Vz()),
86 TEveVector(0, 0,0), dp->T()));
87 }
88
27aa96b0 89 if (recurse)
90 SetDaughterPathMarks(track, stack, recurse);
c63fcc1d 91 }
92 ++iter;
93 }
94}
95
40790e5b 96/**************************************************************************/
974767e6 97
d810d0de 98void AliEveKineTools::SetTrackReferences(TEveElement* cont, TTree* treeTR, Bool_t recurse)
974767e6 99{
40790e5b 100 // Set decay and track reference path-marks.
974767e6 101
a15e6d7d 102 static const TEveException kEH("AliEveKineTools::ImportPathMarks");
974767e6 103
40790e5b 104 TrackMap_t map;
105 MapTracks(map, cont, recurse);
51346b82 106
d4369ead 107 TClonesArray* arr = 0;
108 treeTR->SetBranchAddress("TrackReferences", &arr);
c63fcc1d 109
d4369ead 110 Int_t nTreeEntries = (Int_t) treeTR->GetEntries();
111
112 for (Int_t te = 0; te < nTreeEntries; ++te)
c63fcc1d 113 {
d4369ead 114 treeTR->GetEntry(te);
115
116 Int_t last_label = -1;
2142305c 117 std::pair<TrackMap_ci, TrackMap_ci> range;
d4369ead 118 Int_t nArrEntries = arr->GetEntriesFast();
119
120 // printf("tree-entry %d, n-arr-entries %d\n", te, nArrEntries);
c63fcc1d 121
d4369ead 122 for (Int_t ae = 0; ae < nArrEntries; ++ae)
c63fcc1d 123 {
d4369ead 124 AliTrackReference* atr = (AliTrackReference*)arr->UncheckedAt(ae);
125 Bool_t isRef = (atr->DetectorId() != -1);
126 Int_t label = atr->GetTrack();
127
128 // printf(" arr-entry %d, label %d, detid %d, len=%f, t=%e r=%f,%f,%f\n",
129 // ae, label, atr->DetectorId(),
130 // atr->GetLength(), atr->GetTime(), atr->X(), atr->Y(), atr->Z());
131
132 if (label < 0)
133 throw(kEH + Form("negative label for array-entry %d in tree-entry %d.",
134 ae, te));
135
136 if (label != last_label)
137 {
2142305c 138 range = map.equal_range(label);
d4369ead 139 last_label = label;
140 }
1d74e2b0 141
2142305c 142 for (TrackMap_ci i = range.first; i != range.second; ++i)
c63fcc1d 143 {
2142305c 144 i->second->AddPathMark
d4369ead 145 (TEvePathMark(isRef ? TEvePathMark::kReference : TEvePathMark::kDecay,
146 TEveVector(atr->X(), atr->Y(), atr->Z()),
147 TEveVector(atr->Px(), atr->Py(), atr->Pz()),
148 atr->GetTime()));
149 }
150 }
151 }
152 delete arr;
27aa96b0 153}
154
40790e5b 155/**************************************************************************/
156
157void AliEveKineTools::SortPathMarks(TEveElement* el, Bool_t recurse)
27aa96b0 158{
d4369ead 159 // Sort path-marks for track by time.
160 // If recurse is true, descends down all track children.
a15e6d7d 161
0e33c639 162 AliEveTrack* track = dynamic_cast<AliEveTrack*>(el);
d4369ead 163 if (track)
164 track->SortPathMarksByTime();
c63fcc1d 165
d4369ead 166 if (recurse)
a15e6d7d 167 {
d4369ead 168 for (TEveElement::List_i i = el->BeginChildren(); i != el->EndChildren(); ++i)
169 SortPathMarks(*i, kTRUE);
c63fcc1d 170 }
171}