/* * Various flavours of hitfinder * 0 - Everything is a hit * 1 - Number of pixels (hitfinderMinPixCount) above ADC threshold * 2 - Total intensity above ADC threshold * 3 - Count Bragg peaks * 4 - Use TOF * 5 - Depreciated and no longer exists * 6 - Experimental - find peaks by SNR criteria * 7 - Laser on event code (usually EVR41) * 8 - Use Peakfinder8 */ int hitfinder(cEventData *eventData, cGlobal *global) { // Dereference stuff int detIndex = global->hitfinderDetIndex; int hit = 0; int nPeaks; /* * Default values for some metrics */ eventData->peakNpix = 0; eventData->peakTotal = 0; eventData->peakResolution = 0; eventData->peakDensity = 0; /* * Use one of various hitfinder algorithms */ switch (global->hitfinderAlgorithm) { case 0: // Everything is a hit. Used for converting xtc to hdf5 hit = 1; break; case 1: // Count the number of pixels above ADC threshold hit = hitfinder1(global, eventData, detIndex); break; case 2: // Integrated intensity above ADC threshold hit = hitfinder2(global, eventData, detIndex); break; case 3: // Count number of Bragg peaks (Anton's "number of connected peaks above threshold" algorithm) nPeaks = peakfinder(global, eventData, detIndex); eventData->nPeaks = nPeaks; eventData->hitScore = nPeaks; if (nPeaks >= global->hitfinderNpeaks && nPeaks <= global->hitfinderNpeaksMax) hit = 1; //hit = peakfinder3(global,eventData, detID); break; case 4: // Use TOF signal to find hits hit = hitfinder4(global, eventData, detIndex); break; case 6: // Count number of Bragg peaks (Rick's algorithm) nPeaks = peakfinder(global, eventData, detIndex); eventData->nPeaks = nPeaks; eventData->hitScore = nPeaks; if (nPeaks >= global->hitfinderNpeaks && nPeaks <= global->hitfinderNpeaksMax) hit = 1; //hit = peakfinder6(global,eventData, detID); break; case 7: // Return laser on event code hit = eventData->pumpLaserCode; eventData->nPeaks = eventData->pumpLaserCode; break; case 8: // Count number of Bragg peaks (Anton's noise-varying algorithm) nPeaks = peakfinder(global, eventData, detIndex); eventData->nPeaks = nPeaks; eventData->hitScore = nPeaks; if (nPeaks >= global->hitfinderNpeaks && nPeaks <= global->hitfinderNpeaksMax) hit = 1; break; case 9: // Use TOF signal, maximum peak, to find hits hit = hitfinder9(global, eventData); break; case 10: // Use TOF signal, maximum peak, excluding classical htis (this was 8 earlier, but it overlapped with Anton's new hitfinder) hit = hitfinder9(global, eventData); if (hit) { int nPeaks = eventData->nPeaks; hit = !(hitfinder1(global, eventData, detIndex)); eventData->nPeaks = nPeaks; } break; case 11: // Use TOF signal, voltage above threshold hit = hitfinderTOF(global, eventData); break; case 12: // Use list of hits as hitfinding algorithm nameEvent(eventData, global); // containsEvent returns bool, but is typeCasted to int according to // standard conversion (4.7/4 from the C++ Standard): // (bool containsEvent()) ? 1 : 0 // http://stackoverflow.com/questions/5369770/bool-to-int-conversion hit = (int) containsEvent((std::string) eventData->eventname, global); break; case 13: // Combine hitfinderTOF and hitfinder 1 (using both protons and photons) hit = hitfinderProtonsandPhotons(global, eventData, detIndex); break; case 14: //Yaroslavs peak finder nPeaks = peakfinder(global, eventData, detIndex); eventData->nPeaks = nPeaks; eventData->hitScore = nPeaks; if (nPeaks >= global->hitfinderNpeaks && nPeaks <= global->hitfinderNpeaksMax) hit = 1; break; default: printf("Unknown hit finding algorithm selected: %i\n", global->hitfinderAlgorithm); printf("Stopping in confusion.\n"); exit(1); break; } // Update central hit counter pthread_mutex_lock(&global->nhits_mutex); global->nhitsandblanks++; if (hit) { global->nhits++; global->nrecenthits++; } pthread_mutex_unlock(&global->nhits_mutex); // Set the appropriate powder class eventData->powderClass = hit; return (hit); }
std::ostream& operator<<(std::ostream& stream, const Event& event) { std::string maskString = ""; if (containsEvent(event, Event::access)) maskString.append("access "); if (containsEvent(event, Event::attrib)) maskString.append("attrib "); if (containsEvent(event, Event::close_write)) maskString.append("close_write "); if (containsEvent(event, Event::close_nowrite)) maskString.append("close_nowrite "); if (containsEvent(event, Event::create)) maskString.append("create "); if (containsEvent(event, Event::remove)) maskString.append("remove "); if (containsEvent(event, Event::remove_self)) maskString.append("remove_self "); if (containsEvent(event, Event::modify)) maskString.append("modify "); if (containsEvent(event, Event::move_self)) maskString.append("move_self "); if (containsEvent(event, Event::moved_from)) maskString.append("moved_from "); if (containsEvent(event, Event::moved_to)) maskString.append("moved_to "); if (containsEvent(event, Event::open)) maskString.append("open "); if (containsEvent(event, Event::is_dir)) maskString.append("is_dir "); if (containsEvent(event, Event::unmount)) maskString.append("unmount "); if (containsEvent(event, Event::q_overflow)) maskString.append("q_overflow "); if (containsEvent(event, Event::close)) maskString.append("close "); if (containsEvent(event, Event::ignored)) maskString.append("ignored "); if (containsEvent(event, Event::oneshot)) maskString.append("oneshot "); stream << maskString; return stream; }