Coverage for biobb_mem/ambertools/cpptraj_density.py: 77%
74 statements
« prev ^ index » next coverage.py v7.6.11, created at 2025-02-10 11:25 +0000
« prev ^ index » next coverage.py v7.6.11, created at 2025-02-10 11:25 +0000
1#!/usr/bin/env python3
3"""Module containing the Cpptraj Density class and the command line interface."""
4import argparse
5from pathlib import PurePath
6from biobb_common.generic.biobb_object import BiobbObject
7from biobb_common.configuration import settings
8from biobb_common.tools import file_utils as fu
9from biobb_common.tools.file_utils import launchlogger
12class CpptrajDensity(BiobbObject):
13 """
14 | biobb_mem CpptrajDensity
15 | Wrapper of the Ambertools Cpptraj module for calculating density profile along an axis of a given cpptraj compatible trajectory.
16 | Cpptraj (the successor to ptraj) is the main program in Ambertools for processing coordinate trajectories and data files. The parameter names and defaults are the same as the ones in the official `Cpptraj manual <https://raw.githubusercontent.com/Amber-MD/cpptraj/master/doc/CpptrajManual.pdf>`_.
18 Args:
19 input_top_path (str): Path to the input structure or topology file. File type: input. `Sample file <https://github.com/bioexcel/biobb_mem/raw/main/biobb_mem/test/data/ambertools/topology.top>`_. Accepted formats: top (edam:format_3881), pdb (edam:format_1476), prmtop (edam:format_3881), parmtop (edam:format_3881), zip (edam:format_3987).
20 input_traj_path (str): Path to the input trajectory to be processed. File type: input. `Sample file <https://github.com/bioexcel/biobb_mem/raw/main/biobb_mem/test/data/ambertools/trajectory.xtc>`_. Accepted formats: mdcrd (edam:format_3878), crd (edam:format_3878), cdf (edam:format_3650), netcdf (edam:format_3650), nc (edam:format_3650), restart (edam:format_3886), ncrestart (edam:format_3886), restartnc (edam:format_3886), dcd (edam:format_3878), charmm (edam:format_3887), cor (edam:format_2033), pdb (edam:format_1476), mol2 (edam:format_3816), trr (edam:format_3910), gro (edam:format_2033), binpos (edam:format_3885), xtc (edam:format_3875), cif (edam:format_1477), arc (edam:format_2333), sqm (edam:format_2033), sdf (edam:format_3814), conflib (edam:format_2033).
21 output_cpptraj_path (str): Path to the output processed density analysis. File type: output. `Sample file <https://github.com/bioexcel/biobb_mem/raw/main/biobb_mem/test/reference/ambertools/reference/density_default.dat>`_. Accepted formats: dat (edam:format_1637), agr (edam:format_2033), xmgr (edam:format_2033), gnu (edam:format_2033).
22 output_traj_path (str) (Optional): Path to the output processed trajectory. File type: output. `Sample file <https://github.com/bioexcel/biobb_mem/raw/main/biobb_mem/test/reference/ambertools/trajectory_out.dcd>`_. Accepted formats: mdcrd (edam:format_3878), crd (edam:format_3878), cdf (edam:format_3650), netcdf (edam:format_3650), nc (edam:format_3650), restart (edam:format_3886), ncrestart (edam:format_3886), restartnc (edam:format_3886), dcd (edam:format_3878), charmm (edam:format_3887), cor (edam:format_2033), pdb (edam:format_1476), mol2 (edam:format_3816), trr (edam:format_3910), gro (edam:format_2033), binpos (edam:format_3885), xtc (edam:format_3875), cif (edam:format_1477), arc (edam:format_2333), sqm (edam:format_2033), sdf (edam:format_3814), conflib (edam:format_2033).
23 properties (dic - Python dictionary object containing the tool parameters, not input/output files):
24 * **start** (*int*) - (1) [1~100000|1] Starting frame for slicing
25 * **end** (*int*) - (-1) [-1~100000|1] Ending frame for slicing
26 * **steps** (*int*) - (1) [1~100000|1] Step for slicing
27 * **density_type** (*str*) - ("number") Number, mass, partial charge (q) or electron (Ne - q) density. Electron density will be converted to e-/Å3 by dividing the average area spanned by the other two dimensions.
28 * **mask** (*str*) - ("*") Arbitrary number of masks for atom selection; a dataset is created and the output will contain entries for each mask.. Default: all atoms.
29 * **delta** (*float*) - (0.25) Resolution, i.e. determines number of slices (i.e. histogram bins).
30 * **axis** (*str*) - ("z") Coordinate (axis) for density calculation. Vales: x, y, z.
31 * **bintype** (*str*) - ("bincenter") Determine whether histogram bin coordinates will be based on bin center (default) or bin edges. Values: bicenter, binedge.
32 * **restrict** (*str*) - (None) If specified, only calculate the density within a cylinder or square shape from the specified axis as defined by a distance cutoff. Values: cylinder, square.
33 * **cutoff** (*float*) - (None) The distance cutoff for 'restrict'. Required if 'restrict' is specified.
34 * **binary_path** (*str*) - ("cpptraj") Path to the cpptraj executable binary.
35 * **remove_tmp** (*bool*) - (True) [WF property] Remove temporal files.
36 * **restart** (*bool*) - (False) [WF property] Do not execute if output files exist.
37 * **sandbox_path** (*str*) - ("./") [WF property] Parent path to the sandbox directory.
39 Examples:
40 This is a use example of how to use the building block from Python::
42 from biobb_mem.ambertools.cpptraj_density import cpptraj_density
43 prop = {
44 'density_type': 'number'
45 }
46 cpptraj_density(input_top_path='/path/to/myTopology.top',
47 input_traj_path='/path/to/myTrajectory.xtc',
48 output_cpptraj_path='/path/to/newAnalysis.dat',
49 properties=prop)
51 Info:
52 * wrapped_software:
53 * name: Ambertools Cpptraj
54 * version: >=22.5
55 * license: GNU
56 * ontology:
57 * name: EDAM
58 * schema: http://edamontology.org/EDAM.owl
60 """
62 def __init__(self, input_top_path, input_traj_path, output_cpptraj_path,
63 output_traj_path=None, properties=None, **kwargs) -> None:
64 properties = properties or {}
66 # Call parent class constructor
67 super().__init__(properties)
68 self.locals_var_dict = locals().copy()
70 # Input/Output files
71 self.io_dict = {
72 "in": {"input_top_path": input_top_path, "input_traj_path": input_traj_path},
73 "out": {"output_cpptraj_path": output_cpptraj_path, "output_traj_path": output_traj_path}
74 }
76 # Properties specific for BB
77 self.instructions_file = 'instructions.in'
78 self.start = properties.get('start', 1)
79 self.end = properties.get('end', -1)
80 self.steps = properties.get('steps', 1)
81 self.slice = f' {self.start} {self.end} {self.steps}'
82 self.density_type = properties.get('density_type', 'number')
83 self.mask = properties.get('mask', '*')
84 self.delta = properties.get('delta', 0.25)
85 self.axis = properties.get('axis', 'z')
86 self.bintype = properties.get('bintype', 'bincenter')
87 self.restrict = properties.get('restrict', None)
88 self.cutoff = properties.get('cutoff', None)
89 self.binary_path = properties.get('binary_path', 'cpptraj')
90 self.properties = properties
92 # Check the properties
93 self.check_properties(properties)
94 self.check_arguments()
96 def create_instructions_file(self, stage_io_dict, out_log, err_log):
97 """Creates an input file using the properties file settings."""
98 instructions_list = []
99 # different path if container execution or not
100 self.instructions_file = str(PurePath(fu.create_unique_dir()).joinpath(self.instructions_file))
101 # fu.create_name(prefix=self.prefix, step=self.step, name=self.instructions_file)
102 instructions_list.append('parm ' + stage_io_dict["in"]["input_top_path"])
103 instructions_list.append('trajin ' + stage_io_dict["in"]["input_traj_path"] + self.slice)
104 density_command = f'density {self.density_type} out {stage_io_dict["out"]["output_cpptraj_path"]} {self.mask} delta {self.delta} {self.axis} {self.bintype}'
105 if self.restrict:
106 density_command += f' restrict {self.restrict}'
107 if self.cutoff:
108 density_command += f' cutoff {self.cutoff}'
109 instructions_list.append(density_command)
111 # trajout
112 if ("output_traj_path" in stage_io_dict["out"]):
113 instructions_list.append('trajout ' + stage_io_dict["out"]["output_traj_path"])
115 # create .in file
116 with open(self.instructions_file, 'w') as mdp:
117 for line in instructions_list:
118 mdp.write(line.strip() + '\n')
120 return self.instructions_file
122 @launchlogger
123 def launch(self) -> int:
124 """Execute the :class:`CpptrajDensity <ambertools.cpptraj_density.CpptrajDensity>` ambertools.cpptraj_density.CpptrajDensity object."""
126 # Setup Biobb
127 if self.check_restart():
128 return 0
129 self.stage_files()
131 # create instructions file
132 self.create_instructions_file(self.stage_io_dict, self.out_log, self.err_log)
133 # create cmd and launch execution
134 self.cmd = [self.binary_path, '-i', self.instructions_file]
136 # Run Biobb block
137 self.run_biobb()
138 # Copy files to host
139 self.copy_to_host()
140 # remove temporary folder(s)
141 self.tmp_files.extend([
142 self.stage_io_dict.get("unique_dir"),
143 PurePath(self.instructions_file).parent
144 ])
145 self.remove_tmp_files()
147 self.check_arguments(output_files_created=True, raise_exception=False)
149 return self.return_code
152def cpptraj_density(input_top_path: str, input_traj_path: str, output_cpptraj_path: str, output_traj_path: str = None, properties: dict = None, **kwargs) -> int:
153 """Execute the :class:`CpptrajDensity <ambertools.cpptraj_density.CpptrajDensity>` class and
154 execute the :meth:`launch() <ambertools.cpptraj_density.CpptrajDensity.launch>` method."""
156 return CpptrajDensity(input_top_path=input_top_path,
157 input_traj_path=input_traj_path,
158 output_cpptraj_path=output_cpptraj_path,
159 output_traj_path=output_traj_path,
160 properties=properties, **kwargs).launch()
163def main():
164 """Command line execution of this building block. Please check the command line documentation."""
165 parser = argparse.ArgumentParser(description="Calculates the density along an axis of a given cpptraj compatible trajectory.", formatter_class=lambda prog: argparse.RawTextHelpFormatter(prog, width=99999))
166 parser.add_argument('--config', required=False, help='Configuration file')
168 # Specific args of each building block
169 required_args = parser.add_argument_group('required arguments')
170 required_args.add_argument('--input_top_path', required=True, help='Path to the input structure or topology file. Accepted formats: top, pdb, prmtop, parmtop, zip.')
171 required_args.add_argument('--input_traj_path', required=True, help='Path to the input trajectory to be processed. Accepted formats: crd, cdf, netcdf, restart, ncrestart, restartnc, dcd, charmm, cor, pdb, mol2, trr, gro, binpos, xtc, cif, arc, sqm, sdf, conflib.')
172 required_args.add_argument('--output_cpptraj_path', required=True, help='Path to the output processed analysis.')
173 parser.add_argument('--output_traj_path', required=False, help='Path to the output processed trajectory.')
175 args = parser.parse_args()
176 args.config = args.config or "{}"
177 properties = settings.ConfReader(config=args.config).get_prop_dic()
179 # Specific call of each building block
180 cpptraj_density(input_top_path=args.input_top_path,
181 input_traj_path=args.input_traj_path,
182 output_cpptraj_path=args.output_cpptraj_path,
183 output_traj_path=args.output_traj_path,
184 properties=properties)
187if __name__ == '__main__':
188 main()