//---------------------------------------------------------------------- // File and Version Information: // $Id: // // Description: // Class PndEmcWaveformToDigi. Module to take the ADC waveforms and produces digi. // // Software developed for the BaBar Detector at the SLAC B-Factory. // Adapted for the PANDA experiment at GSI // // Author List: // Phil Strother Original Author // Dima Melnichuk - adaption for PANDA // Copyright Information: // Copyright (C) 1996 Imperial College // //---------------------------------------------------------------------- #include "PndEmcWaveformToDigi.h" #include "PndEmcWaveform.h" #include "PndEmcDigi.h" #include "PndEmcDigiPar.h" #include "PndEmcRecoPar.h" #include "CbmRootManager.h" #include "CbmRunAna.h" #include "CbmRuntimeDb.h" #include "TClonesArray.h" #include "TStopwatch.h" #include #include using std::cout; using std::endl; using std::fstream; PndEmcWaveformToDigi::PndEmcWaveformToDigi(Int_t verbose) { fVerbose=verbose; fDigiPosMethod="depth";// "surface" or "depth" fEmcDigiRescaleFactor=1.08; //fPndEmcDigiPositionDepth=6.2; } //-------------- // Destructor -- //-------------- PndEmcWaveformToDigi::~PndEmcWaveformToDigi() { } InitStatus PndEmcWaveformToDigi::Init() { // Get RootManager CbmRootManager* ioman = CbmRootManager::Instance(); if ( ! ioman ) { cout << "-E- PndEmcWaveformToDigi::Init: " << "RootManager not instantiated!" << endl; return kFATAL; } // Get input array fWaveformArray = (TClonesArray*) ioman->GetObject("EmcWaveform"); if ( ! fWaveformArray ) { cout << "-W- PndEmcWaveformToDigi::Init: " << "No PndEmcWaveform array!" << endl; return kERROR; } // Create and register output array fDigiArray = new TClonesArray("PndEmcDigi"); ioman->Register("EmcDigi","Emc",fDigiArray,kTRUE); fSampleRate=fDigiPar->GetSampleRate(); fEnergyDigiThreshold=fDigiPar->GetEnergyDigiThreshold(); fEmcDigiPositionDepth=fRecoPar->GetEmcDigiPositionDepth(); cout<<"fEmcDigiPositionDepth: "<0){ timer.Start(); } // Reset output array if ( ! fDigiArray ) Fatal("Exec", "No Digi Array"); fDigiArray->Delete(); double peakPosition; double max_energy; double digi_time; int i_digi=0; //index of digi in TClonesArray Int_t nWaveforms = fWaveformArray->GetEntriesFast(); //cout<<"PndEmcWaveformToDigi: "<At(iWaveform); hitList=theWaveform->itsHitList(); int detId=theWaveform->GetDetectorId(); int trackId=theWaveform->GetTrackId(); theWaveform->fitPeak(max_energy,peakPosition); max_energy/=theWaveform->get_scale(); digi_time=peakPosition/fSampleRate; if (max_energy>fEnergyDigiThreshold) { new((*fDigiArray)[i_digi]) PndEmcDigi(trackId,detId, max_energy, peakPosition,hitList); i_digi++; } hitList.clear(); } if (fVerbose>0){ timer.Stop(); Double_t rtime = timer.RealTime(); Double_t ctime = timer.CpuTime(); cout << "PndEmcWaveformToDigi, Real time " << rtime << " s, CPU time " << ctime << " s" << endl; } } void PndEmcWaveformToDigi::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 = (PndEmcDigiPar*) db->getContainer("PndEmcDigiPar"); // Get Emc reconstruction parameter container fRecoPar = (PndEmcRecoPar*) db->getContainer("PndEmcRecoPar"); } ClassImp(PndEmcWaveformToDigi)