1 #if !defined(__CINT__) || defined(__MAKECINT__)
4 #include <TGeoManager.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"
15 void MakeITSMilleSuperModules(char *geomfile="geometry.root") {
16 //========================================================================
18 // Macro for building supermodules for ITS alignment
20 // Main author: M. Lunardon
22 //========================================================================
24 const char* macroname = "MakeITSMilleSuperModules.C";
26 if (!geomfile) { // look for default geometry
27 // Activate CDB storage and load geometry from CDB
28 AliCDBManager* cdb = AliCDBManager::Instance();
29 if(!cdb->IsDefaultStorageSet()) cdb->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
32 AliCDBStorage* storage = NULL;
34 TString compare("kTRUE");
35 if(gSystem->Getenv("TOCDB") == compare.Data()){
36 TString Storage = gSystem->Getenv("STORAGE");
37 if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
38 Error(macroname,"STORAGE variable set to %s is not valid. Exiting\n",Storage.Data());
41 storage = cdb->GetStorage(Storage.Data());
43 Error(macroname,"Unable to open storage %s\n",Storage.Data());
46 AliCDBPath path("GRP","Geometry","Data");
47 AliCDBEntry *entry = storage->Get(path.GetPath(),cdb->GetRun());
48 if(!entry) Fatal(macroname,"Could not get the specified CDB entry!");
50 TGeoManager* geom = (TGeoManager*) entry->GetObject();
51 AliGeomManager::SetGeometry(geom);
53 AliGeomManager::LoadGeometry("geometry.root"); //load geom from default CDB storage
57 AliGeomManager::LoadGeometry(geomfile); //load geom from file
58 //////////////////////////////////////////////////////////////////
60 TClonesArray *array = new TClonesArray("AliAlignObjParams",2000);
61 TClonesArray &alobj = *array;
64 // custom ITS supermodules are stored as AliAlignObjParams as follow:
65 // symname, volid = SMsymname, SMvolid
66 // matrix = TGeoHMatrix of the SM in the global c.s.
67 // symname: the list of sensitive volumes, starting with "ITSMilleModuleList:"
68 // keyword, is appended to the symname
69 // example: "ITSMilleModuleList: N1 N2 N3-N4 ..."
70 // where N is a ITS sensitive volume INDEX (0-2197)
75 Double_t t[3]; // global translation
76 Double_t r[9]; // global rotation
79 // virtual volids start at layer 7
82 // LAYERS: volids 14336 to 14341
83 strcpy(modlist,"ITSMilleModuleList: 0-79");
84 sprintf(symname,"%s %s","ITS/SPD0",modlist);
85 m.Clear(); // global frame
86 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
87 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
90 strcpy(modlist,"ITSMilleModuleList: 80-239");
91 sprintf(symname,"%s %s","ITS/SPD1",modlist);
92 m.Clear(); // global frame
93 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
94 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
97 strcpy(modlist,"ITSMilleModuleList: 240-323");
98 sprintf(symname,"%s %s","ITS/SDD2",modlist);
99 m.Clear(); // global frame
100 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
101 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
104 strcpy(modlist,"ITSMilleModuleList: 324-499");
105 sprintf(symname,"%s %s","ITS/SDD3",modlist);
106 m.Clear(); // global frame
107 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
108 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
111 strcpy(modlist,"ITSMilleModuleList: 500-1247");
112 sprintf(symname,"%s %s","ITS/SSD4",modlist);
113 m.Clear(); // global frame
114 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
115 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
118 strcpy(modlist,"ITSMilleModuleList: 1248-2197");
119 sprintf(symname,"%s %s","ITS/SSD5",modlist);
120 m.Clear(); // global frame
121 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
122 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
125 // SPD BARREL: volid 14342
126 strcpy(modlist,"ITSMilleModuleList: 0-239");
127 sprintf(symname,"%s %s","ITS/SPD/Barrel",modlist);
128 m.Clear(); // global frame
129 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
130 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
133 // SPD HALF BARREL: volids 14343-14344
134 strcpy(modlist,"ITSMilleModuleList: 0-39 80-159");
135 sprintf(symname,"%s %s","ITS/SPD/HalfBarrel0",modlist); // up
136 m.Clear(); // global frame
137 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
138 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
141 strcpy(modlist,"ITSMilleModuleList: 40-79 160-239");
142 sprintf(symname,"%s %s","ITS/SPD/HalfBarrel1",modlist); // down
143 m.Clear(); // global frame
145 //m.RotateY(180.); // just negY->posY
146 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
147 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
150 // SPD sectors: volids 14345 to 14354
151 for (int is=0; is<10; is++) {
153 // sect 1: 8-15 96-111
155 sprintf(modlist,"ITSMilleModuleList: %d-%d %d-%d",is*8,is*8+7,is*16+80,is*16+80+15);
156 sprintf(symname,"ITS/SPD0/Sector%d",is);
157 if (AliGeomManager::GetMatrix(symname))
158 m=(*AliGeomManager::GetMatrix(symname));
160 Error(macroname,"cannot find matrix for SPD sector\n");
163 sprintf(symname,"%s%d %s","ITS/SPD0/Sector",is,modlist);
165 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
166 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
170 // SPD staves: volids 14355 to 14414
171 for (int is=0; is<60; is++) {
174 sprintf(modlist," ITSMilleModuleList: %d-%d",is*4,is*4+3);
175 strcpy(symname,AliITSgeomTGeo::GetSymName(is*4));
176 char *clad=strstr(symname,"Ladder");
177 if (clad) *(clad-1) = NULL;
179 Error(macroname,"cannot find 'Ladder' in symname\n");
182 //printf("Symname=%s\n",symname);
183 if (AliGeomManager::GetMatrix(symname))
184 m=(*AliGeomManager::GetMatrix(symname));
186 Error(macroname,"cannot find matrix for SPD stave\n");
190 clad=strstr(symname,"HalfStave");
191 if (clad) *(clad-1) = NULL;
193 Error(macroname,"cannot find 'HalfStave' in symname\n");
196 strcat(symname,modlist);
198 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
199 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
204 // SPD HALF staves: volids 14415 to 14534
205 for (int is=0; is<120; is++) {
208 sprintf(modlist," ITSMilleModuleList: %d-%d ",is*2,is*2+1);
209 strcpy(symname,AliITSgeomTGeo::GetSymName(is*2));
210 char *clad=strstr(symname,"Ladder");
211 if (clad) *(clad-1) = NULL;
213 Error(macroname,"cannot find 'Ladder' in symname\n");
216 if (AliGeomManager::GetMatrix(symname))
217 m=(*AliGeomManager::GetMatrix(symname));
219 Error(macroname,"cannot find matrix for SPD half-stave\n");
222 strcat(symname,modlist);
224 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
225 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
229 // SPD HALF-HALF BARREL UP/DOWN FORWARD/BACKWARD (Y>0 and Z>0): volids 14535 to 14538
230 strcpy(modlist,"ITSMilleModuleList: ");
231 for (int ii=0; ii<40; ii++) {
233 if (!(ij%2)) sprintf(modlist,"%s %d",modlist,ii);
235 for (int ii=80; ii<160; ii++) {
237 if (!(ij%2)) sprintf(modlist,"%s %d",modlist,ii);
239 sprintf(symname,"%s %s","ITS/SPD/HalfBarrel0fw",modlist); // up/fw
240 m.Clear(); // global frame
241 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
242 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
245 strcpy(modlist,"ITSMilleModuleList: ");
246 for (int ii=0; ii<40; ii++) {
248 if ((ij%2)) sprintf(modlist,"%s %d",modlist,ii);
250 for (int ii=80; ii<160; ii++) {
252 if ((ij%2)) sprintf(modlist,"%s %d",modlist,ii);
254 sprintf(symname,"%s %s","ITS/SPD/HalfBarrel0bw",modlist); // up/bw
255 m.Clear(); // global frame
256 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
257 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
260 strcpy(modlist,"ITSMilleModuleList: ");
261 for (int ii=40; ii<80; ii++) {
263 if (!(ij%2)) sprintf(modlist,"%s %d",modlist,ii);
265 for (int ii=160; ii<240; ii++) {
267 if (!(ij%2)) sprintf(modlist,"%s %d",modlist,ii);
269 sprintf(symname,"%s %s","ITS/SPD/HalfBarrel1fw",modlist); // down/fw
270 m.Clear(); // global frame
272 //m.RotateY(180.); // just negY->posY
273 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
274 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
277 strcpy(modlist,"ITSMilleModuleList: ");
278 for (int ii=40; ii<80; ii++) {
280 if ((ij%2)) sprintf(modlist,"%s %d",modlist,ii);
282 for (int ii=160; ii<240; ii++) {
284 if ((ij%2)) sprintf(modlist,"%s %d",modlist,ii);
286 sprintf(symname,"%s %s","ITS/SPD/HalfBarrel1bw",modlist); // down/bw
287 m.Clear(); // global frame
289 //m.RotateY(180.); // just negY->posY
290 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
291 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
296 // start at volid=15000
297 // - SDD2: 14 ladders da 6 elementi
298 // - SDD3: 22 ladders da 8 elementi
301 // SDD2 Ladders: volids 15000 to 15013
302 for (int is=0; is<14; is++) {
305 sprintf(modlist," ITSMilleModuleList: %d-%d ",240+is*6,240+is*6+5);
306 strcpy(symname,AliITSgeomTGeo::GetSymName(240+is*6));
307 char *clad=strstr(symname,"Sensor");
308 if (clad) *(clad-1) = NULL;
310 Error(macroname,"cannot find 'Sensor' in symname\n");
313 if (AliGeomManager::GetMatrix(symname))
314 m=(*AliGeomManager::GetMatrix(symname));
316 Error(macroname,"cannot find matrix for SDD ladder\n");
319 strcat(symname,modlist);
321 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
322 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
326 // SDD3 Ladders: volids 15014 to 15035
327 for (int is=0; is<22; is++) {
330 sprintf(modlist," ITSMilleModuleList: %d-%d ",324+is*8,324+is*8+7);
331 strcpy(symname,AliITSgeomTGeo::GetSymName(324+is*8));
332 char *clad=strstr(symname,"Sensor");
333 if (clad) *(clad-1) = NULL;
335 Error(macroname,"cannot find 'Sensor' in symname\n");
338 if (AliGeomManager::GetMatrix(symname))
339 m=(*AliGeomManager::GetMatrix(symname));
341 Error(macroname,"cannot find matrix for SDD ladder\n");
344 strcat(symname,modlist);
346 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
347 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
354 // start at volid=16000
355 // - SSD4: 34 ladders da 22 elementi
356 // - SSD5: 38 ladders da 25 elementi
359 // SSD4 Ladders: volids 16000 to 16033
360 for (int is=0; is<34; is++) {
363 sprintf(modlist," ITSMilleModuleList: %d-%d ",500+is*22,500+is*22+21);
364 strcpy(symname,AliITSgeomTGeo::GetSymName(500+is*22));
365 char *clad=strstr(symname,"Sensor");
366 if (clad) *(clad-1) = NULL;
368 Error(macroname,"cannot find 'Sensor' in symname\n");
371 if (AliGeomManager::GetMatrix(symname))
372 m=(*AliGeomManager::GetMatrix(symname));
374 Error(macroname,"cannot find matrix for SSD ladder\n");
377 strcat(symname,modlist);
379 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
380 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
384 // SSD5 Ladders: volids 16034 to 16071
385 for (int is=0; is<38; is++) {
388 sprintf(modlist," ITSMilleModuleList: %d-%d ",1248+is*25,1248+is*25+24);
389 strcpy(symname,AliITSgeomTGeo::GetSymName(1248+is*25));
390 char *clad=strstr(symname,"Sensor");
391 if (clad) *(clad-1) = NULL;
393 Error(macroname,"cannot find 'Sensor' in symname\n");
396 if (AliGeomManager::GetMatrix(symname))
397 m=(*AliGeomManager::GetMatrix(symname));
399 Error(macroname,"cannot find matrix for SDD ladder\n");
402 strcat(symname,modlist);
404 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
405 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
409 // SSD BARREL: volid 16072
410 strcpy(modlist,"ITSMilleModuleList: 500-2197");
411 sprintf(symname,"%s %s","ITS/SSD/Barrel",modlist);
412 m.Clear(); // global frame
413 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
414 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
418 // SSD HALF BARREL: volids 16073-16074
419 // SSD HALF BARREL UP: volid 16073
420 strcpy(modlist,"ITSMilleModuleList: 500-873 1248-1722");
421 sprintf(symname,"%s %s","ITS/SSD/HalfBarrel0",modlist); // up
422 m.Clear(); // global frame
423 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
424 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
427 // SSD HALF BARREL DOWN: volid 16074
428 strcpy(modlist,"ITSMilleModuleList: 874-1246 1723-2197");
429 sprintf(symname,"%s %s","ITS/SSD/HalfBarrel1",modlist); // down
430 m.Clear(); // global frame
431 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
432 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
438 // - SSD4: 34x2=68 halfladders da 12+10 elementi
439 // - SSD5: 38x2=76 halfladders da 12+13 elementi
441 // SSD4 Ladders: volids 16075 to 16142
442 for (int is=0; is<34; is++) {
445 sprintf(modlist," ITSMilleModuleList: %d-%d ",500+is*22,500+is*22+11);
446 strcpy(symname,AliITSgeomTGeo::GetSymName(500+is*22));
447 char *clad=strstr(symname,"Sensor");
448 if (clad) *(clad-1) = NULL;
450 Error(macroname,"cannot find 'Sensor' in symname\n");
453 if (AliGeomManager::GetMatrix(symname))
454 m=(*AliGeomManager::GetMatrix(symname));
456 Error(macroname,"cannot find matrix for SSD ladder\n");
459 strcat(symname,"Half0");
460 strcat(symname,modlist);
462 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
463 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
467 sprintf(modlist," ITSMilleModuleList: %d-%d ",500+is*22+12,500+is*22+21);
468 strcpy(symname,AliITSgeomTGeo::GetSymName(500+is*22));
469 char *clad=strstr(symname,"Sensor");
470 if (clad) *(clad-1) = NULL;
472 Error(macroname,"cannot find 'Sensor' in symname\n");
475 if (AliGeomManager::GetMatrix(symname))
476 m=(*AliGeomManager::GetMatrix(symname));
478 Error(macroname,"cannot find matrix for SSD ladder\n");
481 strcat(symname,"Half1");
482 strcat(symname,modlist);
484 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
485 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
490 // SSD5 Ladders: volids 16143 to 16218
491 for (int is=0; is<38; is++) {
493 sprintf(modlist," ITSMilleModuleList: %d-%d ",1248+is*25,1248+is*25+11);
494 strcpy(symname,AliITSgeomTGeo::GetSymName(1248+is*25));
495 char *clad=strstr(symname,"Sensor");
496 if (clad) *(clad-1) = NULL;
498 Error(macroname,"cannot find 'Sensor' in symname\n");
501 if (AliGeomManager::GetMatrix(symname))
502 m=(*AliGeomManager::GetMatrix(symname));
504 Error(macroname,"cannot find matrix for SDD ladder\n");
507 strcat(symname,"Half0");
508 strcat(symname,modlist);
510 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
511 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
515 sprintf(modlist," ITSMilleModuleList: %d-%d ",1248+is*25+12,1248+is*25+24);
516 strcpy(symname,AliITSgeomTGeo::GetSymName(1248+is*25));
517 char *clad=strstr(symname,"Sensor");
518 if (clad) *(clad-1) = NULL;
520 Error(macroname,"cannot find 'Sensor' in symname\n");
523 if (AliGeomManager::GetMatrix(symname))
524 m=(*AliGeomManager::GetMatrix(symname));
526 Error(macroname,"cannot find matrix for SDD ladder\n");
529 strcat(symname,"Half1");
530 strcat(symname,modlist);
532 new(alobj[j]) AliAlignObjParams(symname, volid, m, kTRUE);
533 *(strstr(symname,"ITSMilleModuleList"))=NULL ;printf("added module %s with volid %d \n",symname,volid);
538 //////////////////////////////////////////////////////////////////
539 if( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ){
541 const char* filename = "ITSMilleSuperModules.root";
542 TFile f(filename,"RECREATE");
544 Error(macroname,"cannot open file for output\n");
547 Info(macroname,"Saving ITS SuperModules as AliAlignObjs to the file %s", filename);
549 f.WriteObject(array,"ITSMilleSuperModules","kSingleKey");
552 // save in CDB storage
553 TString Storage = gSystem->Getenv("STORAGE");
554 if(!Storage.BeginsWith("local://") && !Storage.BeginsWith("alien://")) {
555 Error(macroname,"STORAGE variable set to %s is not valid. Exiting\n",Storage.Data());
558 Info(macroname,"Saving ITS SuperModules in CDB storage %s",
560 AliCDBManager* cdb = AliCDBManager::Instance();
561 AliCDBStorage* storage = cdb->GetStorage(Storage.Data());
563 Error(macroname,"Unable to open storage %s\n",Storage.Data());
566 AliCDBMetaData *md= new AliCDBMetaData();
567 md->SetResponsible("Marcello Lunardon");
568 md->SetComment("ITS super modules for ITS alignment with Millepede");
569 md->SetAliRootVersion(gSystem->Getenv("ARVERSION"));
570 AliCDBId id("ITS/Align/Data",0,AliCDBRunRange::Infinity());
571 storage->Put(array,id, md);