//---------------------------------------------------------------------- // File and Version Information: // $Id: // // Description: // Class EmcMakeDigi. This class takes array of EmcHit's and produce // an array of EmcDigis. // It is convenient to study reconstruction algoritms without // disturbance from digitization //---------------------------------------------------------------------- #include "TClonesArray.h" #include "EmcMakeDigi.h" #include "EmcDigi.h" #include "EmcDigiPar.h" #include "EmcMapper.h" #include "EmcStructure.h" #include "CbmRootManager.h" #include "CbmRunAna.h" #include "CbmRuntimeDb.h" #include #include using std::endl; using std::fstream; EmcMakeDigi::EmcMakeDigi(string fileGeo) { fFileGeo=fileGeo; fDigiPosMethod="surface";// "surface" or "depth" fEmcDigiRescaleFactor=1.08; fEmcDigiPositionDepth=12.5; } //-------------- // Destructor -- //-------------- EmcMakeDigi::~EmcMakeDigi() { } InitStatus EmcMakeDigi::Init() { // Get RootManager CbmRootManager* ioman = CbmRootManager::Instance(); if ( ! ioman ) { cout << "-E- EmcMakeDigi::Init: " << "RootManager not instantiated!" << endl; return kFATAL; } // Get input array fHitArray = (TClonesArray*) ioman->GetObject("EmcHit"); if ( ! fHitArray ) { cout << "-W- EmcMakeDigi::Init: " << "No EmcHit array!" << endl; return kERROR; } // Create and register output array fDigiArray = new TClonesArray("EmcDigi"); ioman->Register("EmcDigi","Emc",fDigiArray,kTRUE); threshold=fDigiPar->GetThreshold(); if (!fDigiPosMethod.compare("surface")) { EmcDigi::selectDigiPositionMethod( EmcDigi::surface, 1., 0. ); } else if (!fDigiPosMethod.compare("depth")) { EmcDigi::selectDigiPositionMethod( EmcDigi::depth, fEmcDigiRescaleFactor, fEmcDigiPositionDepth); } else { cout << "-W- EmcMakeDigi::Init: " << "Unknown digi position method!" << endl; return kERROR; } int map_ver=0; if (!fFileGeo.compare("emc_module12345.dat")) map_ver=1; else Fatal("EmcMakeDigi::Init()", "Mapper for the given geometry file is not defined"); EmcMapper::Instance(map_ver); EmcStructure::Instance(fFileGeo); cout << "-I- EmcMakeDigi: Intialization successfull" << endl; return kSUCCESS; } void EmcMakeDigi::Exec(Option_t* opt) { // Reset output array if ( ! fDigiArray ) Fatal("Exec", "No Digi Array"); fDigiArray->Clear(); // Variable declaration CbmEmcHit* theHit = NULL; // Loop over CbmEmcHits to add them to correspondent wavefoorms Int_t nHits = fHitArray->GetEntriesFast(); Int_t i_digi=0; // there are 2 different indexes i_digi and iHit since not for each Hit there is digi std::vector hitList; cout<<"Hit array contains "<At(iHit); // hitList contains only 1 hit hitList.push_back(theHit); int detId=theHit->GetDetectorId(); Double_t energy=theHit->GetEnergy(); // Both endcaps are already implemented in EmcMapper (21.05.07) int module = detId/100000000; if (energy>threshold) { Int_t trackId=theHit->GetTrackId(); Double_t time=theHit->GetTime(); new((*fDigiArray)[i_digi]) EmcDigi(trackId,detId, energy, time,hitList); i_digi++; } hitList.clear(); } } void EmcMakeDigi::SetParContainers() { // Get run and runtime database CbmRunAna* run = CbmRunAna::Instance(); if ( ! run ) Fatal("SetParContainers", "No analysis run"); CbmRuntimeDb* db = run->GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get Emc digitisation parameter container fDigiPar = (EmcDigiPar*) db->getContainer("EmcDigiPar"); } ClassImp(EmcMakeDigi)