// $Id$
+#include <cstdlib>
#include "AliMUONTrackerIO.h"
/// \class AliMUONTrackerIO
ClassImp(AliMUONTrackerIO)
/// \endcond
+#include "AliDCSValue.h"
#include "AliLog.h"
+#include "AliMUONCalibParamND.h"
#include "AliMUONCalibParamNF.h"
#include "AliMUONVStore.h"
#include "AliMpConstants.h"
#include "AliMpDDLStore.h"
+#include "AliMpDEManager.h"
+#include "AliMpDetElement.h"
#include <Riostream.h>
#include <TClass.h>
#include <TObjString.h>
/// dtor
}
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::ReadOccupancy(const char* filename,AliMUONVStore& occupancyMap)
+{
+ /// Read occupancy file created by online DA
+ /// and append values to the occupancyMap store.
+ /// Expected format of the file is :
+ /// busPatchId manuId sumofn nevt
+
+ TString sFilename(gSystem->ExpandPathName(filename));
+
+ std::ifstream in(sFilename.Data());
+ if (!in.good())
+ {
+ return kCannotOpenFile;
+ }
+
+ TString datastring;
+ ostringstream stream;
+ char line[1024];
+ while ( in.getline(line,1024) )
+ stream << line << "\n";
+
+ in.close();
+
+ return DecodeOccupancy(stream.str().c_str(),occupancyMap);
+
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::DecodeOccupancy(const char* data, AliMUONVStore& occupancyMap)
+{
+ /// Decode occupancy string created append values to the occupancyMap store.
+ /// Expected format of the file is :
+ /// busPatchId manuId sumofn nevt
+
+ if ( ! AliMpDDLStore::Instance(kFALSE) )
+ {
+ AliErrorClass("Mapping not loaded. Cannot work");
+ return 0;
+ }
+
+ char line[1024];
+ istringstream in(data);
+
+ Int_t n(0);
+
+ while ( in.getline(line,1024) )
+ {
+ AliDebugClass(3,Form("line=%s",line));
+ if ( line[0] == '/' && line[1] == '/' ) continue;
+ std::istringstream sin(line);
+
+ Int_t busPatchId, manuId;
+ Int_t numberOfEvents;
+ Double_t sumn;
+
+ sin >> busPatchId >> manuId >> sumn >> numberOfEvents;
+
+ Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(busPatchId);
+
+ AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
+
+ Int_t numberOfChannelsInManu = -1;
+
+ if (de) numberOfChannelsInManu = de->NofChannelsInManu(manuId);
+
+ if ( numberOfChannelsInManu <= 0 )
+ {
+ AliErrorClass(Form("BP %5d DE %5d MANU %5d nchannels=%d",busPatchId,detElemId,manuId,numberOfChannelsInManu));
+ continue;
+ }
+
+ AliMUONVCalibParam* occupancy =
+ static_cast<AliMUONVCalibParam*>(occupancyMap.FindObject(detElemId,manuId));
+ if (occupancy)
+ {
+ AliErrorClass(Form("DE %5d MANU %5d is already there ?!",detElemId,manuId));
+ continue;
+ }
+
+ occupancy = new AliMUONCalibParamND(5,1,detElemId,manuId,0);
+
+ occupancyMap.Add(occupancy);
+
+ occupancy->SetValueAsDouble(0,0,sumn);
+ occupancy->SetValueAsDouble(0,1,sumn); // with only 0 and 1s, sumw = sumw2 = sumn
+ occupancy->SetValueAsDouble(0,2,sumn);
+ occupancy->SetValueAsInt(0,3,numberOfChannelsInManu);
+ occupancy->SetValueAsInt(0,4,numberOfEvents);
+ ++n;
+ }
+
+ return n;
+}
+
//_____________________________________________________________________________
Int_t
AliMUONTrackerIO::ReadPedestals(const char* filename, AliMUONVStore& pedStore)
{
/// Read pedestal file (produced by the MUONTRKda.exe program for instance)
/// and append the read values into the given VStore
+ /// To be used when the input is a file (for instance when reading data
+ /// from the OCDB).
TString sFilename(gSystem->ExpandPathName(filename));
return kCannotOpenFile;
}
+ ostringstream stream;
+ char line[1024];
+ while ( in.getline(line,1024) )
+ stream << line << "\n";
+
+ in.close();
+
+ return DecodePedestals(stream.str().c_str(),pedStore);
+
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::DecodePedestals(const char* data, AliMUONVStore& pedStore)
+{
+ /// Read pedestal Data (produced by the MUONTRKda.exe program for instance)
+ /// and append the read values into the given VStore
+ /// To be used when the input is a TString (for instance when getting data
+ /// from AMORE DB).
+
char line[1024];
Int_t busPatchID, manuID, manuChannel;
Float_t pedMean, pedSigma;
Int_t n(0);
+ istringstream in(data);
while ( in.getline(line,1024) )
{
std::istringstream sin(line);
sin >> busPatchID >> manuID >> manuChannel >> pedMean >> pedSigma;
Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
+
+ if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
+ {
+ AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
+ detElemID,busPatchID,manuID));
+ continue;
+ }
+
AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d MEAN %7.2f SIGMA %7.2f",
busPatchID,detElemID,manuID,manuChannel,pedMean,pedSigma));
-
+
AliMUONVCalibParam* ped =
static_cast<AliMUONVCalibParam*>(pedStore.FindObject(detElemID,manuID));
-
if (!ped)
{
ped = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),
ped->SetValueAsFloat(manuChannel,1,pedSigma);
++n;
}
-
- in.close();
return n;
}
{
/// Read gain file (produced by the MUONTRKda.exe program for instance)
/// and append the read values into the given VStore
+ /// To be used when the input is a file (for instance when reading data
+ /// from the OCDB).
comment = "";
return kCannotOpenFile;
}
+ ostringstream stream;
+ char line[1024];
+ while ( in.getline(line,1024) )
+ stream << line << "\n";
+
+ in.close();
+
+ return DecodeGains(stream.str().c_str(),gainStore,comment);
+
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::DecodeGains(const char* data, AliMUONVStore& gainStore,
+ TString& comment)
+{
+ /// Read gain file (produced by the MUONTRKda.exe program for instance)
+ /// and append the read values into the given VStore
+ /// To be used when the input is a string (for instance when getting data
+ /// from AMORE DB).
+
char line[1024];
+ istringstream in(data);
Int_t busPatchID, manuID, manuChannel;
Float_t a0, a1;
Int_t thres;
Int_t* runs(0x0);
Int_t* dac(0x0);
Int_t nDAC(0);
- Int_t iDAC(0);
while ( in.getline(line,1024) )
{
in.getline(line,1024);
in.getline(line,1024);
// then get run and dac values
+ Int_t iDAC(0);
for ( Int_t i = 0; i < nDAC; ++i )
{
in.getline(line,1024);
&a0,&a1,&thres,&qual);
AliDebugClass(3,Form("line=%s",line));
Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
+
+ if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
+ {
+ AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
+ detElemID,busPatchID,manuID));
+ continue;
+ }
+
AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d A0 %7.2f "
"A1 %e THRES %5d QUAL %x",
busPatchID,detElemID,manuID,manuChannel,a0,a1,thres,qual));
AliMUONVCalibParam* gain =
static_cast<AliMUONVCalibParam*>(gainStore.FindObject(detElemID,manuID));
- if (!gain)
+ if (!gain)
{
gain = new AliMUONCalibParamNF(5,AliMpConstants::ManuNofChannels(),detElemID,manuID,0);
gainStore.Add(gain);
gain->SetValueAsInt(manuChannel,4,kSaturation);
++n;
}
-
- in.close();
-
+
comment = "";
if ( runNumber > 0 )
//_____________________________________________________________________________
Int_t
-AliMUONTrackerIO::ReadCapacitances(const char* file, AliMUONVStore& capaStore)
+AliMUONTrackerIO::ReadCapacitances(const char* filename, AliMUONVStore& capaStore)
{
/// Read capacitance file
/// and append the read values into the given VStore
- ifstream in(gSystem->ExpandPathName(file));
- if (in.bad()) return kCannotOpenFile;
+ TString sFilename(gSystem->ExpandPathName(filename));
+
+ std::ifstream in(sFilename.Data());
+ if (!in.good())
+ {
+ return kCannotOpenFile;
+ }
+
+ ostringstream stream;
+ char line[1024];
+ while ( in.getline(line,1024) )
+ stream << line << "\n";
+
+ in.close();
+
+ return DecodeCapacitances(stream.str().c_str(),capaStore);
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::DecodeCapacitances(const char* data, AliMUONVStore& capaStore)
+{
+ /// Read capacitances and append the read values into the given VStore
+ /// To be used when the input is a string (for instance when getting data
+ /// from AMORE DB).
Int_t ngenerated(0);
char line[1024];
Int_t serialNumber(-1);
AliMUONVCalibParam* param(0x0);
-
+ istringstream in(data);
+
while ( in.getline(line,1024,'\n') )
{
if ( isdigit(line[0]) )
if (param)
{
AliErrorClass(Form("serialNumber %d appears several times !",serialNumber));
- capaStore.Clear();
- break;
+ continue;
}
param = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),serialNumber,0,1.0);
Bool_t ok = capaStore.Add(param);
++ngenerated;
}
+ return ngenerated;
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::ReadConfig(const char* filename, AliMUONVStore& confStore, Bool_t& changed)
+{
+ /// Read config file (produced by the MUONTRKda.exe program for instance)
+ /// and append the read values into the given VStore
+ /// To be used when the input is a file (for instance when reading data
+ /// from the OCDB).
+ /// changed must be set to kFALSE before calling this method for the first time
+ /// (then the subsequent calls must not set it !)
+ ///
+
+ TString sFilename(gSystem->ExpandPathName(filename));
+
+ std::ifstream in(sFilename.Data());
+ if (!in.good())
+ {
+ return kCannotOpenFile;
+ }
+
+ ostringstream stream;
+ char line[1024];
+ while ( in.getline(line,1024) )
+ stream << line << "\n";
+
in.close();
- return ngenerated;
+ return DecodeConfig(stream.str().c_str(),confStore,changed);
}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::DecodeConfig(const char* data, AliMUONVStore& confStore, Bool_t& changed)
+{
+ /// Read config data (produced by the MUONTRKda.exe program for instance)
+ /// and append the read values into the given VStore
+ /// To be used when the input is a TString (for instance when getting data
+ /// from AMORE DB).
+ /// changed must be set to kFALSE before calling this method for the first time
+ /// (then the subsequent calls must not set it !)
+
+ char line[1024];
+ Int_t busPatchID, manuID;
+ Int_t n(0);
+ istringstream in(data);
+
+ while ( in.getline(line,1024) )
+ {
+ AliDebugClass(3,Form("line=%s",line));
+ if ( line[0] == '#' )
+ {
+ TString sline(line);
+ sline.ToUpper();
+ if (sline.Contains("CHANGED") && !sline.Contains("UNCHANGED")) changed = kTRUE;
+ continue;
+ }
+ std::istringstream sin(line);
+ sin >> busPatchID >> manuID;
+
+ Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
+
+ if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
+ {
+ AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
+ detElemID,busPatchID,manuID));
+ continue;
+ }
+
+ AliMUONVCalibParam* conf =
+ static_cast<AliMUONVCalibParam*>(confStore.FindObject(detElemID,manuID));
+ if (!conf)
+ {
+ conf = new AliMUONCalibParamNF(1,1,detElemID,manuID,1);
+ confStore.Add(conf);
+ }
+ ++n;
+ }
+
+ return n;
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::WriteConfig(ofstream& out, const AliMUONVStore& confStore)
+{
+ /// Write the conf store as an ASCII file
+ /// Note that we are converting (back) the detElemId into a busPatchId
+ /// Return the number of lines written
+
+ if ( !AliMpDDLStore::Instance() )
+ {
+ cout << "ERROR: mapping not loaded. Cannot work" << endl;
+ return 0;
+ }
+
+ TIter next(confStore.CreateIterator());
+ AliMUONVCalibParam* param;
+ Int_t n(0);
+
+ while ( (param=static_cast<AliMUONVCalibParam*>(next())) )
+ {
+ Int_t detElemId = param->ID0();
+ Int_t manuId = param->ID1();
+
+ Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
+ ++n;
+
+ out << busPatchId << " " << manuId << endl;
+ }
+ return n;
+}
+