ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// $Id$

//-----------------------------------------------------------------------------
// Class AliMUONGeometryModuleTransformer
// -------------------------------------
// Class for definition of the detector module transformations
// Author: Ivana Hrivnacova, IPN Orsay
//-----------------------------------------------------------------------------

#include "AliMUONGeometryModuleTransformer.h"
#include "AliMUONGeometryDetElement.h"	

#include "AliMpExMap.h"	

#include "AliLog.h"	

#include <TVirtualMC.h>
#include <TGeoMatrix.h>
#include <TObjArray.h>
#include <TArrayI.h>
#include <Riostream.h>

using std::endl;
/// \cond CLASSIMP
ClassImp(AliMUONGeometryModuleTransformer)
/// \endcond

//
// static methods
//

//______________________________________________________________________________
const TString& AliMUONGeometryModuleTransformer::GetModuleNamePrefix()
{
  /// Geometry module name prefix
  static const TString kModuleNamePrefix = "GM";
  return kModuleNamePrefix;
}  

//______________________________________________________________________________
TString AliMUONGeometryModuleTransformer::GetModuleName(Int_t moduleId)
{
/// Return the module name for given moduleId

  TString moduleName(GetModuleNamePrefix());
  moduleName += moduleId;
  return moduleName;
}   

//
// ctor, dtor
//

//______________________________________________________________________________
AliMUONGeometryModuleTransformer::AliMUONGeometryModuleTransformer(Int_t moduleId)
 : TObject(),
   fModuleId(moduleId),
   fModuleName(GetModuleName(moduleId)),
   fVolumePath(),
   fTransformation(0),
   fDetElements(0)
{
/// Standard constructor

  // Chamber transformation
  fTransformation = new TGeoHMatrix("");

  // Det elements transformation stores
  fDetElements = new AliMpExMap;
}


//______________________________________________________________________________
AliMUONGeometryModuleTransformer::AliMUONGeometryModuleTransformer(TRootIOCtor* /*ioCtor*/)
 : TObject(),
   fModuleId(0),
   fModuleName(),
   fVolumePath(),
   fTransformation(0),
   fDetElements(0)
{
/// Root IO constructor
}


//______________________________________________________________________________
AliMUONGeometryModuleTransformer::~AliMUONGeometryModuleTransformer() 
{
/// Destructor

  delete fTransformation;
  delete fDetElements;
}

//
// public methods
//

//______________________________________________________________________________
void  AliMUONGeometryModuleTransformer::Global2Local(Int_t detElemId,
                  Float_t xg, Float_t yg, Float_t zg, 
                  Float_t& xl, Float_t& yl, Float_t& zl) const
{
/// Transform point from the global reference frame (ALIC)
/// to the local reference frame of the detection element specified
/// by detElemId.

  // Get detection element
  AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
  if (!detElement) return;
   
  // Transform point
  detElement->Global2Local(xg, yg, zg, xl, yl, zl);
}
				  
//______________________________________________________________________________
void  AliMUONGeometryModuleTransformer::Global2Local(Int_t detElemId,
                  Double_t xg, Double_t yg, Double_t zg, 
                  Double_t& xl, Double_t& yl, Double_t& zl) const
{
/// Transform point from the global reference frame (ALIC)
/// to the local reference frame of the detection element specified
/// by detElemId.

   // Get detection element
   AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
   if (!detElement) return;
   
   // Transform point
   detElement->Global2Local(xg, yg, zg, xl, yl, zl);
}
				  
//______________________________________________________________________________
void  AliMUONGeometryModuleTransformer::Local2Global(Int_t detElemId,
                 Float_t xl, Float_t yl, Float_t zl, 
                 Float_t& xg, Float_t& yg, Float_t& zg) const
{
/// Transform point from the local reference frame of the detection element 
/// specified by detElemId to the global reference frame (ALIC).

  // Get detection element
  AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
  if (!detElement) return;
   
   // Transform point
  detElement->Local2Global(xl, yl, zl, xg, yg, zg);  
}

//______________________________________________________________________________
void  AliMUONGeometryModuleTransformer::Local2Global(Int_t detElemId,
                 Double_t xl, Double_t yl, Double_t zl, 
                 Double_t& xg, Double_t& yg, Double_t& zg) const
{
/// Transform point from the local reference frame of the detection element 
/// specified by detElemId to the global reference frame (ALIC).

   // Get detection element
   AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
   if (!detElement) return;
   
   // Transform point
   detElement->Local2Global(xl, yl, zl, xg, yg, zg); 
}

//______________________________________________________________________________
void  AliMUONGeometryModuleTransformer::SetTransformation(
                                           const TGeoHMatrix& transform)
{
/// Set the module position wrt world.

  *fTransformation = transform;
}  

//______________________________________________________________________________
TString AliMUONGeometryModuleTransformer::GetVolumeName() const
{ 
/// Extract volume name from the path
  
  std::string volPath = fVolumePath.Data();
  std::string::size_type first = volPath.rfind('/')+1;
  std::string::size_type last = volPath.rfind('_');
  
  return volPath.substr(first, last-first );
}

//______________________________________________________________________________
TString AliMUONGeometryModuleTransformer::GetMotherVolumeName() const
{ 
/// Extract mother volume name from the path
  
  std::string volPath = fVolumePath.Data();
  std::string::size_type first = volPath.rfind('/');
  if ( first != std::string::npos )
    volPath = volPath.substr(0, first);

  std::string::size_type next = volPath.rfind('/')+1;
  std::string::size_type last = volPath.rfind('_');
  
  return volPath.substr(next, last-next );
}

//______________________________________________________________________________
AliMUONGeometryDetElement*
AliMUONGeometryModuleTransformer::GetDetElement(Int_t detElemId, Bool_t warn) const
{
/// Return the detection element specified by detElemId.
/// Give error if detection element is not defined and warn is true.

   // Get detection element
   AliMUONGeometryDetElement* detElement
     = (AliMUONGeometryDetElement*) fDetElements->GetValue(detElemId);

   if (!detElement) {
     if (warn)
       AliErrorStream() 
         << "Detection element " << detElemId
         << " not found in module " << fModuleId << endl;
     return 0;
   }  

   return detElement;
}
 AliMUONGeometryModuleTransformer.cxx:1
 AliMUONGeometryModuleTransformer.cxx:2
 AliMUONGeometryModuleTransformer.cxx:3
 AliMUONGeometryModuleTransformer.cxx:4
 AliMUONGeometryModuleTransformer.cxx:5
 AliMUONGeometryModuleTransformer.cxx:6
 AliMUONGeometryModuleTransformer.cxx:7
 AliMUONGeometryModuleTransformer.cxx:8
 AliMUONGeometryModuleTransformer.cxx:9
 AliMUONGeometryModuleTransformer.cxx:10
 AliMUONGeometryModuleTransformer.cxx:11
 AliMUONGeometryModuleTransformer.cxx:12
 AliMUONGeometryModuleTransformer.cxx:13
 AliMUONGeometryModuleTransformer.cxx:14
 AliMUONGeometryModuleTransformer.cxx:15
 AliMUONGeometryModuleTransformer.cxx:16
 AliMUONGeometryModuleTransformer.cxx:17
 AliMUONGeometryModuleTransformer.cxx:18
 AliMUONGeometryModuleTransformer.cxx:19
 AliMUONGeometryModuleTransformer.cxx:20
 AliMUONGeometryModuleTransformer.cxx:21
 AliMUONGeometryModuleTransformer.cxx:22
 AliMUONGeometryModuleTransformer.cxx:23
 AliMUONGeometryModuleTransformer.cxx:24
 AliMUONGeometryModuleTransformer.cxx:25
 AliMUONGeometryModuleTransformer.cxx:26
 AliMUONGeometryModuleTransformer.cxx:27
 AliMUONGeometryModuleTransformer.cxx:28
 AliMUONGeometryModuleTransformer.cxx:29
 AliMUONGeometryModuleTransformer.cxx:30
 AliMUONGeometryModuleTransformer.cxx:31
 AliMUONGeometryModuleTransformer.cxx:32
 AliMUONGeometryModuleTransformer.cxx:33
 AliMUONGeometryModuleTransformer.cxx:34
 AliMUONGeometryModuleTransformer.cxx:35
 AliMUONGeometryModuleTransformer.cxx:36
 AliMUONGeometryModuleTransformer.cxx:37
 AliMUONGeometryModuleTransformer.cxx:38
 AliMUONGeometryModuleTransformer.cxx:39
 AliMUONGeometryModuleTransformer.cxx:40
 AliMUONGeometryModuleTransformer.cxx:41
 AliMUONGeometryModuleTransformer.cxx:42
 AliMUONGeometryModuleTransformer.cxx:43
 AliMUONGeometryModuleTransformer.cxx:44
 AliMUONGeometryModuleTransformer.cxx:45
 AliMUONGeometryModuleTransformer.cxx:46
 AliMUONGeometryModuleTransformer.cxx:47
 AliMUONGeometryModuleTransformer.cxx:48
 AliMUONGeometryModuleTransformer.cxx:49
 AliMUONGeometryModuleTransformer.cxx:50
 AliMUONGeometryModuleTransformer.cxx:51
 AliMUONGeometryModuleTransformer.cxx:52
 AliMUONGeometryModuleTransformer.cxx:53
 AliMUONGeometryModuleTransformer.cxx:54
 AliMUONGeometryModuleTransformer.cxx:55
 AliMUONGeometryModuleTransformer.cxx:56
 AliMUONGeometryModuleTransformer.cxx:57
 AliMUONGeometryModuleTransformer.cxx:58
 AliMUONGeometryModuleTransformer.cxx:59
 AliMUONGeometryModuleTransformer.cxx:60
 AliMUONGeometryModuleTransformer.cxx:61
 AliMUONGeometryModuleTransformer.cxx:62
 AliMUONGeometryModuleTransformer.cxx:63
 AliMUONGeometryModuleTransformer.cxx:64
 AliMUONGeometryModuleTransformer.cxx:65
 AliMUONGeometryModuleTransformer.cxx:66
 AliMUONGeometryModuleTransformer.cxx:67
 AliMUONGeometryModuleTransformer.cxx:68
 AliMUONGeometryModuleTransformer.cxx:69
 AliMUONGeometryModuleTransformer.cxx:70
 AliMUONGeometryModuleTransformer.cxx:71
 AliMUONGeometryModuleTransformer.cxx:72
 AliMUONGeometryModuleTransformer.cxx:73
 AliMUONGeometryModuleTransformer.cxx:74
 AliMUONGeometryModuleTransformer.cxx:75
 AliMUONGeometryModuleTransformer.cxx:76
 AliMUONGeometryModuleTransformer.cxx:77
 AliMUONGeometryModuleTransformer.cxx:78
 AliMUONGeometryModuleTransformer.cxx:79
 AliMUONGeometryModuleTransformer.cxx:80
 AliMUONGeometryModuleTransformer.cxx:81
 AliMUONGeometryModuleTransformer.cxx:82
 AliMUONGeometryModuleTransformer.cxx:83
 AliMUONGeometryModuleTransformer.cxx:84
 AliMUONGeometryModuleTransformer.cxx:85
 AliMUONGeometryModuleTransformer.cxx:86
 AliMUONGeometryModuleTransformer.cxx:87
 AliMUONGeometryModuleTransformer.cxx:88
 AliMUONGeometryModuleTransformer.cxx:89
 AliMUONGeometryModuleTransformer.cxx:90
 AliMUONGeometryModuleTransformer.cxx:91
 AliMUONGeometryModuleTransformer.cxx:92
 AliMUONGeometryModuleTransformer.cxx:93
 AliMUONGeometryModuleTransformer.cxx:94
 AliMUONGeometryModuleTransformer.cxx:95
 AliMUONGeometryModuleTransformer.cxx:96
 AliMUONGeometryModuleTransformer.cxx:97
 AliMUONGeometryModuleTransformer.cxx:98
 AliMUONGeometryModuleTransformer.cxx:99
 AliMUONGeometryModuleTransformer.cxx:100
 AliMUONGeometryModuleTransformer.cxx:101
 AliMUONGeometryModuleTransformer.cxx:102
 AliMUONGeometryModuleTransformer.cxx:103
 AliMUONGeometryModuleTransformer.cxx:104
 AliMUONGeometryModuleTransformer.cxx:105
 AliMUONGeometryModuleTransformer.cxx:106
 AliMUONGeometryModuleTransformer.cxx:107
 AliMUONGeometryModuleTransformer.cxx:108
 AliMUONGeometryModuleTransformer.cxx:109
 AliMUONGeometryModuleTransformer.cxx:110
 AliMUONGeometryModuleTransformer.cxx:111
 AliMUONGeometryModuleTransformer.cxx:112
 AliMUONGeometryModuleTransformer.cxx:113
 AliMUONGeometryModuleTransformer.cxx:114
 AliMUONGeometryModuleTransformer.cxx:115
 AliMUONGeometryModuleTransformer.cxx:116
 AliMUONGeometryModuleTransformer.cxx:117
 AliMUONGeometryModuleTransformer.cxx:118
 AliMUONGeometryModuleTransformer.cxx:119
 AliMUONGeometryModuleTransformer.cxx:120
 AliMUONGeometryModuleTransformer.cxx:121
 AliMUONGeometryModuleTransformer.cxx:122
 AliMUONGeometryModuleTransformer.cxx:123
 AliMUONGeometryModuleTransformer.cxx:124
 AliMUONGeometryModuleTransformer.cxx:125
 AliMUONGeometryModuleTransformer.cxx:126
 AliMUONGeometryModuleTransformer.cxx:127
 AliMUONGeometryModuleTransformer.cxx:128
 AliMUONGeometryModuleTransformer.cxx:129
 AliMUONGeometryModuleTransformer.cxx:130
 AliMUONGeometryModuleTransformer.cxx:131
 AliMUONGeometryModuleTransformer.cxx:132
 AliMUONGeometryModuleTransformer.cxx:133
 AliMUONGeometryModuleTransformer.cxx:134
 AliMUONGeometryModuleTransformer.cxx:135
 AliMUONGeometryModuleTransformer.cxx:136
 AliMUONGeometryModuleTransformer.cxx:137
 AliMUONGeometryModuleTransformer.cxx:138
 AliMUONGeometryModuleTransformer.cxx:139
 AliMUONGeometryModuleTransformer.cxx:140
 AliMUONGeometryModuleTransformer.cxx:141
 AliMUONGeometryModuleTransformer.cxx:142
 AliMUONGeometryModuleTransformer.cxx:143
 AliMUONGeometryModuleTransformer.cxx:144
 AliMUONGeometryModuleTransformer.cxx:145
 AliMUONGeometryModuleTransformer.cxx:146
 AliMUONGeometryModuleTransformer.cxx:147
 AliMUONGeometryModuleTransformer.cxx:148
 AliMUONGeometryModuleTransformer.cxx:149
 AliMUONGeometryModuleTransformer.cxx:150
 AliMUONGeometryModuleTransformer.cxx:151
 AliMUONGeometryModuleTransformer.cxx:152
 AliMUONGeometryModuleTransformer.cxx:153
 AliMUONGeometryModuleTransformer.cxx:154
 AliMUONGeometryModuleTransformer.cxx:155
 AliMUONGeometryModuleTransformer.cxx:156
 AliMUONGeometryModuleTransformer.cxx:157
 AliMUONGeometryModuleTransformer.cxx:158
 AliMUONGeometryModuleTransformer.cxx:159
 AliMUONGeometryModuleTransformer.cxx:160
 AliMUONGeometryModuleTransformer.cxx:161
 AliMUONGeometryModuleTransformer.cxx:162
 AliMUONGeometryModuleTransformer.cxx:163
 AliMUONGeometryModuleTransformer.cxx:164
 AliMUONGeometryModuleTransformer.cxx:165
 AliMUONGeometryModuleTransformer.cxx:166
 AliMUONGeometryModuleTransformer.cxx:167
 AliMUONGeometryModuleTransformer.cxx:168
 AliMUONGeometryModuleTransformer.cxx:169
 AliMUONGeometryModuleTransformer.cxx:170
 AliMUONGeometryModuleTransformer.cxx:171
 AliMUONGeometryModuleTransformer.cxx:172
 AliMUONGeometryModuleTransformer.cxx:173
 AliMUONGeometryModuleTransformer.cxx:174
 AliMUONGeometryModuleTransformer.cxx:175
 AliMUONGeometryModuleTransformer.cxx:176
 AliMUONGeometryModuleTransformer.cxx:177
 AliMUONGeometryModuleTransformer.cxx:178
 AliMUONGeometryModuleTransformer.cxx:179
 AliMUONGeometryModuleTransformer.cxx:180
 AliMUONGeometryModuleTransformer.cxx:181
 AliMUONGeometryModuleTransformer.cxx:182
 AliMUONGeometryModuleTransformer.cxx:183
 AliMUONGeometryModuleTransformer.cxx:184
 AliMUONGeometryModuleTransformer.cxx:185
 AliMUONGeometryModuleTransformer.cxx:186
 AliMUONGeometryModuleTransformer.cxx:187
 AliMUONGeometryModuleTransformer.cxx:188
 AliMUONGeometryModuleTransformer.cxx:189
 AliMUONGeometryModuleTransformer.cxx:190
 AliMUONGeometryModuleTransformer.cxx:191
 AliMUONGeometryModuleTransformer.cxx:192
 AliMUONGeometryModuleTransformer.cxx:193
 AliMUONGeometryModuleTransformer.cxx:194
 AliMUONGeometryModuleTransformer.cxx:195
 AliMUONGeometryModuleTransformer.cxx:196
 AliMUONGeometryModuleTransformer.cxx:197
 AliMUONGeometryModuleTransformer.cxx:198
 AliMUONGeometryModuleTransformer.cxx:199
 AliMUONGeometryModuleTransformer.cxx:200
 AliMUONGeometryModuleTransformer.cxx:201
 AliMUONGeometryModuleTransformer.cxx:202
 AliMUONGeometryModuleTransformer.cxx:203
 AliMUONGeometryModuleTransformer.cxx:204
 AliMUONGeometryModuleTransformer.cxx:205
 AliMUONGeometryModuleTransformer.cxx:206
 AliMUONGeometryModuleTransformer.cxx:207
 AliMUONGeometryModuleTransformer.cxx:208
 AliMUONGeometryModuleTransformer.cxx:209
 AliMUONGeometryModuleTransformer.cxx:210
 AliMUONGeometryModuleTransformer.cxx:211
 AliMUONGeometryModuleTransformer.cxx:212
 AliMUONGeometryModuleTransformer.cxx:213
 AliMUONGeometryModuleTransformer.cxx:214
 AliMUONGeometryModuleTransformer.cxx:215
 AliMUONGeometryModuleTransformer.cxx:216
 AliMUONGeometryModuleTransformer.cxx:217
 AliMUONGeometryModuleTransformer.cxx:218
 AliMUONGeometryModuleTransformer.cxx:219
 AliMUONGeometryModuleTransformer.cxx:220
 AliMUONGeometryModuleTransformer.cxx:221
 AliMUONGeometryModuleTransformer.cxx:222
 AliMUONGeometryModuleTransformer.cxx:223
 AliMUONGeometryModuleTransformer.cxx:224
 AliMUONGeometryModuleTransformer.cxx:225
 AliMUONGeometryModuleTransformer.cxx:226
 AliMUONGeometryModuleTransformer.cxx:227
 AliMUONGeometryModuleTransformer.cxx:228
 AliMUONGeometryModuleTransformer.cxx:229
 AliMUONGeometryModuleTransformer.cxx:230
 AliMUONGeometryModuleTransformer.cxx:231
 AliMUONGeometryModuleTransformer.cxx:232
 AliMUONGeometryModuleTransformer.cxx:233
 AliMUONGeometryModuleTransformer.cxx:234
 AliMUONGeometryModuleTransformer.cxx:235
 AliMUONGeometryModuleTransformer.cxx:236
 AliMUONGeometryModuleTransformer.cxx:237