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.                  *
 **************************************************************************/

#include "AliTaskConfigOCDB.h"

#include <TChain.h>
#include <TFile.h>
#include <TGeoGlobalMagField.h>
#include "TGeoManager.h"
#include <TRegexp.h>
 
#include "AliAnalysisManager.h"
#include "AliGeomManager.h"
#include "AliCDBManager.h"
#include "AliGRPManager.h"
#include "AliESDEvent.h"
#include "AliESDInputHandler.h"
#include "AliLog.h"

ClassImp(AliTaskConfigOCDB)

//______________________________________________________________________________
AliTaskConfigOCDB::AliTaskConfigOCDB():
           AliAnalysisTask(),
           fRun(0),
           fOCDBstorage(),
           fRunChanged(kFALSE),
           fESDhandler(NULL),
           fESD(NULL),
           fGRPManager(NULL)
{
// Dummy constructor
}

//______________________________________________________________________________
AliTaskConfigOCDB::AliTaskConfigOCDB(const char* name, const char *storage, Int_t run)
          :AliAnalysisTask(name, "configure OCDB field geom"),
           fRun(run),
           fOCDBstorage(storage),
           fRunChanged(kFALSE),
           fESDhandler(NULL),
           fESD(NULL),
           fGRPManager(NULL)
{
// Default constructor
  AliCDBManager *cdb = AliCDBManager::Instance();
  cdb->SetDefaultStorage(storage);
  cdb->SetRun(run);
  DefineInput (0, TChain::Class());
}

//______________________________________________________________________________
AliTaskConfigOCDB::~AliTaskConfigOCDB()
{
// Destructor
  delete fGRPManager;
}  

//______________________________________________________________________________
void AliTaskConfigOCDB::LocalInit()
{
// Init CDB locally if run number is defined.
}
  
//______________________________________________________________________________
void AliTaskConfigOCDB::ConnectInputData(Option_t* /*option*/)
{
// Connect the input data, create CDB manager.
}

//______________________________________________________________________________
void AliTaskConfigOCDB::InitGRP()
{
// Initialize geometry and mag. field
  if (!fGRPManager) {
  // magnetic field
    if (!TGeoGlobalMagField::Instance()->GetField()) {
      printf("AliCDBconnect: #### Loading field map...\n");
      fGRPManager = new AliGRPManager();
      if(!fGRPManager->ReadGRPEntry()) { 
        AliError("Cannot get GRP entry"); 
      }
      if( !fGRPManager->SetMagField() ) { 
        AliError("Problem with magnetic field setup"); 
      }
    }

    // geometry
    if (!gGeoManager) {
      printf("AliCDBconnect: #### Loading geometry...\n");
      AliGeomManager::LoadGeometry();
      if( !AliGeomManager::ApplyAlignObjsFromCDB("GRP ITS TPC TRD") ) {
        AliError("Problem with align objects"); 
      }
    }  
  }  
}

//______________________________________________________________________________
void AliTaskConfigOCDB::CreateOutputObjects()
{
// Init CDB locally if run number is defined.
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) AliFatal("No analysis manager");
  fESDhandler = dynamic_cast<AliESDInputHandler *>(mgr->GetInputEventHandler());
    
  if (!fESDhandler) {
     AliFatal("No ESD input event handler connected");
     return;
  }   
  // Try to get event number before the first event is read (this has precedence
  // over existing fRun)
  TTree* inputTree = mgr->GetTree();
  if (!inputTree) { AliError("no input tree"); return; }
  TFile* inputFile = inputTree->GetCurrentFile();
  if (!inputFile) { AliError("no input file"); return; }
  TString inputFileName(inputFile->GetName());
  Int_t run = guessRunNumber(inputFileName);
  mgr->SetRunFromPath(run);

  if (!run && !fRun) {
     AliError("AliTaskConfigOCDB: Run not set - no CDB connection");
     return;
  }
  // Create CDB manager
  AliCDBManager *cdb = AliCDBManager::Instance();
  // If CDB is unlocked, set the def storage
  if (!cdb->GetLock())
  {
    cdb->SetDefaultStorage(fOCDBstorage);
  }

  if (run && (run != fRun)) {
     fRunChanged = kTRUE;
     fRun = run;
  } else {
     fRunChanged = kFALSE;
  }
  // Set run
  if (fRunChanged || !fGRPManager) {
     printf("AliCDBconnect: #### Setting run to: %d\n", fRun);
     cdb->SetRun(fRun);
     // Initialize GRP manager only once
     if (fRun) InitGRP();
  }   
}

//______________________________________________________________________________
Bool_t AliTaskConfigOCDB::Notify()
{
// Init CDB locally if run number is defined.
  CreateOutputObjects();
  return kTRUE;
}

//______________________________________________________________________________
void AliTaskConfigOCDB::Exec(Option_t* /*option*/)
{
//
// Execute all supplied analysis of one event. Notify run change via RunChanged().
  fESD = fESDhandler->GetEvent();
  // Intercept when the run number changed
  if (fRun != fESD->GetRunNumber()) {
    fRunChanged = kTRUE;
    fRun = fESD->GetRunNumber();
    CreateOutputObjects();
  }
}

//______________________________________________________________________________
void AliTaskConfigOCDB::Terminate(Option_t *)
{
  // Initialize CDB also in Terminate
  //   CreateOutputObjects();
}

Int_t AliTaskConfigOCDB::guessRunNumber(TString path)
{
  //guess the runnumber from datapath
  //works also on the LEGO train where the data path looks like this:
  //workdir/testdata/__alice__data__2010__LHC10b__000114924__ESDs__pass2_root_archive_AliESDs_2/10000114924018.100/root_archive.zip
  TObjArray* a = path.Tokenize("/_");
  TRegexp r("^000[0-9][0-9][0-9][0-9][0-9][0-9]$");
  TString sub;
  for (Int_t i=0; i<a->GetEntries();i++)
  {
    TObjString* subobj = (TObjString*)a->At(i);
    TString subtmp = subobj->GetString();
    if (subtmp.Contains(r)) 
    {
      sub=subtmp;
      break;
    }
  }
  Int_t runNumber=sub.Atoi();
  AliInfo(Form("guessed run: %i\n",runNumber));
  a->Delete();
  delete a;
  return runNumber;
}       
 AliTaskConfigOCDB.cxx:1
 AliTaskConfigOCDB.cxx:2
 AliTaskConfigOCDB.cxx:3
 AliTaskConfigOCDB.cxx:4
 AliTaskConfigOCDB.cxx:5
 AliTaskConfigOCDB.cxx:6
 AliTaskConfigOCDB.cxx:7
 AliTaskConfigOCDB.cxx:8
 AliTaskConfigOCDB.cxx:9
 AliTaskConfigOCDB.cxx:10
 AliTaskConfigOCDB.cxx:11
 AliTaskConfigOCDB.cxx:12
 AliTaskConfigOCDB.cxx:13
 AliTaskConfigOCDB.cxx:14
 AliTaskConfigOCDB.cxx:15
 AliTaskConfigOCDB.cxx:16
 AliTaskConfigOCDB.cxx:17
 AliTaskConfigOCDB.cxx:18
 AliTaskConfigOCDB.cxx:19
 AliTaskConfigOCDB.cxx:20
 AliTaskConfigOCDB.cxx:21
 AliTaskConfigOCDB.cxx:22
 AliTaskConfigOCDB.cxx:23
 AliTaskConfigOCDB.cxx:24
 AliTaskConfigOCDB.cxx:25
 AliTaskConfigOCDB.cxx:26
 AliTaskConfigOCDB.cxx:27
 AliTaskConfigOCDB.cxx:28
 AliTaskConfigOCDB.cxx:29
 AliTaskConfigOCDB.cxx:30
 AliTaskConfigOCDB.cxx:31
 AliTaskConfigOCDB.cxx:32
 AliTaskConfigOCDB.cxx:33
 AliTaskConfigOCDB.cxx:34
 AliTaskConfigOCDB.cxx:35
 AliTaskConfigOCDB.cxx:36
 AliTaskConfigOCDB.cxx:37
 AliTaskConfigOCDB.cxx:38
 AliTaskConfigOCDB.cxx:39
 AliTaskConfigOCDB.cxx:40
 AliTaskConfigOCDB.cxx:41
 AliTaskConfigOCDB.cxx:42
 AliTaskConfigOCDB.cxx:43
 AliTaskConfigOCDB.cxx:44
 AliTaskConfigOCDB.cxx:45
 AliTaskConfigOCDB.cxx:46
 AliTaskConfigOCDB.cxx:47
 AliTaskConfigOCDB.cxx:48
 AliTaskConfigOCDB.cxx:49
 AliTaskConfigOCDB.cxx:50
 AliTaskConfigOCDB.cxx:51
 AliTaskConfigOCDB.cxx:52
 AliTaskConfigOCDB.cxx:53
 AliTaskConfigOCDB.cxx:54
 AliTaskConfigOCDB.cxx:55
 AliTaskConfigOCDB.cxx:56
 AliTaskConfigOCDB.cxx:57
 AliTaskConfigOCDB.cxx:58
 AliTaskConfigOCDB.cxx:59
 AliTaskConfigOCDB.cxx:60
 AliTaskConfigOCDB.cxx:61
 AliTaskConfigOCDB.cxx:62
 AliTaskConfigOCDB.cxx:63
 AliTaskConfigOCDB.cxx:64
 AliTaskConfigOCDB.cxx:65
 AliTaskConfigOCDB.cxx:66
 AliTaskConfigOCDB.cxx:67
 AliTaskConfigOCDB.cxx:68
 AliTaskConfigOCDB.cxx:69
 AliTaskConfigOCDB.cxx:70
 AliTaskConfigOCDB.cxx:71
 AliTaskConfigOCDB.cxx:72
 AliTaskConfigOCDB.cxx:73
 AliTaskConfigOCDB.cxx:74
 AliTaskConfigOCDB.cxx:75
 AliTaskConfigOCDB.cxx:76
 AliTaskConfigOCDB.cxx:77
 AliTaskConfigOCDB.cxx:78
 AliTaskConfigOCDB.cxx:79
 AliTaskConfigOCDB.cxx:80
 AliTaskConfigOCDB.cxx:81
 AliTaskConfigOCDB.cxx:82
 AliTaskConfigOCDB.cxx:83
 AliTaskConfigOCDB.cxx:84
 AliTaskConfigOCDB.cxx:85
 AliTaskConfigOCDB.cxx:86
 AliTaskConfigOCDB.cxx:87
 AliTaskConfigOCDB.cxx:88
 AliTaskConfigOCDB.cxx:89
 AliTaskConfigOCDB.cxx:90
 AliTaskConfigOCDB.cxx:91
 AliTaskConfigOCDB.cxx:92
 AliTaskConfigOCDB.cxx:93
 AliTaskConfigOCDB.cxx:94
 AliTaskConfigOCDB.cxx:95
 AliTaskConfigOCDB.cxx:96
 AliTaskConfigOCDB.cxx:97
 AliTaskConfigOCDB.cxx:98
 AliTaskConfigOCDB.cxx:99
 AliTaskConfigOCDB.cxx:100
 AliTaskConfigOCDB.cxx:101
 AliTaskConfigOCDB.cxx:102
 AliTaskConfigOCDB.cxx:103
 AliTaskConfigOCDB.cxx:104
 AliTaskConfigOCDB.cxx:105
 AliTaskConfigOCDB.cxx:106
 AliTaskConfigOCDB.cxx:107
 AliTaskConfigOCDB.cxx:108
 AliTaskConfigOCDB.cxx:109
 AliTaskConfigOCDB.cxx:110
 AliTaskConfigOCDB.cxx:111
 AliTaskConfigOCDB.cxx:112
 AliTaskConfigOCDB.cxx:113
 AliTaskConfigOCDB.cxx:114
 AliTaskConfigOCDB.cxx:115
 AliTaskConfigOCDB.cxx:116
 AliTaskConfigOCDB.cxx:117
 AliTaskConfigOCDB.cxx:118
 AliTaskConfigOCDB.cxx:119
 AliTaskConfigOCDB.cxx:120
 AliTaskConfigOCDB.cxx:121
 AliTaskConfigOCDB.cxx:122
 AliTaskConfigOCDB.cxx:123
 AliTaskConfigOCDB.cxx:124
 AliTaskConfigOCDB.cxx:125
 AliTaskConfigOCDB.cxx:126
 AliTaskConfigOCDB.cxx:127
 AliTaskConfigOCDB.cxx:128
 AliTaskConfigOCDB.cxx:129
 AliTaskConfigOCDB.cxx:130
 AliTaskConfigOCDB.cxx:131
 AliTaskConfigOCDB.cxx:132
 AliTaskConfigOCDB.cxx:133
 AliTaskConfigOCDB.cxx:134
 AliTaskConfigOCDB.cxx:135
 AliTaskConfigOCDB.cxx:136
 AliTaskConfigOCDB.cxx:137
 AliTaskConfigOCDB.cxx:138
 AliTaskConfigOCDB.cxx:139
 AliTaskConfigOCDB.cxx:140
 AliTaskConfigOCDB.cxx:141
 AliTaskConfigOCDB.cxx:142
 AliTaskConfigOCDB.cxx:143
 AliTaskConfigOCDB.cxx:144
 AliTaskConfigOCDB.cxx:145
 AliTaskConfigOCDB.cxx:146
 AliTaskConfigOCDB.cxx:147
 AliTaskConfigOCDB.cxx:148
 AliTaskConfigOCDB.cxx:149
 AliTaskConfigOCDB.cxx:150
 AliTaskConfigOCDB.cxx:151
 AliTaskConfigOCDB.cxx:152
 AliTaskConfigOCDB.cxx:153
 AliTaskConfigOCDB.cxx:154
 AliTaskConfigOCDB.cxx:155
 AliTaskConfigOCDB.cxx:156
 AliTaskConfigOCDB.cxx:157
 AliTaskConfigOCDB.cxx:158
 AliTaskConfigOCDB.cxx:159
 AliTaskConfigOCDB.cxx:160
 AliTaskConfigOCDB.cxx:161
 AliTaskConfigOCDB.cxx:162
 AliTaskConfigOCDB.cxx:163
 AliTaskConfigOCDB.cxx:164
 AliTaskConfigOCDB.cxx:165
 AliTaskConfigOCDB.cxx:166
 AliTaskConfigOCDB.cxx:167
 AliTaskConfigOCDB.cxx:168
 AliTaskConfigOCDB.cxx:169
 AliTaskConfigOCDB.cxx:170
 AliTaskConfigOCDB.cxx:171
 AliTaskConfigOCDB.cxx:172
 AliTaskConfigOCDB.cxx:173
 AliTaskConfigOCDB.cxx:174
 AliTaskConfigOCDB.cxx:175
 AliTaskConfigOCDB.cxx:176
 AliTaskConfigOCDB.cxx:177
 AliTaskConfigOCDB.cxx:178
 AliTaskConfigOCDB.cxx:179
 AliTaskConfigOCDB.cxx:180
 AliTaskConfigOCDB.cxx:181
 AliTaskConfigOCDB.cxx:182
 AliTaskConfigOCDB.cxx:183
 AliTaskConfigOCDB.cxx:184
 AliTaskConfigOCDB.cxx:185
 AliTaskConfigOCDB.cxx:186
 AliTaskConfigOCDB.cxx:187
 AliTaskConfigOCDB.cxx:188
 AliTaskConfigOCDB.cxx:189
 AliTaskConfigOCDB.cxx:190
 AliTaskConfigOCDB.cxx:191
 AliTaskConfigOCDB.cxx:192
 AliTaskConfigOCDB.cxx:193
 AliTaskConfigOCDB.cxx:194
 AliTaskConfigOCDB.cxx:195
 AliTaskConfigOCDB.cxx:196
 AliTaskConfigOCDB.cxx:197
 AliTaskConfigOCDB.cxx:198
 AliTaskConfigOCDB.cxx:199
 AliTaskConfigOCDB.cxx:200
 AliTaskConfigOCDB.cxx:201
 AliTaskConfigOCDB.cxx:202
 AliTaskConfigOCDB.cxx:203
 AliTaskConfigOCDB.cxx:204
 AliTaskConfigOCDB.cxx:205
 AliTaskConfigOCDB.cxx:206
 AliTaskConfigOCDB.cxx:207
 AliTaskConfigOCDB.cxx:208
 AliTaskConfigOCDB.cxx:209
 AliTaskConfigOCDB.cxx:210
 AliTaskConfigOCDB.cxx:211
 AliTaskConfigOCDB.cxx:212