def add_sift_chunk_ordinary(self, rec_atom, lig_name, strength):
        if self.sifts.has_key(lig_name):
            if rec_atom.resnum in self.sifts[lig_name].sift.keys():
                cur_sift = self.sifts[lig_name]
            else:
                self.sifts[lig_name].add_sift_chunk(rec_atom.resnum)
                cur_sift = self.sifts[lig_name]
        else:
            new_sift = sift(lig_name)
            new_sift.add_sift_chunk(rec_atom.resnum)

            self.sifts[lig_name] = new_sift
            cur_sift = new_sift

        if "CONTACT" in self.active_bits:
            cur_sift.turn_sift_bit_on(self.bit_pos["CONTACT"], rec_atom.resnum, "exists")
        if int(rec_atom) in self.backbone_set:
            if "BACKBONE" in self.active_bits:
                cur_sift.turn_sift_bit_on(self.bit_pos["BACKBONE"], rec_atom.resnum, strength)
        else:
            if "SIDECHAIN" in self.active_bits:
                cur_sift.turn_sift_bit_on(self.bit_pos["SIDECHAIN"], rec_atom.resnum, strength)

            if int(rec_atom) in self.polar_set:
                if "POLAR" in self.active_bits:
                    cur_sift.turn_sift_bit_on(self.bit_pos["POLAR"], rec_atom.resnum, strength)
            if int(rec_atom) in self.hydrophobic_set:
                if "HYDROPHOBIC" in self.active_bits:
                    cur_sift.turn_sift_bit_on(self.bit_pos["HYDROPHOBIC"], rec_atom.resnum, strength)
            if int(rec_atom) in self.aromatic_set:
                if "AROMATIC" in self.active_bits:
                    cur_sift.turn_sift_bit_on(self.bit_pos["AROMATIC"], rec_atom.resnum, strength)
            if int(rec_atom) in self.charged_set:
                if "CHARGED" in self.active_bits:
                    cur_sift.turn_sift_bit_on(self.bit_pos["CHARGED"], rec_atom.resnum, strength)
    def fill_missing_zeros(self, start_res, end_res, lig_name):
        if lig_name not in self.sifts.keys():
            new_sift = sift(lig_name)

        for res in range(start_res, end_res):
            if res not in self.sifts[lig_name].sift.keys():
                self.sifts[lig_name].add_sift_chunk(res)
    def add_sift_chunk_env(self, rec_atom, lig_name, i_type, strength):
        if self.sifts.has_key(lig_name):
            if rec_atom.resnum in self.sifts[lig_name].sift.keys():
                cur_sift = self.sifts[lig_name]
            else:
                self.sifts[lig_name].add_sift_chunk(rec_atom.resnum)
                cur_sift = self.sifts[lig_name]
        else:
            new_sift = sift(lig_name)
            new_sift.add_sift_chunk(rec_atom.resnum)

            self.sifts[lig_name] = new_sift
            cur_sift = new_sift

        cur_sift.turn_sift_bit_on(self.bit_pos[i_type], rec_atom.resnum, strength)
    def add_sift_chunk_special_case(self, rec_atom, lig_atom, lig_name, dist):
        """
        the case without strength difference
        """
        if self.sifts.has_key(lig_name):
            if rec_atom.resnum in self.sifts[lig_name].sift.keys():
                cur_sift = self.sifts[lig_name]
            else:
                self.sifts[lig_name].add_sift_chunk(rec_atom.resnum)
                cur_sift = self.sifts[lig_name]
        else:
            new_sift = sift(lig_name)
            new_sift.add_sift_chunk(rec_atom.resnum)

            self.sifts[lig_name] = new_sift
            cur_sift = new_sift

        if structureutil.match_hbond(lig_atom, rec_atom, distance=dist):
            if rec_atom.atomic_number == 1:
                if "H_DONOR" in self.active_bits:
                    cur_sift.turn_sift_bit_on(self.bit_pos["H_DONOR"], rec_atom.resnum, "exists")
            else:
                if "H_ACCEPTOR" in self.active_bits:
                    cur_sift.turn_sift_bit_on(self.bit_pos["H_ACCEPTOR"], rec_atom.resnum, "exists")