def _add_provenance_nodes(self, rmf, rt): """Add *Provenance nodes under rt. Return the root.""" softpf = RMF.SoftwareProvenanceFactory(rmf) scriptpf = RMF.ScriptProvenanceFactory(rmf) strucpf = RMF.StructureProvenanceFactory(rmf) samppf = RMF.SampleProvenanceFactory(rmf) filtpf = RMF.FilterProvenanceFactory(rmf) clustpf = RMF.ClusterProvenanceFactory(rmf) clust_node = rt.add_child("clustering", RMF.PROVENANCE) clust = clustpf.get(clust_node) clust.set_members(10) filt_node = clust_node.add_child("filtering", RMF.PROVENANCE) filt = filtpf.get(filt_node) filt.set_method("Total score") filt.set_threshold(250.) filt.set_frames(4) samp_node = filt_node.add_child("sampling", RMF.PROVENANCE) samp = samppf.get(samp_node) samp.set_method("Monte Carlo") samp.set_frames(100) samp.set_iterations(10) samp.set_replicas(8) struc_node = samp_node.add_child("structure", RMF.PROVENANCE) struc = strucpf.get(struc_node) struc.set_filename(os.path.abspath('foo.pdb')) struc.set_chain('X') # Test default self.assertEqual(struc.get_residue_offset(), 0) struc.set_residue_offset(42) script_node = struc_node.add_child("script", RMF.PROVENANCE) script = scriptpf.get(script_node) script.set_filename(os.path.abspath('test.py')) soft_node = script_node.add_child("software", RMF.PROVENANCE) soft = softpf.get(soft_node) soft.set_name('RMF') soft.set_version('1.0.1') soft.set_location('https://test.url') return clust_node
def _check_provenance_nodes(self, rmf, prov_root): softpf = RMF.SoftwareProvenanceFactory(rmf) scriptpf = RMF.ScriptProvenanceFactory(rmf) strucpf = RMF.StructureProvenanceFactory(rmf) filtpf = RMF.FilterProvenanceFactory(rmf) samppf = RMF.SampleProvenanceFactory(rmf) clustpf = RMF.ClusterProvenanceFactory(rmf) self.assertTrue(clustpf.get_is(prov_root)) clust = clustpf.get(prov_root) self.assertEqual(clust.get_members(), 10) filt_node = prov_root.get_children()[0] self.assertTrue(filtpf.get_is(filt_node)) filt = filtpf.get(filt_node) self.assertEqual(filt.get_method(), "Total score") self.assertAlmostEqual(filt.get_threshold(), 250., delta=0.1) self.assertEqual(filt.get_frames(), 4) samp_node = filt_node.get_children()[0] self.assertTrue(samppf.get_is(samp_node)) samp = samppf.get(samp_node) self.assertEqual(samp.get_frames(), 100) self.assertEqual(samp.get_iterations(), 10) self.assertEqual(samp.get_replicas(), 8) self.assertEqual(samp.get_method(), "Monte Carlo") struc_node = samp_node.get_children()[0] self.assertTrue(strucpf.get_is(struc_node)) struc = strucpf.get(struc_node) self.assertEqual(struc.get_filename(), os.path.abspath('foo.pdb')) self.assertEqual(struc.get_chain(), 'X') self.assertEqual(struc.get_residue_offset(), 42) script_node = struc_node.get_children()[0] self.assertTrue(scriptpf.get_is(script_node)) script = scriptpf.get(script_node) self.assertEqual(script.get_filename(), os.path.abspath('test.py')) soft_node = script_node.get_children()[0] self.assertTrue(softpf.get_is(soft_node)) soft = softpf.get(soft_node) self.assertEqual(soft.get_name(), 'RMF') self.assertEqual(soft.get_version(), '1.0.1') self.assertEqual(soft.get_location(), 'https://test.url')
def make_cluster_centroid(infname, frame, outfname, cluster_index, cluster_size, precision, density, path): import RMF # If we have new enough IMP/RMF, do our own RMF slicing with provenance if hasattr(RMF.NodeHandle, 'replace_child'): print(infname, outfname) inr = RMF.open_rmf_file_read_only(infname) outr = RMF.create_rmf_file(outfname) cpf = RMF.ClusterProvenanceFactory(outr) RMF.clone_file_info(inr, outr) RMF.clone_hierarchy(inr, outr) RMF.clone_static_frame(inr, outr) inr.set_current_frame(RMF.FrameID(frame)) outr.add_frame("f0") RMF.clone_loaded_frame(inr, outr) rn = outr.get_root_node() children = rn.get_children() if len(children) == 0: return rn = children[0] # Should be the top-level IMP node prov = [c for c in rn.get_children() if c.get_type() == RMF.PROVENANCE] if not prov: return prov = prov[0] # Add cluster-provenance info newp = rn.replace_child(prov, "cluster.%d" % cluster_index, RMF.PROVENANCE) cp = cpf.get(newp) cp.set_members(cluster_size) cp.set_precision(precision) cp.set_density(os.path.abspath(density)) else: # Otherwise, fall back to RMF's command line tool import subprocess print(infname, frame, outfname) subprocess.call( ['rmf_slice', path + infname, '-f', str(frame), outfname])