]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/AliITSAlignMille2.h
Major updates for millipede2 and related classes (Ruben)
[u/mrichter/AliRoot.git] / ITS / AliITSAlignMille2.h
1 #ifndef ALIITSALIGNMILLE2_H
2 #define ALIITSALIGNMILLE2_H
3
4 /* Copyright(c) 2007-2009 , ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                                */
6
7 /* $Id$ */
8 //-----------------------------------------------------------------------------
9 //
10 //  Interface to AliMillePede2 alignment class for the ALICE ITS detector
11 // 
12 //  ITS specific alignment class which interface to AliMillepede.   
13 //  For each track ProcessTrack calculates the local and global derivatives
14 //  at each hit and fill the corresponding local equations. Provide methods for
15 //  fixing or constraining detection elements for best results. 
16 // 
17 //  author M. Lunardon (thanks to J. Castillo), ruben.shahoyan@cern.ch
18 //-----------------------------------------------------------------------------
19
20 #include <TString.h>
21 #include <TObject.h>
22 #include <TGeoMatrix.h>
23 #include <TArrayS.h>
24 #include <TArrayD.h>
25 #include "AliTrackPointArray.h"
26 #include "AliITSAlignMille2Module.h"
27
28 class TSystem;
29 class TGeoManager;
30 class TVirtualFitter;
31 class AliMillePede2;
32 class AliAlignObjParams;
33 class AliTrackFitterRieman;
34 class AliITSAlignMille2Constraint;
35 class AliITSAlignMille2ConstrArray;
36 class AliITSresponseSDD;
37 class AliITSTPArrayFit;
38 class AliITSsegmentationSDD;
39 class AliITSDriftSpeedArraySDD;
40 class AliCDBEntry;
41
42 class AliITSAlignMille2: public TObject
43 {
44  public:
45   enum {kX,kY,kZ};
46   enum {kCosmics, kCollision, kNDataType};
47   enum {kNLocal=5,kMaxPoints=100,
48         kNParChGeom = AliITSAlignMille2Module::kMaxParGeom,
49         kNParCh     = AliITSAlignMille2Module::kMaxParTot,
50         kMaxITSSensID=2197,kVtxSensID=kMaxITSSensID+1,kMaxITSSensVID=14300,kVtxSensVID=14371,
51         kMinITSSupeModuleID=14336,
52         kSDDoffsID=240,kNSDDmod=260};
53   //
54   enum {kSameInitDeltasBit=BIT(14),kSameInitSDDRespBit=BIT(15),kSameInitSDDVDriftBit=BIT(16),kSameDiamondBit=BIT(17)};
55  public:
56   //
57   AliITSAlignMille2(const Char_t *configFilename="AliITSAlignMille.conf",TList* userInfo=0);
58   virtual ~AliITSAlignMille2();
59   //
60   AliMillePede2* GetMillePede()                                   const {return fMillepede;}
61   AliITSTPArrayFit* GetTPAFitter()                                const {return fTPAFitter;}
62   //
63   // configuration methods
64   //
65   Int_t     IsVIDDefined(UShort_t voluid)                         const;
66   Int_t     IsVIDContained(UShort_t voluid)                       const;
67   Int_t     IsSymDefined(const Char_t* name)                      const;
68   Int_t     IsSymContained(const Char_t* name)                    const;
69   Int_t     GetRequestedModID(UShort_t voluid)                    const;
70   //
71   Int_t     GetModuleIndex(const Char_t *symname);
72   Int_t     GetModuleIndex(UShort_t voluid);
73   UShort_t  GetModuleVolumeID(const Char_t *symname);
74   UShort_t  GetModuleVolumeID(Int_t index);
75   AliITSAlignMille2Module*  GetMilleModuleByVID(UShort_t voluid) const; // get pointer to the defined supermodule
76   AliITSAlignMille2Module*  GetMilleModuleBySymName(const Char_t* symname) const; // get pointer to the defined supermodule
77   AliITSAlignMille2Module*  GetMilleModuleIfContained(const Char_t* symname) const;
78   AliITSAlignMille2Module*  GetMilleModule(Int_t id)             const {return (AliITSAlignMille2Module*)fMilleModule[id];}
79   AliITSAlignMille2Module*  GetCurrentModule()                   const {return fCurrentModule;}
80   AliITSAlignMille2Module*  GetSuperModule(Int_t id)             const {return (AliITSAlignMille2Module*)fSuperModule[id];}
81   AliITSAlignMille2Module*  CreateVertexModule();
82   //
83   AliAlignObjParams*        GetPrealignedObject(const Char_t* symname) const;
84   AliAlignObjParams*        GetConstrRefObject(const Char_t* symname) const;
85   //
86   void          ConvertParamsToGlobal();
87   void          ConvertParamsToLocal();
88   //
89   const Char_t* GetGeometryPath()                                   {return fGeometryPath.Data();}
90   const Char_t* GetPreAlignmentPath()                               {return fPreDeltaPath.Data();}
91   TClonesArray* GetPreAlignmentDeltas()                           const {return fPrealignment;}
92   AliITSresponseSDD* GetSDDPrecalResp()                           const {return fPreRespSDD;}
93   AliITSresponseSDD* GetSDDInitResp()                             const {return fIniRespSDD;}
94   TObjArray*         GetSDDInitVDrift()                           const {return fIniVDriftSDD;}
95   void      PrintCurrentModuleInfo()                              const {if (fCurrentModule) fCurrentModule->Print();}
96   void      Print(Option_t*)                                      const;
97   Bool_t    IsConfigured()                                        const {return fIsConfigured;}
98   Bool_t    GetUseGlobalDelta()                                   const {return fUseGlobalDelta;}
99   Bool_t    IsConstraintWrtRef()                                  const {return fConstrRef!=0;}
100   Bool_t    FixedOrphans()                                        const;
101   Bool_t    IsLocalYError()                                       const {return fUseLocalYErr;}
102   //
103   // geometry stuffs
104   Int_t     GetNModules()                   const {return fNModules;}
105   Int_t     GetCurrentModuleIndex()         const {return fCurrentModule ? fCurrentModule->GetIndex():-1;}
106   TGeoHMatrix *GetCurrentModuleHMatrix()    const {return fCurrentModule ? fCurrentModule->GetMatrix():0;}
107   Double_t *GetCurrentModuleTranslation()   const {return fCurrentModule ? fCurrentModule->GetMatrix()->GetTranslation():0;}
108   Int_t     GetCurrentModuleInternalIndex() const {return fCurrentModule ? Int_t(fCurrentModule->GetUniqueID()):-1;}
109   Int_t     GetTotBadLocEqPoints()          const {return fTotBadLocEqPoints;}
110   Int_t     GetNConstraints()               const {return fConstraints.GetLast()+1;}
111   Int_t     InitModuleParams();
112   //
113   // fitting methods
114   AliTrackFitterRieman *GetRiemanFitter()   const                       {return fRieman;}
115   AliTrackPointArray   *PrepareTrack(const AliTrackPointArray *track); 
116   AliTrackPointArray *GetCurrentTrack()     const                       {return (AliTrackPointArray*)fTrack;}
117   AliTrackPoint      *GetCurrentCluster()   const                       {return (AliTrackPoint*)&fCluster;}
118   void      ProcessSDDPointInfo(const AliTrackPoint* pnt,Int_t sID, Int_t pntID);
119   void      SetCurrentTrack(const AliTrackPointArray *atp)              {fTrack = (AliTrackPointArray*)atp;}
120   void      SetCurrentCluster(const AliTrackPoint &atp);
121   void      InitTrackParams(int meth=1);
122   Int_t     ProcessTrack(const AliTrackPointArray *track, Double_t wgh=1.0);
123   Int_t     FitTrack();
124   Int_t     CheckCurrentTrack();
125   //
126   Int_t     CalcIntersectionPoint(Double_t *lpar, Double_t *gpar);
127   Int_t     CalcDerivatives(Int_t paridx, Bool_t islpar);
128   void      JacobianPosGloLoc(int locid,double* jacobian);
129   Double_t* GetLocalIntersectionPoint()                           const {return (Double_t*)fPintLoc;}
130   Double_t* GetGlobalIntersectionPoint()                          const {return (Double_t*)fPintGlo;}
131   AliTrackPointArray *SortTrack(const AliTrackPointArray *atp);
132   void      SetTemporaryExcludedModule(Int_t index)                     {fTempExcludedModule=index;}
133   Int_t     GetTemporaryExcludedModule()                          const {return fTempExcludedModule;}
134   Double_t  GetMeasGlo(Int_t dim)                                 const {return fMeasGlo[dim];}
135   Double_t  GetMeasLoc(Int_t dim)                                 const {return fMeasLoc[dim];}
136   Int_t     GetCurrentLayer()                                     const;
137   void      SetBField(Double_t b=0);
138   void      SetTypeCosmics()                                            {fDataType = kCosmics;}
139   void      SetTypeCollision()                                          {fDataType = kCollision;}
140   void      SetDataType(Int_t tp=kCosmics)                              {fDataType = tp>=0&&tp< kNDataType ? tp:kCosmics;}
141   void      SetUseLocalYErrors(Bool_t v=kTRUE)                          {fUseLocalYErr = v && fTPAFitter;}
142   void      SetMinPointsPerSensor( Int_t n )                            {fMinPntPerSens = n>0 ? n:0;}
143   Int_t     GetMinPointsPerSensor()                               const {return fMinPntPerSens;}
144   void      ConstrainHelixFitPT(  Int_t q=0,Double_t pt=-1, Double_t err=-1);
145   void      ConstrainHelixFitCurv(Int_t q=0,Double_t crv=-1,Double_t crverr=-1);
146   void      RemoveHelixFitConstraint();
147   Double_t  GetHelixContraintCharge()                             const {return fConstrCharge;}
148   Double_t  GetHelixContraintPT()                                 const {return fConstrPT;}
149   Double_t  GetHelixContraintPTErr()                              const {return fConstrPTErr;}
150   Int_t     GetDataType()                                         const {return fDataType;}
151   //
152   TGeoHMatrix* GetSensorOrigMatrixSID(Int_t sid)                  const;
153   TGeoHMatrix* GetSensorOrigMatrixVID(Int_t vid)                  const;
154   //
155   TGeoHMatrix* GetSensorCurrMatrixSID(Int_t sid)                  const;
156   TGeoHMatrix* GetSensorCurrMatrixVID(Int_t vid)                  const;
157   //
158   AliCDBEntry* GetCDBEntry(const char* path);
159   // Hierarchical contraints
160   void      TieSDDVDriftsLR(AliITSAlignMille2Module* mod);
161   Bool_t    PseudoParentsAllowed()                                const {return fAllowPseudoParents;}
162   void      ConstrainModuleSubUnitsMean(Int_t idm, Double_t val=0, UInt_t pattern=0xff);
163   void      ConstrainModuleSubUnitsMedian(Int_t idm, Double_t val=0, UInt_t pattern=0xff);
164   void      ConstrainOrphansMean(Double_t val=0, UInt_t pattern=0xff);
165   void      ConstrainOrphansMedian(Double_t val=0, UInt_t pattern=0xff);
166   void      ConstrainLocal(const Char_t* name,Double_t *parcf,Int_t npar,Double_t val,Double_t err);
167   //
168   void      ApplyGaussianConstraint(const AliITSAlignMille2ConstrArray* cstr);
169   void      ApplyPreConstraints();
170   void      ApplyPostConstraints();
171   //
172   void      SetWeightPt(Double_t w=1)                                   {fWeightPt = w;}
173   void      SetSDDVDCorrMult(Bool_t v=kTRUE)                            {fIsSDDVDriftMult=v;}   
174   Double_t  GetWeightPt()                                         const {return fWeightPt;}
175   Bool_t    IsSDDVDCorrMult()                                     const {return fIsSDDVDriftMult;}
176   Bool_t    IsParModConstrained(const AliITSAlignMille2Module* mod,Int_t par, Bool_t &meanmed, Bool_t &gaussian) const;
177   Bool_t    IsParModFamilyVaried(const AliITSAlignMille2Module* mod,Int_t par,Int_t depth=999)             const;
178   Bool_t    IsParFamilyFree(const AliITSAlignMille2Module* mod,Int_t par,Int_t depth=999)                  const;
179   //
180   // millepede methods
181   Int_t     GlobalFit();
182   void      FixParameter(Int_t param, Double_t value);
183   void      PrintGlobalParameters();
184   //
185   TClonesArray*      CreateDeltas();
186   AliITSresponseSDD* CreateSDDResponse();
187   // module specific 
188   //
189   Double_t  GetTDriftSDD()                  const;
190   Double_t  GetVDriftSDD()                  const;
191   Double_t  GetDriftSpeed(Int_t id)         const {return fDriftSpeed[id];}
192   Double_t  GetDriftTime0(Int_t id)         const {return fDriftTime0[id];}
193
194   //
195   AliITSAlignMille2Constraint* GetConstraint(Int_t i)            const {return (AliITSAlignMille2Constraint*)fConstraints.At(i);}
196   AliITSAlignMille2Constraint* GetConstraint(const char* name)   const {return (AliITSAlignMille2Constraint*)fConstraints.FindObject(name);}
197   //
198   // debug stuffs
199   void       FetchCluster(int ip)                                      {fTrack->GetPoint(fCluster,ip);fCluster.SetUniqueID(ip);} 
200   void       SetLocalInitParams(const Double_t *par)                   {for (int i=kNLocal;i--;) fLocalInitParam[i]=par[i];}
201   Bool_t     IsTypeCosmics()                                     const {return fDataType==kCosmics;}
202   Bool_t     IsTypeCollision()                                   const {return fDataType==kCollision;}
203   Double_t  *GetMeasLoc()                                        const {return (Double_t*)fMeasLoc;}
204   Double_t  *GetSigmaLoc()                                       const {return (Double_t*)fSigmaLoc;}
205   Double_t   GetBField()                                         const {return fBField;}
206   Bool_t     IsFieldON()                                         const {return fBOn;}
207   Bool_t     IsDiamondUsed()                                     const {return fUseDiamond;}
208   Double_t  *GetLocalInitParam()                                 const {return (Double_t*)fLocalInitParam;}
209   Double_t  *GetLocalInitParEr()                                 const {return (Double_t*)fLocalInitParEr;}
210   Double_t   GetLocalDif(int par, int coor)                      const {return fDerivativeLoc[par][coor];}
211   Double_t   GetGlobalDif(int par, int coor)                     const {return fDerivativeGlo[par][coor];}
212   Int_t      GetPreAlignmentQualityFactor(Int_t index)           const;// if not prealign. return -1
213   void       SetBug(Int_t bug) {fBug=bug;}                             // 1:SSD inversion sens.18-19
214   static     AliITSAlignMille2* GetInstance()                          {return fgInstance;}
215
216   // pepo270809
217   Int_t      GetExtraClustersMode() const {return fExtraClustersMode;}
218   void       SetExtraClustersMode(Int_t mode) {fExtraClustersMode=mode;}  
219   // endpepo270809
220
221   // pepo
222   // flag for AliITSAlignMille compatibility
223   Int_t      GetMilleVersion() const {return fMilleVersion;}
224   void       SetMilleVersion(Int_t m1) {fMilleVersion=m1;}
225   // modified existing methods
226   void      SetCurrentModule(Int_t id);
227   // old methods recovered
228   Int_t     IsDefined(UShort_t voluid) const {return IsVIDDefined(voluid);}
229   Int_t     IsContained(UShort_t voluid) const {return IsVIDContained(voluid);}
230   // moved from private to public
231   void      SetRequiredPoint(Char_t* where, Int_t ndet, Int_t updw, Int_t nreqpts,Int_t runtype=-1); 
232   Bool_t    InitRiemanFit();
233   void      SetMinNPtsPerTrack(Int_t pts=3)  {fMinNPtsPerTrack=pts;}
234   //
235   static Bool_t    IsZero(Double_t v,Double_t threshold = 1e-15)       { return TMath::Abs(v)<threshold; }
236   static void      SetWordBit(UInt_t word,Int_t bitID)                 { word |= (1<<bitID);}
237   static void      ResetWordBit(UInt_t word,Int_t bitID)               { word &= ~(1<<bitID);}
238   static Bool_t    TestWordBit(UInt_t word,Int_t bitID)                { return (Bool_t)(word&(1<<bitID));}      
239   //
240  protected:
241   //
242   struct Mille2Data { // structure to store data for LocalEquations (X and Z, optionally Y)
243     enum {kMaxLev = 7};
244     Double_t fMeas[3];                // measured coordinates
245     Double_t fSigma[3];               // measured errors
246     Double_t fDerLoc[kNLocal][3];     // calculated local derivatives
247     Int_t    fNModFilled, fNGlobFilled, fModuleID[kMaxLev]; // used module info
248     Int_t    fParMilleID[AliITSAlignMille2Module::kMaxParTot*kMaxLev]; // param id's
249     Double_t fDerGlo[AliITSAlignMille2Module::kMaxParTot*kMaxLev][3]; // global derivatives
250   };
251   //
252   // configuration methods
253   void      Init();
254   Int_t     CacheMatricesOrig();
255   Int_t     CacheMatricesCurr();
256   Int_t     ProcessUserInfo(TList *userInfo=0);
257   Int_t     LoadConfig(const Char_t *cfile="AliITSAlignMille.conf");
258   TObjArray* GetConfigRecord(FILE* stream, TString& recTitle, TString& recOpt, Bool_t rew);
259   Int_t     CheckConfigRecords(FILE* stream);
260   Int_t     ReloadInitCalib(TList *userInfo);
261   Int_t     ReloadInitCalib();
262   //
263   void      BuildHierarchy();
264   Int_t     LoadSuperModuleFile(const Char_t *cfile="ITSMilleSuperModules.root");
265   Int_t     LoadSDDResponse(TString& path, AliITSresponseSDD *&resp);
266   Int_t     LoadSDDVDrift(TString& path, TObjArray *&arr);
267   Int_t     LoadDeltas(TString& path, TClonesArray *&arr);
268   Int_t     LoadDiamond(TString& path);
269   void      ResetLocalEquation();
270   Int_t     InitGeometry();
271   Int_t     ApplyToGeometry();
272   //
273   void      ConstrainModuleSubUnits(Int_t idm, Double_t val=0, UInt_t pattern=0xff);
274   void      ConstrainOrphans(Double_t val=0,UInt_t pattern=0xff);
275   void      PostConstrainModuleSubUnits(Int_t type,Int_t idm, Double_t val, UInt_t pattern);
276   void      PostConstrainOrphans(Int_t type,Double_t val, UInt_t pattern);
277   //
278   void      SetGeometryPath(const Char_t* filename="geometry.root") { fGeometryPath = filename; }
279
280   void      SetInitTrackParamsMeth(Int_t meth=1)                        {fIniTrackParamsMeth=meth;}
281   //
282   void      AddConstraint(Double_t *factor, Double_t value, Double_t sigma=0);
283   void      InitGlobalParameters(Double_t *par);
284   Bool_t    SetLocalDerivative(Int_t index, Double_t value)             {return IsZero(fLocalDerivatives[index]=value);}
285   Bool_t    SetGlobalDerivative(Int_t index, Double_t value)            {return IsZero(fGlobalDerivatives[index]=value);}  
286   //
287   // millepede methods
288   //
289   Int_t     AddLocalEquation(Mille2Data &m);
290   Int_t     AddLocalEquationTPA(Mille2Data &m);
291   void      SetLocalEquations(const Mille2Data *marr, Int_t neq);
292   void      SetUseGlobalDelta(Bool_t v=kTRUE)                           {fUseGlobalDelta = v;}
293   void      SetAllowPseudoParents(Bool_t v=kTRUE)                       {fAllowPseudoParents = v;} 
294   Int_t     SetConstraintWrtRef(const char* reffname);
295   //
296   AliITSAlignMille2(const AliITSAlignMille2& rhs);
297   AliITSAlignMille2& operator=(const AliITSAlignMille2& rhs);
298   //
299  protected:
300   //
301   enum {
302     kOCDBDefaultPath,
303     kOCDBSpecificPath,
304     kGeomFile,
305     kSuperModileFile,
306     kConstrRefFile,
307     kPreDeltaFile,
308     kPreCalSDDFile,
309     kPreVDriftSDDFile,
310     kInitCalSDDFile,
311     kInitVDriftSDDFile,
312     kInitDeltaFile,
313     kGlobalDeltas,
314     kConstrLocal,
315     kModVolID,
316     kModIndex,
317     kPseudoParents,
318     kTrackFitMethod,
319     kMinPntTrack,
320     kNStDev,
321     kResCutInit,
322     kResCutOther,
323     kLocalSigFactor,
324     kStartFactor,
325     kFinalFactor,
326     kBField,
327     kSparseMatrix,
328     kRequirePoint,
329     kConstrOrphans,
330     kConstrSubunits,
331     kApplyConstr,
332     kExtraClustersMode,
333     kTPAFitter,
334     kUseLocalYErr,
335     kMinPointsSens,
336     kSDDVDCorrMult,
337     kWeightPt,
338     kUseDiamond,
339     kSameSDDT0,
340     //
341     kNKeyWords
342   };                                            // id's of the keywirds for config file records
343
344   // millepede stuffs
345   AliMillePede2 *fMillepede;                    // Detector independent alignment class
346   Double_t      fStartFac;                      // Initial factor for chi2 cut 
347   Double_t      fFinalFac;                      // Final factor for chi2 cut 
348   Double_t      fResCutInitial;                 // Cut on residual for first iteration
349   Double_t      fResCut;                        // Cut on residual for other iterations 
350   Int_t         fNGlobal;                       // Number of global parameters
351   Int_t         fNLocal;                        // Number of local parameters
352   Int_t         fNStdDev;                       // Number of standard deviations for chi2 cut
353   Bool_t        fIsMilleInit;                   // Flag for initialization
354   Bool_t        fAllowPseudoParents;            // For simple constraints don't involve parents into the fit
355   //
356   // fitting stuffs
357   AliITSTPArrayFit        *fTPAFitter;          // TPArrayFitter       
358   AliITSAlignMille2Module *fCurrentModule;      // Current SuperModule index
359   AliTrackPointArray *fTrack;                   // pointer to current track 
360   TObjArray     fTrackBuff;                     // buffer for tracks of min length
361   AliTrackPoint fCluster;                       // current cluster
362   Int_t         fCurrentSensID;                 // sensor index for current cluster
363   TArrayD       fClusLoc;                       // local  coordinates of the clusters
364   TArrayD       fClusGlo;                       // global coordinates of the clusters
365   TArrayD       fClusSigLoc;                    // local cov matrix of the clusters
366   Double_t     *fGlobalDerivatives;             // Array of global derivatives
367   Double_t      fLocalDerivatives[kNLocal];     // Array of local deriv.
368   Double_t      fLocalInitParam[kNLocal];       // Array with inital values for local parameters for current track
369   Double_t      fLocalInitParEr[kNLocal][kNLocal];// Array with inital values for local parameters for current track
370   Double_t      fModuleInitParam[kNParCh];      // Array with inital values for current module parameters (init geometry)
371   Double_t      fPintLoc[3];                    // track/module intersection point in local coordinates
372   Double_t      fPintLoc0[3];                   // track/module intersection point in local coordinates (before variation)
373   Double_t      fPintGlo[3];                    // track/module intersection point in global coordinates
374   Double_t     *fMeasLoc;                       // current point local coordinates (the original ones)
375   Double_t     *fMeasGlo;                       // current point glob. coord (AliTrackPoint)
376   Double_t     *fSigmaLoc;                      // stdev current point
377   Double_t      fSigmaFactor[3];                // multiplicative factor for cluster sigmaX,Y,Z
378   Double_t      fConstrPT;                      // optional PT constraint for helix (abs value)
379   Double_t      fConstrPTErr;                   // error on this constraint (0 - exact)
380   Int_t         fConstrCharge;                  // optional constraint on charge of Helix track (0 - no constraint)
381   //
382   Double_t      fDerivativeLoc[kNLocal][3];     // XYZ deriv. over local params
383   Double_t      fDerivativeGlo[kNParCh][3];     // XYZ deriv. over global params
384   Int_t         fMinNPtsPerTrack;               // min number of points per track to accept it
385   Int_t         fIniTrackParamsMeth;            // method for track fit
386   Int_t         fTotBadLocEqPoints;             // total number of reject points because of bad EqLoc
387   AliTrackFitterRieman *fRieman;                // riemann fitter for helices
388   //
389   TObjArray     fConstraints;                   // list of constraints
390   TObjArray     fCacheMatrixOrig;               // cach for original geom matrices
391   TObjArray     fCacheMatrixCurr;               // cach for prealigned geom matrices
392   // >> new members
393   Bool_t        fUseGlobalDelta;                // intetpret deltas as global 
394   Bool_t        fRequirePoints[kNDataType];     // required points in specific layers
395   Int_t         fNReqLayUp[kNDataType][6];      // number of points required in layer[n] with Y>0
396   Int_t         fNReqLayDown[kNDataType][6];    // number of points required in layer[n] with Y<0
397   Int_t         fNReqLay[kNDataType][6];        // number of points required in layer[n] 
398   Int_t         fNReqDetUp[kNDataType][3];      // number of points required in Detector[n] with Y>0
399   Int_t         fNReqDetDown[kNDataType][3];    // number of points required in Detector[n] with Y<0
400   Int_t         fNReqDet[kNDataType][3];        // number of points required in Detector[n]
401   Int_t         fTempExcludedModule; /// single module temporary excluded from initial fit
402   // << new members
403   //
404   // OCDB stuff
405   TList        *fIniUserInfo;                   // initial user info (validity is not guaranteed after initialization)
406   TString       fIniDeltaPath;                  // where to take the deltas used to produce the points
407   TString       fIniSDDRespPath;                // where to take the initial SDD response used to produce the points
408   TString       fPreCalSDDRespPath;             // precalibration SDD response file name
409   TString       fIniSDDVDriftPath;              // initial SDD vdrift file name
410   TString       fPreSDDVDriftPath;              // initial SDD vdrift file name
411   // geometry stuffs
412   TString       fGeometryPath;                  // Geometry file name
413   TString       fPreDeltaPath;                  // file with prealigned objects
414   TString       fConstrRefPath;                 // file with prealigned objects wrt which constraints are defined
415   TString       fDiamondPath;                   // file with diamond constraint
416   TGeoManager  *fGeoManager;                    // pointer to Alice geomanager
417   Bool_t        fIsConfigured;                  // flag for loaded config file
418   TArrayS       fPreAlignQF;                    // prealignment flags (not used?)
419   //
420   AliITSresponseSDD* fIniRespSDD;               // array of SDD t0/vdrift calib params used to create the track points
421   AliITSresponseSDD* fPreRespSDD;               // array of SDD t0/vdrift calib params
422   TObjArray*         fIniVDriftSDD;             // array of AliITSDriftSpeedArraySDD objects used for original reco
423   TObjArray*         fPreVDriftSDD;             // array of AliITSDriftSpeedArraySDD objects to be used as a starting point instead of fIniVDriftSDD
424   AliITSsegmentationSDD* fSegmentationSDD;      // extraction of SDD segmentation params
425   TClonesArray* fPrealignment; // array of prealignment global deltas
426   TClonesArray* fConstrRef;    // array of refererence deltas with respect to which the constraint are defined (survey?)
427   TObjArray     fMilleModule; /// array of super modules to be aligned
428   TObjArray     fSuperModule; /// array of super modules defined in supermodule file
429   Int_t         fNModules;                      // number of defined modules from config file
430   Int_t         fNSuperModules; /// number of custom supermodules in SM file
431   Bool_t        fUsePreAlignment;               // start from prealigned setup 
432   Bool_t        fUseLocalYErr;                  // use local Yerror due to the sensor thickness
433   Bool_t        fBOn;                           // magentic field ON
434   Double_t      fBField;                        // value of magnetic field
435   Int_t         fDataType;                      // is this cosmics or collision processing?
436   Int_t         fMinPntPerSens;                 // min number of points per module to vary it
437   Int_t         fBug;                           /// tag for temporary bug correction
438   // pepo
439   Int_t         fMilleVersion; /// tag for backward compatibility
440   // endpepo
441   // pepo270809
442   Int_t         fExtraClustersMode; /// 1=remove random / 2=remove internal / 10=use only tracks with xcl
443   // endpepo270809
444   //
445   Double_t      fTrackWeight;                      //weight given by the user to current track
446   Double_t      fWeightPt;                         //weight track equations by pT in this power
447   Bool_t        fIsSDDVDriftMult;                  //use multiplicative correction for SDD vdrift
448   Double_t      fDriftSpeed[50];                   //temporary array for drift times of SDD alitrackpoints
449   Double_t      fDriftTime0[50];                   //temporary array for drift time 0's used for SDD alitrackpoints
450   Double_t      fExtClusterPar[9];                 //array to store the parameters of the externally imposed cluster
451   AliTrackPoint fDiamond;                          //optional constraint on the vertex
452   AliTrackPoint fDiamondI;                         //constraint on the vertex with inverted error matrix
453   Bool_t        fUseDiamond;                       //use diamond as a vertex constraint
454   Int_t         fDiamondPointID;                   //ID of the diamond point in the track
455   Int_t         fDiamondModID;                     //id of the fake diamond module
456   //
457   static AliITSAlignMille2* fgInstance;         // global pointer on itself
458   static Int_t              fgInstanceID;       // global counter of the instances
459   static const Char_t     * fgkRecKeys[];       // keywords for config file records
460   static const Char_t       fgkXYZ[];           // XYZ labels
461   //
462   ClassDef(AliITSAlignMille2, 0)
463 };
464
465
466 //______________________________________________________________________________________
467 inline void AliITSAlignMille2::SetCurrentCluster(const AliTrackPoint &atp) 
468 {
469   // set current cluster
470   fCluster = atp; 
471   fCurrentSensID = AliITSAlignMille2Module::GetIndexFromVolumeID(fCluster.GetVolumeID());
472 }
473
474 //______________________________________________________________________________________
475 inline TGeoHMatrix* AliITSAlignMille2::GetSensorOrigMatrixSID(Int_t sid) const 
476 {
477   // get cached original matrix by sensor ID
478   return sid<0 ? 0 : (TGeoHMatrix*) fCacheMatrixOrig[sid];
479 }
480
481 //______________________________________________________________________________________
482 inline TGeoHMatrix* AliITSAlignMille2::GetSensorOrigMatrixVID(Int_t vid) const
483 {
484   // get cached original matrix by sensor volume ID
485   return GetSensorOrigMatrixSID( AliITSAlignMille2Module::GetIndexFromVolumeID(vid) );
486 }
487
488 //______________________________________________________________________________________
489 inline TGeoHMatrix* AliITSAlignMille2::GetSensorCurrMatrixSID(Int_t sid) const 
490 {
491   // get cached current matrix by sensor ID
492   return sid<0 ? 0 : (TGeoHMatrix*) fCacheMatrixCurr[sid];
493 }
494
495 //______________________________________________________________________________________
496 inline TGeoHMatrix* AliITSAlignMille2::GetSensorCurrMatrixVID(Int_t vid) const
497 {
498   // get cached current matrix by sensor volume ID
499   return GetSensorCurrMatrixSID( AliITSAlignMille2Module::GetIndexFromVolumeID(vid) );
500 }
501
502 #endif
503