1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
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
21 //____________________________________________________________________
30 //____________________________________________________________________
32 // Forward Multiplicity Detector based on Silicon wafers.
34 // This task creates fake alignment. Which alignment, depends on
35 // the bit mask passed to the constructor, or added by `AddAlign'.
37 // The default is to write all alignment parameters to a local
38 // storage `local://cdb' which is a directory in the current
41 #include "AliLog.h" // ALILOG_H
42 #include "AliFMDAlignFaker.h" // ALIFMDALIGNFAKER_H
43 #include <AliCDBManager.h> // ALICDBMANAGER_H
44 #include <AliCDBStorage.h> // ALICDBSTORAGE_H
45 #include <AliCDBEntry.h> // ALICDBMANAGER_H
46 // #include <AliAlignObj.h>
47 #include <AliAlignObjAngles.h>
48 // #include <Riostream.h>
49 // #include <TSystem.h>
52 #include <TClonesArray.h>
55 #include <TGeoManager.h>
57 // #include <TGeoVolume.h>
60 //====================================================================
61 ClassImp(AliFMDAlignFaker)
63 ; // This is here to keep Emacs for indenting the next line
66 //____________________________________________________________________
67 AliFMDAlignFaker::AliFMDAlignFaker(Int_t mask, const char* geo,
71 fSensorTransMin(0,0,0),
72 fSensorTransMax(0,0,0),
84 // Default constructor
85 SetSensorDisplacement();
87 SetHalfDisplacement();
92 //__________________________________________________________________
94 AliFMDAlignFaker::SetSensorDisplacement(Double_t x1, Double_t y1, Double_t z1,
95 Double_t x2, Double_t y2, Double_t z2)
97 // Set sensor displacement (unit is centimeters)
98 fSensorTransMin.SetXYZ(x1, y1, z1);
99 fSensorTransMax.SetXYZ(x2, y2, z2);
102 //__________________________________________________________________
104 AliFMDAlignFaker::SetSensorRotation(Double_t x1, Double_t y1, Double_t z1,
105 Double_t x2, Double_t y2, Double_t z2)
107 // Set sensor rotations (unit is degrees)
108 fSensorRotMin.SetXYZ(x1, y1, z1);
109 fSensorRotMax.SetXYZ(x2, y2, z2);
112 //__________________________________________________________________
114 AliFMDAlignFaker::SetHalfDisplacement(Double_t x1, Double_t y1, Double_t z1,
115 Double_t x2, Double_t y2, Double_t z2)
117 // Set half ring/cone displacement (unit is centimeters)
118 fHalfTransMin.SetXYZ(x1, y1, z1);
119 fHalfTransMax.SetXYZ(x2, y2, z2);
122 //__________________________________________________________________
124 AliFMDAlignFaker::SetHalfRotation(Double_t x1, Double_t y1, Double_t z1,
125 Double_t x2, Double_t y2, Double_t z2)
127 // Set half ring/cone rotations (unit is degrees)
128 fHalfRotMin.SetXYZ(x1, y1, z1);
129 fHalfRotMax.SetXYZ(x2, y2, z2);
132 //__________________________________________________________________
133 #define IS_NODE_HALF(name) \
134 (name[0] == 'F' && name[2] == 'M' && (name[3] == 'T' || name[3] == 'B'))
135 #define IS_NODE_SENSOR(name) \
136 (name[0] == 'F' && name[2] == 'S' && name[3] == 'E')
138 //__________________________________________________________________
140 AliFMDAlignFaker::Exec(Option_t*)
146 if (!TGeoManager::Import(GetName())) {
147 AliFatal(Form("Failed to import geometry from %s", GetName()));
152 TGeoVolume* topVolume = gGeoManager->GetTopVolume();
154 AliFatal("No top-level volume defined");
157 // Make container of transforms
158 if (!fArray) fArray = new TClonesArray("AliAlignObjAngles");
162 TGeoIterator next(topVolume);
165 // Loop over all entries in geometry to find our nodes.
166 while ((node = static_cast<TGeoNode*>(next()))) {
167 const char* name = node->GetName();
168 if (!(IS_NODE_HALF(name) && TESTBIT(fMask, kHalves)) &&
169 !(IS_NODE_SENSOR(name) && TESTBIT(fMask, kSensors)))
173 TString path(Form("/%s", gGeoManager->GetNode(0)->GetName()));
174 Int_t nLevel = next.GetLevel();
175 for (Int_t lvl = 0; lvl <= nLevel; lvl++) {
176 TGeoNode* p = next.GetNode(lvl);
179 AliWarning(Form("No node at level %d in path %s",lvl,path.Data()));
182 if (!path.IsNull()) path.Append("/");
183 path.Append(p->GetName());
185 Int_t id = node->GetVolume()->GetNumber();
186 if (IS_NODE_HALF(name)) MakeAlignHalf(path, id);
187 if (IS_NODE_SENSOR(name)) MakeAlignSensor(path, id);
190 TString t(GetTitle());
191 if (t.IsNull() || t.Contains("local://") || t.Contains("alien://"))
197 //__________________________________________________________________
199 AliFMDAlignFaker::MakeAlign(const TString& path, Int_t id,
200 Double_t transX, Double_t transY, Double_t transZ,
201 Double_t rotX, Double_t rotY, Double_t rotZ)
203 // make alignment for a path
207 // transX Translation in X
208 // transZ Translation in Y
209 // transZ Translation in Z
210 // rotX Rotation about X-axis
211 // rotY Rotation about Y-axis
212 // rotZ Rotation about Z-axis
213 AliDebug(1, Form("Make alignment for %s (volume %d): (%f,%f,%f) (%f,%f,%f)",
214 path.Data(), id, transX, transY, transZ, rotX, rotY, rotZ));
215 Int_t nAlign = fArray->GetEntries();
217 AliAlignObjAngles* obj =
218 new ((*fArray)[nAlign]) AliAlignObjAngles(path.Data(), id,0,0,0,0,0,0,kTRUE);
220 AliError(Form("Failed to create alignment object for %s", path.Data()));
223 if (!obj->SetLocalPars(transX, transY, transZ, rotX, rotY, rotZ)) {
224 AliError(Form("Failed to set local transforms on %s", path.Data()));
230 //__________________________________________________________________
232 AliFMDAlignFaker::MakeAlignHalf(const TString& path, Int_t id)
234 // Make alignment of a half ring/cone
235 AliDebug(15, Form("Make alignment for half-ring/cone %s", path.Data()));
236 Double_t transX = gRandom->Uniform(fHalfTransMin.X(), fHalfTransMax.X());
237 Double_t transY = gRandom->Uniform(fHalfTransMin.Y(), fHalfTransMax.Y());
238 Double_t transZ = gRandom->Uniform(fHalfTransMin.Z(), fHalfTransMax.Z());
239 Double_t rotX = gRandom->Uniform(fHalfRotMin.X(), fHalfRotMax.X());
240 Double_t rotY = gRandom->Uniform(fHalfRotMin.Y(), fHalfRotMax.Y());
241 Double_t rotZ = gRandom->Uniform(fHalfRotMin.Z(), fHalfRotMax.Z());
242 return MakeAlign(path, id, transX, transY, transZ, rotX, rotY, rotZ);
246 //__________________________________________________________________
248 AliFMDAlignFaker::MakeAlignSensor(const TString& path, Int_t id)
250 // Make alignment of a sensor
251 AliDebug(15, Form("Make alignment for sensor %s", path.Data()));
252 Double_t transX = gRandom->Uniform(fSensorTransMin.X(), fSensorTransMax.X());
253 Double_t transY = gRandom->Uniform(fSensorTransMin.Y(), fSensorTransMax.Y());
254 Double_t transZ = gRandom->Uniform(fSensorTransMin.Z(), fSensorTransMax.Z());
255 Double_t rotX = gRandom->Uniform(fSensorRotMin.X(), fSensorRotMax.X());
256 Double_t rotY = gRandom->Uniform(fSensorRotMin.Y(), fSensorRotMax.Y());
257 Double_t rotZ = gRandom->Uniform(fSensorRotMin.Z(), fSensorRotMax.Z());
258 return MakeAlign(path, id, transX, transY, transZ, rotX, rotY, rotZ);
261 //__________________________________________________________________
263 AliFMDAlignFaker::WriteToCDB()
266 AliCDBManager* cdb = AliCDBManager::Instance();
267 AliCDBStorage* storage = cdb->GetStorage(GetTitle());
268 AliCDBMetaData* meta = new AliCDBMetaData;
269 meta->SetResponsible(gSystem->GetUserInfo()->fRealName.Data());
270 meta->SetAliRootVersion(gROOT->GetVersion());
271 meta->SetBeamPeriod(1);
272 meta->SetComment(fComment.Data());
274 AliCDBId id("FMD/Align/Data", fRunMin, fRunMax);
275 storage->Put(fArray, id, meta);
278 //__________________________________________________________________
280 AliFMDAlignFaker::WriteToFile()
282 // Write to a local file
283 TFile* file = TFile::Open(GetTitle(), "RECREATE");
285 AliFatal(Form("Failed to open file '%s' for output", GetTitle()));
289 fArray->Write("FMDAlignment");
296 //____________________________________________________________________