#include "AliMpSector.h"
#include "AliMpSectorPadIterator.h"
#include "AliMpZone.h"
#include "AliMpRow.h"
#include "AliMpVRowSegment.h"
#include "AliMpVMotif.h"
#include "AliMpMotifMap.h"
#include "AliMpEncodePair.h"
#include "AliMpConstants.h"
#include "AliLog.h"
#include <Riostream.h>
using std::cout;
using std::endl;
ClassImp(AliMpSector)
AliMpSector::AliMpSector(const TString& id, Int_t nofZones, Int_t nofRows,
AliMp::Direction direction,
Double_t offsetx, Double_t offsety)
: TNamed("Sector", ""),
fID(id),
fOffsetX(offsetx),
fOffsetY(offsety),
fDimensionX(0.),
fDimensionY(0.),
fZones(),
fRows(),
fMotifMap(0),
fDirection(direction),
fMinPadDimensionX(1.e6),
fMinPadDimensionY(1.e6),
fMaxPadDimensionX(0.),
fMaxPadDimensionY(0.),
fLMaxPadIndices(0),
fNofPads(0)
{
AliDebugStream(1) << "this = " << this << endl;
fMotifMap = new AliMpMotifMap;
for (Int_t izone = 0; izone<nofZones; izone++)
fZones.Add(new AliMpZone(izone+1));
for (Int_t irow = 0; irow<nofRows; irow++)
fRows.Add(new AliMpRow(irow, fMotifMap));
}
AliMpSector::AliMpSector()
: TNamed(),
fID(""),
fOffsetX(0.),
fOffsetY(0.),
fDimensionX(0.),
fDimensionY(0.),
fZones(),
fRows(),
fMotifMap(0),
fDirection(AliMp::kX),
fMinPadDimensionX(0.),
fMinPadDimensionY(0.),
fMaxPadDimensionX(0.),
fMaxPadDimensionY(0.),
fLMaxPadIndices(0),
fNofPads(0)
{
AliDebugStream(1) << "this = " << this << endl;
}
AliMpSector::~AliMpSector()
{
AliDebugStream(1) << "this = " << this << endl;
for (Int_t izone = 0; izone<GetNofZones(); izone++)
delete fZones[izone];
for (Int_t irow = 0; irow<GetNofRows(); irow++)
delete fRows[irow];
delete fMotifMap;
}
AliMpRow* AliMpSector::FindRow(Double_t y) const
{
for (Int_t i=0; i<GetNofRows(); i++) {
if ( y >= ((AliMpRow*)fRows[i])->LowBorderY() &&
y <= ((AliMpRow*)fRows[i])->UpperBorderY())
return (AliMpRow*)fRows[i];
}
return 0;
}
Int_t AliMpSector::FindMotifPositionId(Double_t x, Double_t y) const
{
AliMpVRowSegment* rowSegment = FindRowSegment(x,y);
if ( ! rowSegment ) return 0;
return rowSegment->FindMotifPositionId(x, y);
}
AliMpVRowSegment* AliMpSector::FindRowSegment(Double_t x, Double_t y) const
{
AliMpRow* row = FindRow(y);
if (!row) return 0;
AliMpVRowSegment* rowSegment = row->FindRowSegment(x);
return rowSegment;
}
void AliMpSector::SetRowOffsets()
{
Double_t offset = fOffsetY;
for (Int_t irow=0; irow<GetNofRows(); irow++)
offset = GetRow(irow)->SetOffsetY(offset);
}
void AliMpSector::SetMotifPositions()
{
for (Int_t i=0; i<GetNofRows(); i++)
GetRow(i)->SetMotifPositions();
}
void AliMpSector::SetGlobalIndices()
{
AliMpRow* rowBefore=0;
for (Int_t i=0; i<GetNofRows(); i++) {
GetRow(i)->SetGlobalIndices(fDirection, rowBefore);
rowBefore = GetRow(i);
}
}
void AliMpSector::SetMinMaxPadDimensions()
{
for (Int_t i=1; i<GetNofZones()+1; i++) {
Double_t dx = GetZone(i)->GetPadDimensionX();
Double_t dy = GetZone(i)->GetPadDimensionY();
if ( ( fDirection == AliMp::kX && dy > 0. && dy < fMinPadDimensionY ) ||
( fDirection == AliMp::kY && dx > 0. && dx < fMinPadDimensionX ) ) {
fMinPadDimensionX = dx;
fMinPadDimensionY = dy;
}
if ( ( fDirection == AliMp::kX && dy > 0. && dy > fMaxPadDimensionY ) ||
( fDirection == AliMp::kY && dx > 0. && dx > fMinPadDimensionX ) ) {
fMaxPadDimensionX = dx;
fMaxPadDimensionY = dy;
}
}
}
void AliMpSector::SetMaxPadIndices()
{
if ( fLMaxPadIndices != 0 ) return;
Int_t maxIndexInX = 0;
Int_t maxIndexInY = 0;
for (Int_t i=0; i<GetNofRows(); i++) {
Int_t ixh = GetRow(i)->GetHighLimitIx();
if ( ixh > maxIndexInX ) maxIndexInX = ixh;
Int_t iyh = GetRow(i)->GetHighLimitIy();
if ( iyh > maxIndexInY ) maxIndexInY = iyh;
}
fLMaxPadIndices = AliMp::Pair(maxIndexInX, maxIndexInY);
}
void AliMpSector::SetNofPads()
{
fNofPads = fMotifMap->CalculateNofPads();
}
void AliMpSector::SetDimensions()
{
fDimensionX = 0.;
fDimensionY = 0.;
for (Int_t i=0; i<GetNofRows(); i++) {
if ( ((AliMpRow*)fRows[i])->GetDimensionX() > fDimensionX )
fDimensionX = ((AliMpRow*)fRows[i])->GetDimensionX();
fDimensionY += ((AliMpRow*)fRows[i])->GetDimensionY();
}
}
AliMpVPadIterator* AliMpSector::CreateIterator() const
{
return new AliMpSectorPadIterator(this);
}
void AliMpSector::SetRowSegmentOffsets()
{
for (Int_t irow=0; irow<GetNofRows(); irow++)
GetRow(irow)->SetRowSegmentOffsets(fOffsetX);
}
void AliMpSector::Initialize()
{
SetRowOffsets();
SetMotifPositions();
SetGlobalIndices();
SetMinMaxPadDimensions();
SetMaxPadIndices();
SetNofPads();
SetDimensions();
}
void AliMpSector::PrintGeometry() const
{
for (Int_t i=0; i<GetNofRows(); i++) {
AliMpRow* row = GetRow(i);
cout << "ROW " << row->GetID()
<< " center Y " << row->GetPositionY() << endl;
for (Int_t j=0; j<row->GetNofRowSegments(); j++) {
AliMpVRowSegment* rowSegment = row->GetRowSegment(j);
cout << " ROW Segment " << j
<< " borders "
<< rowSegment->LeftBorderX() << " "
<< rowSegment->RightBorderX()
<< " x-size "
<< 2*rowSegment->GetDimensionX() << " "
<< endl;
}
}
}
AliMpRow* AliMpSector::FindRow(Int_t motifPositionId) const
{
AliMpVRowSegment* segment = FindRowSegment(motifPositionId);
if (segment) return segment->GetRow();
return 0;
}
AliMpVRowSegment* AliMpSector::FindRowSegment(Int_t motifPositionId) const
{
for (Int_t irow=0; irow<GetNofRows(); irow++) {
AliMpRow* row = (AliMpRow*)fRows[irow];
for (Int_t iseg=0; iseg<row->GetNofRowSegments(); iseg++) {
AliMpVRowSegment* segment = row->GetRowSegment(iseg);
if (segment->HasMotifPosition(motifPositionId)) return segment;
}
}
return 0;
}
Double_t AliMpSector::GetPositionX() const
{
return fOffsetX;
}
Double_t AliMpSector::GetPositionY() const
{
return fOffsetY;
}
Double_t AliMpSector::GetDimensionX() const
{
return fDimensionX;
}
Double_t AliMpSector::GetDimensionY() const
{
return fDimensionY;
}
Int_t AliMpSector::GetNofZones() const
{
return fZones.GetEntriesFast();
}
AliMpZone* AliMpSector::GetZone(Int_t zoneID) const
{
if (zoneID < 1 || zoneID > GetNofZones()) {
AliWarningStream() << "Index outside range" << endl;
return 0;
}
return (AliMpZone*)fZones[zoneID-1];
}
Int_t AliMpSector::GetNofRows() const
{
return fRows.GetEntriesFast();
}
AliMpRow* AliMpSector::GetRow(Int_t rowID) const
{
if (rowID < 0 || rowID >= GetNofRows()) {
AliWarningStream() << "Index outside range" << endl;
return 0;
}
return (AliMpRow*)fRows[rowID];
}
AliMp::PlaneType
AliMpSector::GetPlaneType() const
{
return GetDirection()==AliMp::kY ? AliMp::kBendingPlane : AliMp::kNonBendingPlane;
}
Int_t
AliMpSector::GetNofMotifPositions() const
{
return fMotifMap->GetNofMotifPositions();
}
void
AliMpSector::GetAllMotifPositionsIDs(TArrayI& ecn) const
{
fMotifMap->GetAllMotifPositionsIDs(ecn);
}
void
AliMpSector::Print(Option_t* opt) const
{
cout << "Sector," << PlaneTypeName(GetPlaneType()) << endl;
fMotifMap->Print(opt);
}