#include "AliMpMotifMap.h"
#include "AliCodeTimer.h"
#include "AliMpExMapIterator.h"
#include "AliMpVMotif.h"
#include "AliMpMotif.h"
#include "AliMpMotifSpecial.h"
#include "AliMpMotifType.h"
#include "AliMpMotifPosition.h"
#include "AliMpEncodePair.h"
#include "AliLog.h"
#include <Riostream.h>
#include <TArrayI.h>
using std::cout;
using std::endl;
using std::setw;
using std::ofstream;
using std::ios;
using std::ifstream;
ClassImp(AliMpMotifMap)
AliMpMotifMap::AliMpMotifMap()
: TObject(),
fMotifs(),
fMotifTypes(),
fMotifPositions(),
fMotifPositions2()
{
fMotifPositions2.SetOwner(false);
}
AliMpMotifMap::AliMpMotifMap(TRootIOCtor* ioCtor)
: TObject(),
fMotifs(ioCtor),
fMotifTypes(ioCtor),
fMotifPositions(ioCtor),
fMotifPositions2(ioCtor)
{
fMotifPositions2.SetOwner(false);
}
AliMpMotifMap::~AliMpMotifMap()
{
}
void AliMpMotifMap::PrintMotif(const AliMpVMotif* motif) const
{
cout << motif->GetID().Data() << " "
<< motif->GetMotifType()->GetID() << " "
<< motif->DimensionX() << " "
<< motif->DimensionY();
}
void AliMpMotifMap::PrintMotifType(const AliMpMotifType* motifType) const
{
cout << motifType->GetID().Data() << " "
<< motifType->GetNofPadsX() << " "
<< motifType->GetNofPadsY() << " ";
}
void AliMpMotifMap::PrintMotifPosition(
const AliMpMotifPosition* motifPosition) const
{
cout << " ID " << motifPosition->GetID() << " "
<< " Motif ID " << motifPosition->GetMotif()->GetID() << " "
<< " Pos (X,Y) = (" << motifPosition->GetPositionX() << ","
<< motifPosition->GetPositionY() << ")";
}
void AliMpMotifMap::PrintMotifPosition2(
const AliMpMotifPosition* motifPosition) const
{
cout << setw(3) << motifPosition->GetLowLimitIx() << " "
<< setw(3) << motifPosition->GetLowLimitIy() << " "
<< setw(3) << motifPosition->GetHighLimitIx() << " "
<< setw(3) << motifPosition->GetHighLimitIy() << " "
<< motifPosition->GetID() << " ";
}
void AliMpMotifMap::PrintMotifs() const
{
if (fMotifs.GetSize()) {
cout << "Dump of Motif Map - " << fMotifs.GetSize() << " entries:" << endl;
Int_t counter = 0;
AliMpExMapIterator* it = fMotifs.CreateIterator();
Int_t key;
AliMpVMotif* motif;
while ( ( motif = static_cast<AliMpVMotif*>(it->Next(key)) ) )
{
TString id = fMotifs.AliMpExMap::GetString(key);
cout << "Map element "
<< setw(3) << counter++ << " "
<< id.Data() << " " ;
PrintMotif(motif);
cout << endl;
}
cout << endl;
delete it;
}
}
void AliMpMotifMap::PrintMotifTypes() const
{
if (fMotifTypes.GetSize()) {
cout << "Dump of Motif Type Map - " << fMotifTypes.GetSize() << " entries:" << endl;
Int_t counter = 0;
AliMpExMapIterator* it = fMotifTypes.CreateIterator();
Int_t key;
AliMpMotifType* motifType;
while ( ( motifType = static_cast<AliMpMotifType*>(it->Next(key)) ) )
{
TString id = AliMpExMap::GetString(key);
cout << "Map element "
<< setw(3) << counter++ << " "
<< id.Data() << " " ;
PrintMotifType(motifType);
cout << endl;
}
cout << endl;
delete it;
}
}
void
AliMpMotifMap::GetAllMotifPositionsIDs(TArrayI& ecn) const
{
ecn.Set(fMotifPositions.GetSize());
TIter next(fMotifPositions.CreateIterator());
AliMpMotifPosition* motifPosition;
Int_t i(0);
while ( ( motifPosition = static_cast<AliMpMotifPosition*>(next()) ) )
{
ecn[i] = motifPosition->GetID();
++i;
}
}
UInt_t AliMpMotifMap::GetNofMotifPositions() const
{
return fMotifPositions.GetSize();
}
AliMpMotifPosition* AliMpMotifMap::GetMotifPosition(UInt_t index) const
{
AliCodeTimerAuto("",0);
if ( index >= GetNofMotifPositions() ) {
AliErrorStream() << "Index " << index << " outside limits." << endl;
return 0;
}
TIter next(fMotifPositions.CreateIterator());
while (index-- > 0) next();
return static_cast<AliMpMotifPosition*>(next());
}
Int_t AliMpMotifMap::CalculateNofPads() const
{
Int_t nofPads = 0;
TIter next(fMotifPositions.CreateIterator());
AliMpMotifPosition* motifPosition;
while ( ( motifPosition = static_cast<AliMpMotifPosition*>(next()) ) )
{
nofPads += motifPosition->GetMotif()->GetMotifType()->GetNofPads();
}
return nofPads;
}
void AliMpMotifMap::PrintMotifPositions() const
{
if (fMotifPositions.GetSize()) {
cout << "Dump of Motif Position Map - " << fMotifPositions.GetSize() << " entries:" << endl;
Int_t counter = 0;
TIter next(fMotifPositions.CreateIterator());
AliMpMotifPosition* motifPosition;
while ( ( motifPosition = static_cast<AliMpMotifPosition*>(next()) ) )
{
cout << "Map element "
<< setw(3) << counter++ << " ";
PrintMotifPosition(motifPosition);
cout << endl;
}
cout << endl;
}
}
void AliMpMotifMap::PrintMotifPositions2() const
{
if (fMotifPositions2.GetSize())
{
cout << "Dump of Motif Position Map 2 - " << fMotifPositions2.GetSize() << " entries:" << endl;
TIter next(fMotifPositions2.CreateIterator());
AliMpMotifPosition* motifPosition(0x0);
Int_t counter = 0;
while ( ( motifPosition = static_cast<AliMpMotifPosition*>(next()) ) )
{
cout << "Map element " << setw(3) << counter++ << " ";
PrintMotifPosition2(motifPosition);
cout << endl;
}
cout << endl;
}
}
Bool_t AliMpMotifMap::AddMotif(AliMpVMotif* motif, Bool_t warn)
{
AliMpVMotif* found = FindMotif(motif->GetID());
if (found) {
if (warn && found == motif)
AliWarningStream() << "The motif is already in map." << endl;
if (warn && found != motif) {
AliWarningStream()
<< "Another motif with the same ID is already in map." << endl;
}
return false;
}
fMotifs.Add(motif->GetID(), motif);
return true;
}
Bool_t AliMpMotifMap::AddMotifType(AliMpMotifType* motifType, Bool_t warn)
{
AliMpMotifType* found = FindMotifType(motifType->GetID());
if (found) {
if (warn && found == motifType)
AliWarningStream() << "The motif type is already in map." << endl;
if (warn && found != motifType) {
AliWarningStream()
<< "Another motif type with the same ID is already in map." << endl;
}
return false;
}
fMotifTypes.Add(motifType->GetID(), motifType);
return true;
}
Bool_t AliMpMotifMap::AddMotifPosition(AliMpMotifPosition* motifPosition, Bool_t warn)
{
AliMpMotifPosition* found = FindMotifPosition(motifPosition->GetID());
if (found) {
if (warn && found == motifPosition) {
AliWarningStream()
<< "ID: " << motifPosition->GetID()
<< " found: " << found
<< " new: " << motifPosition << endl
<< "This motif position is already in map." << endl;
}
if (warn && found != motifPosition) {
AliWarningStream()
<< "ID: " << motifPosition->GetID()
<< " found: " << found
<< " new: " << motifPosition << endl
<< "Another motif position with the same ID is already in map."
<< endl;
}
return false;
}
fMotifPositions.Add(motifPosition->GetID() << 16, motifPosition);
return true;
}
void AliMpMotifMap::FillMotifPositionMap2()
{
if (fMotifPositions2.GetSize() > 0 ) {
AliWarningStream() <<"Map has been already filled." << endl;
return;
}
TIter next(fMotifPositions.CreateIterator());
AliMpMotifPosition* motifPosition(0x0);
while ( ( motifPosition = static_cast<AliMpMotifPosition*>(next()) ) )
{
fMotifPositions2.Add(motifPosition->GetLowLimitIx(),
motifPosition->GetLowLimitIy(),
motifPosition);
}
}
void AliMpMotifMap::Print(const char* opt) const
{
TString sopt(opt);
sopt.ToUpper();
if ( sopt.Contains("MOTIFS") || sopt == "ALL" ) PrintMotifs();
if ( sopt.Contains("MOTIFTYPES") || sopt == "ALL" ) PrintMotifTypes();
if ( sopt.Contains("MOTIFPOSITIONS") || sopt == "ALL" ) PrintMotifPositions();
if ( sopt.Contains("MOTIFPOSITIONS2") || sopt == "ALL" ) PrintMotifPositions2();
}
void AliMpMotifMap::PrintGlobalIndices(const char* fileName) const
{
ofstream out(fileName, ios::out);
if (fMotifPositions.GetSize()) {
TIter next(fMotifPositions.CreateIterator());
AliMpMotifPosition* motifPosition;
while ( ( motifPosition = static_cast<AliMpMotifPosition*>(next()) ) )
{
out << setw(5) << motifPosition->GetID() << " "
<< setw(3) << motifPosition->GetLowLimitIx() << " "
<< setw(3) << motifPosition->GetLowLimitIy()
<< endl;
}
out << endl;
}
}
void AliMpMotifMap::UpdateGlobalIndices(const char* fileName)
{
ifstream in(fileName, ios::in);
Int_t motifPositionId, offx, offy;
do {
in >> motifPositionId >> offx >> offy;
if (in.eof()) {
FillMotifPositionMap2();
return;
}
AliMpMotifPosition* motifPosition = FindMotifPosition(motifPositionId);
if (motifPosition) {
AliDebugStream(1)
<< "Processing "
<< motifPosition->GetID() << " " << offx << " " << offy << endl;
motifPosition->SetLowIndicesLimit(offx, offy);
Int_t offx2
= offx + motifPosition->GetMotif()->GetMotifType()->GetNofPadsX() - 1;
Int_t offy2
= offy + motifPosition->GetMotif()->GetMotifType()->GetNofPadsY() - 1;
motifPosition->SetHighIndicesLimit(offx2, offy2);
}
else {
AliWarningStream()
<< "Motif position " << motifPositionId << " not found" << endl;
}
}
while (!in.eof());
}
AliMpVMotif* AliMpMotifMap::FindMotif(const TString& motifID) const
{
return (AliMpVMotif*)fMotifs.GetValue(motifID);
}
AliMpVMotif* AliMpMotifMap::FindMotif(const TString& motifID,
const TString& motifTypeID,
Double_t padDimensionX,
Double_t padDimensionY ) const
{
AliMpVMotif* motif = FindMotif(motifID);
if (motif && motif->GetMotifType()->GetID() != motifTypeID) {
AliFatal("Motif has been already defined with a different type.");
return 0;
}
if ( motif &&
dynamic_cast<AliMpMotif*>(motif) &&
( motif->GetPadDimensionX(0) != padDimensionX ||
motif->GetPadDimensionY(0) != padDimensionY ) ) {
AliFatal("Motif type has been already defined with different dimensions.");
return 0;
}
if ( motif &&
( padDimensionX == 0. && padDimensionY == 0.) &&
! dynamic_cast<AliMpMotifSpecial*>(motif) ) {
AliFatal("Motif type has been already defined with different dimensions.");
return 0;
}
return motif;
}
AliMpMotifType* AliMpMotifMap::FindMotifType(const TString& motifTypeID) const
{
return (AliMpMotifType*)fMotifTypes.GetValue(motifTypeID);
}
AliMpMotifPosition*
AliMpMotifMap::FindMotifPosition(Int_t motifPositionID) const
{
return (AliMpMotifPosition*)fMotifPositions.GetValue(motifPositionID << 16);
}