]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/AliMUONGeometryTransformer.cxx
Adding mask handling
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometryTransformer.cxx
CommitLineData
afc8e661 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * SigmaEffect_thetadegrees *
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 purpeateose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
16// $Id$
17//
f7006443 18// ----------------------------
afc8e661 19// Class AliMUONGeometryTransformer
20// ----------------------------
21// Top container class for geometry transformations
afc8e661 22// Author: Ivana Hrivnacova, IPN Orsay
23
afc8e661 24#include "AliMUONGeometryTransformer.h"
25#include "AliMUONGeometryModuleTransformer.h"
26#include "AliMUONGeometryDetElement.h"
afc8e661 27#include "AliMUONGeometryStore.h"
2864a3ac 28#include "AliMUONGeometryBuilder.h"
afc8e661 29
a7d4e65b 30#include "AliLog.h"
31#include "AliAlignObjMatrix.h"
bf16b32c 32#include "AliAlignObj.h"
a7d4e65b 33
34#include <Riostream.h>
35#include <TSystem.h>
36#include <TClonesArray.h>
37#include <TGeoManager.h>
38#include <TGeoPhysicalNode.h>
a6269834 39#include <TFile.h>
a7d4e65b 40
41#include <sstream>
afc8e661 42
43ClassImp(AliMUONGeometryTransformer)
44
45//______________________________________________________________________________
46AliMUONGeometryTransformer::AliMUONGeometryTransformer(Bool_t isOwner)
47 : TObject(),
a7d4e65b 48 fModuleTransformers(0),
49 fMisAlignArray(0)
afc8e661 50{
51/// Standard constructor
52
53 // Create array for geometry modules
54 fModuleTransformers = new TObjArray();
55 fModuleTransformers->SetOwner(isOwner);
56}
57
58//______________________________________________________________________________
59AliMUONGeometryTransformer::AliMUONGeometryTransformer()
60 : TObject(),
a7d4e65b 61 fModuleTransformers(0),
62 fMisAlignArray(0)
afc8e661 63{
64/// Default constructor
65}
66
67//______________________________________________________________________________
68AliMUONGeometryTransformer::AliMUONGeometryTransformer(
69 const AliMUONGeometryTransformer& right)
70 : TObject(right)
71{
72/// Copy constructor (not implemented)
73
74 AliFatal("Copy constructor not provided.");
75}
76
77//______________________________________________________________________________
78AliMUONGeometryTransformer::~AliMUONGeometryTransformer()
79{
80/// Destructor
81
82 delete fModuleTransformers;
a7d4e65b 83 delete fMisAlignArray;
afc8e661 84}
85
86//______________________________________________________________________________
87AliMUONGeometryTransformer&
88AliMUONGeometryTransformer::operator=(const AliMUONGeometryTransformer& right)
89{
90/// Assignement operator (not implemented)
91
92 // check assignement to self
93 if (this == &right) return *this;
94
95 AliFatal("Assignement operator not provided.");
96
97 return *this;
98}
99
100//
101// private methods
102//
103
104//_____________________________________________________________________________
105AliMUONGeometryModuleTransformer*
106AliMUONGeometryTransformer::GetModuleTransformerNonConst(
107 Int_t index, Bool_t warn) const
108{
109/// Return the geometry module specified by index
110
111 if (index < 0 || index >= fModuleTransformers->GetEntriesFast()) {
112 if (warn) {
113 AliWarningStream()
114 << "Index: " << index << " outside limits" << std::endl;
115 }
116 return 0;
117 }
118
119 return (AliMUONGeometryModuleTransformer*) fModuleTransformers->At(index);
120}
121
afc8e661 122//______________________________________________________________________________
123TGeoHMatrix AliMUONGeometryTransformer::GetTransform(
124 Double_t x, Double_t y, Double_t z,
125 Double_t a1, Double_t a2, Double_t a3,
126 Double_t a4, Double_t a5, Double_t a6) const
127{
128// Builds the transformation from the given parameters
129// ---
130
131 // Compose transform
132 return TGeoCombiTrans(TGeoTranslation(x, y, z),
133 TGeoRotation("rot", a1, a2, a3, a4, a5, a6));
134}
135
136
137//______________________________________________________________________________
a7d4e65b 138void AliMUONGeometryTransformer::FillModuleVolPath(Int_t moduleId,
139 const TString& volPath)
140{
141// Create module with the given moduleId and volPath
142// ---
143
144 // Get/Create geometry module transformer
145 AliMUONGeometryModuleTransformer* moduleTransformer
146 = GetModuleTransformerNonConst(moduleId, false);
147
148 if ( !moduleTransformer ) {
149 moduleTransformer = new AliMUONGeometryModuleTransformer(moduleId);
150 AddModuleTransformer(moduleTransformer);
151 }
152 moduleTransformer->SetVolumePath(volPath);
153}
154
155//______________________________________________________________________________
156void AliMUONGeometryTransformer::FillDetElemVolPath(Int_t detElemId,
157 const TString& volPath)
158{
159// Create detection element with the given detElemId and volPath
160
161 // Module Id
162 Int_t moduleId = AliMUONGeometryStore::GetModuleId(detElemId);
163
164 // Get detection element store
165 AliMUONGeometryStore* detElements =
166 GetModuleTransformer(moduleId)->GetDetElementStore();
167
168 // Add detection element
169 AliMUONGeometryDetElement* detElement
170 = new AliMUONGeometryDetElement(detElemId, volPath);
171 detElements->Add(detElemId, detElement);
172}
173
174
175//______________________________________________________________________________
176void AliMUONGeometryTransformer::FillModuleTransform(Int_t moduleId,
afc8e661 177 Double_t x, Double_t y, Double_t z,
178 Double_t a1, Double_t a2, Double_t a3,
179 Double_t a4, Double_t a5, Double_t a6)
180{
181// Fill the transformation of the module.
182// ---
183
a7d4e65b 184 // Get/Create geometry module transformer
afc8e661 185 moduleId--;
186 // Modules numbers in the file are starting from 1
187
188 AliMUONGeometryModuleTransformer* moduleTransformer
317aa7dc 189 = GetModuleTransformerNonConst(moduleId, false);
afc8e661 190
191 if ( !moduleTransformer) {
a7d4e65b 192 AliErrorStream()
193 << "Module " << moduleId << " has not volume path defined." << endl;
afc8e661 194 }
195
196 // Build the transformation from the parameters
197 TGeoHMatrix transform
198 = GetTransform(x, y, z, a1, a2, a3, a4, a5, a6);
199
200 moduleTransformer->SetTransformation(transform);
afc8e661 201}
202
203//______________________________________________________________________________
a7d4e65b 204void AliMUONGeometryTransformer::FillDetElemTransform(
205 Int_t detElemId,
afc8e661 206 Double_t x, Double_t y, Double_t z,
207 Double_t a1, Double_t a2, Double_t a3,
208 Double_t a4, Double_t a5, Double_t a6)
209{
210// Fill the transformation of the detection element.
211// ---
212
213 // Module Id
e5df8ea1 214 Int_t moduleId = AliMUONGeometryStore::GetModuleId(detElemId);
afc8e661 215
a7d4e65b 216 // Get module transformer
2864a3ac 217 const AliMUONGeometryModuleTransformer* kModuleTransformer
218 = GetModuleTransformer(moduleId);
a7d4e65b 219
2864a3ac 220 if ( ! kModuleTransformer ) {
a7d4e65b 221 AliFatal(Form("Module transformer not defined, detElemId: %d", detElemId));
222 return;
2864a3ac 223 }
224
a7d4e65b 225 // Get detection element
226 AliMUONGeometryDetElement* detElement
227 = kModuleTransformer->GetDetElement(detElemId);
228
229 if ( ! detElement ) {
230 AliFatal(Form("Det element %d has not volume path defined", detElemId));
231 return;
232 }
233
234 // Build the transformation from the parameters
235 TGeoHMatrix localTransform
236 = GetTransform(x, y, z, a1, a2, a3, a4, a5, a6);
237 detElement->SetLocalTransformation(localTransform);
238
239 // Compute global transformation
2864a3ac 240 TGeoHMatrix globalTransform
241 = AliMUONGeometryBuilder::Multiply(
242 *kModuleTransformer->GetTransformation(),
243 localTransform );
244 detElement->SetGlobalTransformation(globalTransform);
afc8e661 245}
a7d4e65b 246
247//______________________________________________________________________________
248Bool_t
249AliMUONGeometryTransformer::ReadVolPaths(ifstream& in)
250{
251// Reads modules and detection element volume paths from stream
252// ---
253
254 Int_t id;
255 TString key, volumePath;
256 in >> key;
afc8e661 257
a7d4e65b 258 while ( !in.eof() ) {
259
260 in >> id >> volumePath;
261
262 // cout << "id=" << id << " "
263 // << "volPath= " << volumePath
264 // << endl;
265
266 if ( key == TString("CH") )
267 FillModuleVolPath(id, volumePath);
268
269 else if ( key == TString("DE") )
270 FillDetElemVolPath(id, volumePath);
271
272 else {
273 AliFatal(Form("%s key not recognized", key.Data()));
274 return false;
275 }
276 in >> key;
277 }
278
279 return true;
280}
281
afc8e661 282//______________________________________________________________________________
a7d4e65b 283TString AliMUONGeometryTransformer::ReadModuleTransforms(ifstream& in)
afc8e661 284{
285// Reads and fills modules transformations from a file
286// Returns true, if reading finished correctly.
287// ---
288
289 TString key("CH");
290 while ( key == TString("CH") ) {
a7d4e65b 291 Int_t id;
afc8e661 292 Double_t x, y, z;
293 Double_t a1, a2, a3, a4, a5, a6;
294 TString dummy;
295
296 in >> id;
afc8e661 297 in >> dummy;
298 in >> x;
299 in >> y;
300 in >> z;
301 in >> dummy;
302 in >> a1;
303 in >> a2;
304 in >> a3;
305 in >> a4;
306 in >> a5;
307 in >> a6;
308
a7d4e65b 309 //cout << "moduleId=" << id << " "
afc8e661 310 // << "position= " << x << ", " << y << ", " << z << " "
311 // << "rotation= " << a1 << ", " << a2 << ", " << a3 << ", "
312 // << a4 << ", " << a5 << ", " << a6
313 // << endl;
314
315 // Fill data
a7d4e65b 316 FillModuleTransform(id, x, y, z, a1, a2, a3, a4, a5, a6);
afc8e661 317
318 // Go to next line
319 in >> key;
320 }
321
322 return key;
323}
324
325//______________________________________________________________________________
a7d4e65b 326TString AliMUONGeometryTransformer::ReadDetElemTransforms(ifstream& in)
afc8e661 327{
328// Reads detection elements transformations from a file
329// Returns true, if reading finished correctly.
330// ---
331
332 TString key("DE");
333 while ( key == TString("DE") ) {
334
335 // Input data
336 Int_t detElemId;
afc8e661 337 Double_t x, y, z;
338 Double_t a1, a2, a3, a4, a5, a6;
339 TString dummy;
340
341 in >> detElemId;
afc8e661 342 in >> dummy;
343 in >> x;
344 in >> y;
345 in >> z;
346 in >> dummy;
347 in >> a1;
348 in >> a2;
349 in >> a3;
350 in >> a4;
351 in >> a5;
352 in >> a6;
353
354 //cout << "detElemId=" << detElemId << " "
afc8e661 355 // << "position= " << x << ", " << y << ", " << z << " "
356 // << "rotation= " << a1 << ", " << a2 << ", " << a3 << ", "
a7d4e65b 357 // << a4 << ", " << a5 << ", " << a6
afc8e661 358 // << endl;
359
360 // Fill data
a7d4e65b 361 FillDetElemTransform(detElemId, x, y, z, a1, a2, a3, a4, a5, a6);
afc8e661 362
363 // Go to next line
364 in >> key;
365 }
366
367 return key;
368}
369
a7d4e65b 370//______________________________________________________________________________
371Bool_t
372AliMUONGeometryTransformer::LoadTransforms(TGeoManager* tgeoManager)
373{
374/// Loads transformations for defined modules and detection elements
375/// from the root file
376
377 for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
378 AliMUONGeometryModuleTransformer* moduleTransformer
379 = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
380
381 // Module path
382 TString path = moduleTransformer->GetVolumePath();
383
384 // Make physical node
385 TGeoPhysicalNode* moduleNode = tgeoManager->MakePhysicalNode(path);
386 if ( ! moduleNode ) {
387 AliErrorStream()
388 << "Module id: " << moduleTransformer->GetModuleId()
389 << " volume path: " << path << " not found in geometry." << endl;
390 return false;
391 }
392
393 // Set matrix from physical node
394 TGeoHMatrix matrix = *moduleNode->GetMatrix();
395 moduleTransformer->SetTransformation(matrix);
396
397 // Loop over detection elements
398 AliMUONGeometryStore* detElements
399 = moduleTransformer->GetDetElementStore();
400
401 for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
402 AliMUONGeometryDetElement* detElement
403 = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
404
405 // Det element path
406 TString dePath = detElement->GetVolumePath();
407
408 // Make physical node
409 TGeoPhysicalNode* deNode = tgeoManager->MakePhysicalNode(dePath);
410 if ( ! deNode ) {
411 AliErrorStream()
412 << "Det element id: " << detElement->GetId()
413 << " volume path: " << path << " not found in geometry." << endl;
414 return false;
415 }
416
417 // Set global matrix from physical node
418 TGeoHMatrix globalMatrix = *deNode->GetMatrix();
419 detElement->SetGlobalTransformation(globalMatrix);
420
421 // Set local matrix
422 TGeoHMatrix localMatrix =
423 AliMUONGeometryBuilder::Multiply(
424 matrix.Inverse(), globalMatrix );
425 detElement->SetLocalTransformation(localMatrix);
426 }
427 }
428 return true;
429}
430
431//______________________________________________________________________________
432Bool_t
433AliMUONGeometryTransformer::ReadVolPaths(const TString& fileName)
434{
435// Reads detection element volume paths from a file
436// Returns true, if reading finished correctly.
437// ---
438
439 // File path
440 TString filePath = gSystem->Getenv("ALICE_ROOT");
441 filePath += "/MUON/data/";
442 filePath += fileName;
443
444 // Open input file
445 ifstream in(filePath, ios::in);
446 if (!in) {
447 cerr << filePath << endl;
448 AliFatal("File not found.");
449 return false;
450 }
451
452 ReadVolPaths(in);
453 return true;
454}
455
456//______________________________________________________________________________
457Bool_t
458AliMUONGeometryTransformer::ReadTransformations(const TString& fileName)
459{
460// Reads transformations from a file
461// Returns true, if reading finished correctly.
462// ---
463
464 // File path
465 TString filePath = gSystem->Getenv("ALICE_ROOT");
466 filePath += "/MUON/data/";
467 filePath += fileName;
468
469 // Open input file
470 ifstream in(filePath, ios::in);
471 if (!in) {
472 cerr << filePath << endl;
473 AliFatal("File not found.");
474 return false;
475 }
476
477 TString key;
478 in >> key;
479 while ( !in.eof() ) {
480 if (key == TString("CH"))
481 key = ReadModuleTransforms(in);
482 else if (key == TString("DE"))
483 key = ReadDetElemTransforms(in);
484 else {
485 AliFatal(Form("%s key not recognized", key.Data()));
486 return false;
487 }
488 }
489
490 return true;
491}
492
493//______________________________________________________________________________
494Bool_t
495AliMUONGeometryTransformer::ReadTransformations2(const TString& fileName)
496{
497// Reads transformations from root geometry file
498// Returns true, if reading finished correctly.
499// ---
500
501 // File path
502 TString filePath = gSystem->Getenv("ALICE_ROOT");
503 filePath += "/MUON/data/";
504 filePath += fileName;
505
506 // Load root geometry
507 TGeoManager* tgeoManager = TGeoManager::Import(fileName);
508
509 // Retrieve matrices
510 LoadTransforms(tgeoManager);
511
512 return true;
513}
514
afc8e661 515//______________________________________________________________________________
516void AliMUONGeometryTransformer::WriteTransform(ofstream& out,
a7d4e65b 517 const TGeoMatrix* transform) const
afc8e661 518{
519// Writes the transformations
520// ---
521
522 out << " pos: ";
523 const Double_t* xyz = transform->GetTranslation();
524 out << setw(10) << setprecision(4) << xyz[0] << " "
525 << setw(10) << setprecision(4) << xyz[1] << " "
526 << setw(10) << setprecision(4) << xyz[2];
527
528 out << " rot: ";
529 const Double_t* rm = transform->GetRotationMatrix();
530 TGeoRotation rotation;
531 rotation.SetMatrix(const_cast<Double_t*>(rm));
532 Double_t a1, a2, a3, a4, a5, a6;
533 rotation.GetAngles(a1, a2, a3, a4, a5, a6);
534
535 out << setw(8) << setprecision(4) << a1 << " "
536 << setw(8) << setprecision(4) << a2 << " "
537 << setw(8) << setprecision(4) << a3 << " "
538 << setw(8) << setprecision(4) << a4 << " "
539 << setw(8) << setprecision(4) << a5 << " "
540 << setw(8) << setprecision(4) << a6 << " " << endl;
541}
542
543//______________________________________________________________________________
a7d4e65b 544void AliMUONGeometryTransformer::WriteModuleVolPaths(ofstream& out) const
afc8e661 545{
a7d4e65b 546// Write modules volume paths
547
548 for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
549 AliMUONGeometryModuleTransformer* moduleTransformer
550 = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
551
552 // Write data on out
553 out << "CH "
554 << setw(4) << moduleTransformer->GetModuleId() << " "
555 << moduleTransformer->GetVolumePath() << endl;
556 }
557 out << endl;
558}
559
560//______________________________________________________________________________
561void AliMUONGeometryTransformer::WriteDetElemVolPaths(ofstream& out) const
562{
563// Write detection elements volume paths
564
565 for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
566 AliMUONGeometryModuleTransformer* moduleTransformer
567 = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
568 AliMUONGeometryStore* detElements
569 = moduleTransformer->GetDetElementStore();
570
571 for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
572 AliMUONGeometryDetElement* detElement
573 = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
574
575 // Write data on out
576 out << "DE "
577 << setw(4) << detElement->GetId() << " "
578 << detElement->GetVolumePath() << endl;
579 }
580 out << endl;
581 }
582}
583
584//______________________________________________________________________________
585void AliMUONGeometryTransformer::WriteModuleTransforms(ofstream& out) const
586{
587// Write modules transformations
afc8e661 588
589 for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
590 AliMUONGeometryModuleTransformer* moduleTransformer
591 = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
a7d4e65b 592 const TGeoMatrix* transform
afc8e661 593 = moduleTransformer->GetTransformation();
594
a7d4e65b 595 // Write data on out
afc8e661 596 out << "CH "
a7d4e65b 597 << setw(4) << moduleTransformer->GetModuleId() + 1;
afc8e661 598
599 WriteTransform(out, transform);
600 }
601 out << endl;
602}
603
604//______________________________________________________________________________
a7d4e65b 605void AliMUONGeometryTransformer::WriteDetElemTransforms(ofstream& out) const
afc8e661 606{
a7d4e65b 607// Writes detection elements transformations
afc8e661 608// ---
609
afc8e661 610 for (Int_t i=0; i<fModuleTransformers->GetEntriesFast(); i++) {
611 AliMUONGeometryModuleTransformer* moduleTransformer
612 = (AliMUONGeometryModuleTransformer*)fModuleTransformers->At(i);
613 AliMUONGeometryStore* detElements
614 = moduleTransformer->GetDetElementStore();
615
616 for (Int_t j=0; j<detElements->GetNofEntries(); j++) {
617 AliMUONGeometryDetElement* detElement
618 = (AliMUONGeometryDetElement*)detElements->GetEntry(j);
a7d4e65b 619 const TGeoMatrix* transform
afc8e661 620 = detElement->GetLocalTransformation();
621
afc8e661 622 // Write data on out
a7d4e65b 623 out << "DE " << setw(4) << detElement->GetId();
afc8e661 624
625 WriteTransform(out, transform);
626 }
627 out << endl;
628 }
629}
630
631//
632// public functions
633//
634
635//______________________________________________________________________________
636Bool_t
a7d4e65b 637AliMUONGeometryTransformer::ReadGeometryData(
638 const TString& volPathFileName,
639 const TString& transformFileName)
afc8e661 640{
a7d4e65b 641/// Read geometry data from given files;
642/// if transformFileName has ".root" extension, the transformations
643/// are loaded from root geometry file, otherwise ASCII file
644/// format is supposed
645
646 Bool_t result1 = ReadVolPaths(volPathFileName);
647
648 // Get file extension
649 std::string fileName = transformFileName.Data();
650 std::string rootExt = fileName.substr(fileName.size()-5, fileName.size());
651 Bool_t result2;
652 if ( rootExt != ".root" )
653 result2 = ReadTransformations(transformFileName);
654 else
655 result2 = ReadTransformations2(transformFileName);
656
657 return result1 && result2;
658}
659
660//______________________________________________________________________________
661Bool_t
662AliMUONGeometryTransformer::ReadGeometryData(
663 const TString& volPathFileName,
664 TGeoManager* tgeoManager)
665{
666/// Load geometry data from root geometry using defined
667/// voluem paths from file
668
669 Bool_t result1 = ReadVolPaths(volPathFileName);
670
671 Bool_t result2 = LoadTransforms(tgeoManager);
672
673 return result1 && result2;
674}
675
676//______________________________________________________________________________
677Bool_t
678AliMUONGeometryTransformer::WriteGeometryData(
679 const TString& volPathFileName,
680 const TString& transformFileName,
681 const TString& misalignFileName) const
682{
683/// Write geometry data into given files
684
685 Bool_t result1 = WriteVolumePaths(volPathFileName);
686 Bool_t result2 = WriteTransformations(transformFileName);
687
688 Bool_t result3 = true;
689 if ( misalignFileName != "" )
690 result3 = WriteMisAlignmentData(misalignFileName);
691
692 return result1 && result2 && result3;
693}
694
695//______________________________________________________________________________
696Bool_t
697AliMUONGeometryTransformer::WriteVolumePaths(const TString& fileName) const
698{
699// Writes volume paths for modules and detection element volumes into a file
700// Returns true, if writing finished correctly.
afc8e661 701// ---
702
a7d4e65b 703 // No writing
704 // if builder is not associated with any geometry module
705 if (fModuleTransformers->GetEntriesFast() == 0) return false;
706
afc8e661 707 // File path
708 TString filePath = gSystem->Getenv("ALICE_ROOT");
709 filePath += "/MUON/data/";
710 filePath += fileName;
711
a7d4e65b 712 // Open output file
713 ofstream out(filePath, ios::out);
714 if (!out) {
afc8e661 715 cerr << filePath << endl;
a7d4e65b 716 AliError("File not found.");
afc8e661 717 return false;
718 }
a7d4e65b 719#if !defined (__DECCXX)
720 out.setf(std::ios::fixed);
721#endif
722 WriteModuleVolPaths(out);
723 WriteDetElemVolPaths(out);
724
afc8e661 725 return true;
a7d4e65b 726}
afc8e661 727
728//______________________________________________________________________________
729Bool_t
730AliMUONGeometryTransformer::WriteTransformations(const TString& fileName) const
731{
732// Writes transformations into a file
733// Returns true, if writing finished correctly.
734// ---
735
736 // No writing
737 // if builder is not associated with any geometry module
738 if (fModuleTransformers->GetEntriesFast() == 0) return false;
739
740 // File path
741 TString filePath = gSystem->Getenv("ALICE_ROOT");
742 filePath += "/MUON/data/";
743 filePath += fileName;
744
a7d4e65b 745 // Open output file
afc8e661 746 ofstream out(filePath, ios::out);
747 if (!out) {
748 cerr << filePath << endl;
749 AliError("File not found.");
750 return false;
751 }
752#if !defined (__DECCXX)
753 out.setf(std::ios::fixed);
754#endif
a7d4e65b 755 WriteModuleTransforms(out);
756 WriteDetElemTransforms(out);
757
758 return true;
759}
760
761//______________________________________________________________________________
762Bool_t
763AliMUONGeometryTransformer::WriteMisAlignmentData(const TString& fileName) const
764{
765// Writes misalignment data into a file
766// Returns true, if writing finished correctly.
767// ---
768
769 // No writing
770 // if builder is not associated with any geometry module
771 if ( fModuleTransformers->GetEntriesFast() == 0 ) {
772 AliWarningStream() << "No geometry modules defined." << endl;
773 return false;
774 }
775
776 // No writing
777 // if builder has no mis-alignment data
778 if ( ! fMisAlignArray ) {
779 AliWarningStream() << "No mis-alignment data defined." << endl;
780 return false;
781 }
782
783 // File path
784 TString filePath = gSystem->Getenv("ALICE_ROOT");
785 filePath += "/MUON/data/";
786 filePath += fileName;
787
788 // Write mis-alignment data in the root file
789 TFile file(fileName.Data(), "RECREATE");
790 fMisAlignArray->Write();
791 file.Close();
afc8e661 792
793 return true;
794}
795
796//_____________________________________________________________________________
797void AliMUONGeometryTransformer::AddModuleTransformer(
798 AliMUONGeometryModuleTransformer* moduleTransformer)
799{
800/// Add the geometrymodule to the array
801
802 fModuleTransformers->AddAt(moduleTransformer,
803 moduleTransformer->GetModuleId());
804}
805
a7d4e65b 806//_____________________________________________________________________________
807void AliMUONGeometryTransformer::AddMisAlignModule(Int_t moduleId,
808 const TGeoHMatrix& matrix)
809{
810/// Build AliAlignObjMatrix with module ID, its volumePaths
811/// and the given delta transformation matrix
812
813 if ( ! fMisAlignArray )
814 fMisAlignArray = new TClonesArray("AliAlignObjMatrix", 200);
815
816 const AliMUONGeometryModuleTransformer* kTransformer
817 = GetModuleTransformer(moduleId);
818 if ( ! kTransformer ) {
819 AliErrorStream() << "Module " << moduleId << " not found." << endl;
820 return;
821 }
822
823 // Get path
824 TString path = kTransformer->GetVolumePath();
825
bf16b32c 826 // Get unique align object ID
827 Int_t volId = AliAlignObj::LayerToVolUID(AliAlignObj::kMUON, moduleId);
828
a7d4e65b 829 // Create mis align matrix
830 TClonesArray& refArray =*fMisAlignArray;
831 Int_t pos = fMisAlignArray->GetEntriesFast();
bf16b32c 832 new (refArray[pos]) AliAlignObjMatrix(path.Data(), volId,
a7d4e65b 833 const_cast<TGeoHMatrix&>(matrix));
834}
835
836//_____________________________________________________________________________
837void AliMUONGeometryTransformer::AddMisAlignDetElement(Int_t detElemId,
838 const TGeoHMatrix& matrix)
839{
840/// Build AliAlignObjMatrix with detection element ID, its volumePaths
841/// and the given delta transformation matrix
842
843 if ( ! fMisAlignArray )
844 fMisAlignArray = new TClonesArray("AliAlignObjMatrix", 200);
845
846 const AliMUONGeometryDetElement* kDetElement
847 = GetDetElement(detElemId);
848
849 if ( ! kDetElement ) {
850 AliErrorStream() << "Det element " << detElemId << " not found." << endl;
851 return;
852 }
853
854 // Get path
855 TString path = kDetElement->GetVolumePath();
856
bf16b32c 857 // Get unique align object ID
858 Int_t volId = AliAlignObj::LayerToVolUID(AliAlignObj::kMUON, detElemId);
859
a7d4e65b 860 // Create mis align matrix
861 TClonesArray& refArray =*fMisAlignArray;
862 Int_t pos = fMisAlignArray->GetEntriesFast();
bf16b32c 863 new(refArray[pos]) AliAlignObjMatrix(path.Data(), volId,
a7d4e65b 864 const_cast<TGeoHMatrix&>(matrix));
865}
866
afc8e661 867//_____________________________________________________________________________
868void AliMUONGeometryTransformer::Global2Local(Int_t detElemId,
869 Float_t xg, Float_t yg, Float_t zg,
870 Float_t& xl, Float_t& yl, Float_t& zl) const
871{
872/// Transform point from the global reference frame (ALIC)
873/// to the local reference frame of the detection element specified
874/// by detElemId.
f7006443 875
afc8e661 876 const AliMUONGeometryModuleTransformer* kTransformer
877 = GetModuleTransformerByDEId(detElemId);
878
879 if (kTransformer)
880 kTransformer->Global2Local(detElemId, xg, yg, zg, xl, yl, zl);
881}
882
883//_____________________________________________________________________________
884void AliMUONGeometryTransformer::Global2Local(Int_t detElemId,
885 Double_t xg, Double_t yg, Double_t zg,
886 Double_t& xl, Double_t& yl, Double_t& zl) const
887{
888/// Transform point from the global reference frame (ALIC)
889/// to the local reference frame of the detection element specified
890/// by detElemId.
f7006443 891
afc8e661 892 const AliMUONGeometryModuleTransformer* kTransformer
893 = GetModuleTransformerByDEId(detElemId);
894
895 if (kTransformer)
896 kTransformer->Global2Local(detElemId, xg, yg, zg, xl, yl, zl);
897}
898
899//_____________________________________________________________________________
900void AliMUONGeometryTransformer::Local2Global(Int_t detElemId,
901 Float_t xl, Float_t yl, Float_t zl,
902 Float_t& xg, Float_t& yg, Float_t& zg) const
903{
904/// Transform point from the local reference frame of the detection element
905/// specified by detElemId to the global reference frame (ALIC).
906
907 const AliMUONGeometryModuleTransformer* kTransformer
908 = GetModuleTransformerByDEId(detElemId);
909
910 if (kTransformer)
911 kTransformer->Local2Global(detElemId, xl, yl, zl, xg, yg, zg);
912}
913
914//_____________________________________________________________________________
915void AliMUONGeometryTransformer::Local2Global(Int_t detElemId,
916 Double_t xl, Double_t yl, Double_t zl,
917 Double_t& xg, Double_t& yg, Double_t& zg) const
918{
919/// Transform point from the local reference frame of the detection element
920/// specified by detElemId to the global reference frame (ALIC).
921
922 const AliMUONGeometryModuleTransformer* kTransformer
923 = GetModuleTransformerByDEId(detElemId);
924
925 if (kTransformer)
926 kTransformer->Local2Global(detElemId, xl, yl, zl, xg, yg, zg);
927}
928
929//_____________________________________________________________________________
930const AliMUONGeometryModuleTransformer*
931AliMUONGeometryTransformer::GetModuleTransformer(Int_t index, Bool_t warn) const
932{
933/// Return the geometry module specified by index
934
935 return GetModuleTransformerNonConst(index, warn);
936}
937
938//_____________________________________________________________________________
939const AliMUONGeometryModuleTransformer*
940AliMUONGeometryTransformer::GetModuleTransformerByDEId(Int_t detElemId,
941 Bool_t warn) const
942{
943/// Return the geometry module specified by index
944
945 // Get module index
e5df8ea1 946 Int_t index = AliMUONGeometryStore::GetModuleId(detElemId);
afc8e661 947
948 return GetModuleTransformer(index, warn);
949}
317aa7dc 950
a7d4e65b 951//_____________________________________________________________________________
952const AliMUONGeometryDetElement*
953AliMUONGeometryTransformer::GetDetElement(Int_t detElemId, Bool_t warn) const
954{
955/// Return detection ellemnt with given detElemId
956
957 const AliMUONGeometryModuleTransformer* kTransformer
958 = GetModuleTransformerByDEId(detElemId, warn);
959
960 if (!kTransformer) return 0;
961
962 return kTransformer->GetDetElement(detElemId, warn);
963}
964
317aa7dc 965//_____________________________________________________________________________
966Bool_t AliMUONGeometryTransformer::HasDE(Int_t detElemId) const
967{
968/// Return true if detection element with given detElemId is defined
969
970 const AliMUONGeometryModuleTransformer* kTransformer
971 = GetModuleTransformerByDEId(detElemId, false);
972
973 if (!kTransformer) return false;
974
975 return ( kTransformer->GetDetElement(detElemId, false) != 0 );
976}
977
978