+
+ return kTRUE;
+}
+
+//________________________________________________________________________
+Bool_t AliITSMisAligner::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) {
+ //
+ // misalignment at the level of half-staves/ladders (ladd=-1 means that all ladders are scanned)
+ //
+ Double_t vx,vy,vz,vpsi,vtheta,vphi;
+ Double_t tr[3],rot[3];
+
+ Int_t laddMin = ladd;
+ Int_t laddMax = laddMin+1;
+ if (ladd<0) {
+ laddMin = 0;
+ laddMax = fgkNLadders[lay];
+ }
+
+ for (Int_t iLadd=laddMin; iLadd<laddMax; iLadd++) {
+
+ Int_t nHS = 1;
+ if (lay<2) nHS = 2;
+ for (Int_t iHalfStave=0; iHalfStave<nHS; iHalfStave++) {
+
+ if(!unif) {
+ vx = AliMathBase::TruncatedGaus(0.,dx/3.,dx); // mean, sigma, max absolute value
+ vy = AliMathBase::TruncatedGaus(0.,dy/3.,dy);
+ vz = AliMathBase::TruncatedGaus(0.,dz/3.,dz);
+ vpsi = AliMathBase::TruncatedGaus(0.,dpsi/3.,dpsi);
+ vtheta = AliMathBase::TruncatedGaus(0.,dtheta/3.,dtheta);
+ vphi = AliMathBase::TruncatedGaus(0.,dphi/3.,dphi);
+ } else {
+ vx = fRnd.Uniform(-dx,dx);
+ vy = fRnd.Uniform(-dy,dy);
+ vz = fRnd.Uniform(-dz,dz);
+ vpsi = fRnd.Uniform(-dpsi,dpsi);
+ vtheta = fRnd.Uniform(-dtheta,dtheta);
+ vphi = fRnd.Uniform(-dphi,dphi);
+ }
+
+ TString name(GetHalfStaveLadderSymbName(lay,iLadd,iHalfStave));
+
+ // first apply half-stave / ladder level misalignment
+ AliAlignObjParams aaop(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE); // set them as local
+ aaop.GetPars(tr,rot); // global
+
+ // then, apply layer-level misalignment (only for SDD and SSD)
+ if(lay>1) {
+ tr[0] += xShift;
+ tr[1] += yShift;
+ tr[2] += zShift;
+ rot[0] += psiShift;
+ rot[1] += thetaShift;
+ rot[2] += phiShift;
+ }
+ new((*fAlignObjArray)[fInd]) AliAlignObjParams(name.Data(),0,tr[0],tr[1],tr[2],rot[0],rot[1],rot[2],kTRUE); // set them as global
+
+ AliAlignObjParams* itsalobj = (AliAlignObjParams*) fAlignObjArray->UncheckedAt(fInd);
+ itsalobj->ApplyToGeometry();
+ fInd++;
+ }
+ }
+
+ return kTRUE;