1. Adding the AliExternalComparison
[u/mrichter/AliRoot.git] / TPC / AliTPCcalibAlign.h
1 #ifndef ALITPCCALIBALIGN_H
2 #define ALITPCCALIBALIGN_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               */
6
7 ////
8 ////
9 ////
10
11 #include "TObject.h"
12 #include "TObjArray.h"
13 #include "TLinearFitter.h"
14 #include "AliTPCcalibBase.h"
15 #include "TH1.h"
16
17 class AliExternalTrackParam;
18 class AliExternalComparison;
19 class AliTPCseed;
20 class TGraphErrors;
21 class TTree;
22 class THnSparse;
23
24
25 class AliTPCcalibAlign:public AliTPCcalibBase {
26 public:
27   enum HistoType {kY=0, kZ =1, kPhi=2, kTheta=3, 
28                   kYPhi=4, kZTheta=5, 
29                   kYz=6,kZz=7,kPhiZ=8,kThetaZ=9};
30   enum FitType{ k6=0, k9=1, k12=2};
31   AliTPCcalibAlign();
32   AliTPCcalibAlign(const Text_t *name, const Text_t *title);
33   AliTPCcalibAlign(const AliTPCcalibAlign &align);
34   //
35   virtual ~AliTPCcalibAlign();
36   virtual void Process(AliTPCseed *track);
37   virtual void Analyze();
38   virtual void Terminate();  
39   virtual Long64_t Merge(TCollection* list);
40   //
41   virtual void EvalFitters();
42   TH1 * GetHisto(HistoType type, Int_t s1, Int_t s2, Bool_t force=kFALSE);
43   void  MakeTree(const char *fname="alignTree.root");
44   TGraphErrors * MakeGraph(Int_t sec0, Int_t sec1, Int_t dsec, 
45                            Int_t i0, Int_t i1, FitType type); 
46   void ProcessTracklets(const AliExternalTrackParam &t1,
47                         const AliExternalTrackParam &t2,
48                         const AliTPCseed * seed,
49                         Int_t s1,Int_t s2);
50   inline Int_t GetIndex(Int_t s1,Int_t s2){return 72*s1+s2;}
51   //
52   inline const TMatrixD     * GetTransformation(Int_t s1,Int_t s2, Int_t fitType);
53   //
54   inline TLinearFitter* GetFitter12(Int_t s1,Int_t s2);
55   inline TLinearFitter* GetFitter9(Int_t s1,Int_t s2);
56   inline TLinearFitter* GetFitter6(Int_t s1,Int_t s2);
57   //
58   Bool_t GetTransformation12(Int_t s1,Int_t s2,TMatrixD &a);
59   Bool_t GetTransformation9(Int_t s1,Int_t s2,TMatrixD &a);
60   Bool_t GetTransformation6(Int_t s1,Int_t s2,TMatrixD &a);
61   Int_t  AcceptTracklet(const AliExternalTrackParam &tp1,
62                         const AliExternalTrackParam &tp2);
63
64   void ProcessDiff(const AliExternalTrackParam &t1,
65                    const AliExternalTrackParam &t2,
66                    const AliTPCseed *seed,
67                    Int_t s1,Int_t s2);
68   void ProcessAlign(Double_t * t1, Double_t * t2, Int_t s1,Int_t s2);
69
70 //   Bool_t GetTransformationCovar12(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
71 //   Bool_t GetTransformationCovar9(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
72 //   Bool_t GetTransformationCovar6(Int_t s1,Int_t s2,TMatrixD &a, Bool_t norm=kFALSE);
73   void Add(AliTPCcalibAlign * align);
74   Int_t *GetPoints() {return fPoints;}
75   void     Process(AliESDtrack *track, Int_t runNo=-1){AliTPCcalibBase::Process(track,runNo);};
76   void     Process(AliESDEvent *event){AliTPCcalibBase::Process(event);}
77   TLinearFitter* GetOrMakeFitter12(Int_t s1,Int_t s2);
78   TLinearFitter* GetOrMakeFitter9(Int_t s1,Int_t s2);
79   TLinearFitter* GetOrMakeFitter6(Int_t s1,Int_t s2);
80   void Process12(const Double_t *t1, const Double_t *t2,
81                  TLinearFitter *fitter);
82   void Process9(Double_t *t1, Double_t *t2, TLinearFitter *fitter);
83   void Process6(Double_t *t1, Double_t *t2, TLinearFitter *fitter);
84   void ProcessTree(TTree * tree, AliExternalComparison *comp=0);
85   void GlobalAlign6(Int_t minPoints, Float_t sysError, Int_t niter);
86   //
87   // Cluster comparison Part
88   //
89   void MakeClusterHistos();
90   //
91   // For visualization and test purposes
92   //
93   Double_t Correct(Int_t type, Int_t value, Int_t s1, Int_t s2, Double_t x, Double_t y, Double_t z, Double_t phi,Double_t theta); 
94   static Double_t SCorrect(Int_t type, Int_t value, Int_t s1, Int_t s2, Double_t x, Double_t y, Double_t z, Double_t phi,Double_t theta){return Instance()->Correct(type,value,s1,s2,x,y,z,phi,theta);}
95   static AliTPCcalibAlign* Instance();
96   void SetInstance(AliTPCcalibAlign*param){fgInstance = param;}
97   static void Constrain1Pt(AliExternalTrackParam &t1, const AliExternalTrackParam &t2, Bool_t noField);
98   void SetNoField(Bool_t noField){ fNoField=noField;}
99 private:
100   
101   void FillHisto(const AliExternalTrackParam &t1,
102                  const AliExternalTrackParam &t2,
103                  Int_t s1,Int_t s2);
104
105   TObjArray fDphiHistArray;    // array of residual histograms  phi      -kPhi
106   TObjArray fDthetaHistArray;  // array of residual histograms  theta    -kTheta
107   TObjArray fDyHistArray;      // array of residual histograms  y        -kY
108   TObjArray fDzHistArray;      // array of residual histograms  z        -kZ
109   //
110   TObjArray fDyPhiHistArray;      // array of residual histograms  y     -kYPhi
111   TObjArray fDzThetaHistArray;    // array of residual histograms  z-z   -kZTheta
112   //
113   TObjArray fDphiZHistArray;      // array of residual histograms  phi   -kPhiz
114   TObjArray fDthetaZHistArray;    // array of residual histograms  theta -kThetaz
115   TObjArray fDyZHistArray;        // array of residual histograms  y     -kYz
116   TObjArray fDzZHistArray;        // array of residual histograms  z     -kZz
117   //
118   //
119   TObjArray fFitterArray12;    // array of fitters
120   TObjArray fFitterArray9;     // array of fitters
121   TObjArray fFitterArray6;     // array of fitters
122   //
123   TObjArray fMatrixArray12;    // array of transnformtation matrix
124   TObjArray fMatrixArray9;     // array of transnformtation matrix
125   TObjArray fMatrixArray6;     // array of transnformtation matrix 
126   //
127   //
128   TObjArray fCombinedMatrixArray6;      // array  combeined transformation matrix
129   //
130   AliExternalComparison  *fCompTracklet;  //tracklet comparison
131   //
132   Int_t fPoints[72*72];        // number of points in the fitter 
133   Bool_t fNoField;            // flag - no field data
134   static AliTPCcalibAlign*   fgInstance; //! Instance of this class (singleton implementation)
135   ClassDef(AliTPCcalibAlign,2)
136 };
137
138
139 TLinearFitter* AliTPCcalibAlign::GetFitter12(Int_t s1,Int_t s2) {
140   return static_cast<TLinearFitter*>(fFitterArray12[GetIndex(s1,s2)]);
141 }
142 TLinearFitter* AliTPCcalibAlign::GetFitter9(Int_t s1,Int_t s2) {
143   return static_cast<TLinearFitter*>(fFitterArray9[GetIndex(s1,s2)]);
144 }
145 TLinearFitter* AliTPCcalibAlign::GetFitter6(Int_t s1,Int_t s2) {
146   return static_cast<TLinearFitter*>(fFitterArray6[GetIndex(s1,s2)]);
147 }
148
149 const TMatrixD * AliTPCcalibAlign::GetTransformation(Int_t s1,Int_t s2, Int_t fitType){
150   if (fitType==0) return static_cast<TMatrixD*>(fMatrixArray6[GetIndex(s1,s2)]);
151   if (fitType==1) return static_cast<TMatrixD*>(fMatrixArray9[GetIndex(s1,s2)]);
152   if (fitType==2) return static_cast<TMatrixD*>(fMatrixArray12[GetIndex(s1,s2)]);
153   return 0;
154 }
155
156
157
158 #endif