3 // Task to setup emcal related global objects.
7 #include "AliEmcalSetupTask.h"
8 #include <TClonesArray.h>
9 #include <TGeoGlobalMagField.h>
10 #include <TGeoManager.h>
12 #include "AliAODEvent.h"
13 #include "AliAnalysisManager.h"
14 #include "AliCDBManager.h"
15 #include "AliEMCALGeometry.h"
16 #include "AliESDEvent.h"
17 #include "AliGRPManager.h"
18 #include "AliGeomManager.h"
20 #include "AliOADBContainer.h"
21 #include "AliTender.h"
23 ClassImp(AliEmcalSetupTask)
25 //________________________________________________________________________
26 AliEmcalSetupTask::AliEmcalSetupTask() :
28 fOcdbPath("uselocal"),
29 fOadbPath("$ALICE_ROOT/OADB/EMCAL"),
30 fGeoPath("$ALICE_ROOT/OADB/EMCAL"),
31 fObjs("GRP ITS TPC TRD EMCAL"),
39 //________________________________________________________________________
40 AliEmcalSetupTask::AliEmcalSetupTask(const char *name) :
41 AliAnalysisTaskSE(name),
42 fOcdbPath("uselocal"),
43 fOadbPath("$ALICE_ROOT/OADB/EMCAL"),
44 fGeoPath("$ALICE_ROOT/OADB/EMCAL"),
45 fObjs("GRP ITS TPC TRD EMCAL"),
51 fBranchNames = "ESD:AliESDHeader.,AliESDRun.";
54 //________________________________________________________________________
55 AliEmcalSetupTask::~AliEmcalSetupTask()
60 //________________________________________________________________________
61 void AliEmcalSetupTask::ConnectInputData(Option_t *option)
65 AliAnalysisTaskSE::ConnectInputData(option);
67 if (fOcdbPath.Length()==0)
70 AliCDBManager *man = AliCDBManager::Instance();
71 if (man->IsDefaultStorageSet())
77 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
81 TObjArray *tasks = am->GetTasks();
85 AliTender *tender = 0;
86 for (Int_t i=0; i<tasks->GetEntries(); ++i) {
87 tender = dynamic_cast<AliTender*>(tasks->At(i));
95 if (fOcdbPath != "uselocal") {
96 tender->SetDefaultCDBStorage(fOcdbPath);
100 Int_t runno = AliAnalysisManager::GetAnalysisManager()->GetRunFromPath();
102 AliWarning(Form("Disabling tender, ignore possible message from tender below"));
103 tender->SetDefaultCDBStorage("donotuse");
107 AliWarning(Form("Intercepting tender for run %d, ignore possible message from tender below", runno));
109 tender->SetDefaultCDBStorage(fLocalOcdbStor);
112 //________________________________________________________________________
113 void AliEmcalSetupTask::UserExec(Option_t *)
115 // Main loop, called for each event.
120 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
122 AliError("Manager zero, returning");
126 am->LoadBranch("AliESDRun.");
127 am->LoadBranch("AliESDHeader.");
129 Int_t runno = InputEvent()->GetRunNumber();
133 //________________________________________________________________________
134 void AliEmcalSetupTask::Setup(Int_t runno)
141 // Setup AliEMCALGeometry corresponding to year
142 TString geoname("EMCAL_COMPLETE12SMV1");
146 geoname = "EMCAL_FIRSTYEARV1";
147 } else if ((runno>139517) && (runno<=170593)) {
149 geoname = "EMCAL_COMPLETEV1";
150 } else if ((runno>170593) && (runno<=193766)) {
153 AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance(geoname);
155 AliFatal(Form("Can not create geometry: %s",geoname.Data()));
160 AliCDBManager *man = 0;
161 man = AliCDBManager::Instance();
162 if (man->IsDefaultStorageSet()) {
163 AliInfo(Form("Default OCDB storage already set"));
165 if (fOcdbPath.Length()==0) {
166 man = 0; // do not use OCDB
167 } else if (fOcdbPath != "uselocal") {
168 AliInfo(Form("Setting up OCDB to point to %s",fOcdbPath.Data()));
169 man->SetDefaultStorage(fOcdbPath);
170 } else { // use local copy of OCDB
171 TString tmpdir=gSystem->WorkingDirectory();
172 if (gSystem->AccessPathName(tmpdir))
175 tmpdir+=gSystem->GetUid();
182 fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
183 while (!gSystem->AccessPathName(fLocalOcdb)) {
185 fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
188 AliFatal(Form("Could not create local directory for OCDB at %s",tmpdir.Data()));
191 gSystem->MakeDirectory(fLocalOcdb);
192 TString filename(Form("$ALICE_ROOT/PWG/EMCAL/data/%d.dat",year));
193 TString cmd(Form("cd %s && tar -xf %s",fLocalOcdb.Data(),filename.Data()));
194 Int_t ret = gSystem->Exec(cmd);
196 TString locdb("local://");
200 AliInfo(Form("Setting up local OCDB at %s",locdb.Data()));
201 man->SetDefaultStorage(locdb);
202 fLocalOcdbStor = locdb;
204 AliFatal(Form("Could not set up local OCDB at %s",fLocalOcdb.Data()));
209 // Load geometry from OCDB
211 if (man->GetRun()!=runno)
213 AliInfo(Form("Loading grp data from OCDB for run %d", runno));
214 AliGRPManager GRPManager;
215 GRPManager.ReadGRPEntry();
216 GRPManager.SetMagField();
217 AliInfo(Form("Loading geometry from OCDB"));
218 AliGeomManager::LoadGeometry();
220 AliGeomManager::ApplyAlignObjsFromCDB(fObjs);
223 // Load geometry from file (does not use misalignment of ITS/TPC!)
224 TGeoManager *geo = AliGeomManager::GetGeometry();
225 if (!geo && fGeoPath.Length()>0) {
226 TString fname(gSystem->ExpandPathName(Form("%s/geometry_%d.root", fGeoPath.Data(), year)));
227 if (gSystem->AccessPathName(fname)==0) {
228 AliInfo(Form("Loading geometry from file %s (should be avoided!)", fname.Data()));
229 AliGeomManager::LoadGeometry(fname);
230 geo = AliGeomManager::GetGeometry();
236 AliInfo(Form("Locking geometry"));
240 // Construct field map
241 if (!TGeoGlobalMagField::Instance()->GetField()) {
242 InputEvent()->InitMagneticField();
245 // Apply mis-alignment matrices from OADB
246 if (fOadbPath.Length()>0) {
247 AliOADBContainer emcalgeoCont(Form("emcal"));
248 emcalgeoCont.InitFromFile(Form("%s/EMCALlocal2master.root",fOadbPath.Data()),
249 Form("AliEMCALgeo"));
250 TObjArray *mobj=dynamic_cast<TObjArray*>(emcalgeoCont.GetObject(runno,"EmcalMatrices"));
252 for(Int_t mod=0; mod < (geom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
253 //AliInfo(Form("Misalignment matrix %d", mod));
254 geom->SetMisalMatrix((TGeoHMatrix*) mobj->At(mod),mod);
262 //________________________________________________________________________
263 void AliEmcalSetupTask::Terminate(Option_t *)
265 // Called at the end.
267 if (fLocalOcdb.Length()>0) {
268 TString cmd(Form("rm -rf %s", fLocalOcdb.Data()));