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)) {
151 geoname = "EMCAL_COMPLETE12SMV1";
152 } else if ((runno>193766) && (runno <= 199161)) {
153 geoname = "EMCAL_COMPLETE12SMV1";
155 } else if (runno>199161) { //MV: is this the last run of run 1?
156 geoname = "EMCAL_COMPLETE12SMV1_DCAL_8SM";
159 AliEMCALGeometry *geom = AliEMCALGeometry::GetInstance(geoname);
161 AliFatal(Form("Can not create geometry: %s",geoname.Data()));
165 if (runno<0) // Run number 0 can occur for MC
169 AliCDBManager *man = 0;
171 man = AliCDBManager::Instance();
173 AliFatal(Form("Did not get pointer to CDB manager"));
175 if (man->IsDefaultStorageSet()) {
176 AliInfo(Form("Default OCDB storage already set"));
178 if (fOcdbPath.Length()==0) {
179 man = 0; // do not use OCDB
180 } else if (fOcdbPath != "uselocal") {
181 AliInfo(Form("Setting up OCDB to point to %s",fOcdbPath.Data()));
182 man->SetDefaultStorage(fOcdbPath);
183 } else { // use local copy of OCDB
184 TString tmpdir=gSystem->WorkingDirectory();
185 if (gSystem->AccessPathName(tmpdir))
188 tmpdir+=gSystem->GetUid();
195 fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
196 while (!gSystem->AccessPathName(fLocalOcdb)) {
198 fLocalOcdb += Form("%d%d%d",gRandom->Integer(999999999),gRandom->Integer(999999999),gRandom->Integer(999999999));
201 AliFatal(Form("Could not create local directory for OCDB at %s",tmpdir.Data()));
204 gSystem->MakeDirectory(fLocalOcdb);
205 TString filename(Form("$ALICE_ROOT/PWG/EMCAL/data/%d.dat",year));
206 TString cmd(Form("cd %s && tar -xf %s",fLocalOcdb.Data(),filename.Data()));
207 Int_t ret = gSystem->Exec(cmd);
209 TString locdb("local://");
213 AliInfo(Form("Setting up local OCDB at %s",locdb.Data()));
214 man->SetDefaultStorage(locdb);
215 fLocalOcdbStor = locdb;
217 AliFatal(Form("Could not set up local OCDB at %s",fLocalOcdb.Data()));
223 // Load geometry from OCDB
225 if (man->GetRun()!=runno)
227 AliInfo(Form("Loading grp data from OCDB for run %d", runno));
228 AliGRPManager GRPManager;
229 GRPManager.ReadGRPEntry();
230 GRPManager.SetMagField();
231 AliInfo(Form("Loading geometry from OCDB"));
232 AliGeomManager::LoadGeometry();
234 AliGeomManager::ApplyAlignObjsFromCDB(fObjs);
237 // Load geometry from file (does not use misalignment of ITS/TPC!)
238 TGeoManager *geo = AliGeomManager::GetGeometry();
239 if (!geo && fGeoPath.Length()>0) {
240 TString fname(gSystem->ExpandPathName(Form("%s/geometry_%d.root", fGeoPath.Data(), year)));
241 if (gSystem->AccessPathName(fname)==0) {
242 AliInfo(Form("Loading geometry from file %s (should be avoided!)", fname.Data()));
243 AliGeomManager::LoadGeometry(fname);
244 geo = AliGeomManager::GetGeometry();
250 AliInfo(Form("Locking geometry"));
254 // Construct field map
255 if (!TGeoGlobalMagField::Instance()->GetField()) {
256 InputEvent()->InitMagneticField();
259 // Apply mis-alignment matrices from OADB
260 if (fOadbPath.Length()>0) {
261 AliOADBContainer emcalgeoCont(Form("emcal"));
262 emcalgeoCont.InitFromFile(Form("%s/EMCALlocal2master.root",fOadbPath.Data()),
263 Form("AliEMCALgeo"));
264 TObjArray *mobj=dynamic_cast<TObjArray*>(emcalgeoCont.GetObject(runno,"EmcalMatrices"));
266 for(Int_t mod=0; mod < (geom->GetEMCGeometry())->GetNumberOfSuperModules(); mod++){
267 //AliInfo(Form("Misalignment matrix %d", mod));
268 geom->SetMisalMatrix((TGeoHMatrix*) mobj->At(mod),mod);
276 //________________________________________________________________________
277 void AliEmcalSetupTask::Terminate(Option_t *)
279 // Called at the end.
281 if (fLocalOcdb.Length()>0) {
282 TString cmd(Form("rm -rf %s", fLocalOcdb.Data()));