#include "CbmPsdMCbmHitProducer.h" #include "CbmPsdMCbmHit.h" #include "CbmPsdDigi.h" #include "TClonesArray.h" #include "FairLogger.h" #include "CbmEvent.h" #include "CbmDigiManager.h" #include using namespace std; CbmPsdMCbmHitProducer::CbmPsdMCbmHitProducer(): FairTask("CbmPsdMCbmHitProducer"), fPsdHits(NULL), fEventNum(0), fHitError(10)/*half a module in cm*/ { } CbmPsdMCbmHitProducer::~CbmPsdMCbmHitProducer() { FairRootManager *manager =FairRootManager::Instance(); manager->Write(); } void CbmPsdMCbmHitProducer::SetParContainers() { } InitStatus CbmPsdMCbmHitProducer::Init() { FairRootManager* manager = FairRootManager::Instance(); fCbmEvents = dynamic_cast(manager->GetObject("CbmEvent")); if ( fCbmEvents == nullptr) { LOG(info) << ": CbmEvent NOT found \n \n \n"; } else { LOG(info) << ": CbmEvent found \n \n \n"; } fDigiMan = CbmDigiManager::Instance(); fDigiMan->Init(); if ( ! fDigiMan->IsPresent(ECbmModuleId::kPsd) ) Fatal("CbmPsdMCbmHitProducer::Init","No PsdDigi array!"); fPsdHits = new TClonesArray("CbmPsdMCbmHit");//TODO manager->Register("PsdHit","PSD", fPsdHits, IsOutputBranchPersistent("PsdHit")); //InitMapping(); return kSUCCESS; } /* void CbmPsdMCbmHitProducer::InitMapping() //TODO change for psd { string line; ifstream file (fMappingFile); if (!file.is_open()){ std::cout<<": Unable to open mapping file:" << fMappingFile.c_str()< results(istream_iterator{iss}, std::istream_iterator()); if (results.size() != 8) continue; CbmRichMCbmMappingData data; data.fTrbId = stoi(results[0], nullptr, 16); data.fChannel = stoi(results[1]); data.fX = stod(results[6]); data.fY = stod(results[7]); data.fZ = 348.; data.fX -= 6.3; //Shift by 1Pmt + PmtGap + 1cm Int_t adr = ((data.fTrbId << 16) | (data.fChannel & 0x00FF)); // cout << data.fTrbId << " " << data.fChannel << " " << data.fX << " " << data.fY << " " << adr << endl; fPsdMapping[adr] = data; } file.close(); //cout << "Mapping size:" << fPsdMapping.size() <Delete(); // if CbmEvent does not exist then process standard event. // if CbmEvent exists then proceed all events in time slice. Int_t nUnits = ( fCbmEvents != nullptr) ? fCbmEvents->GetEntriesFast() : 1; for (Int_t iUnit = 0; iUnit < nUnits; iUnit++) { CbmEvent* event = ( fCbmEvents != nullptr) ? static_cast(fCbmEvents->At(iUnit)) : nullptr; ProcessData(event); } } void CbmPsdMCbmHitProducer::ProcessData( CbmEvent* event) { if (event != NULL) { LOG(info) << "CbmPsdMCbmHitProducer CbmEvent mode. CbmEvent # " << event->GetNumber(); Int_t nofDigis = event->GetNofData(ECbmDataType::kPsdDigi); LOG(info) << "nofDigis: " << nofDigis; for (Int_t iDigi = 0; iDigi < nofDigis; iDigi++) { Int_t digiIndex = event->GetIndex(ECbmDataType::kPsdDigi, iDigi); ProcessDigi(event, digiIndex); } } else { for(Int_t iDigi = 0; iDigi < fDigiMan->GetNofDigis(ECbmModuleId::kPsd); iDigi++){ ProcessDigi(event, iDigi); } } } void CbmPsdMCbmHitProducer::ProcessDigi( CbmEvent* event, Int_t digiIndex) { const CbmPsdDigi* digi = fDigiMan->Get(digiIndex); if (digi == nullptr) return; if (digi->GetAddress() < 0) return; if (isInEnRange(digi->GetEdep())) { AddHit(event, digi->GetTime(), digi->GetEdep(), digi->GetModuleID(), digi->GetSectionID(), digiIndex); } } void CbmPsdMCbmHitProducer::AddHit( CbmEvent* event, Double_t time, Double_t energy, UInt_t moduleId, UInt_t sectionId, Int_t /*index*/) { Int_t nofHits = fPsdHits->GetEntriesFast(); new((*fPsdHits)[nofHits]) CbmPsdMCbmHit(); CbmPsdMCbmHit *hit = (CbmPsdMCbmHit*)fPsdHits->At(nofHits); hit->SetEdep(energy); hit->SetTime(time); hit->SetModuleID(moduleId); hit->SetSectionID(sectionId); if (event != NULL) { event->AddData(ECbmDataType::kPsdHit, nofHits); } } void CbmPsdMCbmHitProducer::Finish() { fPsdHits->Clear(); } bool CbmPsdMCbmHitProducer::isInEnRange(const double energy){ if (!fDoEnCut) return true; if ((energy> fEnLimitLow) && (energy < fEnLimitHigh)) { return true; } else { return false; } } ClassImp(CbmPsdMCbmHitProducer)