* provided "as is" without express or implied warranty. *
**************************************************************************/
+/* $Id$ */
+
//
// Class AliMUONGeometrySegmentation
// -------------------------------
//
// Author:Ivana Hrivnacova, IPN Orsay
-/* $Id$ */
+#include "AliMUONGeometrySegmentation.h"
+#include "AliMUONVGeometryDESegmentation.h"
+#include "AliMUONGeometryModuleTransformer.h"
+#include "AliMUONGeometryDetElement.h"
-#include <Riostream.h>
-#include "TClass.h"
+#include "AliMpExMap.h"
#include "AliLog.h"
-#include "AliMUONGeometrySegmentation.h"
-#include "AliMUONVGeometryDESegmentation.h"
-#include "AliMUONGeometryModule.h"
-#include "AliMUONGeometryDetElement.h"
-#include "AliMUONGeometryStore.h"
-#include "AliMUONSegmentManuIndex.h"
+#include <Riostream.h>
+#include <TObjString.h>
+#include <TClass.h>
+
+const Float_t AliMUONGeometrySegmentation::fgkMaxDistance = 1.0e6;
+/// \cond CLASSIMP
ClassImp(AliMUONGeometrySegmentation)
+/// \endcond
//______________________________________________________________________________
AliMUONGeometrySegmentation::AliMUONGeometrySegmentation(
- AliMUONGeometryModule* geometry)
+ const AliMUONGeometryModuleTransformer* transformer)
: TObject(),
fCurrentDetElemId(0),
fCurrentDetElement(0),
fCurrentSegmentation(0),
- fGeometryModule(geometry),
- fDESegmentations(0)
+ fkModuleTransformer(transformer),
+ fDESegmentations(0),
+ fDENames(0)
{
/// Standard constructor
- fDESegmentations
- = new AliMUONGeometryStore(geometry->GetDEIndexing(), false);
+ fDESegmentations = new AliMpExMap(true);
+ fDESegmentations->SetOwner(false);
+
+ fDENames = new AliMpExMap(true);
+
+ AliDebug(1, Form("ctor this = %p", this) );
}
//______________________________________________________________________________
fCurrentDetElemId(0),
fCurrentDetElement(0),
fCurrentSegmentation(0),
- fGeometryModule(0),
- fDESegmentations(0)
+ fkModuleTransformer(0),
+ fDESegmentations(0),
+ fDENames(0)
+
{
/// Default Constructor
-}
-//______________________________________________________________________________
-AliMUONGeometrySegmentation::AliMUONGeometrySegmentation(
- const AliMUONGeometrySegmentation& rhs)
- : TObject(rhs)
-{
-/// Protected copy constructor
-
- AliFatal("Copy constructor is not implemented.");
+ AliDebug(1, Form("default (empty) ctor this = %p", this));
}
//______________________________________________________________________________
{
/// Destructor
+ AliDebug(1, Form("dtor this = %p", this));
+
delete fDESegmentations;
+ delete fDENames;
}
-//
-// operators
-//
-
-//______________________________________________________________________________
-AliMUONGeometrySegmentation&
-AliMUONGeometrySegmentation::operator=(const AliMUONGeometrySegmentation& rhs)
-{
-/// Protected assignment operator
-
- // check assignement to self
- if (this == &rhs) return *this;
-
- AliFatal("Assignment operator is not implemented.");
-
- return *this;
-}
-
//
// private methods
//
//______________________________________________________________________________
-Bool_t AliMUONGeometrySegmentation::OwnNotify(Int_t detElemId) const
+Bool_t AliMUONGeometrySegmentation::OwnNotify(Int_t detElemId, Bool_t warn) const
{
/// Update current detection element and segmentation,
/// and checks if they exist.
// Find detection element and its segmentation
AliMUONGeometryDetElement* detElement
- = fGeometryModule->GetDetElement(detElemId);
+ = fkModuleTransformer->GetDetElement(detElemId, warn);
if (!detElement) {
- AliError(Form("Detection element %d not defined", detElemId));
+ if (warn)
+ AliError(Form("Detection element %d not defined", detElemId));
return false;
}
AliMUONVGeometryDESegmentation* segmentation
- = (AliMUONVGeometryDESegmentation*) fDESegmentations->Get(detElemId);
+ = (AliMUONVGeometryDESegmentation*) fDESegmentations->GetValue(detElemId);
if (!segmentation) {
- AliError(Form("Segmentation for detection element %d not defined",
- detElemId));
+ if (warn)
+ AliError(Form("Segmentation for detection element %d not defined",
+ detElemId));
return false;
}
//
//______________________________________________________________________________
-void AliMUONGeometrySegmentation::Add(Int_t detElemId,
+void AliMUONGeometrySegmentation::Add(Int_t detElemId, const TString& detElemName,
AliMUONVGeometryDESegmentation* segmentation)
{
/// Add detection element segmentation
fDESegmentations->Add(detElemId, segmentation);
+ fDENames->Add(detElemId, new TObjString(detElemName));
}
//______________________________________________________________________________
const AliMUONVGeometryDESegmentation*
-AliMUONGeometrySegmentation::GetDESegmentation(Int_t detElemId) const
+AliMUONGeometrySegmentation::GetDESegmentation(Int_t detElemId, Bool_t warn) const
{
/// Return the DE segmentation
- if (!OwnNotify(detElemId)) return 0;
+ if (!OwnNotify(detElemId, warn)) return 0;
return fCurrentSegmentation;
}
AliMUONGeometryDirection
AliMUONGeometrySegmentation::GetDirection(Int_t detElemId) const
{
-/// Return direction with a constant pad size
+/// Return direction with a constant pad size.
/// (Direction or coordinate where the resolution is the best)
if (!OwnNotify(detElemId)) return kDirUndefined;
return fCurrentSegmentation->GetDirection();
}
+//______________________________________________________________________________
+TString AliMUONGeometrySegmentation::GetDEName(Int_t detElemId) const
+{
+/// Return name of the given detection element
+
+ TObjString* deName = (TObjString*)fDENames->GetValue(detElemId);
+
+ if (deName)
+ return deName->GetString();
+ else {
+ AliWarningStream()
+ << "Detection element " << detElemId << " not defined. " << endl;
+ return "Undefined";
+ }
+}
+
//______________________________________________________________________________
void AliMUONGeometrySegmentation::Print(Option_t* opt) const
{
-// Print DE segmentations
+/// Print DE segmentations
std::cout << "fDESegmentations (class "
<< fDESegmentations->Class()->GetName() << ") entries="
- << fDESegmentations->GetNofEntries()
+ << fDESegmentations->GetSize()
<< std::endl;
fDESegmentations->Print(opt);
}
{
/// Set pad size Dx*Dy to all detection element segmentations
- for (Int_t i=0; i<fDESegmentations->GetNofEntries(); i++) {
+ for (Int_t i=0; i<fDESegmentations->GetSize(); i++) {
AliMUONVGeometryDESegmentation* segmentation
- = (AliMUONVGeometryDESegmentation*)fDESegmentations->GetEntry(i);
+ = (AliMUONVGeometryDESegmentation*)fDESegmentations->GetObject(i);
segmentation->SetPadSize(p1, p2);
}
}
{
/// Set anod pitch to all detection element segmentations
- for (Int_t i=0; i<fDESegmentations->GetNofEntries(); i++) {
+ for (Int_t i=0; i<fDESegmentations->GetSize(); i++) {
AliMUONVGeometryDESegmentation* segmentation
- = (AliMUONVGeometryDESegmentation*)fDESegmentations->GetEntry(i);
+ = (AliMUONVGeometryDESegmentation*)fDESegmentations->GetObject(i);
segmentation->SetDAnod(d);
}
}
Bool_t
AliMUONGeometrySegmentation::HasPad(Int_t detElemId, Int_t ix, Int_t iy)
{
-// Tells if a given pad exists in a given detector element
+/// Tell if a given pad exists in a given detector element
- if (!OwnNotify(detElemId) ) return false;
+ if (!OwnNotify(detElemId)) return false;
- return fCurrentSegmentation->HasPad(ix,iy);
+ return fCurrentSegmentation->HasPad(ix,iy);
}
//______________________________________________________________________________
-Bool_t AliMUONGeometrySegmentation::GetPadC(Int_t detElemId,
- Int_t ix, Int_t iy,
- Float_t& xg, Float_t& yg, Float_t& zg)
-{
-/// Transform from pad to real coordinates
+Bool_t
+AliMUONGeometrySegmentation::HasPad(Int_t detElemId,
+ Float_t xg, Float_t yg, Float_t zg)
+{
+/// Tell if a given pad exists in a given detector element
if (!OwnNotify(detElemId)) return false;
+
+ Float_t xl, yl, zl;
+ fCurrentDetElement->Global2Local(xg, yg, zg, xl, yl, zl);
- if (!fCurrentSegmentation->HasPad(ix, iy)) return false;
+ return fCurrentSegmentation->HasPad(xl, yl, zl);
+}
+
+//______________________________________________________________________________
+Bool_t
+AliMUONGeometrySegmentation::GetPadC(Int_t detElemId,
+ Int_t ix, Int_t iy,
+ Float_t& xg, Float_t& yg, Float_t& zg)
+{
+/// Transform from pad to real coordinates
+ if (!OwnNotify(detElemId)) return false;
+
+ if (!fCurrentSegmentation->HasPad(ix, iy)) {
+ xg = yg = zg = fgkMaxDistance;
+ return false;
+ }
+
Float_t xl, yl, zl;
fCurrentSegmentation->GetPadC(ix, iy, xl , yl, zl);
- fGeometryModule->Local2Global(detElemId, xl, yl, zl, xg, yg, zg);
+ fkModuleTransformer->Local2Global(detElemId, xl, yl, zl, xg, yg, zg);
return true;
}
/// Check that all detection elements have segmanetation set
// Loop over detection elements
- AliMUONGeometryStore* detElements = fGeometryModule->GetDetElementStore();
+ AliMpExMap* detElements = fkModuleTransformer->GetDetElementStore();
- for (Int_t i=0; i<detElements->GetNofEntries(); i++) {
+ for (Int_t i=0; i<detElements->GetSize(); i++) {
+
+ // Skip not filled entries
+ if (!detElements->GetObject(i)) continue;
// Get detction element Id
- Int_t detElemId = detElements->GetEntry(i)->GetUniqueID();
+ Int_t detElemId = detElements->GetObject(i)->GetUniqueID();
// Check segmentation
- if (! fDESegmentations->Get(detElemId) ) {
- AliError(Form("Detection element %d has not a segmentation set.",
- detElements->GetEntry(i)->GetUniqueID()));
+ if (! fDESegmentations->GetValue(detElemId) ) {
+ AliErrorStream()
+ << "Detection element " << detElemId << " has not a segmentation set."
+ << endl;
}
else {
// Initialize DE Segmentation
- ((AliSegmentation*)fDESegmentations->Get(detElemId))->Init(chamber);
+ ((AliSegmentation*)fDESegmentations->GetValue(detElemId))->Init(chamber);
}
}
}
//______________________________________________________________________________
Float_t AliMUONGeometrySegmentation::Dpy(Int_t detElemId, Int_t isector) const
{
-/// Pad size in x, y by Sector
+/// Pad size in y by Sector
if (!OwnNotify(detElemId)) return 0.;
void AliMUONGeometrySegmentation::SetHit(Int_t detElemId,
Float_t xghit, Float_t yghit, Float_t zghit)
{
-/// Set hit position
+/// Set hit position.
/// Sets virtual hit position, needed for evaluating pad response
/// outside the tracking program
/// From AliMUONGeometrySegmentationV01.
if (!OwnNotify(detElemId)) return;
+ AliDebug(1,Form("xghit, yghit, zghit, dx, dy = %e,%e,%e,%e, %e",
+ xghit, yghit, zghit, dx, dy));
+
Float_t xl, yl, zl;
fCurrentDetElement->Global2Local(xghit, yghit, zghit, xl, yl, zl);
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::Sector(Int_t detElemId, Int_t ix, Int_t iy)
{
-/// Calculate sector from pad coordinates
+/// Calculate sector from pad indices
if (!OwnNotify(detElemId)) return 0;
{
/// Draw the segmentation zones for all detElemId
- for (Int_t i=0; i<fDESegmentations->GetNofEntries(); i++) {
+ for (Int_t i=0; i<fDESegmentations->GetSize(); i++) {
AliMUONVGeometryDESegmentation* segmentation
- = (AliMUONVGeometryDESegmentation*)fDESegmentations->GetEntry(i);
+ = (AliMUONVGeometryDESegmentation*)fDESegmentations->GetObject(i);
segmentation->Draw(opt);
}
}