Coding conventions (Christian)
[u/mrichter/AliRoot.git] / FMD / AliFMDAlignFaker.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15 /* $Id$ */
16 /** @file    AliFMDAlignFaker.cxx
17     @author  Christian Holm Christensen <cholm@nbi.dk>
18     @date    Sun Mar 26 17:57:55 2006
19     @brief   Implementation of AliFMDAlignFaker 
20 */
21 //____________________________________________________________________
22 //
23 //  Class 
24 //  to 
25 //  make 
26 //  fake 
27 //  alignment
28 //  parameters 
29 //
30 //____________________________________________________________________
31 //                                                                          
32 // Forward Multiplicity Detector based on Silicon wafers. 
33 //
34 // This task creates fake alignment. Which alignment, depends on
35 // the bit mask passed to the constructor, or added by `AddAlign'.
36 //
37 // The default is to write all alignment parameters to a local
38 // storage `local://cdb' which is a directory in the current
39 // directory. 
40 //                                                       
41 #include "AliLog.h"                // ALILOG_H
42 #include "AliFMDAlignFaker.h"      // ALIFMDALIGNFAKER_H
43 #include <AliCDBManager.h>         // ALICDBMANAGER_H
44 #include <AliCDBEntry.h>           // ALICDBMANAGER_H
45 // #include <AliAlignObj.h>
46 #include <AliAlignObjAngles.h>
47 // #include <Riostream.h>
48 // #include <TSystem.h>
49 // #include <TMath.h>
50 #include <TRandom.h>
51 #include <TClonesArray.h>
52 #include <TString.h>
53 #include <TFile.h>
54 #include <TGeoManager.h>
55 #include <TGeoNode.h>
56 // #include <TGeoVolume.h>
57 // #include <TROOT.h>
58
59 //====================================================================
60 ClassImp(AliFMDAlignFaker)
61 #if 0
62   ; // This is here to keep Emacs for indenting the next line
63 #endif
64
65 //____________________________________________________________________
66 AliFMDAlignFaker::AliFMDAlignFaker(Int_t mask, const char* geo, 
67                                    const char* loc) 
68   : TTask(geo, loc),
69     fMask(mask),
70     fRunMin(0),
71     fRunMax(10), 
72     fArray(0)
73 {
74   // Default constructor 
75   SetSensorDisplacement();
76   SetSensorRotation();
77   SetHalfDisplacement();
78   SetHalfRotation();
79 }
80
81 //__________________________________________________________________
82 void
83 AliFMDAlignFaker::SetSensorDisplacement(Double_t x1, Double_t y1, Double_t z1,
84                                         Double_t x2, Double_t y2, Double_t z2)
85 {
86   // Set sensor displacement (unit is centimeters)
87   fSensorTransMin.SetXYZ(x1, y1, z1);
88   fSensorTransMax.SetXYZ(x2, y2, z2);
89 }
90
91 //__________________________________________________________________
92 void
93 AliFMDAlignFaker::SetSensorRotation(Double_t x1, Double_t y1, Double_t z1,
94                                     Double_t x2, Double_t y2, Double_t z2)
95 {
96   // Set sensor rotations (unit is degrees)
97   fSensorRotMin.SetXYZ(x1, y1, z1);
98   fSensorRotMax.SetXYZ(x2, y2, z2);
99 }
100
101 //__________________________________________________________________
102 void
103 AliFMDAlignFaker::SetHalfDisplacement(Double_t x1, Double_t y1, Double_t z1,
104                                       Double_t x2, Double_t y2, Double_t z2)
105 {
106   // Set half ring/cone displacement (unit is centimeters)
107   fHalfTransMin.SetXYZ(x1, y1, z1);
108   fHalfTransMax.SetXYZ(x2, y2, z2);
109 }
110
111 //__________________________________________________________________
112 void
113 AliFMDAlignFaker::SetHalfRotation(Double_t x1, Double_t y1, Double_t z1,
114                                   Double_t x2, Double_t y2, Double_t z2)
115 {
116   // Set half ring/cone rotations (unit is degrees)
117   fHalfRotMin.SetXYZ(x1, y1, z1);
118   fHalfRotMax.SetXYZ(x2, y2, z2);
119 }
120
121 //__________________________________________________________________
122 #define IS_NODE_HALF(name) \
123   (name[0] == 'F' && name[2] == 'M' && (name[3] == 'T' || name[3] == 'B'))
124 #define IS_NODE_SENSOR(name) \
125   (name[0] == 'F' && name[2] == 'S' && name[3] == 'E')
126
127 //__________________________________________________________________
128 void
129 AliFMDAlignFaker::Exec(Option_t*)
130 {
131   // Make the objects. 
132
133   // Get geometry 
134   if (!gGeoManager) {
135     if (!TGeoManager::Import(GetName())) {
136       AliFatal(Form("Failed to import geometry from %s", GetName()));
137       return;
138     }
139   }
140   // Get top volume 
141   TGeoVolume* topVolume = gGeoManager->GetTopVolume();
142   if (!topVolume) {
143     AliFatal("No top-level volume defined");
144     return;
145   }
146   // Make container of transforms 
147   if (!fArray) fArray = new TClonesArray("AliAlignObjAngles");
148   fArray->Clear();
149   
150   // Make an iterator
151   TGeoIterator next(topVolume);
152   TGeoNode* node = 0;
153
154   // Loop over all entries in geometry to find our nodes. 
155   while ((node = static_cast<TGeoNode*>(next()))) {
156     const char* name =  node->GetName();
157     if (!(IS_NODE_HALF(name) && TESTBIT(fMask, kHalves)) &&
158         !(IS_NODE_SENSOR(name) && TESTBIT(fMask, kSensors))) 
159       continue;
160     
161     // Get the path 
162     TString path(Form("/%s", gGeoManager->GetNode(0)->GetName()));
163     Int_t nLevel = next.GetLevel();
164     for (Int_t lvl = 0; lvl <= nLevel; lvl++) {
165       TGeoNode* p = next.GetNode(lvl);
166       if (!p) {
167         if (lvl != 0)
168           AliWarning(Form("No node at level %d in path %s",lvl,path.Data()));
169         continue;
170       }
171       if (!path.IsNull()) path.Append("/");
172       path.Append(p->GetName());
173     }
174     Int_t id = node->GetVolume()->GetNumber();
175     if (IS_NODE_HALF(name))   MakeAlignHalf(path, id);
176     if (IS_NODE_SENSOR(name)) MakeAlignSensor(path, id);
177   }
178
179   TString t(GetTitle());
180   if (t.IsNull() || t.Contains("local://") || t.Contains("alien://")) 
181     WriteToCDB();
182   else 
183     WriteToFile();
184 }
185   
186 //__________________________________________________________________
187 Bool_t
188 AliFMDAlignFaker::MakeAlign(const TString& path, Int_t id, 
189                             Double_t transX, Double_t transY, Double_t transZ,
190                             Double_t rotX,   Double_t rotY, Double_t rotZ)
191 {
192   // make alignment for a path 
193   // Params: 
194   //   path      Path to node 
195   //   id        Volume number 
196   //   transX    Translation in X
197   //   transZ    Translation in Y
198   //   transZ    Translation in Z
199   //   rotX      Rotation about X-axis 
200   //   rotY      Rotation about Y-axis
201   //   rotZ      Rotation about Z-axis 
202   AliDebug(1, Form("Make alignment for %s (volume %d): (%f,%f,%f) (%f,%f,%f)", 
203                    path.Data(), id, transX, transY, transZ, rotX, rotY, rotZ));
204   Int_t nAlign = fArray->GetEntries();
205   AliAlignObjAngles* obj = 
206     new ((*fArray)[nAlign]) AliAlignObjAngles(path.Data(), id,0,0,0,0,0,0);
207   if (!obj) {
208     AliError(Form("Failed to create alignment object for %s", path.Data()));
209     return kFALSE;
210   }
211   if (!obj->SetLocalPars(transX, transY, transZ, rotX, rotY, rotZ)) {
212     AliError(Form("Failed to set local transforms on %s", path.Data()));
213     return kTRUE;
214   }
215   return kTRUE;
216 }
217
218 //__________________________________________________________________
219 Bool_t
220 AliFMDAlignFaker::MakeAlignHalf(const TString& path, Int_t id)
221 {
222   // Make alignment of a half ring/cone 
223   AliDebug(15, Form("Make alignment for half-ring/cone %s", path.Data()));
224   Double_t transX = gRandom->Uniform(fHalfTransMin.X(), fHalfTransMax.X());
225   Double_t transY = gRandom->Uniform(fHalfTransMin.Y(), fHalfTransMax.Y());
226   Double_t transZ = gRandom->Uniform(fHalfTransMin.Z(), fHalfTransMax.Z());
227   Double_t rotX   = gRandom->Uniform(fHalfRotMin.X(),   fHalfRotMax.X());
228   Double_t rotY   = gRandom->Uniform(fHalfRotMin.Y(),   fHalfRotMax.Y());
229   Double_t rotZ   = gRandom->Uniform(fHalfRotMin.Z(),   fHalfRotMax.Z());
230   return MakeAlign(path, id, transX, transY, transZ, rotX, rotY, rotZ);
231 }
232
233   
234 //__________________________________________________________________
235 Bool_t
236 AliFMDAlignFaker::MakeAlignSensor(const TString& path, Int_t id)
237 {
238   // Make alignment of a sensor 
239   AliDebug(15, Form("Make alignment for sensor %s", path.Data()));
240   Double_t transX = gRandom->Uniform(fSensorTransMin.X(), fSensorTransMax.X());
241   Double_t transY = gRandom->Uniform(fSensorTransMin.Y(), fSensorTransMax.Y());
242   Double_t transZ = gRandom->Uniform(fSensorTransMin.Z(), fSensorTransMax.Z());
243   Double_t rotX   = gRandom->Uniform(fSensorRotMin.X(),   fSensorRotMax.X());
244   Double_t rotY   = gRandom->Uniform(fSensorRotMin.Y(),   fSensorRotMax.Y());
245   Double_t rotZ   = gRandom->Uniform(fSensorRotMin.Z(),   fSensorRotMax.Z());
246   return MakeAlign(path, id, transX, transY, transZ, rotX, rotY, rotZ);
247 }
248
249 //__________________________________________________________________
250 void
251 AliFMDAlignFaker::WriteToCDB()
252 {
253   // Make the objects. 
254   AliCDBManager*     cdb      = AliCDBManager::Instance();
255   if (GetTitle() && GetTitle()[0] != '\0')    
256     cdb->SetDefaultStorage(GetTitle());
257     
258   AliCDBMetaData* meta = new AliCDBMetaData; 
259   meta->SetResponsible(gSystem->GetUserInfo()->fRealName.Data()); 
260   meta->SetAliRootVersion(gROOT->GetVersion()); 
261   meta->SetBeamPeriod(1); 
262   meta->SetComment("Dummy data for testing");
263
264   AliCDBId id("FMD/Align/Data", fRunMin, fRunMax);
265   cdb->Put(fArray, id, meta);
266   cdb->Destroy();
267 }
268
269 //__________________________________________________________________
270 void
271 AliFMDAlignFaker::WriteToFile()
272 {
273   // Write to a local file 
274   TFile* file = TFile::Open(GetTitle(), "RECREATE");
275   if (!file) {
276     AliFatal(Form("Failed to open file '%s' for output", GetTitle()));
277     return;
278   }
279   file->cd();
280   fArray->Write("FMDAlignment");
281   file->Close();
282   file->Write();
283 }
284
285   
286   
287 //____________________________________________________________________
288 //
289 // EOF
290 //