A new class AliPHOSModuleMisalignment is added to read survey data
[u/mrichter/AliRoot.git] / PHOS / MakePHOSFullMisAlignment.C
1 void MakePHOSFullMisAlignment()
2 {
3   // Create misalignment object for PHOS module 2 
4   // from the survey measurements on P2 in May 2008.
5   // To store alignment in OCDB, define the evnironment variables:
6   // TOCDB=kTRUE
7   // STORAGE="local://$ALICE_ROOT"
8   // Author: Timur Pocheptsov, 19.06.2008
9
10   const char * macroName = "MakePHOS2Alignment";
11   
12   const AliPHOSGeometry *phosGeom = AliPHOSGeometry::GetInstance("IHEP", "IHEP");
13   if (!phosGeom) {
14     Error(macroName, "Cannot obtain AliPHOSGeometry singleton.\n");
15     return;
16   }
17
18   //Activate CDB storage and load geometry from CDB
19   //I need valid gGeoManager to create local transformations.
20   
21   //[Part of code, taken from ITS version of MakexxxFullMisalignment.
22   //This code was required only for local delta transformations.
23   //Now, transformations are global, so no gGeoManager and geometry are required.
24   /*
25   AliCDBManager * cdb = AliCDBManager::Instance();
26   if (!cdb->IsDefaultStorageSet())
27     cdb->SetDefaultStorage("local://$ALICE_ROOT");
28   cdb->SetRun(0);
29
30   if (TString(gSystem->Getenv("TOCDB")) == TString("kTRUE")) {
31     const TString storageENV(gSystem->Getenv("STORAGE"));
32     if (!storageENV.BeginsWith("local://") && !storageENV.BeginsWith("alien://")) {
33       Error(macroName, "STORAGE variable set to %s is not valid.\n", storageENV.Data());
34       return;
35     }
36     
37     AliCDBStorage * storage = cdb->GetStorage(storageENV.Data());
38     if (!storage) {
39       Error(macroName, "Unable to open storage %s.\n", storageENV.Data());
40       return;
41     }
42     
43     AliCDBPath path("GRP","Geometry","Data");
44     AliCDBEntry * entry = storage->Get(path.GetPath(), cdb->GetRun());
45     if (!entry) {
46       Error(macroName,"Could not get the specified CDB entry!");
47       return;  
48     }
49     
50     entry->SetOwner(0);
51     AliGeomManager::SetGeometry((TGeoManager*) entry->GetObject());
52   }else{
53     AliGeomManager::LoadGeometry("geometry.root"); //load geom from default CDB storage
54   }  
55   */  
56   //end of code taken from ITS version of MakexxxFullMisalignment]
57
58   AliPHOSEMCAGeometry * emca = phosGeom->GetEMCAGeometry();
59   TClonesArray alobj("AliAlignObjParams", 16);// + phosGeom->GetNModules() * emca->GetNStripX() *
60                                               //   emca->GetNStripZ());
61   
62   const Double_t dpsi = 0., dtheta = 0., dphi = 0.;
63   const Double_t displacement = 10.;
64   Int_t iIndex = 0; //let all modules have index=0 in a layer with no LUT
65   const AliGeomManager::ELayerID iLayer = AliGeomManager::kInvalidLayer;
66   UShort_t volid = AliGeomManager::LayerToVolUID(iLayer, iIndex);
67   Int_t i = 0;
68
69   // Alignment for 5 PHOS modules
70
71   TString surveyFileName;
72   
73   const Char_t * szEnv = gSystem->Getenv("ALICE_ROOT");
74   if (szEnv && szEnv[0]) {
75     surveyFileName += szEnv;
76     if (surveyFileName[surveyFileName.Length() - 1] != '/')
77       surveyFileName += '/';
78   } else {
79     Warning(macroName, "cannot find ALICE_ROOT environment variable\n"
80                        "probably, I wan't be able to find survey file");
81   }
82     
83   surveyFileName += "PHOS/data/phos_mod3_survey_2008.txt";
84
85   new(alobj[i++]) AliAlignObjParams("PHOS/Module1", volid, 0., 0., 0., 0., 0., 0., kTRUE);
86   new(alobj[i++]) AliAlignObjParams("PHOS/Module2", volid, 2., 0., 0., 0., 0., 0., kTRUE);
87   //
88   AliSurveyObj survey;
89   survey.FillFromLocalFile(surveyFileName.Data());
90   TGeoHMatrix module3Delta;
91   AliPHOSModuleMisalignment delta(*phosGeom);
92   delta.DeltaTransformation(2, survey.GetData(), "T2_10000", "T2_10027", "T2_24000", 
93                             &module3Delta);
94   new(alobj[i++]) AliAlignObjParams("PHOS/Module3", volid, module3Delta, kTRUE);
95   //
96   new(alobj[i++]) AliAlignObjParams("PHOS/Module4", volid, 0.,  0., 0., 0., 0., 0., kTRUE);
97   new(alobj[i++]) AliAlignObjParams("PHOS/Module5", volid, 0., 0., 0., 0., 0., 0., kTRUE);
98
99   const Double_t dx = 0., dy = 0., dz = 0. ;
100   // Alignment of CPV modules
101   new(alobj[i++]) AliAlignObjParams("PHOS/Module1/CPV",
102         volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
103   new(alobj[i++]) AliAlignObjParams("PHOS/Module2/CPV",
104         volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
105   new(alobj[i++]) AliAlignObjParams("PHOS/Module3/CPV",
106         volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
107   new(alobj[i++]) AliAlignObjParams("PHOS/Module4/CPV",
108         volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
109   new(alobj[i++]) AliAlignObjParams("PHOS/Module5/CPV",
110         volid, dx, dy, dz, dpsi, dtheta, dphi, kTRUE);
111  
112   // Alignment for PHOS cradle
113   new(alobj[i++]) AliAlignObjParams("PHOS/Cradle0",
114           volid, 0., 0., -displacement, dpsi, dtheta, dphi, kTRUE);
115   new(alobj[i++]) AliAlignObjParams("PHOS/Cradle1",
116           volid, 0., 0., +displacement, dpsi, dtheta, dphi, kTRUE);
117
118   // Alignment for cradle wheels
119   new(alobj[i++]) AliAlignObjParams("PHOS/Wheel0",
120           volid, 0., 0., -displacement, dpsi, dtheta, dphi, kTRUE);
121   new(alobj[i++]) AliAlignObjParams("PHOS/Wheel1",
122           volid, 0., 0., -displacement, dpsi, dtheta, dphi, kTRUE);
123   new(alobj[i++]) AliAlignObjParams("PHOS/Wheel2",
124           volid, 0., 0., +displacement, dpsi, dtheta, dphi, kTRUE);
125   new(alobj[i++]) AliAlignObjParams("PHOS/Wheel3",
126           volid, 0., 0., +displacement, dpsi, dtheta, dphi, kTRUE);
127
128   // *************************    2nd step    ***************
129   if ( TString(gSystem->Getenv("TOCDB")) != TString("kTRUE") ) {
130     // save on file
131     const char * fileName = "PHOSfullMisalignment.root";
132     TFile f(fileName,"RECREATE");
133     if (!f) {
134       Error(macroName, "cannot open file for output\n");
135       return;
136     }
137     
138     Info(macroName,"Saving alignment objects to the file %s", fileName);
139     f.cd();
140     f.WriteObject(&alobj,"PHOSAlignObjs","kSingleKey");
141     f.Close();
142   }else{
143     // save in CDB storage
144     TString storageENV = gSystem->Getenv("STORAGE");
145     if(!storageENV.BeginsWith("local://") && !storageENV.BeginsWith("alien://")) {
146       Error(macroName,"STORAGE variable set to %s is not valid. Exiting\n", storageENV.Data());
147       return;
148     }
149     
150     Info(macroName,"Saving alignment objects in CDB storage %s", storageENV.Data());
151     AliCDBManager * cdb = AliCDBManager::Instance();
152     AliCDBStorage * storage = cdb->GetStorage(storageENV.Data());
153     if (!storage) {
154       Error(macroName, "Unable to open storage %s\n", storageENV.Data());
155       return;
156     }
157     
158     AliCDBMetaData md;
159     md.SetResponsible("Timur Pocheptsov");
160     md.SetComment("Alignment objects for PHOS module 2; survey in May 2008");
161     md.SetAliRootVersion(gSystem->Getenv("ARVERSION"));
162     AliCDBId id("PHOS/Align/Data",0,AliCDBRunRange::Infinity());
163     storage->Put(&alobj, id, &md);
164   }
165
166   alobj.Delete();
167 }