-#ifndef __CINT__
-#include <TGLViewer.h>
-#include <TEveManager.h>
-#include <EveBase/AliEveEventManager.h>
-#include "TRD/AliTRDarrayADC.h"
-#include <EveDet/AliEveListAnalyser.h>
-
-#include "AliESDEvent.h"
-#include "AliESDfriend.h"
-#include "TRD/AliTRDReconstructor.h"
-#include "TRD/AliTRDtrackV1.h"
-#endif
+// Start the list analyser. No objects will be loaded into the list! To add e.g. AliTrackPoints you can do the following:
+// - Run the macro "esd_tracks.C"
+// - Select some track you want to analyse as follows: Hold "shift" und right-click on the track (sometimes you have to hold the right mouse button). The menu pops up
+// -> Select "ImportClustersFromIndex"
+// -> To this for all tracks you want to analyse.
+// - Run this macro (ana_list.C)
+// - In the tab "eve" in the browser select the list analyser (called "Analysis objects" in the standard case)
+// - Select the "list" tab in the editor of this object.
+// - Click the button "start"
+// - Select e.g. clusters by holding "ctrl"+"alt" (depending on your system, holding the "alt" only can also be fine) and left-clicking on the desired cluster
+// Use the list analyser "as usual" (see class documentation)
void ana_list(TEveElement *cont = 0)
{
- // Link data containers
- AliESDfriend *eventESDfriend = 0x0;
- if(!(eventESDfriend = AliEveEventManager::AssertESDfriend())){
- Warning("trd_loadObjectList", "AliESDfriend not found");
- return;
- }
-
- AliESDEvent* esd = AliEveEventManager::AssertESD();
-
- AliEveEventManager::AssertGeometry();
-
- AliTRDrecoParam *trdRecoParam = AliTRDrecoParam::GetLowFluxParam();
- if (!trdRecoParam)
- {
- printf("Could not load AliTRDrecoParam\n");
- return;
- }
- trdRecoParam->SetPIDNeuralNetwork();
- AliTRDReconstructor *reco = new AliTRDReconstructor();
- if (!reco)
- {
- printf("Could not load AliTRDReconstructor\n");
- return;
- }
- reco->SetRecoParam(trdRecoParam);
-
-
- AliEveListAnalyser *objects = new AliEveListAnalyser("TRD Analysis Object");
-
- for (Int_t n = 0; n < esd->GetNumberOfTracks(); n++)
- {
- AliESDtrack* esdTrack = esd->GetTrack(n);
- AliESDfriendTrack *friendTrack = eventESDfriend->GetTrack(n);
-
- if (!esdTrack || !friendTrack)
- {
- printf("Problem with track %d\n", n);
- continue;
- }
-
- TObject *cal = 0x0;
- Int_t ical = 0;
-
- while((cal = friendTrack->GetCalibObject(ical++))){
- if(strcmp(cal->IsA()->GetName(), "AliTRDtrackV1") != 0) continue;
- AliTRDtrackV1 *trackObj = dynamic_cast<AliTRDtrackV1 *>(cal);
- if (!trackObj)
- {
- printf("Cast to AliTRDtrackV1 failed!\n");
- continue;
- }
- trackObj->SetReconstructor(reco);
- AliEveTRDTrack *trackEve = new AliEveTRDTrack(trackObj);
- if (!trackEve)
- {
- printf("Cast to AliEveTRDTrack failed!\n");
- continue;
- }
- objects->AddElement(trackEve);
- trackEve->SetESDstatus(esdTrack->GetStatus());
- trackEve->SetName(Form("[%4d] %s", n, trackEve->GetName()));
- }
- }
-
- delete reco;
-
- objects->SetTitle(Form("Objects %d", objects->NumChildren()));
- objects->StampObjProps();
-
- gEve->AddElement(objects, cont);
+ AliEveListAnalyser * objList = new AliEveListAnalyser("Analysis objects");
+
+ objList->SetTitle("Analysis objects (0)");
+ gEve->AddElement(objList, cont);
gEve->Redraw3D();
-
- // TGLViewer *v = gEve->GetDefaultGLViewer();
- // v->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
- // ((TGLOrthoCamera&)v->CurrentCamera()).SetEnableRotate(kTRUE);
- // v->UpdateScene();
-
- return;
}
--- /dev/null
+// Launches the list analyser and loads kinks into the list.
+// 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:
+// 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.
+// In the console type ".x ana_list_load_kinks.C(list)"
+// For more information please see "ana_list.C" or have a look at the class documentation.
+
+
+#ifndef __CINT__
+#include <TGLViewer.h>
+#include <TEveManager.h>
+#include <EveBase/AliEveEventManager.h>
+#include "TRD/AliTRDarrayADC.h"
+#include <EveDet/AliEveListAnalyser.h>
+
+#include "AliESDEvent.h"
+#include "AliESDfriend.h"
+#include "TRD/AliTRDReconstructor.h"
+#include "TRD/AliTRDtrackV1.h"
+#include "EVE/EveBase/AliEveKink.h"
+#endif
+
+void esd_kink_init_rectrackMother(TEveRecTrack& rt, AliExternalTrackParam* tp)
+{
+ Double_t pbuf[3], vbuf[3];
+
+ rt.fSign = tp->GetSign();
+ tp->GetXYZ(vbuf); rt.fV.Set(vbuf);
+ tp->GetPxPyPz(pbuf); rt.fP.Set(pbuf);
+
+ rt.fBeta = 1; // ep/TMath::Sqrt(ep*ep + mc*mc);
+}
+
+void esd_kink_init_rectrackDaughter(TEveRecTrack& rt, AliExternalTrackParam* tp, TEveVector* svt,TEveVector* spt)
+{
+ rt.fSign = tp->GetSign();
+ rt.fV.Set(*svt);
+ rt.fP.Set(*spt);
+
+ rt.fBeta = 1; // ep/TMath::Sqrt(ep*ep + mc*mc);
+}
+
+AliEveKink* esd_make_kink(TEveTrackPropagator* rnrStyleMoth,TEveTrackPropagator* rnrStyleDaugh, AliESDtrack* moth, AliESDtrack* daug, AliESDkink* kink, Int_t i)
+{
+ TEveRecTrack rcMoth;
+ TEveRecTrack rcDaug;
+ TEveRecKink rcKink;
+
+ const TVector3 p1(kink->GetMotherP());
+ rcKink.fPMother.Set(p1);
+ const TVector3 p2(kink->GetDaughterP());
+ rcKink.fPDaughter.Set(p2);
+
+ const TVector3 r1(kink->GetPosition());
+ rcKink.fVKink.Set(r1);
+
+ for (Int_t j=0; j<3; ++j) rckink.fKinkAngle[j]=kink->GetAngle(j);
+
+ Double_t r[3], r2[3];
+
+ moth->GetTPCInnerParam()->GetXYZ(r2); rcKink.fVMother.Set(r2);
+ daug->GetOuterParam()->GetXYZ(r); rcKink.fVDaughter.Set(r);
+
+ esd_kink_init_rectrackMother(rcMoth, (moth->GetTPCInnerParam()));
+ rcMoth.fIndex = moth->GetID();
+
+ esd_kink_init_rectrackDaughter(rcDaug, daug->GetOuterParam(), &rcKink.fVKink, &rcKink.fPDaughter);
+ rcDaug.fIndex = daug->GetID();
+
+ AliEveKink* myKink = new AliEveKink(&rcMoth, &rcDaug, &rcKink, rnrStyleMoth,rnrStyleDaugh);
+
+ myKink->SetElementName(Form("ESDkink %d \n", i));
+ myKink->SetESDKinkIndex(i);
+
+ for (Int_t j=0; j<3; ++j) myKink->SetKinkAngle(j, kink->GetAngle(j));
+ Double_t daugProbability[10];
+ Double_t daugP = 0.0;
+ daug->GetESDpid(daugProbability);
+ daugP = daug->P();
+
+ // ****** Tentative particle type "concentrations"
+ Double_t c[5]={0.01, 0.01, 0.85, 0.10, 0.05};
+ AliPID::SetPriors(c);
+
+ AliPID daugPid(daugProbability);
+
+ Int_t daugMostProbPdg = 0;
+
+ switch (daugPid.GetMostProbable()){
+ case 0:
+ daugMostProbPdg = 11; break;
+ case 1:
+ daugMostProbPdg = 13; break;
+ case 2:
+ daugMostProbPdg = 211; break;
+ default :
+ daugMostProbPdg = 13; break;
+ }
+
+ Float_t daugMaxProbPid = daugPid.GetProbability(daugPid.GetMostProbable());
+
+ myKink->SetMaxProbPdgPid(daugMostProbPdg,daugMaxProbPid);//????????????
+
+ return myKink;
+}
+
+void ana_list_load_kinks(AliEveListAnalyser* objects = 0, TEveElement *cont = 0)
+{
+ Bool_t noListProvided = kTRUE;
+ if (objects) noListProvided = kFALSE;
+
+ // Link data containers
+ AliESDfriend *eventESDfriend = 0x0;
+ if(!(eventESDfriend = AliEveEventManager::AssertESDfriend())){
+ Warning("ana_list_load_tracks", "AliESDfriend not found");
+ return;
+ }
+
+ AliESDEvent* esd = AliEveEventManager::AssertESD();
+
+ AliEveEventManager::AssertGeometry();
+
+ if (!objects) objects = new AliEveListAnalyser("Analysis Objects");
+
+ // Kinks
+ AliEveKinkList* list = new AliEveKinkList("ESD kink");
+ list->SetMainColor(3); // green
+ TEveTrackPropagator* rnrStyleMoth = list->GetPropagatorMoth();
+ rnrStyleMoth->SetMagField( 0.1*esd->GetMagneticField() );
+ TEveTrackPropagator* rnrStyleDaugh = list->GetPropagatorDaugh();
+ rnrStyleDaugh->SetMagField( 0.1*esd->GetMagneticField() );
+ rnrStyleDaugh->SetMaxR(520);
+ //gEve->AddElement(list);
+
+// Number of elements already in the list
+ Int_t nOld = objects->NumChildren();
+
+ Int_t count = 0;
+
+ for (Int_t n = 0; n < esd->GetNumberOfTracks(); ++n)
+ {
+ AliESDtrack* mtrack = esd->GetTrack(n);
+ if (!mtrack) continue;
+ // GetKinkIndex < 0 in the following!!! => -GetKinkIndex > 0
+ if(mtrack->GetKinkIndex(0) < 0)
+ {
+ AliESDkink *kink = new AliESDkink;
+
+ kink = esd->GetKink(-mtrack->GetKinkIndex(0) - 1);
+ if (!kink) continue;
+
+ for (Int_t m = 0; m < esd->GetNumberOfTracks(); ++m)
+ {
+ AliESDtrack * dtrack = esd->GetTrack(m);
+ if (!dtrack) continue;
+
+ if((dtrack->GetKinkIndex(0) > 0 ) && (dtrack->GetKinkIndex(0) == -mtrack->GetKinkIndex(0)))
+ {
+ AliESDtrack* mothTr = esd->GetTrack(n);
+ AliESDtrack* daugTr = esd->GetTrack(m);
+ if (!mothTr || !daugTr) continue;
+
+ AliEveKink* myKink = esd_make_kink(rnrStyleMoth, rnrStyleDaugh, mothTr, daugTr, kink, (-mtrack->GetKinkIndex(0)-1));
+ if (myKink)
+ {
+ myKink->SetUserData(kink);
+ myKink->SetMarkerColor(3);
+ gEve->AddElement(myKink, list);
+ objects->AddElement(myKink);
+ myKink->SetName(Form("[%4d] kink", count + nOld));
+ ++count;
+ }
+ }
+ } // inner track loop
+ } //mother kink index <0
+ } // Outer track loop
+
+ list->MakeKinks();
+
+ objects->SetTitle(Form("Objects %d", objects->NumChildren()));
+ objects->StampObjProps();
+
+ // If a new list analyser has been created, add it to eve.
+ if (noListProvided) gEve->AddElement(objects, cont);
+
+ gEve->Redraw3D();
+
+ // TGLViewer *v = gEve->GetDefaultGLViewer();
+ // v->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
+ // ((TGLOrthoCamera&)v->CurrentCamera()).SetEnableRotate(kTRUE);
+ // v->UpdateScene();
+
+ return;
+}