ROOT logo
#ifndef ALIITSMISALIGNER_H
#define ALIITSMISALIGNER_H

// Class building the alignment objects for ITS (SPD, SDD, SSD)
// It derives from AliMisAligner, thus providing the methods
// MakeAlObjsArray (builds and returns the array of alignment objects)
// and GetCDBMetaData (returns the metadata for the OCDB entry)
//

/* $Id$ */

#include <TString.h>
#include "AliMisAligner.h"
#include <TRandom3.h>

class TClonesArray;
class AliAlignObjParams;

//-------------------------------------------------------------------------
class AliITSMisAligner : public AliMisAligner{
    public:
	AliITSMisAligner();
	~AliITSMisAligner() {};

	TClonesArray* MakeAlObjsArray();
	AliCDBMetaData* GetCDBMetaData() const;

	void  SetSeed(Int_t seed) {fRnd.SetSeed(seed); return;}

	void SetWholeITSPars(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fWholeITS[0] = dx;   fWholeITS[1] = dy;     fWholeITS[2] = dz;
	    fWholeITS[3] = dpsi; fWholeITS[4] = dtheta; fWholeITS[5] = dphi;
	}

	void SetSPDSectorSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSPDSector[0] = dx;   fSPDSector[1] = dy;     fSPDSector[2] = dz;
	    fSPDSector[3] = dpsi; fSPDSector[4] = dtheta; fSPDSector[5] = dphi;
	}

	void SetSPDHSSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSPDHS[0] = dx;   fSPDHS[1] = dy;     fSPDHS[2] = dz;
	    fSPDHS[3] = dpsi; fSPDHS[4] = dtheta; fSPDHS[5] = dphi;
	}

	void SetSPDLadderSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSPDLadder[0] = dx;   fSPDLadder[1] = dy;     fSPDLadder[2] = dz;
	    fSPDLadder[3] = dpsi; fSPDLadder[4] = dtheta; fSPDLadder[5] = dphi;
	}

	void SetSPDHBSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSPDHB[0] = dx;   fSPDHB[1] = dy;     fSPDHB[2] = dz;
	    fSPDHB[3] = dpsi; fSPDHB[4] = dtheta; fSPDHB[5] = dphi;
	}

	void SetSPDBarrelSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSPDBarrel[0] = dx;   fSPDBarrel[1] = dy;     fSPDBarrel[2] = dz;
	    fSPDBarrel[3] = dpsi; fSPDBarrel[4] = dtheta; fSPDBarrel[5] = dphi;
	}

	void SetSDDLayerSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSDDLayer[0] = dx;   fSDDLayer[1] = dy;     fSDDLayer[2] = dz;
	    fSDDLayer[3] = dpsi; fSDDLayer[4] = dtheta; fSDDLayer[5] = dphi;
	}

	void SetSDDBarrelSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSDDBarrel[0] = dx;   fSDDBarrel[1] = dy;     fSDDBarrel[2] = dz;
	    fSDDBarrel[3] = dpsi; fSDDBarrel[4] = dtheta; fSDDBarrel[5] = dphi;
	}

	void SetSDDLadderSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSDDLadder[0] = dx;   fSDDLadder[1] = dy;     fSDDLadder[2] = dz;
	    fSDDLadder[3] = dpsi; fSDDLadder[4] = dtheta; fSDDLadder[5] = dphi;
	}

	void SetSDDModuleSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSDDModule[0] = dx;   fSDDModule[1] = dy;     fSDDModule[2] = dz;
	    fSDDModule[3] = dpsi; fSDDModule[4] = dtheta; fSDDModule[5] = dphi;
	}

	void SetSSDBarrelPars(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSSDBarrel[0] = dx;   fSSDBarrel[1] = dy;     fSSDBarrel[2] = dz;
	    fSSDBarrel[3] = dpsi; fSSDBarrel[4] = dtheta; fSSDBarrel[5] = dphi;
	}

	void SetSSDLadderSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSSDLadder[0] = dx;   fSSDLadder[1] = dy;     fSSDLadder[2] = dz;
	    fSSDLadder[3] = dpsi; fSSDLadder[4] = dtheta; fSSDLadder[5] = dphi;
	}

	void SetSSDModuleSigmas(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSSDModule[0] = dx;   fSSDModule[1] = dy;     fSSDModule[2] = dz;
	    fSSDModule[3] = dpsi; fSSDModule[4] = dtheta; fSSDModule[5] = dphi;
	}

	void SetSPDLadderShiftT(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSPDLadderShiftT[0] = dx;   fSPDLadderShiftT[1] = dy;     fSPDLadderShiftT[2] = dz;
	    fSPDLadderShiftT[3] = dpsi; fSPDLadderShiftT[4] = dtheta; fSPDLadderShiftT[5] = dphi;
	}

	void SetSPDLadderShiftB(Double_t dx, Double_t dy, Double_t dz, Double_t dpsi, Double_t dtheta, Double_t dphi)
	{
	    fSPDLadderShiftB[0] = dx;   fSPDLadderShiftB[1] = dy;     fSPDLadderShiftB[2] = dz;
	    fSPDLadderShiftB[3] = dpsi; fSPDLadderShiftB[4] = dtheta; fSPDLadderShiftB[5] = dphi;
	}

	void SetSPDLadderShiftT(Double_t pars[6])
	{
	    for(Int_t ii=0; ii<6; ii++)
		fSPDLadderShiftT[ii] = pars[ii];
	}

	void SetSPDLadderShiftB(Double_t pars[6])
	{
	    for(Int_t ii=0; ii<6; ii++)
		fSPDLadderShiftB[ii] = pars[ii];
	}

	void  SetWholeITSMisAlignment();
	void  SetSPDMisAlignment();
	void  SetSDDMisAlignment();
	void  SetSSDMisAlignment();

	Double_t GetUnif(Double_t x1,Double_t x2) {return fRnd.Uniform(x1,x2);}

	Bool_t AddAlignObj(char* name,Double_t dx,Double_t dy,Double_t dz,
		Double_t dpsi,Double_t dtheta,Double_t dphi,
		const char* distrib);

	Bool_t AddAlignObj(Int_t lay,Double_t dx,Double_t dy,Double_t dz,
		Double_t dpsi,Double_t dtheta,Double_t dphi,
		Bool_t unif);

	Bool_t AddAlignObj(Int_t lay,Int_t ladd,Double_t dx,Double_t dy,Double_t dz,
		Double_t dpsi,Double_t dtheta,Double_t dphi,
		Double_t xShift,Double_t yShift,Double_t zShift,
		Double_t psiShift,Double_t thetaShift,Double_t phiShift,
		Bool_t unif);

	Bool_t AddSectorAlignObj(Int_t sectMin,Int_t sectMax,
		Double_t dx,Double_t dy,Double_t dz,
		Double_t dpsi,Double_t dtheta,Double_t dphi,
		Double_t xShift,Double_t yShift,Double_t zShift,
		Double_t psiShift,Double_t thetaShift,Double_t phiShift,
		Bool_t unif);

	void  ShiftAlignObj(AliAlignObjParams &alObj,Double_t dx,Double_t dy,Double_t dz,Double_t dpsi,Double_t dtheta,Double_t dphi);
	void  SmearAlignObj(AliAlignObjParams &alObj,Double_t sx,Double_t sy,Double_t sz,Double_t spsi,Double_t stheta,Double_t sphi);

	const char*  GetSymbName(Int_t layer) const;
	const char*  GetSymbName(Int_t layer,Int_t ladd) const;
	const char*  GetSymbName(Int_t layer,Int_t ladd,Int_t mod) const;
	const char*  GetHalfStaveLadderSymbName(Int_t layer,Int_t ladd,Int_t halfStave) const;
	static const char*  GetParentSymName(const char* symname) ;
	// const char*  GetSistersSymName(const char* symname) const;
	static Bool_t GetLayerAndLevel(const char* symname, Int_t &layer, Int_t &level);

	static Int_t GetNLayers()             {return kNLayers;}
	static Int_t GetNLadders(Int_t lay)   {return fgkNLadders[lay];}
	static Int_t GetNDetectors(Int_t lay) {return fgkNDetectors[lay];}
	static Int_t GetNSisters(const char* symname);
	static Int_t GetNDaughters(const char* symname);

    protected:
	TRandom3     fRnd; // TRandom3 object
	//TRandom     fRnd; // TRandom object
	Int_t        fInd; // index of current AliAlignObjParams in fAlignObjArray
	TClonesArray *fAlignObjArray; // array of AliAlignObjParams
	TString      fStrSPD; // name of SPD
	TString      fStrSDD; // name of SDD
	TString      fStrSSD; // name of SSD
	TString      fStrStave; // name of SPD stave
	TString      fStrHalfStave; // name of SPD half-stave
	TString      fStrLadder; // name of SPD ladder
	TString      fStrSector; // name of SPD sector
	TString      fStrSensor; // name of sensitive volume

    private:
	AliITSMisAligner(const AliITSMisAligner &mAligner);
	AliITSMisAligner &operator= (const AliITSMisAligner &mAligner);
	enum {kNLayers = 6}; // The number of layers.
	static const Int_t  fgkNLadders[kNLayers];  // Array of the number of ladders/layer(layer)
	static const Int_t  fgkNDetectors[kNLayers];// Array of the number of detector/ladder(layer)

	// Parameters setting the misalignment at all SPD/SDD/SSD levels
	Double_t fWholeITS[6];   // parameters for the whole TIS
	Double_t fSPDSector[6];  // sectors
	Double_t fSPDHB[6];      // SPD half barrel
	Double_t fSPDBarrel[6];  // SPD barrel
	Double_t fSPDHS[6];      // SPD half stave
	Double_t fSPDLadder[6];  // SPD ladder
	Double_t fSDDLayer[6];   // SPD layer
	Double_t fSDDBarrel[6];  // SDD barrel
	Double_t fSDDLadder[6];  // SDD ladder
	Double_t fSDDModule[6];  // SDD module
	Double_t fSSDBarrel[6];  // SSD barrel
	Double_t fSSDLayer[6];   // SSD layer
	Double_t fSSDLadder[6];  // SSD ladder
	Double_t fSSDModule[6];  // SSD module

	// Parameters setting common shifts (used for "full" misalignment)
	Double_t fSPDLadderShiftT[6]; // for top half-barrel ladders
	Double_t fSPDLadderShiftB[6]; // for bottom half-barrel ladders
	Double_t fSDDLadderShift1[6]; // for ladder first SDD layer
	Double_t fSDDLadderShift2[6]; // for ladder second SDD layer

	// Choice between uniform (kTRUE) or gaussian (kFALSE) distribution in the smearing
	Bool_t fUnifSPDSector;  // kTRUE if uniform smearing SPD sector
	Bool_t  fUnifSPDHS; // kTRUE if uniform smearing SPD HS
	Bool_t fUnifSDDLadder; // kTRUE if uniform smearing SDD ladder
	Bool_t fUnifSSDLadder; // kTRUE if uniform smearing SSD ladder
	Bool_t fUnifSPDLadder; // kTRUE if uniform smearing SPD ladder
	Bool_t fUnifSDDModule; // kTRUE if uniform smearing SDD module
	Bool_t fUnifSSDModule; // kTRUE if uniform smearing SSD module

	ClassDef(AliITSMisAligner,0)   //ITS MisAligner
};


#endif
 AliITSMisAligner.h:1
 AliITSMisAligner.h:2
 AliITSMisAligner.h:3
 AliITSMisAligner.h:4
 AliITSMisAligner.h:5
 AliITSMisAligner.h:6
 AliITSMisAligner.h:7
 AliITSMisAligner.h:8
 AliITSMisAligner.h:9
 AliITSMisAligner.h:10
 AliITSMisAligner.h:11
 AliITSMisAligner.h:12
 AliITSMisAligner.h:13
 AliITSMisAligner.h:14
 AliITSMisAligner.h:15
 AliITSMisAligner.h:16
 AliITSMisAligner.h:17
 AliITSMisAligner.h:18
 AliITSMisAligner.h:19
 AliITSMisAligner.h:20
 AliITSMisAligner.h:21
 AliITSMisAligner.h:22
 AliITSMisAligner.h:23
 AliITSMisAligner.h:24
 AliITSMisAligner.h:25
 AliITSMisAligner.h:26
 AliITSMisAligner.h:27
 AliITSMisAligner.h:28
 AliITSMisAligner.h:29
 AliITSMisAligner.h:30
 AliITSMisAligner.h:31
 AliITSMisAligner.h:32
 AliITSMisAligner.h:33
 AliITSMisAligner.h:34
 AliITSMisAligner.h:35
 AliITSMisAligner.h:36
 AliITSMisAligner.h:37
 AliITSMisAligner.h:38
 AliITSMisAligner.h:39
 AliITSMisAligner.h:40
 AliITSMisAligner.h:41
 AliITSMisAligner.h:42
 AliITSMisAligner.h:43
 AliITSMisAligner.h:44
 AliITSMisAligner.h:45
 AliITSMisAligner.h:46
 AliITSMisAligner.h:47
 AliITSMisAligner.h:48
 AliITSMisAligner.h:49
 AliITSMisAligner.h:50
 AliITSMisAligner.h:51
 AliITSMisAligner.h:52
 AliITSMisAligner.h:53
 AliITSMisAligner.h:54
 AliITSMisAligner.h:55
 AliITSMisAligner.h:56
 AliITSMisAligner.h:57
 AliITSMisAligner.h:58
 AliITSMisAligner.h:59
 AliITSMisAligner.h:60
 AliITSMisAligner.h:61
 AliITSMisAligner.h:62
 AliITSMisAligner.h:63
 AliITSMisAligner.h:64
 AliITSMisAligner.h:65
 AliITSMisAligner.h:66
 AliITSMisAligner.h:67
 AliITSMisAligner.h:68
 AliITSMisAligner.h:69
 AliITSMisAligner.h:70
 AliITSMisAligner.h:71
 AliITSMisAligner.h:72
 AliITSMisAligner.h:73
 AliITSMisAligner.h:74
 AliITSMisAligner.h:75
 AliITSMisAligner.h:76
 AliITSMisAligner.h:77
 AliITSMisAligner.h:78
 AliITSMisAligner.h:79
 AliITSMisAligner.h:80
 AliITSMisAligner.h:81
 AliITSMisAligner.h:82
 AliITSMisAligner.h:83
 AliITSMisAligner.h:84
 AliITSMisAligner.h:85
 AliITSMisAligner.h:86
 AliITSMisAligner.h:87
 AliITSMisAligner.h:88
 AliITSMisAligner.h:89
 AliITSMisAligner.h:90
 AliITSMisAligner.h:91
 AliITSMisAligner.h:92
 AliITSMisAligner.h:93
 AliITSMisAligner.h:94
 AliITSMisAligner.h:95
 AliITSMisAligner.h:96
 AliITSMisAligner.h:97
 AliITSMisAligner.h:98
 AliITSMisAligner.h:99
 AliITSMisAligner.h:100
 AliITSMisAligner.h:101
 AliITSMisAligner.h:102
 AliITSMisAligner.h:103
 AliITSMisAligner.h:104
 AliITSMisAligner.h:105
 AliITSMisAligner.h:106
 AliITSMisAligner.h:107
 AliITSMisAligner.h:108
 AliITSMisAligner.h:109
 AliITSMisAligner.h:110
 AliITSMisAligner.h:111
 AliITSMisAligner.h:112
 AliITSMisAligner.h:113
 AliITSMisAligner.h:114
 AliITSMisAligner.h:115
 AliITSMisAligner.h:116
 AliITSMisAligner.h:117
 AliITSMisAligner.h:118
 AliITSMisAligner.h:119
 AliITSMisAligner.h:120
 AliITSMisAligner.h:121
 AliITSMisAligner.h:122
 AliITSMisAligner.h:123
 AliITSMisAligner.h:124
 AliITSMisAligner.h:125
 AliITSMisAligner.h:126
 AliITSMisAligner.h:127
 AliITSMisAligner.h:128
 AliITSMisAligner.h:129
 AliITSMisAligner.h:130
 AliITSMisAligner.h:131
 AliITSMisAligner.h:132
 AliITSMisAligner.h:133
 AliITSMisAligner.h:134
 AliITSMisAligner.h:135
 AliITSMisAligner.h:136
 AliITSMisAligner.h:137
 AliITSMisAligner.h:138
 AliITSMisAligner.h:139
 AliITSMisAligner.h:140
 AliITSMisAligner.h:141
 AliITSMisAligner.h:142
 AliITSMisAligner.h:143
 AliITSMisAligner.h:144
 AliITSMisAligner.h:145
 AliITSMisAligner.h:146
 AliITSMisAligner.h:147
 AliITSMisAligner.h:148
 AliITSMisAligner.h:149
 AliITSMisAligner.h:150
 AliITSMisAligner.h:151
 AliITSMisAligner.h:152
 AliITSMisAligner.h:153
 AliITSMisAligner.h:154
 AliITSMisAligner.h:155
 AliITSMisAligner.h:156
 AliITSMisAligner.h:157
 AliITSMisAligner.h:158
 AliITSMisAligner.h:159
 AliITSMisAligner.h:160
 AliITSMisAligner.h:161
 AliITSMisAligner.h:162
 AliITSMisAligner.h:163
 AliITSMisAligner.h:164
 AliITSMisAligner.h:165
 AliITSMisAligner.h:166
 AliITSMisAligner.h:167
 AliITSMisAligner.h:168
 AliITSMisAligner.h:169
 AliITSMisAligner.h:170
 AliITSMisAligner.h:171
 AliITSMisAligner.h:172
 AliITSMisAligner.h:173
 AliITSMisAligner.h:174
 AliITSMisAligner.h:175
 AliITSMisAligner.h:176
 AliITSMisAligner.h:177
 AliITSMisAligner.h:178
 AliITSMisAligner.h:179
 AliITSMisAligner.h:180
 AliITSMisAligner.h:181
 AliITSMisAligner.h:182
 AliITSMisAligner.h:183
 AliITSMisAligner.h:184
 AliITSMisAligner.h:185
 AliITSMisAligner.h:186
 AliITSMisAligner.h:187
 AliITSMisAligner.h:188
 AliITSMisAligner.h:189
 AliITSMisAligner.h:190
 AliITSMisAligner.h:191
 AliITSMisAligner.h:192
 AliITSMisAligner.h:193
 AliITSMisAligner.h:194
 AliITSMisAligner.h:195
 AliITSMisAligner.h:196
 AliITSMisAligner.h:197
 AliITSMisAligner.h:198
 AliITSMisAligner.h:199
 AliITSMisAligner.h:200
 AliITSMisAligner.h:201
 AliITSMisAligner.h:202
 AliITSMisAligner.h:203
 AliITSMisAligner.h:204
 AliITSMisAligner.h:205
 AliITSMisAligner.h:206
 AliITSMisAligner.h:207
 AliITSMisAligner.h:208
 AliITSMisAligner.h:209
 AliITSMisAligner.h:210
 AliITSMisAligner.h:211
 AliITSMisAligner.h:212
 AliITSMisAligner.h:213
 AliITSMisAligner.h:214
 AliITSMisAligner.h:215
 AliITSMisAligner.h:216
 AliITSMisAligner.h:217
 AliITSMisAligner.h:218
 AliITSMisAligner.h:219
 AliITSMisAligner.h:220
 AliITSMisAligner.h:221
 AliITSMisAligner.h:222
 AliITSMisAligner.h:223
 AliITSMisAligner.h:224
 AliITSMisAligner.h:225
 AliITSMisAligner.h:226
 AliITSMisAligner.h:227
 AliITSMisAligner.h:228
 AliITSMisAligner.h:229
 AliITSMisAligner.h:230
 AliITSMisAligner.h:231
 AliITSMisAligner.h:232
 AliITSMisAligner.h:233