def main3(): import psana ds = psana.DataSource("exp=cxid9114:run=62") events = ds.events() det = psana.Detector('CxiDs2.0:Cspad.0') dark = det.pedestals(62) gain_map = det.gain_mask(62) == 1 plt.imshow(gain_map[0]) plt.show() mask = mask_utils.mask_small_regions(gain_map) mask2 = np.load("details_mask.npy") mask *= mask2 start = 0 for i in range(100): ev = events.next() if ev is None: continue if i < start: continue data = det.calib(ev, cmpars=(5, 0, 0, 0, 0)) #data = det.calib(ev, cmpars=(1,25,25,100,1)) if data is None: continue plt.imshow(gain_map[0]) plt.show() xlow, ylow, xhigh, yhigh, new_data = get_gain_dists( data, gain_map, mask) low_g0, low_g1, fit_low = fit_utils.fit_low_gain_dist(xlow, ylow, plot=1) high_g0, high_g1, fit_high = fit_utils.fit_high_gain_dist(xhigh, yhigh, plot=1) plt.figure() plt.imshow(data[0], vmin=-10, vmax=50, cmap='gnuplot') plt.show()
def correct_panels(data, gain_map, mask, plot=False): xlow, ylow, xhigh, yhigh, new_data = get_gain_dists(data, gain_map, mask) low_g0, low_g1, fit_low = fit_utils.fit_low_gain_dist(xlow, ylow, plot=plot) high_g0, high_g1, fit_high = fit_utils.fit_high_gain_dist(xhigh, yhigh, plot=plot) low_1phot = xlow[low_g1.argmax()] #high_1phot = xhigh[high_g1.argmax()] high_1phot = xhigh[np.argmax(utils.smooth(yhigh, window_size=30)[220:300]) + 220] print "Low gain 1 photon peak: %.4f ADU" % low_1phot print "High gain 1 photon peak: %.4f ADU" % high_1phot gain = high_1phot / low_1phot print "Estimated gain: %.4f" % gain low_0phot_wid = fit_low.params['wid0'] high_0phot_wid = fit_high.params['wid0'] bg_gain = high_0phot_wid / low_0phot_wid print "Estimated dark-current gain: %.4f" % bg_gain cutoff = low_1phot - 1 * fit_low.params['wid1'].value / np.sqrt(2.) print "Estimated low-gain dark-current cutoff ADU: %.4f" % cutoff #cutoff = 1.85 #gain = 6.85 #bg_gain = 1.95 lowgain_photons = np.logical_and(new_data > cutoff, gain_map) new_data[gain_map] = new_data[gain_map] * bg_gain new_data[lowgain_photons] = new_data[lowgain_photons] * gain / bg_gain return new_data
if fix_gain: data32 = np.array([ np.hstack([pan_data[i * 2], pan_data[i * 2 + 1]]) for i in range(32) ]) # undo the nominal low-to-high gain correction data32[loader.gain] /= loader.nominal_gain_val # this is default 6.85 outg = gain_utils.get_gain_dists(data32, loader.gain, loader.cspad_mask, plot=False, norm=True) fit = fit_utils.fit_low_gain_dist(outg[0], outg[1], plot=plot) fitH = fit_utils.fit_high_gain_dist(outg[2], outg[3], plot=plot) bgg = fitH[2].params['wid0'].value / fit[2].params['wid0'].value low2highG = fitH[2].params['mu1'].value / fit[2].params['mu1'].value lowGres = np.sum(fit[2].residual**2) highGres = np.sum(fitH[2].residual**2) all_lowGres.append([lowGres] * Nref) all_highGres.append([highGres] * Nref) all_g.append([low2highG] * Nref) all_bgg.append([bgg] * Nref) data32[loader.gain] = data32[loader.gain] * low2highG phot3_g = fitH[2].params['mu1'].value
get_ipython().magic(u'cd results') get_ipython().magic(u'cd run62') get_ipython().magic(u'ls ') from dxtbx.model.experiment_list import ExperimentListFactory data = [x.as_numpy_array() for x in loader.get_raw_data(54598)] data32 = array([hstack([data[i*2], data[i*2+1]]) for i in range(32)]) data2 = data32.copy() data2[loader.gain] /= loader.nominal_gain_val imshow(data2[0], vmin=-20, vmax=30) figure(1) figure() imshow(data2[0], vmin=-20, vmax=30) figure();imshow(data32[0], vmin=-20, vmax=30) out2 = gain_utils.get_gain_dists(data2, loader.gain, loader.cspad_mask, plot=False, norm=True) fit2 = fit_utils.fit_low_gain_dist(out2[0], out2[1], plot=1) fit2H = fit_utils.fit_high_gain_dist(out2[2], out2[3], plot=1) fit2H fit2H[0] fit2H[1] fit2H[2] fit2H[2].x fit2H[2].param fit2H[2].params fit2H[2].params['mu1'] fit2H[2].params['mu1'].value fit2H[2].params['mu1'].value fit2[2].params['mu1'].value 27.402076353130738 / 4.0863837771690239 data3 = data2.copy() data3[loader.gain] *= 6.70570309774341 figure();imshow(data3[0], vmin=-20, vmax=30)