def salt_bridge(molecule=None): model = molecule.model() metrics = MetricsModel(molecule) positives = [] negatives = [] index = 0 complete_sides = [] bridge_pairs = {} #set up lists to add outputs to x = 0 for chain in metrics.chains: for residue in chain: if residue.is_sidechain_complete == True: complete_sides.append(True) else: complete_sides.append(False) #many files are missing side chains for some residues #these cause errors if not excepeted! for polymer in model: for monomer in polymer: if complete_sides[index]: #checks if current mresiude is complete if monomer.type().trim() in ("ARG", "LYS", "HIS"): positives.append(monomer) elif monomer.type().trim() in ("ASP", "GLU"): negatives.append(monomer) index +=1 #increments index for next residue for positive in positives: if positive.type().trim() == "ARG": plus_coord = positive.find(clipper.String("CZ")).coord_orth elif positive.type().trim() == "LYS": plus_coord = positive.find(clipper.String("NZ")).coord_orth elif positive.type().trim() == "HIS": plus_coord = positive.find(clipper.String("ND1")).coord_orth for negative in negatives: if negative.type().trim() == "ASP": neg_coord = negative.find(clipper.String("CG")).coord_orth elif negative.type().trim() == "GLU": neg_coord = negative.find(clipper.String("CD")).coord_orth if clipper.Coord_orth.length(plus_coord, neg_coord) < 4.5: x += 1 bridge_pairs[x] = (positive.id().trim(), negative.id().trim()) return bridge_pairs
def ss_bridge(molecule=None): model = molecule.model() cysteines = [] bridge_pairs = {} #set up lists to add outputs to i = 0 for polymer in model: for monomer in polymer: if monomer.type().trim() == "CYS": cysteines.append(monomer) #assemble a list of all CYS residues for cys in cysteines: cys_1_S = cys.find(clipper.String("SG")).coord_orth #set location of first cys for next in cysteines: #test first cys against all subsequent, looking for closeness (hence a bridge) cys_2_S = next.find(clipper.String("SG")).coord_orth if clipper.Coord_orth.length(cys_1_S, cys_2_S) < 2.6 and clipper.Coord_orth.length(cys_1_S, cys_2_S) != 0: i += 1#gives a numbered key for use as our bridge annotation bridge_pairs[i] = (cys.id().trim(), next.id().trim()) cysteines.remove(cys) #prevents repetition return bridge_pairs
def salt_bridge(molecule=None): model = molecule.model() metrics = MetricsModel(molecule) index = 0 complete_sides = [] list_of_dicts = [] #set up lists to add outputs to x = 0 for chain in metrics.chains: for residue in chain: if residue.is_sidechain_complete == True: complete_sides.append(True) else: complete_sides.append(False) #many files are missing side chains for some residues #these cause errors if not excepeted! for polymer in model: positives = [] negatives = [] bridge_pairs = {} for monomer in polymer: if complete_sides[index]: #checks if current mresiude is complete if monomer.type().trim() in ("ARG", "LYS"): positives.append(monomer) elif monomer.type().trim() in ("ASP", "GLU"): negatives.append(monomer) index += 1 #increments index for next residue for positive in positives: if positive.type().trim() == "ARG": plus_coord = positive.find(clipper.String("CZ")).coord_orth elif positive.type().trim() == "LYS": plus_coord = positive.find(clipper.String("NZ")).coord_orth closest_range = 999 for negative in negatives: if negative.type().trim() == "ASP": neg_coord = negative.find(clipper.String("CG")).coord_orth elif negative.type().trim() == "GLU": neg_coord = negative.find(clipper.String("CD")).coord_orth if clipper.Coord_orth.length( plus_coord, neg_coord ) < closest_range and clipper.Coord_orth.length( plus_coord, neg_coord) < 4.6: closest_range = clipper.Coord_orth.length( plus_coord, neg_coord) paired_aa = negative if closest_range != 999: x += 1 bridge_pairs[x] = (positive.id().trim(), positive.type().trim(), closest_range, paired_aa.id().trim(), paired_aa.type().trim()) for negative in negatives: rep_counter = 0 distances = [0] for key, value in bridge_pairs.items(): if negative.id().trim() in value: rep_counter += 1 distances.append(value[2]) if rep_counter == 2: for key, value in bridge_pairs.items(): if max(distances) in value: del bridge_pairs[key] if rep_counter > 2: for key, value in bridge_pairs.items(): if negative.id().trim() in value: del bridge_pairs[key] list_of_dicts.append(bridge_pairs) return list_of_dicts