]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONGeometrySegmentation.cxx
12-sep-2006 NvE Memberfunctions GetNslots and AddNamedSlot introduced and various
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometrySegmentation.cxx
index 166b3e1006d53b16ec3472a6736ca24bf0930a37..fbf897cecade1d9ce049d3a66b4f677b90c93b54 100644 (file)
 
 /* $Id$ */
 
-#include <Riostream.h>
-
-#include "AliLog.h"
-
 #include "AliMUONGeometrySegmentation.h"
 #include "AliMUONVGeometryDESegmentation.h"
-#include "AliMUONGeometryModule.h"
+#include "AliMUONGeometryModuleTransformer.h"
 #include "AliMUONGeometryDetElement.h"
 #include "AliMUONGeometryStore.h"
 
+#include "AliLog.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)
   
 {
-// 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) ); 
 }
 
 //______________________________________________________________________________
@@ -60,73 +69,55 @@ AliMUONGeometrySegmentation::AliMUONGeometrySegmentation()
   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));
 }
 
 //______________________________________________________________________________
-AliMUONGeometrySegmentation::AliMUONGeometrySegmentation(
-                                  const AliMUONGeometrySegmentation& rhs) 
-  : TObject(rhs)
+AliMUONGeometrySegmentation::~AliMUONGeometrySegmentation() 
 {
-// Copy constructor
-  AliFatal("Copy constructor is not implemented.");
-}
+/// Destructor
 
-//______________________________________________________________________________
-AliMUONGeometrySegmentation::~AliMUONGeometrySegmentation() {
-// Destructor
+  AliDebug(1, Form("dtor this = %p", this));
 
   delete fDESegmentations;
+  delete fDENames;
 } 
 
-//
-// operators
-//
-
-//______________________________________________________________________________
-AliMUONGeometrySegmentation& 
-AliMUONGeometrySegmentation::operator=(const AliMUONGeometrySegmentation& rhs)
-{
-// Copy operator 
-
-  // check assignement to self
-  if (this == &rhs) return *this;
-
-  AliFatal("Assignment operator is not implemented.");
-    
-  return *this;  
-}
-
 //
 // private methods
 //
 
 //______________________________________________________________________________
-Bool_t AliMUONGeometrySegmentation::Notify(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;                 
     }
   
@@ -143,32 +134,71 @@ Bool_t AliMUONGeometrySegmentation::Notify(Int_t detElemId) const
 //
 
 //______________________________________________________________________________
-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, Bool_t warn) const
+{
+/// Return the DE segmentation 
+
+  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 (!Notify(detElemId)) return kDirUndefined;
+  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
+{
+/// Print DE segmentations
+
+  std::cout << "fDESegmentations (class " 
+           << fDESegmentations->Class()->GetName() << ") entries=" 
+           << fDESegmentations->GetNofEntries() 
+           << std::endl;
+  fDESegmentations->Print(opt);        
+}
+
 //______________________________________________________________________________
 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
@@ -180,8 +210,7 @@ void AliMUONGeometrySegmentation::SetPadSize(Float_t p1, Float_t p2)
 //______________________________________________________________________________
 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
@@ -193,13 +222,12 @@ void AliMUONGeometrySegmentation::SetDAnod(Float_t d)
 //______________________________________________________________________________
 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 (!Notify(detElemId)) return 0;
+  if (!OwnNotify(detElemId)) return 0;
 
   return fCurrentSegmentation->GetAnod(xhit);
 }
@@ -209,11 +237,10 @@ Bool_t  AliMUONGeometrySegmentation::GetPadI(Int_t detElemId,
                                         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)
-// ---
-
-  if (!Notify(detElemId)) return false;
+/// Return pad coordinates (ix,iy) for given real coordinates (x,y)
 
+  if (!OwnNotify(detElemId)) return false;
+  
   Float_t xl, yl, zl;
   fCurrentDetElement->Global2Local(xg, yg, zg, xl, yl, zl); 
 
@@ -222,36 +249,63 @@ Bool_t  AliMUONGeometrySegmentation::GetPadI(Int_t detElemId,
   fCurrentSegmentation->GetPadI(xl, yl, zl, ix, iy);
   return true;
 }
-              
+
+//______________________________________________________________________________
+Bool_t
+AliMUONGeometrySegmentation::HasPad(Int_t detElemId, Int_t ix, Int_t iy)
+{
+/// Tell if a given pad exists in a given detector element
+
+  if (!OwnNotify(detElemId)) return false;
+       
+  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 (!Notify(detElemId)) return false;
+  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;
 }
 
-
 //______________________________________________________________________________
 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++) {
 
@@ -273,10 +327,9 @@ void AliMUONGeometrySegmentation::Init(Int_t chamber)
 //______________________________________________________________________________
 Float_t AliMUONGeometrySegmentation::Dpx(Int_t detElemId) const
 {
-// Get pad size in x
-// ---
+/// Get pad size in x
 
-  if (!Notify(detElemId)) return 0.;
+  if (!OwnNotify(detElemId)) return 0.;
   
   return fCurrentSegmentation->Dpx();
 }
@@ -284,10 +337,9 @@ Float_t AliMUONGeometrySegmentation::Dpx(Int_t detElemId) const
 //______________________________________________________________________________
 Float_t AliMUONGeometrySegmentation::Dpy(Int_t detElemId) const
 {
-// Get pad size in y
-// ---
+/// Get pad size in y
 
-  if (!Notify(detElemId)) return 0.;
+  if (!OwnNotify(detElemId)) return 0.;
 
   return fCurrentSegmentation->Dpy();
 }
@@ -295,10 +347,9 @@ Float_t AliMUONGeometrySegmentation::Dpy(Int_t detElemId) const
 //______________________________________________________________________________
 Float_t AliMUONGeometrySegmentation::Dpx(Int_t detElemId, Int_t isector) const
 {
-// Pad size in x by sector
-// ---
+/// Pad size in x by sector
 
-  if (!Notify(detElemId)) return 0.;
+  if (!OwnNotify(detElemId)) return 0.;
 
   return fCurrentSegmentation->Dpx(isector);
 } 
@@ -306,10 +357,9 @@ Float_t AliMUONGeometrySegmentation::Dpx(Int_t detElemId, Int_t isector) const
 //______________________________________________________________________________
 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 (!Notify(detElemId)) return 0.;
+  if (!OwnNotify(detElemId)) return 0.;
 
   return fCurrentSegmentation->Dpy(isector);
 }
@@ -317,10 +367,9 @@ Float_t AliMUONGeometrySegmentation::Dpy(Int_t detElemId, Int_t isector) const
 //______________________________________________________________________________
 Int_t AliMUONGeometrySegmentation::Npx(Int_t detElemId) const
 {
-// Maximum number of Pads in x
-// ---
+/// Maximum number of Pads in x
 
-  if (!Notify(detElemId)) return 0;
+  if (!OwnNotify(detElemId)) return 0;
 
   return fCurrentSegmentation->Npx();
 }
@@ -328,10 +377,9 @@ Int_t AliMUONGeometrySegmentation::Npx(Int_t detElemId) const
 //______________________________________________________________________________
 Int_t AliMUONGeometrySegmentation::Npy(Int_t detElemId) const
 {
-// Maximum number of Pads in y
-// ---
+/// Maximum number of Pads in y
 
-  if (!Notify(detElemId)) return 0;
+  if (!OwnNotify(detElemId)) return 0;
 
   return fCurrentSegmentation->Npy();
 }
@@ -339,13 +387,12 @@ Int_t AliMUONGeometrySegmentation::Npy(Int_t detElemId) const
 //______________________________________________________________________________
 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 (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   fCurrentSegmentation->SetPad(ix, iy);
 }
@@ -354,12 +401,12 @@ void  AliMUONGeometrySegmentation::SetPad(Int_t detElemId, Int_t ix, Int_t iy)
 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 (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   Float_t xl, yl, zl;
   fCurrentDetElement->Global2Local(xghit, yghit, zghit, xl, yl, zl); 
@@ -372,11 +419,13 @@ void  AliMUONGeometrySegmentation::FirstPad(Int_t detElemId,
                                         Float_t xghit, Float_t yghit, Float_t zghit, 
                                         Float_t dx, Float_t dy) 
 {                                       
-// Iterate over pads - initialiser
-// ---
+/// Iterate over pads - initialiser
 
-  if (!Notify(detElemId)) return;
+  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); 
 
@@ -386,10 +435,9 @@ void  AliMUONGeometrySegmentation::FirstPad(Int_t detElemId,
 //______________________________________________________________________________
 void  AliMUONGeometrySegmentation::NextPad(Int_t detElemId)
 {
-// Iterate over pads - stepper
-// ---
+/// Iterate over pads - stepper
 
-  if (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
   
   fCurrentSegmentation->NextPad();
 }
@@ -397,10 +445,9 @@ void  AliMUONGeometrySegmentation::NextPad(Int_t detElemId)
 //______________________________________________________________________________
 Int_t AliMUONGeometrySegmentation::MorePads(Int_t detElemId)
 {
-// Iterate over pads - condition
-// ---
+/// Iterate over pads - condition
 
-  if (!Notify(detElemId)) return 0;
+  if (!OwnNotify(detElemId)) return 0;
   
   return fCurrentSegmentation->MorePads();
 }
@@ -411,11 +458,10 @@ Float_t AliMUONGeometrySegmentation::Distance2AndOffset(Int_t detElemId,
                                           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 (!Notify(detElemId)) return 0.;
+  if (!OwnNotify(detElemId)) return 0.;
 
   Float_t xl, yl, zl;
   fCurrentDetElement->Global2Local(xg, yg, zg, xl, yl, zl); 
@@ -428,12 +474,11 @@ void AliMUONGeometrySegmentation::GetNParallelAndOffset(Int_t detElemId,
                                             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 (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   fCurrentSegmentation->GetNParallelAndOffset(ix, iy, nparallel, offset);  
 }
@@ -445,10 +490,9 @@ void AliMUONGeometrySegmentation::Neighbours(Int_t detElemId,
                                            Int_t* nlist, 
                                           Int_t xlist[10], Int_t ylist[10])
 {                                        
-// Get next neighbours 
-// ---
+/// Get next neighbours 
 
-  if (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   fCurrentSegmentation->Neighbours(ix, iy, nlist, xlist, ylist);
 }
@@ -456,9 +500,8 @@ void AliMUONGeometrySegmentation::Neighbours(Int_t detElemId,
 //______________________________________________________________________________
 Int_t  AliMUONGeometrySegmentation::Ix()
 {
-// Current pad cursor during disintegration
-// x, y-coordinate
-// ---
+/// Current pad cursor during disintegration
+/// x, y-coordinate
 
   return fCurrentSegmentation->Ix();
 }
@@ -466,9 +509,8 @@ Int_t  AliMUONGeometrySegmentation::Ix()
 //______________________________________________________________________________
 Int_t  AliMUONGeometrySegmentation::Iy()
 {
-// Current pad cursor during disintegration
-// x, y-coordinate
-// ---
+/// Current pad cursor during disintegration
+/// x, y-coordinate
 
   return fCurrentSegmentation->Iy();
 }
@@ -476,9 +518,8 @@ Int_t  AliMUONGeometrySegmentation::Iy()
 //______________________________________________________________________________
 Int_t  AliMUONGeometrySegmentation::DetElemId()
 {
-// Current pad cursor during disintegration
-// x, y-coordinate
-// ---
+/// Current pad cursor during disintegration
+/// x, y-coordinate
 
   return fCurrentDetElemId;
 }
@@ -486,8 +527,7 @@ Int_t  AliMUONGeometrySegmentation::DetElemId()
 //______________________________________________________________________________
 Int_t  AliMUONGeometrySegmentation::ISector()
 {
-// Current sector
-// ---
+/// Current sector
 
   return fCurrentSegmentation->ISector();
 }
@@ -495,10 +535,9 @@ Int_t  AliMUONGeometrySegmentation::ISector()
 //______________________________________________________________________________
 Int_t AliMUONGeometrySegmentation::Sector(Int_t detElemId, Int_t ix, Int_t iy)
 {
-// Calculate sector from pad coordinates
-// ---
+/// Calculate sector from pad indices
 
-  if (!Notify(detElemId)) return 0;
+  if (!OwnNotify(detElemId)) return 0;
 
   return fCurrentSegmentation->Sector(ix, iy);
 }
@@ -507,10 +546,9 @@ Int_t AliMUONGeometrySegmentation::Sector(Int_t detElemId, Int_t ix, Int_t iy)
 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 (!Notify(detElemId)) return 0;
+  if (!OwnNotify(detElemId)) return 0;
 
   Float_t xl, yl, zl;
   fCurrentDetElement->Global2Local(xg, yg, zg, xl, yl, zl); 
@@ -523,10 +561,9 @@ void  AliMUONGeometrySegmentation::IntegrationLimits(Int_t detElemId,
                                         Float_t& x1, Float_t& x2,
                                         Float_t& y1, Float_t& y2)
 {                                                
-// Current integration limits 
-// ---
+/// Current integration limits 
  
-  if (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   fCurrentSegmentation->IntegrationLimits(x1, x2, y1, y2);
 }
@@ -535,21 +572,20 @@ void  AliMUONGeometrySegmentation::IntegrationLimits(Int_t detElemId,
 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. 
-// ---
-
-  if (!Notify(detElemId)) return 0;
+/// 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;
 
   Float_t xl, yl, zl;
   fCurrentDetElement->Global2Local(xg, yg, zg, xl, yl, zl); 
@@ -561,12 +597,11 @@ Int_t AliMUONGeometrySegmentation::SigGenCond(Int_t detElemId,
 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 (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   Float_t xl, yl, zl;
   fCurrentDetElement->Global2Local(xg, yg, zg, xl, yl, zl); 
@@ -587,11 +622,10 @@ void AliMUONGeometrySegmentation::GiveTestPoints(Int_t /*detElemId*/,
                                        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
@@ -599,13 +633,23 @@ void AliMUONGeometrySegmentation::GiveTestPoints(Int_t /*detElemId*/,
 }
 
 //______________________________________________________________________________
-void AliMUONGeometrySegmentation::Draw(Int_t detElemId, const char* opt) const
+void AliMUONGeometrySegmentation::Draw(const char* opt)
+{
+/// Draw the segmentation zones for all detElemId 
+
+  for (Int_t i=0; i<fDESegmentations->GetNofEntries(); i++) {
+     AliMUONVGeometryDESegmentation* segmentation
+       = (AliMUONVGeometryDESegmentation*)fDESegmentations->GetEntry(i);
+     segmentation->Draw(opt);
+  }   
+}
+
+//______________________________________________________________________________
+void AliMUONGeometrySegmentation::Draw(Int_t detElemId, const char* opt)
 {
-// Draw the segmentation zones.
-// (Called from AliMUON::BuildGeometry)
-// ---
+/// Draw the segmentation zones for a given detElemId.
 
-  if (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   fCurrentSegmentation->Draw(opt);
 }
@@ -614,11 +658,10 @@ void AliMUONGeometrySegmentation::Draw(Int_t detElemId, const char* opt) const
 void AliMUONGeometrySegmentation::SetCorrFunc(Int_t detElemId, 
                                               Int_t isec, TF1* func)
 {
-// Set the correction function.
-// From AliMUONGeometrySegmentationV01
-// ---
+/// Set the correction function.
+/// From AliMUONGeometrySegmentationV01
 
-  if (!Notify(detElemId)) return;
+  if (!OwnNotify(detElemId)) return;
 
   fCurrentSegmentation->SetCorrFunc(isec, func);
 }
@@ -626,11 +669,10 @@ void AliMUONGeometrySegmentation::SetCorrFunc(Int_t detElemId,
 //______________________________________________________________________________
 TF1* AliMUONGeometrySegmentation::CorrFunc(Int_t detElemId, Int_t isec) const
 {
-// Get the correction Function.
-// From AliMUONGeometrySegmentationV01
-// ---
+/// Get the correction Function.
+/// From AliMUONGeometrySegmentationV01
 
-  if (!Notify(detElemId)) return 0;
+  if (!OwnNotify(detElemId)) return 0;
 
   return  fCurrentSegmentation->CorrFunc(isec);
 }