Mercurial > repos > deepakjadmin > mayatool3_test2
comparison lib/MolecularDescriptors/TPSADescriptors.pm @ 0:4816e4a8ae95 draft default tip
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 09:23:18 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4816e4a8ae95 |
---|---|
1 package MolecularDescriptors::TPSADescriptors; | |
2 # | |
3 # $RCSfile: TPSADescriptors.pm,v $ | |
4 # $Date: 2015/02/28 20:49:20 $ | |
5 # $Revision: 1.18 $ | |
6 # | |
7 # Author: Manish Sud <msud@san.rr.com> | |
8 # | |
9 # Copyright (C) 2015 Manish Sud. All rights reserved. | |
10 # | |
11 # This file is part of MayaChemTools. | |
12 # | |
13 # MayaChemTools is free software; you can redistribute it and/or modify it under | |
14 # the terms of the GNU Lesser General Public License as published by the Free | |
15 # Software Foundation; either version 3 of the License, or (at your option) any | |
16 # later version. | |
17 # | |
18 # MayaChemTools is distributed in the hope that it will be useful, but without | |
19 # any warranty; without even the implied warranty of merchantability of fitness | |
20 # for a particular purpose. See the GNU Lesser General Public License for more | |
21 # details. | |
22 # | |
23 # You should have received a copy of the GNU Lesser General Public License | |
24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or | |
25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, | |
26 # Boston, MA, 02111-1307, USA. | |
27 # | |
28 | |
29 use strict; | |
30 use Carp; | |
31 use Exporter; | |
32 use Scalar::Util (); | |
33 use TextUtil (); | |
34 use MathUtil (); | |
35 use Atom; | |
36 use Molecule; | |
37 use MolecularDescriptors::MolecularDescriptors; | |
38 use AtomTypes::TPSAAtomTypes; | |
39 | |
40 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); | |
41 | |
42 @ISA = qw(MolecularDescriptors::MolecularDescriptors Exporter); | |
43 @EXPORT = qw(); | |
44 @EXPORT_OK = qw(GetDescriptorNames); | |
45 | |
46 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); | |
47 | |
48 # Setup class variables... | |
49 my($ClassName, @DescriptorNames); | |
50 _InitializeClass(); | |
51 | |
52 # Overload Perl functions... | |
53 use overload '""' => 'StringifyTPSADescriptors'; | |
54 | |
55 # Class constructor... | |
56 sub new { | |
57 my($Class, %NamesAndValues) = @_; | |
58 | |
59 # Initialize object... | |
60 my $This = $Class->SUPER::new(); | |
61 bless $This, ref($Class) || $Class; | |
62 $This->_InitializeTPSADescriptors(); | |
63 | |
64 $This->_InitializeTPSADescriptorsProperties(%NamesAndValues); | |
65 | |
66 return $This; | |
67 } | |
68 | |
69 # Initialize class ... | |
70 sub _InitializeClass { | |
71 #Class name... | |
72 $ClassName = __PACKAGE__; | |
73 | |
74 # Descriptor names... | |
75 @DescriptorNames = ('TPSA'); | |
76 | |
77 } | |
78 | |
79 # Get descriptor names as an array. | |
80 # | |
81 # This functionality can be either invoked as a class function or an | |
82 # object method. | |
83 # | |
84 sub GetDescriptorNames { | |
85 return @DescriptorNames; | |
86 } | |
87 | |
88 # Initialize object data... | |
89 # | |
90 sub _InitializeTPSADescriptors { | |
91 my($This) = @_; | |
92 | |
93 # Type of MolecularDescriptor... | |
94 $This->{Type} = 'TPSA'; | |
95 | |
96 # By default, TPSA atom contributions from Phosphorus and Sulfur atoms | |
97 # are not included during TPSA calculations. [ Ref 91 ] | |
98 # | |
99 $This->{IgnorePhosphorus} = 1; | |
100 $This->{IgnoreSulfur} = 1; | |
101 | |
102 # TPSA atom types assigned to appropriate atoms... | |
103 %{$This->{AtomTypes}} = (); | |
104 | |
105 # Intialize descriptor names and values... | |
106 $This->_InitializeDescriptorNamesAndValues(@DescriptorNames); | |
107 | |
108 return $This; | |
109 } | |
110 | |
111 # Initialize object properties... | |
112 # | |
113 sub _InitializeTPSADescriptorsProperties { | |
114 my($This, %NamesAndValues) = @_; | |
115 | |
116 my($Name, $Value, $MethodName); | |
117 while (($Name, $Value) = each %NamesAndValues) { | |
118 $MethodName = "Set${Name}"; | |
119 $This->$MethodName($Value); | |
120 } | |
121 | |
122 return $This; | |
123 } | |
124 | |
125 # Calculate Topological Polar Surface Area (TPSA) value [ Ref 90-91 ] for molecule... | |
126 # | |
127 # Methodology: | |
128 # . Assign TPSA atom types [ Ref 90-91 ] to Nitrogen and Oxygen | |
129 # atoms with optional assignment to Phosphorus and Sulfur atoms. | |
130 # . Calculate TPSA value adding contribution of appropriate atom types. | |
131 # | |
132 sub GenerateDescriptors { | |
133 my($This) = @_; | |
134 | |
135 # Initialize descriptor values... | |
136 $This->_InitializeDescriptorValues(); | |
137 | |
138 # Check availability of molecule... | |
139 if (!$This->{Molecule}) { | |
140 carp "Warning: ${ClassName}->GenerateDescriptors: $This->{Type} molecular descriptors generation didn't succeed: Molecule data is not available: Molecule object hasn't been set..."; | |
141 return undef; | |
142 } | |
143 | |
144 # Cache appropriate molecule data... | |
145 $This->_SetupMoleculeDataCache(); | |
146 | |
147 # Assign TPSA atom types... | |
148 if (!$This->_AssignAtomTypes()) { | |
149 carp "Warning: ${ClassName}->GenerateDescriptors: $This->{Type} molecular descriptors generation didn't succeed: Couldn't assign valid TPSA atom types to appropriate atoms..."; | |
150 return undef; | |
151 } | |
152 | |
153 # Calculate descriptor values... | |
154 if (!$This->_CalculateDescriptorValues()) { | |
155 carp "Warning: ${ClassName}->GenerateDescriptors: $This->{Type} molecular descriptors generation didn't succeed: Couldn't calculate TPSA values corresponding to assigned TPSA atom types..."; | |
156 return undef; | |
157 } | |
158 | |
159 # Set final descriptor values... | |
160 $This->_SetFinalDescriptorValues(); | |
161 | |
162 # Clear cached molecule data... | |
163 $This->_ClearMoleculeDataCache(); | |
164 | |
165 return $This; | |
166 } | |
167 | |
168 # Assign TPSA atom types.. | |
169 # | |
170 sub _AssignAtomTypes { | |
171 my($This) = @_; | |
172 my($TPSAAtomTypes, $Atom, $AtomID); | |
173 | |
174 %{$This->{AtomTypes}} = (); | |
175 | |
176 # Assign atom types... | |
177 $TPSAAtomTypes = new AtomTypes::TPSAAtomTypes('Molecule' => $This->{Molecule}, 'IgnorePhosphorus' => $This->{IgnorePhosphorus}, 'IgnoreSulfur' => $This->{IgnoreSulfur}); | |
178 $TPSAAtomTypes->AssignAtomTypes(); | |
179 | |
180 # Make sure TPSA atom types assignment is successful... | |
181 if (!$TPSAAtomTypes->IsAtomTypesAssignmentSuccessful()) { | |
182 return undef; | |
183 } | |
184 | |
185 # Collect assigned atom types... | |
186 for $Atom (@{$This->{Atoms}}) { | |
187 $AtomID = $Atom->GetID(); | |
188 $This->{AtomTypes}{$AtomID} = $TPSAAtomTypes->GetAtomType($Atom); | |
189 } | |
190 | |
191 return $This; | |
192 } | |
193 | |
194 # Calculate TPSA value... | |
195 # | |
196 sub _CalculateDescriptorValues { | |
197 my($This) = @_; | |
198 my($Atom, $AtomID, $TPSA, $TPSAContribution, $TPSADataRef, $AtomType); | |
199 | |
200 $TPSA = 0; | |
201 | |
202 # Get TPSA atom types data... | |
203 $TPSADataRef = AtomTypes::TPSAAtomTypes::GetTPSAAtomTypesData(); | |
204 | |
205 ATOM: for $Atom (@{$This->{Atoms}}) { | |
206 $AtomID = $Atom->GetID(); | |
207 $AtomType = $This->{AtomTypes}{$AtomID}; | |
208 | |
209 # Ignore inappropriate atoms... | |
210 if ($AtomType =~ /^None$/i) { | |
211 next ATOM; | |
212 } | |
213 | |
214 $TPSAContribution = 0.0; | |
215 | |
216 if ($AtomType =~ /^(N|O)$/i) { | |
217 # TPSA contributions for Nitrogen and Oxygen atoms not explicity defined using atom | |
218 # environments in Table 1 [ Ref 90 ] | |
219 if ($AtomType =~ /^N$/i) { | |
220 # N = 30.5 - X*8.2 + H*1.5 or 0.0 for negative value | |
221 $TPSAContribution = 30.5 - $Atom->GetAtomicInvariantValue('X') * 8.2 + $Atom->GetAtomicInvariantValue('H') * 1.5; | |
222 } | |
223 elsif ($AtomType =~ /^O$/i) { | |
224 # O = 28.5 - X*8.6 + H*1.5 or 0.0 for negative value | |
225 $TPSAContribution = 28.5 - $Atom->GetAtomicInvariantValue('X') * 8.6 + $Atom->GetAtomicInvariantValue('H') * 1.5; | |
226 } | |
227 if ($TPSAContribution < 0.0) { | |
228 $TPSAContribution = 0.0; | |
229 } | |
230 } | |
231 elsif (exists $TPSADataRef->{DataCol3}{$AtomType}) { | |
232 # Data for TPSA contribution is in column number 3... | |
233 $TPSAContribution = $TPSADataRef->{DataCol3}{$AtomType}; | |
234 } | |
235 else { | |
236 # No TPSA data for assigned atom type... | |
237 return undef; | |
238 } | |
239 $TPSA += $TPSAContribution; | |
240 } | |
241 | |
242 # Track the calculated values... | |
243 $This->{TPSA} = MathUtil::round($TPSA, 2); | |
244 | |
245 return $This; | |
246 } | |
247 | |
248 # Setup final descriptor values... | |
249 # | |
250 sub _SetFinalDescriptorValues { | |
251 my($This) = @_; | |
252 | |
253 $This->{DescriptorsGenerated} = 1; | |
254 | |
255 $This->SetDescriptorValues($This->{TPSA}); | |
256 | |
257 return $This; | |
258 } | |
259 | |
260 # Cache appropriate molecule data... | |
261 # | |
262 sub _SetupMoleculeDataCache { | |
263 my($This) = @_; | |
264 | |
265 @{$This->{Atoms}} = $This->GetMolecule()->GetAtoms(); | |
266 | |
267 return $This; | |
268 } | |
269 | |
270 # Clear cached molecule data... | |
271 # | |
272 sub _ClearMoleculeDataCache { | |
273 my($This) = @_; | |
274 | |
275 @{$This->{Atoms}} = (); | |
276 | |
277 return $This; | |
278 } | |
279 | |
280 # Return a string containg data for TPSADescriptors object... | |
281 # | |
282 sub StringifyTPSADescriptors { | |
283 my($This) = @_; | |
284 my($TPSADescriptorsString); | |
285 | |
286 # Type of MolecularDescriptors... | |
287 $TPSADescriptorsString = "MolecularDescriptorType: $This->{Type}; IgnorePhosphorus: " . ($This->{IgnorePhosphorus} ? "Yes" : "No") . "; IgnoreSulfur: " . ($This->{IgnoreSulfur} ? "Yes" : "No"); | |
288 | |
289 # Setup molecular descriptor information... | |
290 $TPSADescriptorsString .= "; " . $This->_StringifyDescriptorNamesAndValues(); | |
291 | |
292 return $TPSADescriptorsString; | |
293 } | |
294 | |
295 # Is it a TPSADescriptors object? | |
296 sub _IsTPSADescriptors { | |
297 my($Object) = @_; | |
298 | |
299 return (Scalar::Util::blessed($Object) && $Object->isa($ClassName)) ? 1 : 0; | |
300 } | |
301 | |
302 1; | |
303 | |
304 __END__ | |
305 | |
306 =head1 NAME | |
307 | |
308 TPSADescriptors | |
309 | |
310 =head1 SYNOPSIS | |
311 | |
312 use MolecularDescriptors::TPSADescriptors; | |
313 | |
314 use MolecularDescriptors::TPSADescriptors qw(:all); | |
315 | |
316 =head1 DESCRIPTION | |
317 | |
318 B<TPSADescriptors> class provides the following methods: | |
319 | |
320 new, GenerateDescriptors, GetDescriptorNames, StringifyTPSADescriptors | |
321 | |
322 B<TPSADescriptors> is derived from B<MolecularDescriptors> class which in turn | |
323 is derived from B<ObjectProperty> base class that provides methods not explicitly defined | |
324 in B<TPSADescriptors>, B<MolecularDescriptors> or B<ObjectProperty> classes using Perl's | |
325 AUTOLOAD functionality. These methods are generated on-the-fly for a specified object property: | |
326 | |
327 Set<PropertyName>(<PropertyValue>); | |
328 $PropertyValue = Get<PropertyName>(); | |
329 Delete<PropertyName>(); | |
330 | |
331 After Topological Polar Surface Area (TPSA) atom types [ Ref 90-91 ] has been assigned | |
332 to appropriate atoms in a molecule using AtomTypes::TPSAAtomTypes.pm module, TPSA value | |
333 is calculated by adding up contributions of each appropriate atom type. | |
334 | |
335 By default, MayaChemTools only uses nitrogen and oxygen atoms during calculation | |
336 of TPSA and ignores phosphorous and sulfur atoms. [ Ref 90 - 91 ] | |
337 | |
338 =head2 METHODS | |
339 | |
340 =over 4 | |
341 | |
342 =item B<new> | |
343 | |
344 $NewTPSADescriptors = new MolecularDescriptors::TPSADescriptors( | |
345 %NamesAndValues); | |
346 | |
347 Using specified I<TPSADescriptors> property names and values hash, B<new> | |
348 method creates a new object and returns a reference to newly created B<TPSADescriptors> | |
349 object. By default, the following properties are initialized: | |
350 | |
351 Molecule = '' | |
352 Type = 'TPSA' | |
353 IgnorePhosphorus = 1 | |
354 IgnoreSulfur = 1 | |
355 @DescriptorNames = ('TPSA') | |
356 @DescriptorValues = ('None') | |
357 | |
358 Examples: | |
359 | |
360 $TPSADescriptors = new MolecularDescriptors::TPSADescriptors( | |
361 'Molecule' => $Molecule); | |
362 | |
363 $TPSADescriptors = new MolecularDescriptors::TPSADescriptors(); | |
364 | |
365 $TPSADescriptors = new MolecularDescriptors::TPSADescriptors( | |
366 'IgnorePhosphorus' => 0, | |
367 'IgnoreSulfur' => 0); | |
368 | |
369 $TPSADescriptors->SetMolecule($Molecule); | |
370 $TPSADescriptors->GenerateDescriptors(); | |
371 print "TPSADescriptors: $TPSADescriptors\n"; | |
372 | |
373 | |
374 =item B<GenerateDescriptors> | |
375 | |
376 $TPSADescriptors->GenerateDescriptors(); | |
377 | |
378 Calculate TPSA value for a molecule and returns I<TPSADescriptors>. | |
379 | |
380 =item B<GetDescriptorNames> | |
381 | |
382 @DescriptorNames = $TPSADescriptors->GetDescriptorNames(); | |
383 @DescriptorNames = MolecularDescriptors::TPSADescriptors:: | |
384 GetDescriptorNames(); | |
385 | |
386 Returns all available descriptor names as an array. | |
387 | |
388 =item B<StringifyTPSADescriptors> | |
389 | |
390 $String = $TPSADescriptors->StringifyTPSADescriptors(); | |
391 | |
392 Returns a string containing information about I<TPSADescriptors> object. | |
393 | |
394 =back | |
395 | |
396 =head1 AUTHOR | |
397 | |
398 Manish Sud <msud@san.rr.com> | |
399 | |
400 =head1 SEE ALSO | |
401 | |
402 MolecularDescriptors.pm, MolecularDescriptorsGenerator.pm | |
403 | |
404 =head1 COPYRIGHT | |
405 | |
406 Copyright (C) 2015 Manish Sud. All rights reserved. | |
407 | |
408 This file is part of MayaChemTools. | |
409 | |
410 MayaChemTools is free software; you can redistribute it and/or modify it under | |
411 the terms of the GNU Lesser General Public License as published by the Free | |
412 Software Foundation; either version 3 of the License, or (at your option) | |
413 any later version. | |
414 | |
415 =cut |