+/**************************************************************************
+ * 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
// -----------------------------
// Class describing the segmentation of the sector.
// finding pad neighbour.
//
// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
-
-#include <Riostream.h>
-#include <TMath.h>
+//-----------------------------------------------------------------------------
#include "AliMpSectorSegmentation.h"
#include "AliMpSector.h"
#include "AliMpVMotif.h"
#include "AliMpMotifPosition.h"
#include "AliMpConnection.h"
-#include "AliMpNeighboursPadIterator.h"
#include "AliMpSectorAreaHPadIterator.h"
#include "AliMpSectorAreaVPadIterator.h"
-#include "AliMpIntPair.h"
+#include "AliMpSectorPadIterator.h"
#include "AliMpArea.h"
#include "AliMpConstants.h"
+#include "AliMpEncodePair.h"
+
+#include "AliLog.h"
+
+#include <Riostream.h>
+#include <TMath.h>
+/// \cond CLASSIMP
ClassImp(AliMpSectorSegmentation)
+/// \endcond
-#ifdef WITH_ROOT
-const Double_t AliMpSectorSegmentation::fgkSeparator = 10000.;
-#endif
+const Double_t AliMpSectorSegmentation::fgkS1 = 100000.;
+const Double_t AliMpSectorSegmentation::fgkS2 = 1000.;
//______________________________________________________________________________
-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();
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
//
-#ifdef WITH_ROOT
//______________________________________________________________________________
Long_t AliMpSectorSegmentation::GetIndex(const TVector2& vector2) const
{
-// Converts the twovector to long.
-// ---
+/// Convert the two vector to long.
- if (vector2.X() >= fgkSeparator || vector2.Y() >= fgkSeparator)
- Fatal("GetIndex", "Index out of limit.");
-
- return Long_t(vector2.X()*fgkSeparator + vector2.Y() + 1.);
+ return Long_t(TMath::Floor((vector2.X()*fgkS1 + vector2.Y())*fgkS2));
}
//______________________________________________________________________________
TVector2 AliMpSectorSegmentation::GetVector(Long_t index) const
{
-// Converts the long index to twovector.
-// ---
+/// Convert the long index to twovector.
- return TVector2(TMath::Floor((index-1.)/fgkSeparator),
- (index-1.) - TMath::Floor((index-1.)/fgkSeparator)*fgkSeparator);
+ 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);
if (!AliMpConstants::IsEqual(zone->GetPadDimensions(), TVector2())) {
// regular zone
-#ifdef WITH_STL
- fPadDimensionsMap[zoneID*10] = zone->GetPadDimensions();
-#endif
-#ifdef WITH_ROOT
- fPadDimensionsMap.Add((Long_t)(zoneID*10),
+ 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
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
}
}
}
//______________________________________________________________________________
AliMpMotifPosition*
-AliMpSectorSegmentation::FindMotifPosition(const AliMpIntPair& indices) const
+AliMpSectorSegmentation::FindMotifPosition(Int_t ix, Int_t iy) 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 : {
+ switch ( fkSector->GetDirection() ) {
+ case AliMp::kX : {
// Case where all the pads have the same size along X direction
- for (Int_t irow=0; irow<fkSector->GetNofRows(); ++irow) {
+ for ( Int_t irow=0; irow<fkSector->GetNofRows(); ++irow ) {
AliMpRow* row = fkSector->GetRow(irow);
- if (row->GetLowIndicesLimit().GetFirst()<=indices.GetFirst() &&
- row->GetHighIndicesLimit().GetFirst()>=indices.GetFirst()) {
+ if ( row->GetLowLimitIx() <= ix &&
+ row->GetHighLimitIx()>= ix ) {
- for (Int_t iseg=0;iseg<row->GetNofRowSegments();++iseg){
+ for ( Int_t iseg=0;iseg<row->GetNofRowSegments();++iseg ) {
AliMpVRowSegment* seg = row->GetRowSegment(iseg);
- if (seg->GetLowIndicesLimit().GetFirst()<=indices.GetFirst() &&
- seg->GetHighIndicesLimit().GetFirst()>=indices.GetFirst()) {
+ if ( seg->GetLowLimitIx() <= ix &&
+ seg->GetHighLimitIx() >= ix ) {
AliMpMotifPosition* motifPos;
- for (Int_t imot=0;imot<seg->GetNofMotifs();++imot) {
+ for ( Int_t imot=0;imot<seg->GetNofMotifs();++imot ) {
motifPos
= fkSector->GetMotifMap()
->FindMotifPosition(seg->GetMotifPositionId(imot));
- if (motifPos && motifPos->HasPad(indices)) return motifPos;
+ if (motifPos && motifPos->HasPadByIndices(AliMp::Pair(ix,iy))) return motifPos;
}
}
}
}
break;
////////////////////////////////////////////////////////////////////////////////
- case kY : {
+ case AliMp::kY : {
// Case where all the pads have the same size along Y direction
// look for the row which contains the indices
AliMpRow* row=0;
Int_t irow;
- for (irow=0; irow<fkSector->GetNofRows(); ++irow) {
+ for ( irow=0; irow<fkSector->GetNofRows(); ++irow ) {
row = fkSector->GetRow(irow);
AliMpVRowSegment* lastSeg = row->GetRowSegment(row->GetNofRowSegments()-1);
- if (lastSeg->GetLowIndicesLimit().GetSecond()<=indices.GetSecond() &&
- lastSeg->GetHighIndicesLimit().GetSecond()>=indices.GetSecond()) break;
+ if ( lastSeg->GetLowLimitIy() <= iy &&
+ lastSeg->GetHighLimitIy() >= iy ) break;
// NOTE : We use the last row segment in order to ensure that
// we are not on a special motif
}
- if (irow==fkSector->GetNofRows()) return 0;
+ if ( irow==fkSector->GetNofRows() ) return 0;
// look for the row segment, in the found row, which contains the indices
AliMpVRowSegment* seg=0;
Int_t iseg;
- for (iseg=0;iseg<row->GetNofRowSegments();++iseg){
+ for ( iseg=0;iseg<row->GetNofRowSegments();++iseg ) {
seg = row->GetRowSegment(iseg);
- if (seg->HasIndices(indices)) break;
+ if (seg->HasIndices(AliMp::Pair(ix, iy))) break;
}
- if (iseg==row->GetNofRowSegments()) return 0;
+ if ( iseg==row->GetNofRowSegments() ) return 0;
// look for the motif position which contains the indices
AliMpMotifPosition* motifPos=0;
Int_t imot=0;
- for (imot=0;imot<seg->GetNofMotifs();++imot) {
+ for ( imot=0;imot<seg->GetNofMotifs();++imot ) {
motifPos
= fkSector->GetMotifMap()
->FindMotifPosition(seg->GetMotifPositionId(imot));
- if (motifPos && motifPos->HasPad(indices)) break;
+ if (motifPos && motifPos->HasPadByIndices(AliMp::Pair(ix, iy))) break;
}
if (imot==seg->GetNofMotifs()) return 0;
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();
// Search in X direction
AliMpPad pad;
- TVector2 position(startPosition);
+ TVector2 position(startPosition);
do {
pad = PadByPosition(position, false);
position += TVector2(stepX, 0.);
}
- while ( !pad.IsValid() && position.X() < maxX );
+ while ( !pad.IsValid() &&
+ position.X() - fkSector->GetMaxPadDimensions().X() < maxX );
// Invalidate pad if it is outside limits
- if ((pad.Position().X() - pad.Dimensions().X()) > maxX)
+ if ( (pad.Position().X() - pad.Dimensions().X()) > maxX )
pad = AliMpPad::Invalid();
return pad;
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();
pad = PadByPosition(position, false);
position += TVector2(0., stepY);
}
- while ( !pad.IsValid() && position.Y() < maxY );
+ while ( !pad.IsValid() &&
+ position.Y() - fkSector->GetMaxPadDimensions().Y()< maxY );
// Invalidate pad if it is outside limits
if ((pad.Position().Y() - pad.Dimensions().Y()) > maxY)
return pad;
}
-//______________________________________________________________________________
-AliMpVPadIterator* AliMpSectorSegmentation::CreateIterator() const
-{
-// The inherited method cannot be used
-
- Fatal("CreateIterator", "Center pad has to be specified.");
- return 0;
-}
-
-
//
// public methods
//
AliMpVPadIterator*
AliMpSectorSegmentation::CreateIterator(const AliMpArea& area) const
{
-// Creates the are iterator.
-// (The inherited method cannot be used)
-// ---
+/// Create the area iterator.
switch (fkSector->GetDirection()) {
- case kX: return new AliMpSectorAreaVPadIterator(this, area);
+ case AliMp::kX: return new AliMpSectorAreaVPadIterator(this, area);
;;
- case kY: return new AliMpSectorAreaHPadIterator(this, area);
+ case AliMp::kY: return new AliMpSectorAreaHPadIterator(this, area);
;;
}
//______________________________________________________________________________
AliMpVPadIterator*
-AliMpSectorSegmentation::CreateIterator(const AliMpPad& centerPad,
- Bool_t includeCenter) const
+AliMpSectorSegmentation::CreateIterator() const
{
-// Creates the neighbours pad iterator.
-// (The inherited method cannot be used)
+/// Create the sector iterator
+
+ return new AliMpSectorPadIterator(fkSector);
+}
+
+//______________________________________________________________________________
+Int_t
+AliMpSectorSegmentation::GetNeighbours(const AliMpPad& pad, TObjArray& neighbours,
+ Bool_t includeSelf,
+ Bool_t includeVoid) const
+{
+ /// Uses default implementation
+ return AliMpVSegmentation::GetNeighbours(pad,neighbours,includeSelf,includeVoid);
+}
- return new AliMpNeighboursPadIterator(this, centerPad, includeCenter);
-}
-
//______________________________________________________________________________
AliMpPad
-AliMpSectorSegmentation::PadByLocation(const AliMpIntPair& location,
+AliMpSectorSegmentation::PadByLocation(Int_t manuId, Int_t manuChannel,
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);
+
+
+ if ( fPadBuffer->GetManuId() == manuId &&
+ fPadBuffer->GetManuChannel() == manuChannel ) return (*fPadBuffer);
AliMpMotifPosition* motifPos =
- fkSector->GetMotifMap()->FindMotifPosition(location.GetFirst());
+ fkSector->GetMotifMap()->FindMotifPosition(manuId);
if (!motifPos){
if (warning) Warning("PadByLocation","The pad motif position ID doesn't exists");
return AliMpPad::Invalid();
}
AliMpVMotif* motif = motifPos->GetMotif();
- AliMpIntPair localIndices =
- motif->GetMotifType()->FindLocalIndicesByGassiNum(location.GetSecond());
- if (! localIndices.IsValid()) {
+ MpPair_t localIndices =
+ motif->GetMotifType()->FindLocalIndicesByGassiNum(manuChannel);
+ if ( localIndices < 0 ) {
if (warning) Warning("PadByLocation","The pad number doesn't exists");
return AliMpPad::Invalid();
}
TVector2 delta = motif->PadPositionLocal(localIndices);
- return (*fPadBuffer) = AliMpPad(location,
+
+ return (*fPadBuffer) = AliMpPad(manuId, manuChannel,
motifPos->GlobalIndices(localIndices),
motifPos->Position()+delta,
- motif->GetPadDimensions(localIndices));
+ motif->GetPadDimensionsByIndices(localIndices));
}
//______________________________________________________________________________
AliMpPad
-AliMpSectorSegmentation::PadByIndices(const AliMpIntPair& indices,
- Bool_t warning ) const
+AliMpSectorSegmentation::PadByIndices(Int_t ix, Int_t iy, 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 ( fPadBuffer->GetIx() == ix &&
+ fPadBuffer->GetIy() == iy ) return (*fPadBuffer);
+
+ MpPair_t indices = AliMp::Pair(ix, iy);
+ AliMpMotifPosition* motifPos = FindMotifPosition(ix, iy);
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();
}
// retrieve the local indices in the found motif
AliMpVMotif* motif = motifPos->GetMotif();
- AliMpIntPair localIndices = indices - motifPos->GetLowIndicesLimit();
+ MpPair_t localIndices = indices - motifPos->GetLowIndicesLimit();
AliMpConnection* connection=
motif->GetMotifType()->FindConnectionByLocalIndices(localIndices);
TVector2 localPos = motif->PadPositionLocal(localIndices);
return (*fPadBuffer)
- = AliMpPad(AliMpIntPair(motifPos->GetID(),connection->GetGassiNum()),
- indices,
+ = AliMpPad(motifPos->GetID(),connection->GetManuChannel(),
+ ix, iy,
motifPos->Position()+localPos,
- motif->GetPadDimensions(localIndices));
+ motif->GetPadDimensionsByIndices(localIndices));
}
//______________________________________________________________________________
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);
+ if (fPadBuffer->Position().X()==position.X() &&
+ fPadBuffer->Position().Y()==position.Y()) return (*fPadBuffer);
Int_t motifPosID = fkSector->FindMotifPositionId(position);
AliMpMotifPosition* motifPos
}
AliMpVMotif* motif = motifPos->GetMotif();
- AliMpIntPair localIndices
+ MpPair_t localIndices
= motif->PadIndicesLocal(position-motifPos->Position());
+
+ if ( localIndices < 0 ) {
+ if (warning) Warning("PadByPosition","Position outside motif limits");
+ return AliMpPad::Invalid();
+ }
AliMpConnection* connect =
motif->GetMotifType()->FindConnectionByLocalIndices(localIndices);
- if (!connect){
+ if ( ! connect ) {
if (warning) Warning("PadByPosition","Position outside motif limits");
return AliMpPad::Invalid();
}
return (*fPadBuffer)
- = AliMpPad(AliMpIntPair(motifPosID,connect->GetGassiNum()),
+ = AliMpPad(motifPosID, connect->GetManuChannel(),
motifPos->GlobalIndices(localIndices),
motifPos->Position()+motif->PadPositionLocal(localIndices),
- motif->GetPadDimensions(localIndices));
+ motif->GetPadDimensionsByIndices(localIndices));
}
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()) {
- case kX: return PadByYDirection(startPosition, distance);
+ case AliMp::kX: return PadByYDirection(startPosition, distance);
;;
- case kY: return PadByXDirection(startPosition, distance);
+ case AliMp::kY: return PadByXDirection(startPosition, distance);
;;
}
return AliMpPad::Invalid();
}
+//_____________________________________________________________________________
+Bool_t
+AliMpSectorSegmentation::HasPadByIndices(Int_t ix, Int_t iy) const
+{
+ /// Whether or not we have a pad at indices=(ix,iy)
+
+ MpPair_t indices = AliMp::Pair(ix, iy);
+
+ AliMpMotifPosition* motifPos = FindMotifPosition(ix, iy);
+
+ if (motifPos) return motifPos->HasPadByIndices(indices);
+
+ return kFALSE;
+}
+
+//_____________________________________________________________________________
+Bool_t
+AliMpSectorSegmentation::HasPadByLocation(Int_t manuId, Int_t manuChannel) const
+{
+ /// Whether or not we have a pad at location=(manuId,manuChannel)
+
+ AliMpMotifPosition* motifPos
+ = fkSector->GetMotifMap()->FindMotifPosition(manuId);
+
+ if ( motifPos ) return motifPos->HasPadByManuChannel(manuChannel);
+
+ return kFALSE;
+}
+
//______________________________________________________________________________
-Bool_t AliMpSectorSegmentation::HasPad(const AliMpIntPair& indices) const
+Int_t AliMpSectorSegmentation::MaxPadIndexX() const
{
-// Does the pad specified by <indices> exist ?
-// ---
+/// Return maximum pad index in x
- return PadByIndices(indices,kFALSE) != AliMpPad::Invalid();
+ return AliMp::PairFirst(fkSector->GetMaxPadIndices());
}
//______________________________________________________________________________
-Bool_t AliMpSectorSegmentation::HasMotifPosition(Int_t motifPositionID) const
+Int_t AliMpSectorSegmentation::MaxPadIndexY() const
{
-// Does the motif position specified by motifPositionID exist ?
-// ---
+/// Return maximum pad index in y
- return (fkSector->GetMotifMap()->FindMotifPosition(motifPositionID) != 0);
+ return AliMp::PairSecond(fkSector->GetMaxPadIndices());
}
//______________________________________________________________________________
-TVector2 AliMpSectorSegmentation::GetMinPadDimensions() const
+Int_t AliMpSectorSegmentation::NofPads() const
{
-// Returnes the dimensions of the smallest pad.
-// ---
+/// Return number of pads defined in the sector
- return fkSector->GetMinPadDimensions();
-}
+ return fkSector->GetNofPads();
+}
+
+//_____________________________________________________________________________
+void
+AliMpSectorSegmentation::GetAllElectronicCardIDs(TArrayI& ecn) const
+{
+ /// Fill the array ecn with all manuIds
+
+ GetSector()->GetAllMotifPositionsIDs(ecn);
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMpSectorSegmentation::GetNofElectronicCards() const
+{
+ /// Get the number of manus of this sector
+
+ return fkSector->GetNofMotifPositions();
+}
+
+//_____________________________________________________________________________
+Bool_t
+AliMpSectorSegmentation::HasMotifPosition(Int_t manuId) const
+{
+ /// Whether we get a given manu. Uses default implementation
+ return (AliMpVSegmentation::HasMotifPosition(manuId) != 0x0);
+}
+
+//_____________________________________________________________________________
+AliMpMotifPosition*
+AliMpSectorSegmentation::MotifPosition(Int_t manuId) const
+{
+ /// Return a given manu
+ return fkSector->GetMotifMap()->FindMotifPosition(manuId);
+}
+
+//______________________________________________________________________________
+AliMp::PlaneType
+AliMpSectorSegmentation::PlaneType() const
+{
+ return GetSector()->GetPlaneType();
+}
+
+//______________________________________________________________________________
+TVector2
+AliMpSectorSegmentation::Dimensions() const
+{
+/// Return sector dimensions
+
+ return GetSector()->Dimensions();
+}
+
+//______________________________________________________________________________
+TVector2
+AliMpSectorSegmentation::Position() const
+{
+/// Return sector position
+
+ // return GetSector()->Position();
+ return TVector2(0.,0.);
+}
+
+//______________________________________________________________________________
+void
+AliMpSectorSegmentation::Print(Option_t* opt) const
+{
+/// Print the sector
+
+ fkSector->Print(opt);
+}
//______________________________________________________________________________
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;
}
-#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);
+ TExMapIter 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;
- }
- return 0;
-
-#endif
+ }
+
+ AliError(Form("fPadDimensionsMap size is %d",fPadDimensionsMap.GetSize()));
// Should never happen
- Fatal("Zone(AliMpPad)", "not found");
+ AliErrorStream()
+ << "Zone(AliMpPad pad) not found, where pad is: " << pad << endl;
return 0;
}
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.
-#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();
}
//______________________________________________________________________________
-Bool_t AliMpSectorSegmentation::CircleTest(const AliMpIntPair& indices) const
+TVector2 AliMpSectorSegmentation::GetMinPadDimensions() 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.
-// ---
+/// Returne the dimensions of the smallest pad.
- if (!HasPad(indices)) return false;
+ return fkSector->GetMinPadDimensions();
+}
+
+//______________________________________________________________________________
+Bool_t AliMpSectorSegmentation::CircleTest(Int_t ix, Int_t iy) const
+{
+/// 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 ( ! HasPadByIndices(ix, iy) ) return false;
// Verify the indice->location->position->indice way
- AliMpIntPair location = PadByIndices(indices).GetLocation();
- TVector2 position = PadByLocation(location).Position();
- AliMpIntPair retIndices = PadByPosition(position).GetIndices();
+ AliMpPad pad1 = PadByIndices(ix, iy);
+ AliMpPad pad2 = PadByLocation(pad1.GetManuId(), pad1.GetManuChannel());
+ AliMpPad pad3 = PadByPosition(pad2.Position());
+
+ MpPair_t retIndices = pad3.GetIndices();
- if (retIndices != indices) {
- cout << "Pad " << indices << " lead to inconsistency" << endl;
+ if ( retIndices != AliMp::Pair(ix, iy) ) {
+ cout << "Pad (" << ix << ',' << iy << ") lead to inconsistency" << endl;
cout << "in indice->location->position->indice way..." << endl;
- cout << "starting from " << indices << "-->" << location << "-->"
- << '(' << position.X() << ',' << position.Y() << ')'
- << " and retIndices: " << retIndices << endl;
+ cout << "starting from indices " << pad1 << endl
+ << "--> location " << pad2 << endl
+ << "--> position "
+ << '(' << pad3.Position().X() << ',' << pad3.Position().Y() << ')'
+ << endl << endl;
}
- // Verify the indice->position->location->indice way
- position = PadByIndices(indices).Position();
- location = PadByPosition(position).GetLocation();
- retIndices = PadByLocation(location).GetIndices();
-
- if (retIndices != indices) {
- cout << "Pad " << indices << " lead to inconsistency" << endl;
- cout << "in indice->position->location->indice way..." <<endl;
- cout << "starting from " << indices
- << " and retIndices: " << retIndices << endl;
+ // Verify the indice->position->location->indice way
+ AliMpPad pad2bis = PadByPosition(pad1.Position());
+ AliMpPad pad3bis = PadByLocation(pad2bis.GetManuId(), pad2bis.GetManuChannel());
+
+ retIndices = pad3bis.GetIndices();
+
+ if ( retIndices != AliMp::Pair(ix, iy) ) {
+ cout << "Pad (" << ix << ',' << iy << ") lead to inconsistency" << endl;
+ cout << "in indice->position->location->indice way..." << endl;
+ cout << "starting from indices " << pad1 << endl
+ << "--> position "
+ << '(' << pad2bis.Position().X() << ',' << pad2bis.Position().Y() << ')' << endl
+ << "--> location " << pad3bis
+ << endl << endl;
}
return true;
}
+
+//______________________________________________________________________________
+void AliMpSectorSegmentation::PrintZones() const
+{
+/// Print all zones and pads dimensions from the map.
+
+ cout << "Zones: " << endl;
+
+ TExMapIter 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;
+ }
+}
+