def convert_to_firing_rate(self, calciumtraces):

        firingrate = []
        denoisedcalicumtrace = []
        for ii in xrange(0, np.size(calciumtraces, 1)):
            fluor = calciumtraces[:, ii]
            print 'Deconvolving..', ii

            deconvolvedresult = constrained_foopsi(fluor)
            print np.ndim(deconvolvedresult[5])

            if np.ndim(deconvolvedresult[5]) > 1:
                print 'Skipping..Cell ', ii
                continue
            firingrate.append(deconvolvedresult[5])
            denoisedcalicumtrace.append(deconvolvedresult[0])

        firingrate = np.asarray(np.vstack(firingrate)).T
        denoisedcalicumtrace = np.asarray(np.vstack(denoisedcalicumtrace)).T

        np.savetxt(os.path.join(self.WorkingDirectory, key + "_denoiseddata.csv"), denoisedcalicumtrace, delimiter=",")
        np.savetxt(os.path.join(self.WorkingDirectory, key + "_firingrate.csv"), firingrate, delimiter=",")

        plt.plot(np.clip(firingrate, 0, np.max(firingrate)), '.')
        plt.savefig('/Users/seetha/Desktop/test1.png')
    def convert_to_firing_rate(self):

        rawdatacsv_filenames = [f for f in os.listdir(os.path.join(self.WorkingDirectory, 'RawdataCSV')) if
                                f.endswith('.csv')]

        for ff in rawdatacsv_filenames[2:]:

            print 'Deconvolving File...', ff

            calciumtraces = np.loadtxt(os.path.join(self.WorkingDirectory, 'RawdataCSV', ff), delimiter=",")
            print np.shape(calciumtraces)

            firingrate = []
            denoisedcalicumtrace = []
            cellsused = np.array([])

            for ii in xrange(0, np.size(calciumtraces, 1)):
                fluor = calciumtraces[2:, ii]  # First two rows are fish and plane number

                print 'Deconvolving..', ii
                try:
                    deconvolvedresult = constrained_foopsi(fluor)
                except ZeroDivisionError:
                    print 'Skipping..Cell ', ii
                    continue
                except ValueError:
                    print 'Skipping..Cell ', ii
                    continue

                if np.ndim(deconvolvedresult[5]) > 1:
                    print 'Skipping..Cell ', ii
                    continue

                print np.ndim(deconvolvedresult[5])
                cellsused = np.vstack((cellsused, ii)) if np.size(cellsused) else ii
                firingrate.append(deconvolvedresult[5])
                denoisedcalicumtrace.append(deconvolvedresult[0])

            firingrate = np.asarray(np.vstack(firingrate)).T
            firingrate = np.vstack((calciumtraces[1, cellsused].T, firingrate))
            denoisedcalicumtrace = np.asarray(np.vstack(denoisedcalicumtrace)).T
            denoisedcalicumtrace = np.vstack((calciumtraces[1, cellsused].T, denoisedcalicumtrace))

            np.savetxt(os.path.join(self.WorkingDirectory, 'DeconvolveddataCSV', ff[:-4] + "_denoiseddata.csv"),
                       denoisedcalicumtrace, delimiter=",")
            np.savetxt(os.path.join(self.WorkingDirectory, 'DenoisedDataCSV', ff[:-4] + "_firingrate.csv"), firingrate,
                       delimiter=",")

            plt.plot(np.clip(firingrate[2:, :], 0, np.max(firingrate[2:, :])), '.')
            plt.savefig(os.path.join(WorkingDirectory, 'Images', ff[:-4] + '.png'))
def update_temporal_components(Y,
                               A,
                               b,
                               Cin,
                               fin,
                               ITER=1,
                               method='constrained_foopsi',
                               deconv_method='cvx',
                               g='None',
                               **kwargs):
    #                               b=None,
    #                               c1=None,
    #                               g=None,
    #                               sn=None,
    #                               p=2,
    #                               method='cvx',
    #                               bas_nonneg=True,
    #                               noise_range=[0.25, 0.5],
    #                               noise_method='logmexp',
    #                               lags=5,
    #                               resparse=0,
    #                               fudge_factor=1,
    #                               verbosity=False):
    #    """
    #    update temporal components and background given spatial components
    #    **kwargs: all parameters passed to constrained_foopsi
    #    """

    d, T = np.shape(Y)

    nr = np.shape(A)[-1]
    A = scipy.sparse.hstack((A, coo_matrix(b)))
    Cin = np.vstack((Cin, fin))
    C = Cin
    #%
    nA = np.squeeze(np.array(np.sum(np.square(A.todense()), axis=0)))

    Y = np.matrix(Y)
    C = np.matrix(C)
    Cin = np.matrix(Cin)

    YrA = Y.T * A - Cin.T * (A.T * A)

    for iter in range(ITER):
        idxs = range(nr + 1)
        random.shuffle(idxs)
        P_ = []
        #    perm = randperm(nr+1)
        for jj, ii in enumerate(idxs):
            #ii=jj
            #print ii,jj
            pars = dict(kwargs)
            #        ii = perm(jj);
            if ii < nr:
                if method == 'constrained_foopsi':
                    #print YrA.shape
                    #print YrA.shape
                    YrA[:, ii] = YrA[:, ii] + nA[ii] * Cin[ii, :].T

                    cc, cb, c1, gn, sn, _ = constrained_foopsi(
                        np.squeeze(np.asarray(YrA[:, ii] / nA[ii])),
                        method=deconv_method,
                        **pars)
                    #print pars
                    pars['gn'] = gn

                    gd = np.max(np.roots(np.hstack((1, -gn.T))))
                    # decay time constant for initial concentration
                    gd_vec = gd**range(T)

                    C[ii, :] = cc[:].T + cb + c1 * gd_vec
                    YrA[:, ii] = YrA[:, ii] - np.matrix(nA[ii] * C[ii, :]).T
                    pars['b'] = cb
                    pars['c1'] = c1
                    pars['neuron_sn'] = sn
                    pars['neuron_id'] = ii
                    P_.append(pars)
                else:
                    raise Exception('undefined  method')

            else:
                YrA[:, ii] = YrA[:, ii] + nA[ii] * Cin[ii, :].T
                cc = np.maximum(YrA[:, ii] / nA[ii], 0)
                #C[ii,:] = full(cc');
                YrA[:, ii] = YrA[:, ii] - nA[ii] * C[ii, :].T

            if jj % 10 == 0:
                print str(jj) + ' out of total ' + str(
                    nr + 1) + ' temporal components updated \n'

        #%disp(norm(Fin(1:nr,:) - F,'fro')/norm(F,'fro'));
        if scipy.linalg.norm(Cin - C, 'fro') / scipy.linalg.norm(
                C, 'fro') <= 1e-3:
            # stop if the overall temporal component does not change by much
            break
        else:
            Cin = C

    Y_res = Y - A * C

    f = C[nr:, :]
    C = C[:nr, :]

    P_ = sorted(P_, key=lambda k: k['neuron_id'])

    return C, f, Y_res, P_
def update_temporal_components(Y,A,b,Cin,fin,ITER=1,method='constrained_foopsi',deconv_method = 'cvx', g='None',**kwargs):
#                               b=None, 
#                               c1=None,
#                               g=None,
#                               sn=None, 
#                               p=2, 
#                               method='cvx', 
#                               bas_nonneg=True, 
#                               noise_range=[0.25, 0.5], 
#                               noise_method='logmexp', 
#                               lags=5, 
#                               resparse=0, 
#                               fudge_factor=1, 
#                               verbosity=False):
#    """
#    update temporal components and background given spatial components
#    **kwargs: all parameters passed to constrained_foopsi
#    """


    d,T = np.shape(Y);
    

    nr = np.shape(A)[-1]
    A = scipy.sparse.hstack((A,coo_matrix(b)))
    Cin =  np.vstack((Cin,fin));
    C = Cin;
    #%
    nA = np.squeeze(np.array(np.sum(np.square(A.todense()),axis=0)))
    
    Y=np.matrix(Y)
    C=np.matrix(C)
    Cin=np.matrix(Cin)
    
    YrA = Y.T*A - Cin.T*(A.T*A);


    for iter in range(ITER):
        idxs=range(nr+1)
        random.shuffle(idxs)
        P_=[];
    #    perm = randperm(nr+1)
        for jj,ii in enumerate(idxs):            
            #ii=jj
            #print ii,jj
            pars=dict(kwargs)
    #        ii = perm(jj);
            if ii<nr:                
                if method == 'constrained_foopsi':
                        #print YrA.shape 
                        #print YrA.shape
                        YrA[:,ii] = YrA[:,ii] + nA[ii]*Cin[ii,:].T                  
                        
                        cc,cb,c1,gn,sn,_ = constrained_foopsi(np.squeeze(np.asarray(YrA[:,ii]/nA[ii])), method = deconv_method, **pars)
                        #print pars
                        pars['gn'] = gn
                        
                        gd = np.max(np.roots(np.hstack((1,-gn.T))));  # decay time constant for initial concentration
                        gd_vec = gd**range(T)
                        
                        C[ii,:] = cc[:].T + cb + c1*gd_vec
                        YrA[:,ii] = YrA[:,ii] - np.matrix(nA[ii]*C[ii,:]).T
                        pars['b'] = cb
                        pars['c1'] = c1           
                        pars['neuron_sn'] = sn
                        pars['neuron_id'] = ii
                        P_.append(pars)
                else:
                        raise Exception('undefined  method')                        
                    
                
            else:
                YrA[:,ii] = YrA[:,ii] + nA[ii]*Cin[ii,:].T
                cc = np.maximum(YrA[:,ii]/nA[ii],0)
                #C[ii,:] = full(cc');
                YrA[:,ii] = YrA[:,ii] - nA[ii]*C[ii,:].T
            
            if jj%10 == 0:
                print str(jj) + ' out of total ' + str(nr+1) + ' temporal components updated \n'
    
    
        #%disp(norm(Fin(1:nr,:) - F,'fro')/norm(F,'fro'));
        if scipy.linalg.norm(Cin - C,'fro')/scipy.linalg.norm(C,'fro') <= 1e-3:
            # stop if the overall temporal component does not change by much
            break
        else:
            Cin = C
        
    
    
    Y_res = Y - A*C
    
    f = C[nr:,:]
    C = C[:nr,:]
        
    P_ = sorted(P_, key=lambda k: k['neuron_id']) 
    
    return C,f,Y_res,P_