//////////////////////////////////////////////////////////////////////// // // Class to steer several steps in merging: // - extraction of vertex from bgr event // - event simulation // - creation of sdigits // - creation of digits // - analysis // // Author: Jiri Chudoba (CERN), 2002 // //////////////////////////////////////////////////////////////////////// #include // --- ROOT system --- #include "TTask.h" #include "TString.h" #include "TROOT.h" #include "TFile.h" #include "TTree.h" #include "TStopwatch.h" #include "TArrayF.h" #include "TSystem.h" #include "TGeometry.h" #include "TInterpreter.h" // --- AliRoot header files --- #include "AliRun.h" #include "AliHeader.h" #include "AliGenEventHeader.h" class AliTRDdigitizer; class AliPHOSSDigitizer; class AliTOFSDigitizer; class AliMergeSteer: public TTask { public: AliMergeSteer(const Text_t* name="AliMergeSteer", const Text_t* title="AliMergeSteer"); // AliMergeSteer(Option_t *option); virtual ~AliMergeSteer(); Bool_t SetDetectorFlag(Option_t* option, Int_t flag); Int_t GetDetectorFlag(Option_t* option); // void Print(); virtual void Exec(const Option_t *option); Bool_t ImportgAlice(TFile *file); Bool_t ExtractVertex(TString fn, Int_t eventNr); void PrintVertex(TArrayF &vertex); void ExportVertex(TArrayF &vertex); Bool_t Simulate(); Bool_t CreateSDigits(); Bool_t Merge(); Bool_t NoMerge(); Bool_t ITSFastPoints(const char *outputFile, const char *inputFile); Bool_t RecoMerged(); Bool_t RecoSignalOnly(); Bool_t CmpMerged(); Bool_t CmpSignalOnly(); Bool_t AliCopy(TFile *inputFile, TFile *outputFile); Bool_t AliCopy(TString inputFileName, TString outputFileName); // file names setter/getters void SetFileNameHits(TString fileName) {fFileNameHits = fileName;} void SetFileNameSDigits(TString fileName) {fFileNameSDigits = fileName;} void SetFileNameBgrHits(TString fileName) {fFileNameBgrHits = fileName;} void SetFileNameBgrSDigits(TString fileName) {fFileNameBgrSDigits = fileName;} void SetFileNameDigitsMerged(TString fileName) {fFileNameDigitsMerged = fileName;} void SetFileNameDigitsSignalOnly(TString fileName) {fFileNameDigitsSignalOnly = fileName;} TString FileNameHits() {return fFileNameHits;} TString FileNameSDigits() {return fFileNameSDigits;} TString FileNameBgr() {return fFileNameBgrSDigits;} TString FileNameDigitsMerged() {return fFileNameDigitsMerged;} TString FileNameDigitsSignalOnly() {return fFileNameDigitsSignalOnly;} // flags void SetFlagSim(Bool_t flag) {fFlagSim = flag;} void SetFlagSDigits(Bool_t flag) {fFlagSDigits = flag;} void SetFlagMerge(Bool_t flag) {fFlagMerge = flag;} void SetFlagDigitsSignalOnly(Bool_t flag) {fFlagDigitsSignalOnly = flag;} void SetFlagRecoMerged(Bool_t flag) {fFlagRecoMerged = flag;} void SetFlagRecoSignalOnly(Bool_t flag) {fFlagRecoSignalOnly = flag;} void SetFlagCmpMerged(Bool_t flag) {fFlagCmpMerged = flag;} void SetFlagCmpSignalOnly(Bool_t flag) {fFlagCmpSignalOnly = flag;} // event numbers void SetNEvents(Int_t nEvents) {fNEvents = nEvents;} void SetBgrEventNr(Int_t i) {fBgrEventNr = i;} private: TString fFileNameHits; TString fFileNameSDigits; TString fFileNameBgrHits; TString fFileNameBgrSDigits; TString fFileNameDigitsMerged; TString fFileNameDigitsSignalOnly; TString fFileNameCmpMerged; TString fFileNameCmpSignalOnly; Bool_t fFlagSim; Bool_t fFlagSDigits; Bool_t fFlagMerge; Bool_t fFlagDigitsSignalOnly; Bool_t fFlagRecoMerged; Bool_t fFlagRecoSignalOnly; Bool_t fFlagCmpMerged; Bool_t fFlagCmpSignalOnly; Bool_t fCopy2S; Bool_t fCopy2D; Int_t fNEvents; Int_t fFirstEvent; Int_t fBgrEventNr; Int_t fDEBUG; // flags for detectors - determine which detector will be used // during merging. // 0 - do not use // 1 - process the whole detector // 2 - process only active region (region of interest on) Int_t fFMD; Int_t fITS; Int_t fMUON; Int_t fPHOS; Int_t fPMD; Int_t fRICH; Int_t fSTART; Int_t fTOF; Int_t fTPC; Int_t fTRD; Int_t fZDC; Int_t fEMCAL; }; //////////////////////////////////////////////////////////////////////// // // AliMergeSteer.cxx // // //////////////////////////////////////////////////////////////////////// AliMergeSteer::AliMergeSteer(const Text_t *name, const Text_t* title) : TTask(name,title) { // // default ctor // fFileNameHits="galice.root"; fFileNameSDigits = "sdigits.root"; fFileNameBgrSDigits = "bgr.sdigits.root"; fFileNameBgrHits = "bgr.hits.root"; fFileNameDigitsMerged = "digits.root"; fFileNameDigitsSignalOnly = "digits.signal.root"; fFileNameCmpMerged = "CmpGaRS_merged.root"; fFileNameCmpSignalOnly = "CmpGaRS_signal.root"; fFlagSim = kFALSE; fFlagSDigits = kFALSE; fFlagMerge = kFALSE; fFlagDigitsSignalOnly = kFALSE; fFlagRecoMerged = kFALSE; fFlagRecoSignalOnly = kFALSE; fFlagCmpMerged = kFALSE; fFlagCmpSignalOnly = kFALSE; fCopy2S = kTRUE; fCopy2D = kTRUE; fNEvents = 1; fFirstEvent = 0; fBgrEventNr = 0; fDEBUG = 1; fFMD = 0; fITS = 0; fMUON = 0; fPHOS = 0; fPMD = 0; fRICH = 0; fSTART = 0; fTOF = 0; fTPC = 0; fTRD = 0; fZDC = 0; fEMCAL = 0; } //////////////////////////////////////////////////////////////////////// AliMergeSteer::~AliMergeSteer() { // default dtor } //////////////////////////////////////////////////////////////////////// void AliMergeSteer::Exec(Option_t* option) { Bool_t rc = kTRUE; if (gAlice) delete gAlice; gAlice = 0; if (fFlagSim) rc = Simulate(); if (!rc) {Error("Exec","Simulate wrong"); return;} if (fFlagSDigits) rc = CreateSDigits(); if (!rc) {Error("Exec","CreateSDigits wrong"); return;} if (fFlagSDigits && fCopy2S) rc = AliCopy(fFileNameHits,fFileNameSDigits); if (!rc) {Error("Exec","AliCopy to SD wrong"); return;} if (fFlagMerge && fCopy2D) rc = AliCopy(fFileNameHits,fFileNameDigitsMerged); if (!rc) {Error("Exec","AliCopy to DigitsMerged wrong"); return;} if (fFlagMerge) rc = Merge(); if (!rc) {Error("Exec","Merge wrong"); return;} if (fFlagDigitsSignalOnly) rc = NoMerge(); if (!rc) {Error("Exec","NoMerge wrong"); return;} if (fFlagRecoMerged) rc = RecoMerged(); if (!rc) {Error("Exec","RecoMerged wrong"); return;} if (fFlagRecoSignalOnly) rc = RecoSignalOnly(); if (!rc) {Error("Exec","RecoSignalOnly wrong"); return;} if (fFlagCmpMerged) rc = CmpMerged(); if (!rc) {Error("Exec","CmpMerged wrong"); return;} if (fFlagCmpSignalOnly) rc = CmpSignalOnly(); if (!rc) {Error("Exec","CmpSignalOnly wrong"); return;} } //////////////////////////////////////////////////////////////////////// Int_t AliMergeSteer::GetDetectorFlag(Option_t* option) { // // return current flag value for a given detector // if (strstr(option,"FMD")) { return fFMD; } else if (strstr(option,"ITS")) { return fITS; } else if (strstr(option,"MUON")) { return fMUON; } else if (strstr(option,"PHOS")) { return fPHOS; } else if (strstr(option,"PMD")) { return fPMD; } else if (strstr(option,"RICH")) { return fRICH; } else if (strstr(option,"START")) { return fSTART; } else if (strstr(option,"TOF")) { return fTOF; } else if (strstr(option,"TPC")) { return fTPC; } else if (strstr(option,"TRD")) { return fTRD; } else if (strstr(option,"ZDC")) { return fZDC; } else if (strstr(option,"EMCAL")) { return fEMCAL; } else { cerr<<"Unknown detector required."<Get("gAlice"); if (!gAlice) return kFALSE; return kTRUE; } //////////////////////////////////////////////////////////////////////// Bool_t AliMergeSteer::ExtractVertex(TString fn, Int_t eventNr) { // Open file with TPC geom and digits TFile *file=TFile::Open(fn); if (!file->IsOpen()) {cerr<<"Cannnot open "<Get("gAlice"))) { cerr<<"gAlice was not found in "<GetHeader(); if (!header) { cerr<<"header was not found in "<GenEventHeader(); if (!genEventHeader) { cerr<<"GenEventHeader was not found in "<PrimaryVertex(primaryVertex); PrintVertex(primaryVertex); ExportVertex(primaryVertex); // delete header; // Following two lines should be there, but .... // delete genEventHeader; // delete gAlice; gAlice = 0; file->Close(); return kTRUE; } //////////////////////////////////////////////////////////////////////// void AliMergeSteer::PrintVertex(TArrayF &primaryVertex) { cout <<"CONFIG_VERTEX: " <Setenv("CONFIG_VERTEX_X",vertexAsString); sprintf(vertexAsString,"%f",primaryVertex[1]); gSystem->Setenv("CONFIG_VERTEX_Y",vertexAsString); sprintf(vertexAsString,"%f",primaryVertex[2]); gSystem->Setenv("CONFIG_VERTEX_Z",vertexAsString); return; } //////////////////////////////////////////////////////////////////////// Bool_t AliMergeSteer::Simulate() { char cmd[100]; TFile *f; TDirectory *saveDir = gDirectory; cout<< "The original directory is: "; saveDir->pwd(); if (!ExtractVertex(fFileNameBgrHits,fBgrEventNr)) { cerr<<" ExtractVertexAndSimulateSignal: Error in ExtractVertex"<cd(); new AliRun("gAlice","Signal for Merging"); gAlice->Init("Config.C"); // gSystem->Setenv("CONFIG_FILE",fileNameSigHits); TStopwatch timer; timer.Start(); gAlice->Run(fNEvents); timer.Stop(); cout<<"Simulation of "<(gROOT->FindObject("galice.root")); if (f) f->Close(); f = 0; sprintf(cmd,"mv galice.root %s",fFileNameHits.Data()); gSystem->Exec(cmd); return kTRUE; } //////////////////////////////////////////////////////////////////////// Bool_t AliMergeSteer::CreateSDigits() { char macroName[200]; char funcName[200]; sprintf(macroName,"AliHits2SDigits.C"); sprintf(funcName, "AliHits2SDigits(\"%s\",\"%s\",%d,%d,%d,%d,%d,%d,%d,%d);", fFileNameSDigits.Data(),fFileNameHits.Data(), fNEvents,0,fITS,fTPC,fTRD,fPHOS,fTOF,0); cerr<<"I'll do: "<LoadMacro(macroName); if (fDEBUG) cerr<<"I'll do: "<ProcessLine(funcName); if (fDEBUG) cerr<<"SDigits created"<LoadMacro(macroName); if (fDEBUG) cerr<<"I'll do: "<ProcessLine(funcName); if (fDEBUG) cerr<<"Merging done"<LoadMacro(macroName); gInterpreter->ProcessLine(funcName); if (fDEBUG) cerr<<"NoMerging done"<LoadMacro(macroName); gInterpreter->ProcessLine(funcName); if (fDEBUG) cerr<<"ITSFastPoints done"<LoadMacro(macroName); if (fDEBUG) cerr<<"I'll do: "<ProcessLine(funcName); if (fDEBUG) cerr<<"RecoMerged done"<LoadMacro(macroName); if (fDEBUG) cerr<<"I'll do: "<ProcessLine(funcName); if (fDEBUG) cerr<<"RecoSignalOnly done"<LoadMacro(macroName); if (fDEBUG) cerr<<"I'll do: "<ProcessLine(funcName); if (fDEBUG) cerr<<"CmpMerged done"<LoadMacro(macroName); if (fDEBUG) cerr<<"I'll do: "<ProcessLine(funcName); if (fDEBUG) cerr<<"CmpSignalOnly done"<cd(); if (gAlice) { Error("AliCopy", "gAlice must be deleted before AliCopy is called."); return kFALSE; } if (!ImportgAlice(inputFile)) return kFALSE; gAlice->Write(); if (fDEBUG) cout<<"done"<TreeE(); if (!treeE) { cerr<<"No TreeE found "<SetBranchAddress("Header", &header); treeE->SetBranchStatus("*",1); TTree *treeENew = treeE->CloneTree(); treeENew->Write(); if (fDEBUG) cout<<"done"<(inputFile->Get("AliceGeom")); if (!AliceGeom) { cerr<<"AliceGeom was not found in the input file "<Write(); if (fDEBUG) cout<<"done"<IsOpen()) { cerr<<"Can't open "<IsOpen()) { cerr<<"Can't open "<Close(); outputFile->Close(); if (fDEBUG) { cout<<"AliCopy copied gAlice from "<