1 from __future__
import print_function
2 import pyRMSD.RMSDCalculator
3 from pyRMSD.condensedMatrix
import CondensedMatrix
15 def parse_rmsd_selection(h, selection):
17 for idx, selected_range
in enumerate(selection.values()):
20 molecule=str(selected_range[0][2]),
21 residue_indexes=range(selected_range[0][0],
22 selected_range[0][1]))
31 def get_pdbs_coordinates(path, idfile_A, idfile_B):
40 with open(idfile_A,
'w+')
as f1:
41 for str_file
in sorted(
42 glob.glob(
"%s/sample_A/*.pdb" % path),
43 key=
lambda x: int(x.split(
'/')[-1].split(
'.')[0])):
44 print(str_file, num, file=f1)
45 models_name.append(str_file)
59 with open(idfile_B,
'w+')
as f2:
60 for str_file
in sorted(
61 glob.glob(
"%s/sample_B/*.pdb" % path),
62 key=
lambda x: int(x.split(
'/')[-1].split(
'.')[0])):
63 print(str_file, num, file=f2)
64 models_name.append(str_file)
75 return np.array(conform), masses, radii, models_name
78 def get_rmfs_coordinates(path, idfile_A, idfile_B,
79 subunit_name=
None, selection=
None):
87 f1 = open(idfile_A,
'w+')
88 f2 = open(idfile_B,
'w+')
92 for sample_name, sample_id_file
in zip([
'A',
'B'], [f1, f2]):
94 for str_file
in sorted(
95 glob.glob(
"%s/sample_%s/*.rmf3" % (path, sample_name)),
96 key=
lambda x: int(x.split(
'/')[-1].split(
'.')[0])):
97 print(str_file, num, file=sample_id_file)
98 models_name.append(str_file)
101 inf = RMF.open_rmf_file_read_only(str_file)
109 elif selection
is not None:
110 s0 = parse_rmsd_selection(h, selection)
114 for leaf
in s0.get_selected_particles():
117 pts.append([p.get_coordinates()[i]
for i
in range(3)])
119 if num == 0
and sample_name ==
'A':
121 radii.append(p.get_radius())
135 mol_name +
"_" + str(min(residues_in_bead)) +
"_"
136 + str(max(residues_in_bead)) +
"_"
143 ps_names.append(mol_name +
"_" + residue_in_bead +
"_"
144 + residue_in_bead +
"_"
153 return ps_names, masses, radii, np.array(conform), models_name
156 def parse_symmetric_groups_file(symm_groups_file):
158 member_to_symm_group = {}
159 first_group_member = []
160 curr_particle_index_in_group = []
162 sgf = open(symm_groups_file,
'r')
164 for indx, ln
in enumerate(sgf.readlines()):
166 symm_groups.append([])
168 curr_particle_index_in_group.append(-1)
169 fields = ln.strip().split()
173 member_to_symm_group[fld] = indx
177 first_group_member.append(fields[0])
181 return (symm_groups, member_to_symm_group, curr_particle_index_in_group,
185 def get_rmfs_coordinates_one_rmf(path, rmf_A, rmf_B, subunit_name=None,
186 symm_groups_file=
None, selection=
None):
187 '''Modified RMF coordinates function to work with symmetric copies'''
190 rmf_fh = RMF.open_rmf_file_read_only(os.path.join(path, rmf_A))
191 n_models = [rmf_fh.get_number_of_frames()]
192 rmf_fh = RMF.open_rmf_file_read_only(os.path.join(path, rmf_B))
193 n_models.append(rmf_fh.get_number_of_frames())
214 elif selection
is not None:
215 s0 = parse_rmsd_selection(h, selection)
220 for leaf
in s0.get_selected_particles():
225 conform = np.empty([n_models[0]+n_models[1], pts, 3])
230 (symm_groups, group_member_to_symm_group_map,
231 curr_particle_index_in_group, first_group_member) = \
232 parse_symmetric_groups_file(symm_groups_file)
238 for rmf_file
in [rmf_A, rmf_B]:
240 models_name.append(rmf_file)
242 rmf_fh = RMF.open_rmf_file_read_only(os.path.join(path, rmf_file))
245 print(
"Opening RMF file:", rmf_file,
"with",
246 rmf_fh.get_number_of_frames(),
"frames")
248 for f
in range(rmf_fh.get_number_of_frames()):
252 print(
" -- Opening frame", f,
"of",
253 rmf_fh.get_number_of_frames())
263 elif selection
is not None:
264 s0 = parse_rmsd_selection(h, selection)
268 particles = s0.get_selected_particles()
271 for i
in range(len(particles)):
276 pxyz = p.get_coordinates()
277 conform[mod_id][i][0] = pxyz[0]
278 conform[mod_id][i][1] = pxyz[1]
279 conform[mod_id][i][2] = pxyz[2]
283 if mod_id == 0
and rmf_file == rmf_A:
285 radii.append(p.get_radius())
296 protein_plus_copy = mol_name+
'.'+str(copy_number)
297 if protein_plus_copy
in group_member_to_symm_group_map:
299 group_index = group_member_to_symm_group_map[
301 curr_particle_index_in_group[group_index] += 1
303 if protein_plus_copy \
304 == first_group_member[group_index]:
305 symm_groups[group_index].append([i])
308 j = curr_particle_index_in_group[group_index] \
309 % len(symm_groups[group_index])
310 symm_groups[group_index][j].append(i)
317 mol_name +
"_" + str(min(residues_in_bead)) +
"_"
318 + str(max(residues_in_bead)) +
"_"
324 mol_name +
"_" + residue_in_bead +
"_" +
325 residue_in_bead +
"_" + str(copy_number))
328 return ps_names, masses, radii, conform, symm_groups, models_name, n_models
331 def get_rmsds_matrix(conforms, mode, sup, cores, symm_groups=None):
333 if (mode ==
"cpu_serial" and not sup)
or (mode ==
"cpu_omp" and not sup):
334 calculator_name =
"NOSUP_OMP_CALCULATOR"
336 elif mode ==
"cpu_omp" and sup:
337 calculator_name =
"QCP_OMP_CALCULATOR"
338 print(
"we are using QCP_OMP to compute RMSD")
339 elif mode ==
"cuda" and sup:
340 calculator_name =
"QCP_CUDA_MEM_CALCULATOR"
342 print(
"Wrong values to pyRMSD ! Please Fix")
346 print(
"We have ambiguity.")
347 calculator = pyRMSD.RMSDCalculator.RMSDCalculator(
349 fittingCoordsets=conforms,
350 calcSymmetryGroups=symm_groups,
351 fitSymmetryGroups=symm_groups)
354 calculator = pyRMSD.RMSDCalculator.RMSDCalculator(
355 calculator_name, conforms)
358 if mode ==
"cpu_omp":
359 calculator.setNumberOfOpenMPThreads(int(cores))
361 rmsd = calculator.pairwiseRMSDMatrix()
362 rmsd_matrix = CondensedMatrix(rmsd)
363 inner_data = rmsd_matrix.get_data()
364 np.save(
"Distances_Matrix.data", inner_data)
Select non water and non hydrogen atoms.
A decorator to associate a particle with a part of a protein/DNA/RNA.
atom::Hierarchies create_hierarchies(RMF::FileConstHandle fh, Model *m)
double get_mass(ResidueType c)
Get the mass from the residue type.
GenericHierarchies get_leaves(Hierarchy mhd)
Get all the leaves of the bit of hierarchy.
void read_pdb(TextInput input, int model, Hierarchy h)
Class for storing model, its restraints, constraints, and particles.
static bool get_is_setup(Model *m, ParticleIndex pi)
The standard decorator for manipulating molecular structures.
Ints get_index(const ParticlesTemp &particles, const Subset &subset, const Subsets &excluded)
void load_frame(RMF::FileConstHandle file, RMF::FrameID frame)
Load the given RMF frame into the state of the linked objects.
A decorator for a particle with x,y,z coordinates.
std::string get_molecule_name(Hierarchy h)
A decorator for a residue.
int get_copy_index(Hierarchy h)
Walk up the hierarchy to find the current copy index.
Functionality for loading, creating, manipulating and scoring atomic structures.
Select hierarchy particles identified by the biological name.
Support for the RMF file format for storing hierarchical molecular data and markup.
A decorator for a particle with x,y,z coordinates and a radius.