#include "AliMpRowSegment.h"
#include "AliMpRow.h"
#include "AliMpVMotif.h"
#include "AliMpMotifType.h"
#include "AliMpMotifTypePadIterator.h"
#include "AliMpMotifMap.h"
#include "AliMpMotifPosition.h"
#include "AliMpConstants.h"
#include "AliMpEncodePair.h"
#include "AliLog.h"
#include <TMath.h>
#include <Riostream.h>
using std::endl;
ClassImp(AliMpRowSegment)
AliMpRowSegment::AliMpRowSegment(AliMpRow* row, AliMpVMotif* motif,
Int_t padOffsetX, Int_t padOffsetY,
Int_t nofMotifs,
Int_t motifPositionId, Int_t motifPositionDId)
: AliMpVRowSegment(),
fNofMotifs(nofMotifs),
fLPadOffset(AliMp::Pair(padOffsetX,padOffsetY)),
fOffsetX(0.),
fOffsetY(0.),
fRow(row),
fMotif(motif),
fMotifPositionId(motifPositionId),
fMotifPositionDId(motifPositionDId)
{
SetLowIndicesLimit(fLPadOffset);
}
AliMpRowSegment::AliMpRowSegment()
: AliMpVRowSegment(),
fNofMotifs(0),
fLPadOffset(0),
fOffsetX(0.),
fOffsetY(0.),
fRow(0),
fMotif(0),
fMotifPositionId(0),
fMotifPositionDId(0)
{
}
AliMpRowSegment::~AliMpRowSegment()
{
}
Double_t AliMpRowSegment::FirstMotifCenterX() const
{
return fOffsetX;
}
Double_t AliMpRowSegment::LastMotifCenterX() const
{
return fOffsetX + 2.*(fNofMotifs-1)*fMotif->DimensionX();
}
Double_t AliMpRowSegment::MotifCenterX(Int_t motifPositionId) const
{
if (! HasMotifPosition(motifPositionId)) {
AliErrorStream() << "Outside row segment region" << endl;
return 0;
}
Int_t num = (motifPositionId - fMotifPositionId) * fMotifPositionDId;
return fOffsetX + num*(fMotif->DimensionX() * 2.0);
}
Double_t AliMpRowSegment::MotifCenterY(Int_t motifPositionId) const
{
if (! HasMotifPosition(motifPositionId)) {
AliErrorStream() << "Outside row segment region" << endl;
return 0;
}
return GetRow()->GetPositionY() + fOffsetY;
}
Bool_t AliMpRowSegment::IsInside(Double_t x, Double_t y, Bool_t warn) const
{
Double_t minY = GetRow()->GetPositionY() + fOffsetY - fMotif->DimensionY();
Double_t maxY = GetRow()->GetPositionY() + fOffsetY + fMotif->DimensionY();
if ( x < LeftBorderX() || x > RightBorderX() ||
y < minY || y > maxY ) {
if (warn)
AliWarningStream() << "Outside row segment region" << endl;
return false;
}
else
return true;
}
Double_t AliMpRowSegment::LeftBorderX() const
{
return FirstMotifCenterX() - fMotif->DimensionX();
}
Double_t AliMpRowSegment::RightBorderX() const
{
return LastMotifCenterX() + fMotif->DimensionX();
}
Double_t AliMpRowSegment::HalfSizeY() const
{
return fMotif->DimensionY() + fOffsetY;
}
AliMpVMotif* AliMpRowSegment::FindMotif(Double_t x, Double_t y) const
{
if ( IsInside(x, y, false) )
return fMotif;
else
return 0;
}
Int_t AliMpRowSegment::FindMotifPositionId(Double_t x, Double_t y) const
{
if ( ! IsInside(x, y, false) ) return 0;
Int_t num
= Int_t((x - LeftBorderX()) / (fMotif->DimensionX() * 2.0));
return fMotifPositionId + num*fMotifPositionDId;
}
Bool_t AliMpRowSegment::HasMotifPosition(Int_t motifPositionId) const
{
Int_t minId = TMath::Min(fMotifPositionId,
fMotifPositionId + (fNofMotifs-1)*fMotifPositionDId);
Int_t maxId = TMath::Max(fMotifPositionId,
fMotifPositionId + (fNofMotifs-1)*fMotifPositionDId);
if (motifPositionId >= minId && motifPositionId <= maxId) {
return true;
}
else
return false;
}
void AliMpRowSegment::MotifCenter(Int_t motifPositionId,
Double_t& x, Double_t& y) const
{
x = MotifCenterX(motifPositionId);
y = MotifCenterY(motifPositionId);
}
Double_t AliMpRowSegment::GetPositionX() const
{
return (LeftBorderX() + RightBorderX())/2.;
}
Double_t AliMpRowSegment::GetPositionY() const
{
return GetRow()->GetPositionY();
}
Double_t AliMpRowSegment::GetDimensionX() const
{
return (RightBorderX() - LeftBorderX())/2.;
}
Double_t AliMpRowSegment::GetDimensionY() const
{
return GetRow()->GetDimensionY();
}
void AliMpRowSegment::SetOffset(Double_t x, Double_t y)
{
AliMpMotifTypePadIterator iter(fMotif->GetMotifType());
iter.First();
Int_t ix = iter.CurrentItem().GetIx();
Int_t iy = iter.CurrentItem().GetIy();
Double_t dx, dy;
fMotif->GetPadDimensionsByIndices(ix, iy, dx, dy);
fOffsetX
= x + 2.*AliMp::PairFirst(fLPadOffset) * dx + fMotif->DimensionX();
fOffsetY
= y + AliMp::PairSecond(fLPadOffset) * dy;
}
void AliMpRowSegment::SetGlobalIndices(AliMpRow* )
{
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));
if ( !mPos->HasValidIndices() )
Fatal("SetGlobalIndices",
"Indices of motif positions have to be set first.");
if ( mPos->GetLowLimitIx() < ixl )
ixl = mPos->GetLowLimitIx();
if ( mPos->GetLowLimitIy() < iyl )
iyl = mPos->GetLowLimitIy();
if ( mPos->GetHighLimitIx() > ixh )
ixh = mPos->GetHighLimitIx();
if ( mPos->GetHighLimitIy() > iyh )
iyh = mPos->GetHighLimitIy();
}
SetLowIndicesLimit(ixl, iyl);
SetHighIndicesLimit(ixh, iyh);
}
Int_t AliMpRowSegment::SetIndicesToMotifPosition(Int_t i, MpPair_t indices)
{
AliMpMotifPosition* motifPosition
= GetRow()->GetMotifMap()->FindMotifPosition(GetMotifPositionId(i));
MpPair_t low = indices + AliMp::Pair(0, GetLowLimitIy());
motifPosition->SetLowIndicesLimit(low);
AliMpMotifType* motifType = motifPosition->GetMotif()->GetMotifType();
MpPair_t high
= motifPosition->GetLowIndicesLimit()
+ AliMp::Pair(motifType->GetNofPadsX()-1, motifType->GetNofPadsY()-1);
motifPosition->SetHighIndicesLimit(high);
return AliMp::PairFirst(high)+1;
}
AliMpRow* AliMpRowSegment::GetRow() const
{
return fRow;
}
Int_t AliMpRowSegment::GetNofMotifs() const
{
return fNofMotifs;
}
Int_t AliMpRowSegment::GetMotifPositionId(Int_t i) const
{
return fMotifPositionId + i*fMotifPositionDId;
}
AliMpVMotif* AliMpRowSegment::GetMotif(Int_t ) const
{
return fMotif;
}