]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/alice-macros/ana_list_load_kinks.C
recover the detector tag int and not the string from the AOD particle
[u/mrichter/AliRoot.git] / EVE / alice-macros / ana_list_load_kinks.C
1 // Launches the list analyser and loads kinks into the list.
2 // If you already have a list (or rather a list analyser) with objects and you want to add the kinks to this list, do the following:
3 // Right-click the list analyser in the eve-browser and select "ExportToCint". Choose e.g. "list" for the name in the window that pops up.
4 // In the console type ".x ana_list_load_kinks.C(list)"
5 // For more information please see "ana_list.C" or have a look at the class documentation.
6
7
8 #if !defined(__CINT__) || defined(__MAKECINT__)
9 #include <TGLViewer.h>
10 #include <TEveManager.h>
11 #include <TEveTrackPropagator.h>
12
13 #include <AliTRDarrayADC.h>
14 #include <AliTRDReconstructor.h>
15 #include <AliTRDtrackV1.h>
16 #include <AliESDkink.h>
17 #include <AliESDEvent.h>
18 #include <AliESDfriend.h>
19 #include <AliEveTRDData.h>
20 #include <AliEveEventManager.h>
21 #include <AliEveKink.h>
22 #include <AliEveListAnalyser.h>
23 #endif
24
25 void esd_kink_init_rectrackMother(TEveRecTrack& rt, const AliExternalTrackParam* tp)
26 {
27   Double_t pbuf[3], vbuf[3];
28
29   rt.fSign = tp->GetSign();
30   tp->GetXYZ(vbuf);     rt.fV.Set(vbuf);
31   tp->GetPxPyPz(pbuf);  rt.fP.Set(pbuf);
32   
33   rt.fBeta = 1; // ep/TMath::Sqrt(ep*ep + mc*mc);
34 }
35
36 void esd_kink_init_rectrackDaughter(TEveRecTrack& rt, const AliExternalTrackParam* tp, TEveVector* svt,TEveVector* spt)
37 {
38   rt.fSign = tp->GetSign();
39   rt.fV.Set(*svt);
40   rt.fP.Set(*spt);
41   
42   rt.fBeta = 1; // ep/TMath::Sqrt(ep*ep + mc*mc);
43 }
44
45 AliEveKink* esd_make_kink(TEveTrackPropagator* rnrStyleMoth,TEveTrackPropagator* rnrStyleDaugh, AliESDtrack* moth, AliESDtrack* daug, AliESDkink* kink, Int_t i)
46 {
47   TEveRecTrack  rcMoth;
48   TEveRecTrack  rcDaug;
49   TEveRecKink   rcKink;
50   
51   const TVector3 p1(kink->GetMotherP());
52   rcKink.fPMother.Set(p1);
53   const TVector3 p2(kink->GetDaughterP());
54   rcKink.fPDaughter.Set(p2);
55
56   const TVector3 r1(kink->GetPosition());
57   rcKink.fVKink.Set(r1);
58   
59   for (Int_t j=0; j<3; ++j) rcKink.fKinkAngle[j]=kink->GetAngle(j);
60   
61   Double_t r[3], r2[3];
62
63   moth->GetTPCInnerParam()->GetXYZ(r2);  rcKink.fVMother.Set(r2);
64   daug->GetOuterParam()->GetXYZ(r);  rcKink.fVDaughter.Set(r);
65
66   esd_kink_init_rectrackMother(rcMoth, (moth->GetTPCInnerParam()));  
67   rcMoth.fIndex = moth->GetID();
68   
69   esd_kink_init_rectrackDaughter(rcDaug, daug->GetOuterParam(), &rcKink.fVKink, &rcKink.fPDaughter);
70   rcDaug.fIndex = daug->GetID();
71   
72   AliEveKink* myKink = new AliEveKink(&rcMoth, &rcDaug, &rcKink, rnrStyleMoth,rnrStyleDaugh);
73   
74   myKink->SetElementName(Form("ESDkink %d  \n", i));
75   myKink->SetESDKinkIndex(i);
76  
77   for (Int_t j=0; j<3; ++j) myKink->SetKinkAngle(j, kink->GetAngle(j));
78   Double_t daugProbability[10];
79   Double_t daugP = 0.0;
80   daug->GetESDpid(daugProbability);
81   daugP = daug->P();
82
83   // ****** Tentative particle type "concentrations"
84   Double_t c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
85   AliPID::SetPriors(c);
86
87   AliPID daugPid(daugProbability);
88
89   Int_t   daugMostProbPdg =  0;
90
91   switch (daugPid.GetMostProbable()){
92   case 0:
93     daugMostProbPdg =   11; break;
94   case 1:
95     daugMostProbPdg =   13; break;
96   case 2:
97     daugMostProbPdg =  211; break;
98   default :
99     daugMostProbPdg =  13; break;
100   }
101
102   Float_t daugMaxProbPid  = daugPid.GetProbability(daugPid.GetMostProbable());
103
104   myKink->SetMaxProbPdgPid(daugMostProbPdg,daugMaxProbPid);//????????????
105
106   return myKink;
107
108
109 void ana_list_load_kinks(AliEveListAnalyser* objects = 0, TEveElement *cont = 0)
110 {
111   Bool_t noListProvided = kTRUE;
112   if (objects)  noListProvided = kFALSE;
113
114   // Link data containers
115   AliESDfriend *eventESDfriend = 0x0;
116   if(!(eventESDfriend = AliEveEventManager::AssertESDfriend())){
117     Warning("ana_list_load_tracks", "AliESDfriend not found");
118     return;
119   }
120
121   AliESDEvent* esd = AliEveEventManager::AssertESD();
122
123   AliEveEventManager::AssertGeometry();
124
125   if (!objects) objects = new AliEveListAnalyser("Analysis Objects");
126   
127   // Kinks
128   AliEveKinkList* list = new AliEveKinkList("ESD kink");
129   list->SetMainColor(3); // green
130   TEveTrackPropagator* rnrStyleMoth = list->GetPropagatorMoth();
131   rnrStyleMoth->SetMagField( 0.1*esd->GetMagneticField() );
132   TEveTrackPropagator* rnrStyleDaugh = list->GetPropagatorDaugh();
133   rnrStyleDaugh->SetMagField( 0.1*esd->GetMagneticField() ); 
134   rnrStyleDaugh->SetMaxR(520);
135   //gEve->AddElement(list);
136
137 // Number of elements already in the list
138   Int_t nOld = objects->NumChildren();
139
140   Int_t count = 0;
141
142   for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
143   { 
144     AliESDtrack* mtrack = esd->GetTrack(n);
145     if (!mtrack) continue;
146     // GetKinkIndex < 0 in the following!!! => -GetKinkIndex > 0
147     if(mtrack->GetKinkIndex(0) < 0)
148     {
149       AliESDkink *kink = new AliESDkink;
150     
151       kink = esd->GetKink(-mtrack->GetKinkIndex(0) - 1);
152       if (!kink)  continue;      
153
154       for (Int_t m = 0; m < esd->GetNumberOfTracks(); ++m)
155       { 
156         AliESDtrack * dtrack = esd->GetTrack(m);
157         if (!dtrack)  continue;
158
159         if((dtrack->GetKinkIndex(0) > 0 ) && (dtrack->GetKinkIndex(0) == -mtrack->GetKinkIndex(0))) 
160         {
161           AliESDtrack* mothTr = esd->GetTrack(n);
162           AliESDtrack* daugTr = esd->GetTrack(m);
163           if (!mothTr || !daugTr) continue;
164
165           AliEveKink* myKink = esd_make_kink(rnrStyleMoth, rnrStyleDaugh, mothTr, daugTr, kink, (-mtrack->GetKinkIndex(0)-1));
166           if (myKink)
167           {
168             myKink->SetUserData(kink);
169             myKink->SetMarkerColor(3);
170             gEve->AddElement(myKink, list);
171             objects->AddElement(myKink);
172             myKink->SetName(Form("[%4d] kink", count + nOld));
173             ++count;
174           }
175         }
176       }  // inner track loop
177     }  //mother kink index <0
178   } // Outer track loop
179
180   list->MakeKinks();
181
182   objects->SetTitle(Form("Objects %d", objects->NumChildren()));
183   objects->StampObjProps();
184  
185   // If a new list analyser has been created, add it to eve.
186   if (noListProvided)  gEve->AddElement(objects, cont);
187
188   gEve->Redraw3D();
189
190   //  TGLViewer *v = gEve->GetDefaultGLViewer();
191   //  v->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
192   //  ((TGLOrthoCamera&)v->CurrentCamera()).SetEnableRotate(kTRUE);
193   //  v->UpdateScene();
194
195   return;
196 }