]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITSAlignMille2Module.h
dq/dt and dq/dl reference plots
[u/mrichter/AliRoot.git] / ITS / AliITSAlignMille2Module.h
index 7758fe8d08b6abb6b04a963756145f533a515697..39adb77c443c93955b047df9883cd439a420d913 100644 (file)
@@ -18,6 +18,7 @@
 #include <TNamed.h> \r
 #include <TArrayI.h> \r
 #include <TArrayS.h> \r
+#include <TObjArray.h> \r
 class AliITSAlignMille2;\r
 \r
 class AliAlignObjParams; \r
@@ -26,6 +27,10 @@ class TGeoHMatrix;
 class AliITSAlignMille2Module : public TNamed \r
 { \r
 public: \r
+  enum {kSPD,kSDD,kSSD};\r
+  enum {kMaxParGeom=6,kMaxParTot=8,kSensDefBit=0,kGlobalGeomBit=1};\r
+  enum {kDOFTX,kDOFTY,kDOFTZ,kDOFPS,kDOFTH,kDOFPH,kDOFT0,kDOFDV};\r
+  //\r
   AliITSAlignMille2Module(); \r
   AliITSAlignMille2Module(UShort_t volid);\r
   AliITSAlignMille2Module(Int_t index, UShort_t volid, char* symname, TGeoHMatrix *m, Int_t nsv=0, UShort_t *volidsv=NULL);\r
@@ -48,15 +53,39 @@ public:
   Float_t      GetSigmaYFactor()                      const {return fSigmaFactor[1];}\r
   Float_t      GetSigmaZFactor()                      const {return fSigmaFactor[2];}\r
   Int_t        GetNProcessedPoints()                  const {return fNProcPoints;}\r
-  Bool_t       IsFreeDOF(Int_t dof)                   const {return TestBit(1<<dof);}\r
-  UInt_t       GetFreePattern()                       const {return TestBits(0x3f);}\r
-  Bool_t       AreSensorsProvided()                   const {return TestBit(1<<10);}\r
+  Bool_t       IsFreeDOF(Int_t dof)                   const {return fParCstr[dof]>0;}\r
+  Bool_t       AreSensorsProvided()                   const {return TestBit(1<<(kSensDefBit+1));}\r
+  Bool_t       GeomParamsGlobal()                     const {return TestBit(1<<(kGlobalGeomBit+1));}\r
   Bool_t       IsIn(UShort_t volid)                   const;\r
   Bool_t       IsAlignable()                          const;\r
   Bool_t       BelongsTo(AliITSAlignMille2Module* parent) const;\r
   AliITSAlignMille2Module* GetParent()                const {return fParent;}\r
+  AliITSAlignMille2Module* GetChild(Int_t i)          const {return (AliITSAlignMille2Module*)fChildren[i];}\r
+  Int_t        GetNChildren()                         const {return fChildren.GetLast()+1;}\r
+  //\r
   void         Print(Option_t* opt="")                const; \r
   //\r
+  void         EvaluateDOF();\r
+  UShort_t     GetNParTot()                           const {return fNParTot;}\r
+  UShort_t     GetNParFree()                          const {return fNParFree;}\r
+  Float_t     *GetParVals()                           const {return fParVals;}\r
+  Double_t     GetParVal(int par)                     const {return fParVals[par];}\r
+  Double_t     GetParErr(int par)                     const {return fParErrs[par];}\r
+  Double_t     GetParConstraint(int par)              const {return fParCstr[par];}\r
+  Int_t        GetParOffset(Int_t par)                const {return fParOffs[par];}\r
+  Int_t        GetDetType()                           const {return fDetType;}\r
+  Bool_t       IsParConstrained(Int_t par)            const {return fParCstr[par]>0 && fParCstr[par]<fgkDummyConstraint;}\r
+  Bool_t       IsSPD()                                const {return fDetType == kSPD;}\r
+  Bool_t       IsSDD()                                const {return fDetType == kSDD;}\r
+  Bool_t       IsSSD()                                const {return fDetType == kSSD;}\r
+  Bool_t       IsSensor()                             const {return IsSensor(fVolumeID);}\r
+  void         SetDetType(Int_t tp)                         {fDetType = tp;}\r
+  void         SetParOffset(Int_t par,Int_t offs)           {fParOffs[par] = offs;}\r
+  //\r
+  void         SetParVals(Double_t *vl,Int_t npar);          \r
+  void         SetParVal(Int_t par,Double_t v=0)            {fParVals[par] = v;}\r
+  void         SetParErr(Int_t par,Double_t e=0)            {fParErrs[par] = e;}\r
+  void         SetParConstraint(Int_t par,Double_t s=1e6)   {fParCstr[par] = s>0. ? s:0.0;}\r
   void         SetSigmaFactor(Int_t i,Float_t v)            {fSigmaFactor[i]=v;}\r
   void         SetSigmaXFactor(Float_t v)                   {fSigmaFactor[0]=v;}\r
   void         SetSigmaYFactor(Float_t v)                   {fSigmaFactor[1]=v;}\r
@@ -64,12 +93,18 @@ public:
   void         IncNProcessedPoints(Int_t step=1)            {fNProcPoints += step;}\r
   void         SetNProcessedPoints(Int_t v)                 {fNProcPoints = v;}\r
   void         SetParent(AliITSAlignMille2Module* par)      {fParent = par;}\r
-  void         SetFreeDOF(Int_t dof,Bool_t free=kTRUE)      {SetBit(1<<dof,free);}\r
-  void         SetSensorsProvided(Bool_t v=kTRUE)            {SetBit(1<<10,v);}\r
+  void         AddChild(AliITSAlignMille2Module* cld)       {fChildren.Add(cld);}\r
+  void         SetFreeDOF(Int_t dof,Double_t cstr);\r
+  void         SetSensorsProvided(Bool_t v=kTRUE)           {SetBit(1<<(kSensDefBit+1),v);}\r
+  void         SetGeomParamsGlobal(Bool_t v=kTRUE)          {SetBit(1<<(kGlobalGeomBit+1),v);}\r
   Int_t        Set(Int_t index,UShort_t volid,char* symname,TGeoHMatrix *m,Int_t nsv=0,UShort_t *volidsv=0);\r
   //\r
   void         AddSensitiveVolume(UShort_t volid);\r
   void         DelSensitiveVolume(Int_t at);\r
+  void         DelSensitiveVolumes()                        {fNSensVol = 0;}\r
+  //\r
+  void         GetGeomParamsGlo(Double_t *pars);\r
+  void         GetGeomParamsLoc(Double_t *pars);\r
   //\r
   TGeoHMatrix *GetSensitiveVolumeMatrix(UShort_t voluid);\r
   TGeoHMatrix *GetSensitiveVolumeOrigGlobalMatrix(UShort_t voluid);\r
@@ -77,17 +112,33 @@ public:
   AliAlignObjParams *GetSensitiveVolumeMisalignment(UShort_t voluid, AliAlignObjParams *a); \r
   AliAlignObjParams *GetSensitiveVolumeMisalignment(UShort_t voluid, Double_t *deltalocal); \r
   //\r
+  void         GetGlobalParams(Double_t *t, Double_t *r);\r
+  void         GetGlobalParams(const Double_t *loct, const Double_t *locr,Double_t *t, Double_t *r);\r
+  void         GetLocalParams(const Double_t *loct, const Double_t *locr,Double_t *t, Double_t *r);\r
+  //\r
+  void         GetSensVolGlobalParams(UShort_t volid,Double_t *t, Double_t *r);\r
+  void         GetSensVolLocalParams(UShort_t volid,Double_t *t, Double_t *r);\r
+  void         GetSensVolGlobalParams(UShort_t volid,Double_t* loct,Double_t* locr,Double_t *t, Double_t *r);\r
+  void         GetSensVolLocalParams(UShort_t volid,Double_t* loct,Double_t* locr,Double_t *t, Double_t *r);\r
+  //\r
+  void         CalcDerivLocGlo(Double_t *deriv);\r
+  void         CalcDerivGloLoc(Int_t idx,Double_t *deriv);\r
+  void         CalcDerivGloLoc(Int_t sensVol,Int_t paridx,Double_t* derivative);\r
+  void         CalcDerivCurLoc(Int_t sensVol,Int_t paridx,Double_t* derivative);\r
+  //\r
   // forse non serve...\r
   AliAlignObjParams *GetSensitiveVolumeGlobalMisalignment(UShort_t voluid, Double_t *deltalocal); \r
   // mo' proviamo questo\r
   AliAlignObjParams *GetSensitiveVolumeTotalMisalignment(UShort_t voluid, Double_t *deltalocal); \r
   //\r
-  static Int_t GetIndexFromVolumeID(UShort_t volid);\r
+  static Int_t    GetIndexFromVolumeID(UShort_t volid);\r
   static UShort_t GetVolumeIDFromSymname(const Char_t *symname);\r
   static UShort_t GetVolumeIDFromIndex(Int_t index);\r
+  static Bool_t   IsSensor(UShort_t vid);\r
   //\r
 protected:\r
   //\r
+  void         AssignDetType();\r
   Int_t        SensVolMatrix(UShort_t volid, TGeoHMatrix *m); \r
   Int_t        SensVolOrigGlobalMatrix(UShort_t volid, TGeoHMatrix *m); \r
   //\r
@@ -95,9 +146,16 @@ protected:
   //\r
   Int_t          fNSensVol;                       // number of sensor it refers to\r
   Int_t          fIndex;                          // aliroot index\r
+  Int_t          fDetType;                        // Detector type\r
   UShort_t       fVolumeID;                       // aliroot volune ID\r
+  UShort_t       fNParTot;                        // total number of parameters\r
+  UShort_t       fNParFree;                       // number of free parameters\r
+  TArrayS        fParOffs;                        // offsets of free params in the fit results\r
   Int_t          fNProcPoints;                    // number of processed points\r
   Float_t        fSigmaFactor[3];                 // multiplicative factor for referred sensor X,Y,Z error\r
+  Float_t       *fParVals;                        // values of the fitted params\r
+  Float_t       *fParErrs;                        // errors of the fitted params\r
+  Float_t       *fParCstr;                        // Gaussian type constraint on parameter, 0 means fixed param\r
   //\r
   TArrayI        fSensVolIndex;                   // aliroot indices for sensors\r
   TArrayS        fSensVolVolumeID;                // aliroot indices for sensors volumes\r
@@ -106,8 +164,10 @@ protected:
   TGeoHMatrix   *fSensVolModifMatrix;             // sensor's modified matrices\r
   //\r
   AliITSAlignMille2Module* fParent;               // optional parent pointer\r
+  TObjArray      fChildren;                       // array of optional children\r
   //\r
-  static AliAlignObjParams fgTempAlignObj;         // temp.alignment object used as a buffer               \r
+  static AliAlignObjParams fgTempAlignObj;        // temp.alignment object used as a buffer               \r
+  static const Float_t fgkDummyConstraint;        // dummy (lose) contraint on parameter\r
   //\r
   ClassDef(AliITSAlignMille2Module, 0)\r
 }; \r