ROOT logo
/**************************************************************************
* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
*                                                                        *
* Author: The ALICE Off-line Project.                                    *
* Contributors are mentioned in the code where appropriate.              *
*                                                                        *
* Permission to use, copy, modify and distribute this software and its   *
* documentation strictly for non-commercial purposes is hereby granted   *
* without fee, provided that the above copyright notice appears in all   *
* copies and that both the copyright notice and this permission notice   *
* appear in the supporting documentation. The authors make no claims     *
* about the suitability of this software for any purpose. It is          *
* provided "as is" without express or implied warranty.                  *
**************************************************************************/

// $Id$

#include "AliMUONPedestalEventGenerator.h"

#include "AliCodeTimer.h"
#include "AliDAQ.h"
#include "AliHeader.h"
#include "AliLog.h"
#include "AliMUONCalibrationData.h"
#include "AliMUONRawWriter.h"
#include "AliMUONVCalibParam.h"
#include "AliMUONVDigit.h"
#include "AliMUONVDigitStore.h"
#include "AliMUONVStore.h"
#include "AliMpCathodType.h"
#include "AliMpConstants.h"
#include "AliMpDEStore.h"
#include "AliMpDetElement.h"
#include "AliMpPlaneType.h"
#include "AliRawDataHeaderSim.h"
#include "AliLoader.h"
#include "AliRunLoader.h"
#include <TClonesArray.h>
#include <TMath.h>
#include <TROOT.h>
#include <TRandom.h>
#include <TStopwatch.h>
#include <TSystem.h>
#include <TTree.h>

#include <cstdio>

//-----------------------------------------------------------------------------
/// \class AliMUONPedestalEventGenerator
///
/// Generate simulated pedestal events for MUON TRK, to be able to e.g. test
/// online calibration routines.
///
/// The pedestals themselves are taken from the CDB. What we get from the CDB
/// is, per channel, the mean and the sigma of the pedestal. We then use
/// those informations to randomly get the pedestals for each channel, for
/// each event (picking in a gaus(mean,sigma)).
///
/// Output can be just digits, or digits + raw (ddl), or digits + raw (ddl)
/// + raw (date files, one per LDC), depending of ctor and MakeDDL() method.
///
/// \author L. Aphecetche
//-----------------------------------------------------------------------------

/// \cond CLASSIMP
ClassImp(AliMUONPedestalEventGenerator)
/// \endcond

Int_t AliMUONPedestalEventGenerator::fgCounter(0);

//std::streambuf* RedirectTo(std::ostream& what, std::ostream& to)
//{
//  std::streambuf* old = what.rdbuf();
//  
//  std::streambuf* psbuf = to.rdbuf();
//  what.rdbuf(psbuf);
//  
//  return old;
//}

//_____________________________________________________________________________
AliMUONPedestalEventGenerator::AliMUONPedestalEventGenerator(Int_t runNumber,
                                                             Int_t nevents,
                                                             const char* filename)
: TTask("AliMUONPedestalEventGenerator","Generate fake pedestal events"), 
fCalibrationData(new AliMUONCalibrationData(runNumber)),
fDateFileName(filename),
fGAliceFileName("galice.root"),
fMakeDDL(kTRUE),
fLoader(0x0),
fPedestals(fCalibrationData->Pedestals()),
fDigitStore(0x0),
fRawWriter(0x0)
{
  /// Will generate pedestals according to (mean,sigma)s found in CDB
  /// for run runNumber.
  /// Will generate nevents events
  /// If filename is != "", it will be the basename of the output LDC files
  ///
  if (!gSystem->IsAbsoluteFileName(fGAliceFileName)) 
  {
    char* absFileName = gSystem->ConcatFileName(gSystem->WorkingDirectory(),
                                                fGAliceFileName);
    fGAliceFileName = absFileName;
    delete[] absFileName;
  }
  
  AliRunLoader* runLoader = LoadRun("recreate");
  if (!runLoader)
  {
    AliError("Could not create RunLoader");
    return;
  }
  
  runLoader->SetNumberOfEventsPerFile(nevents);
  
  // Initialize event headers.
  runLoader->MakeTree("E");

  for ( Int_t iEvent = 0; iEvent < nevents; ++iEvent )
  {
    runLoader->SetEventNumber(iEvent);
    runLoader->GetHeader()->Reset(runNumber,iEvent);
    runLoader->TreeE()->Fill();
  }
  runLoader->WriteHeader("OVERWRITE");
  runLoader->CdGAFile();
  runLoader->Write(0, TObject::kOverwrite);  

  delete runLoader;
  fLoader = 0x0;
}


//_____________________________________________________________________________
AliMUONPedestalEventGenerator::~AliMUONPedestalEventGenerator()
{
  /// dtor
  delete fCalibrationData;
  AliInfo(Form("make a digit counter %d",fgCounter));
  delete fDigitStore;
  delete fRawWriter;
}

//_____________________________________________________________________________
Bool_t 
AliMUONPedestalEventGenerator::ConvertRawFilesToDate()
{
  /// convert raw data DDL files to DATE files with the program "dateStream".
  /// we make one file per LDC
  
  AliCodeTimerAuto("",0)
  
  AliInfo("Converting raw to date");
  
  const Int_t kIDet = AliDAQ::DetectorID("MUONTRK");
  
  const Int_t kNLDCs = 5;//TMath::CeilNint(AliDAQ::NumberOfLdcs(kIDet));
  
  char* path = gSystem->Which(gSystem->Getenv("PATH"), "dateStream");
  if (!path) 
  {
    AliError("the program dateStream was not found");
    return kFALSE;
  }
  
  delete[] path;
  
  AliRunLoader* runLoader = LoadRun("read");
  if (!runLoader) return kFALSE;
  
  AliInfo(Form("converting raw data DDL files to DATE files %s", fDateFileName.Data()));
  FILE** pipe = new FILE*[kNLDCs];
  
  for ( Int_t iFile = 0; iFile < kNLDCs; ++iFile)
  {
    char command[256];
    // Note the option -s. It is used in order to avoid
    // the generation of SOR/EOR events.
    snprintf(command, 256, "dateStream -c -D -o %s.LDC%d -# %d -C", 
            fDateFileName.Data(), iFile, runLoader->GetNumberOfEvents());
    pipe[iFile] = gSystem->OpenPipe(command, "w");
  }
  
  for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); ++iEvent) 
  {
    Float_t ldc = 0;
    Int_t prevLDC = -1;

    for (Int_t iDDL = 0; iDDL < AliDAQ::NumberOfDdls(kIDet); ++iDDL) 
    {        
      Int_t ddlID = AliDAQ::DdlID(kIDet,iDDL);
      Int_t ldcID = Int_t(ldc + 0.0001);
      ldc += AliDAQ::NumberOfLdcs(kIDet) / AliDAQ::NumberOfDdls(kIDet);
      
      char rawFileName[256];
      snprintf(rawFileName, 256, "raw%d/%s", 
              iEvent, AliDAQ::DdlFileName(kIDet,iDDL));
      
      // check existence and size of raw data file
      FILE* file = fopen(rawFileName, "rb");
      if (!file) continue;
      fseek(file, 0, SEEK_END);
      unsigned long size = ftell(file);
      fclose(file);
      if (!size) continue;
      
      if (ldcID != prevLDC) {
        fprintf(pipe[ldcID], " LDC Id %d\n", ldcID);
        prevLDC = ldcID;
      }
      fprintf(pipe[ldcID], "  Equipment Id %d Payload %s\n", ddlID, rawFileName);
    }
  }
  
  Int_t result(0);
  
  for ( Int_t iFile = 0; iFile < kNLDCs; ++iFile)
  {
    result += gSystem->ClosePipe(pipe[iFile]);
  }
  
  for (Int_t iEvent = 0; iEvent < runLoader->GetNumberOfEvents(); ++iEvent) 
  {
    char command[256];
    snprintf(command, 256, "rm -r raw%d", iEvent);
    gSystem->Exec(command);
  }
  
  delete [] pipe;
  delete runLoader;
  fLoader=0x0;
  return (result == 0);
}

//_____________________________________________________________________________
AliMUONVDigitStore*
AliMUONPedestalEventGenerator::DigitStore()
{
/// Return digt container; create it if it does not exist

  if (!fDigitStore) fDigitStore = AliMUONVDigitStore::Create("AliMUONDigitStoreV2R");
  return fDigitStore;
}

//_____________________________________________________________________________
void
AliMUONPedestalEventGenerator::Exec(Option_t*)
{  
  /// Main steering method
  
  AliCodeTimerAuto("",0)
  
  if (!fPedestals)
  {
    AliError("No pedestal store. Cannot proceed.");
    return;
  }
  
  AliRunLoader* runLoader = LoadRun("update");
  
  Int_t nevents = runLoader->GetNumberOfEvents();
    
  for ( Int_t i = 0; i < nevents ; ++i )
  {
    runLoader->GetEvent(i);
    
    fLoader->MakeDigitsContainer();
    TTree* treeD = fLoader->TreeD();  
    if (!treeD)
    {
      AliError(Form("Could not get TreeD for event %d",i));
      continue;
    }
    
    DigitStore()->Connect(*treeD);
        
    GenerateDigits(*(DigitStore()));

    // Fill the output treeD
    treeD->Fill();
    
    // Write to the output tree(D).
    // Please note that as GlobalTrigger, LocalTrigger and Digits are in the same
    // tree (=TreeD) in different branches, this WriteDigits in fact writes all of 
    // the 3 branches.

    AliCodeTimerStart("WriteDigits")
    fLoader->WriteDigits("OVERWRITE");
    AliCodeTimerStop("WriteDigits")
    
    fLoader->UnloadDigits();
    
    if ( fMakeDDL )
    {
      AliCodeTimerAuto("Digits2Raw",1);
      Digits2Raw(i);
    }
  }
    
  runLoader->WriteRunLoader("OVERWRITE");
  delete runLoader;
  fLoader = 0x0;
    
  // Finally, if instructed to do so, convert DDL files to DATE file(s)
  if ( fMakeDDL && fDateFileName.Length() > 0 ) 
  {
    AliCodeTimerAuto("ConvertRawFilesToDate",1)
    Bool_t dateOutput = ConvertRawFilesToDate();
    if (!dateOutput) 
    {
      AliError("DATE output failed. Exiting.");
      return;
    }    
  }
}

//_____________________________________________________________________________
void
AliMUONPedestalEventGenerator::Digits2Raw(Int_t event)
{
  /// Converts digits (from MUON.Digits.root file) to Raw DDL ascii files.
  
  AliCodeTimerAuto("",0)
  
  if (!fRawWriter) 
  {
      AliRawDataHeaderSim header;
      fRawWriter = new AliMUONRawWriter;
      fRawWriter->SetHeader(header);
  }
  
  // Generate RAW data from the digits
  // Be carefull to create&change to the correct directory first...
  
  TString baseDir = gSystem->WorkingDirectory();
  
  char dirName[256];
  snprintf(dirName, 256, "raw%d", event);
  gSystem->MakeDirectory(dirName);
  if (!gSystem->ChangeDirectory(dirName)) 
  {
    AliError(Form("couldn't change to directory %s", dirName));
    return;
  }
  
  fRawWriter->Digits2Raw(DigitStore(),0);
  
  gSystem->ChangeDirectory(baseDir);
}

//_____________________________________________________________________________
void
AliMUONPedestalEventGenerator::GenerateDigits(AliMUONVDigitStore& digitStore)
{  
  /// Generate digits (where ADC is set to pedestal value) for all MUON TRK
  /// and for 1 event.
  
  AliCodeTimerAuto("",0)

  digitStore.Clear();
  
  Int_t ngenerated(0);
  Int_t nmanus(0);
  TIter next(fPedestals->CreateIterator());
  AliMUONVCalibParam* pedestals;
  
  while ( ( pedestals = static_cast<AliMUONVCalibParam*>(next())) )
  {
    Int_t detElemId = pedestals->ID0();
    Int_t manuId = pedestals->ID1();
    
    AliMpDetElement* de = AliMpDEStore::Instance()->GetDetElement(detElemId);
    AliMp::PlaneType planeType = AliMp::kBendingPlane;
    if ( manuId & AliMpConstants::ManuMask(AliMp::kNonBendingPlane) ) 
    {
      planeType = AliMp::kNonBendingPlane;
    }
    AliMp::CathodType cathode = de->GetCathodType(planeType);
    
    ++nmanus;
        
    for ( Int_t manuChannel = 0; manuChannel < pedestals->Size(); ++manuChannel )
    {
      Float_t mean = pedestals->ValueAsFloat(manuChannel,0);
      if (mean == AliMUONVCalibParam::InvalidFloatValue())
      {
        // This is a poor's man way of knowing if that channel really exists.
        // Better and safer way (but much slower too) would be to check pad existence
        // using AliMpVSegmentation::PadByLocation(manuId,manuChannel)
        continue;
      }
      else if ( mean < 1 || mean >  4095 ) 
      {
        AliFatal(Form("Got an invalid mean pedestal value for DE %d Manu %d"
                      " channel %d : mean = %e",detElemId,manuId,manuChannel,
                      mean));
      }
      else
      {
        Float_t sigma = pedestals->ValueAsFloat(manuChannel,1);
        
        if ( sigma < 0 ) 
        {
          AliWarning(Form("Got a negative sigma pedestal value for DE %d Manu %d"
                          " channel %d : sigma = %e, will use Abs()=%e",
                          detElemId,manuId,manuChannel,
                          sigma,-sigma));
          sigma = -sigma;
        }
        
        AliMUONVDigit* d = digitStore.Add(detElemId,manuId,manuChannel,
                                          cathode,
                                          AliMUONVDigitStore::kIgnore);
        
        Float_t ped = -1;
        while ( ped <= 0 ) 
        {
          ped = gRandom->Gaus(mean,sigma);
        }
        Int_t pedADC = TMath::FloorNint(ped);

        d->SetADC(pedADC);
        d->SetCharge(ped);
        // we do not set the remaining parts of the digit, as in principle
        // this is all we need : manuId, manuChannel and ADC, as far as
        // real data is concerned.
        ++fgCounter;
        ++ngenerated;
      }
    }
  }
  AliDebug(1,Form("ngenerated=%d nmanus=%d",ngenerated,nmanus));
}

//_____________________________________________________________________________
AliRunLoader*
AliMUONPedestalEventGenerator::LoadRun(const char* mode)
{
  /// Get access to AliRunLoader object
  while (AliRunLoader::Instance()) 
  {
    AliDebug(1,Form("Deleting AliRunLoader %p",AliRunLoader::Instance()));
    delete AliRunLoader::Instance();
  }
  
  AliRunLoader* runLoader = 
    AliRunLoader::Open(fGAliceFileName,AliConfig::GetDefaultEventFolderName(), 
                       mode);

  AliDebug(1,Form("AliRunLoader(%s)=%p",mode,runLoader));
  
  if (!runLoader) 
  {
    AliError("No run loader found in file galice.root");
    return 0x0;
  }
    
  TString smode(mode);
  smode.ToUpper();
  
  if (smode.Contains("RECREATE"))
  {
    AliInfo("Creating folder structure");
    AliConfig::Instance()
    ->CreateDetectorFolders(runLoader->GetEventFolder(), 
                            "MUON", "MUON");
    fLoader = new AliLoader("MUON",runLoader->GetEventFolder());
    runLoader->AddLoader(fLoader);
  }
  
  fLoader = static_cast<AliLoader*>(runLoader->GetDetectorLoader("MUON"));
    
  return runLoader;
}
 AliMUONPedestalEventGenerator.cxx:1
 AliMUONPedestalEventGenerator.cxx:2
 AliMUONPedestalEventGenerator.cxx:3
 AliMUONPedestalEventGenerator.cxx:4
 AliMUONPedestalEventGenerator.cxx:5
 AliMUONPedestalEventGenerator.cxx:6
 AliMUONPedestalEventGenerator.cxx:7
 AliMUONPedestalEventGenerator.cxx:8
 AliMUONPedestalEventGenerator.cxx:9
 AliMUONPedestalEventGenerator.cxx:10
 AliMUONPedestalEventGenerator.cxx:11
 AliMUONPedestalEventGenerator.cxx:12
 AliMUONPedestalEventGenerator.cxx:13
 AliMUONPedestalEventGenerator.cxx:14
 AliMUONPedestalEventGenerator.cxx:15
 AliMUONPedestalEventGenerator.cxx:16
 AliMUONPedestalEventGenerator.cxx:17
 AliMUONPedestalEventGenerator.cxx:18
 AliMUONPedestalEventGenerator.cxx:19
 AliMUONPedestalEventGenerator.cxx:20
 AliMUONPedestalEventGenerator.cxx:21
 AliMUONPedestalEventGenerator.cxx:22
 AliMUONPedestalEventGenerator.cxx:23
 AliMUONPedestalEventGenerator.cxx:24
 AliMUONPedestalEventGenerator.cxx:25
 AliMUONPedestalEventGenerator.cxx:26
 AliMUONPedestalEventGenerator.cxx:27
 AliMUONPedestalEventGenerator.cxx:28
 AliMUONPedestalEventGenerator.cxx:29
 AliMUONPedestalEventGenerator.cxx:30
 AliMUONPedestalEventGenerator.cxx:31
 AliMUONPedestalEventGenerator.cxx:32
 AliMUONPedestalEventGenerator.cxx:33
 AliMUONPedestalEventGenerator.cxx:34
 AliMUONPedestalEventGenerator.cxx:35
 AliMUONPedestalEventGenerator.cxx:36
 AliMUONPedestalEventGenerator.cxx:37
 AliMUONPedestalEventGenerator.cxx:38
 AliMUONPedestalEventGenerator.cxx:39
 AliMUONPedestalEventGenerator.cxx:40
 AliMUONPedestalEventGenerator.cxx:41
 AliMUONPedestalEventGenerator.cxx:42
 AliMUONPedestalEventGenerator.cxx:43
 AliMUONPedestalEventGenerator.cxx:44
 AliMUONPedestalEventGenerator.cxx:45
 AliMUONPedestalEventGenerator.cxx:46
 AliMUONPedestalEventGenerator.cxx:47
 AliMUONPedestalEventGenerator.cxx:48
 AliMUONPedestalEventGenerator.cxx:49
 AliMUONPedestalEventGenerator.cxx:50
 AliMUONPedestalEventGenerator.cxx:51
 AliMUONPedestalEventGenerator.cxx:52
 AliMUONPedestalEventGenerator.cxx:53
 AliMUONPedestalEventGenerator.cxx:54
 AliMUONPedestalEventGenerator.cxx:55
 AliMUONPedestalEventGenerator.cxx:56
 AliMUONPedestalEventGenerator.cxx:57
 AliMUONPedestalEventGenerator.cxx:58
 AliMUONPedestalEventGenerator.cxx:59
 AliMUONPedestalEventGenerator.cxx:60
 AliMUONPedestalEventGenerator.cxx:61
 AliMUONPedestalEventGenerator.cxx:62
 AliMUONPedestalEventGenerator.cxx:63
 AliMUONPedestalEventGenerator.cxx:64
 AliMUONPedestalEventGenerator.cxx:65
 AliMUONPedestalEventGenerator.cxx:66
 AliMUONPedestalEventGenerator.cxx:67
 AliMUONPedestalEventGenerator.cxx:68
 AliMUONPedestalEventGenerator.cxx:69
 AliMUONPedestalEventGenerator.cxx:70
 AliMUONPedestalEventGenerator.cxx:71
 AliMUONPedestalEventGenerator.cxx:72
 AliMUONPedestalEventGenerator.cxx:73
 AliMUONPedestalEventGenerator.cxx:74
 AliMUONPedestalEventGenerator.cxx:75
 AliMUONPedestalEventGenerator.cxx:76
 AliMUONPedestalEventGenerator.cxx:77
 AliMUONPedestalEventGenerator.cxx:78
 AliMUONPedestalEventGenerator.cxx:79
 AliMUONPedestalEventGenerator.cxx:80
 AliMUONPedestalEventGenerator.cxx:81
 AliMUONPedestalEventGenerator.cxx:82
 AliMUONPedestalEventGenerator.cxx:83
 AliMUONPedestalEventGenerator.cxx:84
 AliMUONPedestalEventGenerator.cxx:85
 AliMUONPedestalEventGenerator.cxx:86
 AliMUONPedestalEventGenerator.cxx:87
 AliMUONPedestalEventGenerator.cxx:88
 AliMUONPedestalEventGenerator.cxx:89
 AliMUONPedestalEventGenerator.cxx:90
 AliMUONPedestalEventGenerator.cxx:91
 AliMUONPedestalEventGenerator.cxx:92
 AliMUONPedestalEventGenerator.cxx:93
 AliMUONPedestalEventGenerator.cxx:94
 AliMUONPedestalEventGenerator.cxx:95
 AliMUONPedestalEventGenerator.cxx:96
 AliMUONPedestalEventGenerator.cxx:97
 AliMUONPedestalEventGenerator.cxx:98
 AliMUONPedestalEventGenerator.cxx:99
 AliMUONPedestalEventGenerator.cxx:100
 AliMUONPedestalEventGenerator.cxx:101
 AliMUONPedestalEventGenerator.cxx:102
 AliMUONPedestalEventGenerator.cxx:103
 AliMUONPedestalEventGenerator.cxx:104
 AliMUONPedestalEventGenerator.cxx:105
 AliMUONPedestalEventGenerator.cxx:106
 AliMUONPedestalEventGenerator.cxx:107
 AliMUONPedestalEventGenerator.cxx:108
 AliMUONPedestalEventGenerator.cxx:109
 AliMUONPedestalEventGenerator.cxx:110
 AliMUONPedestalEventGenerator.cxx:111
 AliMUONPedestalEventGenerator.cxx:112
 AliMUONPedestalEventGenerator.cxx:113
 AliMUONPedestalEventGenerator.cxx:114
 AliMUONPedestalEventGenerator.cxx:115
 AliMUONPedestalEventGenerator.cxx:116
 AliMUONPedestalEventGenerator.cxx:117
 AliMUONPedestalEventGenerator.cxx:118
 AliMUONPedestalEventGenerator.cxx:119
 AliMUONPedestalEventGenerator.cxx:120
 AliMUONPedestalEventGenerator.cxx:121
 AliMUONPedestalEventGenerator.cxx:122
 AliMUONPedestalEventGenerator.cxx:123
 AliMUONPedestalEventGenerator.cxx:124
 AliMUONPedestalEventGenerator.cxx:125
 AliMUONPedestalEventGenerator.cxx:126
 AliMUONPedestalEventGenerator.cxx:127
 AliMUONPedestalEventGenerator.cxx:128
 AliMUONPedestalEventGenerator.cxx:129
 AliMUONPedestalEventGenerator.cxx:130
 AliMUONPedestalEventGenerator.cxx:131
 AliMUONPedestalEventGenerator.cxx:132
 AliMUONPedestalEventGenerator.cxx:133
 AliMUONPedestalEventGenerator.cxx:134
 AliMUONPedestalEventGenerator.cxx:135
 AliMUONPedestalEventGenerator.cxx:136
 AliMUONPedestalEventGenerator.cxx:137
 AliMUONPedestalEventGenerator.cxx:138
 AliMUONPedestalEventGenerator.cxx:139
 AliMUONPedestalEventGenerator.cxx:140
 AliMUONPedestalEventGenerator.cxx:141
 AliMUONPedestalEventGenerator.cxx:142
 AliMUONPedestalEventGenerator.cxx:143
 AliMUONPedestalEventGenerator.cxx:144
 AliMUONPedestalEventGenerator.cxx:145
 AliMUONPedestalEventGenerator.cxx:146
 AliMUONPedestalEventGenerator.cxx:147
 AliMUONPedestalEventGenerator.cxx:148
 AliMUONPedestalEventGenerator.cxx:149
 AliMUONPedestalEventGenerator.cxx:150
 AliMUONPedestalEventGenerator.cxx:151
 AliMUONPedestalEventGenerator.cxx:152
 AliMUONPedestalEventGenerator.cxx:153
 AliMUONPedestalEventGenerator.cxx:154
 AliMUONPedestalEventGenerator.cxx:155
 AliMUONPedestalEventGenerator.cxx:156
 AliMUONPedestalEventGenerator.cxx:157
 AliMUONPedestalEventGenerator.cxx:158
 AliMUONPedestalEventGenerator.cxx:159
 AliMUONPedestalEventGenerator.cxx:160
 AliMUONPedestalEventGenerator.cxx:161
 AliMUONPedestalEventGenerator.cxx:162
 AliMUONPedestalEventGenerator.cxx:163
 AliMUONPedestalEventGenerator.cxx:164
 AliMUONPedestalEventGenerator.cxx:165
 AliMUONPedestalEventGenerator.cxx:166
 AliMUONPedestalEventGenerator.cxx:167
 AliMUONPedestalEventGenerator.cxx:168
 AliMUONPedestalEventGenerator.cxx:169
 AliMUONPedestalEventGenerator.cxx:170
 AliMUONPedestalEventGenerator.cxx:171
 AliMUONPedestalEventGenerator.cxx:172
 AliMUONPedestalEventGenerator.cxx:173
 AliMUONPedestalEventGenerator.cxx:174
 AliMUONPedestalEventGenerator.cxx:175
 AliMUONPedestalEventGenerator.cxx:176
 AliMUONPedestalEventGenerator.cxx:177
 AliMUONPedestalEventGenerator.cxx:178
 AliMUONPedestalEventGenerator.cxx:179
 AliMUONPedestalEventGenerator.cxx:180
 AliMUONPedestalEventGenerator.cxx:181
 AliMUONPedestalEventGenerator.cxx:182
 AliMUONPedestalEventGenerator.cxx:183
 AliMUONPedestalEventGenerator.cxx:184
 AliMUONPedestalEventGenerator.cxx:185
 AliMUONPedestalEventGenerator.cxx:186
 AliMUONPedestalEventGenerator.cxx:187
 AliMUONPedestalEventGenerator.cxx:188
 AliMUONPedestalEventGenerator.cxx:189
 AliMUONPedestalEventGenerator.cxx:190
 AliMUONPedestalEventGenerator.cxx:191
 AliMUONPedestalEventGenerator.cxx:192
 AliMUONPedestalEventGenerator.cxx:193
 AliMUONPedestalEventGenerator.cxx:194
 AliMUONPedestalEventGenerator.cxx:195
 AliMUONPedestalEventGenerator.cxx:196
 AliMUONPedestalEventGenerator.cxx:197
 AliMUONPedestalEventGenerator.cxx:198
 AliMUONPedestalEventGenerator.cxx:199
 AliMUONPedestalEventGenerator.cxx:200
 AliMUONPedestalEventGenerator.cxx:201
 AliMUONPedestalEventGenerator.cxx:202
 AliMUONPedestalEventGenerator.cxx:203
 AliMUONPedestalEventGenerator.cxx:204
 AliMUONPedestalEventGenerator.cxx:205
 AliMUONPedestalEventGenerator.cxx:206
 AliMUONPedestalEventGenerator.cxx:207
 AliMUONPedestalEventGenerator.cxx:208
 AliMUONPedestalEventGenerator.cxx:209
 AliMUONPedestalEventGenerator.cxx:210
 AliMUONPedestalEventGenerator.cxx:211
 AliMUONPedestalEventGenerator.cxx:212
 AliMUONPedestalEventGenerator.cxx:213
 AliMUONPedestalEventGenerator.cxx:214
 AliMUONPedestalEventGenerator.cxx:215
 AliMUONPedestalEventGenerator.cxx:216
 AliMUONPedestalEventGenerator.cxx:217
 AliMUONPedestalEventGenerator.cxx:218
 AliMUONPedestalEventGenerator.cxx:219
 AliMUONPedestalEventGenerator.cxx:220
 AliMUONPedestalEventGenerator.cxx:221
 AliMUONPedestalEventGenerator.cxx:222
 AliMUONPedestalEventGenerator.cxx:223
 AliMUONPedestalEventGenerator.cxx:224
 AliMUONPedestalEventGenerator.cxx:225
 AliMUONPedestalEventGenerator.cxx:226
 AliMUONPedestalEventGenerator.cxx:227
 AliMUONPedestalEventGenerator.cxx:228
 AliMUONPedestalEventGenerator.cxx:229
 AliMUONPedestalEventGenerator.cxx:230
 AliMUONPedestalEventGenerator.cxx:231
 AliMUONPedestalEventGenerator.cxx:232
 AliMUONPedestalEventGenerator.cxx:233
 AliMUONPedestalEventGenerator.cxx:234
 AliMUONPedestalEventGenerator.cxx:235
 AliMUONPedestalEventGenerator.cxx:236
 AliMUONPedestalEventGenerator.cxx:237
 AliMUONPedestalEventGenerator.cxx:238
 AliMUONPedestalEventGenerator.cxx:239
 AliMUONPedestalEventGenerator.cxx:240
 AliMUONPedestalEventGenerator.cxx:241
 AliMUONPedestalEventGenerator.cxx:242
 AliMUONPedestalEventGenerator.cxx:243
 AliMUONPedestalEventGenerator.cxx:244
 AliMUONPedestalEventGenerator.cxx:245
 AliMUONPedestalEventGenerator.cxx:246
 AliMUONPedestalEventGenerator.cxx:247
 AliMUONPedestalEventGenerator.cxx:248
 AliMUONPedestalEventGenerator.cxx:249
 AliMUONPedestalEventGenerator.cxx:250
 AliMUONPedestalEventGenerator.cxx:251
 AliMUONPedestalEventGenerator.cxx:252
 AliMUONPedestalEventGenerator.cxx:253
 AliMUONPedestalEventGenerator.cxx:254
 AliMUONPedestalEventGenerator.cxx:255
 AliMUONPedestalEventGenerator.cxx:256
 AliMUONPedestalEventGenerator.cxx:257
 AliMUONPedestalEventGenerator.cxx:258
 AliMUONPedestalEventGenerator.cxx:259
 AliMUONPedestalEventGenerator.cxx:260
 AliMUONPedestalEventGenerator.cxx:261
 AliMUONPedestalEventGenerator.cxx:262
 AliMUONPedestalEventGenerator.cxx:263
 AliMUONPedestalEventGenerator.cxx:264
 AliMUONPedestalEventGenerator.cxx:265
 AliMUONPedestalEventGenerator.cxx:266
 AliMUONPedestalEventGenerator.cxx:267
 AliMUONPedestalEventGenerator.cxx:268
 AliMUONPedestalEventGenerator.cxx:269
 AliMUONPedestalEventGenerator.cxx:270
 AliMUONPedestalEventGenerator.cxx:271
 AliMUONPedestalEventGenerator.cxx:272
 AliMUONPedestalEventGenerator.cxx:273
 AliMUONPedestalEventGenerator.cxx:274
 AliMUONPedestalEventGenerator.cxx:275
 AliMUONPedestalEventGenerator.cxx:276
 AliMUONPedestalEventGenerator.cxx:277
 AliMUONPedestalEventGenerator.cxx:278
 AliMUONPedestalEventGenerator.cxx:279
 AliMUONPedestalEventGenerator.cxx:280
 AliMUONPedestalEventGenerator.cxx:281
 AliMUONPedestalEventGenerator.cxx:282
 AliMUONPedestalEventGenerator.cxx:283
 AliMUONPedestalEventGenerator.cxx:284
 AliMUONPedestalEventGenerator.cxx:285
 AliMUONPedestalEventGenerator.cxx:286
 AliMUONPedestalEventGenerator.cxx:287
 AliMUONPedestalEventGenerator.cxx:288
 AliMUONPedestalEventGenerator.cxx:289
 AliMUONPedestalEventGenerator.cxx:290
 AliMUONPedestalEventGenerator.cxx:291
 AliMUONPedestalEventGenerator.cxx:292
 AliMUONPedestalEventGenerator.cxx:293
 AliMUONPedestalEventGenerator.cxx:294
 AliMUONPedestalEventGenerator.cxx:295
 AliMUONPedestalEventGenerator.cxx:296
 AliMUONPedestalEventGenerator.cxx:297
 AliMUONPedestalEventGenerator.cxx:298
 AliMUONPedestalEventGenerator.cxx:299
 AliMUONPedestalEventGenerator.cxx:300
 AliMUONPedestalEventGenerator.cxx:301
 AliMUONPedestalEventGenerator.cxx:302
 AliMUONPedestalEventGenerator.cxx:303
 AliMUONPedestalEventGenerator.cxx:304
 AliMUONPedestalEventGenerator.cxx:305
 AliMUONPedestalEventGenerator.cxx:306
 AliMUONPedestalEventGenerator.cxx:307
 AliMUONPedestalEventGenerator.cxx:308
 AliMUONPedestalEventGenerator.cxx:309
 AliMUONPedestalEventGenerator.cxx:310
 AliMUONPedestalEventGenerator.cxx:311
 AliMUONPedestalEventGenerator.cxx:312
 AliMUONPedestalEventGenerator.cxx:313
 AliMUONPedestalEventGenerator.cxx:314
 AliMUONPedestalEventGenerator.cxx:315
 AliMUONPedestalEventGenerator.cxx:316
 AliMUONPedestalEventGenerator.cxx:317
 AliMUONPedestalEventGenerator.cxx:318
 AliMUONPedestalEventGenerator.cxx:319
 AliMUONPedestalEventGenerator.cxx:320
 AliMUONPedestalEventGenerator.cxx:321
 AliMUONPedestalEventGenerator.cxx:322
 AliMUONPedestalEventGenerator.cxx:323
 AliMUONPedestalEventGenerator.cxx:324
 AliMUONPedestalEventGenerator.cxx:325
 AliMUONPedestalEventGenerator.cxx:326
 AliMUONPedestalEventGenerator.cxx:327
 AliMUONPedestalEventGenerator.cxx:328
 AliMUONPedestalEventGenerator.cxx:329
 AliMUONPedestalEventGenerator.cxx:330
 AliMUONPedestalEventGenerator.cxx:331
 AliMUONPedestalEventGenerator.cxx:332
 AliMUONPedestalEventGenerator.cxx:333
 AliMUONPedestalEventGenerator.cxx:334
 AliMUONPedestalEventGenerator.cxx:335
 AliMUONPedestalEventGenerator.cxx:336
 AliMUONPedestalEventGenerator.cxx:337
 AliMUONPedestalEventGenerator.cxx:338
 AliMUONPedestalEventGenerator.cxx:339
 AliMUONPedestalEventGenerator.cxx:340
 AliMUONPedestalEventGenerator.cxx:341
 AliMUONPedestalEventGenerator.cxx:342
 AliMUONPedestalEventGenerator.cxx:343
 AliMUONPedestalEventGenerator.cxx:344
 AliMUONPedestalEventGenerator.cxx:345
 AliMUONPedestalEventGenerator.cxx:346
 AliMUONPedestalEventGenerator.cxx:347
 AliMUONPedestalEventGenerator.cxx:348
 AliMUONPedestalEventGenerator.cxx:349
 AliMUONPedestalEventGenerator.cxx:350
 AliMUONPedestalEventGenerator.cxx:351
 AliMUONPedestalEventGenerator.cxx:352
 AliMUONPedestalEventGenerator.cxx:353
 AliMUONPedestalEventGenerator.cxx:354
 AliMUONPedestalEventGenerator.cxx:355
 AliMUONPedestalEventGenerator.cxx:356
 AliMUONPedestalEventGenerator.cxx:357
 AliMUONPedestalEventGenerator.cxx:358
 AliMUONPedestalEventGenerator.cxx:359
 AliMUONPedestalEventGenerator.cxx:360
 AliMUONPedestalEventGenerator.cxx:361
 AliMUONPedestalEventGenerator.cxx:362
 AliMUONPedestalEventGenerator.cxx:363
 AliMUONPedestalEventGenerator.cxx:364
 AliMUONPedestalEventGenerator.cxx:365
 AliMUONPedestalEventGenerator.cxx:366
 AliMUONPedestalEventGenerator.cxx:367
 AliMUONPedestalEventGenerator.cxx:368
 AliMUONPedestalEventGenerator.cxx:369
 AliMUONPedestalEventGenerator.cxx:370
 AliMUONPedestalEventGenerator.cxx:371
 AliMUONPedestalEventGenerator.cxx:372
 AliMUONPedestalEventGenerator.cxx:373
 AliMUONPedestalEventGenerator.cxx:374
 AliMUONPedestalEventGenerator.cxx:375
 AliMUONPedestalEventGenerator.cxx:376
 AliMUONPedestalEventGenerator.cxx:377
 AliMUONPedestalEventGenerator.cxx:378
 AliMUONPedestalEventGenerator.cxx:379
 AliMUONPedestalEventGenerator.cxx:380
 AliMUONPedestalEventGenerator.cxx:381
 AliMUONPedestalEventGenerator.cxx:382
 AliMUONPedestalEventGenerator.cxx:383
 AliMUONPedestalEventGenerator.cxx:384
 AliMUONPedestalEventGenerator.cxx:385
 AliMUONPedestalEventGenerator.cxx:386
 AliMUONPedestalEventGenerator.cxx:387
 AliMUONPedestalEventGenerator.cxx:388
 AliMUONPedestalEventGenerator.cxx:389
 AliMUONPedestalEventGenerator.cxx:390
 AliMUONPedestalEventGenerator.cxx:391
 AliMUONPedestalEventGenerator.cxx:392
 AliMUONPedestalEventGenerator.cxx:393
 AliMUONPedestalEventGenerator.cxx:394
 AliMUONPedestalEventGenerator.cxx:395
 AliMUONPedestalEventGenerator.cxx:396
 AliMUONPedestalEventGenerator.cxx:397
 AliMUONPedestalEventGenerator.cxx:398
 AliMUONPedestalEventGenerator.cxx:399
 AliMUONPedestalEventGenerator.cxx:400
 AliMUONPedestalEventGenerator.cxx:401
 AliMUONPedestalEventGenerator.cxx:402
 AliMUONPedestalEventGenerator.cxx:403
 AliMUONPedestalEventGenerator.cxx:404
 AliMUONPedestalEventGenerator.cxx:405
 AliMUONPedestalEventGenerator.cxx:406
 AliMUONPedestalEventGenerator.cxx:407
 AliMUONPedestalEventGenerator.cxx:408
 AliMUONPedestalEventGenerator.cxx:409
 AliMUONPedestalEventGenerator.cxx:410
 AliMUONPedestalEventGenerator.cxx:411
 AliMUONPedestalEventGenerator.cxx:412
 AliMUONPedestalEventGenerator.cxx:413
 AliMUONPedestalEventGenerator.cxx:414
 AliMUONPedestalEventGenerator.cxx:415
 AliMUONPedestalEventGenerator.cxx:416
 AliMUONPedestalEventGenerator.cxx:417
 AliMUONPedestalEventGenerator.cxx:418
 AliMUONPedestalEventGenerator.cxx:419
 AliMUONPedestalEventGenerator.cxx:420
 AliMUONPedestalEventGenerator.cxx:421
 AliMUONPedestalEventGenerator.cxx:422
 AliMUONPedestalEventGenerator.cxx:423
 AliMUONPedestalEventGenerator.cxx:424
 AliMUONPedestalEventGenerator.cxx:425
 AliMUONPedestalEventGenerator.cxx:426
 AliMUONPedestalEventGenerator.cxx:427
 AliMUONPedestalEventGenerator.cxx:428
 AliMUONPedestalEventGenerator.cxx:429
 AliMUONPedestalEventGenerator.cxx:430
 AliMUONPedestalEventGenerator.cxx:431
 AliMUONPedestalEventGenerator.cxx:432
 AliMUONPedestalEventGenerator.cxx:433
 AliMUONPedestalEventGenerator.cxx:434
 AliMUONPedestalEventGenerator.cxx:435
 AliMUONPedestalEventGenerator.cxx:436
 AliMUONPedestalEventGenerator.cxx:437
 AliMUONPedestalEventGenerator.cxx:438
 AliMUONPedestalEventGenerator.cxx:439
 AliMUONPedestalEventGenerator.cxx:440
 AliMUONPedestalEventGenerator.cxx:441
 AliMUONPedestalEventGenerator.cxx:442
 AliMUONPedestalEventGenerator.cxx:443
 AliMUONPedestalEventGenerator.cxx:444
 AliMUONPedestalEventGenerator.cxx:445
 AliMUONPedestalEventGenerator.cxx:446
 AliMUONPedestalEventGenerator.cxx:447
 AliMUONPedestalEventGenerator.cxx:448
 AliMUONPedestalEventGenerator.cxx:449
 AliMUONPedestalEventGenerator.cxx:450
 AliMUONPedestalEventGenerator.cxx:451
 AliMUONPedestalEventGenerator.cxx:452
 AliMUONPedestalEventGenerator.cxx:453
 AliMUONPedestalEventGenerator.cxx:454
 AliMUONPedestalEventGenerator.cxx:455
 AliMUONPedestalEventGenerator.cxx:456
 AliMUONPedestalEventGenerator.cxx:457
 AliMUONPedestalEventGenerator.cxx:458
 AliMUONPedestalEventGenerator.cxx:459
 AliMUONPedestalEventGenerator.cxx:460
 AliMUONPedestalEventGenerator.cxx:461
 AliMUONPedestalEventGenerator.cxx:462
 AliMUONPedestalEventGenerator.cxx:463
 AliMUONPedestalEventGenerator.cxx:464
 AliMUONPedestalEventGenerator.cxx:465
 AliMUONPedestalEventGenerator.cxx:466
 AliMUONPedestalEventGenerator.cxx:467
 AliMUONPedestalEventGenerator.cxx:468
 AliMUONPedestalEventGenerator.cxx:469
 AliMUONPedestalEventGenerator.cxx:470
 AliMUONPedestalEventGenerator.cxx:471
 AliMUONPedestalEventGenerator.cxx:472
 AliMUONPedestalEventGenerator.cxx:473
 AliMUONPedestalEventGenerator.cxx:474
 AliMUONPedestalEventGenerator.cxx:475