From: alja Date: Thu, 13 Mar 2008 17:11:09 +0000 (+0000) Subject: New line fitter class from Annalisa. Code in development. X-Git-Url: http://git.uio.no/git/?a=commitdiff_plain;h=e7aa1ed847ae88aec78be94505e2d13680f3818d;p=u%2Fmrichter%2FAliRoot.git New line fitter class from Annalisa. Code in development. --- diff --git a/EVE/EveBase/AliEveCosmicRayFitter.cxx b/EVE/EveBase/AliEveCosmicRayFitter.cxx new file mode 100644 index 00000000000..b22de44d04f --- /dev/null +++ b/EVE/EveBase/AliEveCosmicRayFitter.cxx @@ -0,0 +1,451 @@ +// $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 "Riostream.h" + +#include "AliEveCosmicRayFitter.h" + +#include "TCanvas.h" +#include "TPad.h" +#include "TGraph.h" +#include "TGraphErrors.h" +#include "TGraph2D.h" +#include "TGraph2DErrors.h" + +#include "TVirtualFitter.h" + +#include "TEveLine.h" + +#include "AliLog.h" + +#include +#include + +//______________________________________________________________________ +// AliEveCosmicRayFitter +// +// Same schema used in AliEveTrackFitter class. +// +// AliEveCosmicRayFitter is a TEvePointSet interface to allow +// straight line fit. It creates a set of points by listening to +// selection signal of any TEvePointSet object. After selection, the +// list is feeded to TVirtualFitter class, which returns straight +// line parameters. The fit result is visualized with a TEveLine +// object. +// +// Thanks to L. Moneta for the algorithm prepared to make a 3D +// straight line fit. +// +// Author: A. De Caro +// + +Double_t Distance3D(Double_t x, Double_t y, Double_t z, Double_t *p); +void SumDistance3D(Int_t &, Double_t *, Double_t & sum, Double_t * par, Int_t ); + +ClassImp(AliEveCosmicRayFitter) + +AliEveCosmicRayFitter::AliEveCosmicRayFitter(const Text_t* name, Int_t n_points) : + TEvePointSet (name, n_points), + + fLine3DFitter (0), + + fConnected (kFALSE), + fSPMap (), + + fGraphPicked1 (0), + fGraphLinear1 (0), + fGraphPicked2 (0), + fGraphLinear2 (0), + fGraphPicked3 (), + fGraphLinear3 () + +{ + // Constructor. + + fLine3DFitter = TVirtualFitter::Fitter(0, 4); + + SetMarkerColor(3); + SetOwnIds(kFALSE); + + fGraphPicked1 = new TGraph("Y vs X"); + fGraphPicked1->SetName("Selected points"); + fGraphPicked1->SetMarkerColor(4); + fGraphPicked1->SetMarkerStyle(4); + fGraphPicked1->SetMarkerSize(2); + + fGraphLinear1 = new TGraphErrors(); + fGraphLinear1->SetName("Fitted points"); + fGraphLinear1->SetMarkerColor(2); + + fGraphPicked2 = new TGraph("Z vs X"); + fGraphPicked2->SetName("Selected points"); + fGraphPicked2->SetMarkerColor(4); + fGraphPicked2->SetMarkerStyle(4); + fGraphPicked2->SetMarkerSize(2); + + fGraphLinear2 = new TGraphErrors(); + fGraphLinear2->SetName("Fitted points"); + fGraphLinear2->SetMarkerColor(2); + + fGraphPicked3 = new TGraph2D("Z vs Y vs X"); + fGraphPicked3->SetName("Selected points"); + fGraphPicked3->SetMarkerColor(4); + fGraphPicked3->SetMarkerStyle(4); + fGraphPicked3->SetMarkerSize(2); + + fGraphLinear3 = new TGraph2DErrors(); + fGraphLinear3->SetName("Fitted points"); + fGraphLinear3->SetMarkerColor(2); + +} + +AliEveCosmicRayFitter::~AliEveCosmicRayFitter() +{ + // Destructor. + + if(fLine3DFitter) delete fLine3DFitter; + +} + +/**************************************************************************/ +void AliEveCosmicRayFitter::Start() +{ + // Clear existing point selection and maintain connection to the + // TEvePointSet signal. + + Reset(); + if(fConnected == kFALSE) + { + TQObject::Connect("TEvePointSet", "PointSelected(Int_t)", + "AliEveCosmicRayFitter", this, "AddFitPoint(Int_t)"); + fConnected = kTRUE; + } +} + +/**************************************************************************/ +void AliEveCosmicRayFitter::Stop() +{ + // Stop selection of points. + + if(fConnected) + { + TQObject::Disconnect("TEvePointSet", "AddFitPoint(Int_t)"); + fConnected = kFALSE; + } +} + +/**************************************************************************/ + +void AliEveCosmicRayFitter::Reset(Int_t n, Int_t ids) +{ + // Reset selection. + + if(fLine3DFitter) fLine3DFitter->Clear(); + TEvePointSet::Reset(n, ids); + fSPMap.clear(); +} + +/**************************************************************************/ + +void AliEveCosmicRayFitter::AddFitPoint(Int_t n) +{ + // Add/remove given point depending if exists in the fSPMap. + + Float_t x, y, z; + TEvePointSet* ps = dynamic_cast((TQObject*) gTQSender); + + + std::map::iterator g = fSPMap.find(Point_t(ps, n)); + 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, n)] = Size(); + ps->GetPoint(n, x, y, z); + SetNextPoint(x, y, z); + // SetPointId(ps->GetPointId(n)); + } + ResetBBox(); + ElementChanged(kTRUE, kTRUE); +} + +/**************************************************************************/ + +void AliEveCosmicRayFitter::FitTrack() +{ + // Fit selected points with TLinearFitter fitter. + + using namespace TMath; + + if(fLine3DFitter) delete fLine3DFitter; + fLine3DFitter = TVirtualFitter::Fitter(0, 4); + + AliDebug(2, Form(" Selected point number %3i %3i", fLastPoint+1, Size())); + + Double_t *posXpoint = new Double_t[fLastPoint+1]; + Double_t *posYpoint = new Double_t[fLastPoint+1]; + Double_t *posZpoint = new Double_t[fLastPoint+1]; + + //Double_t *errXpoint = new Double_t[fLastPoint+1]; + //Double_t *errYpoint = new Double_t[fLastPoint+1]; + //Double_t *errZpoint = new Double_t[fLastPoint+1]; + + Double_t x, y, z; + + for (Int_t i=0; i<=fLastPoint; i++) { + x=0., y=0., z=0.; + GetPoint(i, x, y, z); + posXpoint[i] = x; + posYpoint[i] = y; + posZpoint[i] = z; + //errXpoint[i] = 0.001*posXpoint[i]; + //errYpoint[i] = 0.05*posYpoint[i]; + //errZpoint[i] = 0.05*posZpoint[i]; + + fGraphPicked3->SetPoint(i,x,y,z); + //fGraphPicked3->SetPointError(i,errXpoint[i],errYpoint[i],errZpoint[i]); + + AliDebug(2, Form(" %f %f %f", + posXpoint[i], posYpoint[i], posZpoint[i])); + } + + fLine3DFitter->SetObjectFit(fGraphPicked3); + fLine3DFitter->SetFCN(SumDistance3D); + Double_t arglist[10]; + arglist[0] = 3; + fLine3DFitter->ExecuteCommand("SET PRINT",arglist,1); + + Double_t pStart[4] = {1,1,1,1}; + fLine3DFitter->SetParameter(0,"y0",pStart[0],0.01,0,0); + fLine3DFitter->SetParameter(1,"Ay",pStart[1],0.01,0,0); + fLine3DFitter->SetParameter(2,"z0",pStart[2],0.01,0,0); + fLine3DFitter->SetParameter(3,"Az",pStart[3],0.01,0,0); + + arglist[0] = 1000; // number of function calls + arglist[1] = 0.001; // tolerance + fLine3DFitter->ExecuteCommand("MIGRAD",arglist,2); + + //if (minos) fLine3DFitter->ExecuteCommand("MINOS",arglist,0); + Int_t nvpar,nparx; + Double_t amin,edm, errdef; + fLine3DFitter->GetStats(amin,edm,errdef,nvpar,nparx); + fLine3DFitter->PrintResults(1,amin); + + TEveLine* line3D = new TEveLine(); + line3D->SetLineColor(2); + line3D->SetLineWidth(2); + line3D->SetLineStyle(2); + + Double_t parFit3D[4]; + for (int i = 0; i <4; ++i) + parFit3D[i] = fLine3DFitter->GetParameter(i); + Float_t xCoor = 16000.; + Float_t yCoorP = parFit3D[0] + xCoor*parFit3D[1]; + Float_t zCoorP = parFit3D[2] + xCoor*parFit3D[3]; + Float_t yCoorM = parFit3D[0] - xCoor*parFit3D[1]; + Float_t zCoorM = parFit3D[2] - xCoor*parFit3D[3]; + + line3D->SetNextPoint( xCoor, yCoorP, zCoorP); + line3D->SetNextPoint(-xCoor, yCoorM, zCoorM); + + gEve->AddElement(line3D); + + delete posXpoint; + delete posYpoint; + delete posZpoint; + //delete errXpoint; + //delete errYpoint; + //delete errZpoint; + +} + +/**************************************************************************/ +void AliEveCosmicRayFitter::DestroyElements() +{ + // Virtual method of base class Reve::RenderElement. + // It preserves track list to have coomon track propagator attributes. + + TEveElement::DestroyElements(); + UpdateItems(); +} + +/**************************************************************************/ +void AliEveCosmicRayFitter::DrawDebugGraph() +{ + // + // Draw graph of Line fit. + // + + static const TEveException eH("CosmicRayFitter::DrawDebugGraph "); + + if(fLine3DFitter == 0) + throw(eH + "fitter not set."); + + AliDebug(2,Form(" %3i %3i\n", fLastPoint+1, Size())); + + Int_t nR = fLastPoint+1; + fGraphPicked1->Set(nR); + fGraphLinear1->Set(nR); + fGraphPicked2->Set(nR); + fGraphLinear2->Set(nR); + fGraphLinear3->Set(nR); + + Double_t *x = new Double_t[nR]; + Double_t *y = new Double_t[nR]; + Double_t *z = new Double_t[nR]; + Float_t xx=0., yy=0., zz=0.; + for (Int_t i=0; iGetParameter(i); + + Double_t yCoor = 0.; + Double_t zCoor = 0.; + for (Int_t i=0; iSetPoint(i, x[i], y[i]); + fGraphLinear1->SetPoint(i, x[i], yCoor); + //fGraphLinear1->SetPointError(i, TMath::Abs(x[i])*0.001, TMath::Abs(yCoor)*0.05); + fGraphPicked2->SetPoint(i, x[i], z[i]); + fGraphLinear2->SetPoint(i, x[i], zCoor); + //fGraphLinear2->SetPointError(i, TMath::Abs(x[i])*0.001, TMath::Abs(zCoor)*0.05); + + fGraphLinear3->SetPoint(i, x[i], yCoor, zCoor); + //fGraphLinear3->SetPointError(i, TMath::Abs(x[i])*0.001, TMath::Abs(yCoor)*0.05, TMath::Abs(zCoor)*0.05); + } + + TCanvas * canvas; + if (gPad) gPad->Clear(); + else if (gPad==0 || gPad->GetCanvas()->IsEditable() == kFALSE) { + canvas = new TCanvas("canvas", "CosmicRayFitter", 800, 800); + canvas->Clear(); + } + canvas->SetHighLightColor(2); + canvas->Range(0,0,1,1); + canvas->SetFillColor(0); + canvas->SetBorderMode(0); + canvas->SetBorderSize(2); + + canvas->Divide(1,2); + + TPad *canvas_1 = new TPad("canvas_1", "canvas_1",0.01,0.01,0.49,0.49); + canvas_1->Draw(); + canvas_1->cd(); + canvas_1->SetFillColor(0); + canvas_1->SetBorderSize(2); + canvas_1->SetFrameBorderMode(0); + fGraphPicked1->Draw("AP"); + fGraphLinear1->Draw("SAME P"); + + canvas_1->Modified(); + canvas->cd(); + + TPad *canvas_2 = new TPad("canvas_2", "canvas_2",0.51,0.01,0.99,0.49); + canvas_2->Draw(); + canvas_2->cd(); + canvas_2->SetFillColor(0); + canvas_2->SetBorderSize(2); + canvas_2->SetFrameBorderMode(0); + fGraphPicked2->Draw("AP"); + fGraphLinear2->Draw("SAME P"); + + canvas_2->Modified(); + canvas->cd(); + + TPad *canvas_3 = new TPad("canvas_2", "canvas_2",0.01,0.51,0.99,0.99); + canvas_3->Draw(); + canvas_3->cd(); + canvas_3->SetFillColor(0); + canvas_3->SetBorderSize(2); + canvas_3->SetFrameBorderMode(0); + fGraphPicked3->Draw("AP"); + fGraphLinear3->Draw("SAME P"); + + canvas_3->Modified(); + canvas->cd(); + + canvas->Modified(); + canvas->cd(); + + delete x; + delete y; + delete z; + +} + +/**************************************************************************/ +void SumDistance3D(Int_t &, Double_t *, Double_t & sum, Double_t * par, Int_t ) +{ + // + // Square sum of distances + // + + TGraph2D * gr = + dynamic_cast((TVirtualFitter::GetFitter())->GetObjectFit() ); + assert(gr != 0); + + Double_t * x = gr->GetX(); + Double_t * y = gr->GetY(); + Double_t * z = gr->GetZ(); + Int_t npoints = gr->GetN(); + sum = 0; + Double_t d = 0; + for (Int_t i = 0; i < npoints; ++i) { + d = Distance3D(x[i],y[i],z[i],par); + sum += d; +#ifdef DEBUG + std::cout << " point " << i << "\t" + << x[i] << "\t" + << y[i] << "\t" + << z[i] << "\t" + << std::sqrt(d) << std::endl; + std::cout << " Total sum2 = " << sum << std::endl; +#endif + + } + +} + +/**************************************************************************/ +Double_t Distance3D(Double_t x, Double_t y, Double_t z, Double_t *p) +{ + // + // distance line point is D = | (xp-x0) cross ux | + // where ux is direction of line and x0 is a point in the line (like t = 0) + // + + using namespace ROOT::Math; + + XYZVector xp(x,y,z); + XYZVector x0(0., p[0], p[2]); + XYZVector x1(1., p[0] + p[1], p[2] + p[3]); + XYZVector u = (x1-x0).Unit(); + Double_t d2 = ((xp-x0).Cross(u)) .Mag2(); + return d2; +} + +/**************************************************************************/ diff --git a/EVE/EveBase/AliEveCosmicRayFitter.h b/EVE/EveBase/AliEveCosmicRayFitter.h new file mode 100644 index 00000000000..cd6759d8db8 --- /dev/null +++ b/EVE/EveBase/AliEveCosmicRayFitter.h @@ -0,0 +1,92 @@ +// $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 +#include + +class TGraphErrors; +class TGraph; +class TGraph2DErrors; +class TGraph2D; +class TLinearFitter; +class TVirtualFitter; + +class AliEveCosmicRayFitter : public TEvePointSet +{ +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 PointMap_t; + + TVirtualFitter* fLine3DFitter; // 3D straight line fitter + + Bool_t fConnected; // object connected to pointset Ctrl-shift signal + + PointMap_t fSPMap; // map of selected points from different PointSet + + 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 + TGraph2D *fGraphPicked3; // graph of selected points debug info + TGraph2DErrors *fGraphLinear3; // graph of fitted points for debug info + +public: + AliEveCosmicRayFitter(const Text_t* name = "CosmicRayFitter", Int_t n_points=0); + virtual ~AliEveCosmicRayFitter(); + + void AddFitPoint(Int_t); // slot for PointCtrlClicked() 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; } + TVirtualFitter* GetLine3DFitter(){ return fLine3DFitter; } + + TGraph* GetGraphSelected1() { return fGraphPicked1; } + TGraph* GetGraphSelected2() { return fGraphPicked2; } + TGraph2D* GetGraphSelected3() { return fGraphPicked3; } + TGraphErrors* GetGraphFitted1() { return fGraphLinear1; } + TGraphErrors* GetGraphFitted2() { return fGraphLinear2; } + TGraph2DErrors* GetGraphFitted3() { return fGraphLinear3; } + void DrawDebugGraph(); + + virtual void DestroyElements(); // *MENU* + + ClassDef(AliEveCosmicRayFitter, 0); // Interface to TEvePointSet allowing 3D straight linear fit. +}; // endclass AliEveCosmicRayFitter + +#endif diff --git a/EVE/EveBase/AliEveCosmicRayFitterEditor.cxx b/EVE/EveBase/AliEveCosmicRayFitterEditor.cxx new file mode 100644 index 00000000000..770d2d0673a --- /dev/null +++ b/EVE/EveBase/AliEveCosmicRayFitterEditor.cxx @@ -0,0 +1,125 @@ +// $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 "AliEveCosmicRayFitterEditor.h" +#include "AliEveCosmicRayFitter.h" + +#include + + +//_____________________________________________________________________________ +// AliEveCosmicRayFitterEditor +// + +ClassImp(AliEveCosmicRayFitterEditor) + +AliEveCosmicRayFitterEditor::AliEveCosmicRayFitterEditor(const TGWindow *p, Int_t width, Int_t height, + UInt_t options, Pixel_t back) : + TGedFrame(p, width, height, options | kVerticalFrame, back), + fM(0), + fFit(0), + fReset(0), + fStart(0), + fStop(0), + fGraph(0) +{ + // Constructor. + + MakeTitle("AliEveCosmicRayFitter"); + + fStart = new TGTextButton(this, "Start"); + AddFrame(fStart, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 4, 1, 3, 1)); + fStart->Connect("Clicked()", + "AliEveCosmicRayFitterEditor", this, "DoStart()"); + + fFit = new TGTextButton(this, "Fit"); + AddFrame(fFit, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 4, 1, 1, 1)); + fFit->Connect("Clicked()", + "AliEveCosmicRayFitterEditor", this, "DoFit()"); + + fReset = new TGTextButton(this, "Reset"); + AddFrame(fReset, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 4, 1, 1, 1)); + fReset->Connect("Clicked()", + "AliEveCosmicRayFitterEditor", this, "DoReset()"); + + fStop = new TGTextButton(this, "Stop"); + AddFrame(fStop, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 4, 1, 1, 4)); + fStop->Connect("Clicked()", + "AliEveCosmicRayFitterEditor", this, "DoStop()"); + + fGraph = new TGTextButton(this, "DebugGraph"); + AddFrame(fGraph, new TGLayoutHints(kLHintsLeft | kLHintsExpandX, 4, 2, 4, 1)); + fGraph->Connect("Clicked()", + "AliEveCosmicRayFitterEditor", this, "DoGraph()"); + } + +/******************************************************************************/ + +void AliEveCosmicRayFitterEditor::SetModel(TObject* obj) +{ + // Set model object. + + fM = dynamic_cast(obj); + + if(fM->GetConnected()) + { + fStart->SetState(kButtonDisabled); + fStop->SetState(kButtonUp); + } + else + { + fStop->SetState(kButtonDisabled); + fStart->SetState(kButtonEngaged); + fStart->SetState(kButtonUp); + } +} + +/**************************************************************************/ + +void AliEveCosmicRayFitterEditor::DoFit() +{ + // Fit slot. + + fM->FitTrack(); + Update(); +} + +void AliEveCosmicRayFitterEditor::DoReset() +{ + // Reset slot. + + fM->Reset(); + Update(); +} + +void AliEveCosmicRayFitterEditor::DoStart() +{ + // Start selection slot. + + fM->Start(); + fStart->SetState(kButtonDisabled); + fStop->SetState(kButtonUp); +} + +void AliEveCosmicRayFitterEditor::DoStop() +{ + // Stop selection slot. + + fM->Stop(); + fStop->SetState(kButtonDisabled); + fStart->SetState(kButtonUp); +} + +void AliEveCosmicRayFitterEditor::DoGraph() +{ + // Draw graph slot. + + fM->DrawDebugGraph(); + Update(); +} diff --git a/EVE/EveBase/AliEveCosmicRayFitterEditor.h b/EVE/EveBase/AliEveCosmicRayFitterEditor.h new file mode 100644 index 00000000000..6d5884a0ef5 --- /dev/null +++ b/EVE/EveBase/AliEveCosmicRayFitterEditor.h @@ -0,0 +1,52 @@ +// $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_CosmicRayFitterEditor_H +#define ALIEVE_CosmicRayFitterEditor_H + +#include + +class TGCheckButton; +class TGNumberEntry; +class TGColorSelect; + + +class AliEveCosmicRayFitter; + +class AliEveCosmicRayFitterEditor : public TGedFrame +{ +private: + AliEveCosmicRayFitterEditor(const AliEveCosmicRayFitterEditor&); // Not implemented + AliEveCosmicRayFitterEditor& operator=(const AliEveCosmicRayFitterEditor&); // Not implemented + +protected: + AliEveCosmicRayFitter* fM; // fModel dynamic-casted to AliEveCosmicRayFitterEditor + + TGTextButton* fFit; // button to fit selection + TGTextButton* fReset; // button to reset selection + TGTextButton* fStart; // button to connect to signal + TGTextButton* fStop; // button to disconnect from signal + TGTextButton* fGraph; // button to draw graph + +public: + AliEveCosmicRayFitterEditor(const TGWindow* p=0, Int_t width=170, Int_t height=30, UInt_t options = kChildFrame, Pixel_t back=GetDefaultFrameBackground()); + virtual ~AliEveCosmicRayFitterEditor() {} + + virtual void SetModel(TObject* obj); + + void DoStart(); + void DoFit(); + void DoReset(); + void DoStop(); + void DoGraph(); + + ClassDef(AliEveCosmicRayFitterEditor, 0); // Editor for AliEveCosmicRayFitter class. +}; + +#endif diff --git a/EVE/EveBase/LinkDef.h b/EVE/EveBase/LinkDef.h index edf1b43a1fa..9f7b1452c4a 100644 --- a/EVE/EveBase/LinkDef.h +++ b/EVE/EveBase/LinkDef.h @@ -23,6 +23,9 @@ #pragma link C++ class AliEveTrackFitter+; #pragma link C++ class AliEveTrackFitterEditor+; +#pragma link C++ class AliEveCosmicRayFitter+; +#pragma link C++ class AliEveCosmicRayFitterEditor+; + // AliEveJetPlane #pragma link C++ class AliEveJetPlane+; #pragma link C++ class AliEveJetPlaneGL+;