#include "CbmRichMCbmHitProducer.h" #include "CbmRichPoint.h" #include "CbmRichHit.h" #include "CbmRichDigi.h" #include "TClonesArray.h" #include "CbmRichGeoManager.h" #include "CbmRichDigiMapManager.h" #include "FairLogger.h" #include "CbmEvent.h" #include using namespace std; CbmRichMCbmHitProducer::CbmRichMCbmHitProducer(): FairTask("CbmRichMCbmHitProducer"), fRichDigis(NULL), fRichHits(NULL), fEventNum(0), fHitError(0.6 / sqrt(12.)), fMappingFile("mRICH_Mapping_vert_20190318.geo") { } CbmRichMCbmHitProducer::~CbmRichMCbmHitProducer() { FairRootManager *manager =FairRootManager::Instance(); manager->Write(); } void CbmRichMCbmHitProducer::SetParContainers() { } InitStatus CbmRichMCbmHitProducer::Init() { FairRootManager* manager = FairRootManager::Instance(); fRichDigis = (TClonesArray*)manager->GetObject("CbmRichDigi"); if (nullptr == fRichDigis) { Fatal("CbmRichMCbmHitProducer::Init","No RichDigi array!"); } fRichHits = new TClonesArray("CbmRichHit"); manager->Register("RichHit","RICH", fRichHits, IsOutputBranchPersistent("RichHit")); InitMapping(); return kSUCCESS; } void CbmRichMCbmHitProducer::InitMapping() { string line; ifstream file (fMappingFile); if (!file.is_open()){ Fatal("CbmRichMCbmHitProducer::InitMapping", ("Unable to open mapping file:" + fMappingFile).c_str()); } fRichMapping.clear(); while ( getline (file,line) ) { istringstream iss(line); vector 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]); Int_t adr = ((data.fTrbId << 16) | (data.fChannel & 0x00FF)); // cout << data.fTrbId << " " << data.fChannel << " " << data.fX << " " << data.fY << " " << adr << endl; fRichMapping[adr] = data; } file.close(); //cout << "Mapping size:" << fRichMapping.size() <Delete(); int nofRichDigis = fRichDigis->GetEntries(); double minTime = std::numeric_limits::max(); for (int iDigi = 0; iDigi < nofRichDigis; iDigi++) { CbmRichDigi* richDigi = static_cast(fRichDigis->At(iDigi)); ProcessDigi(iDigi); } } void CbmRichMCbmHitProducer::ProcessDigi( Int_t digiIndex) { CbmRichDigi* digi = static_cast(fRichDigis->At(digiIndex)); if (digi == nullptr) return; CbmRichMCbmMappingData data = fRichMapping[digi->GetAddress()]; TVector3 posPoint; posPoint.SetXYZ(data.fX, data.fY, 0.); AddHit(posPoint, digi->GetTime(), digiIndex); } void CbmRichMCbmHitProducer::AddHit( TVector3 &posHit, Double_t time, Int_t index) { Int_t nofHits = fRichHits->GetEntriesFast(); new((*fRichHits)[nofHits]) CbmRichHit(); CbmRichHit *hit = (CbmRichHit*)fRichHits->At(nofHits); hit->SetPosition(posHit); hit->SetDx(fHitError); hit->SetDy(fHitError); hit->SetRefId(index); hit->SetTime(time); } void CbmRichMCbmHitProducer::Finish() { fRichHits->Clear(); } ClassImp(CbmRichMCbmHitProducer)