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 "AliMUONGainEventGenerator.h"

//-----------------------------------------------------------------------------
/// \class AliMUONGainEventGenerator
///
/// Generate raw data files that mimics the one we'll get from the 
/// online gain calibration procedure.
///
/// We start from one set of gain values, and one set of pedestal values,
/// to be found in the OCDB 
/// (generated e.g. with AliMUONCDB class)
///
/// We then use those gains and to generate n sets of pedestal values, 
/// that we store in OCDB in runs = [firstRunNumber+1,...firstRunNumber+n-1]
///
/// Then we loop from 0 to n-1, and for each, we generate a pedestal file,
/// using AliMUONPedestalEventGenerator, where the pedestals used are those
/// stored in the previous step.
///
/// Output files are supposed to be processed by the MUONTRKda (gain part)
/// to produce 4 (one per LDC) ascii files (with computed gain values), that
/// in turn will be processed by the Shuttle to put gain values in the OCDB.
/// Those last gains in OCDB can be then compared with the ones generated in 
/// the first step, to check that everything is OK in the whole procedure.
///
/// \author Laurent Aphecetche
//-----------------------------------------------------------------------------

#include "AliMUONCalibrationData.h"
#include "AliMUONVStore.h"
#include "AliMUONVCalibParam.h"
#include <TRandom.h>
#include "AliCDBEntry.h"
#include "AliCDBManager.h"
#include "AliMUONPedestalEventGenerator.h"
#include "AliLog.h"
#include <TROOT.h>
#include <TSystem.h>
#include "AliMUONDigitizerV3.h"
#include "AliCodeTimer.h"

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

//_____________________________________________________________________________
AliMUONGainEventGenerator::AliMUONGainEventGenerator( Int_t sourceGainRunNumber,
                                                      Int_t sourcePedRunNumber,                                                      
                          Int_t nEventsPerFile, 
                          const char* dateBaseFileName)
  : TTask("AliMUONGainEventGenerator","Generate gain raw data files"),
  fNofEventsPerFile(nEventsPerFile),
  fSourcePedestalRunNumber(sourcePedRunNumber),
  fDateBaseFileName(dateBaseFileName),
  fSourceGains(AliMUONCalibrationData::CreateGains(sourceGainRunNumber)),
  fSourcePedestals(AliMUONCalibrationData::CreatePedestals(fSourcePedestalRunNumber))
{
    /// Ctor
    
    if (!fSourceGains)
    {
      AliFatal(Form("Cannot get gains for run %d",sourceGainRunNumber));
    }
    if (!fSourcePedestals)
    {
      AliFatal(Form("Cannot get pedestals for run %d",sourcePedRunNumber));
    }
}

//_____________________________________________________________________________
AliMUONGainEventGenerator::~AliMUONGainEventGenerator()
{  
  /// dtor
  delete fSourceGains;
  delete fSourcePedestals;
}

//_____________________________________________________________________________
void
AliMUONGainEventGenerator::Exec(Option_t*)
{
  /// Main method
  
  AliCodeTimer::Instance()->Reset();
  
  const Int_t kNInjections = 9;
  Float_t injections[kNInjections] = { 0,  200 , 400,  800, 1200, 1600, 
                                      2000, 2500, 3000 };
  
  for ( Int_t i = 0; i < kNInjections; ++i ) 
  {
    Int_t runNumber = fSourcePedestalRunNumber + i;
    if (i)
    {
      GeneratePedestals(runNumber,injections[i]);
    }
    TString pwd(gSystem->WorkingDirectory());
    TString dir(Form("%s/RUN%d",pwd.Data(),runNumber));
    AliInfo(Form("Creating directory %s",dir.Data()));
    gSystem->MakeDirectory(dir.Data());
    gSystem->ChangeDirectory(dir.Data());
    AliCodeTimerAuto(Form("generation of pedestal for run %d",runNumber),0);
    TString pedfile;
    if ( fDateBaseFileName.Length() > 0 ) pedfile = Form("%s.%d",fDateBaseFileName.Data(),runNumber);
    AliMUONPedestalEventGenerator pgen(runNumber,fNofEventsPerFile,pedfile.Data());
    AliInfo(Form("Generating pedestal events for injection number %d. Please be patient.",i));
    pgen.Exec("");
    gSystem->ChangeDirectory(pwd.Data());
  }
  
  AliCodeTimer::Instance()->Print();
}

//_____________________________________________________________________________
void
AliMUONGainEventGenerator::GeneratePedestals(Int_t runNumber, Float_t injection)
{
  /// Generate "pedestal" values for a given run, by "decalibrating"
  /// charge injection
  
  AliCodeTimerAuto(Form("Run %d injection %7.2f",runNumber,injection),0);
  TIter next(fSourceGains->CreateIterator());
  
  AliMUONVStore* generatedPedestals = fSourcePedestals->Create();
  
  AliMUONVCalibParam* gain;
  AliMUONVCalibParam* ped;
  
  while ( ( gain = static_cast<AliMUONVCalibParam*>(next()) ) )
  {
    ped = static_cast<AliMUONVCalibParam*>(fSourcePedestals->FindObject(gain->ID0(),gain->ID1()));
    
    AliMUONVCalibParam* genPed = static_cast<AliMUONVCalibParam*>(generatedPedestals->FindObject(gain->ID0(),gain->ID1()));
    if (!genPed)
    {
      genPed = static_cast<AliMUONVCalibParam*>(ped->Clone());
      generatedPedestals->Add(genPed);
    }
    
    for ( Int_t i = 0; i < ped->Size(); ++i ) 
    {
      Float_t mean = ped->ValueAsFloat(i,0);
      if ( mean == AliMUONVCalibParam::InvalidFloatValue() ) 
      {
        // non existing channel
        continue;
      }
      Int_t adc = AliMUONDigitizerV3::DecalibrateTrackerDigit(*ped,gain,i,
                                                              injection,kFALSE);

      Float_t res = (ped->ValueAsFloat(i,1)/mean);
            
      genPed->SetValueAsFloat(i,0,adc);
      genPed->SetValueAsFloat(i,1,adc*res);
    }
  }
  
  WriteToCDB(generatedPedestals,runNumber);
  
  delete generatedPedestals;
}

//_____________________________________________________________________________
void 
AliMUONGainEventGenerator::WriteToCDB(TObject* object, Int_t runNumber)
{
  /// Write a given object to OCDB
  
  AliCDBId id("MUON/Calib/Pedestals",runNumber,runNumber);
  AliCDBMetaData md;
  md.SetAliRootVersion(gROOT->GetVersion());
  md.SetComment("Pedestal values generated from AliMUONGainEventGenerator");
  md.SetResponsible("AliMUONGainEventGenerator");
  
  AliCDBManager* man = AliCDBManager::Instance();
  man->SetDefaultStorage("local://$ALICE_ROOT/OCDB/SHUTTLE/TestShuttle/TestCDB");
  man->Put(object,id,&md);
}
 AliMUONGainEventGenerator.cxx:1
 AliMUONGainEventGenerator.cxx:2
 AliMUONGainEventGenerator.cxx:3
 AliMUONGainEventGenerator.cxx:4
 AliMUONGainEventGenerator.cxx:5
 AliMUONGainEventGenerator.cxx:6
 AliMUONGainEventGenerator.cxx:7
 AliMUONGainEventGenerator.cxx:8
 AliMUONGainEventGenerator.cxx:9
 AliMUONGainEventGenerator.cxx:10
 AliMUONGainEventGenerator.cxx:11
 AliMUONGainEventGenerator.cxx:12
 AliMUONGainEventGenerator.cxx:13
 AliMUONGainEventGenerator.cxx:14
 AliMUONGainEventGenerator.cxx:15
 AliMUONGainEventGenerator.cxx:16
 AliMUONGainEventGenerator.cxx:17
 AliMUONGainEventGenerator.cxx:18
 AliMUONGainEventGenerator.cxx:19
 AliMUONGainEventGenerator.cxx:20
 AliMUONGainEventGenerator.cxx:21
 AliMUONGainEventGenerator.cxx:22
 AliMUONGainEventGenerator.cxx:23
 AliMUONGainEventGenerator.cxx:24
 AliMUONGainEventGenerator.cxx:25
 AliMUONGainEventGenerator.cxx:26
 AliMUONGainEventGenerator.cxx:27
 AliMUONGainEventGenerator.cxx:28
 AliMUONGainEventGenerator.cxx:29
 AliMUONGainEventGenerator.cxx:30
 AliMUONGainEventGenerator.cxx:31
 AliMUONGainEventGenerator.cxx:32
 AliMUONGainEventGenerator.cxx:33
 AliMUONGainEventGenerator.cxx:34
 AliMUONGainEventGenerator.cxx:35
 AliMUONGainEventGenerator.cxx:36
 AliMUONGainEventGenerator.cxx:37
 AliMUONGainEventGenerator.cxx:38
 AliMUONGainEventGenerator.cxx:39
 AliMUONGainEventGenerator.cxx:40
 AliMUONGainEventGenerator.cxx:41
 AliMUONGainEventGenerator.cxx:42
 AliMUONGainEventGenerator.cxx:43
 AliMUONGainEventGenerator.cxx:44
 AliMUONGainEventGenerator.cxx:45
 AliMUONGainEventGenerator.cxx:46
 AliMUONGainEventGenerator.cxx:47
 AliMUONGainEventGenerator.cxx:48
 AliMUONGainEventGenerator.cxx:49
 AliMUONGainEventGenerator.cxx:50
 AliMUONGainEventGenerator.cxx:51
 AliMUONGainEventGenerator.cxx:52
 AliMUONGainEventGenerator.cxx:53
 AliMUONGainEventGenerator.cxx:54
 AliMUONGainEventGenerator.cxx:55
 AliMUONGainEventGenerator.cxx:56
 AliMUONGainEventGenerator.cxx:57
 AliMUONGainEventGenerator.cxx:58
 AliMUONGainEventGenerator.cxx:59
 AliMUONGainEventGenerator.cxx:60
 AliMUONGainEventGenerator.cxx:61
 AliMUONGainEventGenerator.cxx:62
 AliMUONGainEventGenerator.cxx:63
 AliMUONGainEventGenerator.cxx:64
 AliMUONGainEventGenerator.cxx:65
 AliMUONGainEventGenerator.cxx:66
 AliMUONGainEventGenerator.cxx:67
 AliMUONGainEventGenerator.cxx:68
 AliMUONGainEventGenerator.cxx:69
 AliMUONGainEventGenerator.cxx:70
 AliMUONGainEventGenerator.cxx:71
 AliMUONGainEventGenerator.cxx:72
 AliMUONGainEventGenerator.cxx:73
 AliMUONGainEventGenerator.cxx:74
 AliMUONGainEventGenerator.cxx:75
 AliMUONGainEventGenerator.cxx:76
 AliMUONGainEventGenerator.cxx:77
 AliMUONGainEventGenerator.cxx:78
 AliMUONGainEventGenerator.cxx:79
 AliMUONGainEventGenerator.cxx:80
 AliMUONGainEventGenerator.cxx:81
 AliMUONGainEventGenerator.cxx:82
 AliMUONGainEventGenerator.cxx:83
 AliMUONGainEventGenerator.cxx:84
 AliMUONGainEventGenerator.cxx:85
 AliMUONGainEventGenerator.cxx:86
 AliMUONGainEventGenerator.cxx:87
 AliMUONGainEventGenerator.cxx:88
 AliMUONGainEventGenerator.cxx:89
 AliMUONGainEventGenerator.cxx:90
 AliMUONGainEventGenerator.cxx:91
 AliMUONGainEventGenerator.cxx:92
 AliMUONGainEventGenerator.cxx:93
 AliMUONGainEventGenerator.cxx:94
 AliMUONGainEventGenerator.cxx:95
 AliMUONGainEventGenerator.cxx:96
 AliMUONGainEventGenerator.cxx:97
 AliMUONGainEventGenerator.cxx:98
 AliMUONGainEventGenerator.cxx:99
 AliMUONGainEventGenerator.cxx:100
 AliMUONGainEventGenerator.cxx:101
 AliMUONGainEventGenerator.cxx:102
 AliMUONGainEventGenerator.cxx:103
 AliMUONGainEventGenerator.cxx:104
 AliMUONGainEventGenerator.cxx:105
 AliMUONGainEventGenerator.cxx:106
 AliMUONGainEventGenerator.cxx:107
 AliMUONGainEventGenerator.cxx:108
 AliMUONGainEventGenerator.cxx:109
 AliMUONGainEventGenerator.cxx:110
 AliMUONGainEventGenerator.cxx:111
 AliMUONGainEventGenerator.cxx:112
 AliMUONGainEventGenerator.cxx:113
 AliMUONGainEventGenerator.cxx:114
 AliMUONGainEventGenerator.cxx:115
 AliMUONGainEventGenerator.cxx:116
 AliMUONGainEventGenerator.cxx:117
 AliMUONGainEventGenerator.cxx:118
 AliMUONGainEventGenerator.cxx:119
 AliMUONGainEventGenerator.cxx:120
 AliMUONGainEventGenerator.cxx:121
 AliMUONGainEventGenerator.cxx:122
 AliMUONGainEventGenerator.cxx:123
 AliMUONGainEventGenerator.cxx:124
 AliMUONGainEventGenerator.cxx:125
 AliMUONGainEventGenerator.cxx:126
 AliMUONGainEventGenerator.cxx:127
 AliMUONGainEventGenerator.cxx:128
 AliMUONGainEventGenerator.cxx:129
 AliMUONGainEventGenerator.cxx:130
 AliMUONGainEventGenerator.cxx:131
 AliMUONGainEventGenerator.cxx:132
 AliMUONGainEventGenerator.cxx:133
 AliMUONGainEventGenerator.cxx:134
 AliMUONGainEventGenerator.cxx:135
 AliMUONGainEventGenerator.cxx:136
 AliMUONGainEventGenerator.cxx:137
 AliMUONGainEventGenerator.cxx:138
 AliMUONGainEventGenerator.cxx:139
 AliMUONGainEventGenerator.cxx:140
 AliMUONGainEventGenerator.cxx:141
 AliMUONGainEventGenerator.cxx:142
 AliMUONGainEventGenerator.cxx:143
 AliMUONGainEventGenerator.cxx:144
 AliMUONGainEventGenerator.cxx:145
 AliMUONGainEventGenerator.cxx:146
 AliMUONGainEventGenerator.cxx:147
 AliMUONGainEventGenerator.cxx:148
 AliMUONGainEventGenerator.cxx:149
 AliMUONGainEventGenerator.cxx:150
 AliMUONGainEventGenerator.cxx:151
 AliMUONGainEventGenerator.cxx:152
 AliMUONGainEventGenerator.cxx:153
 AliMUONGainEventGenerator.cxx:154
 AliMUONGainEventGenerator.cxx:155
 AliMUONGainEventGenerator.cxx:156
 AliMUONGainEventGenerator.cxx:157
 AliMUONGainEventGenerator.cxx:158
 AliMUONGainEventGenerator.cxx:159
 AliMUONGainEventGenerator.cxx:160
 AliMUONGainEventGenerator.cxx:161
 AliMUONGainEventGenerator.cxx:162
 AliMUONGainEventGenerator.cxx:163
 AliMUONGainEventGenerator.cxx:164
 AliMUONGainEventGenerator.cxx:165
 AliMUONGainEventGenerator.cxx:166
 AliMUONGainEventGenerator.cxx:167
 AliMUONGainEventGenerator.cxx:168
 AliMUONGainEventGenerator.cxx:169
 AliMUONGainEventGenerator.cxx:170
 AliMUONGainEventGenerator.cxx:171
 AliMUONGainEventGenerator.cxx:172
 AliMUONGainEventGenerator.cxx:173
 AliMUONGainEventGenerator.cxx:174
 AliMUONGainEventGenerator.cxx:175
 AliMUONGainEventGenerator.cxx:176
 AliMUONGainEventGenerator.cxx:177
 AliMUONGainEventGenerator.cxx:178
 AliMUONGainEventGenerator.cxx:179
 AliMUONGainEventGenerator.cxx:180
 AliMUONGainEventGenerator.cxx:181
 AliMUONGainEventGenerator.cxx:182
 AliMUONGainEventGenerator.cxx:183
 AliMUONGainEventGenerator.cxx:184
 AliMUONGainEventGenerator.cxx:185
 AliMUONGainEventGenerator.cxx:186
 AliMUONGainEventGenerator.cxx:187
 AliMUONGainEventGenerator.cxx:188
 AliMUONGainEventGenerator.cxx:189
 AliMUONGainEventGenerator.cxx:190
 AliMUONGainEventGenerator.cxx:191
 AliMUONGainEventGenerator.cxx:192
 AliMUONGainEventGenerator.cxx:193
 AliMUONGainEventGenerator.cxx:194
 AliMUONGainEventGenerator.cxx:195