def plot_pixel_phaseHeights(self,row=None,col=None):

    self.row = row
    self.col = col
    self.laserCalFile = self.parent.wave_obs
    
    dataDict=self.laserCalFile.getTimedPacketList(self.row,self.col,timeSpacingCut=self.parent.params['danicas_cut'])
    peakHeights=np.asarray(dataDict['peakHeights'])*1.0
    ## less than 'min_amp' per second average count rate

    if dataDict['effIntTime']==0.0 or len(peakHeights)<=(dataDict['effIntTime']*self.parent.params['min_count_rate']):
        print 'Not enough data for phase histogram'
        raise ValueError
    baselines=np.asarray(dataDict['baselines'])*1.0
    peakHeights-=baselines
    biggest_photon = int(min(peakHeights))
    n_inbin,phase_bins=np.histogram(peakHeights,bins=np.abs(biggest_photon),range=(biggest_photon,0))
    phase_bins=(phase_bins+(phase_bins[1]-phase_bins[0])/2.0)[:-1]
    self.n_inbin = n_inbin
    self.phase_bins = phase_bins
    try:
        last_ind = np.where(n_inbin>self.parent.params['min_amp'])[0][-1]
    except IndexError:
        last_ind=len(n_inbin)-1
    ## Cut out all the zeros on the right


    self.axes.plot(phase_bins,n_inbin, 'b.',label="data")
    self.axes.set_xlim(phase_bins[(np.where(n_inbin >= 3))[0][0]],phase_bins[last_ind])

    n_inbin = n_inbin[:last_ind]
    phase_bins = phase_bins[:last_ind]

    #Check if this pixel is in drift file
    waveFN = FileName(obsFile=self.laserCalFile)
    driftFile=tables.openFile(waveFN.calDriftInfo(),mode='r')
    drift_row = driftFile.root.params_drift.driftparams.cols.pixelrow[:]    
    drift_col = driftFile.root.params_drift.driftparams.cols.pixelcol[:]    

    args=(np.where(np.multiply(drift_row==self.row, drift_col==self.col)))[0]
    if len(args==1):
        #pixel has a solution!
        fit_params = driftFile.root.params_drift.driftparams.cols.gaussparams[args[0]]
        #print fit_params
        model = driftFile.root.params_drift.driftparams.attrs.model_type
        model_list = {
            'parabola': parabola,
            'gaussian': gaussian,
            'fourgaussian': fourgaussian,
            'threegaussian_exp': threegaussian_exp,
            'threegaussian_exppow': threegaussian_exppow,
            'threegaussian_moyal': threegaussian_moyal,
            'threegaussian_power': threegaussian_power,
            'threegaussian_lorentzian': threegaussian_lorentzian}

        modelArr=model_list[model](p=fit_params,x=phase_bins,return_models=True)
        fullModel=np.zeros(len(n_inbin))
        for model_part in modelArr:
            fullModel = fullModel+model_part
            self.axes.plot(phase_bins,model_part, 'k--')
        self.axes.plot(phase_bins,fullModel, 'r-',label="model")

    self.axes.legend()
    self.axes.set_xlabel("phase")
    self.axes.set_ylabel("counts")
    self.axes.set_title('('+str(self.col)+', '+str(self.row)+') --> '+(self.laserCalFile.beamImage[self.row,self.col]).rsplit('/',1)[0])
    #res_blue = (self.drift.r_blue[self.row,self.col,self.closest_time_ind])
    #self.axes.text(0.15,0.95,"R ~ "+str(round(res_blue,3)),verticalalignment='center', horizontalalignment='center', transform=self.axes.transAxes)
    #print res_blue
    driftFile.close()

    return True
def plot_pixel_soln(self,row,col,list_of_fits):
    #self.fig, axarr = plt.subplots(2, sharex=True)
    #self.axes=axarr[0]
    #axes2=axarr[1]
    self.fig.delaxes(self.axes)
    gs = gridspec.GridSpec(2,1,height_ratios=[4,1])
    self.fig.subplots_adjust(hspace=0.,wspace=0.)
    self.axes=self.fig.add_subplot(gs[0])

    QE_wavelengths = self.parent.QE_data[:,0]
    QE_energies = [self.parent.params['h'] * self.parent.params['c'] / (x*10. * self.parent.params['ang2m']) for x in QE_wavelengths]
    QE_x_offsets = np.asarray(list_of_fits)[:,1]
    
    waveFN = FileName(obsFile=self.parent.wave_obs)
    calFile=tables.openFile(waveFN.calSoln(),mode='r')
    pixRow=calFile.root.wavecal.calsoln.cols.pixelrow[:]
    pixCol=calFile.root.wavecal.calsoln.cols.pixelcol[:]
    cal_ind = np.where((pixRow==row) * (pixCol==col))[0][0]
    polyfit=calFile.root.wavecal.calsoln.cols.polyfit[cal_ind]
    
    if np.all(polyfit==-1) and np.all(QE_x_offsets==0):
        raise ValueError
    
    calFile.close()
    driftFile=tables.openFile(waveFN.calDriftInfo(),mode='r')
    drift_row = driftFile.root.params_drift.driftparams.cols.pixelrow[:]    
    drift_col = driftFile.root.params_drift.driftparams.cols.pixelcol[:]  
    try:  
        drift_ind=(np.where(np.multiply(drift_row==row, drift_col==col)))[0][0]
        fit_params = driftFile.root.params_drift.driftparams.cols.gaussparams[drift_ind]
        cal_x_offsets = fit_params[[1,4,7]]
        cal_x_offsets[1]+=cal_x_offsets[0]
        cal_x_offsets[2]+=cal_x_offsets[1]
        if fit_params[8]==0.:
            cal_x_offsets[2]=0.
        cal_wavelengths = [self.parent.params['bluelambda'],self.parent.params['redlambda'], self.parent.params['irlambda']]     #Angstroms
        cal_energies = [self.parent.params['h'] * self.parent.params['c'] / (x * self.parent.params['ang2m']) for x in cal_wavelengths]             #eV
    except IndexError:
        cal_wavelengths = [self.parent.params['bluelambda'],self.parent.params['redlambda'], self.parent.params['irlambda']]     #Angstroms
        cal_energies = [self.parent.params['h'] * self.parent.params['c'] / (x * self.parent.params['ang2m']) for x in cal_wavelengths]             #eV
        cal_x_offsets = [0,0,0]
    driftFile.close()
    

    
    xArr = np.arange(-5000.,0.,0.1)
    if not np.all(polyfit==-1):
        modelArr=(parabola(p=polyfit,x=xArr,return_models=True))[0]
        self.axes.plot(xArr,modelArr,'k-')
    
    self.axes.plot(cal_x_offsets,cal_energies,'ko', label='Laser Cal')
    
    self.axes.plot(QE_x_offsets,QE_energies,'gx',label='QE wavelength fits')
    

    
    #Do linear fit of QE data to see if x-intercept is at 0
    QE_x_offsets = np.asarray(QE_x_offsets)
    QE_energies = np.asarray(QE_energies)
    energies = (QE_energies[np.where(QE_x_offsets<0)])
    sort_ind = np.argsort(energies)
    energies = energies[sort_ind]
    x_offsets = QE_x_offsets[np.where(QE_x_offsets<0)]
    x_offsets = x_offsets[sort_ind]
    if len(x_offsets)>1:
        parameter_guess = [0.0,(energies[0]-energies[-1])*1.0/(x_offsets[0]-x_offsets[-1]), 0.]
        parameter_lowerlimit=[None,None,0.]
        parameter_upperlimit=[None,None,0.]
        parameter_fit, redchi2gauss2, mpperr = fitData(x_offsets,energies,parameter_guess,parameter_lowerlimit,parameter_upperlimit,model='parabola')
        print 'x_intercept: '+str(-1.*parameter_fit[0]/parameter_fit[1])
    else:
        print 'x_intercept: Not enough data'
    #lin_fit=(parabola(p=parameter_fit,x=xArr,return_models=True))[0]
    #self.axes.plot(xArr,lin_fit,'g--')
    
    #Do parabola fit to QE data
    if len(x_offsets)>1:
        parameter_guess = [0.0,(energies[0]-energies[-1])*1.0/(x_offsets[0]-x_offsets[-1]), 0.]
        parameter_lowerlimit=[None,None,None]
        parameter_upperlimit=[None,None,None]
        parameter_fit, redchi2gauss2, mpperr = fitData(x_offsets,energies,parameter_guess,parameter_lowerlimit,parameter_upperlimit,model='parabola')
        print polyfit,' --> ',parameter_fit
        parab_fit=(parabola(p=parameter_fit,x=xArr,return_models=True))[0]
        self.axes.plot(xArr,parab_fit,'g--')
    
    #Plot Residuals
    if not np.all(polyfit==-1):
        cal_QE=(parabola(p=polyfit,x=x_offsets,return_models=True))[0]
        axes2=self.fig.add_subplot(gs[1],sharex=self.axes)
        #axes2 = self.fig.add_axes((.1,.1,.8,.2))
        axes2.plot(x_offsets,cal_QE-energies,'.')
        axes2.axhline(0,color='black')
    
    
    #Add labels etc
    self.axes.set_ylabel('Energy (eV)')
    self.axes.set_xlim(min(min(cal_x_offsets),min(QE_x_offsets))-200.,0.)
    self.axes.set_ylim(0.,5.)
    if not np.all(polyfit==-1):
        axes2.set_xlabel('Phase (ADC/DAC units)')
        axes2.set_ylabel('Calibration residuals (eV)')
        axes2.set_ylim(-3.,3.)
        #self.axes.set_xticklabels(self.axes.get_xticklabels(),visible=False)
        plt.setp(self.axes.get_xticklabels(),visible=False)