3 from __future__
import print_function
8 from IMP
import ArgumentParser
12 __doc__ =
"Fit subunits into a density map with FFT."
14 multiproc_exception =
None
16 import multiprocessing
20 if sys.platform ==
'win32' and 'WINELOADERNOEXEC' in os.environ:
21 multiproc_exception =
"Wine does not currently support multiprocessing"
22 except ImportError
as detail:
23 multiproc_exception = str(detail)
27 if hasattr(multiprocessing,
'get_context'):
30 if 'forkserver' in multiprocessing.get_all_start_methods():
31 return multiprocessing.get_context(
'forkserver')
33 return multiprocessing.get_context()
36 return multiprocessing
55 self.spacing = spacing
56 self.resolution = resolution
57 self.threshold = density_threshold
58 self.originx = origin[0]
59 self.originy = origin[1]
60 self.originz = origin[2]
62 self.fits_fn = fits_fn
64 self.num_fits = num_fits
65 self.angles_per_voxel = angles_per_voxel
66 self.ref_pdb = ref_pdb
69 print(
"resolution is:", self.resolution)
70 dmap = IMP.em.read_map(self.em_map)
71 dmap.get_header().set_resolution(self.resolution)
72 dmap.update_voxel_size(self.spacing)
76 dmap.set_was_used(
True)
77 dmap.get_header().
show()
84 fits = ff.do_global_fitting(dmap, self.threshold, mol2fit,
85 self.angle / 180.0 * math.pi,
86 self.num_fits, self.spacing, 0.5,
87 True, self.angles_per_voxel)
88 fits.set_was_used(
True)
89 final_fits = fits.best_fits_
90 if self.ref_pdb !=
'':
94 for i, fit
in enumerate(final_fits):
96 if self.ref_pdb !=
'':
97 trans = fit.get_fit_transformation()
100 if rmsd < cur_low[0]:
103 fit.set_rmsd_to_reference(rmsd)
105 if self.ref_pdb !=
'':
106 print(
'from all fits, lowest rmsd to ref:', cur_low)
115 desc =
"""Fit subunits into a density map with FFT."""
116 p = ArgumentParser(description=desc)
117 p.add_argument(
"-c",
"--cpu", dest=
"cpus", type=int, default=1,
118 help=
"number of cpus to use (default 1)")
119 p.add_argument(
"-a",
"--angle", dest=
"angle", type=float, default=30,
120 help=
"angle delta (degrees) for FFT rotational "
121 "search (default 30)")
123 p.add_argument(
"-n",
"--num", dest=
"num", type=int,
124 default=100, help=
"Number of fits to report (default 100)")
126 p.add_argument(
"-v",
"--angle_voxel", dest=
"angle_voxel", type=int,
128 help=
"Number of angles to keep per voxel (default 10)")
130 p.add_argument(
"assembly_file", help=
"assembly file name")
137 return p.parse_args()
140 def run(asmb_fn, options):
141 if multiproc_exception
is None and options.cpus > 1:
144 asmb_input.set_was_used(
True)
145 em_map = asmb_input.get_assembly_header().get_dens_fn()
147 spacing = asmb_input.get_assembly_header().get_spacing()
148 origin = asmb_input.get_assembly_header().get_origin()
149 for i
in range(asmb_input.get_number_of_component_headers()):
150 fits_fn = asmb_input.get_component_header(i).get_transformations_fn()
151 pdb_fn = asmb_input.get_component_header(i).get_filename()
157 asmb_input.get_assembly_header().get_threshold(),
163 if multiproc_exception
is None and options.cpus > 1:
169 The Python 'multiprocessing' module (available in Python 2.6 and later) is
170 needed to run on multiple CPUs, and could not be found
171 (Python error: '%s').
172 Running on a single processor.""" % multiproc_exception, file=sys.stderr)
174 if multiproc_exception
is None and options.cpus > 1:
176 nproc = min(options.cpus, asmb_input.get_number_of_component_headers())
178 p = ctx.Pool(processes=nproc)
179 _ = list(p.imap_unordered(do_work, work_units))
185 run(args.assembly_file, args)
188 if __name__ ==
"__main__":
Fit a molecule inside its density by local or global FFT.
SettingsData * read_settings(const char *filename)
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.
double get_rmsd(const Selection &s0, const Selection &s1)
void transform(Hierarchy h, const algebra::Transformation3D &tr)
Transform a hierarchy. This is aware of rigid bodies.
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.
std::ostream & show(Hierarchy h, std::ostream &out=std::cout)
Print the hierarchy using a given decorator to display each node.
IMP::core::RigidBody create_rigid_body(Hierarchy h)
double get_resolution(Model *m, ParticleIndex pi)
Estimate the resolution of the hierarchy as used by Representation.
Functionality for loading, creating, manipulating and scoring atomic structures.