New classes for alignment via physics tracks
[u/mrichter/AliRoot.git] / MUON / AliMUONAlignment.h
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>
15
16 class TGeoCombiTrans;
17 class TClonesArray;
18 class AliMillepede;
19 class AliMUONGeometryTransformer;
20 class AliMUONTrack;
21 class AliMUONTrackParam;
22 class AliMUONHitForRec;
23
24 class AliMUONAlignment:public TObject
25 {
26
27 public:
28   AliMUONAlignment();
29   virtual ~AliMUONAlignment();
30
31   void ProcessTrack(AliMUONTrack *track);
32   void SetGeometryTransformer(AliMUONGeometryTransformer * transformer) {
33     fTransform = transformer;
34   }
35
36   void FixLeft();
37   void FixStation(Int_t iSt);
38   void AllowVariations(Bool_t *bStOnOff);
39   void SetNonLinear(Bool_t *bStOnOff, Bool_t *bVarXYT);
40   void AddConstraints(Bool_t *bStOnOff, Bool_t *bVarXYT);
41   void AddConstraints(Bool_t *bStOnOff, Bool_t *bVarXYT, Bool_t *bDetTLBR);
42   void ResetConstraints();
43
44   void FixParameter(Int_t param, Double_t value);
45   void SetNonLinear(Int_t param);
46   void AddConstraint(Double_t *factor, Double_t value );
47   void InitGlobalParameters(Double_t *par);   
48   void SetLocalDerivative(Int_t index, Double_t value) {      
49     fLocalDerivatives[index] = value;
50   }
51   void SetGlobalDerivative(Int_t index, Double_t value) {
52     fGlobalDerivatives[index] = value;
53   }  
54   void LocalFit(Int_t iTrack, Double_t *lTrackParam, Int_t lSingleFit);
55   void GlobalFit(Double_t *parameters,Double_t *errors,Double_t *pulls);
56   void PrintGlobalParameters();
57   Double_t GetParError(Int_t iPar);
58   
59   AliMUONGeometryTransformer* 
60     ReAlign(const AliMUONGeometryTransformer * transformer, double *misAlignments, Bool_t verbose);
61
62  protected:
63   AliMUONAlignment(const AliMUONAlignment& right);
64   AliMUONAlignment&  operator = (const AliMUONAlignment& right);
65  
66   
67  private:
68
69   void Init(Int_t nGlobal, Int_t nLocal, Int_t nStdDev);
70   void ConstrainT(Int_t lDetElem, Int_t lCh, Double_t *lConstraintT, Int_t iVar);
71   void ConstrainL(Int_t lDetElem, Int_t lCh, Double_t *lConstraintL, Int_t iVar);
72   void ConstrainB(Int_t lDetElem, Int_t lCh, Double_t *lConstraintB, Int_t iVar);
73   void ConstrainR(Int_t lDetElem, Int_t lCh, Double_t *lConstraintR, Int_t iVar);
74   void FillDetElemData();
75   void FillRecPointData();
76   void FillTrackParamData();
77   void ResetLocalEquation();
78   void LocalEquationX();
79   void LocalEquationY();
80
81   TGeoCombiTrans ReAlign(const TGeoCombiTrans& transform, double *detElemMisAlignment) const;
82
83   Bool_t fBFieldOn;        // Flag for Magnetic filed On/Off
84                                                                        
85   Bool_t fDoF[3];          // Flags degrees of freedom to align (x,y,phi)
86   Double_t fAllowVar[3];   // "Encouraged" variation for degrees of freedom 
87   Double_t fStartFac;      // Initial value for chi2 cut 
88                            // if > 1 Iterations in AliMillepede are turned on
89   Double_t fResCutInitial; // Cut on residual for first iteration
90   Double_t fResCut;        // Cut on residual for other iterations 
91
92   AliMillepede *fMillepede; // Detector independent alignment class
93   
94   TClonesArray *fTrackParamAtHit; // Array of track parameters 
95   TClonesArray *fHitForRecAtHit;  // Array of track hits 
96   AliMUONTrack *fTrack;           // AliMUONTrack 
97   AliMUONHitForRec *fRecHit;      // AliMUONHitForRec
98   AliMUONTrackParam *fTrackParam; // Track parameters 
99
100   Int_t fNGlobal;  // Number of global parameters
101   Int_t fNLocal;   // Number of local parameters
102   Int_t fNStdDev;  // Number of standard deviations for chi2 cut
103   Double_t fClustPos[3];    // Cluster position
104   Double_t fClustPosLoc[3]; // Cluster position in local coordinates
105   Double_t fTrackSlope0[2]; // Track slope at reference point
106   Double_t fTrackSlope[2];  // Track slope at current point
107   Double_t fTrackPos0[3];   // Track intersection at reference point
108   Double_t fTrackPos[3];    // Track intersection at current point
109   Double_t fTrackPosLoc[3]; // Track intersection at current point in local coordinates 
110   Double_t fMeas[2];        // Current measurement (depend on B field On/Off)  
111   Double_t fSigma[2];       // Estimated resolution on measurement
112
113   Double_t fGlobalDerivatives[468]; // Array of global derivatives
114   Double_t fLocalDerivatives[4];    // Array of local derivatives
115
116   Double_t fConstraintX[468];   // Array for constraint equation all X
117   Double_t fConstraintY[468];   // Array for constraint equation all Y
118   Double_t fConstraintP[468];   // Array for constraint equation all P
119   Double_t fConstraintXT[468];  // Array for constraint equation X Top half
120   Double_t fConstraintYT[468];  // Array for constraint equation Y Top half
121   Double_t fConstraintPT[468];  // Array for constraint equation P Top half
122   Double_t fConstraintXB[468];  // Array for constraint equation X Bottom half
123   Double_t fConstraintYB[468];  // Array for constraint equation Y Bottom half
124   Double_t fConstraintPB[468];  // Array for constraint equation P Bottom half
125   Double_t fConstraintXR[468];  // Array for constraint equation X Right half
126   Double_t fConstraintYR[468];  // Array for constraint equation Y Right half
127   Double_t fConstraintPR[468];  // Array for constraint equation P Right half
128   Double_t fConstraintXL[468];  // Array for constraint equation X Left half
129   Double_t fConstraintYL[468];  // Array for constraint equation Y Left half
130   Double_t fConstraintPL[468];  // Array for constraint equation P Left half
131   Double_t fConstraintX3[468];  // Array for constraint equation St3 X
132   Double_t fConstraintY3[468];  // Array for constraint equation St3 Y
133   Double_t fConstraintX4[468];  // Array for constraint equation St4 X
134   Double_t fConstraintY4[468];  // Array for constraint equation St4 Y
135   Double_t fConstraintP4[468];  // Array for constraint equation St4 P
136   Double_t fConstraintX5[468];  // Array for constraint equation St5 X
137   Double_t fConstraintY5[468];  // Array for constraint equation St5 Y
138
139   Int_t fDetElemId;        // Detection element id
140   Int_t fDetElemNumber;    // Detection element number
141   Double_t fPhi;           // Azimuthal tilt of detection element 
142   Double_t fCosPhi;        // Cosine of fPhi
143   Double_t fSinPhi;        // Sine of fPhi
144   Double_t fDetElemPos[3]; // Position of detection element
145
146   AliMUONGeometryTransformer *fTransform; // Geometry transformation
147
148   static Int_t fgNSt;            // Number tracking stations
149   static Int_t fgNCh;            // Number tracking chambers
150   static Int_t fgNParCh;         // Number of degrees of freedom per chamber
151   static Int_t fgNDetElem;       // Total number of detection elements
152   static Int_t fgNDetElemCh[10]; // Number of detection elements per chamber
153   static Int_t fgSNDetElemCh[10];// Sum of detection elements up to this chamber (inc)
154
155 ClassDef(AliMUONAlignment, 0)};
156
157 #endif