]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSAlignMille2.h
Modifications to ITS standalone tracker: 1) improve efficiency at low pt for p-p...
[u/mrichter/AliRoot.git] / ITS / AliITSAlignMille2.h
1 #ifndef ALIITSALIGNMILLE2_H
2 #define ALIITSALIGNMILLE2_H
3 /* Copyright(c) 2007-2009 , ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                                */
5
6
7 /// \ingroup rec
8 /// \class AliITSAlignMille2
9 /// \brief Class for alignment of ITS
10 //
11 // Authors: Marcello Lunardon
12
13 #include <TString.h>
14 #include <TObject.h>
15 #include "AliTrackPointArray.h"
16 #include "AliITSAlignMille2Module.h"
17
18 class AliMillePede2;
19 class AliAlignObjParams;
20 class TGeoManager;
21 class TGeoHMatrix;
22 //class AliITSAlignMille2Module;
23 class AliTrackFitterRieman;
24 class TVirtualFitter;
25 // number of used objects
26
27 #define ITSMILLE2_NPARCH         6
28 #define ITSMILLE2_NLOCAL         5
29
30 struct Mille2Data {
31   /// structure to store data for 2 LocalEquations (X and Z)
32   //
33   Int_t    moduleIDX[10];  // max 10 hierarchy levels!!!
34   Int_t    levFilled;
35   //
36   Double_t measX;
37   Double_t measZ;
38   Double_t sigmaX;
39   Double_t sigmaZ;
40   //
41   Double_t derlocX[ITSMILLE2_NLOCAL];
42   Double_t derlocZ[ITSMILLE2_NLOCAL];
43   //
44   Double_t dergloX[ITSMILLE2_NPARCH*10];
45   Double_t dergloZ[ITSMILLE2_NPARCH*10];
46 };
47
48 class AliITSAlignMille2: public TObject
49 {
50  public:
51   enum {kNLocal=ITSMILLE2_NLOCAL,kNParCh=ITSMILLE2_NPARCH,
52         kMaxITSSensID=2197,kMaxITSSensVID=14300,kMinITSSupeModuleID=14336};
53   enum {kDOFTX,kDOFTY,kDOFTZ,kDOFPH,kDOFTH,kDOFPS};
54   //
55  public:
56   //
57   AliITSAlignMille2(const Char_t *configFilename="AliITSAlignMille.conf", Bool_t initmille=kTRUE);
58   virtual ~AliITSAlignMille2();
59   //
60   AliMillePede2* GetMillePede()                                  const {return fMillepede;}
61
62   // geometry methods 
63   Int_t     GetModuleIndex(const Char_t *symname);
64   Int_t     GetModuleIndex(UShort_t voluid);
65   UShort_t  GetModuleVolumeID(const Char_t *symname);
66   UShort_t  GetModuleVolumeID(Int_t index);
67   void      SetParSigTranslations(double v)                           {fParSigTranslations = v;}
68   void      SetParSigRotations(double v)                              {fParSigRotations = v;}
69   //
70   // configuration methods
71   void      SetGeometryFileName(const Char_t* filename="geometry.root") { fGeometryFileName = filename; }
72   const Char_t* GetGeometryFileName()                                   {return fGeometryFileName.Data();}
73   const Char_t* GetPreAlignmentFileName()                               {return fPreAlignmentFileName.Data();}
74   TClonesArray* GetPreAlignmentDeltas()                           const {return fPrealignment;}
75   void      SetCurrentModule(Int_t id)                                  {fCurrentModule = GetMilleModule(id);}
76   void      PrintCurrentModuleInfo()                              const {if (fCurrentModule) fCurrentModule->Print();}
77   void      Print(Option_t*)                                      const;
78   Bool_t    IsConfigured()                                        const {return fIsConfigured;}
79   void      SetRequiredPoint(Char_t* where, Int_t ndet, Int_t updw, Int_t nreqpts);
80   void      SetUseGlobalDelta(Bool_t v=kTRUE)                           {fUseGlobalDelta = v;}
81   Bool_t    GetUseGlobalDelta()                                   const {return fUseGlobalDelta;}
82   //
83   // fitting methods
84   AliTrackFitterRieman *GetRiemanFitter()                         const {return fRieman;}
85   AliTrackPointArray   *PrepareTrack(const AliTrackPointArray *track); 
86   Int_t     ProcessTrack(const AliTrackPointArray *track);
87   void      InitTrackParams(int meth=1);
88   void      SetMinNPtsPerTrack(Int_t pts=3)                             {fMinNPtsPerTrack=pts;}
89   void      SetInitTrackParamsMeth(Int_t meth=1)                        {fInitTrackParamsMeth=meth;}
90   Bool_t    InitRiemanFit();
91   Int_t     InitModuleParams();
92   Int_t     CheckCurrentTrack();
93   Bool_t    CheckVolumeID(UShort_t voluid)                        const;
94   Int_t     IsDefined(UShort_t voluid)                            const;
95   Int_t     IsContained(UShort_t voluid)                          const;
96   Int_t     CalcIntersectionPoint(Double_t *lpar, Double_t *gpar);
97   Int_t     CalcDerivatives(Int_t paridx, Bool_t islpar);
98   Double_t* GetLocalIntersectionPoint()                           const {return (Double_t*)fPintLoc;}
99   Double_t* GetGlobalIntersectionPoint()                          const {return (Double_t*)fPintGlo;}
100   AliTrackPointArray *SortTrack(const AliTrackPointArray *atp);
101   void      SetTemporaryExcludedModule(Int_t index)                     {fTempExcludedModule=index;}
102   Int_t     GetTemporaryExcludedModule()                          const {return fTempExcludedModule;}
103   //
104   // Hierarchical contraints
105   void      ConstrainModuleSubUnits(Int_t idm, Double_t val=0, UInt_t pattern=0xfffffff);
106   void      ConstrainOrphans(Double_t val=0,UInt_t pattern=0xfffffff);
107   void      ConstrainLinComb(const Int_t *modLst,const Float_t *wghLst, Int_t nmd, Double_t val=0, UInt_t pattern=0xfffffff);
108   //
109   void      PostConstrainModuleSubUnitsMedian(Int_t idm, Double_t val=0, UInt_t pattern=0xfffffff);
110   void      PostConstrainOrphansMedian(Double_t val=0, UInt_t pattern=0xfffffff);
111   //
112   //  Double_t* GetModuleConstrDerivs(Int_t matRow,Int_t matCol, TGeoHMatrix &matLoc);
113   //
114   // millepede methods
115   void      FixParameter(Int_t param, Double_t value);
116   void      AddConstraint(Double_t *factor, Double_t value );
117   void      InitGlobalParameters(Double_t *par);   
118   void      SetLocalDerivative(Int_t index, Double_t value)             {fLocalDerivatives[index] = value;}
119   void      SetGlobalDerivative(Int_t index, Double_t value)            {fGlobalDerivatives[index] = value;}  
120   //
121   Int_t     GlobalFit(Double_t *parameters=0,Double_t *errors=0,Double_t *pulls=0);
122   void      PrintGlobalParameters();
123   Double_t  GetParError(Int_t iPar);
124   Int_t     AddLocalEquation(Mille2Data &m);
125   void      SetLocalEquations(const Mille2Data *marr, Int_t neq);
126   //
127   // fitting stuffs
128   AliTrackPointArray *GetCurrentTrack()                                 {return fTrack;}
129   AliTrackPoint      *GetCurrentCluster()                               {return &fCluster;}
130   void      SetCurrentTrack(AliTrackPointArray *atp)                    {fTrack=atp;}
131   void      SetCurrentCluster(AliTrackPoint &atp)                       {fCluster=atp;}
132
133   // geometry stuffs
134   Int_t     GetNModules()                   const {return fNModules;}
135   Int_t     GetCurrentModuleIndex()         const {return fCurrentModule ? fCurrentModule->GetIndex():-1;}
136   TGeoHMatrix *GetCurrentModuleHMatrix()    const {return fCurrentModule ? fCurrentModule->GetMatrix():0;}
137   Double_t *GetCurrentModuleTranslation()   const {return fCurrentModule ? fCurrentModule->GetMatrix()->GetTranslation():0;}
138   Int_t     GetCurrentModuleInternalIndex() const {return fCurrentModule ? fCurrentModule->GetUniqueID():-1;}
139   Int_t     GetTotBadLocEqPoints()          const {return fTotBadLocEqPoints;}
140   //
141   AliITSAlignMille2Module*  GetMilleModuleByVID(UShort_t voluid) const; // get pointer to the defined supermodule
142   AliITSAlignMille2Module*  GetMilleModule(Int_t id)             const {return (AliITSAlignMille2Module*)fMilleModule[id];}
143   AliITSAlignMille2Module*  GetCurrentModule()                   const {return fCurrentModule;}
144   AliITSAlignMille2Module*  GetSuperModule(Int_t id)             const {return (AliITSAlignMille2Module*)fSuperModule[id];}
145   //
146   // debug stuffs
147   Double_t  *GetMeasLoc()                                        const {return (Double_t*)fMeasLoc;}
148   Double_t  *GetSigmaLoc()                                       const {return (Double_t*)fSigmaLoc;}
149   Double_t   GetBField()                                         const {return fBField;}
150   Double_t  *GetLocalInitParam()                                 const {return (Double_t*)fLocalInitParam;}
151   Double_t  *GetLocalInitParEr()                                 const {return (Double_t*)fLocalInitParEr;}
152   Double_t   GetLocalDX()                                        const {return fDerivativeLoc[0];}
153   Double_t   GetLocalDY()                                        const {return fDerivativeLoc[1];}
154   Double_t   GetLocalDZ()                                        const {return fDerivativeLoc[2];}
155   Double_t   GetLocalDif(int i)                                  const {return fDerivativeLoc[i];}
156   Double_t   GetParSigTranslations()                             const {return fParSigTranslations;}
157   Double_t   GetParSigRotations()                                const {return fParSigRotations;}
158   Int_t      GetPreAlignmentQualityFactor(Int_t index)           const;// if not prealign. return -1
159   void       SetBug(Int_t bug) {fBug=bug;}                             // 1:SSD inversion sens.18-19
160   static AliITSAlignMille2* GetInstance()                              {return fgInstance;}
161   //
162  private:
163   //
164   // configuration methods
165   Int_t     LoadConfig(const Char_t *cfile="AliITSAlignMille.conf");
166   Int_t     LoadSuperModuleFile(const Char_t *cfile="ITSMilleSuperModules.root");
167   void      ResetLocalEquation();
168   void      InitGeometry();
169   Int_t     ApplyToGeometry();
170   //
171   // millepede methods
172   void      Init(Int_t nGlobal, Int_t nLocal, Int_t nStdDev);
173   //
174   AliITSAlignMille2(const AliITSAlignMille2& rhs);
175   AliITSAlignMille2& operator=(const AliITSAlignMille2& rhs);
176   //
177  protected:
178   //
179   // millepede stuffs
180   AliMillePede2 *fMillepede;                    // Detector independent alignment class
181   Double_t      fStartFac;                      // Initial value for chi2 cut 
182   Double_t      fResCutInitial;                 // Cut on residual for first iteration
183   Double_t      fResCut;                        // Cut on residual for other iterations 
184   Int_t         fNGlobal;                       // Number of global parameters
185   Int_t         fNLocal;                        // Number of local parameters
186   Int_t         fNStdDev;                       // Number of standard deviations for chi2 cut
187   Bool_t        fIsMilleInit;                   // Flag for initialization
188   Bool_t        fSensorsIn;                     // Are sensors explicitly provieded by the conf file?
189   Double_t      fParSigTranslations;            // init sigma for transl. params [cm]
190   Double_t      fParSigRotations;               // init sigma for rot. params [deg]
191   //
192   // fitting stuffs
193   AliITSAlignMille2Module *fCurrentModule;      // Current SuperModule index
194   AliTrackPointArray *fTrack;                   // pointer to current track 
195   AliTrackPoint fCluster;                       // current cluster
196   Double_t     *fGlobalDerivatives;             // Array of global derivatives
197   Double_t      fLocalDerivatives[kNLocal];     // Array of local deriv.
198   Double_t      fLocalInitParam[kNLocal];       // Array with inital values for local parameters for current track
199   Double_t      fLocalInitParEr[kNLocal][kNLocal];// Array with inital values for local parameters for current track
200   Double_t      fModuleInitParam[kNParCh];      // Array with inital values for current module parameters (init geometry)
201   Double_t      fPintLoc[3]; 
202   Double_t      fPintLoc0[3];
203   Double_t      fPintGlo[3]; 
204   Double_t      fMeasLoc[3];                    // current point local coordinates (the original ones)
205   Double_t      fMeasGlo[3];                    // current point glob. coord (AliTrackPoint)
206   Double_t      fSigmaLoc[3];                   // stdev current point
207   Double_t      fSigmaFactor[3];                // multiplicative factor for cluster sigmaX,Y,Z
208   //
209   Double_t      fDerivativeLoc[3];              // localXYZ deriv.
210   Int_t         fMinNPtsPerTrack;               // min number of points per track to accept it
211   Int_t         fInitTrackParamsMeth;           // method for track fit
212   Int_t         fTotBadLocEqPoints;             // total number of reject points because of bad EqLoc
213   AliTrackFitterRieman *fRieman;                // riemann fitter for helices
214   //
215   // >> new members
216   Bool_t        fUseGlobalDelta;  // intetpret deltas as global 
217   Bool_t        fRequirePoints;   // required points in specific layers
218   Int_t         fNReqLayUp[6];    /// number of points required in layer[n] with Y>0
219   Int_t         fNReqLayDown[6];  /// number of points required in layer[n] with Y<0
220   Int_t         fNReqLay[6];      /// number of points required in layer[n] 
221   Int_t         fNReqDetUp[3];    /// number of points required in Detector[n] with Y>0
222   Int_t         fNReqDetDown[3];  /// number of points required in Detector[n] with Y<0
223   Int_t         fNReqDet[3];      /// number of points required in Detector[n]
224   Int_t         fTempExcludedModule; /// single module temporary excluded from initial fit
225   // << new members
226   //
227   // geometry stuffs
228   TString       fGeometryFileName;              // Geometry file name
229   TString       fPreAlignmentFileName;          // file with prealigned objects
230   TGeoManager  *fGeoManager;
231   Bool_t        fIsConfigured;
232   TArrayS       fPreAlignQF;
233   //
234   TClonesArray* fPrealignment; // array of prealignment global deltas
235   TObjArray     fMilleModule; /// array of super modules to be aligned
236   TObjArray     fSuperModule; /// array of super modules defined in supermodule file
237   Int_t         fNModules;                      // number of defined modules from config file
238   Int_t         fNSuperModules; /// number of custom supermodules in SM file
239   Bool_t        fUsePreAlignment;               // start from prealigned setup 
240   Bool_t        fUseSortedTracks;               // default is kTRUE 
241   Bool_t        fBOn;                           // magentic field ON
242   Double_t      fBField;                        // value of magnetic field
243   Int_t         fBug;                           /// tag for temporary bug correction
244   //
245   static AliITSAlignMille2* fgInstance;         // global pointer on itself
246   static Int_t              fgInstanceID;       // global counter of the instances
247   ClassDef(AliITSAlignMille2, 0)
248
249 };
250
251 #endif