2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
4 /**************************************************************************
5 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for *
7 * full copyright notice. *
8 **************************************************************************/
10 #include "AliEveTrackFitter.h"
14 #include "TGraphErrors.h"
17 #include "AliRieman.h"
18 #include "AliExternalTrackParam.h"
20 #include <TEveTrack.h>
21 #include <TEveTrackPropagator.h>
22 #include <TEveVSDStructs.h>
23 #include <TEveManager.h>
26 //==============================================================================
27 //==============================================================================
29 //==============================================================================
31 //______________________________________________________________________________
33 // AliEveTrackFitter is an interface to TEvePointSet allowing AliRieman fit.
34 // It builds a list of points by listening to selection signal of any
35 // object of type TEvePointSet. After selection the list is feeded to
36 // AliRieman fitter, which returns helix parameters visualized with
40 ClassImp(AliEveTrackFitter)
42 AliEveTrackFitter::AliEveTrackFitter(const Text_t* name, Int_t nPoints) :
43 TEvePointSet (name, nPoints),
60 fTrackList = new TEveTrackList("Tracks");
61 fTrackList->IncDenyDestroy();
62 fTrackList->SetLineWidth(2);
63 fTrackList->SetLineColor(8);
64 fTrackList->GetPropagator()->SetEditPathMarks(kTRUE);
65 AddElement(fTrackList);
68 fGraphPicked = new TGraph();
69 fGraphPicked->SetName("Selected points");
70 fGraphPicked->SetMarkerColor(4);
71 fGraphPicked->SetMarkerStyle(4);
72 fGraphPicked->SetMarkerSize(2);
74 fGraphHelix = new TGraphErrors();
75 fGraphHelix->SetName("Fitted points");
76 fGraphHelix->SetMarkerColor(2);
79 AliEveTrackFitter::~AliEveTrackFitter()
83 if (fRieman) delete fRieman;
85 fTrackList->DecDenyDestroy();
88 /******************************************************************************/
90 void AliEveTrackFitter::DestroyElements()
92 // Virtual method of base class TEveElement.
93 // Preserves TEveTrackList object for fitted helices.
95 TEveElement::DestroyElements();
97 // fTrackList is destroyed because DenyDestroy is set.
98 gEve->AddElement(fTrackList, this);
99 fTrackList->DestroyElements();
104 /******************************************************************************/
106 void AliEveTrackFitter::Start()
108 // Clear existing point selection and maintain connection to the
109 // TEvePointSet signal.
112 if (fConnected == kFALSE)
114 TQObject::Connect("TEvePointSet", "PointSelected(Int_t)",
115 "AliEveTrackFitter", this, "AddFitPoint(Int_t)");
120 void AliEveTrackFitter::Stop()
122 // Stop adding points for the fit.
126 TQObject::Disconnect("TEvePointSet", "AddFitPoint(Int_t)");
131 void AliEveTrackFitter::Reset(Int_t nPoints, Int_t nIntIds)
135 if (fRieman) fRieman->Reset();
136 TEvePointSet::Reset(nPoints, nIntIds);
140 /******************************************************************************/
142 void AliEveTrackFitter::AddFitPoint(Int_t pointId)
144 // Add or remove given point depending if exists in the map.
148 TEvePointSet* ps = dynamic_cast<TEvePointSet*>((TQObject*) gTQSender);
150 PointMap_t::iterator g = fSPMap.find(Point_t(ps, pointId));
151 if (g != fSPMap.end())
153 Int_t idx = g->second;
154 if (idx != fLastPoint)
156 GetPoint(fLastPoint, x, y, z);
157 SetPoint(idx, x, y, z);
164 fSPMap[Point_t(ps, pointId)] = Size();
165 ps->GetPoint(pointId, x, y, z);
166 SetNextPoint(x, y, z);
170 ElementChanged(kTRUE, kTRUE);
173 /******************************************************************************/
175 void AliEveTrackFitter::FitTrack()
177 // Fit selected points with AliRieman fitter.
179 using namespace TMath;
181 if (fRieman) delete fRieman;
182 fRieman = new AliRieman(Size());
186 GetPoint(alphaIdx, x, y, z);
187 Float_t minR2=x*x + y*y;
188 for (Int_t i=0; i<=fLastPoint; i++)
190 GetPoint(i, x, y, z);
191 Float_t cR2 = x*x + y*y;
198 GetPoint(alphaIdx, x, y, z);
199 fAlpha = ATan2(y, x);
200 Float_t sin = Sin(-fAlpha);
201 Float_t cos = Cos(-fAlpha);
202 for (Int_t i = 0; i <= fLastPoint; ++i)
204 GetPoint(i, x, y, z);
205 fRieman->AddPoint(cos*x - sin*y, cos*y + sin*x, z, 1, 1);
209 Double_t r = Sqrt(minR2);
212 fRieman->GetExternalParameters(r, param, cov);
214 param[4] /= TEveTrackPropagator::fgDefMagField*TEveTrackPropagator::fgkB2C;
216 if (param[4] < 0) param[3] = -param[3];
217 AliExternalTrackParam trackParam(r, fAlpha, param, cov);
222 trackParam.GetXYZAt(r, TEveTrackPropagator::fgDefMagField, v0);
224 trackParam.GetPxPyPzAt(r, TEveTrackPropagator::fgDefMagField, p0);
228 rc.fSign = trackParam.Charge();
230 TEveTrack* track = new TEveTrack(&rc, fTrackList->GetPropagator());
231 track->SetName(Form("track %f", fAlpha));
234 track->SetAttLineAttMarker(fTrackList);
235 fTrackList->AddElement(track);
239 /******************************************************************************/
241 void AliEveTrackFitter::DrawDebugGraph()
243 // Draw graph of picked points and helix points.
245 static const TEveException kEH("AliEveTrackFitter::DrawRiemanGraph ");
248 throw(kEH + "fitter not set.");
250 Int_t nR = fRieman->GetN();
251 fGraphPicked->Set(nR);
252 fGraphHelix->Set(nR);
254 Double_t* x = fRieman->GetX();
255 Double_t* y = fRieman->GetY();
256 Double_t* sy = fRieman->GetSy();
257 for (Int_t i=0; i<nR; i++)
259 fGraphPicked->SetPoint(i, x[i], y[i]);
260 fGraphHelix->SetPoint (i, x[i], fRieman->GetYat(x[i]));
261 fGraphHelix->SetPointError(i, 0.1, sy[i]); // now faked
267 fGraphPicked->Draw("AP");
268 fGraphHelix->Draw("SAME P");
269 gPad->GetCanvas()->SetTitle(Form("AliRieman alpha: %f", fAlpha));