Flexible pt range for the efficiency histogramming
[u/mrichter/AliRoot.git] / MUON / AliMUONSurveyObj.h
1 #ifndef ALIMUONSURVEYOBJ_H
2 #define ALIMUONSURVEYOBJ_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /// \ingroup geometry
7 /// \class AliMUONSurveyObj
8 /// \brief Base class for survey of muon spectrometer
9 //
10 // Author: Javier Castillo
11
12 #include <TObject.h>
13
14 class TObjArray;
15 class TGeoCombiTrans;
16 class TVector3;
17 class TH2;
18 class TF2;
19 class TFitter;
20 class TArrayD;
21
22 class AliSurveyPoint;
23
24 class AliMUONSurveyObj:public TObject
25 {
26
27  public:
28   AliMUONSurveyObj();
29   virtual ~AliMUONSurveyObj();
30  
31   virtual Int_t AddStickerTargets(TObjArray *pArray, TString stBaseName, Int_t lTargetMax = 9);
32   virtual Int_t AddGButtonTargets(TObjArray *pArray, TString btBaseName, Int_t lTargetMax = 9);
33   virtual Int_t AddLButtonTargets(TObjArray *pArray, TString btBaseName, Int_t lTargetMax = 9);
34
35   /// To be implemented in a concrete Chamber or DetElem class
36   virtual Int_t AddStickerTargets(TString stBaseName, Int_t lTargetMax = 9) = 0;
37   /// To be implemented in a concrete Chamber or DetElem class
38   virtual Int_t AddGButtonTargets(TString btBaseName, Int_t lTargetMax = 9) = 0;
39
40   void AddStickerTarget(AliSurveyPoint *stPoint);
41   void AddGButtonTarget(AliSurveyPoint *btPoint);
42   void AddLButtonTarget(AliSurveyPoint *btPoint);
43   void AddLButtonTarget(TVector3 *btVector);
44
45   Int_t GetNStickerTargets();
46   AliSurveyPoint *GetStickerTarget(Int_t stIndex);
47   Int_t GetNGButtonTargets();
48   AliSurveyPoint *GetGButtonTarget(Int_t btIndex);
49   Int_t GetNLButtonTargets();
50   AliSurveyPoint *GetLButtonTarget(Int_t btIndex);
51   /// Set transformation of geoemtrical element
52   void SetBaseTransformation(TGeoCombiTrans *baseTrf, Bool_t ownerBaseTrf = kFALSE) {
53     fBaseTrf = baseTrf;
54     fOwnerBaseTrf=ownerBaseTrf;
55   }
56   /// Set local transformation of geometrical element
57   virtual void SetLocalTransformation(TGeoCombiTrans *localTrf, Bool_t ownerLocalTrf = kFALSE) {
58     fLocalTrf=localTrf;
59     fOwnerLocalTrf=ownerLocalTrf;
60   }
61
62   /// Returns the local transformation
63   TGeoCombiTrans* GetLocalTrf() const {return fLocalTrf;} 
64   /// Returns the base (global) transformation
65   TGeoCombiTrans* GetBaseTrf() const {return fBaseTrf;}
66   /// Returns the alignment transformation
67   TGeoCombiTrans* GetAlignTrf()const {return fAlignTrf;}
68
69   /// Define wether to work in mm (survey units) or cm (alice units)
70   void SetUseCM(Bool_t bUseCM = kTRUE) {fUseCM = bUseCM;}
71   /// Indicates if working in mm (survey units) or cm (alice units)
72   Bool_t GetUseCM() const {return fUseCM;}
73
74   void SetPlane(TString pName, Double_t xMin=-2000., Double_t xMax=+2000., Double_t yMin=-2000., Double_t yMax=2000.);
75   void SetPlaneParameters(Double_t p0, Double_t p1, Double_t p2);
76
77   void DrawSTargets();
78   Double_t FitPlane();
79
80   /// Returns the plane (TF2) representing the object
81   TF2* GetPlane() const {return fPlane;}
82
83   /// Returns the TFitter used for the best local to global transformation determination
84   TFitter* GetFitter() const {return fFitter;}
85
86   Int_t SurveyToAlign(TGeoCombiTrans &quadTransf, Double_t *parErr, Double_t psi=0., Double_t tht=0., Double_t epsi=0., Double_t etht=0.);
87   Int_t SurveyToAlign(Double_t psi=0., Double_t tht=0., Double_t epsi=0., Double_t etht=0.);
88   Double_t SurveyChi2(Double_t *par);
89
90   Double_t EvalFunction(const TF2 *lFunction, Int_t iP1, Int_t iP2, const Char_t *lCoord);
91
92   void CalculateTranslation(TF2 *xFunc, TF2 *yFunc, TF2 *zFunc, Int_t iP1, Int_t iP2, Double_t *lCenTemp);
93   //  TGeoCombiTrans *CalculateTransformation(TF2 *xFunc, TF2 *yFunc, TF2 *zFunc, TF2 *pFunc, Int_t iP1, Int_t iP2);
94
95   Double_t CalculateGlobalDiff(TGeoCombiTrans &lTransf, Int_t nPoints, TArrayD &lDiff);
96
97   Int_t CalculateBestTransf(Int_t iP1, Int_t iP2, Double_t *lXYZ, Double_t *lPTP);
98
99   void CalculateMeanTransf(Double_t *lXYZ, Double_t *lPTP);
100   
101   /// Set xMin for functions fitting
102   void SetXMin(Double_t xMin) {fXMin = xMin;}
103   /// Set xMax for functions fitting
104   void SetXMax(Double_t xMax) {fXMax = xMax;}
105   /// Set yMin for functions fitting
106   void SetYMin(Double_t yMin) {fYMin = yMin;}
107   /// Set yMax for functions fitting
108   void SetYMax(Double_t yMax) {fYMax = yMax;}
109   /// Set zMin for functions fitting
110   void SetZMin(Double_t zMin) {fZMin = zMin;}
111   /// Set zMax for functions fitting
112   void SetZMax(Double_t zMax) {fZMax = zMax;}
113
114   virtual void PrintLocalTrf();
115   virtual void PrintAlignTrf();
116
117   void FillSTHistograms(TString baseNameC, TH2 *hSTc, TString baseNameA="", TH2 *hSTa = 0);
118
119   Double_t GetAlignResX();
120   Double_t GetAlignResY();
121
122   AliSurveyPoint* ConvertPointUnits(AliSurveyPoint *stPoint, Float_t lFactor = 0.1);
123
124  private:
125   /// Not implemented
126   AliMUONSurveyObj(const AliMUONSurveyObj& right);
127   /// Not implemented
128   AliMUONSurveyObj&  operator = (const AliMUONSurveyObj& right);
129
130   Double_t EqPlane(const Double_t *x, const Double_t *par) const {
131     /// Plane equation 
132     return (-par[1]*x[0] +par[0]*x[1] -par[2]);  // then psi=ATan(par[0]) and tht=ATan(par[0])
133     //    return (-par[0]*x[0] -par[1]*x[1] -par[2]); 
134   }
135
136   TObjArray *fSTargets;   ///< Array of AliSurveyPoint of Sticker Targets
137   TObjArray *fGBTargets;  ///< Array of AliSurveyPoint of Button Targets
138   TObjArray *fLBTargets;  ///< Array of TVector3 or AliSurveyPoint of local position of Button Targets
139   TGeoCombiTrans *fLocalTrf; ///< Local transformation
140   TGeoCombiTrans *fAlignTrf; ///< Local alignment transformation
141   TGeoCombiTrans *fBaseTrf;  ///< Base Transformation
142
143   Bool_t fOwnerLocalTrf;    ///< Flag for owner of fLocalTrf
144   Bool_t fOwnerAlignTrf;    ///< Flag for owner of fAlignTrf
145   Bool_t fOwnerBaseTrf;     ///< Flag for owner of fBaseTrf
146
147   Bool_t fUseCM;            ///< Use centimeters, survey units are mm but aliroot uses cm
148
149   TF2 *fPlane;  ///< TF2 for plane fitting
150
151   TFitter *fFitter;  ///< Fitter for best local to global transformation
152
153   Double_t fXMin;    ///< xMin for functions fitting
154   Double_t fXMax;    ///< xMax for functions fitting
155   Double_t fYMin;    ///< yMin for functions fitting
156   Double_t fYMax;    ///< yMax for functions fitting
157   Double_t fZMin;    ///< zMin for functions fitting
158   Double_t fZMax;    ///< zMax for functions fitting
159
160
161 ClassDef(AliMUONSurveyObj, 0) //Class for alignment of muon spectrometer
162 };
163
164 #endif