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"),
40 //________________________________________________________________________
41 AliEmcalSetupTask::AliEmcalSetupTask(const char *name) :
42 AliAnalysisTaskSE(name),
43 fOcdbPath("uselocal"),
44 fOadbPath("$ALICE_ROOT/OADB/EMCAL"),
45 fGeoPath("$ALICE_ROOT/OADB/EMCAL"),
46 fObjs("GRP ITS TPC TRD EMCAL"),
53 fBranchNames = "ESD:AliESDHeader.,AliESDRun.";
56 //________________________________________________________________________
57 AliEmcalSetupTask::~AliEmcalSetupTask()
62 //________________________________________________________________________
63 void AliEmcalSetupTask::ConnectInputData(Option_t *option)
67 AliAnalysisTaskSE::ConnectInputData(option);
69 if (fOcdbPath.Length()==0)
72 AliCDBManager *man = AliCDBManager::Instance();
73 if (man->IsDefaultStorageSet())
79 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
83 TObjArray *tasks = am->GetTasks();
87 AliTender *tender = 0;
88 for (Int_t i=0; i<tasks->GetEntries(); ++i) {
89 tender = dynamic_cast<AliTender*>(tasks->At(i));
97 if (fOcdbPath != "uselocal") {
98 tender->SetDefaultCDBStorage(fOcdbPath);
102 Int_t runno = AliAnalysisManager::GetAnalysisManager()->GetRunFromPath();
104 AliWarning(Form("Disabling tender, ignore possible message from tender below"));
105 tender->SetDefaultCDBStorage("donotuse");
109 AliWarning(Form("Intercepting tender for run %d, ignore possible message from tender below", runno));
111 tender->SetDefaultCDBStorage(fLocalOcdbStor);
114 //________________________________________________________________________
115 void AliEmcalSetupTask::UserExec(Option_t *)
117 // Main loop, called for each event.
122 AliAnalysisManager *am = AliAnalysisManager::GetAnalysisManager();
124 AliError("Manager zero, returning");
128 am->LoadBranch("AliESDRun.");
129 am->LoadBranch("AliESDHeader.");
131 Int_t runno = InputEvent()->GetRunNumber();
135 //________________________________________________________________________
136 void AliEmcalSetupTask::Setup(Int_t runno)
140 // Setup AliEMCALGeometry corresponding to year
141 TString geoname("EMCAL_COMPLETE12SMV1");
143 if (runno>0 && runno<=139517) {
145 geoname = "EMCAL_FIRSTYEARV1";
146 } else if ((runno>139517) && (runno<=170593)) {
148 geoname = "EMCAL_COMPLETEV1";
149 } else if ((runno>170593) && (runno<=193766)) {
152 AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance(geoname);
154 AliFatal(Form("Can not create geometry: %s",geoname.Data()));
162 AliCDBManager *man = 0;
164 man = AliCDBManager::Instance();
166 AliFatal(Form("Did not get pointer to CDB manager"));
168 if (man->IsDefaultStorageSet()) {
169 AliInfo(Form("Default OCDB storage already set"));
171 if (fOcdbPath.Length()==0) {
172 man = 0; // do not use OCDB
173 } else if (fOcdbPath != "uselocal") {
174 AliInfo(Form("Setting up OCDB to point to %s",fOcdbPath.Data()));
175 man->SetDefaultStorage(fOcdbPath);
176 } else { // use local copy of OCDB
177 TString tmpdir=gSystem->WorkingDirectory();
178 if (gSystem->AccessPathName(tmpdir))
181 tmpdir+=gSystem->GetUid();
188 fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
189 while (!gSystem->AccessPathName(fLocalOcdb)) {
191 fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
194 AliFatal(Form("Could not create local directory for OCDB at %s",tmpdir.Data()));
197 gSystem->MakeDirectory(fLocalOcdb);
198 TString filename(Form("$ALICE_ROOT/PWG/EMCAL/data/%d.dat",year));
199 TString cmd(Form("cd %s && tar -xf %s",fLocalOcdb.Data(),filename.Data()));
200 Int_t ret = gSystem->Exec(cmd);
202 TString locdb("local://");
206 AliInfo(Form("Setting up local OCDB at %s",locdb.Data()));
207 man->SetDefaultStorage(locdb);
208 fLocalOcdbStor = locdb;
210 AliFatal(Form("Could not set up local OCDB at %s",fLocalOcdb.Data()));
216 // Load geometry from OCDB
218 if (man->GetRun()!=runno)
220 AliInfo(Form("Loading grp data from OCDB for run %d", runno));
221 AliGRPManager GRPManager;
222 GRPManager.ReadGRPEntry();
223 GRPManager.SetMagField();
224 AliInfo(Form("Loading geometry from OCDB"));
225 AliGeomManager::LoadGeometry();
227 AliGeomManager::ApplyAlignObjsFromCDB(fObjs);
230 // Load geometry from file (does not use misalignment of ITS/TPC!)
231 TGeoManager *geo = AliGeomManager::GetGeometry();
232 if (!geo && fGeoPath.Length()>0) {
233 TString fname(gSystem->ExpandPathName(Form("%s/geometry_%d.root", fGeoPath.Data(), year)));
234 if (gSystem->AccessPathName(fname)==0) {
235 AliInfo(Form("Loading geometry from file %s (should be avoided!)", fname.Data()));
236 AliGeomManager::LoadGeometry(fname);
237 geo = AliGeomManager::GetGeometry();
243 AliInfo(Form("Locking geometry"));
247 // Construct field map
248 if (!TGeoGlobalMagField::Instance()->GetField()) {
249 InputEvent()->InitMagneticField();
252 // Apply mis-alignment matrices from OADB
253 if (fOadbPath.Length()>0) {
254 AliOADBContainer emcalgeoCont(Form("emcal"));
255 emcalgeoCont.InitFromFile(Form("%s/EMCALlocal2master.root",fOadbPath.Data()),
256 Form("AliEMCALgeo"));
257 TObjArray *mobj=dynamic_cast<TObjArray*>(emcalgeoCont.GetObject(runno,"EmcalMatrices"));
259 for(Int_t mod=0; mod < (geom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
260 //AliInfo(Form("Misalignment matrix %d", mod));
261 geom->SetMisalMatrix((TGeoHMatrix*) mobj->At(mod),mod);
269 //________________________________________________________________________
270 void AliEmcalSetupTask::Terminate(Option_t *)
272 // Called at the end.
274 if (fLocalOcdb.Length()>0) {
275 TString cmd(Form("rm -rf %s", fLocalOcdb.Data()));