Coverage for biobb_analysis/ambertools/cpptraj_rgyr.py: 82%

78 statements  

« prev     ^ index     » next       coverage.py v7.5.1, created at 2024-05-06 15:22 +0000

1#!/usr/bin/env python3 

2 

3"""Module containing the Cpptraj Rgyr 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 

10from biobb_analysis.ambertools.common import get_default_value, check_top_path, check_traj_path, check_out_path, get_binary_path, get_in_parameters, get_negative_mask, copy_instructions_file_to_container, setup_structure 

11 

12 

13class CpptrajRgyr(BiobbObject): 

14 """ 

15 | biobb_analysis CpptrajRgyr 

16 | Wrapper of the Ambertools Cpptraj module for computing the radius of gyration (Rgyr) from a given cpptraj compatible trajectory. 

17 | 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://amber-md.github.io/cpptraj/CPPTRAJ.xhtml>`_. 

18 

19 Args: 

20 input_top_path (str): Path to the input structure or topology file. File type: input. `Sample file <https://github.com/bioexcel/biobb_analysis/raw/master/biobb_analysis/test/data/ambertools/cpptraj.parm.top>`_. Accepted formats: top (edam:format_3881), pdb (edam:format_1476), prmtop (edam:format_3881), parmtop (edam:format_3881), zip (edam:format_3987). 

21 input_traj_path (str): Path to the input trajectory to be processed. File type: input. `Sample file <https://github.com/bioexcel/biobb_analysis/raw/master/biobb_analysis/test/data/ambertools/cpptraj.traj.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). 

22 output_cpptraj_path (str): Path to the output analysis. File type: output. `Sample file <https://github.com/bioexcel/biobb_analysis/raw/master/biobb_analysis/test/reference/ambertools/ref_cpptraj.rgyr.dat>`_. Accepted formats: dat (edam:format_1637), agr (edam:format_2033), xmgr (edam:format_2033), gnu (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 * **mask** (*str*) - ("all-atoms") Mask definition. Values: c-alpha (All c-alpha atoms; protein only), backbone (Backbone atoms), all-atoms (All system atoms), heavy-atoms (System heavy atoms; not hydrogen), side-chain (All not backbone atoms), solute (All system atoms except solvent atoms), ions (All ion molecules), solvent (All solvent atoms), AnyAmberFromatMask (Amber atom selection syntax like `@*`). 

28 * **binary_path** (*str*) - ("cpptraj") Path to the cpptraj executable binary. 

29 * **remove_tmp** (*bool*) - (True) [WF property] Remove temporal files. 

30 * **restart** (*bool*) - (False) [WF property] Do not execute if output files exist. 

31 * **container_path** (*str*) - (None) Container path definition. 

32 * **container_image** (*str*) - ('afandiadib/ambertools:serial') Container image definition. 

33 * **container_volume_path** (*str*) - ('/tmp') Container volume path definition. 

34 * **container_working_dir** (*str*) - (None) Container working directory definition. 

35 * **container_user_id** (*str*) - (None) Container user_id definition. 

36 * **container_shell_path** (*str*) - ('/bin/bash') Path to default shell inside the container. 

37 

38 Examples: 

39 This is a use example of how to use the building block from Python:: 

40 

41 from biobb_analysis.ambertools.cpptraj_rgyr import cpptraj_rgyr 

42 prop = { 

43 'start': 1, 

44 'end': -1, 

45 'steps': 1, 

46 'mask': 'c-alpha' 

47 } 

48 cpptraj_rgyr(input_top_path='/path/to/myTopology.top', 

49 input_traj_path='/path/to/myTrajectory.dcd', 

50 output_cpptraj_path='/path/to/newAnalysis.dat', 

51 properties=prop) 

52 

53 Info: 

54 * wrapped_software: 

55 * name: Ambertools Cpptraj 

56 * version: >=20.0 

57 * license: GNU 

58 * ontology: 

59 * name: EDAM 

60 * schema: http://edamontology.org/EDAM.owl 

61 

62 """ 

63 

64 def __init__(self, input_top_path, input_traj_path, output_cpptraj_path, 

65 properties=None, **kwargs) -> None: 

66 properties = properties or {} 

67 

68 # Call parent class constructor 

69 super().__init__(properties) 

70 self.locals_var_dict = locals().copy() 

71 

72 # Input/Output files 

73 self.io_dict = { 

74 "in": {"input_top_path": input_top_path, "input_traj_path": input_traj_path}, 

75 "out": {"output_cpptraj_path": output_cpptraj_path} 

76 } 

77 

78 # Properties specific for BB 

79 self.instructions_file = get_default_value('instructions_file') 

80 self.start = properties.get('start', 1) 

81 self.end = properties.get('end', -1) 

82 self.steps = properties.get('steps', 1) 

83 self.mask = properties.get('mask', 'all-atoms') 

84 self.properties = properties 

85 self.binary_path = get_binary_path(properties, 'binary_path') 

86 

87 # Check the properties 

88 self.check_properties(properties) 

89 self.check_arguments() 

90 

91 def check_data_params(self, out_log, err_log): 

92 """ Checks all the input/output paths and parameters """ 

93 self.io_dict["in"]["input_top_path"], self.input_top_path_orig = check_top_path(self.io_dict["in"]["input_top_path"], out_log, self.__class__.__name__) 

94 self.io_dict["in"]["input_traj_path"] = check_traj_path(self.io_dict["in"]["input_traj_path"], out_log, self.__class__.__name__) 

95 self.io_dict["out"]["output_cpptraj_path"] = check_out_path(self.io_dict["out"]["output_cpptraj_path"], out_log, self.__class__.__name__) 

96 self.in_parameters = {'start': self.start, 'end': self.end, 'step': self.steps, 'mask': self.mask} 

97 

98 def create_instructions_file(self, container_io_dict, out_log, err_log): 

99 """Creates an input file using the properties file settings""" 

100 instructions_list = [] 

101 # different path if container execution or not 

102 if self.container_path: 

103 self.instructions_file = str(PurePath(self.container_volume_path).joinpath(self.instructions_file)) 

104 else: 

105 self.instructions_file = str(PurePath(fu.create_unique_dir()).joinpath(self.instructions_file)) 

106 fu.create_name(prefix=self.prefix, step=self.step, name=self.instructions_file) 

107 

108 # parm 

109 instructions_list.append('parm ' + container_io_dict["in"]["input_top_path"]) 

110 

111 # trajin 

112 in_params = get_in_parameters(self.in_parameters, out_log) 

113 instructions_list.append('trajin ' + container_io_dict["in"]["input_traj_path"] + ' ' + in_params) 

114 

115 # Set up 

116 instructions_list += setup_structure(self) 

117 

118 # mask 

119 mask = self.in_parameters.get('mask', '') 

120 if mask: 

121 strip_mask = get_negative_mask(mask, out_log) 

122 instructions_list.append('strip ' + strip_mask) 

123 

124 # output 

125 instructions_list.append('radgyr time 1 out ' + container_io_dict["out"]["output_cpptraj_path"]) 

126 

127 # create .in file 

128 with open(self.instructions_file, 'w') as mdp: 

129 for line in instructions_list: 

130 mdp.write(line.strip() + '\n') 

131 

132 return self.instructions_file 

133 

134 @launchlogger 

135 def launch(self) -> int: 

136 """Execute the :class:`CpptrajRgyr <ambertools.cpptraj_rgyr.CpptrajRgyr>` ambertools.cpptraj_rgyr.CpptrajRgyr object.""" 

137 

138 # check input/output paths and parameters 

139 self.check_data_params(self.out_log, self.err_log) 

140 

141 # Setup Biobb 

142 if self.check_restart(): 

143 return 0 

144 self.stage_files() 

145 

146 # create instructions file 

147 self.create_instructions_file(self.stage_io_dict, self.out_log, self.err_log) 

148 

149 # if container execution, copy intructions file to container 

150 if self.container_path: 

151 copy_instructions_file_to_container(self.instructions_file, self.stage_io_dict['unique_dir']) 

152 

153 # create cmd and launch execution 

154 self.cmd = [self.binary_path, '-i', self.instructions_file] 

155 

156 # Run Biobb block 

157 self.run_biobb() 

158 

159 # Copy files to host 

160 self.copy_to_host() 

161 

162 # remove temporary folder(s) 

163 self.tmp_files.extend([ 

164 self.stage_io_dict.get("unique_dir"), 

165 PurePath(self.instructions_file).parent 

166 ]) 

167 self.remove_tmp_files() 

168 

169 self.check_arguments(output_files_created=True, raise_exception=False) 

170 

171 return self.return_code 

172 

173 

174def cpptraj_rgyr(input_top_path: str, input_traj_path: str, output_cpptraj_path: str, properties: dict = None, **kwargs) -> int: 

175 """Execute the :class:`CpptrajRgyr <ambertools.cpptraj_rgyr.CpptrajRgyr>` class and 

176 execute the :meth:`launch() <ambertools.cpptraj_rgyr.CpptrajRgyr.launch>` method.""" 

177 

178 return CpptrajRgyr(input_top_path=input_top_path, 

179 input_traj_path=input_traj_path, 

180 output_cpptraj_path=output_cpptraj_path, 

181 properties=properties, **kwargs).launch() 

182 

183 

184def main(): 

185 """Command line execution of this building block. Please check the command line documentation.""" 

186 parser = argparse.ArgumentParser(description="Computes the radius of gyration (Rgyr) from a given cpptraj compatible trajectory.", formatter_class=lambda prog: argparse.RawTextHelpFormatter(prog, width=99999)) 

187 parser.add_argument('--config', required=False, help='Configuration file') 

188 

189 # Specific args of each building block 

190 required_args = parser.add_argument_group('required arguments') 

191 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.') 

192 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.') 

193 required_args.add_argument('--output_cpptraj_path', required=True, help='Path to the output analysis.') 

194 

195 args = parser.parse_args() 

196 args.config = args.config or "{}" 

197 properties = settings.ConfReader(config=args.config).get_prop_dic() 

198 

199 # Specific call of each building block 

200 cpptraj_rgyr(input_top_path=args.input_top_path, 

201 input_traj_path=args.input_traj_path, 

202 output_cpptraj_path=args.output_cpptraj_path, 

203 properties=properties) 

204 

205 

206if __name__ == '__main__': 

207 main()