Scripts for PHOS alignment
[u/mrichter/AliRoot.git] / PHOS / macros / AlignmentDB / AliPHOSSetAlignment.C
1 /* $Id$*/
2
3 // Script to create alignment parameters and store them into CDB
4 // Two sets of alignment parameters can be created:
5 // 1) 1 PHOS module with exact position
6 // 2) 5 PHOS modules with small disalignments
7
8 #if !defined(__CINT__)
9 #include "TControlBar.h"
10 #include "TString.h"
11 #include "TRandom.h"
12 #include "TH2F.h"
13 #include "TCanvas.h"
14
15 #include "AliRun.h"
16 #include "AliPHOSAlignData.h"
17 #include "AliCDBMetaData.h"
18 #include "AliCDBId.h"
19 #include "AliCDBEntry.h"
20 #include "AliCDBManager.h"
21 #include "AliCDBStorage.h"
22 #endif
23
24
25 void AliPHOSSetAlignment()
26 {
27   TControlBar *menu = new TControlBar("vertical","PHOS alignment control");
28   menu->AddButton("Help to run PHOS alignment control","Help()",
29                   "Explains how to use PHOS alignment control menus");
30   menu->AddButton("PHOS 2007","SetAlignment(0)",
31                   "Set PHOS alignment for the LHC run 2007");
32   menu->AddButton("Full PHOS","SetAlignment(1)",
33                   "Set all 5 modules with random displacement");
34   menu->AddButton("Read PHOS 2007","GetAlignment(0)",
35                   "Read PHOS geometry for the LHC run 2007");
36   menu->AddButton("Read full PHOS","GetAlignment(1)",
37                   "Read full PHOS geometry with random displacements");
38   menu->Show();
39 }
40
41 //------------------------------------------------------------------------
42 void Help()
43 {
44   char *string =
45     "\nSet PHOS alignment parameters and write them into ALICE CDB.
46 Press button \"PHOS 2007\" to create PHOS geometry for the first LHC run in 2007.
47 Press button \"Full PHOS\" to create full PHOS geometry with radnomly displaced modules\n";
48   printf(string);
49 }
50
51 //------------------------------------------------------------------------
52 void SetAlignment(Int_t flag=0)
53 {
54   // Write alignment parameters into CDB
55   // Arguments:
56   //   flag=0: ideal geometry with one module
57   //   flag=1: disligned geometry with 5 modules
58   // Author: Yuri Kharlov
59
60   TString DBFolder;
61   Int_t firstRun   =  0;
62   Int_t lastRun    = 10;
63   Int_t beamPeriod =  1;
64   char* objFormat  = "";
65   gRandom->SetSeed(0);
66
67   AliPHOSAlignData *alignda=new AliPHOSAlignData("PHOS");
68   
69   switch (flag) {
70   case 0:
71     DBFolder  ="local://InitAlignDB";
72     firstRun  =  0;
73     lastRun   =  0;
74     objFormat = "PHOS ideal geometry with 1 module";
75
76     alignda->SetNModules(1);
77     
78     alignda->SetModuleCenter(0,0,   0.);
79     alignda->SetModuleCenter(0,1,-460.);
80     alignda->SetModuleCenter(0,2,   0.);
81     
82     alignda->SetModuleAngle(0,0,0,  90.);
83     alignda->SetModuleAngle(0,0,1,   0.);
84     alignda->SetModuleAngle(0,1,0,   0.);
85     alignda->SetModuleAngle(0,1,1,   0.);
86     alignda->SetModuleAngle(0,2,0,  90.);
87     alignda->SetModuleAngle(0,2,1, 270.);
88     break;
89   case 1:
90     DBFolder  ="local://DisAlignDB";
91     firstRun  =  0;
92     lastRun   = 10;
93     objFormat = "PHOS disaligned geometry with 5 modules";
94
95     Int_t nModules = 5;
96     alignda->SetNModules(nModules);
97     
98     Float_t dAngle= 20;
99     Float_t r0    = 460.;
100     Float_t theta, phi;
101     for (Int_t iModule=0; iModule<nModules; iModule++) {
102       Float_t r = r0 + gRandom->Uniform(0.,40.);
103       Float_t angle = dAngle * ( iModule - nModules / 2.0 + 0.5 ) ;
104       angle += gRandom->Uniform(-0.1,+0.1);
105       Float_t x = r * TMath::Sin(angle * TMath::DegToRad() );
106       Float_t y =-r * TMath::Cos(angle * TMath::DegToRad() );
107       Float_t z = gRandom->Uniform(-0.05,0.05);
108
109       alignda->SetModuleCenter(iModule,0,x);
110       alignda->SetModuleCenter(iModule,1,y);
111       alignda->SetModuleCenter(iModule,2,z);
112     
113       theta = 90 + gRandom->Uniform(-1.,1.);
114       phi   = angle;
115       alignda->SetModuleAngle(iModule,0,0,theta);
116       alignda->SetModuleAngle(iModule,0,1,phi);
117       theta = 0;
118       phi   = 0;
119       alignda->SetModuleAngle(iModule,1,0,theta);
120       alignda->SetModuleAngle(iModule,1,1,phi);
121       theta = 90 + gRandom->Uniform(-1.,1.);
122       phi   = 270+angle;
123       alignda->SetModuleAngle(iModule,2,0,theta);
124       alignda->SetModuleAngle(iModule,2,1,phi);
125     }
126     break;
127   default:
128     printf("Unknown flag %d, can be 0 or 1 only\n",flag);
129     return;
130   }
131   
132
133   //Store calibration data into database
134   
135   AliCDBMetaData md;
136   md.SetComment(objFormat);
137   md.SetBeamPeriod(beamPeriod);
138   md.SetResponsible("Yuri Kharlov");
139   
140   AliCDBId id("PHOS/Alignment/Geometry",firstRun,lastRun);
141
142   AliCDBManager* man = AliCDBManager::Instance();  
143   AliCDBStorage* loc = man->GetStorage(DBFolder.Data());
144   loc->Put(alignda, id, &md);
145
146 }
147
148 //------------------------------------------------------------------------
149 void GetAlignment(Int_t flag=0)
150 {
151   // Read alignment parameters into CDB
152   // Arguments:
153   //   flag=0: ideal geometry with one module
154   //   flag=1: disligned geometry with 5 modules
155   // Author: Yuri Kharlov
156
157   TString DBFolder;
158   Int_t run   =  0;
159   AliPHOSAlignData *alignda=new AliPHOSAlignData("PHOS");
160   
161   switch (flag) {
162   case 0:
163     DBFolder  ="local://InitAlignDB";
164     break;
165   case 1:
166     DBFolder  ="local://DisAlignDB";
167     break;
168   default:
169     printf("Unknown flag %d, can be 0 or 1 only\n",flag);
170     return;
171   }
172   AliPHOSAlignData* alignda  = (AliPHOSAlignData*)
173     (AliCDBManager::Instance()
174      ->GetStorage(DBFolder.Data())
175      ->Get("PHOS/Alignment/Geometry",run)->GetObject());
176   alignda->Print();
177 }