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_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 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"))