#include <TNamed.h> \r
#include <TArrayI.h> \r
#include <TArrayS.h> \r
+#include <TObjArray.h> \r
class AliITSAlignMille2;\r
\r
class AliAlignObjParams; \r
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
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
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
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
//\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
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