* See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
* full copyright notice. *
**************************************************************************/
+#if !defined(__CINT__) || defined(__MAKECINT__)
+#include <TMath.h>
+#include <TEveManager.h>
+#include <TEveElement.h>
+#include <TEveTrack.h>
+#include <TEveTrackPropagator.h>
-// To use when per-line id is supported
+#include <AliESDEvent.h>
+#include <AliESDVertex.h>
+#include <AliMultiplicity.h>
+#include <AliMagF.h>
+#include <AliEveEventManager.h>
+#include <AliEveTracklet.h>
+#include <AliEveTrackCounter.h>
+#endif
-class TrackletId : public TObject
+TEveElementList* esd_spd_tracklets(Float_t radius=8, Width_t line_width=2,
+ Float_t dPhiWindow=0.080, Float_t dThetaWindow=0.025,
+ Float_t dPhiShift05T=0.0045)
{
-public:
- // label, phi, theta
- // virtual void Print(const Option_t* opt="") {}
-};
+ // radius - cylindrical radius to which the tracklets should be extrapolated
-TEveStraightLineSet* esd_spd_tracklets(Float_t rad=8)
-{
- AliESDEvent * esd = AliEveEventManager::AssertESD();
- AliESDVertex * pv = esd->GetPrimaryVertex();
- AliMultiplicity* mul = esd->GetMultiplicity();
+ AliESDEvent *esd = AliEveEventManager::AssertESD();
+ const AliESDVertex *pv = esd->GetPrimaryVertexSPD();
+ const AliMultiplicity *mul = esd->GetMultiplicity();
+
+ AliMagF *field = AliEveEventManager::AssertMagField();
+
+ TEveElementList* cont = new TEveElementList("SPD Tracklets");
+ gEve->AddElement(cont);
+
+ TEveTrackList *tg = new TEveTrackList("Good");
+ tg->SetMainColor(kCyan);
+ tg->SetLineWidth(line_width);
+ cont->AddElement(tg);
+
+ TEveTrackPropagator* pg = tg->GetPropagator();
+ pg->SetMaxR(radius);
+
+ TEveTrackList *tb = new TEveTrackList("Bad");
+ tb->SetMainColor(kMagenta);
+ tb->SetLineWidth(line_width);
+ cont->AddElement(tb);
+
+ TEveTrackPropagator* pb = tb->GetPropagator();
+ pb->SetMaxR(radius);
+
+ const Float_t Bz = TMath::Abs(field->SolenoidField());
+
+ const Double_t dPhiShift = dPhiShift05T / 5.0 * Bz;
+ const Double_t dPhiWindow2 = dPhiWindow * dPhiWindow;
+ const Double_t dThetaWindow2 = dThetaWindow * dThetaWindow;
- Double_t pvx[3], pve[3];
- pv->GetXYZ(pvx);
- pv->GetSigmaXYZ(pve);
+ for (Int_t i = 0; i < mul->GetNumberOfTracklets(); ++i)
+ {
+ Float_t theta = mul->GetTheta(i);
+ Float_t phi = mul->GetPhi(i);
+ Float_t dTheta = mul->GetDeltaTheta(i);
+ Float_t dPhi = mul->GetDeltaPhi(i) - dPhiShift;
+ Float_t d = dPhi*dPhi/dPhiWindow2 + dTheta*dTheta/dThetaWindow2;
+
+ TEveTrackList* tl = (d < 1.0f) ? tg : tb;
+
+ AliEveTracklet *t = new AliEveTracklet(i, pv, theta, phi, tl->GetPropagator());
+ t->SetAttLineAttMarker(tl);
+ t->SetElementName(Form("Tracklet %d", i));
+ t->SetElementTitle(Form("Id = %d\nEta=%.3f, Theta=%.3f, dTheta=%.3f\nPhi=%.3f dPhi=%.3f",
+ i, mul->GetEta(i), theta, dTheta, phi, dPhi));
+
+ tl->AddElement(t);
+ }
- TEveStraightLineSet* ls = new TEveStraightLineSet();
+ tg->MakeTracks();
+ tg->SetTitle(Form("N=%d", tg->NumChildren()));
- for (Int_t i=0; i<mul->GetNumberOfTracklets(); ++i)
+ tb->MakeTracks();
+ tb->SetTitle(Form("N=%d", tb->NumChildren()));
+
+ if (AliEveTrackCounter::IsActive())
+ {
+ AliEveTrackCounter::fgInstance->RegisterTracklets(tg, kTRUE);
+ AliEveTrackCounter::fgInstance->RegisterTracklets(tb, kFALSE);
+ }
+ else
{
- using namespace TMath;
- Float_t dr[3];
- Float_t phi = PiOver2() - mul->GetPhi(i); // strange people
- dr[0] = rad*Cos(phi);
- dr[1] = rad*Sin(phi);
- dr[2] = rad/Tan(mul->GetTheta(i));
- ls->AddLine(pvx[0], pvx[1], pvx[2],
- pvx[0]+dr[0], pvx[1]+dr[1], pvx[2]+dr[2]);
+//==========================================
+ tb->SetLineStyle(1);
+ tb->SetLineWidth(2);
+//==========================================
+
}
- gEve->AddElement(ls);
gEve->Redraw3D();
- return ls;
+ return cont;
}