]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONCDB.cxx
Temporary mod for CMake
[u/mrichter/AliRoot.git] / MUON / AliMUONCDB.cxx
index e1ac639f93ffd441737059d2fccaa4dd5a0ff37e..7ccf9f7ffb6a7a55085a7d5324b6c873464c8f2e 100644 (file)
@@ -15,6 +15,7 @@
 
 /* $Id$ */
 
+//-----------------------------------------------------------------------------
 /// \class AliMUONCDB
 ///
 /// Helper class to experience the OCDB
 /// For more information, please see READMECDB
 ///
 // \author Laurent Aphecetche
+//-----------------------------------------------------------------------------
 
 #include "AliMUONCDB.h"
 
-#include "AliCDBEntry.h"
-#include "AliCDBManager.h"
-#include "AliDCSValue.h"
-#include "AliLog.h"
 #include "AliMUON1DArray.h"
 #include "AliMUON1DMap.h"
 #include "AliMUON2DMap.h"
 #include "AliMUONCalibParamNF.h"
 #include "AliMUONCalibParamNI.h"
 #include "AliMUONConstants.h"
-#include "AliMUONHVNamer.h"
+#include "AliMUONTrackerIO.h"
 #include "AliMUONTriggerEfficiencyCells.h"
 #include "AliMUONTriggerLut.h"
 #include "AliMUONVStore.h"
 #include "AliMUONVCalibParam.h"
 #include "AliMUONVCalibParam.h"
+#include "AliMUONGlobalCrateConfig.h"
+#include "AliMUONRegionalTriggerConfig.h"
+
+#include "AliMpCDB.h"
 #include "AliMpConstants.h"
 #include "AliMpDDLStore.h"
-#include "AliMpDEIterator.h"
+#include "AliMpManuStore.h"
 #include "AliMpDEManager.h"
 #include "AliMpDetElement.h"
-#include "AliMpManuList.h"
+#include "AliMpFiles.h"
+#include "AliMpHVNamer.h"
+#include "AliMpManuIterator.h"
 #include "AliMpSegmentation.h"
 #include "AliMpStationType.h"
 #include "AliMpVSegmentation.h"
+
+#include "AliCodeTimer.h"
+#include "AliCDBEntry.h"
+#include "AliCDBManager.h"
+#include "AliDCSValue.h"
+#include "AliLog.h"
+
 #include <Riostream.h>
 #include <TArrayI.h>
 #include <TClass.h>
@@ -65,6 +76,8 @@
 #include <TRandom.h>
 #include <TStopwatch.h>
 #include <TSystem.h>
+#include <TMath.h>
+
 
 /// \cond CLASSIMP
 ClassImp(AliMUONCDB)
@@ -72,15 +85,25 @@ ClassImp(AliMUONCDB)
 
 namespace
 {
-//_____________________________________________________________________________
-void getBoundaries(const AliMUONVStore& store,
-                   Float_t& x0min, Float_t& x0max,
-                   Float_t& x1min, Float_t& x1max)
+  //_____________________________________________________________________________
+AliMUONVStore* Create2DMap()
 {
-  x0min=1E30;
-  x0max=-1E30;
-  x1min=1E30;
-  x1max=-1E30;
+  return new AliMUON2DMap(true);
+}
+
+  //_____________________________________________________________________________
+void getBoundaries(const AliMUONVStore& store, Int_t dim,
+                   Float_t* xmin, Float_t* xmax)
+{
+  /// Assuming the store contains AliMUONVCalibParam objects, compute the
+  /// limits of the value contained in the VCalibParam, for each of its dimensions
+  /// xmin and xmax must be of dimension dim
+  
+  for ( Int_t i = 0; i < dim; ++i ) 
+  {
+    xmin[i]=1E30;
+    xmax[i]=-1E30;
+  }
   
   TIter next(store.CreateIterator());
   AliMUONVCalibParam* value;
@@ -98,18 +121,42 @@ void getBoundaries(const AliMUONVStore& store,
       AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,manuChannel),kFALSE);
       if (!pad.IsValid()) continue;
       
-      Float_t x0 = value->ValueAsFloat(manuChannel,0);
-      
-      x0min = TMath::Min(x0min,x0);
-      x0max = TMath::Max(x0max,x0);
-      if ( value->Dimension()>1 )
+      for ( Int_t i = 0; i < dim; ++i ) 
       {
-        Float_t x1 = value->ValueAsFloat(manuChannel,1);
-        x1min = TMath::Min(x1min,x1);
-        x1max = TMath::Max(x1max,x1);
+        Float_t x0 = value->ValueAsFloat(manuChannel,i);
+      
+        xmin[i] = TMath::Min(xmin[i],x0);
+        xmax[i] = TMath::Max(xmax[i],x0);
       }
     }
-  }  
+  }
+
+  for ( Int_t i = 0; i < dim; ++i ) 
+  {
+    if ( TMath::Abs(xmin[i]-xmax[i]) < 1E-3 ) 
+    {
+      xmin[i] -= 1;
+      xmax[i] += 1;
+    }
+  }
+}
+
+//_____________________________________________________________________________
+Double_t GetRandom(Double_t mean, Double_t sigma, Bool_t mustBePositive)
+{
+  Double_t x(-1);
+  if ( mustBePositive ) 
+  {
+    while ( x < 0 ) 
+    {
+      x = gRandom->Gaus(mean,sigma);
+    }
+  }
+  else
+  {
+    x = gRandom->Gaus(mean,sigma);
+  }
+  return x;
 }
 
 }
@@ -118,30 +165,23 @@ void getBoundaries(const AliMUONVStore& store,
 AliMUONCDB::AliMUONCDB(const char* cdbpath)
 : TObject(),
   fCDBPath(cdbpath),
-  fManuList(0x0)
+  fMaxNofChannelsToGenerate(-1)
 {
-    /// ctor
+  /// ctor
+    // Load mapping
+    if ( ! AliMpCDB::LoadDDLStore() ) {
+      AliFatal("Could not access mapping from OCDB !");
+    }
+
+    if ( ! AliMpCDB::LoadManuStore() ) {
+      AliFatal("Could not access run-dependent mapping from OCDB !");
+    }
 }
 
 //_____________________________________________________________________________
 AliMUONCDB::~AliMUONCDB()
 {
   /// dtor
-  delete fManuList;
-}
-
-//_____________________________________________________________________________
-TList*
-AliMUONCDB::ManuList()
-{
-  /// return (and create if necessary) the list of (de,manu) pairs
-  if (!fManuList) 
-  {
-    AliInfo("Generating ManuList...");
-    fManuList = AliMpManuList::ManuList();
-    AliInfo("Manu List generated.");
-  }
-  return fManuList;
 }
 
 //_____________________________________________________________________________
@@ -152,14 +192,16 @@ AliMUONCDB::Diff(AliMUONVStore& store1, AliMUONVStore& store2,
   /// creates a store which contains store1-store2
   /// if opt="abs" the difference is absolute one,
   /// if opt="rel" then what is stored is (store1-store2)/store1
+  /// if opt="percent" then what is stored is rel*100
+  ///
   /// WARNING Works only for stores which holds AliMUONVCalibParam objects
   
   TString sopt(opt);
   sopt.ToUpper();
   
-  if ( !sopt.Contains("ABS") && !sopt.Contains("REL") )
+  if ( !sopt.Contains("ABS") && !sopt.Contains("REL") && !sopt.Contains("PERCENT") )
   {
-    AliErrorClass(Form("opt %s not supported. Only ABS or REL are",opt));
+    AliErrorClass(Form("opt %s not supported. Only ABS, REL, PERCENT are",opt));
     return 0x0;
   }
   
@@ -192,7 +234,7 @@ AliMUONCDB::Diff(AliMUONVStore& store1, AliMUONVStore& store2,
         {
           value = param->ValueAsFloat(i,j) - param2->ValueAsFloat(i,j);
         }
-        else if ( sopt.Contains("REL") )
+        else if ( sopt.Contains("REL") || sopt.Contains("PERCENT") )
         {
           if ( param->ValueAsFloat(i,j) ) 
           {
@@ -202,6 +244,7 @@ AliMUONCDB::Diff(AliMUONVStore& store1, AliMUONVStore& store2,
           {
             continue;
           }
+          if ( sopt.Contains("PERCENT") ) value *= 100.0;
         }
         param->SetValueAsFloat(i,j,value);
       }      
@@ -214,89 +257,67 @@ AliMUONCDB::Diff(AliMUONVStore& store1, AliMUONVStore& store2,
 void 
 AliMUONCDB::Plot(const AliMUONVStore& store, const char* name, Int_t nbins)
 {
-  /// Make a plot of the first 1 or 2 dimensions of the AliMUONVCalibParam
+  /// Make histograms of each dimension of the AliMUONVCalibParam
   /// contained inside store.
   /// It produces histograms named name_0, name_1, etc...
   
-  Float_t x0min, x0max, x1min, x1max;
-  
-  getBoundaries(store,x0min,x0max,x1min,x1max);
-  
-  if ( x0min > x0max ) 
-  {
-    cerr << Form("Something is wrong with boundaries : x0(min,max)=%e,%e",
-                 x0min,x0max) << endl;
-    return;
-  }
-
-  if ( TMath::Abs(x0min-x0max) < 1E-3 ) 
-  {
-    x0min -= 1;
-    x0max += 1;
-  }
-  
-  TH1* h0 = new TH1F(Form("%s_0",name),Form("%s_0",name),
-                    nbins,x0min,x0max);
-  
-  TH1* h1(0);
-  
-  if ( x1max > x1min )
-  {
-    h1 = new TH1F(Form("%s_1",name),Form("%s_1",name),
-                  nbins,x1min,x1max);
-  }
-  
-  TIter next(ManuList());
-  AliMpIntPair* p;
+  TIter next(store.CreateIterator());
+  AliMUONVCalibParam* param;
   Int_t n(0);
-  Int_t nPerStation[7];
+  const Int_t kNStations = AliMpConstants::NofTrackingChambers()/2;
+  Int_t* nPerStation = new Int_t[kNStations];
+  TH1** h(0x0);
   
-  for ( Int_t i = 0; i < 7; ++i ) nPerStation[i]=0;
+  for ( Int_t i = 0; i < kNStations; ++i ) nPerStation[i]=0;
   
-  while ( ( p = (AliMpIntPair*)next() ) )
+  while ( ( param = static_cast<AliMUONVCalibParam*>(next()) ) )
   {
-    Int_t detElemId = p->GetFirst();
-    Int_t manuId = p->GetSecond();
-    Int_t station = AliMpDEManager::GetChamberId(detElemId);
+    if (!h)
+    {
+      Int_t dim = param->Dimension();
+      h = new TH1*[dim];
+      Float_t* xmin = new Float_t[dim];
+      Float_t* xmax = new Float_t[dim];
+      getBoundaries(store,dim,xmin,xmax);
+      
+      for ( Int_t i = 0; i < dim; ++i ) 
+      {
+        h[i] = new TH1F(Form("%s_%d",name,i),Form("%s_%d",name,i),
+                            nbins,xmin[i],xmax[i]);
+        AliInfo(Form("Created histogram %s",h[i]->GetName()));
+      }
+    }
+    
+    Int_t detElemId = param->ID0();
+    Int_t manuId = param->ID1();
+    Int_t station = AliMpDEManager::GetChamberId(detElemId)/2;
     
     const AliMpVSegmentation* seg = 
       AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
     
-    AliMUONVCalibParam* value = 
-      dynamic_cast<AliMUONVCalibParam*>(store.FindObject(detElemId,manuId));
-    
-    if (value)
+    for ( Int_t manuChannel = 0; manuChannel < param->Size(); ++manuChannel )
     {
-      for ( Int_t manuChannel = 0; manuChannel < value->Size(); ++manuChannel )
-      {
-        AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,manuChannel),kFALSE);
-        if (!pad.IsValid()) continue;
+      AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,manuChannel),kFALSE);
+      if (!pad.IsValid()) continue;
 
-        ++n;
-        ++nPerStation[station];
-        Float_t x = value->ValueAsFloat(manuChannel,0);
-        if ( x>1E4 ) 
-        {
-          AliInfo(Form("DE %d Manu %d Ch %d x=%e",detElemId,manuId,manuChannel,x));
-        }
-        h0->Fill(x);
-        if (h1)
-        {
-          h1->Fill(value->ValueAsFloat(manuChannel,1));
-        }
+      ++n;
+      ++nPerStation[station];
+      
+      for ( Int_t dim = 0; dim < param->Dimension(); ++dim ) 
+      {
+        h[dim]->Fill(param->ValueAsFloat(manuChannel,dim));
       }
     }
-    else
-    {
-      AliWarning(Form("Got a null value for DE=%d manuId=%d",detElemId,manuId));
-    }
-  }
+  } 
   
-  AliInfo(Form("Number of channels = %d",n));
-  for ( Int_t i = 0; i < 7; ++i )
+  for ( Int_t i = 0; i < kNStations; ++i )
   {
     AliInfo(Form("Station %d %d ",(i+1),nPerStation[i]));
   }
+
+  AliInfo(Form("Number of channels = %d",n));
+  
+  delete[] nPerStation;
 }
 
 //_____________________________________________________________________________
@@ -305,7 +326,7 @@ AliMUONCDB::MakeHVStore(TMap& aliasMap, Bool_t defaultValues)
 {
   /// Create a HV store
   
-  AliMUONHVNamer hvNamer;
+  AliMpHVNamer hvNamer;
   
   TObjArray* aliases = hvNamer.GenerateAliases();
   
@@ -345,7 +366,7 @@ AliMUONCDB::MakeHVStore(TMap& aliasMap, Bool_t defaultValues)
       for ( UInt_t timeStamp = 0; timeStamp < 60*15; timeStamp += 120 )
       {
         Float_t value = 1500;
-        if (!defaultValues) value = gRandom->Gaus(1750,62.5);
+        if (!defaultValues) value = GetRandom(1750,62.5,true);
         AliDCSValue* dcsValue = new AliDCSValue(value,timeStamp);
         valueSet->Add(dcsValue);
       }
@@ -368,10 +389,8 @@ AliMUONCDB::MakePedestalStore(AliMUONVStore& pedestalStore, Bool_t defaultValues
   /// Create a pedestal store. if defaultValues=true, ped.mean=ped.sigma=1,
   /// otherwise mean and sigma are from a gaussian (with parameters
   /// defined below by the kPedestal* constants)
-  
-  TIter next(ManuList());
-  
-  AliMpIntPair* p;
+
+  AliCodeTimerAuto("");
   
   Int_t nchannels(0);
   Int_t nmanus(0);
@@ -381,23 +400,24 @@ AliMUONCDB::MakePedestalStore(AliMUONVStore& pedestalStore, Bool_t defaultValues
   const Float_t kPedestalMeanSigma(10);
   const Float_t kPedestalSigmaMean(1.0);
   const Float_t kPedestalSigmaSigma(0.2);
+
+  Int_t detElemId;
+  Int_t manuId;
+    
+  AliMpManuIterator it;
   
-  while ( ( p = (AliMpIntPair*)next() ) )
+  while ( it.Next(detElemId,manuId) )
   {
     ++nmanus;
 
-    Int_t detElemId = p->GetFirst();    
-    Int_t manuId = p->GetSecond();
-    
-    AliMUONVCalibParam* ped = new AliMUONCalibParamNF(2,kChannels,detElemId,manuId,AliMUONVCalibParam::InvalidFloatValue());
-    
-    const AliMpVSegmentation* seg = 
-      AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
+    AliMUONVCalibParam* ped = 
+      new AliMUONCalibParamNF(2,kChannels,detElemId,manuId,AliMUONVCalibParam::InvalidFloatValue());
+
+    AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
     
     for ( Int_t manuChannel = 0; manuChannel < kChannels; ++manuChannel )
     {
-      AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,manuChannel),kFALSE);
-      if (!pad.IsValid()) continue;
+      if ( ! de->IsConnectedChannel(manuId,manuChannel) ) continue;
       
       ++nchannels;
       
@@ -411,16 +431,13 @@ AliMUONCDB::MakePedestalStore(AliMUONVStore& pedestalStore, Bool_t defaultValues
       }
       else
       {
-        meanPedestal = -1;
-        while ( meanPedestal < 0 )
-        {
-          meanPedestal = gRandom->Gaus(kPedestalMeanMean,kPedestalMeanSigma);
-        }
-        sigmaPedestal = -1;
-        while ( sigmaPedestal < 0 )
+        Bool_t positive(kTRUE);
+        meanPedestal = 0.0;
+        while ( meanPedestal == 0.0 ) // avoid strict zero 
         {
-          sigmaPedestal = gRandom->Gaus(kPedestalSigmaMean,kPedestalSigmaSigma);
+          meanPedestal = GetRandom(kPedestalMeanMean,kPedestalMeanSigma,positive);
         }
+        sigmaPedestal = GetRandom(kPedestalSigmaMean,kPedestalSigmaSigma,positive);
       }
       ped->SetValueAsFloat(manuChannel,0,meanPedestal);
       ped->SetValueAsFloat(manuChannel,1,sigmaPedestal);
@@ -431,11 +448,20 @@ AliMUONCDB::MakePedestalStore(AliMUONVStore& pedestalStore, Bool_t defaultValues
     {
       AliError(Form("Could not set DetElemId=%d manuId=%d",detElemId,manuId));
     }
+    if ( fMaxNofChannelsToGenerate > 0 && nchannels >= fMaxNofChannelsToGenerate ) break;
   }
   
   AliInfo(Form("%d Manus and %d channels.",nmanus,nchannels));
   return nchannels;
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONCDB::MakeCapacitanceStore(AliMUONVStore& capaStore, const char* file)
+{
+  /// Read the capacitance values from file and append them to the capaStore
   
+  return AliMUONTrackerIO::ReadCapacitances(file,capaStore);
 }
 
 //_____________________________________________________________________________
@@ -445,40 +471,39 @@ AliMUONCDB::MakeCapacitanceStore(AliMUONVStore& capaStore, Bool_t defaultValues)
   /// Create a capacitance store. if defaultValues=true, all capa are 1.0,
   /// otherwise they are from a gaussian with parameters defined in the
   /// kCapa* constants below.
-  
-  TIter next(ManuList());
-  
-  AliMpIntPair* p;
+
+  AliCodeTimerAuto("");
   
   Int_t nchannels(0);
   Int_t nmanus(0);
   Int_t nmanusOK(0); // manus for which we got the serial number
     
-  const Float_t kCapaMean(1.0);
-  const Float_t kCapaSigma(0.5);
+  const Float_t kCapaMean(0.3);
+  const Float_t kCapaSigma(0.1);
+  const Float_t kInjectionGainMean(3);
+  const Float_t kInjectionGainSigma(1);
+
+  Int_t detElemId;
+  Int_t manuId;
   
-  while ( ( p = (AliMpIntPair*)next() ) )
+  AliMpManuIterator it;
+  
+  while ( it.Next(detElemId,manuId) )
   {
     ++nmanus;
     
-    Int_t detElemId = p->GetFirst();
-    Int_t manuId = p->GetSecond();
-    
     AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId); 
-    Int_t serialNumber = de->GetManuSerialFromId(manuId);
+    Int_t serialNumber = AliMpManuStore::Instance()->GetManuSerial(detElemId, manuId);
       
     if ( serialNumber <= 0 ) continue;
     
     ++nmanusOK;
     
-    const AliMpVSegmentation* seg = 
-      AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
-
     AliMUONVCalibParam* capa = static_cast<AliMUONVCalibParam*>(capaStore.FindObject(serialNumber));
     
     if (!capa)
     {
-      capa = new AliMUONCalibParamNF(1,AliMpConstants::ManuNofChannels(),serialNumber,0,1.0);
+      capa = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),serialNumber,0,1.0);
       Bool_t ok = capaStore.Add(capa);
       if (!ok)
       {
@@ -488,26 +513,25 @@ AliMUONCDB::MakeCapacitanceStore(AliMUONVStore& capaStore, Bool_t defaultValues)
     
     for ( Int_t manuChannel = 0; manuChannel < capa->Size(); ++manuChannel )
     {
-      AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,manuChannel),kFALSE);
-      if (!pad.IsValid()) continue;
+      if ( ! de->IsConnectedChannel(manuId,manuChannel) ) continue;
       
       ++nchannels;
       
       Float_t capaValue;
+      Float_t injectionGain;
       
       if ( defaultValues ) 
       {
         capaValue = 1.0;
+        injectionGain = 1.0;
       }
       else
       {
-        capaValue = -1;
-        while ( capaValue < 0 )
-        {
-          capaValue = gRandom->Gaus(kCapaMean,kCapaSigma);
-        }
+        capaValue = GetRandom(kCapaMean,kCapaSigma,kTRUE);
+        injectionGain = GetRandom(kInjectionGainMean,kInjectionGainSigma,kTRUE);
       }
       capa->SetValueAsFloat(manuChannel,0,capaValue);
+      capa->SetValueAsFloat(manuChannel,1,injectionGain);
     }
   }
   
@@ -528,62 +552,67 @@ AliMUONCDB::MakeCapacitanceStore(AliMUONVStore& capaStore, Bool_t defaultValues)
 Int_t 
 AliMUONCDB::MakeGainStore(AliMUONVStore& gainStore, Bool_t defaultValues)
 {  
-  /// Create a gain store. if defaultValues=true, all gain are 1.0,
-  /// otherwise they are from a gaussian with parameters defined in the
-  /// kGain* constants below.
+  /// Create a gain store. if defaultValues=true, all gains set so that
+  /// charge = (adc-ped)
+  ///
+  /// otherwise parameters are taken from gaussians with parameters 
+  /// defined in the k* constants below.
   
-  TIter next(ManuList());
-  
-  AliMpIntPair* p;
+  AliCodeTimerAuto("");
   
   Int_t nchannels(0);
   Int_t nmanus(0);
     
-  const Double_t kSaturation(3000);
-  const Double_t kGainMean(1.0);
-  const Double_t kGainSigma(0.05);
-  
-  while ( ( p = (AliMpIntPair*)next() ) )
+  const Int_t kSaturation(3000);
+  const Double_t kA0Mean(1.2);
+  const Double_t kA0Sigma(0.1);
+  const Double_t kA1Mean(1E-5);
+  const Double_t kA1Sigma(1E-6);
+  const Double_t kQualMean(0xFF);
+  const Double_t kQualSigma(0x10);
+  const Int_t kThresMean(1600);
+  const Int_t kThresSigma(100);
+  
+  Int_t detElemId;
+  Int_t manuId;
+  
+  AliMpManuIterator it;
+  
+  while ( it.Next(detElemId,manuId) )
   {
     ++nmanus;
 
-    Int_t detElemId = p->GetFirst();
-    Int_t manuId = p->GetSecond();
-
     AliMUONVCalibParam* gain = 
-      new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),
+      new AliMUONCalibParamNF(5,AliMpConstants::ManuNofChannels(),
                               detElemId,
                               manuId,
                               AliMUONVCalibParam::InvalidFloatValue());
 
-
-    const AliMpVSegmentation* seg = 
-      AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
+    AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
 
     for ( Int_t manuChannel = 0; manuChannel < gain->Size(); ++manuChannel )
     {
-      AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,manuChannel),kFALSE);
-      if (!pad.IsValid()) continue;
+      if ( ! de->IsConnectedChannel(manuId,manuChannel) ) continue;
       
       ++nchannels;
       
-      Float_t meanGain;
-      Float_t saturation(kSaturation);
-    
       if ( defaultValues ) 
       {
-        meanGain = 1.0;
+        gain->SetValueAsFloat(manuChannel,0,1.0);
+        gain->SetValueAsFloat(manuChannel,1,0.0);
+        gain->SetValueAsInt(manuChannel,2,4095); 
+        gain->SetValueAsInt(manuChannel,3,1);
+        gain->SetValueAsInt(manuChannel,4,kSaturation);
       }
       else
       {
-        meanGain = -1;
-        while ( meanGain < 0 )
-        {
-          meanGain = gRandom->Gaus(kGainMean,kGainSigma);
-        }
+        Bool_t positive(kTRUE);
+        gain->SetValueAsFloat(manuChannel,0,GetRandom(kA0Mean,kA0Sigma,positive));
+        gain->SetValueAsFloat(manuChannel,1,GetRandom(kA1Mean,kA1Sigma,!positive));
+        gain->SetValueAsInt(manuChannel,2,(Int_t)TMath::Nint(GetRandom(kThresMean,kThresSigma,positive)));
+        gain->SetValueAsInt(manuChannel,3,(Int_t)TMath::Nint(GetRandom(kQualMean,kQualSigma,positive)));
+        gain->SetValueAsInt(manuChannel,4,kSaturation);        
       }
-      gain->SetValueAsFloat(manuChannel,0,meanGain);
-      gain->SetValueAsFloat(manuChannel,1,saturation);
       
     }
     Bool_t ok = gainStore.Add(gain);
@@ -591,6 +620,7 @@ AliMUONCDB::MakeGainStore(AliMUONVStore& gainStore, Bool_t defaultValues)
     {
       AliError(Form("Could not set DetElemId=%d manuId=%d",detElemId,manuId));
     }
+    if ( fMaxNofChannelsToGenerate > 0 && nchannels >= fMaxNofChannelsToGenerate ) break;
   }
   
   AliInfo(Form("%d Manus and %d channels.",nmanus,nchannels));
@@ -603,10 +633,12 @@ AliMUONCDB::MakeLocalTriggerMaskStore(AliMUONVStore& localBoardMasks) const
 {
   /// Generate local trigger masks store. All masks are set to FFFF
   
+  AliCodeTimerAuto("");
+  
   Int_t ngenerated(0);
-  // Generate fake mask values for 234 localboards and put that into
+  // Generate fake mask values for all localboards and put that into
   // one single container (localBoardMasks)
-  for ( Int_t i = 1; i <= 234; ++i )
+  for ( Int_t i = 1; i <= AliMpConstants::TotalNofLocalBoards(); ++i )
   {
     AliMUONVCalibParam* localBoard = new AliMUONCalibParamNI(1,8,i,0,0);
     for ( Int_t x = 0; x < 2; ++x )
@@ -625,47 +657,41 @@ AliMUONCDB::MakeLocalTriggerMaskStore(AliMUONVStore& localBoardMasks) const
 
 //_____________________________________________________________________________
 Int_t
-AliMUONCDB::MakeRegionalTriggerMaskStore(AliMUONVStore& rtm) const
+AliMUONCDB::MakeRegionalTriggerConfigStore(AliMUONRegionalTriggerConfig& rtm) const
 {
-  /// Make a regional trigger masks store. All masks are set to 3F
+  /// Make a regional trigger config store. Mask is set to FFFF for each local board (Ch.F.)
   
-  Int_t ngenerated(0);
-  for ( Int_t i = 0; i < 16; ++i )
-  {
-    AliMUONVCalibParam* regionalBoard = new AliMUONCalibParamNI(1,16,i,0,0);
-    for ( Int_t j = 0; j < 16; ++j )
-    {
-      regionalBoard->SetValueAsInt(j,0,0x3F);
-      ++ngenerated;
-    }
-    rtm.Add(regionalBoard);
-  }
+  AliCodeTimerAuto("");
   
-  return ngenerated;
+  if ( ! rtm.ReadData(AliMpFiles::LocalTriggerBoardMapping()) ) {
+    AliErrorStream() << "Error when reading from mapping file" << endl;
+    return 0;
+  }
+    
+  return rtm.GetNofTriggerCrates();  
 }
 
+
 //_____________________________________________________________________________
 Int_t 
-AliMUONCDB::MakeGlobalTriggerMaskStore(AliMUONVCalibParam& gtm) const
+AliMUONCDB::MakeGlobalTriggerConfigStore(AliMUONGlobalCrateConfig& gtm) const
 {
-  /// Make a global trigger masks store. All masks set to FFF
+  /// Make a global trigger config store. All masks (disable) set to 0x00 for each Darc board (Ch.F.)
   
-  Int_t ngenerated(0);
+  AliCodeTimerAuto("");
   
-  for ( Int_t j = 0; j < 16; ++j )
-  {
-    gtm.SetValueAsInt(j,0,0xFFF);
-    ++ngenerated;
-  }
-  return ngenerated;
+  return gtm.ReadData(AliMpFiles::GlobalTriggerBoardMapping());
 }
 
+
 //_____________________________________________________________________________
 AliMUONTriggerLut* 
 AliMUONCDB::MakeTriggerLUT(const char* file) const
 {
   /// Make a triggerlut object, from a file.
   
+  AliCodeTimerAuto("");
+  
   AliMUONTriggerLut* lut = new AliMUONTriggerLut;
   lut->ReadFromFile(file);
   return lut;
@@ -677,9 +703,24 @@ AliMUONCDB::MakeTriggerEfficiency(const char* file) const
 {
   /// Make a trigger efficiency object from a file.
   
+  AliCodeTimerAuto("");
+  
   return new AliMUONTriggerEfficiencyCells(file);
 }
 
+//_____________________________________________________________________________
+void 
+AliMUONCDB::WriteToCDB(const char* calibpath, TObject* object, 
+                       Int_t startRun, Int_t endRun, 
+                       const char* filename)
+{
+  /// Write a given object to OCDB
+  
+  TString comment(gSystem->ExpandPathName(filename));
+  
+  WriteToCDB(object, calibpath, startRun, endRun, comment.Data());
+}
+
 //_____________________________________________________________________________
 void 
 AliMUONCDB::WriteToCDB(const char* calibpath, TObject* object, 
@@ -687,21 +728,27 @@ AliMUONCDB::WriteToCDB(const char* calibpath, TObject* object,
 {
   /// Write a given object to OCDB
   
+  TString comment;
+  if ( defaultValues ) comment += "Test with default values";
+  else comment += "Test with random values";
+  
+  WriteToCDB(object, calibpath, startRun, endRun, comment.Data());
+}
+
+//_____________________________________________________________________________
+void
+AliMUONCDB::WriteToCDB(TObject* object, const char* calibpath, Int_t startRun, Int_t endRun,
+                      const char* comment, const char* responsible)
+{
+  /// Write a given object to OCDB
+  
   AliCDBId id(calibpath,startRun,endRun);
   AliCDBMetaData md;
   md.SetAliRootVersion(gROOT->GetVersion());
-  if ( defaultValues )
-  {
-    md.SetComment("Test with default values");
-  }
-  else
-  {
-    md.SetComment("Test with random values");
-  }
-  md.SetResponsible("AliMUONCDB tester class");
-  
+  md.SetComment(comment);
+  md.SetResponsible(responsible);
   AliCDBManager* man = AliCDBManager::Instance();
-  man->SetDefaultStorage(fCDBPath);
+  if (!man->IsDefaultStorageSet()) man->SetDefaultStorage(fCDBPath);
   man->Put(object,id,&md);
 }
 
@@ -712,25 +759,21 @@ AliMUONCDB::MakeNeighbourStore(AliMUONVStore& neighbourStore)
   /// Fill the neighbours store with, for each channel, a TObjArray of its
   /// neighbouring pads (including itself)
   
-  AliInfo("Generating NeighbourStore. This will take a while. Please be patient.");
-  
-  TStopwatch timer;
-  
-  timer.Start(kTRUE);
+  AliCodeTimerAuto("");
   
-  TIter next(ManuList());
-  
-  AliMpIntPair* p;
+  AliInfo("Generating NeighbourStore. This will take a while. Please be patient.");
   
   Int_t nchannels(0);
   
   TObjArray tmp;
+
+  Int_t detElemId;
+  Int_t manuId;
   
-  while ( ( p = (AliMpIntPair*)next() ) )
+  AliMpManuIterator it;
+  
+  while ( it.Next(detElemId,manuId) )
   {
-    Int_t detElemId = p->GetFirst();
-    Int_t manuId = p->GetSecond();
-    
     const AliMpVSegmentation* seg = 
       AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId,manuId);
     
@@ -764,33 +807,41 @@ AliMUONCDB::MakeNeighbourStore(AliMUONVStore& neighbourStore)
             
         for ( Int_t i = 0; i < nofPadNeighbours; ++i )
         {
-          AliMpPad* pad = static_cast<AliMpPad*>(tmp.At(i));
+          AliMpPad* p = static_cast<AliMpPad*>(tmp.UncheckedAt(i));
           Int_t x;
-          Bool_t ok = calibParam->PackValues(pad->GetLocation().GetFirst(),pad->GetLocation().GetSecond(),x);
-          if (!ok)
-          {
-            AliError("Could not pack value. Something is seriously wrong. Please check");
-            StdoutToAliError(pad->Print(););
-            return -1;
-          }
+//          Bool_t ok =
+          calibParam->PackValues(p->GetLocation().GetFirst(),p->GetLocation().GetSecond(),x);
+//          if (!ok)
+//          {
+//            AliError("Could not pack value. Something is seriously wrong. Please check");
+//            StdoutToAliError(pad->Print(););
+//            return -1;
+//          }
           calibParam->SetValueAsInt(manuChannel,i,x);
         }
       }
     }
     }
   
-  timer.Print();
-  
   return nchannels;
 }
 
+//_____________________________________________________________________________
+void
+AliMUONCDB::SetMaxNofChannelsToGenerate(Int_t n)
+{
+  /// Set the maximum number of channels to generate (used for testing only)
+  /// n < 0 means no limit
+  fMaxNofChannelsToGenerate = n;
+}
+
 //_____________________________________________________________________________
 void
 AliMUONCDB::WriteLocalTriggerMasks(Int_t startRun, Int_t endRun)
 {  
   /// Write local trigger masks to OCDB
   
-  AliMUONVStore* ltm = new AliMUON1DArray(235);
+  AliMUONVStore* ltm = new AliMUON1DArray(AliMpConstants::TotalNofLocalBoards()+1);
   Int_t ngenerated = MakeLocalTriggerMaskStore(*ltm);
   AliInfo(Form("Ngenerated = %d",ngenerated));
   if (ngenerated>0)
@@ -802,37 +853,39 @@ AliMUONCDB::WriteLocalTriggerMasks(Int_t startRun, Int_t endRun)
 
 //_____________________________________________________________________________
 void
-AliMUONCDB::WriteRegionalTriggerMasks(Int_t startRun, Int_t endRun)
+AliMUONCDB::WriteRegionalTriggerConfig(Int_t startRun, Int_t endRun)
 {  
   /// Write regional trigger masks to OCDB
   
-  AliMUONVStore* rtm = new AliMUON1DArray(16);
-  Int_t ngenerated = MakeRegionalTriggerMaskStore(*rtm);
+  AliMUONRegionalTriggerConfig* rtm = new AliMUONRegionalTriggerConfig();
+  Int_t ngenerated = MakeRegionalTriggerConfigStore(*rtm);
   AliInfo(Form("Ngenerated = %d",ngenerated));
   if (ngenerated>0)
   {
-    WriteToCDB("MUON/Calib/RegionalTriggerBoardMasks",rtm,startRun,endRun,true);
+    WriteToCDB("MUON/Calib/RegionalTriggerConfig",rtm,startRun,endRun,true);
   }
   delete rtm;
 }
 
+
 //_____________________________________________________________________________
 void
-AliMUONCDB::WriteGlobalTriggerMasks(Int_t startRun, Int_t endRun)
+AliMUONCDB::WriteGlobalTriggerConfig(Int_t startRun, Int_t endRun)
 {  
   /// Write global trigger masks to OCDB
   
-  AliMUONVCalibParam* gtm = new AliMUONCalibParamNI(1,16,1,0,0);
+  AliMUONGlobalCrateConfig* gtm = new AliMUONGlobalCrateConfig();
 
-  Int_t ngenerated = MakeGlobalTriggerMaskStore(*gtm);
+  Int_t ngenerated = MakeGlobalTriggerConfigStore(*gtm);
   AliInfo(Form("Ngenerated = %d",ngenerated));
   if (ngenerated>0)
   {
-    WriteToCDB("MUON/Calib/GlobalTriggerBoardMasks",gtm,startRun,endRun,true);
+    WriteToCDB("MUON/Calib/GlobalTriggerCrateConfig",gtm,startRun,endRun,true);
   }
   delete gtm;
 }
 
+
 //_____________________________________________________________________________
 void
 AliMUONCDB::WriteTriggerLut(Int_t startRun, Int_t endRun)
@@ -867,7 +920,7 @@ AliMUONCDB::WriteNeighbours(Int_t startRun, Int_t endRun)
 {
   /// Write neighbours to OCDB
   
-  AliMUONVStore* neighbours = new AliMUON2DMap(kTRUE);
+  AliMUONVStore* neighbours = Create2DMap();
   Int_t ngenerated = MakeNeighbourStore(*neighbours);
   AliInfo(Form("Ngenerated = %d",ngenerated));
   if (ngenerated>0)
@@ -907,7 +960,7 @@ AliMUONCDB::WritePedestals(Bool_t defaultValues,
   /// store them into CDB located at cdbpath, with a validity period
   /// ranging from startRun to endRun
   
-  AliMUONVStore* pedestalStore = new AliMUON2DMap(true);
+  AliMUONVStore* pedestalStore = Create2DMap();
   Int_t ngenerated = MakePedestalStore(*pedestalStore,defaultValues);
   AliInfo(Form("Ngenerated = %d",ngenerated));
   WriteToCDB("MUON/Calib/Pedestals",pedestalStore,startRun,endRun,defaultValues);
@@ -925,13 +978,32 @@ AliMUONCDB::WriteGains(Bool_t defaultValues,
   /// store them into CDB located at cdbpath, with a validity period
   /// ranging from startRun to endRun
   
-  AliMUONVStore* gainStore = new AliMUON2DMap(true);
+  AliMUONVStore* gainStore = Create2DMap();
   Int_t ngenerated = MakeGainStore(*gainStore,defaultValues);
   AliInfo(Form("Ngenerated = %d",ngenerated));  
   WriteToCDB("MUON/Calib/Gains",gainStore,startRun,endRun,defaultValues);
   delete gainStore;
 }
 
+//_____________________________________________________________________________
+void 
+AliMUONCDB::WriteCapacitances(const char* filename,
+                              Int_t startRun, Int_t endRun)
+{
+  /// read manu capacitance and injection gain values from file 
+  /// and store them into CDB located at cdbpath, with a validity period
+  /// ranging from startRun to endRun
+  
+  AliMUONVStore* capaStore = new AliMUON1DMap(16828);
+  Int_t ngenerated = MakeCapacitanceStore(*capaStore,filename);
+  AliInfo(Form("Ngenerated = %d",ngenerated));
+  if ( ngenerated > 0 ) 
+  {
+    WriteToCDB("MUON/Calib/Capacitances",capaStore,startRun,endRun,filename);
+  }
+  delete capaStore;
+}
+
 //_____________________________________________________________________________
 void 
 AliMUONCDB::WriteCapacitances(Bool_t defaultValues,
@@ -955,8 +1027,8 @@ AliMUONCDB::WriteTrigger(Int_t startRun, Int_t endRun)
 {
   /// Writes all Trigger related calibration to CDB
   WriteLocalTriggerMasks(startRun,endRun);
-  WriteRegionalTriggerMasks(startRun,endRun);
-  WriteGlobalTriggerMasks(startRun,endRun);
+  WriteRegionalTriggerConfig(startRun,endRun);
+  WriteGlobalTriggerConfig(startRun,endRun);
   WriteTriggerLut(startRun,endRun);
   WriteTriggerEfficiency(startRun,endRun);
 }