1 ////////////////////////////////////////////////////////////////////////
3 // Class to steer several steps in merging:
4 // - extraction of vertex from bgr event
6 // - creation of sdigits
7 // - creation of digits
10 // Author: Jiri Chudoba (CERN), 2002
12 ////////////////////////////////////////////////////////////////////////
14 #if !defined(__CINT__) || defined(__MAKECINT__)
15 #include <Riostream.h>
17 // --- ROOT system ---
24 #include "TStopwatch.h"
27 #include "TGeometry.h"
28 #include "TInterpreter.h"
30 // --- AliRoot header files ---
32 #include "STEER/AliRun.h"
33 #include "STEER/AliHeader.h"
34 #include "STEER/AliGenEventHeader.h"
37 class AliTRDdigitizer;
38 class AliPHOSSDigitizer;
39 class AliTOFSDigitizer;
41 class AliMergeSteer: public TTask {
44 AliMergeSteer(const Text_t* name="AliMergeSteer",
45 const Text_t* title="AliMergeSteer");
46 // AliMergeSteer(Option_t *option);
47 virtual ~AliMergeSteer();
48 Bool_t SetDetectorFlag(Option_t* option, Int_t flag);
49 Int_t GetDetectorFlag(Option_t* option);
51 virtual void Exec(const Option_t *option);
52 Bool_t ImportgAlice(TFile *file);
54 Bool_t ExtractVertex(TString fn, Int_t eventNr);
55 void PrintVertex(TArrayF &vertex);
56 void ExportVertex(TArrayF &vertex);
59 Bool_t CreateSDigits();
62 Bool_t ITSFastPoints(const char *outputFile, const char *inputFile);
64 Bool_t RecoSignalOnly();
66 Bool_t CmpSignalOnly();
68 Bool_t AliCopy(TFile *inputFile, TFile *outputFile);
69 Bool_t AliCopy(TString inputFileName, TString outputFileName);
73 // file names setter/getters
74 void SetFileNameHits(TString fileName) {fFileNameHits = fileName;}
75 void SetFileNameSDigits(TString fileName) {fFileNameSDigits = fileName;}
76 void SetFileNameBgrHits(TString fileName) {fFileNameBgrHits = fileName;}
77 void SetFileNameBgrSDigits(TString fileName) {fFileNameBgrSDigits = fileName;}
78 void SetFileNameDigitsMerged(TString fileName) {fFileNameDigitsMerged = fileName;}
79 void SetFileNameDigitsSignalOnly(TString fileName) {fFileNameDigitsSignalOnly = fileName;}
80 TString FileNameHits() {return fFileNameHits;}
81 TString FileNameSDigits() {return fFileNameSDigits;}
82 TString FileNameBgr() {return fFileNameBgrSDigits;}
83 TString FileNameDigitsMerged() {return fFileNameDigitsMerged;}
84 TString FileNameDigitsSignalOnly() {return fFileNameDigitsSignalOnly;}
87 void SetFlagSim(Bool_t flag) {fFlagSim = flag;}
88 void SetFlagSDigits(Bool_t flag) {fFlagSDigits = flag;}
89 void SetFlagMerge(Bool_t flag) {fFlagMerge = flag;}
90 void SetFlagDigitsSignalOnly(Bool_t flag) {fFlagDigitsSignalOnly = flag;}
91 void SetFlagRecoMerged(Bool_t flag) {fFlagRecoMerged = flag;}
92 void SetFlagRecoSignalOnly(Bool_t flag) {fFlagRecoSignalOnly = flag;}
93 void SetFlagCmpMerged(Bool_t flag) {fFlagCmpMerged = flag;}
94 void SetFlagCmpSignalOnly(Bool_t flag) {fFlagCmpSignalOnly = flag;}
97 void SetNEvents(Int_t nEvents) {fNEvents = nEvents;}
98 void SetBgrEventNr(Int_t i) {fBgrEventNr = i;}
102 TString fFileNameHits;
103 TString fFileNameSDigits;
104 TString fFileNameBgrHits;
105 TString fFileNameBgrSDigits;
106 TString fFileNameDigitsMerged;
107 TString fFileNameDigitsSignalOnly;
108 TString fFileNameCmpMerged;
109 TString fFileNameCmpSignalOnly;
114 Bool_t fFlagDigitsSignalOnly;
115 Bool_t fFlagRecoMerged;
116 Bool_t fFlagRecoSignalOnly;
117 Bool_t fFlagCmpMerged;
118 Bool_t fFlagCmpSignalOnly;
128 // flags for detectors - determine which detector will be used
131 // 1 - process the whole detector
132 // 2 - process only active region (region of interest on)
150 ////////////////////////////////////////////////////////////////////////
155 ////////////////////////////////////////////////////////////////////////
157 AliMergeSteer::AliMergeSteer(const Text_t *name, const Text_t* title) : TTask(name,title)
162 fFileNameHits="galice.root";
163 fFileNameSDigits = "sdigits.root";
164 fFileNameBgrSDigits = "bgr.sdigits.root";
165 fFileNameBgrHits = "bgr.hits.root";
166 fFileNameDigitsMerged = "digits.root";
167 fFileNameDigitsSignalOnly = "digits.signal.root";
168 fFileNameCmpMerged = "CmpGaRS_merged.root";
169 fFileNameCmpSignalOnly = "CmpGaRS_signal.root";
172 fFlagSDigits = kFALSE;
174 fFlagDigitsSignalOnly = kFALSE;
175 fFlagRecoMerged = kFALSE;
176 fFlagRecoSignalOnly = kFALSE;
177 fFlagCmpMerged = kFALSE;
178 fFlagCmpSignalOnly = kFALSE;
202 ////////////////////////////////////////////////////////////////////////
203 AliMergeSteer::~AliMergeSteer()
208 ////////////////////////////////////////////////////////////////////////
209 void AliMergeSteer::Exec(Option_t* option)
212 if (gAlice) delete gAlice;
215 if (fFlagSim) rc = Simulate();
216 if (!rc) {Error("Exec","Simulate wrong"); return;}
218 if (fFlagSDigits) rc = CreateSDigits();
219 if (!rc) {Error("Exec","CreateSDigits wrong"); return;}
221 if (fFlagSDigits && fCopy2S) rc = AliCopy(fFileNameHits,fFileNameSDigits);
222 if (!rc) {Error("Exec","AliCopy to SD wrong"); return;}
224 if (fFlagMerge && fCopy2D) rc = AliCopy(fFileNameHits,fFileNameDigitsMerged);
225 if (!rc) {Error("Exec","AliCopy to DigitsMerged wrong"); return;}
227 if (fFlagMerge) rc = Merge();
228 if (!rc) {Error("Exec","Merge wrong"); return;}
230 if (fFlagDigitsSignalOnly) rc = NoMerge();
231 if (!rc) {Error("Exec","NoMerge wrong"); return;}
233 if (fFlagRecoMerged) rc = RecoMerged();
234 if (!rc) {Error("Exec","RecoMerged wrong"); return;}
236 if (fFlagRecoSignalOnly) rc = RecoSignalOnly();
237 if (!rc) {Error("Exec","RecoSignalOnly wrong"); return;}
239 if (fFlagCmpMerged) rc = CmpMerged();
240 if (!rc) {Error("Exec","CmpMerged wrong"); return;}
242 if (fFlagCmpSignalOnly) rc = CmpSignalOnly();
243 if (!rc) {Error("Exec","CmpSignalOnly wrong"); return;}
249 ////////////////////////////////////////////////////////////////////////
250 Int_t AliMergeSteer::GetDetectorFlag(Option_t* option)
253 // return current flag value for a given detector
255 if (strstr(option,"FMD")) {
257 } else if (strstr(option,"ITS")) {
259 } else if (strstr(option,"MUON")) {
261 } else if (strstr(option,"PHOS")) {
263 } else if (strstr(option,"PMD")) {
265 } else if (strstr(option,"RICH")) {
267 } else if (strstr(option,"START")) {
269 } else if (strstr(option,"TOF")) {
271 } else if (strstr(option,"TPC")) {
273 } else if (strstr(option,"TRD")) {
275 } else if (strstr(option,"ZDC")) {
277 } else if (strstr(option,"EMCAL")) {
280 cerr<<"Unknown detector required."<<endl;
284 ////////////////////////////////////////////////////////////////////////
285 Bool_t AliMergeSteer::SetDetectorFlag(Option_t* option, Int_t flag)
288 // return current flag value for a given detector
290 if (strstr(option,"FMD")) {
292 } else if (strstr(option,"ITS")) {
294 } else if (strstr(option,"MUON")) {
296 } else if (strstr(option,"PHOS")) {
298 } else if (strstr(option,"PMD")) {
300 } else if (strstr(option,"RICH")) {
302 } else if (strstr(option,"START")) {
304 } else if (strstr(option,"TOF")) {
306 } else if (strstr(option,"TPC")) {
308 } else if (strstr(option,"TRD")) {
310 } else if (strstr(option,"ZDC")) {
312 } else if (strstr(option,"EMCAL")) {
315 cerr<<"Unknown detector required."<<endl;
320 ////////////////////////////////////////////////////////////////////////
321 Bool_t AliMergeSteer::ImportgAlice(TFile *file) {
322 // read in gAlice object from the file
323 gAlice = (AliRun*)file->Get("gAlice");
324 if (!gAlice) return kFALSE;
327 ////////////////////////////////////////////////////////////////////////
328 Bool_t AliMergeSteer::ExtractVertex(TString fn, Int_t eventNr)
330 // Open file with TPC geom and digits
331 TFile *file=TFile::Open(fn);
332 if (!file->IsOpen()) {cerr<<"Cannnot open "<<fn.Data()<<" !\n"; return kFALSE;}
333 if (!(gAlice=(AliRun*)file->Get("gAlice"))) {
334 cerr<<"gAlice was not found in "<<fn.Data()<<" !\n";
338 AliHeader *header = gAlice->GetHeader();
340 cerr<<"header was not found in "<<fn.Data()<<" !\n";
343 AliGenEventHeader* genEventHeader = header->GenEventHeader();
344 if (!genEventHeader) {
345 cerr<<"GenEventHeader was not found in "<<fn.Data()<<" !\n";
349 TArrayF primaryVertex(3);
350 genEventHeader->PrimaryVertex(primaryVertex);
351 PrintVertex(primaryVertex);
352 ExportVertex(primaryVertex);
355 // Following two lines should be there, but ....
356 // delete genEventHeader;
364 ////////////////////////////////////////////////////////////////////////
365 void AliMergeSteer::PrintVertex(TArrayF &primaryVertex)
367 cout <<"CONFIG_VERTEX: "
368 <<primaryVertex[0]<<" "
369 <<primaryVertex[1]<<" "
370 <<primaryVertex[2]<<" "<<endl;
374 ////////////////////////////////////////////////////////////////////////
375 void AliMergeSteer::ExportVertex(TArrayF &primaryVertex)
377 char vertexAsString[30];
378 sprintf(vertexAsString,"%f",primaryVertex[0]);
379 gSystem->Setenv("CONFIG_VERTEX_X",vertexAsString);
380 sprintf(vertexAsString,"%f",primaryVertex[1]);
381 gSystem->Setenv("CONFIG_VERTEX_Y",vertexAsString);
382 sprintf(vertexAsString,"%f",primaryVertex[2]);
383 gSystem->Setenv("CONFIG_VERTEX_Z",vertexAsString);
386 ////////////////////////////////////////////////////////////////////////
387 Bool_t AliMergeSteer::Simulate()
392 TDirectory *saveDir = gDirectory;
393 cout<< "The original directory is: ";
395 if (!ExtractVertex(fFileNameBgrHits,fBgrEventNr)) {
396 cerr<<" ExtractVertexAndSimulateSignal: Error in ExtractVertex"<<endl;
400 new AliRun("gAlice","Signal for Merging");
401 gAlice->Init("Config.C");
402 // gSystem->Setenv("CONFIG_FILE",fileNameSigHits);
405 gAlice->Run(fNEvents);
407 cout<<"Simulation of "<<fNEvents<<" of signal took: "<<endl;
411 f = static_cast<TFile *>(gROOT->FindObject("galice.root"));
414 sprintf(cmd,"mv galice.root %s",fFileNameHits.Data());
420 ////////////////////////////////////////////////////////////////////////
421 Bool_t AliMergeSteer::CreateSDigits()
425 sprintf(macroName,"AliHits2SDigits.C");
427 "AliHits2SDigits(\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
428 fFileNameSDigits.Data(),fFileNameHits.Data(),
429 fNEvents,0,fITS,fTPC,fTRD,fPHOS,fTOF,0);
430 cerr<<"I'll do: "<<funcName<<endl;
431 gROOT->LoadMacro(macroName);
432 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
433 gInterpreter->ProcessLine(funcName);
434 if (fDEBUG) cerr<<"SDigits created"<<endl;
439 ////////////////////////////////////////////////////////////////////////
440 Bool_t AliMergeSteer::Merge()
444 cerr<<"Start merging"<<endl;
445 sprintf(macroName,"MergeV1.C");
447 "Merge(\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
448 fFileNameDigitsMerged.Data(),fFileNameSDigits.Data(),
449 fFileNameBgrSDigits.Data(),
450 fNEvents,fITS,fTPC,fTRD,fPHOS,fMUON,fRICH,0);
451 cerr<<"I'll do: "<<funcName<<endl;
452 gROOT->LoadMacro(macroName);
453 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
454 gInterpreter->ProcessLine(funcName);
455 if (fDEBUG) cerr<<"Merging done"<<endl;
458 // add ITS fast points, no merging yet
459 // return ITSFastPoints(fFileNameDigitsMerged.Data(),
460 // fFileNameHits.Data());
463 ////////////////////////////////////////////////////////////////////////
464 Bool_t AliMergeSteer::NoMerge()
468 cerr<<"Start NoMerging"<<endl;
469 sprintf(macroName,"AliSDigits2Digits.C");
471 "AliSDigits2Digits(\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
472 fFileNameDigitsSignalOnly.Data(),fFileNameSDigits.Data(),
473 fNEvents,fITS,fTPC,fTRD,fPHOS,fMUON,fRICH,0);
474 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
475 gROOT->LoadMacro(macroName);
476 gInterpreter->ProcessLine(funcName);
477 if (fDEBUG) cerr<<"NoMerging done"<<endl;
479 // add ITS fast points, no merging
480 // return ITSFastPoints(fFileNameDigitsSignalOnly.Data(),
481 // fFileNameHits.Data());
484 ////////////////////////////////////////////////////////////////////////
485 Bool_t AliMergeSteer::ITSFastPoints(const char *outputFile, const char *inputFile) {
489 sprintf(macroName,"AliITSHits2SDR.C");
490 sprintf(funcName,"AliITSH2FR2files(\"%s\",\"%s\");",
491 inputFile, outputFile);
492 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
493 gROOT->LoadMacro(macroName);
494 gInterpreter->ProcessLine(funcName);
495 if (fDEBUG) cerr<<"ITSFastPoints done"<<endl;
500 ////////////////////////////////////////////////////////////////////////
501 Bool_t AliMergeSteer::RecoMerged()
508 cerr<<"Start RecoMerged"<<endl;
509 sprintf(macroName,"AliBarrelRecoV3.C");
510 sprintf(funcName,"AliBarrelRecoMerged(%d);",fNEvents);
511 gROOT->LoadMacro(macroName);
512 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
513 gInterpreter->ProcessLine(funcName);
514 if (fDEBUG) cerr<<"RecoMerged done"<<endl;
518 ////////////////////////////////////////////////////////////////////////
519 Bool_t AliMergeSteer::RecoSignalOnly()
526 cerr<<"Start RecoSignalOnly"<<endl;
527 sprintf(macroName,"AliBarrelRecoNoITSClass.C");
528 sprintf(funcName,"AliBarrelReco(%d);",fNEvents);
529 gROOT->LoadMacro(macroName);
530 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
531 gInterpreter->ProcessLine(funcName);
532 if (fDEBUG) cerr<<"RecoSignalOnly done"<<endl;
536 ////////////////////////////////////////////////////////////////////////
537 Bool_t AliMergeSteer::CmpMerged()
544 cerr<<"Start CmpMerged"<<endl;
545 sprintf(macroName,"CmpGaRS.C");
547 "CmpGaRS(%d,%d,\"%s\",\"AliTPCtracks_merged.root\",\"%s\");",
548 fNEvents, fFirstEvent, fFileNameHits.Data(),
549 fFileNameCmpMerged.Data());
550 gROOT->LoadMacro(macroName);
551 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
552 gInterpreter->ProcessLine(funcName);
553 if (fDEBUG) cerr<<"CmpMerged done"<<endl;
556 ////////////////////////////////////////////////////////////////////////
557 Bool_t AliMergeSteer::CmpSignalOnly()
564 cerr<<"Start CmpSignalOnly"<<endl;
565 sprintf(macroName,"CmpGaRS.C");
567 "CmpGaRS(%d,%d,\"%s\",\"AliTPCtracks.root\",\"%s\");",
568 fNEvents, fFirstEvent, fFileNameHits.Data(),
569 fFileNameCmpSignalOnly.Data());
570 gROOT->LoadMacro(macroName);
571 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
572 gInterpreter->ProcessLine(funcName);
573 if (fDEBUG) cerr<<"CmpSignalOnly done"<<endl;
576 ////////////////////////////////////////////////////////////////////////
577 Bool_t AliMergeSteer::AliCopy(TFile *inputFile, TFile *outputFile)
580 // copy gAlice object, AliceGeom and TreeE
584 if (fDEBUG) cout<<"Copy gAlice: ";
588 "gAlice must be deleted before AliCopy is called.");
591 if (!ImportgAlice(inputFile)) return kFALSE;
593 if (fDEBUG) cout<<"done"<<endl;
597 TTree *treeE = gAlice->TreeE();
599 cerr<<"No TreeE found "<<endl;
602 if (fDEBUG) cout<<"Copy TreeE: ";
603 AliHeader *header = new AliHeader();
604 treeE->SetBranchAddress("Header", &header);
605 treeE->SetBranchStatus("*",1);
606 TTree *treeENew = treeE->CloneTree();
608 if (fDEBUG) cout<<"done"<<endl;
611 if (fDEBUG) cout<<"Copy AliceGeom: ";
612 TGeometry *AliceGeom = static_cast<TGeometry*>(inputFile->Get("AliceGeom"));
614 cerr<<"AliceGeom was not found in the input file "<<endl;
618 if (fDEBUG) cout<<"done"<<endl;
627 ////////////////////////////////////////////////////////////////////////
628 Bool_t AliMergeSteer::AliCopy(TString inputFileName, TString outputFileName)
631 // open iput and output files,
632 // ask to copy gAlice object, AliceGeom and TreeE
633 // close input and ouput files
636 cout<<"AliCopy: will copy gAlice from "<<inputFileName.Data()<<" to "
637 <<outputFileName.Data()<<endl;
640 TFile *inputFile = TFile::Open(inputFileName.Data());
641 if (!inputFile->IsOpen()) {
642 cerr<<"Can't open "<<inputFileName.Data()<<" !\n";
646 TFile *outputFile = TFile::Open(outputFileName.Data(),"UPDATE");
647 if (!outputFile->IsOpen()) {
648 cerr<<"Can't open "<<outputFileName.Data()<<" !\n";
652 AliCopy(inputFile, outputFile);
658 cout<<"AliCopy copied gAlice from "<<inputFileName.Data()<<" to "
659 <<outputFileName.Data()<<endl;
664 ////////////////////////////////////////////////////////////////////////