+/**************************************************************************
+ * 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 AliMUONGeometryEnvelopeStore
#include <Riostream.h>
#include "AliMUONGeometryEnvelopeStore.h"
-#include "AliMUONGeometryTransformStore.h"
#include "AliMUONGeometryEnvelope.h"
+#include "AliMUONGeometryDetElement.h"
+#include "AliMUONGeometryStore.h"
#include "AliMUONConstants.h"
+#include "AliMUONGeometryBuilder.h"
+#include "AliLog.h"
ClassImp(AliMUONGeometryEnvelopeStore)
//______________________________________________________________________________
AliMUONGeometryEnvelopeStore::AliMUONGeometryEnvelopeStore(
- AliMUONGeometryTransformStore* transforms)
+ AliMUONGeometryStore* detElements)
: TObject(),
- fDETransforms(transforms),
fEnvelopes(0),
+ fDetElements(detElements),
+ fReferenceFrame(),
fDebug(false),
fAlign(false)
{
-// Standard constructor
+/// Standard constructor
fEnvelopes = new TObjArray(100);
}
//______________________________________________________________________________
AliMUONGeometryEnvelopeStore::AliMUONGeometryEnvelopeStore()
: TObject(),
- fDETransforms(0),
fEnvelopes(0),
+ fDetElements(0),
+ fReferenceFrame(),
fDebug(false),
fAlign(false)
{
-// Default constructor
+/// Default constructor
}
AliMUONGeometryEnvelopeStore::AliMUONGeometryEnvelopeStore(const AliMUONGeometryEnvelopeStore& rhs)
: TObject(rhs)
{
- Fatal("Copy constructor",
- "Copy constructor is not implemented.");
+ AliFatal("Copy constructor is not implemented.");
}
//______________________________________________________________________________
AliMUONGeometryEnvelopeStore::~AliMUONGeometryEnvelopeStore()
{
-//
+/// Destructor
// Add deleting rotation matrices
AliMUONGeometryEnvelopeStore&
AliMUONGeometryEnvelopeStore::operator = (const AliMUONGeometryEnvelopeStore& rhs)
{
+/// Protected assignement operator
+
// check assignement to self
if (this == &rhs) return *this;
- Fatal("operator=",
- "Assignment operator is not implemented.");
+ AliFatal("Assignment operator is not implemented.");
return *this;
}
// private methods
//
+//______________________________________________________________________________
+TGeoHMatrix
+AliMUONGeometryEnvelopeStore::ConvertTransform(const TGeoHMatrix& transform) const
+{
+// Convert transformation into the reference frame
+
+ if ( fReferenceFrame.IsIdentity() )
+ return transform;
+ else {
+ return AliMUONGeometryBuilder::Multiply( fReferenceFrame.Inverse(),
+ transform,
+ fReferenceFrame );
+ }
+}
+
//______________________________________________________________________________
AliMUONGeometryEnvelope*
AliMUONGeometryEnvelopeStore::FindEnvelope(const TString& name) const
{
-// Finds the envelope specified by name.
-// ---
+/// Find the envelope specified by name.
for (Int_t i=0; i<fEnvelopes->GetEntriesFast(); i++) {
AliMUONGeometryEnvelope* envelope
Bool_t AliMUONGeometryEnvelopeStore::AlignEnvelope(
AliMUONGeometryEnvelope* envelope) const
{
-// Find transformation by the detection element Id (if not 0)
-// (= unique ID of enevelope) and set it to the envelope.
-// Return true if transformation is applied, false otherwise.
-// ---
+/// Find transformation by the detection element Id (if not 0)
+/// (= unique ID of enevelope) and set it to the envelope.
+/// Return true if transformation is applied, false otherwise.
Int_t detElemId = envelope->GetUniqueID();
if (detElemId == 0) return false;
- const TGeoCombiTrans* kTransform = fDETransforms->Get(detElemId);
- if (!kTransform) {
- Warning("AlignEnvelope", "Transformation not found.");
+ AliMUONGeometryDetElement* detElement
+ = (AliMUONGeometryDetElement*) fDetElements->Get(detElemId);
+ if (!detElement) {
+ AliWarning("Transformation not found.");
return false;
};
- envelope->SetTransform(*kTransform);
+ // Apply frame transform
+ TGeoHMatrix newTransform
+ = ConvertTransform(*(detElement->GetLocalTransformation()));
+
+ envelope->SetTransform(newTransform);
+
return true;
}
Bool_t isVirtual,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
- if (fDebug) {
- cout << "... Adding ";
- if (!isVirtual) cout << " non-";
- cout << "virtual envelope " << name
- << " id " << id << endl;
- }
+ if (!isVirtual) AliDebug(1,Form("Adding non-virtual envelope %s id %d",name.Data(),id));
+// else AliDebug(1,Form("Adding virtual envelope %s id %d",name.Data(),id));
AliMUONGeometryEnvelope* envelope
= new AliMUONGeometryEnvelope(name, id, isVirtual, only);
const TGeoTranslation& translation,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding ";
const TGeoRotation& rotation,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding ";
const TGeoCombiTrans& transform,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding ";
Int_t copyNo,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding "
const TGeoTranslation& translation,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding "
const TGeoRotation& rotation,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding "
const TGeoCombiTrans& transform,
const char* only)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding "
void AliMUONGeometryEnvelopeStore::AddEnvelopeConstituent(const TString& name,
const TString& envName, Int_t copyNo)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding constituent " << name
const TString& envName, Int_t copyNo,
const TGeoTranslation& translation)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding constituent " << name
const TGeoTranslation& translation,
const TGeoRotation& rotation)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding constituent " << name
const TString& envName, Int_t copyNo,
const TGeoCombiTrans& transform)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding constituent " << name
const TString& envName, Int_t copyNo,
Int_t npar, Double_t* param)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding parameterised constituent " << name
const TGeoTranslation& translation,
Int_t npar, Double_t* param)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding parameterised constituent " << name
const TGeoRotation& rotation,
Int_t npar, Double_t* param)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding parameterised constituent " << name
const TGeoCombiTrans& transform,
Int_t npar, Double_t* param)
{
-// Adds the volume with the specified name and transformation
-// to the list of envelopes.
-// ---
+/// Add the volume with the specified name and transformation
+/// to the list of envelopes.
if (fDebug) {
cout << "... Adding parameterised constituent " << name
envelope->AddConstituentParam(name, copyNo, transform, npar, param);
}
+//______________________________________________________________________________
+Int_t AliMUONGeometryEnvelopeStore::GetNofDetElements() const
+{
+/// Return the number od envelopes with detElemId>0.
+
+ Int_t nofDetElems = 0;
+
+ for(Int_t i=0; i<fEnvelopes->GetEntriesFast(); i++)
+ if ( fEnvelopes->At(i)->GetUniqueID() > 0 ) nofDetElems++;
+
+ return nofDetElems;
+}