def bayes_fitting(self):
     self = pickle.load(
         open(
             "/%s/%s_self_para_eval.p" %
             (self.output_directory, self.output_prefix), 'rb'))
     logging.info('Modeling the mean and variance ...')
     if self.genes_varmodeling > 0:
         self.mrm = MeanVarModel()
         #self.mrm.model_mean_disp_by_lm(self.allgenedict)
         self.mrm.model_mean_disp_by_glm(self.allgenedict,
                                         self.output_prefix, self.size_f)
     else:
         mrm = None
     pickle.dump(
         self,
         open(
             "/%s/%s_self_fitting.p" %
             (self.output_directory, self.output_prefix), 'wb'))
 def bayes_fitting(self):
     self=pickle.load(open("/%s/%s_self_para_eval.p" %(self.output_directory,self.output_prefix),'rb'))
     logging.info('Modeling the mean and variance ...')
     if self.genes_varmodeling>0:
         self.mrm=MeanVarModel()
         #self.mrm.model_mean_disp_by_lm(self.allgenedict)
         self.mrm.model_mean_disp_by_glm(self.allgenedict,self.output_prefix,self.size_f)
     else:
         mrm=None
     pickle.dump(self,open("/%s/%s_self_fitting.p" %(self.output_directory,self.output_prefix),'wb'))
class Mageck_Bayes():
    def __init__(self, options):
        self.adjust_method = options.adjust_method
        self.beta_labels = options.beta_labels
        self.count_table = options.count_table
        self.design_matrix = options.design_matrix
        self.genes_varmodeling = options.genes_varmodeling
        self.include_samples = options.include_samples
        self.output_prefix = options.output_prefix
        self.file_directory = os.getcwd()
        self.output_directory = "%s/%s" % (os.getcwd(), self.output_prefix)
        if os.path.exists(self.output_directory) == False:
            os.makedirs(self.output_directory)
        self.permutation_round = options.permutation_round
        self.outliers_removal = options.outliers_removal
        self.PPI_prior = options.PPI_prior
        self.PPI_weighting = options.PPI_weighting
        self.PPI_diagnosis = None
        self.non_PPI_beta_prior_variance = None
        self.allgenedict = None
        self.size_f = None
        self.mrm = None
        self.log_list = defaultdict(list)
        self.selection_constant = None
        self.invalid_gRNA_dict = None
        self.negative_control = options.negative_control
        self.negative_control_gRNAs = None
        self.norm_method = options.norm_method

    def bayes_init(self):
        maxgene = np.inf
        if self.negative_control == None:
            self.allgenedict, self.invalid_gRNA_dict = read_gene_from_file(
                self.count_table,
                includesamples=self.include_samples,
                negative_control=self.negative_control)
        else:
            self.allgenedict, self.invalid_gRNA_dict, self.negative_control_gRNAs = read_gene_from_file(
                self.count_table,
                includesamples=self.include_samples,
                negative_control=self.negative_control)

        # calculate the size factor
        cttab_sel = {}
        for (geneid, gk) in self.allgenedict.iteritems():
            sgid = gk.sgrnaid
            sgreadmat = gk.nb_count.getT().tolist()
            for i in range(len(sgid)):
                cttab_sel[sgid[i]] = sgreadmat[i]
        if hasattr(self, 'norm_method'):
            if self.norm_method != 'none':
                self.size_f = normalizeCounts(
                    cttab_sel,
                    method=self.norm_method,
                    returnfactor=True,
                    reversefactor=True,
                    negative_control_gRNAs=self.negative_control_gRNAs)
            else:
                self.size_f = None
        else:
            self.size_f = normalizeCounts(cttab_sel,
                                          returnfactor=True,
                                          reversefactor=True)
        logging.info('size factor: ' + ','.join([str(x) for x in self.size_f]))
        #logging.info(self.design_matrix)
        desmat = self.design_matrix
        for (tgid, tginst) in self.allgenedict.iteritems():
            #if tgid=="INO80B":
            tginst.design_mat = desmat
            iteratenbem(tginst,
                        debug=False,
                        estimateeff=False,
                        alpha_val=0.05,
                        size_factor=self.size_f)
            tginst.w_estimate = []
        deviation(self.allgenedict)

        self.non_PPI_beta_prior_variance = beta_non_PPI_prior_calculation(
            self.allgenedict)
        pickle.dump(
            self,
            open(
                "/%s/%s_self_bayes_init.p" %
                (self.output_directory, self.output_prefix), 'wb'))

    def parameter_reevalution(self):
        self = pickle.load(
            open(
                "/%s/%s_self_bayes_init.p" %
                (self.output_directory, self.output_prefix), 'rb'))

        logging.info('Reestimate dispersion ...')
        ngenes = 0
        for (tgid, tginst) in self.allgenedict.iteritems():
            if ngenes < 3000:
                try:
                    #logging.info(tgid)
                    sgrna_wide_dispersion_estimation_MAP_v2(
                        tginst, self.design_matrix)
                    ngenes += 1
                except:
                    pass
        pickle.dump(
            self,
            open(
                "/%s/%s_self_para_eval.p" %
                (self.output_directory, self.output_prefix), 'wb'))

    def bayes_fitting(self):
        self = pickle.load(
            open(
                "/%s/%s_self_para_eval.p" %
                (self.output_directory, self.output_prefix), 'rb'))
        logging.info('Modeling the mean and variance ...')
        if self.genes_varmodeling > 0:
            self.mrm = MeanVarModel()
            #self.mrm.model_mean_disp_by_lm(self.allgenedict)
            self.mrm.model_mean_disp_by_glm(self.allgenedict,
                                            self.output_prefix, self.size_f)
        else:
            mrm = None
        pickle.dump(
            self,
            open(
                "/%s/%s_self_fitting.p" %
                (self.output_directory, self.output_prefix), 'wb'))

    def bayes_major(self):
        self = pickle.load(
            open(
                "/%s/%s_self_fitting.p" %
                (self.output_directory, self.output_prefix), 'rb'))
        logging.info('Run the algorithm for the second time ...')
        ngene = 0
        for (tgid, tginst) in self.allgenedict.iteritems():
            #logging.info(tgid)
            iteratenbem(tginst,
                        debug=False,
                        meanvarmodel=self.mrm,
                        restart=False,
                        size_factor=self.size_f,
                        beta1_prior_var=self.non_PPI_beta_prior_variance)
            ngene += 1

        for (tgid, tginst) in self.allgenedict.iteritems():
            if len(tginst.w_estimate) == 0:
                tginst.w_estimate = np.ones(len(tginst.sgrnaid))

        pickle.dump(
            self,
            open(
                "/%s/%s_self_bayes_major.p" %
                (self.output_directory, self.output_prefix), 'wb'))

    def constant_optimization(self):
        # PPI
        self = pickle.load(
            open(
                "/%s/%s_self_bayes_major.p" %
                (self.output_directory, self.output_prefix), 'rb'))
        logging.info('PPI validation...')
        PPI_main(self)
        if self.PPI_diagnosis == True:
            beta_prior_output(self)
        '''
        copy_self=copy.copy(self)
        copy_self.count_table="singlized_{}".format(self.count_table)
        copy_self.output_prefix="{}_mageck_bayes".format(copy_self.count_table)
        copy_self.output_directory="{}/{}".format(os.getcwd(),copy_self.output_prefix)
        if os.path.exists(copy_self.output_directory)==False:
            os.makedirs(copy_self.output_directory)
        if not os.path.isfile("/%s/self_pre_dispersion_fitting_round.p" %copy_self.output_directory):
            os.chdir(self.file_directory)
            sgRNA_production(self.count_table)
            copy_self.allgenedict,copy_self.invalid_gRNA_dict=read_gene_from_file(copy_self.count_table,includesamples=copy_self.include_samples)
            for (tgid,tginst) in copy_self.allgenedict.items():
                tginst.design_mat=copy_self.design_matrix
                iteratenbem(tginst,debug=False,meanvarmodel=self.mrm,restart=False,removeoutliers=self.outliers_removal,size_factor=self.size_f,beta1_prior_var=self.non_PPI_beta_prior_variance)
            pickle.dump(copy_self,open("/%s/self_pre_dispersion_fitting_round.p" %copy_self.output_directory,'wb'))
        else:
            copy_self=pickle.load(open("/%s/self_pre_dispersion_fitting_round.p" %copy_self.output_directory,'rb'))
        logging.info("signlized_sgRNA processed!")
        sgRNA_beta=background(copy_self)
        beta1=list(sgRNA_beta.values())
        median=np.median(beta1)
        abs_beta1=[abs(i-median) for i in beta1]
        abs_beta1.sort()
        std_beta1=float(np.percentile(abs_beta1,95))/norm.ppf(0.975)
        for geneid in list(self.allgenedict.keys()):
            sgrnaid=self.allgenedict[geneid].sgrnaid
            temp=[]
            for sgRNA in sgrnaid:
                temp.append(np.log(norm.pdf(sgRNA_beta[sgRNA],median,std_beta1)))
            self.allgenedict[geneid].sgrna_probability=temp
        '''
        logging.info('Estimate selection constant...')
        bayes_selection_constnat_optimization(self)
        pickle.dump(
            self,
            open(
                "/%s/%s_self_constant_optimization.p" %
                (self.output_directory, self.output_prefix), 'wb'))

    def bayes_iteration(self):
        logging.info('Iteratioin...')
        PPI_choice = [False, True]

        for PPI in PPI_choice:
            self = pickle.load(
                open(
                    "/%s/%s_self_constant_optimization.p" %
                    (self.output_directory, self.output_prefix), 'rb'))
            self.PPI_prior = PPI
            if self.PPI_diagnosis == False and self.PPI_prior == True:
                pass
            else:
                self.outliers_removal = False
                for (tgid, tginst) in self.allgenedict.iteritems():
                    iteratenbem(
                        tginst,
                        debug=False,
                        meanvarmodel=self.mrm,
                        restart=False,
                        PPI_prior=self.PPI_prior,
                        removeoutliers=self.outliers_removal,
                        size_factor=self.size_f,
                        beta1_prior_var=self.non_PPI_beta_prior_variance)
                pickle.dump(
                    self,
                    open(
                        "/%s/%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p"
                        % (self.output_directory, self.output_prefix,
                           self.PPI_prior, self.outliers_removal), 'wb'))

                #base_index=np.where(~self.design_matrix[:,1:].any(axis=1))[0]
                #transform_list=[1 if i in base_index else -1 for i in range(self.design_matrix.shape[0])]
                #transform_matrix=np.matrix(transform_list)

                for (tgid, tginst) in self.allgenedict.items():
                    bayes_selection(tginst,
                                    log_list=self.log_list,
                                    selection_constant=self.selection_constant)
                self.outliers_removal = True
                for (tgid, tginst) in self.allgenedict.iteritems():
                    iteratenbem(
                        tginst,
                        debug=False,
                        meanvarmodel=self.mrm,
                        restart=False,
                        PPI_prior=self.PPI_prior,
                        removeoutliers=self.outliers_removal,
                        size_factor=self.size_f,
                        beta1_prior_var=self.non_PPI_beta_prior_variance)
                pickle.dump(
                    self,
                    open(
                        "/%s/%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p"
                        % (self.output_directory, self.output_prefix,
                           self.PPI_prior, self.outliers_removal), 'wb'))

    def bayes_output(self):
        os.chdir(self.output_directory)
        for mark in [[True, False], [True, True], [False, False],
                     [False, True], ["major", "major"]]:
            if mark != ["major", "major"]:
                file = "%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p" % (
                    self.output_prefix, mark[0], mark[1])
            else:
                file = "%s_self_bayes_major.p" % self.output_prefix
            if file in glob.glob("*"):
                self = pickle.load(open(file, 'rb'))
                # permutation
                iteratenbem_permutation(
                    self.allgenedict,
                    nround=self.permutation_round,
                    meanvarmodel=self.mrm,
                    size_factor=self.size_f,
                    beta1_prior_var=self.non_PPI_beta_prior_variance)
                # correct for FDR
                gene_fdr_correction(self.allgenedict, self.adjust_method)

                genefile = self.output_prefix + '_PPI_' + str(
                    mark[0]) + '_outliers_removal_' + str(
                        mark[1]) + '.gene_summary.txt'
                sgrnafile = self.output_prefix + '_PPI_' + str(
                    mark[0]) + '_outliers_removal_' + str(
                        mark[1]) + '.sgrna_summary.txt'
                logging.info(genefile)
                logging.info(sgrnafile)

                logging.info('Writing gene results to ' + genefile)
                logging.info('Writing sgRNA results to ' + sgrnafile)
                write_gene_to_file(self.allgenedict,
                                   genefile,
                                   betalabels=self.beta_labels)
                write_sgrna_to_file(self.allgenedict, sgrnafile)
                plot(genefile)

    def bayes_output_no_permutation(self):
        os.chdir(self.output_directory)
        marks = [['True', 'False'], ['True', 'True'], ['False', 'False'],
                 ['False', 'True'], ["major", "major"]]
        #marks=[["major","major"]]
        deviation_output = open("%s_mu_k_deviation.txt" % self.output_prefix,
                                'wb')
        deviation_insert = [
            "PPI", "outliers_removal", "central_80_percent_mean", "median"
        ]
        deviation_output.write("%s\n" % "\t".join(deviation_insert))

        PPI_diagnosis_output = open(
            "%s_mu_k_PPI_diagnosis.txt" % self.output_prefix, 'wb')
        PPI_diagnosis_insert = [""]
        PPI_diagnosis_output.write("%s\n" % "\t".join(PPI_diagnosis_insert))
        '''
        os.chdir("%s/doc/" %self.output_directory)
        DE_file=open("%s_DE.txt" %self.count_table)
        DE_file.readline()
        DE_dict=dict()
        for line in DE_file:
            elements=line.strip().split("\t")
            DE_dict[elements[0].upper()]=elements[4]
        '''
        os.chdir(self.output_directory)
        for mark in marks:
            if mark != ["major", "major"]:
                file = "%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p" % (
                    self.output_prefix, mark[0], mark[1])
            else:
                file = "%s_self_bayes_major.p" % self.output_prefix
            if file in glob.glob("*"):
                self = pickle.load(open(file, 'rb'))
                # correct for FDR

                gene_fdr_correction(self.allgenedict,
                                    self.adjust_method,
                                    wald_only=True)

                genefile = self.output_prefix + '_PPI_' + str(
                    mark[0]) + '_outliers_removal_' + str(
                        mark[1]) + '.gene_summary.txt'
                sgrnafile = self.output_prefix + '_PPI_' + str(
                    mark[0]) + '_outliers_removal_' + str(
                        mark[1]) + '.sgrna_summary.txt'

                logging.info('Writing gene results to ' + genefile)
                logging.info('Writing sgRNA results to ' + sgrnafile)
                write_gene_to_file(self.allgenedict,
                                   genefile,
                                   betalabels=self.beta_labels,
                                   wald_only=True)
                #write_sgrna_to_file(self.include_samples,self.allgenedict,self.invalid_gRNA_dict,sgrnafile,DE_dict)
                write_sgrna_to_file(self.include_samples, self.allgenedict,
                                    self.invalid_gRNA_dict, sgrnafile)
                plot(genefile,
                     negative_control_gRNAs=self.negative_control_gRNAs,
                     wald_only=True)

                deviation_insert = mark + deviation(self.allgenedict)
                deviation_output.write("%s\n" % "\t".join(deviation_insert))
class Mageck_Bayes():
    def __init__(self, options):
        self.adjust_method=options.adjust_method
        self.beta_labels=options.beta_labels
        self.count_table=options.count_table
        self.design_matrix=options.design_matrix
        self.genes_varmodeling=options.genes_varmodeling
        self.include_samples=options.include_samples
        self.output_prefix=options.output_prefix
        self.file_directory=os.getcwd()
        self.output_directory="%s/%s" %(os.getcwd(),self.output_prefix)
        if os.path.exists(self.output_directory)==False:
            os.makedirs(self.output_directory)
        self.permutation_round=options.permutation_round
        self.outliers_removal=options.outliers_removal
        self.PPI_prior=options.PPI_prior
        self.PPI_weighting=options.PPI_weighting
        self.PPI_diagnosis=None
        self.non_PPI_beta_prior_variance=None
        self.allgenedict=None
        self.size_f=None
        self.mrm=None
        self.log_list=defaultdict(list)
        self.selection_constant=None
        self.invalid_gRNA_dict=None
        self.negative_control=options.negative_control
        self.negative_control_gRNAs=None
        self.norm_method=options.norm_method

    def bayes_init(self):
        maxgene=np.inf
        if self.negative_control==None:
            self.allgenedict,self.invalid_gRNA_dict=read_gene_from_file(self.count_table,includesamples=self.include_samples,negative_control=self.negative_control)
        else:
            self.allgenedict,self.invalid_gRNA_dict,self.negative_control_gRNAs=read_gene_from_file(self.count_table,includesamples=self.include_samples,negative_control=self.negative_control)

        # calculate the size factor
        cttab_sel={}
        for (geneid,gk) in self.allgenedict.iteritems():
            sgid=gk.sgrnaid
            sgreadmat=gk.nb_count.getT().tolist()
            for i in range(len(sgid)):
                cttab_sel[sgid[i]]=sgreadmat[i]
        if hasattr(self,'norm_method'):
            if self.norm_method!='none':
                self.size_f=normalizeCounts(cttab_sel,method=self.norm_method,returnfactor=True,reversefactor=True,negative_control_gRNAs=self.negative_control_gRNAs)
            else:
                self.size_f=None
        else:
            self.size_f=normalizeCounts(cttab_sel,returnfactor=True,reversefactor=True)
        logging.info('size factor: '+','.join([str(x) for x in self.size_f]))
        #logging.info(self.design_matrix)
        desmat=self.design_matrix
        for (tgid,tginst) in self.allgenedict.iteritems():
            #if tgid=="INO80B":
            tginst.design_mat=desmat
            iteratenbem(tginst,debug=False,estimateeff=False,alpha_val=0.05,size_factor=self.size_f)
            tginst.w_estimate=[]
        deviation(self.allgenedict)

        self.non_PPI_beta_prior_variance=beta_non_PPI_prior_calculation(self.allgenedict)
        pickle.dump(self,open("/%s/%s_self_bayes_init.p" %(self.output_directory,self.output_prefix),'wb'))

    def parameter_reevalution(self):
        self=pickle.load(open("/%s/%s_self_bayes_init.p" %(self.output_directory,self.output_prefix),'rb'))

        logging.info('Reestimate dispersion ...')
        ngenes=0
        for (tgid,tginst) in self.allgenedict.iteritems():
            if ngenes<3000:
                try:
                    #logging.info(tgid)
                    sgrna_wide_dispersion_estimation_MAP_v2(tginst,self.design_matrix)
                    ngenes+=1
                except:
                    pass
        pickle.dump(self,open("/%s/%s_self_para_eval.p" %(self.output_directory,self.output_prefix),'wb'))

    def bayes_fitting(self):
        self=pickle.load(open("/%s/%s_self_para_eval.p" %(self.output_directory,self.output_prefix),'rb'))
        logging.info('Modeling the mean and variance ...')
        if self.genes_varmodeling>0:
            self.mrm=MeanVarModel()
            #self.mrm.model_mean_disp_by_lm(self.allgenedict)
            self.mrm.model_mean_disp_by_glm(self.allgenedict,self.output_prefix,self.size_f)
        else:
            mrm=None
        pickle.dump(self,open("/%s/%s_self_fitting.p" %(self.output_directory,self.output_prefix),'wb'))

    def bayes_major(self):
        self=pickle.load(open("/%s/%s_self_fitting.p" %(self.output_directory,self.output_prefix),'rb'))
        logging.info('Run the algorithm for the second time ...')
        ngene=0
        for (tgid,tginst) in self.allgenedict.iteritems():
            #logging.info(tgid)
            iteratenbem(tginst,debug=False,meanvarmodel=self.mrm,restart=False,size_factor=self.size_f,beta1_prior_var=self.non_PPI_beta_prior_variance)
            ngene+=1

        for (tgid,tginst) in self.allgenedict.iteritems():
            if len(tginst.w_estimate)==0:
                tginst.w_estimate=np.ones(len(tginst.sgrnaid))

        pickle.dump(self,open("/%s/%s_self_bayes_major.p" %(self.output_directory,self.output_prefix),'wb'))

    def constant_optimization(self):
        # PPI
        self=pickle.load(open("/%s/%s_self_bayes_major.p" %(self.output_directory,self.output_prefix),'rb'))
        logging.info('PPI validation...')
        PPI_main(self)
        if self.PPI_diagnosis==True:
            beta_prior_output(self)
        '''
        copy_self=copy.copy(self)
        copy_self.count_table="singlized_{}".format(self.count_table)
        copy_self.output_prefix="{}_mageck_bayes".format(copy_self.count_table)
        copy_self.output_directory="{}/{}".format(os.getcwd(),copy_self.output_prefix)
        if os.path.exists(copy_self.output_directory)==False:
            os.makedirs(copy_self.output_directory)
        if not os.path.isfile("/%s/self_pre_dispersion_fitting_round.p" %copy_self.output_directory):
            os.chdir(self.file_directory)
            sgRNA_production(self.count_table)
            copy_self.allgenedict,copy_self.invalid_gRNA_dict=read_gene_from_file(copy_self.count_table,includesamples=copy_self.include_samples)
            for (tgid,tginst) in copy_self.allgenedict.items():
                tginst.design_mat=copy_self.design_matrix
                iteratenbem(tginst,debug=False,meanvarmodel=self.mrm,restart=False,removeoutliers=self.outliers_removal,size_factor=self.size_f,beta1_prior_var=self.non_PPI_beta_prior_variance)
            pickle.dump(copy_self,open("/%s/self_pre_dispersion_fitting_round.p" %copy_self.output_directory,'wb'))
        else:
            copy_self=pickle.load(open("/%s/self_pre_dispersion_fitting_round.p" %copy_self.output_directory,'rb'))
        logging.info("signlized_sgRNA processed!")
        sgRNA_beta=background(copy_self)
        beta1=list(sgRNA_beta.values())
        median=np.median(beta1)
        abs_beta1=[abs(i-median) for i in beta1]
        abs_beta1.sort()
        std_beta1=float(np.percentile(abs_beta1,95))/norm.ppf(0.975)
        for geneid in list(self.allgenedict.keys()):
            sgrnaid=self.allgenedict[geneid].sgrnaid
            temp=[]
            for sgRNA in sgrnaid:
                temp.append(np.log(norm.pdf(sgRNA_beta[sgRNA],median,std_beta1)))
            self.allgenedict[geneid].sgrna_probability=temp
        '''
        logging.info('Estimate selection constant...')
        bayes_selection_constnat_optimization(self)
        pickle.dump(self,open("/%s/%s_self_constant_optimization.p" %(self.output_directory,self.output_prefix),'wb'))

    def bayes_iteration(self):
        logging.info('Iteratioin...')
        PPI_choice=[False,True]

        for PPI in PPI_choice:
            self=pickle.load(open("/%s/%s_self_constant_optimization.p" %(self.output_directory,self.output_prefix),'rb'))
            self.PPI_prior=PPI
            if self.PPI_diagnosis==False and self.PPI_prior==True:
                pass
            else:
                self.outliers_removal=False
                for (tgid,tginst) in self.allgenedict.iteritems():
                    iteratenbem(tginst,debug=False,meanvarmodel=self.mrm,restart=False,PPI_prior=self.PPI_prior,removeoutliers=self.outliers_removal,size_factor=self.size_f,beta1_prior_var=self.non_PPI_beta_prior_variance)
                pickle.dump(self,open("/%s/%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p" %(self.output_directory,self.output_prefix,self.PPI_prior,self.outliers_removal),'wb'))

                #base_index=np.where(~self.design_matrix[:,1:].any(axis=1))[0]
                #transform_list=[1 if i in base_index else -1 for i in range(self.design_matrix.shape[0])]
                #transform_matrix=np.matrix(transform_list)

                for (tgid,tginst) in self.allgenedict.items():
                    bayes_selection(tginst,log_list=self.log_list,selection_constant=self.selection_constant)
                self.outliers_removal=True
                for (tgid,tginst) in self.allgenedict.iteritems():
                    iteratenbem(tginst,debug=False,meanvarmodel=self.mrm,restart=False,PPI_prior=self.PPI_prior,removeoutliers=self.outliers_removal,size_factor=self.size_f,beta1_prior_var=self.non_PPI_beta_prior_variance)
                pickle.dump(self,open("/%s/%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p" %(self.output_directory,self.output_prefix,self.PPI_prior,self.outliers_removal),'wb'))

    def bayes_output(self):
        os.chdir(self.output_directory)
        for mark in [[True,False],[True,True],[False,False],[False,True],["major","major"]]:
            if mark!=["major","major"]:
                file="%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p" %(self.output_prefix,mark[0],mark[1])
            else:
                file="%s_self_bayes_major.p" %self.output_prefix
            if file in glob.glob("*"):
                self=pickle.load(open(file,'rb'))
                # permutation
                iteratenbem_permutation(self.allgenedict,nround=self.permutation_round,meanvarmodel=self.mrm,size_factor=self.size_f,beta1_prior_var=self.non_PPI_beta_prior_variance)
                # correct for FDR
                gene_fdr_correction(self.allgenedict,self.adjust_method)

                genefile=self.output_prefix+'_PPI_'+str(mark[0])+'_outliers_removal_'+str(mark[1])+'.gene_summary.txt'
                sgrnafile=self.output_prefix+'_PPI_'+str(mark[0])+'_outliers_removal_'+str(mark[1])+'.sgrna_summary.txt'
                logging.info(genefile)
                logging.info(sgrnafile)

                logging.info('Writing gene results to '+genefile)
                logging.info('Writing sgRNA results to '+sgrnafile)
                write_gene_to_file(self.allgenedict,genefile,betalabels=self.beta_labels)
                write_sgrna_to_file(self.allgenedict,sgrnafile)
                plot(genefile)


    def bayes_output_no_permutation(self):
        os.chdir(self.output_directory)
        marks=[['True','False'],['True','True'],['False','False'],['False','True'],["major","major"]]
        #marks=[["major","major"]]
        deviation_output=open("%s_mu_k_deviation.txt" %self.output_prefix,'wb')
        deviation_insert=["PPI","outliers_removal","central_80_percent_mean","median"]
        deviation_output.write("%s\n" %"\t".join(deviation_insert))

        PPI_diagnosis_output=open("%s_mu_k_PPI_diagnosis.txt" %self.output_prefix,'wb')
        PPI_diagnosis_insert=[""]
        PPI_diagnosis_output.write("%s\n" %"\t".join(PPI_diagnosis_insert))
        '''
        os.chdir("%s/doc/" %self.output_directory)
        DE_file=open("%s_DE.txt" %self.count_table)
        DE_file.readline()
        DE_dict=dict()
        for line in DE_file:
            elements=line.strip().split("\t")
            DE_dict[elements[0].upper()]=elements[4]
        '''
        os.chdir(self.output_directory)
        for mark in marks:
            if mark!=["major","major"]:
                file="%s_self_bayes_iteration_PPI_%s_outliers_removal_%s.p" %(self.output_prefix,mark[0],mark[1])
            else:
                file="%s_self_bayes_major.p" %self.output_prefix
            if file in glob.glob("*"):
                self=pickle.load(open(file,'rb'))
                # correct for FDR

                gene_fdr_correction(self.allgenedict,self.adjust_method,wald_only=True)

                genefile=self.output_prefix+'_PPI_'+str(mark[0])+'_outliers_removal_'+str(mark[1])+'.gene_summary.txt'
                sgrnafile=self.output_prefix+'_PPI_'+str(mark[0])+'_outliers_removal_'+str(mark[1])+'.sgrna_summary.txt'

                logging.info('Writing gene results to '+genefile)
                logging.info('Writing sgRNA results to '+sgrnafile)
                write_gene_to_file(self.allgenedict,genefile,betalabels=self.beta_labels,wald_only=True)
                #write_sgrna_to_file(self.include_samples,self.allgenedict,self.invalid_gRNA_dict,sgrnafile,DE_dict)
                write_sgrna_to_file(self.include_samples,self.allgenedict,self.invalid_gRNA_dict,sgrnafile)
                plot(genefile,negative_control_gRNAs=self.negative_control_gRNAs,wald_only=True)

                deviation_insert=mark+deviation(self.allgenedict)
                deviation_output.write("%s\n" %"\t".join(deviation_insert))