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 ////////////////////////////////////////////////////////////////////////
16 // --- ROOT system ---
23 #include "TStopwatch.h"
26 #include "TGeometry.h"
27 #include "TInterpreter.h"
29 // --- AliRoot header files ---
32 #include "AliHeader.h"
33 #include "AliGenEventHeader.h"
35 class AliTRDdigitizer;
36 class AliPHOSSDigitizer;
37 class AliTOFSDigitizer;
39 class AliMergeSteer: public TTask {
42 AliMergeSteer(const Text_t* name="AliMergeSteer",
43 const Text_t* title="AliMergeSteer");
44 // AliMergeSteer(Option_t *option);
45 virtual ~AliMergeSteer();
46 Bool_t SetDetectorFlag(Option_t* option, Int_t flag);
47 Int_t GetDetectorFlag(Option_t* option);
49 virtual void Exec(const Option_t *option);
50 Bool_t ImportgAlice(TFile *file);
52 Bool_t ExtractVertex(TString fn, Int_t eventNr);
53 void PrintVertex(TArrayF &vertex);
54 void ExportVertex(TArrayF &vertex);
57 Bool_t CreateSDigits();
60 Bool_t ITSFastPoints(const char *outputFile, const char *inputFile);
62 Bool_t RecoSignalOnly();
64 Bool_t CmpSignalOnly();
66 Bool_t AliCopy(TFile *inputFile, TFile *outputFile);
67 Bool_t AliCopy(TString inputFileName, TString outputFileName);
71 // file names setter/getters
72 void SetFileNameHits(TString fileName) {fFileNameHits = fileName;}
73 void SetFileNameSDigits(TString fileName) {fFileNameSDigits = fileName;}
74 void SetFileNameBgrHits(TString fileName) {fFileNameBgrHits = fileName;}
75 void SetFileNameBgrSDigits(TString fileName) {fFileNameBgrSDigits = fileName;}
76 void SetFileNameDigitsMerged(TString fileName) {fFileNameDigitsMerged = fileName;}
77 void SetFileNameDigitsSignalOnly(TString fileName) {fFileNameDigitsSignalOnly = fileName;}
78 TString FileNameHits() {return fFileNameHits;}
79 TString FileNameSDigits() {return fFileNameSDigits;}
80 TString FileNameBgr() {return fFileNameBgrSDigits;}
81 TString FileNameDigitsMerged() {return fFileNameDigitsMerged;}
82 TString FileNameDigitsSignalOnly() {return fFileNameDigitsSignalOnly;}
85 void SetFlagSim(Bool_t flag) {fFlagSim = flag;}
86 void SetFlagSDigits(Bool_t flag) {fFlagSDigits = flag;}
87 void SetFlagMerge(Bool_t flag) {fFlagMerge = flag;}
88 void SetFlagDigitsSignalOnly(Bool_t flag) {fFlagDigitsSignalOnly = flag;}
89 void SetFlagRecoMerged(Bool_t flag) {fFlagRecoMerged = flag;}
90 void SetFlagRecoSignalOnly(Bool_t flag) {fFlagRecoSignalOnly = flag;}
91 void SetFlagCmpMerged(Bool_t flag) {fFlagCmpMerged = flag;}
92 void SetFlagCmpSignalOnly(Bool_t flag) {fFlagCmpSignalOnly = flag;}
95 void SetNEvents(Int_t nEvents) {fNEvents = nEvents;}
96 void SetBgrEventNr(Int_t i) {fBgrEventNr = i;}
100 TString fFileNameHits;
101 TString fFileNameSDigits;
102 TString fFileNameBgrHits;
103 TString fFileNameBgrSDigits;
104 TString fFileNameDigitsMerged;
105 TString fFileNameDigitsSignalOnly;
106 TString fFileNameCmpMerged;
107 TString fFileNameCmpSignalOnly;
112 Bool_t fFlagDigitsSignalOnly;
113 Bool_t fFlagRecoMerged;
114 Bool_t fFlagRecoSignalOnly;
115 Bool_t fFlagCmpMerged;
116 Bool_t fFlagCmpSignalOnly;
126 // flags for detectors - determine which detector will be used
129 // 1 - process the whole detector
130 // 2 - process only active region (region of interest on)
148 ////////////////////////////////////////////////////////////////////////
153 ////////////////////////////////////////////////////////////////////////
155 AliMergeSteer::AliMergeSteer(const Text_t *name, const Text_t* title) : TTask(name,title)
160 fFileNameHits="galice.root";
161 fFileNameSDigits = "sdigits.root";
162 fFileNameBgrSDigits = "bgr.sdigits.root";
163 fFileNameBgrHits = "bgr.hits.root";
164 fFileNameDigitsMerged = "digits.root";
165 fFileNameDigitsSignalOnly = "digits.signal.root";
166 fFileNameCmpMerged = "CmpGaRS_merged.root";
167 fFileNameCmpSignalOnly = "CmpGaRS_signal.root";
170 fFlagSDigits = kFALSE;
172 fFlagDigitsSignalOnly = kFALSE;
173 fFlagRecoMerged = kFALSE;
174 fFlagRecoSignalOnly = kFALSE;
175 fFlagCmpMerged = kFALSE;
176 fFlagCmpSignalOnly = kFALSE;
200 ////////////////////////////////////////////////////////////////////////
201 AliMergeSteer::~AliMergeSteer()
206 ////////////////////////////////////////////////////////////////////////
207 void AliMergeSteer::Exec(Option_t* option)
210 if (gAlice) delete gAlice;
213 if (fFlagSim) rc = Simulate();
214 if (!rc) {Error("Exec","Simulate wrong"); return;}
216 if (fFlagSDigits) rc = CreateSDigits();
217 if (!rc) {Error("Exec","CreateSDigits wrong"); return;}
219 if (fFlagSDigits && fCopy2S) rc = AliCopy(fFileNameHits,fFileNameSDigits);
220 if (!rc) {Error("Exec","AliCopy to SD wrong"); return;}
222 if (fFlagMerge && fCopy2D) rc = AliCopy(fFileNameHits,fFileNameDigitsMerged);
223 if (!rc) {Error("Exec","AliCopy to DigitsMerged wrong"); return;}
225 if (fFlagMerge) rc = Merge();
226 if (!rc) {Error("Exec","Merge wrong"); return;}
228 if (fFlagDigitsSignalOnly) rc = NoMerge();
229 if (!rc) {Error("Exec","NoMerge wrong"); return;}
231 if (fFlagRecoMerged) rc = RecoMerged();
232 if (!rc) {Error("Exec","RecoMerged wrong"); return;}
234 if (fFlagRecoSignalOnly) rc = RecoSignalOnly();
235 if (!rc) {Error("Exec","RecoSignalOnly wrong"); return;}
237 if (fFlagCmpMerged) rc = CmpMerged();
238 if (!rc) {Error("Exec","CmpMerged wrong"); return;}
240 if (fFlagCmpSignalOnly) rc = CmpSignalOnly();
241 if (!rc) {Error("Exec","CmpSignalOnly wrong"); return;}
247 ////////////////////////////////////////////////////////////////////////
248 Int_t AliMergeSteer::GetDetectorFlag(Option_t* option)
251 // return current flag value for a given detector
253 if (strstr(option,"FMD")) {
255 } else if (strstr(option,"ITS")) {
257 } else if (strstr(option,"MUON")) {
259 } else if (strstr(option,"PHOS")) {
261 } else if (strstr(option,"PMD")) {
263 } else if (strstr(option,"RICH")) {
265 } else if (strstr(option,"START")) {
267 } else if (strstr(option,"TOF")) {
269 } else if (strstr(option,"TPC")) {
271 } else if (strstr(option,"TRD")) {
273 } else if (strstr(option,"ZDC")) {
275 } else if (strstr(option,"EMCAL")) {
278 cerr<<"Unknown detector required."<<endl;
282 ////////////////////////////////////////////////////////////////////////
283 Bool_t AliMergeSteer::SetDetectorFlag(Option_t* option, Int_t flag)
286 // return current flag value for a given detector
288 if (strstr(option,"FMD")) {
290 } else if (strstr(option,"ITS")) {
292 } else if (strstr(option,"MUON")) {
294 } else if (strstr(option,"PHOS")) {
296 } else if (strstr(option,"PMD")) {
298 } else if (strstr(option,"RICH")) {
300 } else if (strstr(option,"START")) {
302 } else if (strstr(option,"TOF")) {
304 } else if (strstr(option,"TPC")) {
306 } else if (strstr(option,"TRD")) {
308 } else if (strstr(option,"ZDC")) {
310 } else if (strstr(option,"EMCAL")) {
313 cerr<<"Unknown detector required."<<endl;
318 ////////////////////////////////////////////////////////////////////////
319 Bool_t AliMergeSteer::ImportgAlice(TFile *file) {
320 // read in gAlice object from the file
321 gAlice = (AliRun*)file->Get("gAlice");
322 if (!gAlice) return kFALSE;
325 ////////////////////////////////////////////////////////////////////////
326 Bool_t AliMergeSteer::ExtractVertex(TString fn, Int_t eventNr)
328 // Open file with TPC geom and digits
329 TFile *file=TFile::Open(fn);
330 if (!file->IsOpen()) {cerr<<"Cannnot open "<<fn.Data()<<" !\n"; return kFALSE;}
331 if (!(gAlice=(AliRun*)file->Get("gAlice"))) {
332 cerr<<"gAlice was not found in "<<fn.Data()<<" !\n";
336 AliHeader *header = gAlice->GetHeader();
338 cerr<<"header was not found in "<<fn.Data()<<" !\n";
341 AliGenEventHeader* genEventHeader = header->GenEventHeader();
342 if (!genEventHeader) {
343 cerr<<"GenEventHeader was not found in "<<fn.Data()<<" !\n";
347 TArrayF primaryVertex(3);
348 genEventHeader->PrimaryVertex(primaryVertex);
349 PrintVertex(primaryVertex);
350 ExportVertex(primaryVertex);
353 // Following two lines should be there, but ....
354 // delete genEventHeader;
362 ////////////////////////////////////////////////////////////////////////
363 void AliMergeSteer::PrintVertex(TArrayF &primaryVertex)
365 cout <<"CONFIG_VERTEX: "
366 <<primaryVertex[0]<<" "
367 <<primaryVertex[1]<<" "
368 <<primaryVertex[2]<<" "<<endl;
372 ////////////////////////////////////////////////////////////////////////
373 void AliMergeSteer::ExportVertex(TArrayF &primaryVertex)
375 char vertexAsString[30];
376 sprintf(vertexAsString,"%f",primaryVertex[0]);
377 gSystem->Setenv("CONFIG_VERTEX_X",vertexAsString);
378 sprintf(vertexAsString,"%f",primaryVertex[1]);
379 gSystem->Setenv("CONFIG_VERTEX_Y",vertexAsString);
380 sprintf(vertexAsString,"%f",primaryVertex[2]);
381 gSystem->Setenv("CONFIG_VERTEX_Z",vertexAsString);
384 ////////////////////////////////////////////////////////////////////////
385 Bool_t AliMergeSteer::Simulate()
390 TDirectory *saveDir = gDirectory;
391 cout<< "The original directory is: ";
393 if (!ExtractVertex(fFileNameBgrHits,fBgrEventNr)) {
394 cerr<<" ExtractVertexAndSimulateSignal: Error in ExtractVertex"<<endl;
398 new AliRun("gAlice","Signal for Merging");
399 gAlice->Init("Config.C");
400 // gSystem->Setenv("CONFIG_FILE",fileNameSigHits);
403 gAlice->Run(fNEvents);
405 cout<<"Simulation of "<<fNEvents<<" of signal took: "<<endl;
409 f = static_cast<TFile *>(gROOT->FindObject("galice.root"));
412 sprintf(cmd,"mv galice.root %s",fFileNameHits.Data());
418 ////////////////////////////////////////////////////////////////////////
419 Bool_t AliMergeSteer::CreateSDigits()
423 sprintf(macroName,"AliHits2SDigits.C");
425 "AliHits2SDigits(\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
426 fFileNameSDigits.Data(),fFileNameHits.Data(),
427 fNEvents,0,fITS,fTPC,fTRD,fPHOS,fTOF,0);
428 cerr<<"I'll do: "<<funcName<<endl;
429 gROOT->LoadMacro(macroName);
430 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
431 gInterpreter->ProcessLine(funcName);
432 if (fDEBUG) cerr<<"SDigits created"<<endl;
437 ////////////////////////////////////////////////////////////////////////
438 Bool_t AliMergeSteer::Merge()
442 cerr<<"Start merging"<<endl;
443 sprintf(macroName,"MergeV1.C");
445 "Merge(\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
446 fFileNameDigitsMerged.Data(),fFileNameSDigits.Data(),
447 fFileNameBgrSDigits.Data(),
448 fNEvents,fITS,fTPC,fTRD,fPHOS,fMUON,fRICH,0);
449 cerr<<"I'll do: "<<funcName<<endl;
450 gROOT->LoadMacro(macroName);
451 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
452 gInterpreter->ProcessLine(funcName);
453 if (fDEBUG) cerr<<"Merging done"<<endl;
456 // add ITS fast points, no merging yet
457 // return ITSFastPoints(fFileNameDigitsMerged.Data(),
458 // fFileNameHits.Data());
461 ////////////////////////////////////////////////////////////////////////
462 Bool_t AliMergeSteer::NoMerge()
466 cerr<<"Start NoMerging"<<endl;
467 sprintf(macroName,"AliSDigits2Digits.C");
469 "AliSDigits2Digits(\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
470 fFileNameDigitsSignalOnly.Data(),fFileNameSDigits.Data(),
471 fNEvents,fITS,fTPC,fTRD,fPHOS,fMUON,fRICH,0);
472 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
473 gROOT->LoadMacro(macroName);
474 gInterpreter->ProcessLine(funcName);
475 if (fDEBUG) cerr<<"NoMerging done"<<endl;
477 // add ITS fast points, no merging
478 // return ITSFastPoints(fFileNameDigitsSignalOnly.Data(),
479 // fFileNameHits.Data());
482 ////////////////////////////////////////////////////////////////////////
483 Bool_t AliMergeSteer::ITSFastPoints(const char *outputFile, const char *inputFile) {
487 sprintf(macroName,"AliITSHits2SDR.C");
488 sprintf(funcName,"AliITSH2FR2files(\"%s\",\"%s\");",
489 inputFile, outputFile);
490 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
491 gROOT->LoadMacro(macroName);
492 gInterpreter->ProcessLine(funcName);
493 if (fDEBUG) cerr<<"ITSFastPoints done"<<endl;
498 ////////////////////////////////////////////////////////////////////////
499 Bool_t AliMergeSteer::RecoMerged()
506 cerr<<"Start RecoMerged"<<endl;
507 sprintf(macroName,"AliBarrelRecoV3.C");
508 sprintf(funcName,"AliBarrelRecoMerged(%d);",fNEvents);
509 gROOT->LoadMacro(macroName);
510 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
511 gInterpreter->ProcessLine(funcName);
512 if (fDEBUG) cerr<<"RecoMerged done"<<endl;
516 ////////////////////////////////////////////////////////////////////////
517 Bool_t AliMergeSteer::RecoSignalOnly()
524 cerr<<"Start RecoSignalOnly"<<endl;
525 sprintf(macroName,"AliBarrelRecoNoITSClass.C");
526 sprintf(funcName,"AliBarrelReco(%d);",fNEvents);
527 gROOT->LoadMacro(macroName);
528 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
529 gInterpreter->ProcessLine(funcName);
530 if (fDEBUG) cerr<<"RecoSignalOnly done"<<endl;
534 ////////////////////////////////////////////////////////////////////////
535 Bool_t AliMergeSteer::CmpMerged()
542 cerr<<"Start CmpMerged"<<endl;
543 sprintf(macroName,"CmpGaRS.C");
545 "CmpGaRS(%d,%d,\"%s\",\"AliTPCtracks_merged.root\",\"%s\");",
546 fNEvents, fFirstEvent, fFileNameHits.Data(),
547 fFileNameCmpMerged.Data());
548 gROOT->LoadMacro(macroName);
549 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
550 gInterpreter->ProcessLine(funcName);
551 if (fDEBUG) cerr<<"CmpMerged done"<<endl;
554 ////////////////////////////////////////////////////////////////////////
555 Bool_t AliMergeSteer::CmpSignalOnly()
562 cerr<<"Start CmpSignalOnly"<<endl;
563 sprintf(macroName,"CmpGaRS.C");
565 "CmpGaRS(%d,%d,\"%s\",\"AliTPCtracks.root\",\"%s\");",
566 fNEvents, fFirstEvent, fFileNameHits.Data(),
567 fFileNameCmpSignalOnly.Data());
568 gROOT->LoadMacro(macroName);
569 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
570 gInterpreter->ProcessLine(funcName);
571 if (fDEBUG) cerr<<"CmpSignalOnly done"<<endl;
574 ////////////////////////////////////////////////////////////////////////
575 Bool_t AliMergeSteer::AliCopy(TFile *inputFile, TFile *outputFile)
578 // copy gAlice object, AliceGeom and TreeE
582 if (fDEBUG) cout<<"Copy gAlice: ";
586 "gAlice must be deleted before AliCopy is called.");
589 if (!ImportgAlice(inputFile)) return kFALSE;
591 if (fDEBUG) cout<<"done"<<endl;
595 TTree *treeE = gAlice->TreeE();
597 cerr<<"No TreeE found "<<endl;
600 if (fDEBUG) cout<<"Copy TreeE: ";
601 AliHeader *header = new AliHeader();
602 treeE->SetBranchAddress("Header", &header);
603 treeE->SetBranchStatus("*",1);
604 TTree *treeENew = treeE->CloneTree();
606 if (fDEBUG) cout<<"done"<<endl;
609 if (fDEBUG) cout<<"Copy AliceGeom: ";
610 TGeometry *AliceGeom = static_cast<TGeometry*>(inputFile->Get("AliceGeom"));
612 cerr<<"AliceGeom was not found in the input file "<<endl;
616 if (fDEBUG) cout<<"done"<<endl;
625 ////////////////////////////////////////////////////////////////////////
626 Bool_t AliMergeSteer::AliCopy(TString inputFileName, TString outputFileName)
629 // open iput and output files,
630 // ask to copy gAlice object, AliceGeom and TreeE
631 // close input and ouput files
634 cout<<"AliCopy: will copy gAlice from "<<inputFileName.Data()<<" to "
635 <<outputFileName.Data()<<endl;
638 TFile *inputFile = TFile::Open(inputFileName.Data());
639 if (!inputFile->IsOpen()) {
640 cerr<<"Can't open "<<inputFileName.Data()<<" !\n";
644 TFile *outputFile = TFile::Open(outputFileName.Data(),"UPDATE");
645 if (!outputFile->IsOpen()) {
646 cerr<<"Can't open "<<outputFileName.Data()<<" !\n";
650 AliCopy(inputFile, outputFile);
656 cout<<"AliCopy copied gAlice from "<<inputFileName.Data()<<" to "
657 <<outputFileName.Data()<<endl;
662 ////////////////////////////////////////////////////////////////////////