ROOT logo
// $Id$
//
// Task to setup emcal related global objects.
//
// Author: C.Loizides

#include "AliEmcalSetupTask.h"
#include <TClonesArray.h>
#include <TGeoGlobalMagField.h>
#include <TGeoManager.h>
#include <TRandom.h>
#include "AliAODEvent.h"
#include "AliAnalysisManager.h"
#include "AliCDBManager.h"
#include "AliEMCALGeometry.h"
#include "AliESDEvent.h"
#include "AliGRPManager.h"
#include "AliGeomManager.h"
#include "AliMagF.h"
#include "AliOADBContainer.h"
#include "AliTender.h"

ClassImp(AliEmcalSetupTask)

//________________________________________________________________________
AliEmcalSetupTask::AliEmcalSetupTask() : 
  AliAnalysisTaskSE(),
  fOcdbPath("uselocal"),
  fOadbPath("$ALICE_ROOT/OADB/EMCAL"),
  fGeoPath("$ALICE_ROOT/OADB/EMCAL"),
  fObjs("GRP ITS TPC TRD EMCAL"),
  fNoOCDB(kFALSE),
  fIsInit(kFALSE),
  fLocalOcdb(),
  fLocalOcdbStor()
{
  // Constructor.
}

//________________________________________________________________________
AliEmcalSetupTask::AliEmcalSetupTask(const char *name) : 
  AliAnalysisTaskSE(name),
  fOcdbPath("uselocal"),
  fOadbPath("$ALICE_ROOT/OADB/EMCAL"),
  fGeoPath("$ALICE_ROOT/OADB/EMCAL"),
  fObjs("GRP ITS TPC TRD EMCAL"),
  fNoOCDB(kFALSE),
  fIsInit(kFALSE),
  fLocalOcdb(),
  fLocalOcdbStor()
{
  // Constructor.
  fBranchNames = "ESD:AliESDHeader.,AliESDRun.";
}

//________________________________________________________________________
AliEmcalSetupTask::~AliEmcalSetupTask()
{
  // Destructor.
}

//________________________________________________________________________
void AliEmcalSetupTask::ConnectInputData(Option_t *option)
{
  // Connect input data

  AliAnalysisTaskSE::ConnectInputData(option);

  if (fOcdbPath.Length()==0)
    return;

  AliCDBManager *man = AliCDBManager::Instance();
  if (man->IsDefaultStorageSet()) 
    return;

  if (fIsInit)
    return;

  AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
  if (!am)
    return;

  TObjArray *tasks = am->GetTasks();
  if (!tasks)
    return;

  AliTender *tender = 0;
  for (Int_t i=0; i<tasks->GetEntries(); ++i) {
    tender = dynamic_cast<AliTender*>(tasks->At(i));
    if (tender)
      break;
  }

  if (!tender)
    return;

  if (fOcdbPath != "uselocal") {
    tender->SetDefaultCDBStorage(fOcdbPath);
    return;
  }

  Int_t runno = AliAnalysisManager::GetAnalysisManager()->GetRunFromPath();
  if (runno<=0) {
    AliWarning(Form("Disabling tender, ignore possible message from tender below"));
    tender->SetDefaultCDBStorage("donotuse");
    return;
  }

  AliWarning(Form("Intercepting tender for run %d, ignore possible message from tender below", runno));
  Setup(runno);
  tender->SetDefaultCDBStorage(fLocalOcdbStor);
}

//________________________________________________________________________
void AliEmcalSetupTask::UserExec(Option_t *) 
{
  // Main loop, called for each event.

  if (fIsInit)
    return;

  AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
  if (!am) {
    AliError("Manager zero, returning");
    return;
  }

  am->LoadBranch("AliESDRun.");
  am->LoadBranch("AliESDHeader.");

  Int_t runno = InputEvent()->GetRunNumber();
  Setup(runno);
}

//________________________________________________________________________
void AliEmcalSetupTask::Setup(Int_t runno) 
{
  // Setup everything

  // Setup AliEMCALGeometry corresponding to year
  TString geoname("EMCAL_COMPLETE12SMV1");
  Int_t year = 2013;
  if (runno>0 && runno<=139517) {
    year = 2010;
    geoname = "EMCAL_FIRSTYEARV1";
  } else if ((runno>139517) && (runno<=170593)) {
    year = 2011;
    geoname = "EMCAL_COMPLETEV1";
  } else if ((runno>170593) && (runno<=193766)) {
    year = 2012;
    geoname = "EMCAL_COMPLETE12SMV1";
  } else if ((runno>193766) && (runno <= 199161)) {
    geoname = "EMCAL_COMPLETE12SMV1";
    year = 2013;
  } else if (runno>199161) { //MV: is this the last run of run 1?
    geoname = "EMCAL_COMPLETE12SMV1_DCAL_8SM";
    year = 2015;
  }
  AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance(geoname);
  if (!geom) {
    AliFatal(Form("Can not create geometry: %s",geoname.Data()));
    return;
  }

  if (runno<0)  // Run number 0 can occur for MC
    return;

  // Setup CDB manager
  AliCDBManager *man = 0;
  if (!fNoOCDB) {
    man = AliCDBManager::Instance();
    if (!man)
      AliFatal(Form("Did not get pointer to CDB manager"));

    if (man->IsDefaultStorageSet()) {
      AliInfo(Form("Default OCDB storage already set"));
    } else {
      if (fOcdbPath.Length()==0) {
	man = 0; // do not use OCDB
      } else if (fOcdbPath != "uselocal") {
	AliInfo(Form("Setting up OCDB to point to %s",fOcdbPath.Data()));
	man->SetDefaultStorage(fOcdbPath);
      } else { // use local copy of OCDB
	TString tmpdir=gSystem->WorkingDirectory();
	if (gSystem->AccessPathName(tmpdir))
	  tmpdir = "/tmp";
	tmpdir+="/";
	tmpdir+=gSystem->GetUid();
	tmpdir+="-";
	TDatime t;
	tmpdir+=t.Get();
	tmpdir+="-";
	Int_t counter = 0;
	fLocalOcdb = tmpdir;
	fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
	while (!gSystem->AccessPathName(fLocalOcdb)) {
	  fLocalOcdb = tmpdir;
	  fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
	  counter++;
	  if (counter>100) {
	    AliFatal(Form("Could not create local directory for OCDB at %s",tmpdir.Data()));
	  }
	}
	gSystem->MakeDirectory(fLocalOcdb);
	TString filename(Form("$ALICE_ROOT/PWG/EMCAL/data/%d.dat",year));
	TString cmd(Form("cd %s && tar -xf %s",fLocalOcdb.Data(),filename.Data()));
	Int_t ret = gSystem->Exec(cmd);
	if (ret==0) {
	  TString locdb("local://");
	  locdb+=fLocalOcdb;
	  locdb+="/";
	  locdb+=year;
	  AliInfo(Form("Setting up local OCDB at %s",locdb.Data()));
	  man->SetDefaultStorage(locdb);
	  fLocalOcdbStor = locdb;
	} else {
	  AliFatal(Form("Could not set up local OCDB at %s",fLocalOcdb.Data()));
	}
      }
    }
  }

  // Load geometry from OCDB 
  if (man) {
    if (man->GetRun()!=runno)
      man->SetRun(runno);
    AliInfo(Form("Loading grp data from OCDB for run %d", runno));
    AliGRPManager GRPManager;
    GRPManager.ReadGRPEntry();
    GRPManager.SetMagField();
    AliInfo(Form("Loading geometry from OCDB"));
    AliGeomManager::LoadGeometry();
    if (!fObjs.IsNull())
      AliGeomManager::ApplyAlignObjsFromCDB(fObjs);
  }

  // Load geometry from file (does not use misalignment of ITS/TPC!)
  TGeoManager *geo = AliGeomManager::GetGeometry();
  if (!geo && fGeoPath.Length()>0) {
    TString fname(gSystem->ExpandPathName(Form("%s/geometry_%d.root", fGeoPath.Data(), year)));
    if (gSystem->AccessPathName(fname)==0) {
      AliInfo(Form("Loading geometry from file %s (should be avoided!)", fname.Data()));
      AliGeomManager::LoadGeometry(fname);
      geo = AliGeomManager::GetGeometry();
    }
  }

  // Lock geometry
  if (geo) {
    AliInfo(Form("Locking geometry"));
    geo->LockGeometry();
  }

  // Construct field map
  if (!TGeoGlobalMagField::Instance()->GetField()) { 
    InputEvent()->InitMagneticField();
  }

  // Apply mis-alignment matrices from OADB
  if (fOadbPath.Length()>0) {
    AliOADBContainer emcalgeoCont(Form("emcal"));
    emcalgeoCont.InitFromFile(Form("%s/EMCALlocal2master.root",fOadbPath.Data()),
                              Form("AliEMCALgeo"));
    TObjArray *mobj=dynamic_cast<TObjArray*>(emcalgeoCont.GetObject(runno,"EmcalMatrices"));
    if (mobj) {
      for(Int_t mod=0; mod < (geom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
        //AliInfo(Form("Misalignment matrix %d", mod));
        geom->SetMisalMatrix((TGeoHMatrix*) mobj->At(mod),mod);
      } 
    }
  }

  fIsInit = kTRUE;
}

//________________________________________________________________________
void AliEmcalSetupTask::Terminate(Option_t *) 
{
  // Called at the end.

  if (fLocalOcdb.Length()>0) {
    TString cmd(Form("rm -rf %s", fLocalOcdb.Data()));
    gSystem->Exec(cmd);
  }
}
 AliEmcalSetupTask.cxx:1
 AliEmcalSetupTask.cxx:2
 AliEmcalSetupTask.cxx:3
 AliEmcalSetupTask.cxx:4
 AliEmcalSetupTask.cxx:5
 AliEmcalSetupTask.cxx:6
 AliEmcalSetupTask.cxx:7
 AliEmcalSetupTask.cxx:8
 AliEmcalSetupTask.cxx:9
 AliEmcalSetupTask.cxx:10
 AliEmcalSetupTask.cxx:11
 AliEmcalSetupTask.cxx:12
 AliEmcalSetupTask.cxx:13
 AliEmcalSetupTask.cxx:14
 AliEmcalSetupTask.cxx:15
 AliEmcalSetupTask.cxx:16
 AliEmcalSetupTask.cxx:17
 AliEmcalSetupTask.cxx:18
 AliEmcalSetupTask.cxx:19
 AliEmcalSetupTask.cxx:20
 AliEmcalSetupTask.cxx:21
 AliEmcalSetupTask.cxx:22
 AliEmcalSetupTask.cxx:23
 AliEmcalSetupTask.cxx:24
 AliEmcalSetupTask.cxx:25
 AliEmcalSetupTask.cxx:26
 AliEmcalSetupTask.cxx:27
 AliEmcalSetupTask.cxx:28
 AliEmcalSetupTask.cxx:29
 AliEmcalSetupTask.cxx:30
 AliEmcalSetupTask.cxx:31
 AliEmcalSetupTask.cxx:32
 AliEmcalSetupTask.cxx:33
 AliEmcalSetupTask.cxx:34
 AliEmcalSetupTask.cxx:35
 AliEmcalSetupTask.cxx:36
 AliEmcalSetupTask.cxx:37
 AliEmcalSetupTask.cxx:38
 AliEmcalSetupTask.cxx:39
 AliEmcalSetupTask.cxx:40
 AliEmcalSetupTask.cxx:41
 AliEmcalSetupTask.cxx:42
 AliEmcalSetupTask.cxx:43
 AliEmcalSetupTask.cxx:44
 AliEmcalSetupTask.cxx:45
 AliEmcalSetupTask.cxx:46
 AliEmcalSetupTask.cxx:47
 AliEmcalSetupTask.cxx:48
 AliEmcalSetupTask.cxx:49
 AliEmcalSetupTask.cxx:50
 AliEmcalSetupTask.cxx:51
 AliEmcalSetupTask.cxx:52
 AliEmcalSetupTask.cxx:53
 AliEmcalSetupTask.cxx:54
 AliEmcalSetupTask.cxx:55
 AliEmcalSetupTask.cxx:56
 AliEmcalSetupTask.cxx:57
 AliEmcalSetupTask.cxx:58
 AliEmcalSetupTask.cxx:59
 AliEmcalSetupTask.cxx:60
 AliEmcalSetupTask.cxx:61
 AliEmcalSetupTask.cxx:62
 AliEmcalSetupTask.cxx:63
 AliEmcalSetupTask.cxx:64
 AliEmcalSetupTask.cxx:65
 AliEmcalSetupTask.cxx:66
 AliEmcalSetupTask.cxx:67
 AliEmcalSetupTask.cxx:68
 AliEmcalSetupTask.cxx:69
 AliEmcalSetupTask.cxx:70
 AliEmcalSetupTask.cxx:71
 AliEmcalSetupTask.cxx:72
 AliEmcalSetupTask.cxx:73
 AliEmcalSetupTask.cxx:74
 AliEmcalSetupTask.cxx:75
 AliEmcalSetupTask.cxx:76
 AliEmcalSetupTask.cxx:77
 AliEmcalSetupTask.cxx:78
 AliEmcalSetupTask.cxx:79
 AliEmcalSetupTask.cxx:80
 AliEmcalSetupTask.cxx:81
 AliEmcalSetupTask.cxx:82
 AliEmcalSetupTask.cxx:83
 AliEmcalSetupTask.cxx:84
 AliEmcalSetupTask.cxx:85
 AliEmcalSetupTask.cxx:86
 AliEmcalSetupTask.cxx:87
 AliEmcalSetupTask.cxx:88
 AliEmcalSetupTask.cxx:89
 AliEmcalSetupTask.cxx:90
 AliEmcalSetupTask.cxx:91
 AliEmcalSetupTask.cxx:92
 AliEmcalSetupTask.cxx:93
 AliEmcalSetupTask.cxx:94
 AliEmcalSetupTask.cxx:95
 AliEmcalSetupTask.cxx:96
 AliEmcalSetupTask.cxx:97
 AliEmcalSetupTask.cxx:98
 AliEmcalSetupTask.cxx:99
 AliEmcalSetupTask.cxx:100
 AliEmcalSetupTask.cxx:101
 AliEmcalSetupTask.cxx:102
 AliEmcalSetupTask.cxx:103
 AliEmcalSetupTask.cxx:104
 AliEmcalSetupTask.cxx:105
 AliEmcalSetupTask.cxx:106
 AliEmcalSetupTask.cxx:107
 AliEmcalSetupTask.cxx:108
 AliEmcalSetupTask.cxx:109
 AliEmcalSetupTask.cxx:110
 AliEmcalSetupTask.cxx:111
 AliEmcalSetupTask.cxx:112
 AliEmcalSetupTask.cxx:113
 AliEmcalSetupTask.cxx:114
 AliEmcalSetupTask.cxx:115
 AliEmcalSetupTask.cxx:116
 AliEmcalSetupTask.cxx:117
 AliEmcalSetupTask.cxx:118
 AliEmcalSetupTask.cxx:119
 AliEmcalSetupTask.cxx:120
 AliEmcalSetupTask.cxx:121
 AliEmcalSetupTask.cxx:122
 AliEmcalSetupTask.cxx:123
 AliEmcalSetupTask.cxx:124
 AliEmcalSetupTask.cxx:125
 AliEmcalSetupTask.cxx:126
 AliEmcalSetupTask.cxx:127
 AliEmcalSetupTask.cxx:128
 AliEmcalSetupTask.cxx:129
 AliEmcalSetupTask.cxx:130
 AliEmcalSetupTask.cxx:131
 AliEmcalSetupTask.cxx:132
 AliEmcalSetupTask.cxx:133
 AliEmcalSetupTask.cxx:134
 AliEmcalSetupTask.cxx:135
 AliEmcalSetupTask.cxx:136
 AliEmcalSetupTask.cxx:137
 AliEmcalSetupTask.cxx:138
 AliEmcalSetupTask.cxx:139
 AliEmcalSetupTask.cxx:140
 AliEmcalSetupTask.cxx:141
 AliEmcalSetupTask.cxx:142
 AliEmcalSetupTask.cxx:143
 AliEmcalSetupTask.cxx:144
 AliEmcalSetupTask.cxx:145
 AliEmcalSetupTask.cxx:146
 AliEmcalSetupTask.cxx:147
 AliEmcalSetupTask.cxx:148
 AliEmcalSetupTask.cxx:149
 AliEmcalSetupTask.cxx:150
 AliEmcalSetupTask.cxx:151
 AliEmcalSetupTask.cxx:152
 AliEmcalSetupTask.cxx:153
 AliEmcalSetupTask.cxx:154
 AliEmcalSetupTask.cxx:155
 AliEmcalSetupTask.cxx:156
 AliEmcalSetupTask.cxx:157
 AliEmcalSetupTask.cxx:158
 AliEmcalSetupTask.cxx:159
 AliEmcalSetupTask.cxx:160
 AliEmcalSetupTask.cxx:161
 AliEmcalSetupTask.cxx:162
 AliEmcalSetupTask.cxx:163
 AliEmcalSetupTask.cxx:164
 AliEmcalSetupTask.cxx:165
 AliEmcalSetupTask.cxx:166
 AliEmcalSetupTask.cxx:167
 AliEmcalSetupTask.cxx:168
 AliEmcalSetupTask.cxx:169
 AliEmcalSetupTask.cxx:170
 AliEmcalSetupTask.cxx:171
 AliEmcalSetupTask.cxx:172
 AliEmcalSetupTask.cxx:173
 AliEmcalSetupTask.cxx:174
 AliEmcalSetupTask.cxx:175
 AliEmcalSetupTask.cxx:176
 AliEmcalSetupTask.cxx:177
 AliEmcalSetupTask.cxx:178
 AliEmcalSetupTask.cxx:179
 AliEmcalSetupTask.cxx:180
 AliEmcalSetupTask.cxx:181
 AliEmcalSetupTask.cxx:182
 AliEmcalSetupTask.cxx:183
 AliEmcalSetupTask.cxx:184
 AliEmcalSetupTask.cxx:185
 AliEmcalSetupTask.cxx:186
 AliEmcalSetupTask.cxx:187
 AliEmcalSetupTask.cxx:188
 AliEmcalSetupTask.cxx:189
 AliEmcalSetupTask.cxx:190
 AliEmcalSetupTask.cxx:191
 AliEmcalSetupTask.cxx:192
 AliEmcalSetupTask.cxx:193
 AliEmcalSetupTask.cxx:194
 AliEmcalSetupTask.cxx:195
 AliEmcalSetupTask.cxx:196
 AliEmcalSetupTask.cxx:197
 AliEmcalSetupTask.cxx:198
 AliEmcalSetupTask.cxx:199
 AliEmcalSetupTask.cxx:200
 AliEmcalSetupTask.cxx:201
 AliEmcalSetupTask.cxx:202
 AliEmcalSetupTask.cxx:203
 AliEmcalSetupTask.cxx:204
 AliEmcalSetupTask.cxx:205
 AliEmcalSetupTask.cxx:206
 AliEmcalSetupTask.cxx:207
 AliEmcalSetupTask.cxx:208
 AliEmcalSetupTask.cxx:209
 AliEmcalSetupTask.cxx:210
 AliEmcalSetupTask.cxx:211
 AliEmcalSetupTask.cxx:212
 AliEmcalSetupTask.cxx:213
 AliEmcalSetupTask.cxx:214
 AliEmcalSetupTask.cxx:215
 AliEmcalSetupTask.cxx:216
 AliEmcalSetupTask.cxx:217
 AliEmcalSetupTask.cxx:218
 AliEmcalSetupTask.cxx:219
 AliEmcalSetupTask.cxx:220
 AliEmcalSetupTask.cxx:221
 AliEmcalSetupTask.cxx:222
 AliEmcalSetupTask.cxx:223
 AliEmcalSetupTask.cxx:224
 AliEmcalSetupTask.cxx:225
 AliEmcalSetupTask.cxx:226
 AliEmcalSetupTask.cxx:227
 AliEmcalSetupTask.cxx:228
 AliEmcalSetupTask.cxx:229
 AliEmcalSetupTask.cxx:230
 AliEmcalSetupTask.cxx:231
 AliEmcalSetupTask.cxx:232
 AliEmcalSetupTask.cxx:233
 AliEmcalSetupTask.cxx:234
 AliEmcalSetupTask.cxx:235
 AliEmcalSetupTask.cxx:236
 AliEmcalSetupTask.cxx:237
 AliEmcalSetupTask.cxx:238
 AliEmcalSetupTask.cxx:239
 AliEmcalSetupTask.cxx:240
 AliEmcalSetupTask.cxx:241
 AliEmcalSetupTask.cxx:242
 AliEmcalSetupTask.cxx:243
 AliEmcalSetupTask.cxx:244
 AliEmcalSetupTask.cxx:245
 AliEmcalSetupTask.cxx:246
 AliEmcalSetupTask.cxx:247
 AliEmcalSetupTask.cxx:248
 AliEmcalSetupTask.cxx:249
 AliEmcalSetupTask.cxx:250
 AliEmcalSetupTask.cxx:251
 AliEmcalSetupTask.cxx:252
 AliEmcalSetupTask.cxx:253
 AliEmcalSetupTask.cxx:254
 AliEmcalSetupTask.cxx:255
 AliEmcalSetupTask.cxx:256
 AliEmcalSetupTask.cxx:257
 AliEmcalSetupTask.cxx:258
 AliEmcalSetupTask.cxx:259
 AliEmcalSetupTask.cxx:260
 AliEmcalSetupTask.cxx:261
 AliEmcalSetupTask.cxx:262
 AliEmcalSetupTask.cxx:263
 AliEmcalSetupTask.cxx:264
 AliEmcalSetupTask.cxx:265
 AliEmcalSetupTask.cxx:266
 AliEmcalSetupTask.cxx:267
 AliEmcalSetupTask.cxx:268
 AliEmcalSetupTask.cxx:269
 AliEmcalSetupTask.cxx:270
 AliEmcalSetupTask.cxx:271
 AliEmcalSetupTask.cxx:272
 AliEmcalSetupTask.cxx:273
 AliEmcalSetupTask.cxx:274
 AliEmcalSetupTask.cxx:275
 AliEmcalSetupTask.cxx:276
 AliEmcalSetupTask.cxx:277
 AliEmcalSetupTask.cxx:278
 AliEmcalSetupTask.cxx:279
 AliEmcalSetupTask.cxx:280
 AliEmcalSetupTask.cxx:281
 AliEmcalSetupTask.cxx:282
 AliEmcalSetupTask.cxx:283
 AliEmcalSetupTask.cxx:284
 AliEmcalSetupTask.cxx:285