/* $Id$ */
-#include <Riostream.h>
-#include "TClass.h"
-
-#include "AliLog.h"
-
#include "AliMUONGeometrySegmentation.h"
#include "AliMUONVGeometryDESegmentation.h"
-#include "AliMUONGeometryModule.h"
+#include "AliMUONGeometryModuleTransformer.h"
#include "AliMUONGeometryDetElement.h"
#include "AliMUONGeometryStore.h"
-#include "AliMUONSegmentManuIndex.h"
+
+#include "AliLog.h"
+
+#include <Riostream.h>
+#include <TObjString.h>
+#include <TClass.h>
ClassImp(AliMUONGeometrySegmentation)
+const Float_t AliMUONGeometrySegmentation::fgkMaxDistance = 1.0e6;
+
//______________________________________________________________________________
AliMUONGeometrySegmentation::AliMUONGeometrySegmentation(
- AliMUONGeometryModule* geometry)
+ const AliMUONGeometryModuleTransformer* transformer)
: TObject(),
fCurrentDetElemId(0),
fCurrentDetElement(0),
fCurrentSegmentation(0),
- fGeometryModule(geometry),
- fDESegmentations(0)
+ fkModuleTransformer(transformer),
+ fDESegmentations(0),
+ fDENames(0)
{
-// Normal constructor
+/// Standard constructor
+
+ fDESegmentations = new AliMUONGeometryStore(false);
+
+ fDENames = new AliMUONGeometryStore(true);
- fDESegmentations
- = new AliMUONGeometryStore(geometry->GetDEIndexing(), false);
+ 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
+/// Default Constructor
+
+ AliDebug(1, Form("default (empty) ctor this = %p", this));
}
//______________________________________________________________________________
const AliMUONGeometrySegmentation& rhs)
: TObject(rhs)
{
-// Copy constructor
+/// Protected copy constructor
+
AliFatal("Copy constructor is not implemented.");
}
+#include <Riostream.h>
//______________________________________________________________________________
-AliMUONGeometrySegmentation::~AliMUONGeometrySegmentation() {
-// Destructor
+AliMUONGeometrySegmentation::~AliMUONGeometrySegmentation()
+{
+/// Destructor
+
+ AliDebug(1, Form("dtor this = %p", this));
delete fDESegmentations;
+ delete fDENames;
}
//
AliMUONGeometrySegmentation&
AliMUONGeometrySegmentation::operator=(const AliMUONGeometrySegmentation& rhs)
{
-// Copy operator
+/// Protected assignment operator
// check assignement to self
if (this == &rhs) return *this;
//
//______________________________________________________________________________
-Bool_t AliMUONGeometrySegmentation::OwnNotify(Int_t detElemId) const
+Bool_t AliMUONGeometrySegmentation::OwnNotify(Int_t detElemId, Bool_t warn) const
{
-// Updates current detection element and segmentation,
-// and checks if they exist.
-// Returns true if success.
-// ---
+/// Update current detection element and segmentation,
+/// and checks if they exist.
+/// Return true if success.
if (detElemId != fCurrentDetElemId) {
// 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->Get(detElemId, warn);
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
-// ---
+/// 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
+/// 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
-// (Direction or coordinate where the resolution is the best)
+/// 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->Get(detElemId, false);
+
+ if (deName)
+ return deName->GetString();
+ else {
+ AliWarningStream()
+ << "Detection element " << detElemId << " not defined. " << endl;
+ return "Undefined";
+ }
+}
+
//______________________________________________________________________________
void AliMUONGeometrySegmentation::Print(Option_t* opt) const
{
//______________________________________________________________________________
void AliMUONGeometrySegmentation::SetPadSize(Float_t p1, Float_t p2)
{
-// Set pad size Dx*Dy to all detection element segmentations
-// ---
+/// Set pad size Dx*Dy to all detection element segmentations
for (Int_t i=0; i<fDESegmentations->GetNofEntries(); i++) {
AliMUONVGeometryDESegmentation* segmentation
//______________________________________________________________________________
void AliMUONGeometrySegmentation::SetDAnod(Float_t d)
{
-// Set anod pitch to all detection element segmentations
-// ---
+/// Set anod pitch to all detection element segmentations
for (Int_t i=0; i<fDESegmentations->GetNofEntries(); i++) {
AliMUONVGeometryDESegmentation* segmentation
//______________________________________________________________________________
Float_t AliMUONGeometrySegmentation::GetAnod(Int_t detElemId, Float_t xhit) const
{
-// Anod wire coordinate closest to xhit
-// Returns for a hit position xhit the position of the nearest anode wire
-// !!! xhit is understand a a distance, not as a position in the space
-// CHECK
-// ---
+/// Anod wire coordinate closest to xhit
+/// Returns for a hit position xhit the position of the nearest anode wire
+/// !!! xhit is understand a a distance, not as a position in the space
+/// CHECK
if (!OwnNotify(detElemId)) return 0;
Float_t xg, Float_t yg, Float_t zg,
Int_t& ix, Int_t& iy)
{
-// Returns pad coordinates (ix,iy) for given real coordinates (x,y)
-// ---
+/// Return pad coordinates (ix,iy) for given real coordinates (x,y)
if (!OwnNotify(detElemId)) return false;
{
// Tells 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)
+{
+// Tells if a given pad exists in a given detector element
if (!OwnNotify(detElemId)) return false;
-
- if (!fCurrentSegmentation->HasPad(ix, iy)) return false;
-
+
Float_t xl, yl, zl;
- fCurrentSegmentation->GetPadC(ix, iy, xl , yl, zl);
+ fCurrentDetElement->Global2Local(xg, yg, zg, xl, yl, zl);
- fGeometryModule->Local2Global(detElemId, xl, yl, zl, xg, yg, zg);
- return true;
+ return fCurrentSegmentation->HasPad(xl, yl, zl);
}
-
+
//______________________________________________________________________________
-Bool_t AliMUONGeometrySegmentation::GetPadE(Int_t detElemId,
- Int_t &ix, Int_t &iy,
- AliMUONSegmentManuIndex* connect)
-{
-// Get pads for a given electronic connection
-// ---
+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);
- if (!fCurrentSegmentation->HasPad(ix, iy)) return false;
-
- fCurrentSegmentation->GetPadE(ix, iy, connect);
+ fkModuleTransformer->Local2Global(detElemId, xl, yl, zl, xg, yg, zg);
return true;
}
-//______________________________________________________________________________
-AliMUONSegmentManuIndex* AliMUONGeometrySegmentation:: GetMpConnection(Int_t detElemId,
- Int_t ix, Int_t iy)
-{
-// Get electronic connection for given pads
-// ---
-
- if (!OwnNotify(detElemId)) return 0x0;
-
- AliMUONSegmentManuIndex* connect;
-
- connect = fCurrentSegmentation->GetMpConnection(ix, iy);
- if (connect == 0x0) return 0x0;
-
- Int_t busPatchId = connect->GetBusPatchId();
-
- Int_t dBusPatch = 0;
- // not very clean way, to be changed (Ch.F.)
-
- if (detElemId/100 > 4 && detElemId/100 < 11)
- dBusPatch = 4;
- else if (detElemId/100 < 5)
- dBusPatch = 25;
-
- if (detElemId % 100 < 50)
- busPatchId+= (detElemId/100 - 1)*100 + (detElemId % 100)*dBusPatch;
- else
- busPatchId+= (detElemId/100 - 1)*100 + ((detElemId-50) % 100)*dBusPatch + 50;
-
- connect->SetBusPatchId(busPatchId);
- return connect;
-}
-
-
//______________________________________________________________________________
void AliMUONGeometrySegmentation::Init(Int_t chamber)
{
-// Initialize segmentation.
-// Check that all detection elements have segmanetation set
-// ---
+/// Initialize segmentation.
+/// Check that all detection elements have segmanetation set
// Loop over detection elements
- AliMUONGeometryStore* detElements = fGeometryModule->GetDetElementStore();
+ AliMUONGeometryStore* detElements = fkModuleTransformer->GetDetElementStore();
for (Int_t i=0; i<detElements->GetNofEntries(); i++) {
//______________________________________________________________________________
Float_t AliMUONGeometrySegmentation::Dpx(Int_t detElemId) const
{
-// Get pad size in x
-// ---
+/// Get pad size in x
if (!OwnNotify(detElemId)) return 0.;
//______________________________________________________________________________
Float_t AliMUONGeometrySegmentation::Dpy(Int_t detElemId) const
{
-// Get pad size in y
-// ---
+/// Get pad size in y
if (!OwnNotify(detElemId)) return 0.;
//______________________________________________________________________________
Float_t AliMUONGeometrySegmentation::Dpx(Int_t detElemId, Int_t isector) const
{
-// Pad size in x by sector
-// ---
+/// Pad size in x by sector
if (!OwnNotify(detElemId)) return 0.;
//______________________________________________________________________________
Float_t AliMUONGeometrySegmentation::Dpy(Int_t detElemId, Int_t isector) const
{
-// Pad size in x, y by Sector
-// ---
+/// Pad size in x, y by Sector
if (!OwnNotify(detElemId)) return 0.;
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::Npx(Int_t detElemId) const
{
-// Maximum number of Pads in x
-// ---
+/// Maximum number of Pads in x
if (!OwnNotify(detElemId)) return 0;
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::Npy(Int_t detElemId) const
{
-// Maximum number of Pads in y
-// ---
+/// Maximum number of Pads in y
if (!OwnNotify(detElemId)) return 0;
//______________________________________________________________________________
void AliMUONGeometrySegmentation::SetPad(Int_t detElemId, Int_t ix, Int_t iy)
{
-// Set pad position.
-// Sets virtual pad coordinates, needed for evaluating pad response
-// outside the tracking program.
-// From AliMUONGeometrySegmentationV01.
-// ---
+/// Set pad position.
+/// Sets virtual pad coordinates, needed for evaluating pad response
+/// outside the tracking program.
+/// From AliMUONGeometrySegmentationV01.
if (!OwnNotify(detElemId)) return;
void AliMUONGeometrySegmentation::SetHit(Int_t detElemId,
Float_t xghit, Float_t yghit, Float_t zghit)
{
-// Set hit position
-// Sets virtual hit position, needed for evaluating pad response
-// outside the tracking program
-// From AliMUONGeometrySegmentationV01.
+/// Set hit position
+/// Sets virtual hit position, needed for evaluating pad response
+/// outside the tracking program
+/// From AliMUONGeometrySegmentationV01.
if (!OwnNotify(detElemId)) return;
Float_t xghit, Float_t yghit, Float_t zghit,
Float_t dx, Float_t dy)
{
-// Iterate over pads - initialiser
-// ---
+/// Iterate over pads - initialiser
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);
//______________________________________________________________________________
void AliMUONGeometrySegmentation::NextPad(Int_t detElemId)
{
-// Iterate over pads - stepper
-// ---
+/// Iterate over pads - stepper
if (!OwnNotify(detElemId)) return;
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::MorePads(Int_t detElemId)
{
-// Iterate over pads - condition
-// ---
+/// Iterate over pads - condition
if (!OwnNotify(detElemId)) return 0;
Float_t xg, Float_t yg, Float_t zg,
Int_t* dummy)
{
-// Returns the square of the distance between 1 pad
-// labelled by its channel numbers and a coordinate
-// ---
+/// Return the square of the distance between 1 pad
+/// labelled by its channel numbers and a coordinate
if (!OwnNotify(detElemId)) return 0.;
Int_t ix, Int_t iy,
Int_t* nparallel, Int_t* offset)
{
-// Number of pads read in parallel and offset to add to x
-// (specific to LYON, but mandatory for display)
-// CHECK
-// ---
+/// Number of pads read in parallel and offset to add to x
+/// (specific to LYON, but mandatory for display)
+/// CHECK
if (!OwnNotify(detElemId)) return;
Int_t* nlist,
Int_t xlist[10], Int_t ylist[10])
{
-// Get next neighbours
-// ---
+/// Get next neighbours
if (!OwnNotify(detElemId)) return;
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::Ix()
{
-// Current pad cursor during disintegration
-// x, y-coordinate
-// ---
+/// Current pad cursor during disintegration
+/// x, y-coordinate
return fCurrentSegmentation->Ix();
}
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::Iy()
{
-// Current pad cursor during disintegration
-// x, y-coordinate
-// ---
+/// Current pad cursor during disintegration
+/// x, y-coordinate
return fCurrentSegmentation->Iy();
}
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::DetElemId()
{
-// Current pad cursor during disintegration
-// x, y-coordinate
-// ---
+/// Current pad cursor during disintegration
+/// x, y-coordinate
return fCurrentDetElemId;
}
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::ISector()
{
-// Current sector
-// ---
+/// Current sector
return fCurrentSegmentation->ISector();
}
//______________________________________________________________________________
Int_t AliMUONGeometrySegmentation::Sector(Int_t detElemId, Int_t ix, Int_t iy)
{
-// Calculate sector from pad coordinates
-// ---
+/// Calculate sector from pad coordinates
if (!OwnNotify(detElemId)) return 0;
Int_t AliMUONGeometrySegmentation::Sector(Int_t detElemId,
Float_t xg, Float_t yg, Float_t zg)
{
-// Calculate sector from pad coordinates
-// ---
+/// Calculate sector from pad coordinates
if (!OwnNotify(detElemId)) return 0;
Float_t& x1, Float_t& x2,
Float_t& y1, Float_t& y2)
{
-// Current integration limits
-// ---
+/// Current integration limits
if (!OwnNotify(detElemId)) return;
Int_t AliMUONGeometrySegmentation::SigGenCond(Int_t detElemId,
Float_t xg, Float_t yg, Float_t zg)
{
-// Signal Generation Condition during Stepping
-// 0: don't generate signal
-// 1: generate signal
-// Comments:
-//
-// Crossing of pad boundary and mid plane between neighbouring wires is checked.
-// To correctly simulate the dependence of the spatial resolution on the angle
-// of incidence signal must be generated for constant steps on
-// the projection of the trajectory along the anode wire.
-//
-// Signal will be generated if particle crosses pad boundary or
-// boundary between two wires.
-// ---
+/// Signal Generation Condition during Stepping
+/// 0: don't generate signal \n
+/// 1: generate signal \n
+/// Comments: \n
+/// \n
+/// Crossing of pad boundary and mid plane between neighbouring wires is checked.
+/// To correctly simulate the dependence of the spatial resolution on the angle
+/// of incidence signal must be generated for constant steps on
+/// the projection of the trajectory along the anode wire.
+/// \n
+/// Signal will be generated if particle crosses pad boundary or
+/// boundary between two wires.
if (!OwnNotify(detElemId)) return 0;
void AliMUONGeometrySegmentation::SigGenInit(Int_t detElemId,
Float_t xg, Float_t yg, Float_t zg)
{
-// Initialise signal generation at coord (x,y,z)
-// Initialises pad and wire position during stepping.
-// From AliMUONGeometrySegmentationV01
-// ---
+/// Initialise signal generation at coord (x,y,z)
+/// Initialise pad and wire position during stepping.
+/// From AliMUONGeometrySegmentationV01
if (!OwnNotify(detElemId)) return;
Int_t& /*n*/,
Float_t* /*xg*/, Float_t* /*yg*/) const
{
-// Test points for auto calibration
-// Returns test point on the pad plane.
-// Used during determination of the segmoid correction of the COG-method
-// From AliMUONGeometrySegmentationV01
-// ---
+/// Test points for auto calibration
+/// Return test point on the pad plane.
+/// Used during determination of the segmoid correction of the COG-method
+/// From AliMUONGeometrySegmentationV01
// Requires change of interface
// to convert points from local to global we need z coordinate
//______________________________________________________________________________
void AliMUONGeometrySegmentation::Draw(const char* opt)
{
-// Draws the segmentation zones for all detElemId
-// ---
+/// Draw the segmentation zones for all detElemId
for (Int_t i=0; i<fDESegmentations->GetNofEntries(); i++) {
AliMUONVGeometryDESegmentation* segmentation
//______________________________________________________________________________
void AliMUONGeometrySegmentation::Draw(Int_t detElemId, const char* opt)
{
-// Draw the segmentation zones for a given detElemId.
-// ---
+/// Draw the segmentation zones for a given detElemId.
if (!OwnNotify(detElemId)) return;
void AliMUONGeometrySegmentation::SetCorrFunc(Int_t detElemId,
Int_t isec, TF1* func)
{
-// Set the correction function.
-// From AliMUONGeometrySegmentationV01
-// ---
+/// Set the correction function.
+/// From AliMUONGeometrySegmentationV01
if (!OwnNotify(detElemId)) return;
//______________________________________________________________________________
TF1* AliMUONGeometrySegmentation::CorrFunc(Int_t detElemId, Int_t isec) const
{
-// Get the correction Function.
-// From AliMUONGeometrySegmentationV01
-// ---
+/// Get the correction Function.
+/// From AliMUONGeometrySegmentationV01
if (!OwnNotify(detElemId)) return 0;