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 "TInterpreter.h"
29 // --- AliRoot header files ---
31 #include "STEER/AliRun.h"
32 #include "STEER/AliHeader.h"
33 #include "STEER/AliGenEventHeader.h"
36 class AliTRDdigitizer;
37 class AliPHOSSDigitizer;
38 class AliTOFSDigitizer;
40 class AliMergeSteer: public TTask {
43 AliMergeSteer(const Text_t* name="AliMergeSteer",
44 const Text_t* title="AliMergeSteer");
45 // AliMergeSteer(Option_t *option);
46 virtual ~AliMergeSteer();
47 Bool_t SetDetectorFlag(Option_t* option, Int_t flag);
48 Int_t GetDetectorFlag(Option_t* option);
50 virtual void Exec(const Option_t *option);
51 Bool_t ImportgAlice(TFile *file);
53 Bool_t ExtractVertex(TString fn, Int_t eventNr);
54 void PrintVertex(TArrayF &vertex);
55 void ExportVertex(TArrayF &vertex);
58 Bool_t CreateSDigits();
61 Bool_t ITSFastPoints(const char *outputFile, const char *inputFile);
63 Bool_t RecoSignalOnly();
65 Bool_t CmpSignalOnly();
67 Bool_t AliCopy(TFile *inputFile, TFile *outputFile);
68 Bool_t AliCopy(TString inputFileName, TString outputFileName);
72 // file names setter/getters
73 void SetFileNameHits(TString fileName) {fFileNameHits = fileName;}
74 void SetFileNameSDigits(TString fileName) {fFileNameSDigits = fileName;}
75 void SetFileNameBgrHits(TString fileName) {fFileNameBgrHits = fileName;}
76 void SetFileNameBgrSDigits(TString fileName) {fFileNameBgrSDigits = fileName;}
77 void SetFileNameDigitsMerged(TString fileName) {fFileNameDigitsMerged = fileName;}
78 void SetFileNameDigitsSignalOnly(TString fileName) {fFileNameDigitsSignalOnly = fileName;}
79 TString FileNameHits() {return fFileNameHits;}
80 TString FileNameSDigits() {return fFileNameSDigits;}
81 TString FileNameBgr() {return fFileNameBgrSDigits;}
82 TString FileNameDigitsMerged() {return fFileNameDigitsMerged;}
83 TString FileNameDigitsSignalOnly() {return fFileNameDigitsSignalOnly;}
86 void SetFlagSim(Bool_t flag) {fFlagSim = flag;}
87 void SetFlagSDigits(Bool_t flag) {fFlagSDigits = flag;}
88 void SetFlagMerge(Bool_t flag) {fFlagMerge = flag;}
89 void SetFlagDigitsSignalOnly(Bool_t flag) {fFlagDigitsSignalOnly = flag;}
90 void SetFlagRecoMerged(Bool_t flag) {fFlagRecoMerged = flag;}
91 void SetFlagRecoSignalOnly(Bool_t flag) {fFlagRecoSignalOnly = flag;}
92 void SetFlagCmpMerged(Bool_t flag) {fFlagCmpMerged = flag;}
93 void SetFlagCmpSignalOnly(Bool_t flag) {fFlagCmpSignalOnly = flag;}
96 void SetNEvents(Int_t nEvents) {fNEvents = nEvents;}
97 void SetBgrEventNr(Int_t i) {fBgrEventNr = i;}
101 TString fFileNameHits;
102 TString fFileNameSDigits;
103 TString fFileNameBgrHits;
104 TString fFileNameBgrSDigits;
105 TString fFileNameDigitsMerged;
106 TString fFileNameDigitsSignalOnly;
107 TString fFileNameCmpMerged;
108 TString fFileNameCmpSignalOnly;
113 Bool_t fFlagDigitsSignalOnly;
114 Bool_t fFlagRecoMerged;
115 Bool_t fFlagRecoSignalOnly;
116 Bool_t fFlagCmpMerged;
117 Bool_t fFlagCmpSignalOnly;
127 // flags for detectors - determine which detector will be used
130 // 1 - process the whole detector
131 // 2 - process only active region (region of interest on)
149 ////////////////////////////////////////////////////////////////////////
154 ////////////////////////////////////////////////////////////////////////
156 AliMergeSteer::AliMergeSteer(const Text_t *name, const Text_t* title) : TTask(name,title)
161 fFileNameHits="galice.root";
162 fFileNameSDigits = "sdigits.root";
163 fFileNameBgrSDigits = "bgr.sdigits.root";
164 fFileNameBgrHits = "bgr.hits.root";
165 fFileNameDigitsMerged = "digits.root";
166 fFileNameDigitsSignalOnly = "digits.signal.root";
167 fFileNameCmpMerged = "CmpGaRS_merged.root";
168 fFileNameCmpSignalOnly = "CmpGaRS_signal.root";
171 fFlagSDigits = kFALSE;
173 fFlagDigitsSignalOnly = kFALSE;
174 fFlagRecoMerged = kFALSE;
175 fFlagRecoSignalOnly = kFALSE;
176 fFlagCmpMerged = kFALSE;
177 fFlagCmpSignalOnly = kFALSE;
201 ////////////////////////////////////////////////////////////////////////
202 AliMergeSteer::~AliMergeSteer()
207 ////////////////////////////////////////////////////////////////////////
208 void AliMergeSteer::Exec(Option_t* option)
211 if (gAlice) delete gAlice;
214 if (fFlagSim) rc = Simulate();
215 if (!rc) {Error("Exec","Simulate wrong"); return;}
217 if (fFlagSDigits) rc = CreateSDigits();
218 if (!rc) {Error("Exec","CreateSDigits wrong"); return;}
220 if (fFlagSDigits && fCopy2S) rc = AliCopy(fFileNameHits,fFileNameSDigits);
221 if (!rc) {Error("Exec","AliCopy to SD wrong"); return;}
223 if (fFlagMerge && fCopy2D) rc = AliCopy(fFileNameHits,fFileNameDigitsMerged);
224 if (!rc) {Error("Exec","AliCopy to DigitsMerged wrong"); return;}
226 if (fFlagMerge) rc = Merge();
227 if (!rc) {Error("Exec","Merge wrong"); return;}
229 if (fFlagDigitsSignalOnly) rc = NoMerge();
230 if (!rc) {Error("Exec","NoMerge wrong"); return;}
232 if (fFlagRecoMerged) rc = RecoMerged();
233 if (!rc) {Error("Exec","RecoMerged wrong"); return;}
235 if (fFlagRecoSignalOnly) rc = RecoSignalOnly();
236 if (!rc) {Error("Exec","RecoSignalOnly wrong"); return;}
238 if (fFlagCmpMerged) rc = CmpMerged();
239 if (!rc) {Error("Exec","CmpMerged wrong"); return;}
241 if (fFlagCmpSignalOnly) rc = CmpSignalOnly();
242 if (!rc) {Error("Exec","CmpSignalOnly wrong"); return;}
248 ////////////////////////////////////////////////////////////////////////
249 Int_t AliMergeSteer::GetDetectorFlag(Option_t* option)
252 // return current flag value for a given detector
254 if (strstr(option,"FMD")) {
256 } else if (strstr(option,"ITS")) {
258 } else if (strstr(option,"MUON")) {
260 } else if (strstr(option,"PHOS")) {
262 } else if (strstr(option,"PMD")) {
264 } else if (strstr(option,"HMPID")) {
266 } else if (strstr(option,"T0")) {
268 } else if (strstr(option,"TOF")) {
270 } else if (strstr(option,"TPC")) {
272 } else if (strstr(option,"TRD")) {
274 } else if (strstr(option,"ZDC")) {
276 } else if (strstr(option,"EMCAL")) {
279 cerr<<"Unknown detector required."<<endl;
283 ////////////////////////////////////////////////////////////////////////
284 Bool_t AliMergeSteer::SetDetectorFlag(Option_t* option, Int_t flag)
287 // return current flag value for a given detector
289 if (strstr(option,"FMD")) {
291 } else if (strstr(option,"ITS")) {
293 } else if (strstr(option,"MUON")) {
295 } else if (strstr(option,"PHOS")) {
297 } else if (strstr(option,"PMD")) {
299 } else if (strstr(option,"HMPID")) {
301 } else if (strstr(option,"T0")) {
303 } else if (strstr(option,"TOF")) {
305 } else if (strstr(option,"TPC")) {
307 } else if (strstr(option,"TRD")) {
309 } else if (strstr(option,"ZDC")) {
311 } else if (strstr(option,"EMCAL")) {
314 cerr<<"Unknown detector required."<<endl;
319 ////////////////////////////////////////////////////////////////////////
320 Bool_t AliMergeSteer::ImportgAlice(TFile *file) {
321 // read in gAlice object from the file
322 gAlice = (AliRun*)file->Get("gAlice");
323 if (!gAlice) return kFALSE;
326 ////////////////////////////////////////////////////////////////////////
327 Bool_t AliMergeSteer::ExtractVertex(TString fn, Int_t eventNr)
329 // Open file with TPC geom and digits
330 TFile *file=TFile::Open(fn);
331 if (!file->IsOpen()) {cerr<<"Cannnot open "<<fn.Data()<<" !\n"; return kFALSE;}
332 if (!(gAlice=(AliRun*)file->Get("gAlice"))) {
333 cerr<<"gAlice was not found in "<<fn.Data()<<" !\n";
337 AliHeader *header = gAlice->GetHeader();
339 cerr<<"header was not found in "<<fn.Data()<<" !\n";
342 AliGenEventHeader* genEventHeader = header->GenEventHeader();
343 if (!genEventHeader) {
344 cerr<<"GenEventHeader was not found in "<<fn.Data()<<" !\n";
348 TArrayF primaryVertex(3);
349 genEventHeader->PrimaryVertex(primaryVertex);
350 PrintVertex(primaryVertex);
351 ExportVertex(primaryVertex);
354 // Following two lines should be there, but ....
355 // delete genEventHeader;
363 ////////////////////////////////////////////////////////////////////////
364 void AliMergeSteer::PrintVertex(TArrayF &primaryVertex)
366 cout <<"CONFIG_VERTEX: "
367 <<primaryVertex[0]<<" "
368 <<primaryVertex[1]<<" "
369 <<primaryVertex[2]<<" "<<endl;
373 ////////////////////////////////////////////////////////////////////////
374 void AliMergeSteer::ExportVertex(TArrayF &primaryVertex)
376 char vertexAsString[30];
377 sprintf(vertexAsString,"%f",primaryVertex[0]);
378 gSystem->Setenv("CONFIG_VERTEX_X",vertexAsString);
379 sprintf(vertexAsString,"%f",primaryVertex[1]);
380 gSystem->Setenv("CONFIG_VERTEX_Y",vertexAsString);
381 sprintf(vertexAsString,"%f",primaryVertex[2]);
382 gSystem->Setenv("CONFIG_VERTEX_Z",vertexAsString);
385 ////////////////////////////////////////////////////////////////////////
386 Bool_t AliMergeSteer::Simulate()
391 TDirectory *saveDir = gDirectory;
392 cout<< "The original directory is: ";
394 if (!ExtractVertex(fFileNameBgrHits,fBgrEventNr)) {
395 cerr<<" ExtractVertexAndSimulateSignal: Error in ExtractVertex"<<endl;
399 new AliRun("gAlice","Signal for Merging");
400 gAlice->Init("Config.C");
401 // gSystem->Setenv("CONFIG_FILE",fileNameSigHits);
404 gAlice->Run(fNEvents);
406 cout<<"Simulation of "<<fNEvents<<" of signal took: "<<endl;
410 f = static_cast<TFile *>(gROOT->FindObject("galice.root"));
413 sprintf(cmd,"mv galice.root %s",fFileNameHits.Data());
419 ////////////////////////////////////////////////////////////////////////
420 Bool_t AliMergeSteer::CreateSDigits()
424 sprintf(macroName,"AliHits2SDigits.C");
426 "AliHits2SDigits(\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
427 fFileNameSDigits.Data(),fFileNameHits.Data(),
428 fNEvents,0,fITS,fTPC,fTRD,fPHOS,fTOF,0);
429 cerr<<"I'll do: "<<funcName<<endl;
430 gROOT->LoadMacro(macroName);
431 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
432 gInterpreter->ProcessLine(funcName);
433 if (fDEBUG) cerr<<"SDigits created"<<endl;
438 ////////////////////////////////////////////////////////////////////////
439 Bool_t AliMergeSteer::Merge()
443 cerr<<"Start merging"<<endl;
444 sprintf(macroName,"MergeV1.C");
446 "Merge(\"%s\",\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
447 fFileNameDigitsMerged.Data(),fFileNameSDigits.Data(),
448 fFileNameBgrSDigits.Data(),
449 fNEvents,fITS,fTPC,fTRD,fPHOS,fMUON,fHMPID,0);
450 cerr<<"I'll do: "<<funcName<<endl;
451 gROOT->LoadMacro(macroName);
452 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
453 gInterpreter->ProcessLine(funcName);
454 if (fDEBUG) cerr<<"Merging done"<<endl;
457 // add ITS fast points, no merging yet
458 // return ITSFastPoints(fFileNameDigitsMerged.Data(),
459 // fFileNameHits.Data());
462 ////////////////////////////////////////////////////////////////////////
463 Bool_t AliMergeSteer::NoMerge()
467 cerr<<"Start NoMerging"<<endl;
468 sprintf(macroName,"AliSDigits2Digits.C");
470 "AliSDigits2Digits(\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);",
471 fFileNameDigitsSignalOnly.Data(),fFileNameSDigits.Data(),
472 fNEvents,fITS,fTPC,fTRD,fPHOS,fMUON,fHMPID,0);
473 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
474 gROOT->LoadMacro(macroName);
475 gInterpreter->ProcessLine(funcName);
476 if (fDEBUG) cerr<<"NoMerging done"<<endl;
478 // add ITS fast points, no merging
479 // return ITSFastPoints(fFileNameDigitsSignalOnly.Data(),
480 // fFileNameHits.Data());
483 ////////////////////////////////////////////////////////////////////////
484 Bool_t AliMergeSteer::ITSFastPoints(const char *outputFile, const char *inputFile) {
488 sprintf(macroName,"AliITSHits2SDR.C");
489 sprintf(funcName,"AliITSH2FR2files(\"%s\",\"%s\");",
490 inputFile, outputFile);
491 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
492 gROOT->LoadMacro(macroName);
493 gInterpreter->ProcessLine(funcName);
494 if (fDEBUG) cerr<<"ITSFastPoints done"<<endl;
499 ////////////////////////////////////////////////////////////////////////
500 Bool_t AliMergeSteer::RecoMerged()
507 cerr<<"Start RecoMerged"<<endl;
508 sprintf(macroName,"AliBarrelRecoV3.C");
509 sprintf(funcName,"AliBarrelRecoMerged(%d);",fNEvents);
510 gROOT->LoadMacro(macroName);
511 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
512 gInterpreter->ProcessLine(funcName);
513 if (fDEBUG) cerr<<"RecoMerged done"<<endl;
517 ////////////////////////////////////////////////////////////////////////
518 Bool_t AliMergeSteer::RecoSignalOnly()
525 cerr<<"Start RecoSignalOnly"<<endl;
526 sprintf(macroName,"AliBarrelRecoNoITSClass.C");
527 sprintf(funcName,"AliBarrelReco(%d);",fNEvents);
528 gROOT->LoadMacro(macroName);
529 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
530 gInterpreter->ProcessLine(funcName);
531 if (fDEBUG) cerr<<"RecoSignalOnly done"<<endl;
535 ////////////////////////////////////////////////////////////////////////
536 Bool_t AliMergeSteer::CmpMerged()
543 cerr<<"Start CmpMerged"<<endl;
544 sprintf(macroName,"CmpGaRS.C");
546 "CmpGaRS(%d,%d,\"%s\",\"AliTPCtracks_merged.root\",\"%s\");",
547 fNEvents, fFirstEvent, fFileNameHits.Data(),
548 fFileNameCmpMerged.Data());
549 gROOT->LoadMacro(macroName);
550 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
551 gInterpreter->ProcessLine(funcName);
552 if (fDEBUG) cerr<<"CmpMerged done"<<endl;
555 ////////////////////////////////////////////////////////////////////////
556 Bool_t AliMergeSteer::CmpSignalOnly()
563 cerr<<"Start CmpSignalOnly"<<endl;
564 sprintf(macroName,"CmpGaRS.C");
566 "CmpGaRS(%d,%d,\"%s\",\"AliTPCtracks.root\",\"%s\");",
567 fNEvents, fFirstEvent, fFileNameHits.Data(),
568 fFileNameCmpSignalOnly.Data());
569 gROOT->LoadMacro(macroName);
570 if (fDEBUG) cerr<<"I'll do: "<<funcName<<endl;
571 gInterpreter->ProcessLine(funcName);
572 if (fDEBUG) cerr<<"CmpSignalOnly done"<<endl;
575 ////////////////////////////////////////////////////////////////////////
576 Bool_t AliMergeSteer::AliCopy(TFile *inputFile, TFile *outputFile)
579 // copy gAlice object, AliceGeom and TreeE
583 if (fDEBUG) cout<<"Copy gAlice: ";
587 "gAlice must be deleted before AliCopy is called.");
590 if (!ImportgAlice(inputFile)) return kFALSE;
592 if (fDEBUG) cout<<"done"<<endl;
596 TTree *treeE = gAlice->TreeE();
598 cerr<<"No TreeE found "<<endl;
601 if (fDEBUG) cout<<"Copy TreeE: ";
602 AliHeader *header = new AliHeader();
603 treeE->SetBranchAddress("Header", &header);
604 treeE->SetBranchStatus("*",1);
605 TTree *treeENew = treeE->CloneTree();
607 if (fDEBUG) cout<<"done"<<endl;
616 ////////////////////////////////////////////////////////////////////////
617 Bool_t AliMergeSteer::AliCopy(TString inputFileName, TString outputFileName)
620 // open iput and output files,
621 // ask to copy gAlice object, AliceGeom and TreeE
622 // close input and ouput files
625 cout<<"AliCopy: will copy gAlice from "<<inputFileName.Data()<<" to "
626 <<outputFileName.Data()<<endl;
629 TFile *inputFile = TFile::Open(inputFileName.Data());
630 if (!inputFile->IsOpen()) {
631 cerr<<"Can't open "<<inputFileName.Data()<<" !\n";
635 TFile *outputFile = TFile::Open(outputFileName.Data(),"UPDATE");
636 if (!outputFile->IsOpen()) {
637 cerr<<"Can't open "<<outputFileName.Data()<<" !\n";
641 AliCopy(inputFile, outputFile);
647 cout<<"AliCopy copied gAlice from "<<inputFileName.Data()<<" to "
648 <<outputFileName.Data()<<endl;
653 ////////////////////////////////////////////////////////////////////////