#ifndef ALITRDALIGNMENT_H
#define ALITRDALIGNMENT_H
#include <TObject.h>
#include <TRandom.h>
#include <TObjString.h>
#include <AliGeomManager.h>
class AliSurveyObj;
class AliTRDalignment : public TObject {
public:
AliTRDalignment();
AliTRDalignment(const AliTRDalignment& source);
AliTRDalignment& operator=(const AliTRDalignment& source);
AliTRDalignment& operator*=(double fac);
AliTRDalignment& operator+=(const AliTRDalignment& source);
AliTRDalignment& operator-=(const AliTRDalignment& source);
Bool_t operator==(const AliTRDalignment& source) const;
virtual ~AliTRDalignment() {};
void SetSmZero();
void SetChZero();
void SetSm(int sm, const double a[6]) {for (int i = 0; i < 6; i++) fSm[sm][i] = a[i];}
void SetCh(int ch, const double a[6]) {for (int i = 0; i < 6; i++) fCh[ch][i] = a[i];}
void SetSmRandom(double a[6]);
void SetChRandom(double a[6]);
void SetSmFull();
void SetChFull();
void SetSmResidual();
void SetChResidual();
void SetZero() {SetSmZero(); SetChZero();}
void SetIdeal() {SetZero();}
void SetFull() {SetSmFull(); SetChFull();}
void SetResidual() {SetSmResidual(); SetChResidual();}
void SetComment(char *s) {fComment.SetString(s);}
void GetSm(int sm, double * const a) const {for (int i = 0; i < 6; i++) a[i] = fSm[sm][i];}
void GetCh(int ch, double * const a) const {for (int i = 0; i < 6; i++) a[i] = fCh[ch][i];}
void PrintSm(int sm, FILE * const fp = stdout) const;
void PrintCh(int ch, FILE * const fp = stdout) const;
void PrintSm(FILE * const fp = stdout) const {for (int i = 0; i < 18; i++) PrintSm(i,fp);}
void PrintCh(FILE * const fp = stdout) const {for (int i = 0; i < 540; i++) PrintCh(i,fp);}
void Print(FILE * const fp = stdout) const {PrintSm(fp); PrintCh(fp); }
void Print(Option_t *) const {Print(); }
void ReadAscii(const char * const filename);
void ReadCurrentGeo();
void ReadRoot(const char * const filename);
void ReadDB(const char * const filename);
void ReadDB(const char * const db, const char * const path, int run, int version=-1, int subversion=-1);
Bool_t DecodeSurveyPointName(TString pna, Int_t &sm, Int_t &iz,Int_t &ir, Int_t &iphi);
void ReadSurveyReport(const char * const filename);
void ReadSurveyReport(const AliSurveyObj * const so);
void ReadAny(const char * const filename);
void WriteAscii(const char * const filename) const;
void WriteRoot(const char * const filename);
void WriteDB(const char * const fina, int r0, int r1, int v, int s);
void WriteDB(char * const db, const char * const pa, int r0, int r1);
void WriteGeo(char *filename);
int GetSec(int ch) const {return ch/30;}
int GetSta(int ch) const {return ch%30/6;}
int GetPla(int ch) const {return ch%30%6;}
int GetMod(int ch) const {return 5*GetSec(ch)+GetSta(ch);}
int GetLay(int ch) const {return AliGeomManager::kTRD1+GetPla(ch);}
UShort_t GetVoi(int ch) const {return AliGeomManager::LayerToVolUID(GetLay(ch),GetMod(ch));}
char *GetSmName(int sm) const {return Form("TRD/sm%02d",sm);}
char *GetChName(int ch) const {return Form("TRD/sm%02d/st%d/pl%d",GetSec(ch),GetSta(ch),GetPla(ch));}
int GetSmIndex(const char *name) {for (int i=0; i<18; i++) if (strcmp(name,GetSmName(i))==0) return i; return -1;}
int GetChIndex(const char *name) {for (int i=0; i<540; i++) if (strcmp(name,GetChName(i))==0) return i; return -1;}
double GetSmRMS(int xyz) const;
double GetChRMS(int xyz) const;
void PrintSmRMS() const;
void PrintChRMS() const;
void PrintRMS() const {PrintSmRMS(); PrintChRMS();}
double SurveyChi2(int i, const double * const a);
double SurveyChi2(const double * const a) {return SurveyChi2(fIbuffer[0],a);}
void SurveyToAlignment(int i, const char * const flag);
void SurveyToAlignment(const char * const flag) {for (int i=0; i<18; i++) SurveyToAlignment(i,flag);}
protected:
void ArToNumbers(TClonesArray * const ar);
void NumbersToAr(TClonesArray * const ar);
int IsGeoLoaded();
protected:
double fSm[18][6];
double fCh[540][6];
TObjString fComment;
TRandom fRan;
double fSurveyX[18][2][2][2];
double fSurveyY[18][2][2][2];
double fSurveyZ[18][2][2][2];
double fSurveyEX[18][2][2][2];
double fSurveyEY[18][2][2][2];
double fSurveyEZ[18][2][2][2];
double fSurveyX0[2][2][2];
double fSurveyY0[2][2][2];
double fSurveyZ0[2][2][2];
int fIbuffer[1000];
double fDbuffer[1000];
ClassDef(AliTRDalignment,1)
};
#endif