3 from __future__
import print_function
8 from IMP
import OptionParser
12 __doc__ =
"Refine fitting subunits into a density map with FFT."
32 self.spacing = spacing
33 self.resolution = resolution
34 self.threshold = density_threshold
35 self.originx = origin[0]
36 self.originy = origin[1]
37 self.originz = origin[2]
39 self.fits_fn = fits_fn
41 self.num_fits = num_fits
42 self.angles_per_voxel = angles_per_voxel
43 self.max_trans = max_trans
44 self.max_angle = max_angle
45 self.ref_pdb = ref_pdb
48 def run_local_fitting(self, mol2fit, rb, initial_transformation):
49 print(
"resolution is:", self.resolution)
51 dmap.get_header().set_resolution(self.resolution)
52 dmap.update_voxel_size(self.spacing)
56 dmap.set_was_used(
True)
57 dmap.get_header().
show()
62 do_cluster_fits =
True
63 max_clustering_translation = 3
64 max_clustering_rotation = 5
65 num_fits_to_report = 100
67 fits = ff.do_local_fitting(dmap, self.threshold, mol2fit,
68 self.angle / 180.0 * math.pi,
69 self.max_angle / 180.0 *
70 math.pi, self.max_trans, num_fits_to_report,
71 do_cluster_fits, self.angles_per_voxel,
72 max_clustering_translation, max_clustering_rotation)
73 fits.set_was_used(
True)
74 final_fits = fits.best_fits_
75 if self.ref_pdb !=
'':
79 for i, fit
in enumerate(final_fits):
81 if self.ref_pdb !=
'':
82 trans = fit.get_fit_transformation()
88 fit.set_rmsd_to_reference(rmsd)
90 fit.set_fit_transformation(trans * initial_transformation)
91 if self.ref_pdb !=
'':
92 print(
'from all fits, lowest rmsd to ref:', cur_low)
101 usage =
"""%prog [options] <assembly input> <refined assembly input> <proteomics.input> <mapping.input> <combinations file> <combination index>
103 Fit subunits locally around a combination solution with FFT."""
105 parser.add_option(
"-a",
"--angle", dest=
"angle", type=
"float",
107 help=
"angle delta (degrees) for FFT rotational "
108 "search (default 5)")
110 parser.add_option(
"-n",
"--num", dest=
"num", type=
"int",
112 help=
"Number of fits to report"
115 parser.add_option(
"-v",
"--angle_voxel", dest=
"angle_voxel", type=
"int",
117 help=
"Number of angles to keep per voxel"
120 parser.add_option(
"-t",
"--max_trans", dest=
"max_trans", type=
"float",
122 help=
"maximum translational search in A"
125 parser.add_option(
"-m",
"--max_angle", dest=
"max_angle", type=
"float",
127 help=
"maximum angular search in degrees"
130 options, args = parser.parse_args()
132 parser.error(
"incorrect number of arguments")
149 asmb_input.set_was_used(
True)
151 asmb_refined_input.set_was_used(
True)
156 ensmb.set_was_used(
True)
157 mhs = ensmb.get_molecules()
160 ensmb_ref.set_was_used(
True)
161 mhs_ref = ensmb_ref.get_molecules()
163 ensmb.load_combination(combs[comb_ind])
165 em_map = asmb_input.get_assembly_header().get_dens_fn()
167 spacing = asmb_input.get_assembly_header().get_spacing()
168 origin = asmb_input.get_assembly_header().get_origin()
170 rbs_ref = ensmb_ref.get_rigid_bodies()
171 rbs = ensmb.get_rigid_bodies()
173 for i, mh
in enumerate(mhs):
174 fits_fn = asmb_refined_input.get_component_header(
175 i).get_transformations_fn()
182 rb_ref.get_reference_frame(),
183 rb.get_reference_frame())
185 pdb_fn = asmb_input.get_component_header(i).get_filename()
188 em_map, spacing, resolution, origin, asmb_input.get_assembly_header(
190 ), pdb_fn, fits_fn, options.angle, options.num, options.angle_voxel,
191 options.max_trans, options.max_angle)
192 f.run_local_fitting(mh, rb, initial_transformation)
196 options, args = parse_args()
198 asmb_refined_input = args[1]
199 proteomics_fn = args[2]
201 combinations_fn = args[4]
202 combination_ind = int(args[5])
203 run(asmb_input, asmb_refined_input, proteomics_fn,
204 mapping_fn, combinations_fn, combination_ind, options)
206 if __name__ ==
"__main__":
double get_resolution(kernel::Model *m, kernel::ParticleIndex pi)
Fit a molecule inside its density by local or global FFT.
double get_rmsd(const core::XYZs &s0, const core::XYZs &s1, const IMP::algebra::Transformation3D &tr_for_second)
SettingsData * read_settings(const char *filename)
GenericHierarchies get_leaves(Hierarchy mhd)
Get all the leaves of the bit of hierarchy.
Transformation3D get_transformation_from_first_to_second(const ReferenceFrame3D &a, const ReferenceFrame3D &b)
ProteinsAnchorsSamplingSpace read_protein_anchors_mapping(multifit::ProteomicsData *prots, const std::string &anchors_prot_map_fn, int max_paths=INT_MAX)
void transform(Hierarchy h, const algebra::Transformation3D &tr)
Transform a hierarchy. This is aware of rigid bodies.
Ensemble * load_ensemble(multifit::SettingsData *sd, Model *mdl, const ProteinsAnchorsSamplingSpace &mapping_data)
Fitting atomic structures into a cryo-electron microscopy density map.
Basic utilities for handling cryo-electron microscopy 3D density maps.
void write_fitting_solutions(const char *fitting_fn, const FittingSolutionRecords &fit_sols, int num_sols=-1)
Write fitting solutions to a file.
DensityMap * read_map(std::string filename)
Read a density map from a file and return it.
ProteomicsData * read_proteomics_data(const char *proteomics_fn)
Proteomics reader.
IMP::kernel::OptionParser OptionParser
IntsList read_paths(const char *txt_filename, int max_paths=INT_MAX)
Read paths.
void show(Hierarchy h, std::ostream &out=std::cout)
Print out a molecular hierarchy.
Functionality for loading, creating, manipulating and scoring atomic structures.
void read_pdb(base::TextInput input, int model, Hierarchy h)
Class for storing model, its restraints, constraints, and particles.