1 /**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 //========================================================================
20 // This class is a helper, producing ITS aligmnent objects.
21 // It provides also some useful functions
22 // See the parameters of the misalignment at the end of this script.
24 // Main author: L. Gaudichet
25 // Contact: andrea.dainese@lnl.infn.it
27 //========================================================================
30 #include <TClonesArray.h>
35 #include "AliAlignObjParams.h"
36 #include "AliITSMisalignMaker.h"
39 ClassImp(AliITSMisalignMaker)
41 const Int_t AliITSMisalignMaker::fgkNLadders[AliITSMisalignMaker::kNLayers] = {20,40,14,22,34,38};
42 const Int_t AliITSMisalignMaker::fgkNDetectors[AliITSMisalignMaker::kNLayers] = {4,4,6,8,22,25};
45 //________________________________________________________________________
46 AliITSMisalignMaker::AliITSMisalignMaker():
49 fAlobj(TClonesArray("AliAlignObjParams",4000)),
54 fStrHalfStave("/HalfStave"),
55 fStrLadder("/Ladder"),
56 fStrSector("/Sector"),
59 fRnd.SetSeed(23472341);
61 //________________________________________________________________________
62 Int_t AliITSMisalignMaker::AddAlignObj(char* name,Double_t dx,Double_t dy,Double_t dz,
63 Double_t dpsi,Double_t dtheta,Double_t dphi,Bool_t unif) {
65 Double_t vx,vy,vz,vpsi,vtheta,vphi;
68 vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value
69 vy = GaussCut(0,dy/3.,dy);
70 vz = GaussCut(0,dz/3.,dz);
71 vpsi = GaussCut(0,dpsi/3., dpsi );
72 vtheta = GaussCut(0,dtheta/3.,dtheta);
73 vphi = GaussCut(0,dphi/3., dphi);
75 vx = fRnd.Uniform(-dx,dx);
76 vy = fRnd.Uniform(-dy,dy);
77 vz = fRnd.Uniform(-dz,dz);
78 vpsi = fRnd.Uniform(-dpsi,dpsi);
79 vtheta = fRnd.Uniform(-dtheta,dtheta);
80 vphi = fRnd.Uniform(-dphi,dphi);
83 new(fAlobj[fInd]) AliAlignObjParams(name,0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
85 AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
86 its_alobj->ApplyToGeometry();
94 //________________________________________________________________________
95 Int_t AliITSMisalignMaker::AddAlignObj(Int_t lay,Double_t dx,Double_t dy,Double_t dz,
96 Double_t dpsi,Double_t dtheta,Double_t dphi,Bool_t unif) {
98 // misalignment at the level of ladders/modules
99 lay+=1; // layers are numbered from 1 to 6 in AliGeomManager
101 printf("LAYER %d MODULES %d\n",lay,AliGeomManager::LayerSize(lay));
103 for (Int_t iModule = 0; iModule < AliGeomManager::LayerSize(lay); iModule++) {
105 Double_t vx,vy,vz,vpsi,vtheta,vphi;
108 vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value
109 vy = GaussCut(0,dy/3.,dy);
110 vz = GaussCut(0,dz/3.,dz);
111 vpsi = GaussCut(0,dpsi/3., dpsi );
112 vtheta = GaussCut(0,dtheta/3.,dtheta);
113 vphi = GaussCut(0,dphi/3., dphi);
115 vx = fRnd.Uniform(-dx,dx);
116 vy = fRnd.Uniform(-dy,dy);
117 vz = fRnd.Uniform(-dz,dz);
118 vpsi = fRnd.Uniform(-dpsi,dpsi);
119 vtheta = fRnd.Uniform(-dtheta,dtheta);
120 vphi = fRnd.Uniform(-dphi,dphi);
123 UShort_t volid = AliGeomManager::LayerToVolUID(lay,iModule);
124 const char *symname = AliGeomManager::SymName(volid);
126 new(fAlobj[fInd]) AliAlignObjParams(symname,volid,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
127 AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
128 its_alobj->ApplyToGeometry();
136 //________________________________________________________________________
137 Int_t AliITSMisalignMaker::AddAlignObj(Int_t lay,Int_t ladd,Double_t dx,Double_t dy,Double_t dz,
138 Double_t dpsi,Double_t dtheta,Double_t dphi,Bool_t unif) {
140 // misalignment at the level of half-staves/ladders (ladd=-1 means that all ladders are scanned)
142 Double_t vx,vy,vz,vpsi,vtheta,vphi;
144 Int_t laddMin = ladd;
145 Int_t laddMax = laddMin+1;
148 laddMax = fgkNLadders[lay];
151 for (Int_t iLadd=laddMin; iLadd<laddMax; iLadd++) {
155 for (Int_t iHalfStave=0; iHalfStave<nHS; iHalfStave++) {
158 vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value
159 vy = GaussCut(0,dy/3.,dy);
160 vz = GaussCut(0,dz/3.,dz);
161 vpsi = GaussCut(0,dpsi/3., dpsi );
162 vtheta = GaussCut(0,dtheta/3.,dtheta);
163 vphi = GaussCut(0,dphi/3., dphi);
165 vx = fRnd.Uniform(-dx,dx);
166 vy = fRnd.Uniform(-dy,dy);
167 vz = fRnd.Uniform(-dz,dz);
168 vpsi = fRnd.Uniform(-dpsi,dpsi);
169 vtheta = fRnd.Uniform(-dtheta,dtheta);
170 vphi = fRnd.Uniform(-dphi,dphi);
173 TString name = GetHalfStaveLadderSymbName(lay,iLadd,iHalfStave);
174 new(fAlobj[fInd]) AliAlignObjParams(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE);
175 AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
176 its_alobj->ApplyToGeometry();
185 //________________________________________________________________________
186 Int_t AliITSMisalignMaker::AddSectorAlignObj(Int_t sectMin,Int_t sectMax,
187 Double_t dx,Double_t dy,Double_t dz,
188 Double_t dpsi,Double_t dtheta,Double_t dphi,
189 Double_t xShift,Double_t yShift,Double_t zShift,
190 Double_t psiShift,Double_t thetaShift,Double_t phiShift,Bool_t unif) {
192 // misalignment at the level of SPD sectors and half-barrels
194 if ((sectMin<1) || (sectMax>10)) return kFALSE;
195 Double_t vx,vy,vz,vpsi,vtheta,vphi;
196 Double_t tr[3],rot[3];
198 for (Int_t iSect = sectMin-1; iSect<sectMax; iSect++) {
200 // first, apply sector level misalignment
202 vx = GaussCut(0,dx/3.,dx); // mean, sigma, max absolute value
203 vy = GaussCut(0,dy/3.,dy);
204 vz = GaussCut(0,dz/3.,dz);
205 vpsi = GaussCut(0,dpsi/3., dpsi );
206 vtheta = GaussCut(0,dtheta/3.,dtheta);
207 vphi = GaussCut(0,dphi/3., dphi);
209 vx = fRnd.Uniform(-dx,dx);
210 vy = fRnd.Uniform(-dy,dy);
211 vz = fRnd.Uniform(-dz,dz);
212 vpsi = fRnd.Uniform(-dpsi,dpsi);
213 vtheta = fRnd.Uniform(-dtheta,dtheta);
214 vphi = fRnd.Uniform(-dphi,dphi);
217 TString name = GetSymbName(0);
222 AliAlignObjParams aaop(name.Data(),0,vx,vy,vz,vpsi,vtheta,vphi,kFALSE); // set them as local
223 aaop.GetPars(tr,rot); // global
225 // then, apply half-barrel level misalignment
230 rot[1] += thetaShift;
233 new(fAlobj[fInd]) AliAlignObjParams(name.Data(),0,tr[0],tr[1],tr[2],rot[0],rot[1],rot[2],kTRUE); // set them as global
235 AliAlignObjParams* its_alobj = (AliAlignObjParams*) fAlobj.UncheckedAt(fInd);
236 its_alobj->ApplyToGeometry();
242 //________________________________________________________________________
243 Double_t AliITSMisalignMaker::GaussCut(Double_t mean,Double_t sigma,Double_t absMax) {
245 Double_t val = fRnd.Gaus(mean,sigma);
246 while (TMath::Abs(val)>absMax)
247 val = fRnd.Gaus(mean,sigma);
251 //________________________________________________________________________
252 TString AliITSMisalignMaker::GetSymbName(Int_t layer) const {
254 // be careful : SPD0 and SPD1 are not physically separated
258 case 1: name = fStrSPD; name += layer; break;
260 case 3: name = fStrSDD; name += layer; break;
262 case 5: name = fStrSSD; name += layer; break;
263 default: AliFatal("Wrong layer index");
268 //________________________________________________________________________
269 TString AliITSMisalignMaker::GetHalfStaveLadderSymbName(Int_t layer,Int_t ladd,Int_t halfStave) const {
271 // Get logical names at the level of half-staves (SPD) or ladders (SDD and SSD)
273 TString name = GetSymbName(layer);
274 if (layer==0) { // SPD1
279 int stave = ladd-sector*2;
282 name += fStrHalfStave;
285 else if (layer==1) { // SPD2
290 int stave = ladd-sector*4;
293 name += fStrHalfStave;
296 else if (layer>=2 && layer<=5) { // SDD and SSD
301 AliFatal("Wrong layer index");
306 //________________________________________________________________________
307 TString AliITSMisalignMaker::GetSymbName(Int_t layer,Int_t ladd) const {
309 // Get logical names at the level of staves / ladders
311 TString name = GetSymbName(layer);
312 if (layer==0) { // SPD1
317 int stave = ladd-sector*2;
321 else if (layer==1) { // SPD2
326 int stave = ladd-sector*4;
330 else if (layer>=2 && layer<=5) { // SDD and SSD
335 AliFatal("Wrong layer index");
340 //________________________________________________________________________
341 TString AliITSMisalignMaker::GetSymbName(Int_t layer,Int_t ladd,Int_t mod) const {
343 // Get logical names at the level of SPD ladders / SDD and SSD modules
345 Int_t halfStave = mod/2;
346 TString name = GetHalfStaveLadderSymbName(layer,ladd,halfStave);
348 if (layer<2) { // SPD
352 else if (layer>=2 && layer<=5) { // SDD and SSD
357 AliFatal("Wrong layer index");