]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTrackerIO.cxx
Bug fix for loading the LUT for chambers 1 to 6. (Indra)
[u/mrichter/AliRoot.git] / MUON / AliMUONTrackerIO.cxx
index e7de71c475f0d49c0aaab1d19df89dd407cdea39..def0cdebfb68eddcb2b02aff4f001c51c3f07d2b 100644 (file)
@@ -15,6 +15,7 @@
 
 // $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>
@@ -52,12 +57,111 @@ AliMUONTrackerIO::~AliMUONTrackerIO()
   /// 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));
   
@@ -67,10 +171,31 @@ AliMUONTrackerIO::ReadPedestals(const char* filename, AliMUONVStore& pedStore)
     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) )
   {
@@ -79,12 +204,19 @@ AliMUONTrackerIO::ReadPedestals(const char* filename, AliMUONVStore& pedStore)
     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(),
@@ -96,8 +228,6 @@ AliMUONTrackerIO::ReadPedestals(const char* filename, AliMUONVStore& pedStore)
     ped->SetValueAsFloat(manuChannel,1,pedSigma);
     ++n;
   }
-  
-  in.close();
 
   return n;
 }
@@ -109,6 +239,8 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
 {
   /// 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 = "";
   
@@ -120,7 +252,29 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
     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;
@@ -131,7 +285,6 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
   Int_t* runs(0x0);
   Int_t* dac(0x0);
   Int_t nDAC(0);
-  Int_t iDAC(0);
   
   while ( in.getline(line,1024) )
   {
@@ -168,6 +321,7 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
             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);
@@ -194,6 +348,14 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
            &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));
@@ -202,7 +364,7 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
     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);
@@ -214,9 +376,7 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
     gain->SetValueAsInt(manuChannel,4,kSaturation);
     ++n;
   }
-  
-  in.close();
-  
+
   comment = "";
   
   if ( runNumber > 0 )
@@ -237,20 +397,44 @@ AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
 
 //_____________________________________________________________________________
 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]) ) 
@@ -260,8 +444,7 @@ AliMUONTrackerIO::ReadCapacitances(const char* file, AliMUONVStore& capaStore)
       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);
@@ -283,7 +466,118 @@ AliMUONTrackerIO::ReadCapacitances(const char* file, AliMUONVStore& capaStore)
     ++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;
+}
+