def genLMS(spectrum, filters, fundamental='neitz', LMSpeaks=[559.0, 530.0, 419.0], remove_filters=True, normalize=True): ''' ''' if len(LMSpeaks) != 3: print 'LMSpeaks must be length 3! Using defaults: 559, 530, 417nm' LMSpeaks = [559.0, 530.0, 421.0] minLam = np.min(spectrum) maxLam = np.max(spectrum) step = spectrum[1] - spectrum[0] if fundamental.lower() == 'stockman': sens = ss.stockmanfund(minLambda=minLam, maxLambda=maxLam, resolution=step) LS = sens[:, 0] MS = sens[:, 1] SS = sens[:, 2] Lresponse = LS * spectrum Mresponse = MS * spectrum Sresponse = SS * spectrum elif fundamental.lower() == 'stockspecsens': sens = ss.stockman(minLambda=minLam, maxLambda=maxLam, resolution=step) LS = sens[:, 0] MS = sens[:, 1] SS = sens[:, 2] Lresponse = LS / filters * spectrum Mresponse = MS / filters * spectrum Sresponse = SS / filters * spectrum elif fundamental.lower() == 'neitz': LS = ss.neitz(LMSpeaks[0], 0.5, False, minLam, maxLam, step) MS = ss.neitz(LMSpeaks[1], 0.5, False, minLam, maxLam, step) SS = ss.neitz(LMSpeaks[2], 0.4, False, minLam, maxLam, step) Lresponse = LS / filters * spectrum Mresponse = MS / filters * spectrum Sresponse = SS / filters * spectrum # normalize to peak at unity Lnorm = Lresponse / np.max(Lresponse) Mnorm = Mresponse / np.max(Mresponse) Snorm = Sresponse / np.max(Sresponse) if remove_filters and normalize: return Lnorm, Mnorm, Snorm if remove_filters and not normalize: return Lresponse, Mresponse, Sresponse if not remove_filters: return LS, MS, SS
def genTetraConvMatrix(self, Xpeak): ''' ''' self.setLights(self.param['stim']) minspec = min(self.spectrum) maxspec = max(self.spectrum) Xsens = ss.neitz(Xpeak, 0.5, False, minspec, maxspec, 1) Xresponse = Xsens / self.filters * self.spectrum Xnorm = Xresponse / np.max(Xresponse) lights = {'l': 600, 'm': 510, 's': 420, 'x': 720} convMatrix = np.array([ [np.interp(lights['l'], self.spectrum, self.Lnorm), np.interp(lights['m'], self.spectrum, self.Lnorm), np.interp(lights['s'], self.spectrum, self.Lnorm), np.interp(lights['x'], self.spectrum, self.Lnorm)], [np.interp(lights['l'], self.spectrum, self.Mnorm), np.interp(lights['m'], self.spectrum, self.Mnorm), np.interp(lights['s'], self.spectrum, self.Mnorm), np.interp(lights['x'], self.spectrum, self.Mnorm)], [np.interp(lights['l'], self.spectrum, self.Snorm), np.interp(lights['m'], self.spectrum, self.Snorm), np.interp(lights['s'], self.spectrum, self.Snorm), np.interp(lights['x'], self.spectrum, self.Snorm)], [np.interp(lights['l'], self.spectrum, Xnorm), np.interp(lights['m'], self.spectrum, Xnorm), np.interp(lights['s'], self.spectrum, Xnorm), np.interp(lights['x'], self.spectrum, Xnorm)]]) return convMatrix
def get_cones(self): ''' ''' L_cones = spect.neitz(LambdaMax=self.cones['L_peak'], OpticalDensity=self.cones['L_OD'], LOG=False, StartWavelength=self.spectrum[0], EndWavelength=self.spectrum[-1], resolution=1, EXTINCTION=False) M_cones = spect.neitz(LambdaMax=self.cones['M_peak'], OpticalDensity=self.cones['M_OD'], LOG=False, StartWavelength=self.spectrum[0], EndWavelength=self.spectrum[-1], resolution=1, EXTINCTION=False) M = M_cones * self.lens self.cones['M'] = M / M.max() L = L_cones * self.lens self.cones['L'] = L / L.max()
def genReceptiveFields(freqs, cone_spacing, peaks=None, wvlen=None): """Create a difference of gaussians receptive field and plot it. :param excite_SD: standard deviation parameter of excitatory gaussian. :param inhibit_SD: standard deviation parameter of inhibitory \ surround gaussian. Default = 5.0. :returns: RF_DOG, RF_SPLINE, FFT_RF """ # traditional RF N = 300 Xvals = np.arange(-15, 15, 10. / (2.0 * N)) RF_DOG = [] FFT_RF = [] RField = [] if peaks is not None and len(peaks) == 2 and wvlen is not None: K_excite = ss.neitz(LambdaMax=peaks[0], OpticalDensity=0.5, LOG=False, StartWavelength=wvlen, EndWavelength=wvlen, resolution=1, EXTINCTION=False) K_inhibit = ss.neitz(LambdaMax=peaks[1], OpticalDensity=0.5, LOG=False, StartWavelength=wvlen, EndWavelength=wvlen, resolution=1, EXTINCTION=False) else: K_excite, K_inhibit = 1, 1 RF_DOG = findSpacing(Xvals, K_excite, K_inhibit, cone_spacing) FFT_RF = Fourier(RF_DOG, N) length = np.floor(FFT_RF.shape[0] / 2.) + 1 RField = interpRField(freqs, Xvals[length:] * 60, FFT_RF[length:]) receptive_field = { 'length': length, 'dog': RF_DOG, 'coneResponse': FFT_RF, 'fft': RField, 'xvals': Xvals, } return receptive_field
def genFirstStage(self, startLambda=390, endLambda=750, step=1, Out='anti-log', OD=None): '''Compute the first stage in the model. ''' if OD is None: OD = [0.4, 0.38, 0.33] lambdas = np.arange(startLambda, endLambda + step, step) L_cones = ss.neitz(LambdaMax=self.maxSens['l'], LOG=False, StartWavelength=startLambda, OpticalDensity=OD[0], EndWavelength=endLambda, resolution=step) L_cones /= self.lensMacula * lambdas / lambdas[-1] M_cones = ss.neitz(LambdaMax=self.maxSens['m'], LOG=False, StartWavelength=startLambda, OpticalDensity=OD[1], EndWavelength=endLambda, resolution=step) M_cones /= self.lensMacula * lambdas / lambdas[-1] S_cones = ss.neitz(LambdaMax=self.maxSens['s'], LOG=False, StartWavelength=startLambda, OpticalDensity=OD[2], EndWavelength=endLambda, resolution=step) S_cones /= self.lensMacula * lambdas / lambdas[-1] self.FirstStage = { 'lambdas': lambdas, 'wavelen': {'startWave': startLambda, 'endWave': endLambda, 'step': step, }, 'L_cones': L_cones, 'M_cones': M_cones, 'S_cones': S_cones, }
def diff_sens(self, curve): ''' ''' # maximum possible fake_cone = spect.neitz( LambdaMax=self.spectrum[self.LED['ind0']], OpticalDensity=0.3, LOG=False, StartWavelength=self.spectrum[0], EndWavelength=self.spectrum[-1], resolution=1, EXTINCTION=False) norm = (np.sum(fake_cone * self.LED['ref']) / np.sum(curve * self.LED['ref'])) return norm
def test_neitz(self): sens = sp.neitz(LambdaMax=559, OpticalDensity=0.5, LOG=False, StartWavelength=390, EndWavelength=770, resolution=1) self.assertTrue(len(sens) == 381) self.assertTrue(round(np.max(sens), 2) == 1.0)