]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/MakeITSFullMisAlignment.C
Added protection in case gGeoManager is a null pointer
[u/mrichter/AliRoot.git] / ITS / MakeITSFullMisAlignment.C
1 #if !defined(__CINT__) || defined(__MAKECINT__)
2 #include <TError.h>
3 #include <TFile.h>
4 #include <TGeoManager.h>
5 #include <TMath.h>
6 #include <TString.h>
7 #include <TSystem.h>
8 #include "AliCDBPath.h"
9 #include "AliCDBEntry.h"
10 #include "AliCDBManager.h"
11 #include "AliCDBStorage.h"
12 #include "AliGeomManager.h"
13 #include "AliITSMisalignMaker.h"
14 #endif
15 void MakeITSFullMisAlignment() {
16 //========================================================================
17 //
18 // Macro for ITS full (realistic) misalignment
19 //
20 // Main author: L. Gaudichet
21 // Contact: andrea.dainese@lnl.infn.it
22 //
23 //========================================================================
24
25
26   const char* macroname = "MakeITSFullMisAlignment.C";
27
28   // Activate CDB storage and load geometry from CDB
29   AliCDBManager* cdb = AliCDBManager::Instance();
30   if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT");
31   cdb->SetRun(0);
32   
33   AliCDBStorage* storage = NULL;
34
35   TString compare("kTRUE");
36   if(gSystem->Getenv("TOCDB") == compare.Data()){
37     TString Storage = gSystem->Getenv("STORAGE");
38     if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
39       Error(macroname,"STORAGE variable set to %s is not valid. Exiting\n",Storage.Data());
40       return;
41     }
42     storage = cdb->GetStorage(Storage.Data());
43     if(!storage){
44       Error(macroname,"Unable to open storage %s\n",Storage.Data());
45       return;
46     }
47     AliCDBPath path("GRP","Geometry","Data");
48     AliCDBEntry *entry = storage->Get(path.GetPath(),cdb->GetRun());
49     if(!entry) Fatal(macroname,"Could not get the specified CDB entry!");
50     entry->SetOwner(0);
51     TGeoManager* geom = (TGeoManager*) entry->GetObject();
52     AliGeomManager::SetGeometry(geom);
53   }else{
54     AliGeomManager::LoadGeometry("geometry.root"); //load geom from default CDB storage
55   }    
56
57   //   SETTINGS:
58   //   - tranformations are defined by the "maximum transformation" 
59   //     dx,dy,dz,dpsi,dtheta,dphi: then we take a Gaussian with sigma=dx/3
60   //     and we cut it at +- 3*sigma = dx 
61   //     (the option "unif" allows to sample from a uniform distr.)
62   //   - units are cm and deg
63   //   - transformations are defined in the local frame of the volume
64   //     being misaligned
65   //
66   const Float_t kRadToDeg = 180./TMath::Pi();
67
68
69   //=****************************************
70   // overall ITS misalignment :              source - 
71   //=****************************************
72   Float_t its_dx     = 0.0000;   // ?
73   Float_t its_dy     = 0.0000;    // ?
74   Float_t its_dz     = 0.0000;    // ?
75   Float_t its_dpsi   = 0.0000;   // ?
76   Float_t its_dtheta = 0.0000;  // ?
77   Float_t its_dphi   = 0.0000;   // ?
78
79   //=****************************************
80   // misalignment at the level of SPD sectors : source - A.Pepato
81   //=****************************************
82   Float_t spdsector_dx     = 0.0050; //  50 micron (~tangetial, i.e. rphi) 
83   Float_t spdsector_dy     = 0.0100; // 100 micron (~radial)
84   Float_t spdsector_dz     = 0.0100; // 100 micron
85   Float_t spdsector_dpsi   = 0.0100/30.*kRadToDeg;; // so as to have 100 micron difference at the two extremes
86   Float_t spdsector_dtheta = 0.0100/30.*kRadToDeg;; // so as to have 100 micron difference at the two extremes
87   Float_t spdsector_dphi   = 0.0050/1.5*kRadToDeg;; // so as to have 50 micron difference at the two extremes
88   Bool_t unifspdsector=kTRUE;
89
90   //=****************************************
91   // misalignment at the level of SPD half-barrels : source - A.Pepato
92   //=****************************************
93   Float_t spdhalfbarrel_dx     = 0.0200; // 200 micron  
94   Float_t spdhalfbarrel_dy     = 0.0200; // 200 micron 
95   Float_t spdhalfbarrel_dz     = 0.0200; // 200 micron
96   Float_t spdhalfbarrel_dpsi   = 0.0100/30.*kRadToDeg; // so as to have 100 micron difference at the two extremes
97   Float_t spdhalfbarrel_dtheta = 0.0100/30.*kRadToDeg; // so as to have 100 micron difference at the two extremes
98   Float_t spdhalfbarrel_dphi   = 0.0100/7.*kRadToDeg; // so as to have 100 micron difference at the two extremes
99
100   //=****************************************
101   // misalignment at the level of SPD barrel : source - A.Pepato
102   //=****************************************
103     Float_t spdbarrel_dx     = 0.1000; // 1 mm (very pessimistic)  
104     Float_t spdbarrel_dy     = 0.1000; // 1 mm (very pessimistic)
105     Float_t spdbarrel_dz     = 0.1000; // 1 mm (very pessimistic)
106     Float_t spdbarrel_dpsi   = 0.0500/30.*kRadToDeg; // so as to have 500 micron difference at the two extremes
107     Float_t spdbarrel_dtheta = 0.0500/30.*kRadToDeg; // so as to have 500 micron difference at the two extremes
108     Float_t spdbarrel_dphi   = 0.0500/7.*kRadToDeg; // so as to have 500 micron difference at the two extremes
109   
110
111   //=****************************************
112   // misalignment at the level of SDD and SSD layers: source - B.Giraudo
113   //=****************************************
114   Float_t sddlayer_dx     = 0.0010; // 10 micron
115   Float_t sddlayer_dy     = 0.0010; // 10 micron
116   Float_t sddlayer_dz     = 0.0010; // 10 micron
117   Float_t sddlayer_dpsi   = 0.0010/52.*kRadToDeg; // so as to have 10 micron difference at the two extremes
118   Float_t sddlayer_dtheta = 0.0010/52.*kRadToDeg; // so as to have 10 micron difference at the two extremes
119   Float_t sddlayer_dphi   = 0.0010/20.*kRadToDeg;  // so as to have 10 micron difference at the two extremes
120
121   Float_t ssdlayer_dx     = 0.0010; // 10 micron
122   Float_t ssdlayer_dy     = 0.0010; // 10 micron
123   Float_t ssdlayer_dz     = 0.0010; // 10 micron
124   Float_t ssdlayer_dpsi   = 0.0010/90.*kRadToDeg; // so as to have 10 micron difference at the two extremes
125   Float_t ssdlayer_dtheta = 0.0010/90.*kRadToDeg; // so as to have 10 micron difference at the two extremes
126   Float_t ssdlayer_dphi   = 0.0010/40.*kRadToDeg;  // so as to have 10 micron difference at the two extremes
127
128   Float_t sddbarrel_dx     = 0.0020; // 20 micron
129   Float_t sddbarrel_dy     = 0.0020; // 20 micron
130   Float_t sddbarrel_dz     = 0.0020; // 20 micron
131   Float_t sddbarrel_dpsi   = 0.0020/52.*kRadToDeg; // so as to have 20 micron difference at the two extremes
132   Float_t sddbarrel_dtheta = 0.0020/52.*kRadToDeg; // so as to have 20 micron difference at the two extremes
133   Float_t sddbarrel_dphi   = 0.0020/20.*kRadToDeg;  // so as to have 20 micron difference at the two extremes
134
135   Float_t ssdbarrel_dx     = 0.0020; // 20 micron
136   Float_t ssdbarrel_dy     = 0.0020; // 20 micron
137   Float_t ssdbarrel_dz     = 0.0020; // 20 micron
138   Float_t ssdbarrel_dpsi   = 0.0020/90.*kRadToDeg; // so as to have 20 micron difference at the two extremes
139   Float_t ssdbarrel_dtheta = 0.0020/90.*kRadToDeg; // so as to have 20 micron difference at the two extremes
140   Float_t ssdbarrel_dphi   = 0.0020/40.*kRadToDeg;  // so as to have 20 micron difference at the two extremes
141
142   //=****************************************
143   // misalignment at the level of half-staves (SPD) : source - S.Moretto
144   //                              ladders (SDD,SSD) : source -
145   //=****************************************
146   Float_t spdhalfstave_dx     = 0.0100; // 100 micron // normal to plane  
147   Float_t spdhalfstave_dy     = 0.0020; // 20 micron 
148   Float_t spdhalfstave_dz     = 0.0020; // 20 micron
149   Float_t spdhalfstave_dpsi   = 0.0020/7.*kRadToDeg; // so as to have 20 micron difference at the two extremes
150   Float_t spdhalfstave_dtheta = 0.0050/7.*kRadToDeg; // so as to have 50 micron difference at the two extremes
151   Float_t spdhalfstave_dphi   = 0.0050/0.7*kRadToDeg; // so as to have 50 micron difference at the two extremes
152   Bool_t unifspdhalfstave=kTRUE;
153
154   Float_t sddladder_dx     = 0.0005; // 5 micron  
155   Float_t sddladder_dy     = 0.0005; // 5 micron 
156   Float_t sddladder_dz     = 0.0005; // 5 micron
157   Float_t sddladder_dpsi   = 0.00; //  ?
158   Float_t sddladder_dtheta = 0.00; //  ?
159   Float_t sddladder_dphi   = 0.00; //  ?
160
161   Float_t ssdladder_dx     = 0.0005; // 5 micron  
162   Float_t ssdladder_dy     = 0.0005; // 5 micron 
163   Float_t ssdladder_dz     = 0.0005; // 5 micron
164   Float_t ssdladder_dpsi   = 0.00; //  ?
165   Float_t ssdladder_dtheta = 0.00; //  ?
166   Float_t ssdladder_dphi   = 0.00; //  ?
167
168
169   //=****************************************
170   // misalignment at the level of ladders (SPD) : source - R.Santoro
171   //                              modules (SDD) : source - L.Gaudichet
172   //                              modules (SSD) : source - 
173   //=****************************************
174   Float_t spdladder_dx     = 0.0010; // 10 micron  
175   Float_t spdladder_dy     = 0.0030; // 50 micron 
176   Float_t spdladder_dz     = 0.0010; // 10 micron
177   Float_t spdladder_dpsi   = 0.0001*kRadToDeg; // 0.1 mrad
178   Float_t spdladder_dtheta = 0.0001*kRadToDeg; // 0.1 mrad
179   Float_t spdladder_dphi   = 0.0001*kRadToDeg; // 0.1 mrad
180
181   Float_t sddmodule_dx     = 0.0045; // 45 micron  
182   Float_t sddmodule_dy     = 0.0045; // 45 micron 
183   Float_t sddmodule_dz     = 0.0105; // 105 micron
184   Float_t sddmodule_dpsi   = 0.00; // ?
185   Float_t sddmodule_dtheta = 0.00; //  ?
186   Float_t sddmodule_dphi   = 0.00; //  ?
187
188   Float_t ssdmodule_dx     = 0.0050; // 50 micron  
189   Float_t ssdmodule_dy     = 0.0050; // 50 micron 
190   Float_t ssdmodule_dz     = 0.0050; // 50 micron
191   Float_t ssdmodule_dpsi   = 0.00; // ?
192   Float_t ssdmodule_dtheta = 0.00; //  ?
193   Float_t ssdmodule_dphi   = 0.00; //  ?
194   //
195   // END SETTINGS
196
197
198   AliITSMisalignMaker alignMaker;
199
200   //=****************************************
201   // overall ITS misalignment :
202   //=****************************************
203
204   alignMaker.AddAlignObj("ITS",its_dx,its_dy,its_dz,its_dpsi,its_dtheta,its_dphi,kFALSE);
205
206
207   //=****************************************
208   // misalignment at the level of SPD barrel, half-barrels, and at the level
209   // of SPD sectors
210   //=****************************************
211
212   Double_t vx,vy,vz,vpsi,vtheta,vphi;
213   Double_t vxbarrel,vybarrel,vzbarrel,vpsibarrel,vthetabarrel,vphibarrel;
214
215   //   barrel
216   vxbarrel = alignMaker.GaussCut(0,spdbarrel_dx/3,spdbarrel_dx);
217   vybarrel = alignMaker.GaussCut(0,spdbarrel_dy/3,spdbarrel_dy);
218   vzbarrel = alignMaker.GaussCut(0,spdbarrel_dz/3,spdbarrel_dz);
219   vpsibarrel = alignMaker.GaussCut(0,spdbarrel_dpsi/3,spdbarrel_dpsi);
220   vthetabarrel = alignMaker.GaussCut(0,spdbarrel_dtheta/3,spdbarrel_dtheta);
221   vphibarrel = alignMaker.GaussCut(0,spdbarrel_dphi/3,spdbarrel_dphi);
222
223   //  top half-barrel
224   vx = alignMaker.GaussCut(0,spdhalfbarrel_dx/3,spdhalfbarrel_dx);
225   vy = alignMaker.GaussCut(0,spdhalfbarrel_dy/3,spdhalfbarrel_dy);
226   vz = alignMaker.GaussCut(0,spdhalfbarrel_dz/3,spdhalfbarrel_dz);
227   vpsi = alignMaker.GaussCut(0,spdhalfbarrel_dpsi/3,spdhalfbarrel_dpsi);
228   vtheta = alignMaker.GaussCut(0,spdhalfbarrel_dtheta/3,spdhalfbarrel_dtheta);
229   vphi = alignMaker.GaussCut(0,spdhalfbarrel_dphi/3,spdhalfbarrel_dphi);
230
231   vx += vxbarrel;
232   vy += vybarrel;
233   vz += vzbarrel;
234   vpsi += vpsibarrel;
235   vtheta += vthetabarrel;
236   vphi += vphibarrel;
237
238   alignMaker.AddSectorAlignObj(1,5,spdsector_dx,spdsector_dy,spdsector_dz,
239                                spdsector_dpsi,spdsector_dtheta,spdsector_dphi,
240                                vx,vy,vz,vpsi,vtheta,vphi,unifspdsector);
241
242   //  bottom half-barrel
243   vx = alignMaker.GaussCut(0,spdhalfbarrel_dx/3,spdhalfbarrel_dx);
244   vy = alignMaker.GaussCut(0,spdhalfbarrel_dy/3,spdhalfbarrel_dy);
245   vz = alignMaker.GaussCut(0,spdhalfbarrel_dz/3,spdhalfbarrel_dz);
246   vpsi = alignMaker.GaussCut(0,spdhalfbarrel_dpsi/3,spdhalfbarrel_dpsi);
247   vtheta = alignMaker.GaussCut(0,spdhalfbarrel_dtheta/3,spdhalfbarrel_dtheta);
248   vphi = alignMaker.GaussCut(0,spdhalfbarrel_dphi/3,spdhalfbarrel_dphi);
249
250   vx += vxbarrel;
251   vy += vybarrel;
252   vz += vzbarrel;
253   vpsi += vpsibarrel;
254   vtheta += vthetabarrel;
255   vphi += vphibarrel;
256
257   alignMaker.AddSectorAlignObj(6,10,spdsector_dx,spdsector_dy,spdsector_dz,
258                                spdsector_dpsi,spdsector_dtheta,spdsector_dphi,
259                                vx,vy,vz,vpsi,vtheta,vphi,unifspdsector);
260
261
262
263   //=****************************************
264   // misalignment at the level of half-staves (SPD)/ladders&layers (SDD,SSD) :
265   //=****************************************
266
267   // SPD
268   alignMaker.AddAlignObj(0,-1,spdhalfstave_dx,spdhalfstave_dy,spdhalfstave_dz,spdhalfstave_dpsi,spdhalfstave_dtheta,spdhalfstave_dphi,0,0,0,0,0,0,unifspdhalfstave); // all SPD1 half-staves
269   alignMaker.AddAlignObj(1,-1,spdhalfstave_dx,spdhalfstave_dy,spdhalfstave_dz,spdhalfstave_dpsi,spdhalfstave_dtheta,spdhalfstave_dphi,0,0,0,0,0,0,unifspdhalfstave); // all SPD2 half-staves
270
271   // SDD
272   //   barrel
273   vxbarrel = alignMaker.GetUnif(-sddbarrel_dx,sddbarrel_dx);
274   vybarrel = alignMaker.GetUnif(-sddbarrel_dy,sddbarrel_dy);
275   vzbarrel = alignMaker.GetUnif(-sddbarrel_dz,sddbarrel_dz);
276   vpsibarrel = alignMaker.GetUnif(-sddbarrel_dpsi,sddbarrel_dpsi);
277   vthetabarrel = alignMaker.GetUnif(-sddbarrel_dtheta,sddbarrel_dtheta);
278   vphibarrel = alignMaker.GetUnif(-sddbarrel_dphi,sddbarrel_dphi);
279
280   //  layer SDD1
281   vx = alignMaker.GetUnif(-sddlayer_dx,sddlayer_dx);
282   vy = alignMaker.GetUnif(-sddlayer_dy,sddlayer_dy);
283   vz = alignMaker.GetUnif(-sddlayer_dz,sddlayer_dz);
284   vpsi = alignMaker.GetUnif(-sddlayer_dpsi,sddlayer_dpsi);
285   vtheta = alignMaker.GetUnif(-sddlayer_dtheta,sddlayer_dtheta);
286   vphi = alignMaker.GetUnif(-sddlayer_dphi,sddlayer_dphi);
287
288   vx += vxbarrel;
289   vy += vybarrel;
290   vz += vzbarrel;
291   vpsi += vpsibarrel;
292   vtheta += vthetabarrel;
293   vphi += vphibarrel;
294
295   alignMaker.AddAlignObj(2,-1,sddladder_dx,sddladder_dy,sddladder_dz,sddladder_dpsi,sddladder_dtheta,sddladder_dphi,vx,vy,vz,vpsi,vtheta,vphi,kFALSE); // all SDD1 ladders
296
297   //  layer SDD2
298   vx = alignMaker.GetUnif(-sddlayer_dx,sddlayer_dx);
299   vy = alignMaker.GetUnif(-sddlayer_dy,sddlayer_dy);
300   vz = alignMaker.GetUnif(-sddlayer_dz,sddlayer_dz);
301   vpsi = alignMaker.GetUnif(-sddlayer_dpsi,sddlayer_dpsi);
302   vtheta = alignMaker.GetUnif(-sddlayer_dtheta,sddlayer_dtheta);
303   vphi = alignMaker.GetUnif(-sddlayer_dphi,sddlayer_dphi);
304
305   vx += vxbarrel;
306   vy += vybarrel;
307   vz += vzbarrel;
308   vpsi += vpsibarrel;
309   vtheta += vthetabarrel;
310   vphi += vphibarrel;
311
312   alignMaker.AddAlignObj(3,-1,sddladder_dx,sddladder_dy,sddladder_dz,sddladder_dpsi,sddladder_dtheta,sddladder_dphi,vx,vy,vz,vpsi,vtheta,vphi,kFALSE); // all SDD2 ladders
313
314   // SSD
315   //   barrel
316   vxbarrel = alignMaker.GetUnif(-ssdbarrel_dx,ssdbarrel_dx);
317   vybarrel = alignMaker.GetUnif(-ssdbarrel_dy,ssdbarrel_dy);
318   vzbarrel = alignMaker.GetUnif(-ssdbarrel_dz,ssdbarrel_dz);
319   vpsibarrel = alignMaker.GetUnif(-ssdbarrel_dpsi,ssdbarrel_dpsi);
320   vthetabarrel = alignMaker.GetUnif(-ssdbarrel_dtheta,ssdbarrel_dtheta);
321   vphibarrel = alignMaker.GetUnif(-ssdbarrel_dphi,ssdbarrel_dphi);
322
323   //  layer SSD1
324   vx = alignMaker.GetUnif(-ssdlayer_dx,ssdlayer_dx);
325   vy = alignMaker.GetUnif(-ssdlayer_dy,ssdlayer_dy);
326   vz = alignMaker.GetUnif(-ssdlayer_dz,ssdlayer_dz);
327   vpsi = alignMaker.GetUnif(-ssdlayer_dpsi,ssdlayer_dpsi);
328   vtheta = alignMaker.GetUnif(-ssdlayer_dtheta,ssdlayer_dtheta);
329   vphi = alignMaker.GetUnif(-ssdlayer_dphi,ssdlayer_dphi);
330
331   vx += vxbarrel;
332   vy += vybarrel;
333   vz += vzbarrel;
334   vpsi += vpsibarrel;
335   vtheta += vthetabarrel;
336   vphi += vphibarrel;
337
338   alignMaker.AddAlignObj(4,-1,ssdladder_dx,ssdladder_dy,ssdladder_dz,ssdladder_dpsi,ssdladder_dtheta,ssdladder_dphi,vx,vy,vz,vpsi,vtheta,vphi,kFALSE); // all SSD1 ladders
339
340   //  layer SSD2
341   vx = alignMaker.GetUnif(-ssdlayer_dx,ssdlayer_dx);
342   vy = alignMaker.GetUnif(-ssdlayer_dy,ssdlayer_dy);
343   vz = alignMaker.GetUnif(-ssdlayer_dz,ssdlayer_dz);
344   vpsi = alignMaker.GetUnif(-ssdlayer_dpsi,ssdlayer_dpsi);
345   vtheta = alignMaker.GetUnif(-ssdlayer_dtheta,ssdlayer_dtheta);
346   vphi = alignMaker.GetUnif(-ssdlayer_dphi,ssdlayer_dphi);
347
348   vx += vxbarrel;
349   vy += vybarrel;
350   vz += vzbarrel;
351   vpsi += vpsibarrel;
352   vtheta += vthetabarrel;
353   vphi += vphibarrel;
354
355   alignMaker.AddAlignObj(5,-1,ssdladder_dx,ssdladder_dy,ssdladder_dz,ssdladder_dpsi,ssdladder_dtheta,ssdladder_dphi,vx,vy,vz,vpsi,vtheta,vphi,kFALSE); // all SSD2 ladders
356
357   //=****************************************
358   // misalignment at the level of ladders (SPD)/modules (SDD,SSD) :
359   //=****************************************
360
361   alignMaker.AddAlignObj(0,spdladder_dx,spdladder_dy,spdladder_dz,spdladder_dpsi,spdladder_dtheta,spdladder_dphi,kFALSE); // all SPD1 ladders
362   alignMaker.AddAlignObj(1,spdladder_dx,spdladder_dy,spdladder_dz,spdladder_dpsi,spdladder_dtheta,spdladder_dphi,kFALSE); // all SPD2 ladders
363
364   alignMaker.AddAlignObj(2,sddmodule_dx,sddmodule_dy,sddmodule_dz,sddmodule_dpsi,sddmodule_dtheta,sddmodule_dphi,kFALSE); // all SDD1 modules
365   alignMaker.AddAlignObj(3,sddmodule_dx,sddmodule_dy,sddmodule_dz,sddmodule_dpsi,sddmodule_dtheta,sddmodule_dphi,kFALSE); // all SDD2 modules
366
367   alignMaker.AddAlignObj(4,ssdmodule_dx,ssdmodule_dy,ssdmodule_dz,ssdmodule_dpsi,ssdmodule_dtheta,ssdmodule_dphi,kFALSE); // all SSD1 modules
368   alignMaker.AddAlignObj(5,ssdmodule_dx,ssdmodule_dy,ssdmodule_dz,ssdmodule_dpsi,ssdmodule_dtheta,ssdmodule_dphi,kFALSE); // all SSD2 modules
369
370
371
372   if( gSystem->Getenv("TOCDB") != compare.Data() ){
373     // save on file
374     const char* filename = "ITSfullMisalignment.root";
375     TFile f(filename,"RECREATE");
376     if(!f.IsOpen()){
377       Error(macroname,"cannot open file for output\n");
378       return;
379     }
380     Info(macroname,"Saving alignment objects to the file %s",filename);
381     f.cd();
382     f.WriteObject(alignMaker.GetArray(),"ITSAlignObjs","kSingleKey");
383     f.Close();
384   }else{
385     // save in CDB storage
386     AliCDBMetaData *md= new AliCDBMetaData();
387     md->SetResponsible("Andrea Dainese");
388     md->SetComment("Alignment objects with actual ITS misalignment");
389     md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
390     AliCDBId id("ITS/Align/Data",0,AliCDBRunRange::Infinity());
391     storage->Put(alignMaker.GetArray(),id,md);
392   }
393
394
395   return;
396 }