#ifndef ALIITSALIGNMILLE2MODULE_H
#define ALIITSALIGNMILLE2MODULE_H
#include <TNamed.h>
#include <TArrayI.h>
#include <TArrayS.h>
#include <TObjArray.h>
class AliITSAlignMille2;
class AliAlignObjParams;
class TGeoHMatrix;
class AliITSAlignMille2Module : public TNamed
{
public:
enum {kSPD,kSDD,kSSD};
enum {kMaxParGeom=6,kMaxParTot=9,kSensDefBit=BIT(14),kGlobalGeomBit=BIT(15),kNotInConfBit=BIT(16),kVdSDDSameLRBit=BIT(17)};
enum {kDOFTX,kDOFTY,kDOFTZ,kDOFPS,kDOFTH,kDOFPH,kDOFT0,kDOFDVL,kDOFDVR};
AliITSAlignMille2Module();
AliITSAlignMille2Module(UShort_t volid);
AliITSAlignMille2Module(Int_t index, UShort_t volid, const char* symname, const TGeoHMatrix *m, Int_t nsv=0, const UShort_t *volidsv=NULL);
AliITSAlignMille2Module(const AliITSAlignMille2Module& rhs);
AliITSAlignMille2Module& operator=(const AliITSAlignMille2Module& rhs);
virtual ~AliITSAlignMille2Module();
Int_t GetIndex() const {return fIndex;}
UShort_t GetVolumeID() const {return fVolumeID;}
Int_t GetNSensitiveVolumes() const {return fNSensVol;}
Int_t GetSensVolIndex(Int_t at) const {return fSensVolIndex[at];}
Short_t GetSensVolVolumeID(Int_t at) const {return fSensVolVolumeID[at];}
TGeoHMatrix *GetMatrix() const {return fMatrix;}
void GetLocalMatrix(TGeoHMatrix& mat) const;
UShort_t *GetSensitiveVolumeVolumeID() const {return (UShort_t*)fSensVolVolumeID.GetArray();}
Float_t GetSigmaFactor(Int_t i) const {return fSigmaFactor[i];}
Float_t GetSigmaXFactor() const {return fSigmaFactor[0];}
Float_t GetSigmaYFactor() const {return fSigmaFactor[1];}
Float_t GetSigmaZFactor() const {return fSigmaFactor[2];}
Int_t GetNProcessedPoints() const {return fNProcPoints;}
Bool_t IsFreeDOF(Int_t dof) const {return dof<fNParTot && fParCstr[dof]>0;}
Bool_t AreSensorsProvided() const {return TestBit(kSensDefBit);}
Bool_t GeomParamsGlobal() const {return TestBit(kGlobalGeomBit);}
Bool_t IsNotInConf() const {return TestBit(kNotInConfBit);}
Bool_t IsVDriftLRSame() const {return TestBit(kVdSDDSameLRBit);}
Bool_t IsIn(UShort_t volid) const;
Bool_t IsAlignable() const;
Bool_t BelongsTo(AliITSAlignMille2Module* parent) const;
AliITSAlignMille2Module* GetParent() const {return fParent;}
AliITSAlignMille2Module* GetChild(Int_t i) const {return (AliITSAlignMille2Module*)fChildren[i];}
Int_t GetNChildren() const {return fChildren.GetLast()+1;}
void Print(Option_t* opt="") const;
void EvaluateDOF();
UShort_t GetNParTot() const {return fNParTot;}
UShort_t GetNParFree() const {return fNParFree;}
Float_t *GetParVals() const {return fParVals;}
Double_t GetParVal(int par) const {return par<fNParTot ? fParVals[par] : 0;}
Double_t GetParErr(int par) const {return par<fNParTot ? fParErrs[par] : 0;}
Double_t GetParConstraint(int par) const {return par<fNParTot ? fParCstr[par] : 0;}
Int_t GetParOffset(Int_t par) const {return par<fNParTot ? fParOffs[par] : -1;}
Int_t GetDetType() const {return fDetType;}
Bool_t IsParConstrained(Int_t par) const {return fParCstr[par]>0 && fParCstr[par]<fgkDummyConstraint;}
Bool_t IsSPD() const {return fDetType == kSPD;}
Bool_t IsSDD() const {return fDetType == kSDD;}
Bool_t IsSSD() const {return fDetType == kSSD;}
Bool_t IsSensor() const {return IsSensor(fVolumeID);}
void SetDetType(Int_t tp) {fDetType = tp;}
void SetParOffset(Int_t par,Int_t offs) {fParOffs[par] = offs;}
void SetParVals(Double_t *vl,Int_t npar);
void SetParVal(Int_t par,Double_t v=0) {fParVals[par] = v;}
void SetParErr(Int_t par,Double_t e=0) {fParErrs[par] = e;}
void SetParConstraint(Int_t par,Double_t s=1e6) {fParCstr[par] = s>0. ? s:0.0;}
void SetSigmaFactor(Int_t i,Float_t v) {fSigmaFactor[i]=TMath::Max(0.001F,v);}
void SetSigmaXFactor(Float_t v) {SetSigmaFactor(0,v);}
void SetSigmaYFactor(Float_t v) {SetSigmaFactor(1,v);}
void SetSigmaZFactor(Float_t v) {SetSigmaFactor(2,v);}
void IncNProcessedPoints(Int_t step=1) {fNProcPoints += step;}
void SetNProcessedPoints(Int_t v) {fNProcPoints = v;}
void SetParent(AliITSAlignMille2Module* par) {fParent = par;}
void AddChild(AliITSAlignMille2Module* cld) {fChildren.Add(cld);}
void SetFreeDOF(Int_t dof,Double_t cstr);
void SetSensorsProvided(Bool_t v=kTRUE) {SetBit(kSensDefBit,v);}
void SetGeomParamsGlobal(Bool_t v=kTRUE) {SetBit(kGlobalGeomBit,v);}
void SetNotInConf(Bool_t v=kTRUE) {SetBit(kNotInConfBit,v);}
void SetVDriftLRSame(Bool_t v=kTRUE) {SetBit(kVdSDDSameLRBit,v);}
Int_t Set(Int_t index,UShort_t volid, const char* symname, const TGeoHMatrix *m,Int_t nsv=0, const UShort_t *volidsv=0);
void AddSensitiveVolume(UShort_t volid);
void DelSensitiveVolume(Int_t at);
void DelSensitiveVolumes() {fNSensVol = 0;}
void GetGeomParamsGlo(Double_t *pars);
void GetGeomParamsLoc(Double_t *pars);
TGeoHMatrix *GetSensitiveVolumeMatrix(UShort_t voluid);
TGeoHMatrix *GetSensitiveVolumeOrigGlobalMatrix(UShort_t voluid);
TGeoHMatrix *GetSensitiveVolumeModifiedMatrix(UShort_t voluid, const Double_t *delta,Bool_t local=kTRUE);
AliAlignObjParams *GetSensitiveVolumeMisalignment(UShort_t voluid, const AliAlignObjParams *a);
AliAlignObjParams *GetSensitiveVolumeMisalignment(UShort_t voluid, const Double_t *deltalocal);
void GetGlobalParams(Double_t *t, Double_t *r) const;
void GetGlobalParams(const Double_t *loct, const Double_t *locr,Double_t *t, Double_t *r);
void GetLocalParams(const Double_t *loct, const Double_t *locr,Double_t *t, Double_t *r);
void GetSensVolGlobalParams(UShort_t volid,Double_t *t, Double_t *r);
void GetSensVolLocalParams(UShort_t volid,Double_t *t, Double_t *r);
void GetSensVolGlobalParams(UShort_t volid,const Double_t* loct,const Double_t* locr,Double_t *t, Double_t *r);
void GetSensVolLocalParams(UShort_t volid,const Double_t* loct,const Double_t* locr,Double_t *t, Double_t *r);
void CalcDerivLocGlo(Double_t *deriv);
void CalcDerivGloLoc(Int_t idx,Double_t *deriv);
void CalcDerivGloLoc(Int_t sensVol,Int_t paridx,Double_t* derivative);
void CalcDerivCurLoc(Int_t sensVol,Int_t paridx,Double_t* derivative);
void CalcDerivDPosDPar(Int_t sensVol,const Double_t *pl,Double_t *deriv);
AliAlignObjParams *GetSensitiveVolumeGlobalMisalignment(UShort_t voluid, const Double_t *deltalocal);
AliAlignObjParams *GetSensitiveVolumeTotalMisalignment(UShort_t voluid, const Double_t *deltalocal);
static Int_t GetIndexFromVolumeID(UShort_t volid);
static UShort_t GetVolumeIDFromSymname(const Char_t *symname);
static UShort_t GetVolumeIDFromIndex(Int_t index);
static Bool_t IsSensor(UShort_t vid);
static Int_t SensVolMatrix(UShort_t volid, TGeoHMatrix *m);
static Int_t SensVolOrigGlobalMatrix(UShort_t volid, TGeoHMatrix *m);
protected:
void AssignDetType();
protected:
Int_t fNSensVol;
Int_t fIndex;
Int_t fDetType;
UShort_t fVolumeID;
UShort_t fNParTot;
UShort_t fNParFree;
TArrayS fParOffs;
Int_t fNProcPoints;
Float_t fSigmaFactor[3];
Float_t *fParVals;
Float_t *fParErrs;
Float_t *fParCstr;
TArrayI fSensVolIndex;
TArrayS fSensVolVolumeID;
TGeoHMatrix *fMatrix;
TGeoHMatrix *fSensVolMatrix;
TGeoHMatrix *fSensVolModifMatrix;
AliITSAlignMille2Module* fParent;
TObjArray fChildren;
static const Float_t fgkDummyConstraint;
ClassDef(AliITSAlignMille2Module, 0)
};
#endif
AliITSAlignMille2Module.h:1 AliITSAlignMille2Module.h:2 AliITSAlignMille2Module.h:3 AliITSAlignMille2Module.h:4 AliITSAlignMille2Module.h:5 AliITSAlignMille2Module.h:6 AliITSAlignMille2Module.h:7 AliITSAlignMille2Module.h:8 AliITSAlignMille2Module.h:9 AliITSAlignMille2Module.h:10 AliITSAlignMille2Module.h:11 AliITSAlignMille2Module.h:12 AliITSAlignMille2Module.h:13 AliITSAlignMille2Module.h:14 AliITSAlignMille2Module.h:15 AliITSAlignMille2Module.h:16 AliITSAlignMille2Module.h:17 AliITSAlignMille2Module.h:18 AliITSAlignMille2Module.h:19 AliITSAlignMille2Module.h:20 AliITSAlignMille2Module.h:21 AliITSAlignMille2Module.h:22 AliITSAlignMille2Module.h:23 AliITSAlignMille2Module.h:24 AliITSAlignMille2Module.h:25 AliITSAlignMille2Module.h:26 AliITSAlignMille2Module.h:27 AliITSAlignMille2Module.h:28 AliITSAlignMille2Module.h:29 AliITSAlignMille2Module.h:30 AliITSAlignMille2Module.h:31 AliITSAlignMille2Module.h:32 AliITSAlignMille2Module.h:33 AliITSAlignMille2Module.h:34 AliITSAlignMille2Module.h:35 AliITSAlignMille2Module.h:36 AliITSAlignMille2Module.h:37 AliITSAlignMille2Module.h:38 AliITSAlignMille2Module.h:39 AliITSAlignMille2Module.h:40 AliITSAlignMille2Module.h:41 AliITSAlignMille2Module.h:42 AliITSAlignMille2Module.h:43 AliITSAlignMille2Module.h:44 AliITSAlignMille2Module.h:45 AliITSAlignMille2Module.h:46 AliITSAlignMille2Module.h:47 AliITSAlignMille2Module.h:48 AliITSAlignMille2Module.h:49 AliITSAlignMille2Module.h:50 AliITSAlignMille2Module.h:51 AliITSAlignMille2Module.h:52 AliITSAlignMille2Module.h:53 AliITSAlignMille2Module.h:54 AliITSAlignMille2Module.h:55 AliITSAlignMille2Module.h:56 AliITSAlignMille2Module.h:57 AliITSAlignMille2Module.h:58 AliITSAlignMille2Module.h:59 AliITSAlignMille2Module.h:60 AliITSAlignMille2Module.h:61 AliITSAlignMille2Module.h:62 AliITSAlignMille2Module.h:63 AliITSAlignMille2Module.h:64 AliITSAlignMille2Module.h:65 AliITSAlignMille2Module.h:66 AliITSAlignMille2Module.h:67 AliITSAlignMille2Module.h:68 AliITSAlignMille2Module.h:69 AliITSAlignMille2Module.h:70 AliITSAlignMille2Module.h:71 AliITSAlignMille2Module.h:72 AliITSAlignMille2Module.h:73 AliITSAlignMille2Module.h:74 AliITSAlignMille2Module.h:75 AliITSAlignMille2Module.h:76 AliITSAlignMille2Module.h:77 AliITSAlignMille2Module.h:78 AliITSAlignMille2Module.h:79 AliITSAlignMille2Module.h:80 AliITSAlignMille2Module.h:81 AliITSAlignMille2Module.h:82 AliITSAlignMille2Module.h:83 AliITSAlignMille2Module.h:84 AliITSAlignMille2Module.h:85 AliITSAlignMille2Module.h:86 AliITSAlignMille2Module.h:87 AliITSAlignMille2Module.h:88 AliITSAlignMille2Module.h:89 AliITSAlignMille2Module.h:90 AliITSAlignMille2Module.h:91 AliITSAlignMille2Module.h:92 AliITSAlignMille2Module.h:93 AliITSAlignMille2Module.h:94 AliITSAlignMille2Module.h:95 AliITSAlignMille2Module.h:96 AliITSAlignMille2Module.h:97 AliITSAlignMille2Module.h:98 AliITSAlignMille2Module.h:99 AliITSAlignMille2Module.h:100 AliITSAlignMille2Module.h:101 AliITSAlignMille2Module.h:102 AliITSAlignMille2Module.h:103 AliITSAlignMille2Module.h:104 AliITSAlignMille2Module.h:105 AliITSAlignMille2Module.h:106 AliITSAlignMille2Module.h:107 AliITSAlignMille2Module.h:108 AliITSAlignMille2Module.h:109 AliITSAlignMille2Module.h:110 AliITSAlignMille2Module.h:111 AliITSAlignMille2Module.h:112 AliITSAlignMille2Module.h:113 AliITSAlignMille2Module.h:114 AliITSAlignMille2Module.h:115 AliITSAlignMille2Module.h:116 AliITSAlignMille2Module.h:117 AliITSAlignMille2Module.h:118 AliITSAlignMille2Module.h:119 AliITSAlignMille2Module.h:120 AliITSAlignMille2Module.h:121 AliITSAlignMille2Module.h:122 AliITSAlignMille2Module.h:123 AliITSAlignMille2Module.h:124 AliITSAlignMille2Module.h:125 AliITSAlignMille2Module.h:126 AliITSAlignMille2Module.h:127 AliITSAlignMille2Module.h:128 AliITSAlignMille2Module.h:129 AliITSAlignMille2Module.h:130 AliITSAlignMille2Module.h:131 AliITSAlignMille2Module.h:132 AliITSAlignMille2Module.h:133 AliITSAlignMille2Module.h:134 AliITSAlignMille2Module.h:135 AliITSAlignMille2Module.h:136 AliITSAlignMille2Module.h:137 AliITSAlignMille2Module.h:138 AliITSAlignMille2Module.h:139 AliITSAlignMille2Module.h:140 AliITSAlignMille2Module.h:141 AliITSAlignMille2Module.h:142 AliITSAlignMille2Module.h:143 AliITSAlignMille2Module.h:144 AliITSAlignMille2Module.h:145 AliITSAlignMille2Module.h:146 AliITSAlignMille2Module.h:147 AliITSAlignMille2Module.h:148 AliITSAlignMille2Module.h:149 AliITSAlignMille2Module.h:150 AliITSAlignMille2Module.h:151 AliITSAlignMille2Module.h:152 AliITSAlignMille2Module.h:153 AliITSAlignMille2Module.h:154 AliITSAlignMille2Module.h:155 AliITSAlignMille2Module.h:156 AliITSAlignMille2Module.h:157 AliITSAlignMille2Module.h:158 AliITSAlignMille2Module.h:159 AliITSAlignMille2Module.h:160 AliITSAlignMille2Module.h:161 AliITSAlignMille2Module.h:162 AliITSAlignMille2Module.h:163 AliITSAlignMille2Module.h:164 AliITSAlignMille2Module.h:165 AliITSAlignMille2Module.h:166 AliITSAlignMille2Module.h:167 AliITSAlignMille2Module.h:168 AliITSAlignMille2Module.h:169 AliITSAlignMille2Module.h:170 AliITSAlignMille2Module.h:171 AliITSAlignMille2Module.h:172 AliITSAlignMille2Module.h:173 AliITSAlignMille2Module.h:174 AliITSAlignMille2Module.h:175 AliITSAlignMille2Module.h:176 AliITSAlignMille2Module.h:177 AliITSAlignMille2Module.h:178 AliITSAlignMille2Module.h:179 AliITSAlignMille2Module.h:180 AliITSAlignMille2Module.h:181