#include <cstdlib>
#include "AliMpDEStore.h"
#include "AliMpDEManager.h"
#include "AliMpDetElement.h"
#include "AliMpConstants.h"
#include "AliMpFiles.h"
#include "AliMpDataStreams.h"
#include "AliMpHelper.h"
#include "AliMpConstants.h"
#include "AliMpExMapIterator.h"
#include "AliLog.h"
#include <Riostream.h>
#include <TClass.h>
#include <TSystem.h>
#include <TObjString.h>
#include <TObjArray.h>
#include <TMap.h>
ClassImp(AliMpDEStore)
AliMpDEStore* AliMpDEStore::fgInstance = 0;
const char AliMpDEStore::fgkCommentPrefix = '#';
AliMpDEStore* AliMpDEStore::Instance(Bool_t warn)
{
if ( ! fgInstance && warn ) {
AliWarningClass("DE Store has not been loaded");
}
return fgInstance;
}
AliMpDEStore* AliMpDEStore::ReadData(const AliMpDataStreams& dataStreams,
Bool_t warn)
{
if ( fgInstance ) {
if ( warn )
AliWarningClass("DE Store has been already loaded");
return fgInstance;
}
if ( dataStreams.GetReadFromFiles() )
AliInfoClass("Reading DE Store from ASCII files.");
fgInstance = new AliMpDEStore(dataStreams);
return fgInstance;
}
AliMpDEStore::AliMpDEStore(const AliMpDataStreams& dataStreams)
: TObject(),
fDetElements()
{
AliDebug(1,"");
fDetElements.SetOwner(true);
FillDEs(dataStreams);
}
AliMpDEStore::AliMpDEStore(TRootIOCtor* ioCtor)
: TObject(),
fDetElements(ioCtor)
{
AliDebug(1,"");
fgInstance = this;
}
AliMpDEStore::~AliMpDEStore()
{
AliDebug(1,"");
fgInstance = 0;
}
Bool_t AliMpDEStore::IsPlaneType(const TString& planeTypeName)
{
if ( planeTypeName == PlaneTypeName(AliMp::kBendingPlane) ||
planeTypeName == PlaneTypeName(AliMp::kNonBendingPlane) )
return true;
return false;
}
Bool_t
AliMpDEStore::ReadDENames(const AliMpDataStreams& dataStreams,
AliMp::StationType station,
AliMq::Station12Type station12)
{
istream& in
= dataStreams.
CreateDataStream(AliMpFiles::DENamesFilePath(station, station12));
char line[80];
TString word;
TString cathName1, cathName2;
in >> word;
while ( ! in.eof() && cathName1.Length() == 0 ) {
if ( word[0] == '#' )
in.getline(line, 80);
else {
cathName1 = word;
in >> cathName2;
}
in >> word;
}
Bool_t isCathNameDefined = false;
if ( IsPlaneType(cathName1) && IsPlaneType(cathName2) )
isCathNameDefined = true;
Int_t detElemId;
TString name, name0, name1, name2;
AliMp::PlaneType planeForCathode[2];
while ( ! in.eof() )
{
if ( word[0] == '#' )
{
in.getline(line, 80);
}
else
{
detElemId = word.Atoi();
in >> name;
in >> name0;
if ( name0.Contains(PlaneTypeName(AliMp::kNonBendingPlane)) )
{
planeForCathode[0] = AliMp::kNonBendingPlane;
}
else
{
planeForCathode[0] = AliMp::kBendingPlane;
}
if ( !isCathNameDefined )
{
in >> name2;
name1 = name0;
Ssiz_t pos = name1.First(AliMpDetElement::GetNameSeparator());
name0 = name1(0,pos);
planeForCathode[1] = OtherPlaneType(planeForCathode[0]);
}
else
{
name1 = name0 + AliMpDetElement::GetNameSeparator() + cathName1;
name2 = name0 + AliMpDetElement::GetNameSeparator() + cathName2;
if ( name2.Contains(PlaneTypeName(AliMp::kNonBendingPlane)) )
{
planeForCathode[1] = AliMp::kNonBendingPlane;
}
else
{
planeForCathode[1] = AliMp::kBendingPlane;
}
}
if ( planeForCathode[0]==planeForCathode[1] )
{
AliFatalClass(Form("Got the same cathode type for both planes"
" of DetElemId %d",detElemId));
}
AliMpDetElement* detElement = new AliMpDetElement(detElemId, name, name0, planeForCathode[0]);
if ( ! fDetElements.GetValue(detElemId) )
{
AliDebugClassStream(3)
<< "Adding DE name " << detElemId << " " << name << endl;
fDetElements.Add(detElemId, detElement);
}
else
{
AliWarningClassStream()
<< "Det element " << detElemId << " " << name << " already defined." << endl;
}
}
in >> word;
}
delete ∈
return true;
}
void AliMpDEStore::FillDEs(const AliMpDataStreams& dataStreams)
{
AliDebugClass(2,"");
Bool_t result1 = ReadDENames(dataStreams, AliMp::kStation12, AliMq::kStation1);
Bool_t result2 = ReadDENames(dataStreams, AliMp::kStation12, AliMq::kStation2);
Bool_t result3 = ReadDENames(dataStreams, AliMp::kStation345);
Bool_t result4 = ReadDENames(dataStreams, AliMp::kStationTrigger);
Bool_t result = result1 && result2 && result3 && result4;
if ( ! result ) {
AliErrorClassStream() << "Error in reading DE names files" << endl;
}
AliDebug(1,Form("%d detection elements were read in",fDetElements.GetSize()));
}
AliMpDetElement* AliMpDEStore::GetDetElement(Int_t detElemId, Bool_t warn) const
{
AliMpDetElement* detElement
= (AliMpDetElement*)fDetElements.GetValue(detElemId);
if ( ! detElement && warn ) {
AliErrorClassStream()
<< "Detection element " << detElemId << " not defined." << endl;
}
return detElement;
}
AliMpDetElement* AliMpDEStore::GetDetElement(const TString& deName, Bool_t warn) const
{
TIter next(fDetElements.CreateIterator());
AliMpDetElement* detElement;
while ( ( detElement = static_cast<AliMpDetElement*>(next()) ) )
{
if (deName.CompareTo(detElement->GetDEName()) == 0)
return detElement;
}
if (warn) {
AliErrorClassStream()
<< "Detection element with name" << deName.Data() << " not defined." << endl;
}
return 0x0;
}