#include "AliEveTrackFitter.h"
#include "AliEveTrack.h"
#include "TCanvas.h"
#include "TGraph.h"
#include "TGraphErrors.h"
#include "TQObject.h"
#include "AliRieman.h"
#include "AliExternalTrackParam.h"
#include <TEveTrackPropagator.h>
#include <TEveVSDStructs.h>
#include <TEveManager.h>
ClassImp(AliEveTrackFitter)
AliEveTrackFitter::AliEveTrackFitter(const Text_t* name, Int_t nPoints) :
TEvePointSet (name, nPoints),
fAlpha (0),
fRieman (0),
fConnected (kFALSE),
fSPMap (),
fTrackList (0),
fGraphPicked (0),
fGraphHelix (0)
{
SetMarkerColor(3);
SetOwnIds(kFALSE);
fTrackList = new TEveTrackList("Tracks");
fTrackList->IncDenyDestroy();
fTrackList->SetLineWidth(2);
fTrackList->SetLineColor(8);
fTrackList->GetPropagator()->SetEditPathMarks(kTRUE);
AddElement(fTrackList);
fGraphPicked = new TGraph();
fGraphPicked->SetName("Selected points");
fGraphPicked->SetMarkerColor(4);
fGraphPicked->SetMarkerStyle(4);
fGraphPicked->SetMarkerSize(2);
fGraphHelix = new TGraphErrors();
fGraphHelix->SetName("Fitted points");
fGraphHelix->SetMarkerColor(2);
}
AliEveTrackFitter::~AliEveTrackFitter()
{
if (fRieman) delete fRieman;
fTrackList->DecDenyDestroy();
}
void AliEveTrackFitter::DestroyElements()
{
TEveElement::DestroyElements();
gEve->AddElement(fTrackList, this);
fTrackList->DestroyElements();
}
void AliEveTrackFitter::Start()
{
Reset();
if (fConnected == kFALSE)
{
TQObject::Connect("TEvePointSet", "PointSelected(Int_t)",
"AliEveTrackFitter", this, "AddFitPoint(Int_t)");
fConnected = kTRUE;
}
}
void AliEveTrackFitter::Stop()
{
if (fConnected)
{
TQObject::Disconnect("TEvePointSet", "AddFitPoint(Int_t)");
fConnected = kFALSE;
}
}
void AliEveTrackFitter::Reset(Int_t nPoints, Int_t nIntIds)
{
if (fRieman) fRieman->Reset();
TEvePointSet::Reset(nPoints, nIntIds);
fSPMap.clear();
}
void AliEveTrackFitter::AddFitPoint(Int_t pointId)
{
Float_t x, y, z;
TEvePointSet* ps = static_cast<TEvePointSet*>((TQObject*) gTQSender);
PointMap_t::iterator g = fSPMap.find(Point_t(ps, pointId));
if (g != fSPMap.end())
{
Int_t idx = g->second;
if (idx != fLastPoint)
{
GetPoint(fLastPoint, x, y, z);
SetPoint(idx, x, y, z);
}
fSPMap.erase(g);
--fLastPoint;
}
else
{
fSPMap[Point_t(ps, pointId)] = Size();
ps->GetPoint(pointId, x, y, z);
SetNextPoint(x, y, z);
}
ResetBBox();
ElementChanged(kTRUE, kTRUE);
}
void AliEveTrackFitter::FitTrack()
{
using namespace TMath;
if (fRieman) delete fRieman;
fRieman = new AliRieman(Size());
Float_t x, y, z;
Int_t alphaIdx = 0;
GetPoint(alphaIdx, x, y, z);
Float_t minR2=x*x + y*y;
for (Int_t i=0; i<=fLastPoint; i++)
{
GetPoint(i, x, y, z);
Float_t cR2 = x*x + y*y;
if (minR2 > cR2)
{
minR2 = cR2;
alphaIdx = i;
}
}
GetPoint(alphaIdx, x, y, z);
fAlpha = ATan2(y, x);
Float_t sin = Sin(-fAlpha);
Float_t cos = Cos(-fAlpha);
for (Int_t i = 0; i <= fLastPoint; ++i)
{
GetPoint(i, x, y, z);
fRieman->AddPoint(cos*x - sin*y, cos*y + sin*x, z, 1, 1);
}
fRieman->Update();
Double_t r = Sqrt(minR2);
Double_t param[5];
Double_t cov[15];
fRieman->GetExternalParameters(r, param, cov);
param[4] /= TEveTrackPropagator::fgDefMagField*TEveTrackPropagator::fgkB2C;
if (param[4] < 0) param[3] = -param[3];
AliExternalTrackParam trackParam(r, fAlpha, param, cov);
trackParam.Print();
Double_t v0[3];
trackParam.GetXYZAt(r, TEveTrackPropagator::fgDefMagField, v0);
Double_t p0[3];
trackParam.GetPxPyPzAt(r, TEveTrackPropagator::fgDefMagField, p0);
TEveRecTrack rc;
rc.fV.Set(v0);
rc.fP.Set(p0);
rc.fSign = trackParam.Charge();
AliEveTrack* track = new AliEveTrack(&rc, fTrackList->GetPropagator());
track->SetName(Form("track %f", fAlpha));
track->MakeTrack();
track->SetAttLineAttMarker(fTrackList);
fTrackList->AddElement(track);
}
void AliEveTrackFitter::DrawDebugGraph()
{
static const TEveException kEH("AliEveTrackFitter::DrawRiemanGraph ");
if (fRieman == 0)
throw(kEH + "fitter not set.");
Int_t nR = fRieman->GetN();
fGraphPicked->Set(nR);
fGraphHelix->Set(nR);
Double_t* x = fRieman->GetX();
Double_t* y = fRieman->GetY();
Double_t* sy = fRieman->GetSy();
for (Int_t i=0; i<nR; i++)
{
fGraphPicked->SetPoint(i, x[i], y[i]);
fGraphHelix->SetPoint (i, x[i], fRieman->GetYat(x[i]));
fGraphHelix->SetPointError(i, 0.1, sy[i]);
}
if (gPad)
gPad->Clear();
fGraphPicked->Draw("AP");
fGraphHelix->Draw("SAME P");
gPad->GetCanvas()->SetTitle(Form("AliRieman alpha: %f", fAlpha));
gPad->Modified();
gPad->Update();
}
AliEveTrackFitter.cxx:100 AliEveTrackFitter.cxx:101 AliEveTrackFitter.cxx:102 AliEveTrackFitter.cxx:103 AliEveTrackFitter.cxx:104 AliEveTrackFitter.cxx:105 AliEveTrackFitter.cxx:106 AliEveTrackFitter.cxx:107 AliEveTrackFitter.cxx:108 AliEveTrackFitter.cxx:109 AliEveTrackFitter.cxx:110 AliEveTrackFitter.cxx:111 AliEveTrackFitter.cxx:112 AliEveTrackFitter.cxx:113 AliEveTrackFitter.cxx:114 AliEveTrackFitter.cxx:115 AliEveTrackFitter.cxx:116 AliEveTrackFitter.cxx:117 AliEveTrackFitter.cxx:118 AliEveTrackFitter.cxx:119 AliEveTrackFitter.cxx:120 AliEveTrackFitter.cxx:121 AliEveTrackFitter.cxx:122 AliEveTrackFitter.cxx:123 AliEveTrackFitter.cxx:124 AliEveTrackFitter.cxx:125 AliEveTrackFitter.cxx:126 AliEveTrackFitter.cxx:127 AliEveTrackFitter.cxx:128 AliEveTrackFitter.cxx:129 AliEveTrackFitter.cxx:130 AliEveTrackFitter.cxx:131 AliEveTrackFitter.cxx:132 AliEveTrackFitter.cxx:133 AliEveTrackFitter.cxx:134 AliEveTrackFitter.cxx:135 AliEveTrackFitter.cxx:136 AliEveTrackFitter.cxx:137 AliEveTrackFitter.cxx:138 AliEveTrackFitter.cxx:139 AliEveTrackFitter.cxx:140 AliEveTrackFitter.cxx:141 AliEveTrackFitter.cxx:142 AliEveTrackFitter.cxx:143 AliEveTrackFitter.cxx:144 AliEveTrackFitter.cxx:145 AliEveTrackFitter.cxx:146 AliEveTrackFitter.cxx:147 AliEveTrackFitter.cxx:148 AliEveTrackFitter.cxx:149 AliEveTrackFitter.cxx:150 AliEveTrackFitter.cxx:151 AliEveTrackFitter.cxx:152 AliEveTrackFitter.cxx:153 AliEveTrackFitter.cxx:154 AliEveTrackFitter.cxx:155 AliEveTrackFitter.cxx:156 AliEveTrackFitter.cxx:157 AliEveTrackFitter.cxx:158 AliEveTrackFitter.cxx:159 AliEveTrackFitter.cxx:160 AliEveTrackFitter.cxx:161 AliEveTrackFitter.cxx:162 AliEveTrackFitter.cxx:163 AliEveTrackFitter.cxx:164 AliEveTrackFitter.cxx:165 AliEveTrackFitter.cxx:166 AliEveTrackFitter.cxx:167 AliEveTrackFitter.cxx:168 AliEveTrackFitter.cxx:169 AliEveTrackFitter.cxx:170 AliEveTrackFitter.cxx:171 AliEveTrackFitter.cxx:172 AliEveTrackFitter.cxx:173 AliEveTrackFitter.cxx:174 AliEveTrackFitter.cxx:175 AliEveTrackFitter.cxx:176 AliEveTrackFitter.cxx:177 AliEveTrackFitter.cxx:178 AliEveTrackFitter.cxx:179 AliEveTrackFitter.cxx:180 AliEveTrackFitter.cxx:181 AliEveTrackFitter.cxx:182 AliEveTrackFitter.cxx:183 AliEveTrackFitter.cxx:184 AliEveTrackFitter.cxx:185 AliEveTrackFitter.cxx:186 AliEveTrackFitter.cxx:187 AliEveTrackFitter.cxx:188 AliEveTrackFitter.cxx:189 AliEveTrackFitter.cxx:190 AliEveTrackFitter.cxx:191 AliEveTrackFitter.cxx:192 AliEveTrackFitter.cxx:193 AliEveTrackFitter.cxx:194 AliEveTrackFitter.cxx:195 AliEveTrackFitter.cxx:196 AliEveTrackFitter.cxx:197 AliEveTrackFitter.cxx:198 AliEveTrackFitter.cxx:199 AliEveTrackFitter.cxx:200 AliEveTrackFitter.cxx:201 AliEveTrackFitter.cxx:202 AliEveTrackFitter.cxx:203 AliEveTrackFitter.cxx:204 AliEveTrackFitter.cxx:205 AliEveTrackFitter.cxx:206 AliEveTrackFitter.cxx:207 AliEveTrackFitter.cxx:208 AliEveTrackFitter.cxx:209 AliEveTrackFitter.cxx:210 AliEveTrackFitter.cxx:211 AliEveTrackFitter.cxx:212 AliEveTrackFitter.cxx:213 AliEveTrackFitter.cxx:214 AliEveTrackFitter.cxx:215 AliEveTrackFitter.cxx:216 AliEveTrackFitter.cxx:217 AliEveTrackFitter.cxx:218 AliEveTrackFitter.cxx:219 AliEveTrackFitter.cxx:220 AliEveTrackFitter.cxx:221 AliEveTrackFitter.cxx:222 AliEveTrackFitter.cxx:223 AliEveTrackFitter.cxx:224 AliEveTrackFitter.cxx:225 AliEveTrackFitter.cxx:226 AliEveTrackFitter.cxx:227 AliEveTrackFitter.cxx:228 AliEveTrackFitter.cxx:229 AliEveTrackFitter.cxx:230 AliEveTrackFitter.cxx:231 AliEveTrackFitter.cxx:232 AliEveTrackFitter.cxx:233 AliEveTrackFitter.cxx:234 AliEveTrackFitter.cxx:235 AliEveTrackFitter.cxx:236 AliEveTrackFitter.cxx:237 AliEveTrackFitter.cxx:238 AliEveTrackFitter.cxx:239 AliEveTrackFitter.cxx:240 AliEveTrackFitter.cxx:241 AliEveTrackFitter.cxx:242 AliEveTrackFitter.cxx:243 AliEveTrackFitter.cxx:244 AliEveTrackFitter.cxx:245 AliEveTrackFitter.cxx:246 AliEveTrackFitter.cxx:247 AliEveTrackFitter.cxx:248 AliEveTrackFitter.cxx:249 AliEveTrackFitter.cxx:250 AliEveTrackFitter.cxx:251 AliEveTrackFitter.cxx:252 AliEveTrackFitter.cxx:253 AliEveTrackFitter.cxx:254 AliEveTrackFitter.cxx:255 AliEveTrackFitter.cxx:256 AliEveTrackFitter.cxx:257 AliEveTrackFitter.cxx:258 AliEveTrackFitter.cxx:259 AliEveTrackFitter.cxx:260 AliEveTrackFitter.cxx:261 AliEveTrackFitter.cxx:262 AliEveTrackFitter.cxx:263 AliEveTrackFitter.cxx:264 AliEveTrackFitter.cxx:265 AliEveTrackFitter.cxx:266 AliEveTrackFitter.cxx:267 AliEveTrackFitter.cxx:268 AliEveTrackFitter.cxx:269