+/**************************************************************************
+ * 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: AliMpRowSegment.cxx,v 1.10 2006/05/24 13:58:46 ivana Exp $
// Category: sector
//
// Class AliMpRowSegment
// ---------------------
// Class describing a row segment composed of the
// the identic motifs.
-//
+// Included in AliRoot: 2003/05/02
// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
-#include <TError.h>
-#include <TMath.h>
-
#include "AliMpRowSegment.h"
#include "AliMpRow.h"
#include "AliMpVMotif.h"
#include "AliMpMotifTypePadIterator.h"
#include "AliMpMotifMap.h"
#include "AliMpMotifPosition.h"
+#include "AliMpConstants.h"
+#include "AliLog.h"
+
+#include <TMath.h>
+#include <Riostream.h>
+
+/// \cond CLASSIMP
ClassImp(AliMpRowSegment)
+/// \endcond
//_____________________________________________________________________________
AliMpRowSegment::AliMpRowSegment(AliMpRow* row, AliMpVMotif* motif,
fMotifPositionId(motifPositionId),
fMotifPositionDId(motifPositionDId)
{
-//
+/// Standard constructor
+
// Keep pad offset in the low indices limits
SetLowIndicesLimit(padOffset);
}
fMotifPositionId(0),
fMotifPositionDId(0)
{
-//
+/// Default constructor
}
//_____________________________________________________________________________
-AliMpRowSegment::~AliMpRowSegment() {
-//
+AliMpRowSegment::~AliMpRowSegment()
+{
+/// Destructor
}
//
//_____________________________________________________________________________
Double_t AliMpRowSegment::FirstMotifCenterX() const
{
-// Returns the x coordinate of the first motif center
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the first motif center
+/// in the global coordinate system.
return fOffset.X();
}
//_____________________________________________________________________________
Double_t AliMpRowSegment::LastMotifCenterX() const
{
-// Returns the x coordinate of the last motif center
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the last motif center
+/// in the global coordinate system.
return fOffset.X() + 2.*(fNofMotifs-1)*fMotif->Dimensions().X();
}
//_____________________________________________________________________________
Double_t AliMpRowSegment::MotifCenterX(Int_t motifPositionId) const
{
-// Returns the x coordinate of the motif specified with
-// the given position identifier.
-// ---
+/// Return the x coordinate of the motif specified with
+/// the given position identifier.
// Check if x is in the row segment range
if (! HasMotifPosition(motifPositionId)) {
- Error("MotifCenterX", "Outside row segment region");
+ AliErrorStream() << "Outside row segment region" << endl;
return 0;
}
//_____________________________________________________________________________
Double_t AliMpRowSegment::MotifCenterY(Int_t motifPositionId) const
{
-// Returns the y coordinate of the motif specified with
-// the given position identifier.
-// ---
+/// Return the y coordinate of the motif specified with
+/// the given position identifier.
// Check if x is in the row segment range
if (! HasMotifPosition(motifPositionId)) {
- Error("MotifCenterY", "Outside row segment region");
+ AliErrorStream() << "Outside row segment region" << endl;
return 0;
}
//_____________________________________________________________________________
Bool_t AliMpRowSegment::IsInside(const TVector2& position, Bool_t warn) const
{
-// Checks if the position is inside some motif of this row segment.
-// ---
+/// Check if the position is inside some motif of this row segment.
Double_t minY = GetRow()->Position().Y() + fOffset.Y() - fMotif->Dimensions().Y();
Double_t maxY = GetRow()->Position().Y() + fOffset.Y() + fMotif->Dimensions().Y();
if ( position.X() < LeftBorderX() || position.X() > RightBorderX() ||
position.Y() < minY || position.Y() > maxY ) {
- if (warn) Error("MotifPositionId", "Outside row segment region");
+ if (warn)
+ AliWarningStream() << "Outside row segment region" << endl;
return false;
}
else
//_____________________________________________________________________________
Double_t AliMpRowSegment::LeftBorderX() const
{
-// Returns the x coordinate of the left row segment border
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the left row segment border
+/// in the global coordinate system.
return FirstMotifCenterX() - fMotif->Dimensions().X();
}
//_____________________________________________________________________________
Double_t AliMpRowSegment::RightBorderX() const
{
-// Returns the x coordinate of the right row segment border
-// in global coordinate system.
-// ---
+/// Return the x coordinate of the right row segment border
+/// in the global coordinate system.
return LastMotifCenterX() + fMotif->Dimensions().X();
}
//_____________________________________________________________________________
Double_t AliMpRowSegment::HalfSizeY() const
{
-// Returns the size in y of this row segment.
-// ---
+/// Return the size in y of this row segment.
return fMotif->Dimensions().Y() + fOffset.Y();
}
//_____________________________________________________________________________
AliMpVMotif* AliMpRowSegment::FindMotif(const TVector2& position) const
{
-// Returns the motif of this row;
-// ---
+/// Return the motif of this row;
if (IsInside(position, false))
return fMotif;
//_____________________________________________________________________________
Int_t AliMpRowSegment::FindMotifPositionId(const TVector2& position) const
{
-// Returns the motif position identified for the given
-// geometric position.
-// ---
+/// Return the motif position identified for the given
+/// geometric position.
if (!IsInside(position, false)) return 0;
//_____________________________________________________________________________
Bool_t AliMpRowSegment::HasMotifPosition(Int_t motifPositionId) const
{
-// Returns true if the motif specified with the given position identifier
-// is in this segment.
-// ---
+/// Return true if the motif specified with the given position identifier
+/// is in this segment.
Int_t minId = TMath::Min(fMotifPositionId,
fMotifPositionId + (fNofMotifs-1)*fMotifPositionDId);
//_____________________________________________________________________________
TVector2 AliMpRowSegment::MotifCenter(Int_t motifPositionId) const
{
-// Returns the coordinates of the motif specified with
-// the given position identifier.
-// ---
+/// Return the coordinates of the motif specified with
+/// the given position identifier.
return TVector2(MotifCenterX(motifPositionId), MotifCenterY(motifPositionId));
}
//_____________________________________________________________________________
TVector2 AliMpRowSegment::Position() const
{
-// Returns the position of the row segment centre.
-// ---
+/// Return the position of the row segment centre.
Double_t x = (LeftBorderX() + RightBorderX())/2.;
Double_t y = GetRow()->Position().Y();
//_____________________________________________________________________________
TVector2 AliMpRowSegment::Dimensions() const
{
-// Returns the halflengths of the row segment in x, y.
+/// Return the halflengths of the row segment in x, y.
// ---
Double_t x = (RightBorderX() - LeftBorderX())/2.;
//_____________________________________________________________________________
void AliMpRowSegment::SetOffset(const TVector2& offset)
{
-// Calculates offset from given offset and
-// stored offset in pads.
-// ---
+/// Calculate offset from given offset and
+/// stored offset in pads.
AliMpMotifTypePadIterator iter(fMotif->GetMotifType());
iter.First();
fOffset = TVector2(offsetX, offsetY);
}
+#include <Riostream.h>
//_____________________________________________________________________________
-void AliMpRowSegment::SetGlobalIndices()
+void AliMpRowSegment::SetGlobalIndices(AliMpRow* /*rowBefore*/)
{
-// Sets indices limits.
-// ---
+/// Set global indices limits.
- AliMpMotifPosition* firstPos
- = GetRow()->GetMotifMap()
- ->FindMotifPosition(GetMotifPositionId(0));
-
- AliMpMotifPosition* lastPos
- = GetRow()->GetMotifMap()
- ->FindMotifPosition(GetMotifPositionId(GetNofMotifs()-1));
-
- // Check if the motif positions has the limits set
- if ( !firstPos->HasValidIndices() || !lastPos->HasValidIndices())
- Fatal("SetGlobalIndices", "Indices of motif positions have to be set first.");
+ // The low/high indices limits has to be taken as the highest/lowest from all
+ // motif positions
+ Int_t ixl = 9999;
+ Int_t iyl = 9999;
+ Int_t ixh = AliMpConstants::StartPadIndex();
+ Int_t iyh = AliMpConstants::StartPadIndex();
+
+ for (Int_t i=0; i<GetNofMotifs(); i++) {
+
+ AliMpMotifPosition* mPos
+ = GetRow()->GetMotifMap()->FindMotifPosition(GetMotifPositionId(i));
+
+ // Check if the motif positions has the limits set
+ if ( !mPos->HasValidIndices() )
+ Fatal("SetGlobalIndices",
+ "Indices of motif positions have to be set first.");
- SetLowIndicesLimit(firstPos->GetLowIndicesLimit());
- SetHighIndicesLimit(lastPos->GetHighIndicesLimit());
+ if ( mPos->GetLowIndicesLimit().GetFirst() < ixl )
+ ixl = mPos->GetLowIndicesLimit().GetFirst();
+
+ if ( mPos->GetLowIndicesLimit().GetSecond() < iyl )
+ iyl = mPos->GetLowIndicesLimit().GetSecond();
+
+ if ( mPos->GetHighIndicesLimit().GetFirst() > ixh )
+ ixh = mPos->GetHighIndicesLimit().GetFirst();
+
+ if ( mPos->GetHighIndicesLimit().GetSecond() > iyh )
+ iyh = mPos->GetHighIndicesLimit().GetSecond();
+ }
+
+ SetLowIndicesLimit(AliMpIntPair(ixl, iyl));
+ SetHighIndicesLimit(AliMpIntPair(ixh, iyh));
}
//_____________________________________________________________________________
-Int_t AliMpRowSegment::SetIndicesToMotifPosition(Int_t i, AliMpIntPair indices)
+Int_t AliMpRowSegment::SetIndicesToMotifPosition(Int_t i,
+ const AliMpIntPair& indices)
{
-// Sets global indices to i-th motif position and returns next index
-// in x.
-// ---
+/// Set global indices to i-th motif position and returns next index
+/// in x.
// Get motif position
AliMpMotifPosition* motifPosition
//_____________________________________________________________________________
AliMpRow* AliMpRowSegment::GetRow() const
{
-// Returns the row.which this row segment belongs to.
-// ---
+/// Return the row.which this row segment belongs to.
return fRow;
}
//_____________________________________________________________________________
Int_t AliMpRowSegment::GetNofMotifs() const
{
-// Returns number of motifs in this this row segment.
-// ---
+/// Return number of motifs in this this row segment.
return fNofMotifs;
}
//_____________________________________________________________________________
Int_t AliMpRowSegment::GetMotifPositionId(Int_t i) const
{
-// Returns number of motifs in this this row segment.
-// ---
+/// Return number of motifs in this this row segment.
return fMotifPositionId + i*fMotifPositionDId;
}
//_____________________________________________________________________________
-AliMpVMotif* AliMpRowSegment::GetMotif(Int_t i) const
+AliMpVMotif* AliMpRowSegment::GetMotif(Int_t /*i*/) const
{
-// Returns the motif of this row segment.
-// ---
+/// Return the motif of this row segment.
return fMotif;
}