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

61 statements  

« prev     ^ index     » next       coverage.py v7.10.6, created at 2025-09-08 10:47 +0000

1#!/usr/bin/env python3 

2 

3"""Module containing the Cpptraj Rgyr class and the command line interface.""" 

4 

5from typing import Optional 

6from pathlib import PurePath 

7from biobb_common.generic.biobb_object import BiobbObject 

8from biobb_common.tools.file_utils import launchlogger 

9from 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, setup_structure 

10 

11 

12class CpptrajRgyr(BiobbObject): 

13 """ 

14 | biobb_analysis CpptrajRgyr 

15 | Wrapper of the Ambertools Cpptraj module for computing the radius of gyration (Rgyr) from 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>`_. 

17 

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_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). 

20 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). 

21 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). 

22 properties (dic - Python dictionary object containing the tool parameters, not input/output files): 

23 * **start** (*int*) - (1) [1~100000|1] Starting frame for slicing. 

24 * **end** (*int*) - (-1) [-1~100000|1] Ending frame for slicing. 

25 * **steps** (*int*) - (1) [1~100000|1] Step for slicing. 

26 * **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 `@*`). 

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

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

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

30 * **sandbox_path** (*str*) - ("./") [WF property] Parent path to the sandbox directory. 

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: >=22.5 

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_init(properties) 

89 

90 def check_data_params(self, out_log, err_log): 

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

92 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__) 

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

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

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

96 

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

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

99 instructions_list = [] 

100 # different path if container execution or not 

101 if self.container_path: 

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

103 else: 

104 self.instructions_file = self.create_tmp_file(self.instructions_file) 

105 

106 # parm 

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

108 

109 # trajin 

110 in_params = get_in_parameters(self.in_parameters, out_log) 

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

112 

113 # Set up 

114 instructions_list += setup_structure(self) 

115 

116 # mask 

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

118 if mask: 

119 strip_mask = get_negative_mask(mask, out_log) 

120 instructions_list.append('strip ' + strip_mask) 

121 

122 # output 

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

124 

125 # create .in file 

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

127 for line in instructions_list: 

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

129 

130 return self.instructions_file 

131 

132 @launchlogger 

133 def launch(self) -> int: 

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

135 

136 # check input/output paths and parameters 

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

138 

139 # Setup Biobb 

140 if self.check_restart(): 

141 return 0 

142 self.stage_files() 

143 

144 # create instructions file 

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

146 

147 # create cmd and launch execution 

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

149 

150 # Run Biobb block 

151 self.run_biobb() 

152 

153 # Copy files to host 

154 self.copy_to_host() 

155 

156 # remove temporary folder(s) 

157 self.remove_tmp_files() 

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

159 

160 return self.return_code 

161 

162 

163def cpptraj_rgyr(input_top_path: str, input_traj_path: str, output_cpptraj_path: str, properties: Optional[dict] = None, **kwargs) -> int: 

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

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

166 return CpptrajRgyr(**dict(locals())).launch() 

167 

168 

169cpptraj_rgyr.__doc__ = CpptrajRgyr.__doc__ 

170main = CpptrajRgyr.get_main(cpptraj_rgyr, "Computes the radius of gyration (Rgyr) from a given cpptraj compatible trajectory.") 

171 

172if __name__ == '__main__': 

173 main()