#include "AliMpPad.h"
#include "AliMpEncodePair.h"
#include "AliLog.h"
#include <TClonesArray.h>
#include <Riostream.h>
using std::cout;
using std::endl;
ClassImp(AliMpPad)
const Int_t AliMpPad::fgkMaxNofLocations = 6;
AliMpPad::AliMpPad(Int_t manuId, Int_t channel,
Int_t ix, Int_t iy,
Double_t x, Double_t y,
Double_t dx, Double_t dy,
Bool_t validity)
: TObject(),
fNofLocations(0),
fLLocations(0),
fLLocation(AliMp::Pair(manuId, channel)),
fLIndices(AliMp::Pair(ix, iy)),
fPositionX(x),
fPositionY(y),
fDimensionX(dx),
fDimensionY(dy),
fValidity(validity)
{
}
AliMpPad::AliMpPad(Int_t manuId, Int_t channel,
MpPair_t indices,
Double_t x, Double_t y,
Double_t dx, Double_t dy,
Bool_t validity)
: TObject(),
fNofLocations(0),
fLLocations(0),
fLLocation(AliMp::Pair(manuId, channel)),
fLIndices(indices),
fPositionX(x),
fPositionY(y),
fDimensionX(dx),
fDimensionY(dy),
fValidity(validity)
{
}
AliMpPad::AliMpPad()
: TObject(),
fNofLocations(0),
fLLocations(0),
fLLocation(0),
fLIndices(0),
fPositionX(-1.),
fPositionY(-1.),
fDimensionX(-1.),
fDimensionY(-1.),
fValidity(false)
{
}
AliMpPad::AliMpPad(const AliMpPad& rhs)
: TObject(),
fNofLocations(0),
fLLocations(0),
fLLocation(0),
fLIndices(0),
fPositionX(-1.),
fPositionY(-1.),
fDimensionX(-1.),
fDimensionY(-1.),
fValidity(false)
{
*this = rhs;
}
AliMpPad::~AliMpPad()
{
delete [] fLLocations;
}
AliMpPad& AliMpPad::operator = (const AliMpPad& rhs)
{
if (this == &rhs) return *this;
TObject::operator=(rhs);
fLLocation = rhs.fLLocation;
fLIndices = rhs.fLIndices;
fPositionX = rhs.fPositionX;
fPositionY = rhs.fPositionY;
fDimensionX = rhs.fDimensionX;
fDimensionY = rhs.fDimensionY;
fValidity = rhs.fValidity;
delete [] fLLocations;
fLLocations = 0;
fNofLocations = rhs.fNofLocations;
if ( rhs.GetNofLocations() ) {
fLLocations = new MpPair_t[fgkMaxNofLocations];
for ( UInt_t i=0; i<rhs.fNofLocations; i++ )
fLLocations[i] = rhs.fLLocations[i];
}
return *this;
}
Bool_t AliMpPad::operator == (const AliMpPad& rhs) const
{
if (fValidity != rhs.fValidity) return false;
if (!fValidity) return true;
Bool_t sameLocations = true;
if (rhs.GetNofLocations()) {
for (Int_t i=0; i<rhs.GetNofLocations(); i++)
if ( GetLocation(i) != rhs.GetLocation(i) )
sameLocations = false;
}
return ( fLLocation == rhs.fLLocation )
&& ( fLIndices == rhs.fLIndices )
&& ( fPositionX == rhs.fPositionX )
&& ( fPositionY == rhs.fPositionY )
&& ( fDimensionX == rhs.fDimensionX )
&& sameLocations;
}
Bool_t AliMpPad::operator != (const AliMpPad& rhs) const
{
return !(*this==rhs);
}
Bool_t operator < (const AliMpPad& left, const AliMpPad& right)
{
if ( left.GetIx() < right.GetIx() ) return kTRUE;
if ( left.GetIx() > right.GetIx() ) return kFALSE;
if ( left.GetIy() < right.GetIy() ) return kTRUE;
return kFALSE;
}
Bool_t AliMpPad::AddLocation(Int_t localBoardId, Int_t localBoardChannel,
Bool_t warn)
{
if ( GetNofLocations() == fgkMaxNofLocations ) {
if (warn) {
AliWarningStream() << "Cannot add location: ("
<< localBoardId << "," << localBoardChannel << ")."
<< " Maximum number has been reached." << endl;
}
return false;
}
if ( HasLocation(localBoardId, localBoardChannel) ) {
if (warn) {
AliWarningStream() << "Cannot add location: "
<< localBoardId << "," << localBoardChannel << ")."
<< " Location is already present." << endl;
}
return false;
}
if ( ! fLLocations)
fLLocations = new MpPair_t[fgkMaxNofLocations];
fLLocations[fNofLocations++]
= AliMp::Pair(localBoardId, localBoardChannel);
return true;
}
Int_t AliMpPad::GetManuId() const
{
return AliMp::PairFirst(fLLocation);
}
Int_t AliMpPad::GetManuChannel() const
{
return AliMp::PairSecond(fLLocation);
}
Int_t AliMpPad::GetIx() const
{
return AliMp::PairFirst(fLIndices);
}
Int_t AliMpPad::GetIy() const
{
return AliMp::PairSecond(fLIndices);
}
void AliMpPad::PrintOn(ostream& out) const
{
if ( !fValidity ) {
out << "Pad::Invalid";
return;
}
out << "Pad: Location ";
AliMp::PairPut(out, fLLocation)
<< " Indices ";
AliMp::PairPut(out,fLIndices)
<< " Position "
<< "(" << fPositionX << "," << fPositionY << ")"
<< " Dimensions "
<< "(" << fDimensionX << "," << fDimensionY << ")";
if ( GetNofLocations() ) {
out << endl;
out << " Other locations: ";
for (Int_t i=0; i<GetNofLocations(); i++)
AliMp::PairPut(out,GetLocation(i)) << " ";
}
}
void AliMpPad::Print(const char* ) const
{
PrintOn(cout);
cout << endl;
}
Int_t AliMpPad::GetNofLocations() const
{
if (!fLLocations) return 0;
return fNofLocations;
}
MpPair_t AliMpPad::GetLocation(Int_t i) const
{
if ( !fLLocations || i<0 || i>=GetNofLocations() )
return 0;
return fLLocations[i];
}
Int_t AliMpPad::GetLocalBoardId(Int_t i) const
{
if ( !fLLocations || i<0 || i>=GetNofLocations() )
return 0;
return AliMp::PairFirst(fLLocations[i]);
}
Int_t AliMpPad::GetLocalBoardChannel(Int_t i) const
{
if ( !fLLocations || i<0 || i>=GetNofLocations() )
return 0;
return AliMp::PairSecond(fLLocations[i]);
}
Bool_t AliMpPad::HasLocation(Int_t localBoardId, Int_t localBoardChannel) const
{
MpPair_t location = AliMp::Pair(localBoardId, localBoardChannel);
if (fLLocation == location) return true;
for ( Int_t i=0; i<GetNofLocations(); i++ ) {
if ( GetLocation(i) == location ) return true;
}
return false;
}
ostream& operator<< (ostream &out, const AliMpPad& pad)
{
pad.PrintOn(out);
return out;
}