Line data Source code
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 0 : fBaseTrf = baseTrf;
54 0 : fOwnerBaseTrf=ownerBaseTrf;
55 0 : }
56 : /// Set local transformation of geometrical element
57 : virtual void SetLocalTransformation(TGeoCombiTrans *localTrf, Bool_t ownerLocalTrf = kFALSE) {
58 0 : fLocalTrf=localTrf;
59 0 : fOwnerLocalTrf=ownerLocalTrf;
60 0 : }
61 :
62 : /// Returns the local transformation
63 0 : TGeoCombiTrans* GetLocalTrf() const {return fLocalTrf;}
64 : /// Returns the base (global) transformation
65 0 : TGeoCombiTrans* GetBaseTrf() const {return fBaseTrf;}
66 : /// Returns the alignment transformation
67 0 : TGeoCombiTrans* GetAlignTrf()const {return fAlignTrf;}
68 :
69 : /// Define wether to work in mm (survey units) or cm (alice units)
70 0 : void SetUseCM(Bool_t bUseCM = kTRUE) {fUseCM = bUseCM;}
71 : /// Indicates if working in mm (survey units) or cm (alice units)
72 0 : 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 0 : TF2* GetPlane() const {return fPlane;}
82 :
83 : /// Returns the TFitter used for the best local to global transformation determination
84 0 : 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 0 : void SetXMin(Double_t xMin) {fXMin = xMin;}
103 : /// Set xMax for functions fitting
104 0 : void SetXMax(Double_t xMax) {fXMax = xMax;}
105 : /// Set yMin for functions fitting
106 0 : void SetYMin(Double_t yMin) {fYMin = yMin;}
107 : /// Set yMax for functions fitting
108 0 : void SetYMax(Double_t yMax) {fYMax = yMax;}
109 : /// Set zMin for functions fitting
110 0 : void SetZMin(Double_t zMin) {fZMin = zMin;}
111 : /// Set zMax for functions fitting
112 0 : 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 0 : 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 18 : ClassDef(AliMUONSurveyObj, 0) //Class for alignment of muon spectrometer
162 : };
163 :
164 : #endif
|