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.                                                 *
 **************************************************************************/

#ifndef ALIEVE_CosmicRayFitter_H
#define ALIEVE_CosmicRayFitter_H

#include <TEvePointSet.h>
#include <map>

class TEveTrackList;

class TGraphErrors;
class TGraph;
class TGraph2DErrors;
class TGraph2D;
class TLinearFitter;


class AliEveCosmicRayFitter : public TEvePointSet
{
public:
  AliEveCosmicRayFitter(const Text_t* name = "CosmicRayFitter", Int_t n_points=0);
  virtual ~AliEveCosmicRayFitter();

  void AddFitPoint(Int_t); // slot for PointSelected() signal

  virtual void       Start();
  virtual void       Stop();
  virtual void       FitTrack();
  virtual void       Reset(Int_t n_points=0, Int_t n_int_ids=0);

  Bool_t             GetConnected() { return fConnected; }

  void               DrawDebugGraph();

  virtual void    DestroyElements(); // *MENU*
  static Double_t Distance3D(Double_t x, Double_t y, Double_t z, Double_t *p);
  static void     SumDistance3D(Int_t &, Double_t *, Double_t & sum, Double_t * par, Int_t );

private:
  AliEveCosmicRayFitter(const AliEveCosmicRayFitter&);            // Not implemented
  AliEveCosmicRayFitter& operator=(const AliEveCosmicRayFitter&); // Not implemented

protected:
  struct Point_t
  {
    // inner structure to check duplicates
    TEvePointSet   *fPS;   // selected pointset
    Int_t           fIdx;  // location in the point set array

    Point_t(TEvePointSet* ps=0, Int_t i=0): fPS(ps), fIdx(i){}
    Point_t(const Point_t& p) : fPS(p.fPS), fIdx(p.fIdx)  {}

    Point_t& operator=(const Point_t& p) {
      fPS = p.fPS; fIdx = p.fIdx; return *this;
    }

    bool operator<(const Point_t& o) const {
      if (fPS != o.fPS) return fPS < o.fPS;
      return fIdx < o.fIdx;
    }
  };

  typedef std::map<Point_t, Int_t>          PointMap_t; // Map of registered points.

  TLinearFitter*  fLineFitter1;  // 2D straight line fitter
  TLinearFitter*  fLineFitter2;  // 2D straight line fitter

  Bool_t          fConnected;    // object connected to pointset Ctrl-shift signal

  PointMap_t fSPMap;             // map of selected points from different PointSet

  TEveTrackList*   fTrackList; // list of tracks removed in the destructor

  TGraph         *fGraphPicked1; // graph of selected points debug info
  TGraphErrors   *fGraphLinear1; // graph of fitted points for debug info
  TGraph         *fGraphPicked2; // graph of selected points debug info
  TGraphErrors   *fGraphLinear2; // graph of fitted points for debug info

  ClassDef(AliEveCosmicRayFitter, 0); // Interface to TEvePointSet allowing 3D straight linear fit.
};

#endif
 AliEveCosmicRayFitter.h:1
 AliEveCosmicRayFitter.h:2
 AliEveCosmicRayFitter.h:3
 AliEveCosmicRayFitter.h:4
 AliEveCosmicRayFitter.h:5
 AliEveCosmicRayFitter.h:6
 AliEveCosmicRayFitter.h:7
 AliEveCosmicRayFitter.h:8
 AliEveCosmicRayFitter.h:9
 AliEveCosmicRayFitter.h:10
 AliEveCosmicRayFitter.h:11
 AliEveCosmicRayFitter.h:12
 AliEveCosmicRayFitter.h:13
 AliEveCosmicRayFitter.h:14
 AliEveCosmicRayFitter.h:15
 AliEveCosmicRayFitter.h:16
 AliEveCosmicRayFitter.h:17
 AliEveCosmicRayFitter.h:18
 AliEveCosmicRayFitter.h:19
 AliEveCosmicRayFitter.h:20
 AliEveCosmicRayFitter.h:21
 AliEveCosmicRayFitter.h:22
 AliEveCosmicRayFitter.h:23
 AliEveCosmicRayFitter.h:24
 AliEveCosmicRayFitter.h:25
 AliEveCosmicRayFitter.h:26
 AliEveCosmicRayFitter.h:27
 AliEveCosmicRayFitter.h:28
 AliEveCosmicRayFitter.h:29
 AliEveCosmicRayFitter.h:30
 AliEveCosmicRayFitter.h:31
 AliEveCosmicRayFitter.h:32
 AliEveCosmicRayFitter.h:33
 AliEveCosmicRayFitter.h:34
 AliEveCosmicRayFitter.h:35
 AliEveCosmicRayFitter.h:36
 AliEveCosmicRayFitter.h:37
 AliEveCosmicRayFitter.h:38
 AliEveCosmicRayFitter.h:39
 AliEveCosmicRayFitter.h:40
 AliEveCosmicRayFitter.h:41
 AliEveCosmicRayFitter.h:42
 AliEveCosmicRayFitter.h:43
 AliEveCosmicRayFitter.h:44
 AliEveCosmicRayFitter.h:45
 AliEveCosmicRayFitter.h:46
 AliEveCosmicRayFitter.h:47
 AliEveCosmicRayFitter.h:48
 AliEveCosmicRayFitter.h:49
 AliEveCosmicRayFitter.h:50
 AliEveCosmicRayFitter.h:51
 AliEveCosmicRayFitter.h:52
 AliEveCosmicRayFitter.h:53
 AliEveCosmicRayFitter.h:54
 AliEveCosmicRayFitter.h:55
 AliEveCosmicRayFitter.h:56
 AliEveCosmicRayFitter.h:57
 AliEveCosmicRayFitter.h:58
 AliEveCosmicRayFitter.h:59
 AliEveCosmicRayFitter.h:60
 AliEveCosmicRayFitter.h:61
 AliEveCosmicRayFitter.h:62
 AliEveCosmicRayFitter.h:63
 AliEveCosmicRayFitter.h:64
 AliEveCosmicRayFitter.h:65
 AliEveCosmicRayFitter.h:66
 AliEveCosmicRayFitter.h:67
 AliEveCosmicRayFitter.h:68
 AliEveCosmicRayFitter.h:69
 AliEveCosmicRayFitter.h:70
 AliEveCosmicRayFitter.h:71
 AliEveCosmicRayFitter.h:72
 AliEveCosmicRayFitter.h:73
 AliEveCosmicRayFitter.h:74
 AliEveCosmicRayFitter.h:75
 AliEveCosmicRayFitter.h:76
 AliEveCosmicRayFitter.h:77
 AliEveCosmicRayFitter.h:78
 AliEveCosmicRayFitter.h:79
 AliEveCosmicRayFitter.h:80
 AliEveCosmicRayFitter.h:81
 AliEveCosmicRayFitter.h:82
 AliEveCosmicRayFitter.h:83
 AliEveCosmicRayFitter.h:84
 AliEveCosmicRayFitter.h:85
 AliEveCosmicRayFitter.h:86
 AliEveCosmicRayFitter.h:87
 AliEveCosmicRayFitter.h:88
 AliEveCosmicRayFitter.h:89