]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSAlignMille2.h
load AddTaskEmcalJet.C
[u/mrichter/AliRoot.git] / ITS / AliITSAlignMille2.h
index 405ae4a11f08e1c28da9386e4d298da94c0ceeab..4cca31e8dac13a21d7416d5caba4daeb1ca91f80 100644 (file)
@@ -37,21 +37,31 @@ class AliITSresponseSDD;
 class AliITSTPArrayFit;
 class AliITSsegmentationSDD;
 class AliITSDriftSpeedArraySDD;
+class AliITSCorrectSDDPoints;
 class AliCDBEntry;
+class AliESDVertex;
 
 class AliITSAlignMille2: public TObject
 {
  public:
   enum {kX,kY,kZ};
   enum {kCosmics, kCollision, kNDataType};
-  enum {kNLocal=5,kMaxPoints=100,
+  enum {kNLocal=5,kMaxPoints=20,
        kNParChGeom = AliITSAlignMille2Module::kMaxParGeom,
        kNParCh     = AliITSAlignMille2Module::kMaxParTot,
        kMaxITSSensID=2197,kVtxSensID=kMaxITSSensID+1,kMaxITSSensVID=14300,kVtxSensVID=14371,
        kMinITSSupeModuleID=14336,
        kSDDoffsID=240,kNSDDmod=260};
   //
-  enum {kSameInitDeltasBit=BIT(14),kSameInitSDDRespBit=BIT(15),kSameInitSDDVDriftBit=BIT(16),kSameDiamondBit=BIT(17)};
+  enum {kCovIScaleBit=BIT(9),
+       kSameInitDeltasBit=BIT(14),
+       kSameInitSDDRespBit=BIT(15),
+       kSameInitSDDVDriftBit=BIT(16),
+       kSameDiamondBit=BIT(17),
+       kSameInitSDDCorrMapBit=BIT(18),
+       kSameInitGeomBit=BIT(19) };
+  //
+  enum {kDiamondIgnore,kDiamondCheckIfPrompt,kDiamondUse};
  public:
   //
   AliITSAlignMille2(const Char_t *configFilename="AliITSAlignMille.conf",TList* userInfo=0);
@@ -83,8 +93,8 @@ class AliITSAlignMille2: public TObject
   AliAlignObjParams*        GetPrealignedObject(const Char_t* symname) const;
   AliAlignObjParams*        GetConstrRefObject(const Char_t* symname) const;
   //
-  void          ConvertParamsToGlobal();
-  void          ConvertParamsToLocal();
+  void          ConvertParamsToGlobal() const;
+  void          ConvertParamsToLocal()  const;
   //
   const Char_t* GetGeometryPath()                                   {return fGeometryPath.Data();}
   const Char_t* GetPreAlignmentPath()                               {return fPreDeltaPath.Data();}
@@ -122,8 +132,19 @@ class AliITSAlignMille2: public TObject
   Int_t     ProcessTrack(const AliTrackPointArray *track, Double_t wgh=1.0);
   Int_t     FitTrack();
   Int_t     CheckCurrentTrack();
-  //
-  Int_t     CalcIntersectionPoint(Double_t *lpar, Double_t *gpar);
+  Bool_t    GetFixCurvIfConstraned()        const                       {return fFixCurvIfConstraned;}
+  void      SetFixCurvIfConstraned(Bool_t v=kTRUE)                      {fFixCurvIfConstraned = v;}
+  //
+  // methods for point unbiasing (via scaling its inverted cov.matrix)
+  Bool_t    IsCovIScaleTouched()                     const {return TestBit(kCovIScaleBit);}
+  void      TouchCovIScale(Bool_t v=kTRUE)                 {SetBit(kCovIScaleBit,v);}
+  Float_t   GetCovIScale(Int_t ip)                   const {return ip<kMaxPoints ? fCovIScale[ip]:-1.;}
+  Float_t*  GetCovIScale()                           const {return (Float_t*)fCovIScale;}
+  void      SetCovIScale(Int_t ip, Float_t v=-1.)          {if (ip<kMaxPoints) fCovIScale[ip] = v; TouchCovIScale();}
+  void      SetCovIScale(Float_t *v, Int_t np)             {for (int i=TMath::Min(np,kMaxPoints);i--;) fCovIScale[i]=v[i]; TouchCovIScale();}
+  void      ResetCovIScale()                               {for (int i=kMaxPoints;i--;) fCovIScale[i]=-1; TouchCovIScale(kFALSE);}
+  //
+  Int_t     CalcIntersectionPoint(const Double_t *lpar, const Double_t *gpar);
   Int_t     CalcDerivatives(Int_t paridx, Bool_t islpar);
   void      JacobianPosGloLoc(int locid,double* jacobian);
   Double_t* GetLocalIntersectionPoint()                           const {return (Double_t*)fPintLoc;}
@@ -144,6 +165,10 @@ class AliITSAlignMille2: public TObject
   void      ConstrainHelixFitPT(  Int_t q=0,Double_t pt=-1, Double_t err=-1);
   void      ConstrainHelixFitCurv(Int_t q=0,Double_t crv=-1,Double_t crverr=-1);
   void      RemoveHelixFitConstraint();
+  void      SetVertexConstraint(const AliESDVertex* vtx);
+  Bool_t    IsVertexSet()                                         const {return fVertexSet;}
+  void      RemoveVertexConstraint()                                    {fVertexSet = kFALSE;}
+  void      SetVertexSet(Bool_t v)                                      {fVertexSet = v;}
   Double_t  GetHelixContraintCharge()                             const {return fConstrCharge;}
   Double_t  GetHelixContraintPT()                                 const {return fConstrPT;}
   Double_t  GetHelixContraintPTErr()                              const {return fConstrPTErr;}
@@ -189,6 +214,7 @@ class AliITSAlignMille2: public TObject
   Double_t  GetTDriftSDD()                  const;
   Double_t  GetVDriftSDD()                  const;
   Double_t  GetDriftSpeed(Int_t id)         const {return fDriftSpeed[id];}
+  Double_t  GetDriftSpeed0(Int_t id)        const {return fDriftSpeed0[id];}
   Double_t  GetDriftTime0(Int_t id)         const {return fDriftTime0[id];}
 
   //
@@ -205,6 +231,9 @@ class AliITSAlignMille2: public TObject
   Double_t   GetBField()                                         const {return fBField;}
   Bool_t     IsFieldON()                                         const {return fBOn;}
   Bool_t     IsDiamondUsed()                                     const {return fUseDiamond;}
+  Int_t      GetCheckDiamondPoint()                              const {return fCheckDiamondPoint;}
+  void       SetCheckDiamondPoint(Int_t m=kDiamondCheckIfPrompt)       {fCheckDiamondPoint = m;}
+  Bool_t     IsVertexUsed()                                      const {return fUseVertex;}
   Double_t  *GetLocalInitParam()                                 const {return (Double_t*)fLocalInitParam;}
   Double_t  *GetLocalInitParEr()                                 const {return (Double_t*)fLocalInitParEr;}
   Double_t   GetLocalDif(int par, int coor)                      const {return fDerivativeLoc[par][coor];}
@@ -213,6 +242,7 @@ class AliITSAlignMille2: public TObject
   void       SetBug(Int_t bug) {fBug=bug;}                             // 1:SSD inversion sens.18-19
   static     AliITSAlignMille2* GetInstance()                          {return fgInstance;}
 
+  Int_t      LoadPreSDDCalib();
   // pepo270809
   Int_t      GetExtraClustersMode() const {return fExtraClustersMode;}
   void       SetExtraClustersMode(Int_t mode) {fExtraClustersMode=mode;}  
@@ -232,6 +262,11 @@ class AliITSAlignMille2: public TObject
   Bool_t    InitRiemanFit();
   void      SetMinNPtsPerTrack(Int_t pts=3)  {fMinNPtsPerTrack=pts;}
   //
+  Int_t     GetRunID()                                            const {return fRunID;}
+  void      SetRunID(int run)                                           {fRunID = run;}
+  //
+  AliITSCorrectSDDPoints * GetPreCorrMapSDD()                    const {return fPreCorrMapSDD;}
+  AliITSCorrectSDDPoints * GetIniCorrMapSDD()                    const {return fIniCorrMapSDD;}
   static Bool_t    IsZero(Double_t v,Double_t threshold = 1e-15)       { return TMath::Abs(v)<threshold; }
   static void      SetWordBit(UInt_t word,Int_t bitID)                 { word |= (1<<bitID);}
   static void      ResetWordBit(UInt_t word,Int_t bitID)               { word &= ~(1<<bitID);}
@@ -254,6 +289,7 @@ class AliITSAlignMille2: public TObject
   Int_t     CacheMatricesOrig();
   Int_t     CacheMatricesCurr();
   Int_t     ProcessUserInfo(TList *userInfo=0);
+  Int_t     GetPathFromUserInfo(const TList* cdbList,const char* calib,TString& path, Int_t useBit);
   Int_t     LoadConfig(const Char_t *cfile="AliITSAlignMille.conf");
   TObjArray* GetConfigRecord(FILE* stream, TString& recTitle, TString& recOpt, Bool_t rew);
   Int_t     CheckConfigRecords(FILE* stream);
@@ -262,12 +298,13 @@ class AliITSAlignMille2: public TObject
   //
   void      BuildHierarchy();
   Int_t     LoadSuperModuleFile(const Char_t *cfile="ITSMilleSuperModules.root");
+  Int_t     LoadGeometry(TString& path);
   Int_t     LoadSDDResponse(TString& path, AliITSresponseSDD *&resp);
   Int_t     LoadSDDVDrift(TString& path, TObjArray *&arr);
+  Int_t     LoadSDDCorrMap(TString& path, AliITSCorrectSDDPoints *&map);
   Int_t     LoadDeltas(TString& path, TClonesArray *&arr);
   Int_t     LoadDiamond(TString& path);
   void      ResetLocalEquation();
-  Int_t     InitGeometry();
   Int_t     ApplyToGeometry();
   //
   void      ConstrainModuleSubUnits(Int_t idm, Double_t val=0, UInt_t pattern=0xff);
@@ -293,6 +330,11 @@ class AliITSAlignMille2: public TObject
   void      SetAllowPseudoParents(Bool_t v=kTRUE)                       {fAllowPseudoParents = v;} 
   Int_t     SetConstraintWrtRef(const char* reffname);
   //
+  void      ConvertDeltas();
+  void      ConvSortHierarchically(TObjArray& matArr);
+  Bool_t    ConvIsJParentOfI(const TGeoHMatrix* matI,const TGeoHMatrix* matJ) const;
+  AliAlignObjParams* ConvFindDelta(const TClonesArray* arrDelta,const TString& algname) const;
+
   AliITSAlignMille2(const AliITSAlignMille2& rhs);
   AliITSAlignMille2& operator=(const AliITSAlignMille2& rhs);
   //
@@ -307,9 +349,12 @@ class AliITSAlignMille2: public TObject
     kPreDeltaFile,
     kPreCalSDDFile,
     kPreVDriftSDDFile,
+    kPreCorrMapSDDFile,
+    kInitCorrMapSDDFile,
     kInitCalSDDFile,
     kInitVDriftSDDFile,
     kInitDeltaFile,
+    kInitGeomFile,
     kGlobalDeltas,
     kConstrLocal,
     kModVolID,
@@ -336,6 +381,8 @@ class AliITSAlignMille2: public TObject
     kSDDVDCorrMult,
     kWeightPt,
     kUseDiamond,
+    kCorrectDiamond,
+    kUseVertex,
     kSameSDDT0,
     //
     kNKeyWords
@@ -378,6 +425,7 @@ class AliITSAlignMille2: public TObject
   Double_t      fConstrPT;                      // optional PT constraint for helix (abs value)
   Double_t      fConstrPTErr;                   // error on this constraint (0 - exact)
   Int_t         fConstrCharge;                  // optional constraint on charge of Helix track (0 - no constraint)
+  Int_t         fRunID;                         // current runID
   //
   Double_t      fDerivativeLoc[kNLocal][3];     // XYZ deriv. over local params
   Double_t      fDerivativeGlo[kNParCh][3];     // XYZ deriv. over global params
@@ -399,16 +447,21 @@ class AliITSAlignMille2: public TObject
   Int_t         fNReqDetDown[kNDataType][3];    // number of points required in Detector[n] with Y<0
   Int_t         fNReqDet[kNDataType][3];        // number of points required in Detector[n]
   Int_t         fTempExcludedModule; /// single module temporary excluded from initial fit
+  UInt_t        fUserProvided;                  // settings which user provided: not to update from the UserUnfo
   // << new members
   //
   // OCDB stuff
   TList        *fIniUserInfo;                   // initial user info (validity is not guaranteed after initialization)
+  TString       fIniGeomPath;                   // where to take the ideal geometry used to produce the points
   TString       fIniDeltaPath;                  // where to take the deltas used to produce the points
   TString       fIniSDDRespPath;                // where to take the initial SDD response used to produce the points
   TString       fPreCalSDDRespPath;             // precalibration SDD response file name
   TString       fIniSDDVDriftPath;              // initial SDD vdrift file name
-  TString       fPreSDDVDriftPath;              // initial SDD vdrift file name
+  TString       fPreSDDVDriftPath;              // precalibration SDD vdrift file name
+  TString       fIniSDDCorrMapPath;             // initial SDD corr.map file name
+  TString       fPreSDDCorrMapPath;             // precalibration SDD corr.map file name
   // geometry stuffs
+  Bool_t        fConvertPreDeltas;              // when the prealignment deltas come from UserInfo, convert them from UserInfo geometry to target one
   TString       fGeometryPath;                  // Geometry file name
   TString       fPreDeltaPath;                  // file with prealigned objects
   TString       fConstrRefPath;                 // file with prealigned objects wrt which constraints are defined
@@ -421,6 +474,8 @@ class AliITSAlignMille2: public TObject
   AliITSresponseSDD* fPreRespSDD;               // array of SDD t0/vdrift calib params
   TObjArray*         fIniVDriftSDD;             // array of AliITSDriftSpeedArraySDD objects used for original reco
   TObjArray*         fPreVDriftSDD;             // array of AliITSDriftSpeedArraySDD objects to be used as a starting point instead of fIniVDriftSDD
+  AliITSCorrectSDDPoints* fIniCorrMapSDD;       // SDD initial correction map
+  AliITSCorrectSDDPoints* fPreCorrMapSDD;       // SDD precalibration correction map
   AliITSsegmentationSDD* fSegmentationSDD;      // extraction of SDD segmentation params
   TClonesArray* fPrealignment; // array of prealignment global deltas
   TClonesArray* fConstrRef;    // array of refererence deltas with respect to which the constraint are defined (survey?)
@@ -445,14 +500,25 @@ class AliITSAlignMille2: public TObject
   Double_t      fTrackWeight;                      //weight given by the user to current track
   Double_t      fWeightPt;                         //weight track equations by pT in this power
   Bool_t        fIsSDDVDriftMult;                  //use multiplicative correction for SDD vdrift
-  Double_t      fDriftSpeed[50];                   //temporary array for drift times of SDD alitrackpoints
+  Double_t      fDriftSpeed[50];                   //temporary array for corrected drift speed of SDD alitrackpoints
+  Double_t      fDriftSpeed0[50];                  //temporary array for original  drift speed of SDD alitrackpoints
   Double_t      fDriftTime0[50];                   //temporary array for drift time 0's used for SDD alitrackpoints
   Double_t      fExtClusterPar[9];                 //array to store the parameters of the externally imposed cluster
   AliTrackPoint fDiamond;                          //optional constraint on the vertex
   AliTrackPoint fDiamondI;                         //constraint on the vertex with inverted error matrix
+  Double_t      fCorrDiamond[3];                   //diamond correction
   Bool_t        fUseDiamond;                       //use diamond as a vertex constraint
+  Bool_t        fUseVertex;                        //use vertex for constraint
+  Bool_t        fVertexSet;                        //vertex is set for current track
   Int_t         fDiamondPointID;                   //ID of the diamond point in the track
   Int_t         fDiamondModID;                     //id of the fake diamond module
+  Int_t         fCheckDiamondPoint;                // kDiamondIgnore: ignore in this event, kDiamondCheckIfPrompt: verify if track is prompt, kDiamondUse: use w/o verification
+  Float_t       fCovIScale[kMaxPoints];            //optional scaling for inv.cov matrix (debiasing). MANAGED BY THE USER EXTERNALLY
+  //
+  Bool_t        fFixCurvIfConstraned;              //when fit curv. was constrained, don't pass it as a free param to MP2
+  Bool_t        fCurvFitWasConstrained;            //flag that the last fit had constrained curvature
+  //
+  TObjArray     fConvAlgMatOld;                    //array to keep matrices of alignables for deltas conversion
   //
   static AliITSAlignMille2* fgInstance;         // global pointer on itself
   static Int_t              fgInstanceID;       // global counter of the instances