示例#1
0
/*
 *	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);

}
示例#2
0
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;
}