]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/mapping/AliMpSectorSegmentation.cxx
Introduced new DE names unique to each det element;
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpSectorSegmentation.cxx
index dd5b9bf336e5c0456b8d38b16289e47f8959e525..9b5c8b84db18e44052f1e7b3cc84333b5647ea1d 100755 (executable)
@@ -1,4 +1,20 @@
+/**************************************************************************
+ * 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$
+// $MpId: AliMpSectorSegmentation.cxx,v 1.15 2006/05/24 13:58:46 ivana Exp $
 // Category: sector
 //
 // Class AliMpSectorSegmentation
 //
 // Authors: David Guez, Ivana Hrivnacova; IPN Orsay
 
-#include <Riostream.h>
-#include <TMath.h>
-
 #include "AliMpSectorSegmentation.h"
 #include "AliMpSector.h"
 #include "AliMpZone.h"
+#include "AliMpSubZone.h"
 #include "AliMpRow.h"
 #include "AliMpVRowSegment.h"
 #include "AliMpMotifMap.h"
 #include "AliMpNeighboursPadIterator.h"
 #include "AliMpSectorAreaHPadIterator.h"
 #include "AliMpSectorAreaVPadIterator.h"
+#include "AliMpIntPair.h"
+#include "AliMpArea.h"
 #include "AliMpConstants.h"
 
+#include "AliLog.h"
+
+#include <Riostream.h>
+#include <TMath.h>
+
+/// \cond CLASSIMP
 ClassImp(AliMpSectorSegmentation)
+/// \endcond
+
+#ifdef WITH_ROOT
+const Double_t AliMpSectorSegmentation::fgkS1 = 100000.;
+const Double_t AliMpSectorSegmentation::fgkS2 = 1000.;
+#endif
 
 //______________________________________________________________________________
-AliMpSectorSegmentation::AliMpSectorSegmentation(const AliMpSector* sector) 
+AliMpSectorSegmentation::AliMpSectorSegmentation(
+                            const AliMpSector* sector, Bool_t own) 
   : AliMpVSegmentation(),
-    fkSector(sector)
+    fkSector(sector),
+    fIsOwner(own),
+    fPadBuffer(0),
+    fPadDimensionsMap(),
+    fMaxIndexInX(0),
+    fMaxIndexInY(0)
 {
-//
+/// Standard constructor
+
+  AliDebugStream(1) << "this = " << this << endl;
+
   fPadBuffer = new AliMpPad(AliMpPad::Invalid());
   
   FillPadDimensionsMap();
@@ -44,35 +81,84 @@ AliMpSectorSegmentation::AliMpSectorSegmentation(const AliMpSector* sector)
 AliMpSectorSegmentation::AliMpSectorSegmentation() 
   : AliMpVSegmentation(),
     fkSector(0),
+    fIsOwner(false),
     fPadBuffer(0),
-    fPadDimensionsMap()      
+    fPadDimensionsMap(),      
+    fMaxIndexInX(0),
+    fMaxIndexInY(0)
 {
-//
+/// Default constructor
+
+  AliDebugStream(1) << "this = " << this << endl;
 }
 
 //______________________________________________________________________________
-AliMpSectorSegmentation::~AliMpSectorSegmentation() {
-// 
+AliMpSectorSegmentation::~AliMpSectorSegmentation() 
+{
+/// Destructor 
+
+  AliDebugStream(1) << "this = " << this << endl;
+
+  if ( fIsOwner ) delete fkSector;
+
   delete fPadBuffer;
+  
 }
 
 //
 // private methods
 //
 
+//_____________________________________________________________________________
+void 
+AliMpSectorSegmentation::GetAllElectronicCardIDs(TArrayI& ecn) const
+{
+  GetSector()->GetAllMotifPositionsIDs(ecn);
+}
+
+#ifdef WITH_ROOT
+//______________________________________________________________________________
+Long_t AliMpSectorSegmentation::GetIndex(const TVector2& vector2) const
+{
+/// Convert the two vector to long.
+
+  return Long_t(TMath::Floor((vector2.X()*fgkS1 + vector2.Y())*fgkS2));
+}  
+
+//______________________________________________________________________________
+TVector2  AliMpSectorSegmentation::GetVector(Long_t index) const
+{
+/// Convert the long index to twovector.
+
+  return TVector2( TMath::Floor(index/fgkS1)/fgkS2,
+                   (index - TMath::Floor(index/fgkS1)*fgkS1)/fgkS2 );
+}  
+#endif
+
 //______________________________________________________________________________
 void AliMpSectorSegmentation::FillPadDimensionsMap()
 {
-// Fills the maps between zone ids and pad dimensions.
-// ---
+/// Fill the maps between zone ids and pad dimensions.
 
   for (Int_t i=0; i<fkSector->GetNofZones(); i++) {
     AliMpZone* zone   = fkSector->GetZone(i+1);
     Int_t  zoneID = zone->GetID();
     
     if (!AliMpConstants::IsEqual(zone->GetPadDimensions(), TVector2())) {
+
       // regular zone
+#ifdef WITH_STL
       fPadDimensionsMap[zoneID*10] = zone->GetPadDimensions();
+#endif
+#ifdef WITH_ROOT
+     AliDebugStream(3)
+       << "Filling fPadDimensions[" << zoneID*10 << "] = ("
+       << zone->GetPadDimensions().X() << ", "
+       << zone->GetPadDimensions().Y() << ")" << endl;
+
+     fPadDimensionsMap.Add((Long_t)(zoneID*10), 
+                            GetIndex(zone->GetPadDimensions()));
+#endif
     }
     else {
       // special zone
@@ -83,7 +169,19 @@ void AliMpSectorSegmentation::FillPadDimensionsMap()
        
        for (Int_t k=0; k<motif->GetNofPadDimensions(); k++) {
          Int_t index = zoneID*10 +  subIndex++;
+#ifdef WITH_STL
           fPadDimensionsMap[index] = motif->GetPadDimensions(k);
+#endif
+#ifdef WITH_ROOT
+          AliDebugStream(3)
+            << "Filling fPadDimensions[" << index << "] = ("
+            << motif->GetPadDimensions(k).X() << ", "
+            << motif->GetPadDimensions(k).Y() << ") motif "
+           << motif->GetID().Data() << "-" << k << endl;
+
+          fPadDimensionsMap.Add((Long_t)(index), 
+                            GetIndex(motif->GetPadDimensions(k)));
+#endif
        }
       }          
     }    
@@ -94,9 +192,8 @@ void AliMpSectorSegmentation::FillPadDimensionsMap()
 AliMpMotifPosition* 
 AliMpSectorSegmentation::FindMotifPosition(const AliMpIntPair& indices) const
 {
-// Find the motif position which contains the given pad indices
-// return 0 if not found
-// ---
+/// Find the motif position which contains the given pad indices
+/// return 0 if not found
 
   switch (fkSector->GetDirection()) {
     case kX : {
@@ -172,9 +269,8 @@ AliMpPad
 AliMpSectorSegmentation::PadByXDirection(const TVector2& startPosition, 
                                          Double_t maxX) const
 {
-// Find the first valid pad from starting position in the
-// direction of pad lines up to distance dx.
-// ---
+/// Find the first valid pad from starting position in the
+/// direction of pad lines up to distance dx.
 
   // Define step limits
   Double_t  stepX = fkSector->GetMinPadDimensions().X();
@@ -200,9 +296,8 @@ AliMpPad
 AliMpSectorSegmentation::PadByYDirection(const TVector2& startPosition, 
                                          Double_t maxY) const
 {
-// Find the first valid pad from starting position in the
-// direction of pad columns up to distance dx.
-// ---
+/// Find the first valid pad from starting position in the
+/// direction of pad columns up to distance dx.
   
   // Define step limits
   Double_t stepY = fkSector->GetMinPadDimensions().Y();
@@ -223,16 +318,6 @@ AliMpSectorSegmentation::PadByYDirection(const TVector2& startPosition,
   return pad;
 }
 
-//______________________________________________________________________________
-AliMpVPadIterator* AliMpSectorSegmentation::CreateIterator() const
-{
-// The inherited method cannot be used
-
-  Fatal("CreateIterator", "Center pad has to be specified.");
-  return 0;
-}
-  
-
 //
 // public methods
 //
@@ -241,9 +326,7 @@ AliMpVPadIterator* AliMpSectorSegmentation::CreateIterator() const
 AliMpVPadIterator* 
 AliMpSectorSegmentation::CreateIterator(const AliMpArea& area) const
 {
-// Creates the are iterator. 
-// (The inherited method cannot be used)
-// ---
+/// Create the area iterator. 
 
   switch (fkSector->GetDirection()) {
   
@@ -262,18 +345,31 @@ AliMpVPadIterator*
 AliMpSectorSegmentation::CreateIterator(const AliMpPad& centerPad,
                                         Bool_t includeCenter) const
 {
-// Creates the neighbours pad iterator.
-// (The inherited method cannot be used)
+/// Create the neighbours pad iterator.
 
   return new AliMpNeighboursPadIterator(this, centerPad, includeCenter);
 }   
   
+//______________________________________________________________________________
+TVector2
+AliMpSectorSegmentation::Dimensions() const
+{
+  return GetSector()->Dimensions();
+}
+
+//______________________________________________________________________________
+AliMpPlaneType
+AliMpSectorSegmentation::PlaneType() const
+{
+  return GetSector()->GetPlaneType();
+}
+
 //______________________________________________________________________________
 AliMpPad 
 AliMpSectorSegmentation::PadByLocation(const AliMpIntPair& location, 
                                        Bool_t warning) const
 {
-// Find the pad which corresponds to the given location
+/// Find the pad which corresponds to the given location
   
   if ((*fPadBuffer).GetLocation()==location) return (*fPadBuffer);
   
@@ -303,13 +399,14 @@ AliMpPad
 AliMpSectorSegmentation::PadByIndices(const AliMpIntPair& indices,
                                       Bool_t warning ) const
 {
-// Find the pad which corresponds to the given indices  
+/// Find the pad which corresponds to the given indices  
 
   if ((*fPadBuffer).GetIndices()==indices) return (*fPadBuffer);    
    
   AliMpMotifPosition* motifPos = FindMotifPosition(indices);
   if (!motifPos) {    
-    if (warning) Warning("PadByIndices","Pad indices not contained in any motif!");
+    if (warning) 
+      Warning("PadByIndices","Pad indices not contained in any motif!");
     return AliMpPad::Invalid();
   }
   
@@ -339,7 +436,7 @@ AliMpPad
 AliMpSectorSegmentation::PadByPosition(const TVector2& position,
                                        Bool_t warning) const
 {
-// Find the pad which corresponds to the given position
+/// Find the pad which corresponds to the given position
 
   if ((*fPadBuffer).Position().X()==position.X() && 
       (*fPadBuffer).Position().Y()==position.Y()) return (*fPadBuffer);  
@@ -379,11 +476,10 @@ AliMpPad
 AliMpSectorSegmentation::PadByDirection(const TVector2& startPosition, 
                                         Double_t distance) const
 {
-// Find the first valid pad from starting position in the
-// direction of pad lines/columns up to the specified distance.
-// Pad lines are the lines of pads in the sector with constant pad y size,
-// pad columns are the columns of pads in the sector with constant pad x size. 
-// ---
+/// Find the first valid pad from starting position in the
+/// direction of pad lines/columns up to the specified distance.
+/// Pad lines are the lines of pads in the sector with constant pad y size,
+/// pad columns are the columns of pads in the sector with constant pad x size. 
 
   switch (fkSector->GetDirection()) {
   
@@ -397,11 +493,34 @@ AliMpSectorSegmentation::PadByDirection(const TVector2& startPosition,
   return AliMpPad::Invalid();  
 }
 
+//______________________________________________________________________________
+Int_t  AliMpSectorSegmentation::MaxPadIndexX() const
+{
+/// Return maximum pad index in x
+
+  return fkSector->GetMaxPadIndices().GetFirst();
+}
+
+//______________________________________________________________________________
+Int_t  AliMpSectorSegmentation::MaxPadIndexY() const
+{
+/// Return maximum pad index in y
+
+  return fkSector->GetMaxPadIndices().GetSecond();
+}
+
+//______________________________________________________________________________
+Int_t  AliMpSectorSegmentation::NofPads() const
+{
+/// Return number of pads defined in the sector
+
+  return fkSector->GetNofPads();
+}
+
 //______________________________________________________________________________
 Bool_t AliMpSectorSegmentation::HasPad(const AliMpIntPair& indices) const
 {
-// Does the pad specified by <indices> exist ?
-// ---
+/// Does the pad specified by \a indices exist ?
 
   return PadByIndices(indices,kFALSE) != AliMpPad::Invalid();
 }
@@ -409,8 +528,7 @@ Bool_t AliMpSectorSegmentation::HasPad(const AliMpIntPair& indices) const
 //______________________________________________________________________________
 Bool_t AliMpSectorSegmentation::HasMotifPosition(Int_t motifPositionID) const
 {
-// Does the motif position specified by motifPositionID exist ?
-// ---
+/// Does the motif position specified by motifPositionID exist ?
 
   return (fkSector->GetMotifMap()->FindMotifPosition(motifPositionID) != 0);
 }
@@ -418,8 +536,7 @@ Bool_t AliMpSectorSegmentation::HasMotifPosition(Int_t motifPositionID) const
 //______________________________________________________________________________
 TVector2  AliMpSectorSegmentation::GetMinPadDimensions() const
 {
-// Returnes the dimensions of the smallest pad.
-// ---
+/// Returne the dimensions of the smallest pad.
 
   return fkSector->GetMinPadDimensions();
 }  
@@ -427,27 +544,42 @@ TVector2  AliMpSectorSegmentation::GetMinPadDimensions() const
 //______________________________________________________________________________
 Int_t AliMpSectorSegmentation::Zone(const AliMpPad& pad, Bool_t warning) const
 {
-// Returns the zone index of the zone containing the specified pad.
-// This zone index is different from the zone ID,
-// as it is unique for each pad dimensions.
-// It is composed in this way:
-//   zoneID*10 + specific index 
-// Specific index is present only for zones containing special motifs.
-// ---
+/// Return the zone index of the zone containing the specified pad.
+/// This zone index is different from the zone ID,
+/// as it is unique for each pad dimensions.
+/// It is composed in this way:
+///   zoneID*10 + specific index 
+/// Specific index is present only for zones containing special motifs.
 
   if (!pad.IsValid()) {
     if (warning) Warning("Zone(AliMpPad)", "Invalid pad");
     return 0;
   }  
 
-  PadDimensionsMap::const_iterator it;
+#ifdef WITH_STL
+  PadDimensionsMapCIterator it;
   for (it = fPadDimensionsMap.begin(); it != fPadDimensionsMap.end(); ++it) {
     if (AliMpConstants::IsEqual(it->second, pad.Dimensions()))
       return it->first;
   }
+#endif
+
+#ifdef WITH_ROOT
+  PadDimensionsMapCIterator it(&fPadDimensionsMap);
+  Long_t key, value;
+  while ( it.Next(key, value) ) {
+    TVector2 dimensions =  GetVector(value);
+    if (AliMpConstants::IsEqual(dimensions, pad.Dimensions()))
+      return (Int_t)key;
+  } 
+  
+  AliError(Form("fPadDimensionsMap size is %d",fPadDimensionsMap.GetSize()));
+  
+#endif
 
   // Should never happen
-  Fatal("Zone(AliMpPad)", "not found");
+  AliErrorStream() 
+    << "Zone(AliMpPad pad) not found, where pad is: " << pad << endl;
   return 0;
 }  
 
@@ -455,11 +587,17 @@ Int_t AliMpSectorSegmentation::Zone(const AliMpPad& pad, Bool_t warning) const
 TVector2 
 AliMpSectorSegmentation::PadDimensions(Int_t zone, Bool_t warning) const
 {
-// Returns the pad dimensions for the zone with the specified zone index.
-// ---
+/// Return the pad dimensions for the zone with the specified zone index.
 
-  PadDimensionsMap::const_iterator it = fPadDimensionsMap.find(zone);
+#ifdef WITH_STL
+  PadDimensionsMapCIterator it = fPadDimensionsMap.find(zone);
   if (it != fPadDimensionsMap.end()) return it->second;
+#endif
+
+#ifdef WITH_ROOT
+  Long_t value = fPadDimensionsMap.GetValue(zone);
+  if (value) return GetVector(value);
+#endif
 
   if (warning) Warning("PadDimensions(zone)", "not found");
   return TVector2();
@@ -468,10 +606,9 @@ AliMpSectorSegmentation::PadDimensions(Int_t zone, Bool_t warning) const
 //______________________________________________________________________________
 Bool_t AliMpSectorSegmentation::CircleTest(const AliMpIntPair& indices) const
 {
-// Verifies that all methods for retrieving pads are consistents between them.
-// Returns true if the pad with specified indices was found and verified,
-// false otherwise.
-// ---
+/// Verify that all methods for retrieving pads are consistents between them.
+/// Return true if the pad with specified indices was found and verified,
+/// false otherwise.
 
   if (!HasPad(indices)) return false;
 
@@ -503,3 +640,41 @@ Bool_t AliMpSectorSegmentation::CircleTest(const AliMpIntPair& indices) const
   
   return true;
 }
+
+//______________________________________________________________________________
+void
+AliMpSectorSegmentation::Print(Option_t* opt) const
+{
+  fkSector->Print(opt);
+}
+
+//______________________________________________________________________________
+void AliMpSectorSegmentation::PrintZones() const
+{
+/// Print all zones and pads dimensions from the map.
+
+  cout << "Zones: " << endl;
+
+#ifdef WITH_STL
+  PadDimensionsMapCIterator it;
+  for (it = fPadDimensionsMap.begin(); it != fPadDimensionsMap.end(); ++it) {
+    cout << "    zone: " <<   setw(4) << it->first;
+    cout << "    pad dimensions: ( " 
+         << it->second.X() << ", " << it->second.Y() << ")" << endl; 
+  }
+#endif
+
+#ifdef WITH_ROOT
+  PadDimensionsMapCIterator it(&fPadDimensionsMap);
+  Long_t key, value;
+  while ( it.Next(key, value) ) {
+    //cout << "Iterating over: " << key << ", " << value << endl;
+    TVector2 dimensions =  GetVector(value);
+
+    cout << "    zone: " <<   setw(4) << key;
+    cout << "    pad dimensions: ( " 
+         << dimensions.X() << ", " << dimensions.Y() << ")" << endl; 
+  }
+#endif
+}
+