+/**************************************************************************
+ * 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
// ----------------------------------
// Class for definititon of the temporary volume envelopes
// used in geometry construction
-//
// Author: Ivana Hrivnacova, IPN Orsay
-
-#include <TVirtualMC.h>
-#include <TGeoMatrix.h>
-#include <TObjArray.h>
-#include <TArrayI.h>
-#include <Riostream.h>
+//-----------------------------------------------------------------------------
#include "AliMUONGeometryEnvelopeStore.h"
-#include "AliMUONGeometryTransformStore.h"
#include "AliMUONGeometryEnvelope.h"
-#include "AliMUONConstants.h"
+#include "AliMUONGeometryDetElement.h"
+#include "AliMUONGeometryBuilder.h"
+
+#include "AliMpExMap.h"
+
#include "AliLog.h"
+#include <TGeoMatrix.h>
+#include <TObjArray.h>
+#include <Riostream.h>
+#include <TString.h>
+
+/// \cond CLASSIMP
ClassImp(AliMUONGeometryEnvelopeStore)
+/// \endcond
//______________________________________________________________________________
AliMUONGeometryEnvelopeStore::AliMUONGeometryEnvelopeStore(
- AliMUONGeometryTransformStore* transforms)
+ AliMpExMap* 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)
-{
- AliFatal("Copy constructor is not implemented.");
-}
-
//______________________________________________________________________________
AliMUONGeometryEnvelopeStore::~AliMUONGeometryEnvelopeStore()
{
-//
+/// Destructor
// Add deleting rotation matrices
}
}
-//______________________________________________________________________________
-AliMUONGeometryEnvelopeStore&
-AliMUONGeometryEnvelopeStore::operator = (const AliMUONGeometryEnvelopeStore& rhs)
-{
- // check assignement to self
- if (this == &rhs) return *this;
-
- AliFatal("Assignment operator is not implemented.");
-
- return *this;
-}
-
//
// private methods
//
+//______________________________________________________________________________
+TGeoHMatrix
+AliMUONGeometryEnvelopeStore::ConvertDETransform(const TGeoHMatrix& transform) const
+{
+/// Convert transformation into the reference frame
+
+ if ( fReferenceFrame.IsIdentity() )
+ return transform;
+ else {
+ return AliMUONGeometryBuilder::Multiply( fReferenceFrame.Inverse(),
+ transform );
+ }
+}
+
//______________________________________________________________________________
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) {
+ AliMUONGeometryDetElement* detElement
+ = (AliMUONGeometryDetElement*) fDetElements->GetValue(detElemId);
+ if (!detElement) {
AliWarning("Transformation not found.");
return false;
};
- envelope->SetTransform(*kTransform);
+ // Apply frame transform
+ TGeoHMatrix newTransform
+ = ConvertDETransform(*(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 (!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));
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
+/// as a constituent of the envelope envName.
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
+/// as a constituent of the envelope envName.
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
+/// as a constituent of the envelope envName.
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
+/// as a constituent of the envelope envName.
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
+/// as a constituent of the envelope envName.
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
+/// as a constituent of the envelope envName.
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
+/// as a constituent of the envelope envName.
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
+/// as a constituent of the envelope envName.
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;
+}