ROOT logo
// $Id$
// Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/**************************************************************************
 * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
 * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
 * full copyright notice.                                                 *
 **************************************************************************/

#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>


//==============================================================================
//==============================================================================
// AliEveTrackFitter
//==============================================================================

//______________________________________________________________________________
//
// AliEveTrackFitter is an interface to TEvePointSet allowing AliRieman fit.
// It builds a list of points by listening to selection signal of any
// object of type TEvePointSet. After selection the list is feeded to
// AliRieman fitter, which returns helix parameters visualized with
// AliEveTrack.
//

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)
{
  // Constructor.

  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()
{
  // Destructor.

  if (fRieman) delete fRieman;

  fTrackList->DecDenyDestroy();
}

/******************************************************************************/

void AliEveTrackFitter::DestroyElements()
{
  // Virtual method of base class TEveElement.
  // Preserves TEveTrackList object for fitted helices.

  TEveElement::DestroyElements();

  // fTrackList is destroyed because DenyDestroy is set.
  gEve->AddElement(fTrackList, this);
  fTrackList->DestroyElements();
}

/******************************************************************************/

void AliEveTrackFitter::Start()
{
  // Clear existing point selection and maintain connection to the
  // TEvePointSet signal.

  Reset();
  if (fConnected == kFALSE)
  {
    TQObject::Connect("TEvePointSet", "PointSelected(Int_t)",
		      "AliEveTrackFitter", this, "AddFitPoint(Int_t)");
    fConnected = kTRUE;
  }
}

void AliEveTrackFitter::Stop()
{
  // Stop adding points for the fit.

  if (fConnected)
  {
    TQObject::Disconnect("TEvePointSet", "AddFitPoint(Int_t)");
    fConnected = kFALSE;
  }
}

void AliEveTrackFitter::Reset(Int_t nPoints, Int_t nIntIds)
{
  // Reset selection.

  if (fRieman) fRieman->Reset();
  TEvePointSet::Reset(nPoints, nIntIds);
  fSPMap.clear();
}

/******************************************************************************/

void AliEveTrackFitter::AddFitPoint(Int_t pointId)
{
  // Add or remove given point depending if exists in the map.

  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()
{
  // Fit selected points with AliRieman fitter.

  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);
  // curvature to pt
  param[4] /= TEveTrackPropagator::fgDefMagField*TEveTrackPropagator::fgkB2C;
  // sign in tang
  if (param[4] < 0) param[3] = -param[3];
  AliExternalTrackParam trackParam(r, fAlpha, param, cov);
  trackParam.Print();

  // make track
  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()
{
  // Draw graph of picked points and helix points.

  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]); // now faked
  }

  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:1
 AliEveTrackFitter.cxx:2
 AliEveTrackFitter.cxx:3
 AliEveTrackFitter.cxx:4
 AliEveTrackFitter.cxx:5
 AliEveTrackFitter.cxx:6
 AliEveTrackFitter.cxx:7
 AliEveTrackFitter.cxx:8
 AliEveTrackFitter.cxx:9
 AliEveTrackFitter.cxx:10
 AliEveTrackFitter.cxx:11
 AliEveTrackFitter.cxx:12
 AliEveTrackFitter.cxx:13
 AliEveTrackFitter.cxx:14
 AliEveTrackFitter.cxx:15
 AliEveTrackFitter.cxx:16
 AliEveTrackFitter.cxx:17
 AliEveTrackFitter.cxx:18
 AliEveTrackFitter.cxx:19
 AliEveTrackFitter.cxx:20
 AliEveTrackFitter.cxx:21
 AliEveTrackFitter.cxx:22
 AliEveTrackFitter.cxx:23
 AliEveTrackFitter.cxx:24
 AliEveTrackFitter.cxx:25
 AliEveTrackFitter.cxx:26
 AliEveTrackFitter.cxx:27
 AliEveTrackFitter.cxx:28
 AliEveTrackFitter.cxx:29
 AliEveTrackFitter.cxx:30
 AliEveTrackFitter.cxx:31
 AliEveTrackFitter.cxx:32
 AliEveTrackFitter.cxx:33
 AliEveTrackFitter.cxx:34
 AliEveTrackFitter.cxx:35
 AliEveTrackFitter.cxx:36
 AliEveTrackFitter.cxx:37
 AliEveTrackFitter.cxx:38
 AliEveTrackFitter.cxx:39
 AliEveTrackFitter.cxx:40
 AliEveTrackFitter.cxx:41
 AliEveTrackFitter.cxx:42
 AliEveTrackFitter.cxx:43
 AliEveTrackFitter.cxx:44
 AliEveTrackFitter.cxx:45
 AliEveTrackFitter.cxx:46
 AliEveTrackFitter.cxx:47
 AliEveTrackFitter.cxx:48
 AliEveTrackFitter.cxx:49
 AliEveTrackFitter.cxx:50
 AliEveTrackFitter.cxx:51
 AliEveTrackFitter.cxx:52
 AliEveTrackFitter.cxx:53
 AliEveTrackFitter.cxx:54
 AliEveTrackFitter.cxx:55
 AliEveTrackFitter.cxx:56
 AliEveTrackFitter.cxx:57
 AliEveTrackFitter.cxx:58
 AliEveTrackFitter.cxx:59
 AliEveTrackFitter.cxx:60
 AliEveTrackFitter.cxx:61
 AliEveTrackFitter.cxx:62
 AliEveTrackFitter.cxx:63
 AliEveTrackFitter.cxx:64
 AliEveTrackFitter.cxx:65
 AliEveTrackFitter.cxx:66
 AliEveTrackFitter.cxx:67
 AliEveTrackFitter.cxx:68
 AliEveTrackFitter.cxx:69
 AliEveTrackFitter.cxx:70
 AliEveTrackFitter.cxx:71
 AliEveTrackFitter.cxx:72
 AliEveTrackFitter.cxx:73
 AliEveTrackFitter.cxx:74
 AliEveTrackFitter.cxx:75
 AliEveTrackFitter.cxx:76
 AliEveTrackFitter.cxx:77
 AliEveTrackFitter.cxx:78
 AliEveTrackFitter.cxx:79
 AliEveTrackFitter.cxx:80
 AliEveTrackFitter.cxx:81
 AliEveTrackFitter.cxx:82
 AliEveTrackFitter.cxx:83
 AliEveTrackFitter.cxx:84
 AliEveTrackFitter.cxx:85
 AliEveTrackFitter.cxx:86
 AliEveTrackFitter.cxx:87
 AliEveTrackFitter.cxx:88
 AliEveTrackFitter.cxx:89
 AliEveTrackFitter.cxx:90
 AliEveTrackFitter.cxx:91
 AliEveTrackFitter.cxx:92
 AliEveTrackFitter.cxx:93
 AliEveTrackFitter.cxx:94
 AliEveTrackFitter.cxx:95
 AliEveTrackFitter.cxx:96
 AliEveTrackFitter.cxx:97
 AliEveTrackFitter.cxx:98
 AliEveTrackFitter.cxx:99
 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