010eb601 |
1 | #ifndef ALIMUONALIGNMENT_H |
2 | #define ALIMUONALIGNMENT_H |
3 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * |
4 | * See cxx source for full Copyright notice */ |
5 | |
6 | /* $Id$ */ |
7 | |
8 | /// \ingroup rec |
9 | /// \class AliMUONAlignment |
10 | /// \brief Class for alignment of muon spectrometer |
11 | // |
12 | // Authors: Bruce Becker, Javier Castillo |
13 | |
14 | #include <TObject.h> |
723b0b5b |
15 | #include <TString.h> |
010eb601 |
16 | |
17 | class TGeoCombiTrans; |
18 | class TClonesArray; |
19 | class AliMillepede; |
20 | class AliMUONGeometryTransformer; |
21 | class AliMUONTrack; |
22 | class AliMUONTrackParam; |
96ebe67e |
23 | class AliMUONVCluster; |
010eb601 |
24 | |
25 | class AliMUONAlignment:public TObject |
26 | { |
27 | |
28 | public: |
29 | AliMUONAlignment(); |
30 | virtual ~AliMUONAlignment(); |
31 | |
32 | void ProcessTrack(AliMUONTrack *track); |
c4ee792d |
33 | /// Set geometry transformer |
010eb601 |
34 | void SetGeometryTransformer(AliMUONGeometryTransformer * transformer) { |
35 | fTransform = transformer; |
36 | } |
37 | |
058c815d |
38 | /// Set flag for Magnetic field On/Off |
39 | void SetBFieldOn(Bool_t bBFieldOn) { |
40 | fBFieldOn = bBFieldOn; |
41 | } |
625f657d |
42 | /// Define chambers to align |
d8ad38e5 |
43 | void SetChOnOff(Bool_t *bChOnOff) { |
44 | for(int iCh=0; iCh<10; iCh++) |
45 | fChOnOff[iCh] = bChOnOff[iCh]; |
46 | } |
625f657d |
47 | /// Possibility to align only one side of the detector |
d8ad38e5 |
48 | void SetSpecLROnOff(Bool_t *bSpecLROnOff) { |
49 | fSpecLROnOff[0] = bSpecLROnOff[0]; |
50 | fSpecLROnOff[1] = bSpecLROnOff[1]; |
51 | } |
010eb601 |
52 | void FixStation(Int_t iSt); |
d8ad38e5 |
53 | void FixChamber(Int_t iCh); |
723b0b5b |
54 | void FixDetElem(Int_t iDetElemId, TString sVarXYT = "XYTZ"); |
d8ad38e5 |
55 | void FixHalfSpectrometer(Bool_t *bChOnOff, Bool_t *bSpecLROnOff); |
56 | void AllowVariations(Bool_t *bChOnOff); |
57 | void SetNonLinear(Bool_t *bChOnOff, Bool_t *bVarXYT); |
58 | void AddConstraints(Bool_t *bChOnOff, Bool_t *bVarXYT); |
59 | void AddConstraints(Bool_t *bChOnOff, Bool_t *bVarXYT, Bool_t *bDetTLBR, Bool_t *bSpecLROnOff); |
010eb601 |
60 | void ResetConstraints(); |
61 | |
62 | void FixParameter(Int_t param, Double_t value); |
63 | void SetNonLinear(Int_t param); |
64 | void AddConstraint(Double_t *factor, Double_t value ); |
65 | void InitGlobalParameters(Double_t *par); |
c4ee792d |
66 | /// Set array of local derivatives |
010eb601 |
67 | void SetLocalDerivative(Int_t index, Double_t value) { |
68 | fLocalDerivatives[index] = value; |
69 | } |
c4ee792d |
70 | /// Set array of global derivatives |
010eb601 |
71 | void SetGlobalDerivative(Int_t index, Double_t value) { |
72 | fGlobalDerivatives[index] = value; |
73 | } |
74 | void LocalFit(Int_t iTrack, Double_t *lTrackParam, Int_t lSingleFit); |
75 | void GlobalFit(Double_t *parameters,Double_t *errors,Double_t *pulls); |
76 | void PrintGlobalParameters(); |
77 | Double_t GetParError(Int_t iPar); |
78 | |
79 | AliMUONGeometryTransformer* |
80 | ReAlign(const AliMUONGeometryTransformer * transformer, double *misAlignments, Bool_t verbose); |
81 | |
4818a9b7 |
82 | void SetAlignmentResolution(const TClonesArray* misAlignArray, Int_t chId, Double_t chResX, Double_t chResY, Double_t deResX, Double_t deResY); |
83 | |
c4ee792d |
84 | private: |
85 | /// Not implemented |
010eb601 |
86 | AliMUONAlignment(const AliMUONAlignment& right); |
c4ee792d |
87 | /// Not implemented |
010eb601 |
88 | AliMUONAlignment& operator = (const AliMUONAlignment& right); |
010eb601 |
89 | |
90 | void Init(Int_t nGlobal, Int_t nLocal, Int_t nStdDev); |
3b2890be |
91 | void ConstrainT(Int_t lDetElem, Int_t lCh, Double_t *lConstraintT, Int_t iVar, Double_t lWeight=1.0); |
92 | void ConstrainL(Int_t lDetElem, Int_t lCh, Double_t *lConstraintL, Int_t iVar, Double_t lWeight=1.0); |
93 | void ConstrainB(Int_t lDetElem, Int_t lCh, Double_t *lConstraintB, Int_t iVar, Double_t lWeight=1.0); |
94 | void ConstrainR(Int_t lDetElem, Int_t lCh, Double_t *lConstraintR, Int_t iVar, Double_t lWeight=1.0); |
010eb601 |
95 | void FillDetElemData(); |
96 | void FillRecPointData(); |
97 | void FillTrackParamData(); |
98 | void ResetLocalEquation(); |
99 | void LocalEquationX(); |
100 | void LocalEquationY(); |
101 | |
102 | TGeoCombiTrans ReAlign(const TGeoCombiTrans& transform, double *detElemMisAlignment) const; |
103 | |
c4ee792d |
104 | Bool_t fBFieldOn; ///< Flag for Magnetic filed On/Off |
d8ad38e5 |
105 | Bool_t fChOnOff[10]; ///< Flags for chamber On/Off |
106 | Bool_t fSpecLROnOff[2]; ///< Flags for left right On/Off |
723b0b5b |
107 | Bool_t fDoF[4]; ///< Flags degrees of freedom to align (x,y,phi) |
108 | Double_t fAllowVar[4]; ///< "Encouraged" variation for degrees of freedom |
c4ee792d |
109 | Double_t fStartFac; ///< Initial value for chi2 cut |
110 | ///< if > 1 Iterations in AliMillepede are turned on |
111 | Double_t fResCutInitial; ///< Cut on residual for first iteration |
112 | Double_t fResCut; ///< Cut on residual for other iterations |
113 | |
114 | AliMillepede *fMillepede; ///< Detector independent alignment class |
010eb601 |
115 | |
96ebe67e |
116 | TClonesArray *fTrackParamAtCluster; ///< Array of track parameters |
117 | AliMUONTrack *fTrack; ///< AliMUONTrack |
118 | AliMUONVCluster *fCluster; ///< AliMUONVCluster |
119 | AliMUONTrackParam *fTrackParam; ///< Track parameters |
c4ee792d |
120 | |
121 | Int_t fNGlobal; ///< Number of global parameters |
122 | Int_t fNLocal; ///< Number of local parameters |
123 | Int_t fNStdDev; ///< Number of standard deviations for chi2 cut |
124 | Double_t fClustPos[3]; ///< Cluster position |
125 | Double_t fClustPosLoc[3]; ///< Cluster position in local coordinates |
126 | Double_t fTrackSlope0[2]; ///< Track slope at reference point |
127 | Double_t fTrackSlope[2]; ///< Track slope at current point |
128 | Double_t fTrackPos0[3]; ///< Track intersection at reference point |
129 | Double_t fTrackPos[3]; ///< Track intersection at current point |
130 | Double_t fTrackPosLoc[3]; ///< Track intersection at current point in local coordinates |
131 | Double_t fMeas[2]; ///< Current measurement (depend on B field On/Off) |
132 | Double_t fSigma[2]; ///< Estimated resolution on measurement |
133 | |
723b0b5b |
134 | Double_t fGlobalDerivatives[624]; ///< Array of global derivatives |
c4ee792d |
135 | Double_t fLocalDerivatives[4]; ///< Array of local derivatives |
136 | |
723b0b5b |
137 | Double_t fConstraintX[624]; ///< Array for constraint equation all X |
138 | Double_t fConstraintY[624]; ///< Array for constraint equation all Y |
139 | Double_t fConstraintP[624]; ///< Array for constraint equation all P |
140 | Double_t fConstraintXT[624]; ///< Array for constraint equation X Top half |
141 | Double_t fConstraintYT[624]; ///< Array for constraint equation Y Top half |
142 | Double_t fConstraintPT[624]; ///< Array for constraint equation P Top half |
143 | Double_t fConstraintXZT[624]; ///< Array for constraint equation X vs Z Top half |
144 | Double_t fConstraintYZT[624]; ///< Array for constraint equation Y vs Z Top half |
145 | Double_t fConstraintPZT[624]; ///< Array for constraint equation P vs Z Top half |
146 | Double_t fConstraintXYT[624]; ///< Array for constraint equation X vs Y Top half |
147 | Double_t fConstraintYYT[624]; ///< Array for constraint equation Y vs Y Top half |
148 | Double_t fConstraintPYT[624]; ///< Array for constraint equation P vs Y Top half |
149 | Double_t fConstraintXB[624]; ///< Array for constraint equation X Bottom half |
150 | Double_t fConstraintYB[624]; ///< Array for constraint equation Y Bottom half |
151 | Double_t fConstraintPB[624]; ///< Array for constraint equation P Bottom half |
152 | Double_t fConstraintXZB[624]; ///< Array for constraint equation X vs Z Bottom half |
153 | Double_t fConstraintYZB[624]; ///< Array for constraint equation Y vs Z Bottom half |
154 | Double_t fConstraintPZB[624]; ///< Array for constraint equation P vs Z Bottom half |
155 | Double_t fConstraintXYB[624]; ///< Array for constraint equation X vs Y Bottom half |
156 | Double_t fConstraintYYB[624]; ///< Array for constraint equation Y vs Y Bottom half |
157 | Double_t fConstraintPYB[624]; ///< Array for constraint equation P vs Y Bottom half |
158 | Double_t fConstraintXR[624]; ///< Array for constraint equation X Right half |
159 | Double_t fConstraintYR[624]; ///< Array for constraint equation Y Right half |
160 | Double_t fConstraintPR[624]; ///< Array for constraint equation P Right half |
161 | Double_t fConstraintXZR[624]; ///< Array for constraint equation X vs Z Right half |
162 | Double_t fConstraintYZR[624]; ///< Array for constraint equation Y vs Z Right half |
163 | Double_t fConstraintPZR[624]; ///< Array for constraint equation P vs Z Right half |
164 | Double_t fConstraintXYR[624]; ///< Array for constraint equation X vs Y Right half |
165 | Double_t fConstraintYYR[624]; ///< Array for constraint equation Y vs Y Right half |
166 | Double_t fConstraintPYR[624]; ///< Array for constraint equation P vs Y Right half |
167 | Double_t fConstraintXL[624]; ///< Array for constraint equation X Left half |
168 | Double_t fConstraintYL[624]; ///< Array for constraint equation Y Left half |
169 | Double_t fConstraintPL[624]; ///< Array for constraint equation P Left half |
170 | Double_t fConstraintXZL[624]; ///< Array for constraint equation X vs Z Left half |
171 | Double_t fConstraintYZL[624]; ///< Array for constraint equation Y vs Z Left half |
172 | Double_t fConstraintPZL[624]; ///< Array for constraint equation P vs Z Left half |
173 | Double_t fConstraintXYL[624]; ///< Array for constraint equation X vs Y Left half |
174 | Double_t fConstraintYYL[624]; ///< Array for constraint equation Y vs Y Left half |
175 | Double_t fConstraintPYL[624]; ///< Array for constraint equation P vs Y Left half |
176 | Double_t fConstraintX3[624]; ///< Array for constraint equation St3 X |
177 | Double_t fConstraintY3[624]; ///< Array for constraint equation St3 Y |
178 | Double_t fConstraintX4[624]; ///< Array for constraint equation St4 X |
179 | Double_t fConstraintY4[624]; ///< Array for constraint equation St4 Y |
180 | Double_t fConstraintP4[624]; ///< Array for constraint equation St4 P |
181 | Double_t fConstraintX5[624]; ///< Array for constraint equation St5 X |
182 | Double_t fConstraintY5[624]; ///< Array for constraint equation St5 Y |
c4ee792d |
183 | |
184 | Int_t fDetElemId; ///< Detection element id |
185 | Int_t fDetElemNumber; ///< Detection element number |
186 | Double_t fPhi; ///< Azimuthal tilt of detection element |
187 | Double_t fCosPhi; ///< Cosine of fPhi |
188 | Double_t fSinPhi; ///< Sine of fPhi |
189 | Double_t fDetElemPos[3]; ///< Position of detection element |
190 | |
191 | AliMUONGeometryTransformer *fTransform; ///< Geometry transformation |
192 | |
193 | static Int_t fgNSt; ///< Number tracking stations |
194 | static Int_t fgNCh; ///< Number tracking chambers |
3b2890be |
195 | static Int_t fgNTrkMod; ///< Number of tracking modules (4 ch + 6*2 half-ch) |
c4ee792d |
196 | static Int_t fgNParCh; ///< Number of degrees of freedom per chamber |
197 | static Int_t fgNDetElem; ///< Total number of detection elements |
198 | static Int_t fgNDetElemCh[10]; ///< Number of detection elements per chamber |
199 | static Int_t fgSNDetElemCh[10];///< Sum of detection elements up to this chamber (inc) |
010eb601 |
200 | |
69d7ac2e |
201 | ClassDef(AliMUONAlignment, 0) //Class for alignment of muon spectrometer |
202 | }; |
010eb601 |
203 | |
204 | #endif |