void SDAMakePhysSignals::exec(){ if(auto signal=dynamic_cast<const JPetRecoSignal*const>(getEvent())){ JPetPhysSignal physSignal; physSignal.setRecoSignal(*signal); // NOTE: This module currently sets number of photoelectrons // equal to charge of JPetRecoSignal physSignal.setPhe(physSignal.getRecoSignal().getCharge() ); fWriter->write(physSignal); } }
vector<JPetHit> TaskC::createHits(const vector<JPetRawSignal>& signals) { vector<JPetHit> hits; for (auto i = signals.begin(); i != signals.end(); ++i) { for (auto j = i; ++j != signals.end();) { if (i->getPM().getScin() == j->getPM().getScin()) { // found 2 signals from the same scintillator // wrap the RawSignal objects into RecoSignal and PhysSignal // for now this is just wrapping opne object into another // in the future analyses it will involve more logic like // reconstructing the signal's shape, charge, amplitude etc. JPetRecoSignal recoSignalA; JPetRecoSignal recoSignalB; JPetPhysSignal physSignalA; JPetPhysSignal physSignalB; // assign sides A and B properly if ( (i->getPM().getSide() == JPetPM::SideA) && (j->getPM().getSide() == JPetPM::SideB) ) { recoSignalA.setRawSignal(*i); recoSignalB.setRawSignal(*j); } else if ( (j->getPM().getSide() == JPetPM::SideA) && (i->getPM().getSide() == JPetPM::SideB) ) { recoSignalA.setRawSignal(*j); recoSignalB.setRawSignal(*i); } else { // if two hits on the same side, ignore WARNING("TWO hits on the same scintillator side we ignore it"); continue; } if ( recoSignalA.getRawSignal().getNumberOfPoints(JPetSigCh::Leading) < 4 ) continue; if ( recoSignalB.getRawSignal().getNumberOfPoints(JPetSigCh::Leading) < 4 ) continue; bool thresholds_ok = true; for (int i = 1; i <= 4; ++i) { if ( recoSignalA.getRawSignal().getTimesVsThresholdNumber(JPetSigCh::Leading).count(i) < 1 ) { thresholds_ok = false; } if ( recoSignalB.getRawSignal().getTimesVsThresholdNumber(JPetSigCh::Leading).count(i) < 1 ) { thresholds_ok = false; } } if (thresholds_ok == false) { continue; } physSignalA.setRecoSignal(recoSignalA); physSignalB.setRecoSignal(recoSignalB); auto leading_points_a = physSignalA.getRecoSignal().getRawSignal().getTimesVsThresholdNumber(JPetSigCh::Leading); auto leading_points_b = physSignalB.getRecoSignal().getRawSignal().getTimesVsThresholdNumber(JPetSigCh::Leading); //skip signals with no information on 1st threshold // if(leading_points_a.count(1) == 0) continue; // if(leading_points_b.count(1) == 0) continue; physSignalA.setTime(leading_points_a.at(1)); physSignalB.setTime(leading_points_b.at(1)); JPetHit hit; hit.setSignalA(physSignalA); hit.setSignalB(physSignalB); hit.setScintillator(i->getPM().getScin()); hit.setBarrelSlot(i->getPM().getScin().getBarrelSlot()); physSignalA.setTime(physSignalA.getRecoSignal().getRawSignal().getTimesVsThresholdNumber(JPetSigCh::Leading).at(1)); physSignalB.setTime(physSignalB.getRecoSignal().getRawSignal().getTimesVsThresholdNumber(JPetSigCh::Leading).at(1)); hit.setTime( 0.5 * ( hit.getSignalA().getTime() + hit.getSignalB().getTime()) ); hits.push_back(hit); getStatistics().getCounter("No. found hits")++; } } } return hits; }