def saveDetectorCalibration(master_loop,
                            detCalib,
                            config,
                            verbose=False,
                            beta=0):
    # Concatenate the list of all calibration data
    calibValues = np.concatenate(master_loop.calibValues, axis=0)
    print 'calibValues', calibValues
    # Check the data that is not NAN
    #I = np.isfinite(calibValues.sum(axis=1))
    #print 'mask', I
    ## average the finite values
    #average = calibValues[I,:].mean(axis=0)
    average = np.array([
        np.nan if np.all(np.isnan(det)) else det[np.isfinite(det)].mean()
        for det in calibValues.T
    ])
    print 'average', average
    #factors = average[config.boolFitMask].max()/average
    params = cookie_box.initial_params()
    params['A'].value = 1
    params['beta'].value = beta
    params['tilt'].value = 0
    params['linear'].value = 1
    phi = np.linspace(0, 2 * np.pi, 16, endpoint=False)
    factors = cookie_box.model_function(params, phi) / average
    factors /= factors[np.isfinite(factors)].max()
    factors[~config.boolFitMask] = np.nan

    if verbose:
        print len(calibValues)
        print master_loop.calibValues[0].shape
        print calibValues.shape
        print average
        print 'Calibration factors:', factors

    calibFile = (
        detCalib.path + '/' + detCalib.name +
        '{}.txt'.format(detCalib.fileNumber +
                        1 if np.isfinite(detCalib.fileNumber) else ''))

    np.savetxt(calibFile, factors)
def saveDetectorCalibration(master_loop, detCalib, config, verbose=False, beta=0):
    # Concatenate the list of all calibration data
    calibValues = np.concatenate(master_loop.calibValues, axis=0)
    print 'calibValues', calibValues
    # Check the data that is not NAN
    #I = np.isfinite(calibValues.sum(axis=1))
    #print 'mask', I
    ## average the finite values
    #average = calibValues[I,:].mean(axis=0)
    average = np.array([np.nan if np.all(np.isnan(det)) else
                        det[np.isfinite(det)].mean()
                        for det in calibValues.T])
    print 'average', average
    #factors = average[config.boolFitMask].max()/average
    params = cookie_box.initial_params()
    params['A'].value = 1
    params['beta'].value = beta
    params['tilt'].value = 0
    params['linear'].value = 1
    phi = np.linspace(0, 2*np.pi, 16, endpoint=False)
    factors = cookie_box.model_function(params, phi) / average
    factors /= factors[np.isfinite(factors)].max()
    factors[~config.boolFitMask] = np.nan
    
    if verbose:
        print len(calibValues)
        print master_loop.calibValues[0].shape
        print calibValues.shape
        print average
        print 'Calibration factors:', factors

    calibFile = (detCalib.path + '/' + detCalib.name +
                    '{}.txt'.format( detCalib.fileNumber+1 if
                    np.isfinite(detCalib.fileNumber) else '' ) )

    np.savetxt(calibFile, factors)
ax.set_xlim(220, 245)
plt.tight_layout()

# %%
try:
    angular_plot = plt.figure('Angular')
    angular_plot.clf()
except:
    pass

angular_plot, angular_axis_array = plt.subplots(1, 2,
                                                subplot_kw={'polar': True},
                                                num='Angular')
phi = cookie_box.phi_rad
phi_line = np.linspace(0, 2*np.pi, 2**8)
norm_params = cookie_box.initial_params()
norm_params['A'].value = 1
norm_params['beta'].value = 2
norm_params['beta'].vary = False
norm_params['tilt'].value = 0
norm_params['tilt'].vary = False
norm_params['linear'].value = 1
norm_params['linear'].vary = False

lmfit.minimize(cookie_box.model_function, norm_params,
               args=(phi,
                     photo_signals_average_corrected[285] *
                     auger_factors[285]))
beta2_factors = (cookie_box.model_function(norm_params, phi) /
                 (photo_signals_average_corrected[285] * auger_factors[285]))
def get_event_data(config, scales, detCalib, cb, args, epics, verbose=False):
    if verbose:
        print 'Rank {} grabbing data.'.format(rank)

    data = np.zeros(dSize, dtype=float)
    
    # Get the time amplitudes
    time_amplitudes = cb.get_time_amplitudes_filtered()
    # If there is a None in the data, some axqiris trace is missing
    if None in time_amplitudes:
        # Don't try to pull any more data from this event
        print 'Rank {} detected None in time amplitude.'.format(rank)
        return None

    # This construction can handle traces of different length
    data[dTraces] = np.nan
    length = (dTraces.stop - dTraces.start) / 16
    #print 'length =', length
    #print data.shape, dTraces.start, dTraces.stop
    start = dTraces.start
    for t_sig in time_amplitudes:
        if t_sig is None:
            return None
        #print len(t_sig)
        #print start, start+len(t_sig)
        #print data.shape, data[dTraces].shape
        data[start : start + len(t_sig)] = t_sig
        start += length

    # Get the intensities
    # Roi 0 base information (photoline)
    data[dIntRoi0] = np.array([np.sum(trace) for trace
                               in cb.get_time_amplitudes_filtered(roi=0)])
    # Use roi 2 for backgorud subtraction, could be commented out to not do
    # subtraction...
    data[dIntRoi0] -= (np.array([np.sum(trace) for trace
                                 in cb.get_time_amplitudes_filtered(roi=2)]) *
                       scales.tRoi0BgFactors)
    # Rescale the data for roi 0
    data[dIntRoi0] *= config.nanFitMask * detCalib.factors

    # Get roi 1 imformation (auger line)
    data[dIntRoi1] = (np.array([np.sum(trace) for trace in
                                cb.get_time_amplitudes_filtered(roi=1)]) *
                      detCalib.factors * config.nanFitMask)
        
    # Get the initial fit parameters
    #params = cookie_box.initial_params(evt_data.intRoi0[-1])
    params = cookie_box.initial_params()
    params['A'].value, params['linear'].value, params['tilt'].value = \
            cb.proj.solve(data[dIntRoi0], args.beta)
    # Lock the beta parameter
    params['beta'].value = args.beta
    params['beta'].vary = False

    #print params['A'].value, params['linear'].value, params['tilt'].value
    
    # Perform the fit
    #print scales.angles[config.boolFitMask]
    #print evt_data.intRoi0[-1][config.boolFitMask]
    res = lmfit.minimize(
            cookie_box.model_function,
            params,
            args=(scales.angles[config.boolFitMask],
                data[dIntRoi0][config.boolFitMask]),
            method='leastsq')

    #print params['A'].value, params['linear'].value, params['tilt'].value
    
    #lmfit.report_fit(params)

    # Store the values
    data[dPol] = np.array([params['A'].value, params['A'].stderr,
                           params['beta'].value, params['beta'].stderr,
                           params['tilt'].value, params['tilt'].stderr,
                           params['linear'].value, params['linear'].stderr])
    
    # Get the energy traces
    data[d_energy_trace] = np.mean([trace for trace, test in
        zip(cb.get_energy_amplitudes(), config.energy_spectrum_mask)
        if test], axis=0)

    # Get the photon energy center and width
    if args.photonEnergy != 'no':
        data[dEnergy] = cb.getPhotonEnergy(energyShift=args.energyShift)

    # Get lcls parameters
    data[dEL3] = lcls.getEBeamEnergyL3_MeV()
    data[dFEE] = lcls.getPulseEnergy_mJ()
                        
    # timing information
    data[dFiducials] = lcls.getEventFiducial()
    data[dTime] = lcls.getEventTime()

    data[dDeltaK] = epics.value('USEG:UND1:3350:KACT')
    data[dDeltaEnc] = np.array(
        [epics.value('USEG:UND1:3350:{}:ENC'.format(i)) for i in range(1,5)])

    return data
plt.tight_layout()

# %%
try:
    angular_plot = plt.figure('Angular')
    angular_plot.clf()
except:
    pass

angular_plot, angular_axis_array = plt.subplots(1,
                                                2,
                                                subplot_kw={'polar': True},
                                                num='Angular')
phi = cookie_box.phi_rad
phi_line = np.linspace(0, 2 * np.pi, 2**8)
norm_params = cookie_box.initial_params()
norm_params['A'].value = 1
norm_params['beta'].value = 2
norm_params['beta'].vary = False
norm_params['tilt'].value = 0
norm_params['tilt'].vary = False
norm_params['linear'].value = 1
norm_params['linear'].vary = False

lmfit.minimize(cookie_box.model_function,
               norm_params,
               args=(phi, photo_signals_average_corrected[285]))
beta2_factors = (cookie_box.model_function(norm_params, phi) /
                 photo_signals_average_corrected[285])

I_fit = np.ones(16, dtype=bool)
def get_event_data(config, scales, detCalib, cb, args, epics, verbose=False):
    if verbose:
        print 'Rank {} grabbing data.'.format(rank)

    data = np.zeros(dSize, dtype=float)

    # Get the time amplitudes
    time_amplitudes = cb.get_time_amplitudes_filtered()
    # If there is a None in the data, some axqiris trace is missing
    if None in time_amplitudes:
        # Don't try to pull any more data from this event
        print 'Rank {} detected None in time amplitude.'.format(rank)
        return None

    # This construction can handle traces of different length
    data[dTraces] = np.nan
    length = (dTraces.stop - dTraces.start) / 16
    #print 'length =', length
    #print data.shape, dTraces.start, dTraces.stop
    start = dTraces.start
    for t_sig in time_amplitudes:
        if t_sig is None:
            return None
        #print len(t_sig)
        #print start, start+len(t_sig)
        #print data.shape, data[dTraces].shape
        data[start:start + len(t_sig)] = t_sig
        start += length

    # Get the intensities
    # Roi 0 base information (photoline)
    data[dIntRoi0] = np.array(
        [np.sum(trace) for trace in cb.get_time_amplitudes_filtered(roi=0)])
    # Use roi 2 for backgorud subtraction, could be commented out to not do
    # subtraction...
    data[dIntRoi0] -= (np.array(
        [np.sum(trace) for trace in cb.get_time_amplitudes_filtered(roi=2)]) *
                       scales.tRoi0BgFactors)
    # Rescale the data for roi 0
    data[dIntRoi0] *= config.nanFitMask * detCalib.factors

    # Get roi 1 imformation (auger line)
    data[dIntRoi1] = (np.array(
        [np.sum(trace) for trace in cb.get_time_amplitudes_filtered(roi=1)]) *
                      detCalib.factors * config.nanFitMask)

    # Get the initial fit parameters
    #params = cookie_box.initial_params(evt_data.intRoi0[-1])
    params = cookie_box.initial_params()
    params['A'].value, params['linear'].value, params['tilt'].value = \
            cb.proj.solve(data[dIntRoi0], args.beta)
    # Lock the beta parameter
    params['beta'].value = args.beta
    params['beta'].vary = False

    #print params['A'].value, params['linear'].value, params['tilt'].value

    # Perform the fit
    #print scales.angles[config.boolFitMask]
    #print evt_data.intRoi0[-1][config.boolFitMask]
    res = lmfit.minimize(cookie_box.model_function,
                         params,
                         args=(scales.angles[config.boolFitMask],
                               data[dIntRoi0][config.boolFitMask]),
                         method='leastsq')

    #print params['A'].value, params['linear'].value, params['tilt'].value

    #lmfit.report_fit(params)

    # Store the values
    data[dPol] = np.array([
        params['A'].value, params['A'].stderr, params['beta'].value,
        params['beta'].stderr, params['tilt'].value, params['tilt'].stderr,
        params['linear'].value, params['linear'].stderr
    ])

    # Get the energy traces
    data[d_energy_trace] = np.mean([
        trace for trace, test in zip(cb.get_energy_amplitudes(),
                                     config.energy_spectrum_mask) if test
    ],
                                   axis=0)

    # Get the photon energy center and width
    if args.photonEnergy != 'no':
        data[dEnergy] = cb.getPhotonEnergy(energyShift=args.energyShift)

    # Get lcls parameters
    data[dEL3] = lcls.getEBeamEnergyL3_MeV()
    data[dFEE] = lcls.getPulseEnergy_mJ()

    # timing information
    data[dFiducials] = lcls.getEventFiducial()
    data[dTime] = lcls.getEventTime()

    data[dDeltaK] = epics.value('USEG:UND1:3350:KACT')
    data[dDeltaEnc] = np.array(
        [epics.value('USEG:UND1:3350:{}:ENC'.format(i)) for i in range(1, 5)])

    return data
示例#7
0
    def updatePlot(figs):
        socket.recv()
        data = socket.recv_pyobj(zmq.NOBLOCK)
        # we've got data, see if it is the most recent
        while 1:
            try:
                socket.recv(zmq.NOBLOCK)
                data = socket.recv_pyobj()
                # if we get here with no exception there was
                # more data
                print '*** throw away data'
                continue
            except zmq.error.Again:
                print '*** got last data'
                break
        if verbose: 
            print 'Data contains:'
            for k, v in data.iteritems():
                print '\n\t{} of type {}'.format(k, type(v)),
                if isinstance(v, dict):
                    print 'with components:'
                    for k2, v2 in v.iteritems():
                        print '\t\t{} of type {}'.format(k2, type(v2)),

                        if isinstance(v2, list):
                            print 'of length {}.'.format(len(v2))
                            print '\t\t\tlengths = (',
                            for elem in v2:
                                try:
                                    print '{},'.format(len(elem)),
                                except:
                                    pass
                            print ')'

                        elif isinstance(v2, np.ndarray):
                            print 'of shape {}.'.format(v2.shape)
                        
                        else:
                            print ''
                else:
                    print ''


            #try:
            #    print 'polar:roi0 =', data['polar']['roi0']
            #    print 'polar:roi1 =', data['polar']['roi1']
            #except:
            #    pass

            #try:
            #    print 'err_degree = ', data['strip'][1][:,7]
            #except:
            #    pass

        plotKey = 'polar'
        if plotKey in data.keys():
            d = data[plotKey]
            ax = figs[1].axes[0]
            lines = ax.lines
            for l, roi in enumerate(['roi0', 'roi1']):
                if roi in d.keys():
                    try:
                        lines[l].set_ydata(d[roi]/d[roi][ np.isfinite(d[roi])
                            ].max())
                    except:
                        print 'Data error'

                    
            # The fit in figure 2
            params = cookie_box.initial_params()
            for k in params:
                params[k].value = d[k]
            try:
                params['A'].value /= d['roi0'][ np.isfinite(d['roi0']) ].max()
            except:
                params['A'].value = 0
            
            lines[2].set_ydata(cookie_box.model_function(params, angle))
            
            if args.beta != None:
                params['beta'].value = args.beta
                params['linear'].value = 1.0
                params['tilt'].value = 0
                y = cookie_box.model_function(params, angle)
                lines[3].set_ydata(y/y.max())
            
            ax.relim()
            ax.autoscale_view()
            figs[1].canvas.draw()



        plotKey = 'strip'
        if plotKey in data.keys():
            ax = figs[2].axes[0]
            ax.cla()
            ax.set_title('Degree of linear polarization.')

            storage['fiducial'].extend( data[plotKey][0] )
            storage['degree'].extend( data[plotKey][1][:,6] )
            storage['err_degree'].extend( data[plotKey][1][:,7] )
            storage['tilt'].extend( data[plotKey][1][:,4] )
            storage['err_tilt'].extend( data[plotKey][1][:,5] )
            #storage['intFull'].extend(data[plotKey][2])
            storage['intRoi0'].extend(data[plotKey][2])
            #storage['intRoi1'].extend(data[plotKey][4])



            #ax.plot(storage['fiducial'], storage['degree'],'.')
            #plt.sca(ax)
            if args.errors:
                ax.errorbar(np.array(storage['fiducial']),
                            np.array(storage['degree']),
                            np.array(storage['err_degree']),
                            linestyle='', marker='.', capsize=0)
            else:
                ax.plot(np.array(storage['fiducial']), 
                        np.array(storage['degree']),
                        linestyle='', marker='.')

            if args.a:
                ax.relim()
                ax.autoscale_view()
            else:
                ax.set_ylim(-0.4, 1.4)
            #ax.plot(data[plotKey][0], data[plotKey][1][:,6], '.b')
            #ax.errorbar(data[plotKey][0], data[plotKey][1][:,6],
            #        data[plotKey][1][:,7], ls='None', color='b')
            #ax.relim()
            #ax.autoscale_view()
            #ax.ylim


            ax = figs[2].axes[1]
            ax.cla()
            ax.set_title('Polarization tilt')
            if args.errors:
                ax.errorbar(np.array(storage['fiducial']),
                            np.array(storage['tilt']),
                            np.array(storage['err_tilt']),
                            linestyle='', marker='.', capsize=0)
            else:
                ax.plot(np.array(storage['fiducial']),
                        np.array(storage['tilt'])*180/np.pi,
                        linestyle='', marker='.')

            if args.a:
                ax.relim()
                ax.autoscale_view()
            else:
                ax.set_ylim(-90, 90)
            #ax.errorbar(data[plotKey][0], data[plotKey][1][:,4],
            #        data[plotKey][1][:,5], ls='None', color='b')

            ax = figs[2].axes[2]
            ax.cla()
            ax.set_title('Photoline intensity')
            ax.plot(np.array(storage['fiducial']),
                    np.array(storage['intRoi0']),
                    '.')
            ax.relim()
            ax.autoscale_view()
            min_value, _ = ax.get_ylim()
            ax.set_ylim(bottom=np.minimum(min_value, 0))


            figs[2].canvas.draw()


        plotKey = 'traces'
        if plotKey in data.keys():
            plot = data[plotKey]
            for i, ax in enumerate(figs[0].axes):
                lines = ax.lines
                
                if 'timeScale' in plot.keys():
                    lines[raw].set_xdata(data[plotKey]['timeScale'][i])
                    lines[filt].set_xdata(data[plotKey]['timeScale'][i])
                if 'timeScaleRoi0' in plot.keys():
                    lines[roi0].set_xdata(data[plotKey]['timeScaleRoi0'][i])
                if 'timeScaleRoi1' in plot.keys():
                    lines[roi1].set_xdata(data[plotKey]['timeScaleRoi1'][i])

                if 'timeRaw' in plot.keys():
                    lines[raw].set_ydata(plot['timeRaw'][i])
                if 'timeFiltered' in plot.keys():
                    lines[filt].set_ydata(plot['timeFiltered'][i])
                if 'timeRoi0' in plot.keys():
                    lines[roi0].set_ydata(plot['timeRoi0'][i])
                if 'timeRoi1' in plot.keys():
                    lines[roi1].set_ydata(plot['timeRoi1'][i])

                ax.relim()
                ax.autoscale_view()

            figs[0].canvas.draw()


        plotKey = 'spectrum'
        if plotKey in data.keys():
            plotData = data[plotKey]
            ax = figs[3].axes[0]
            
            l = ax.lines[0]
            l.set_xdata(plotData['energyScale'])
            l.set_ydata(plotData['energyAmplitude'])

            l = ax.lines[1]
            l.set_xdata(plotData['energyScaleRoi0'])
            l.set_ydata(plotData['energyAmplitudeRoi0'])

            ax.relim()
            ax.autoscale_view()

            ax.figure.canvas.draw()