annotate mayachemtools/lib/MolecularFormula.pm @ 2:dfff2614510e draft

Deleted selected files
author deepakjadmin
date Wed, 20 Jan 2016 12:15:15 -0500
parents 73ae111cf86f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
1 package MolecularFormula;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
2 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
3 # $RCSfile: MolecularFormula.pm,v $
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
4 # $Date: 2015/02/28 20:47:18 $
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
5 # $Revision: 1.25 $
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
6 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
7 # Author: Manish Sud <msud@san.rr.com>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
8 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
9 # Copyright (C) 2015 Manish Sud. All rights reserved.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
10 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
11 # This file is part of MayaChemTools.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
12 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
13 # MayaChemTools is free software; you can redistribute it and/or modify it under
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
14 # the terms of the GNU Lesser General Public License as published by the Free
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
15 # Software Foundation; either version 3 of the License, or (at your option) any
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
16 # later version.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
17 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
18 # MayaChemTools is distributed in the hope that it will be useful, but without
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
19 # any warranty; without even the implied warranty of merchantability of fitness
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
20 # for a particular purpose. See the GNU Lesser General Public License for more
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
21 # details.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
22 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
23 # You should have received a copy of the GNU Lesser General Public License
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
26 # Boston, MA, 02111-1307, USA.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
27 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
28
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
29 use strict;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
30 use Carp;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
31 use Text::ParseWords;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
32 use TextUtil;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
33 use PeriodicTable;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
34
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
35 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
36
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
37 @ISA = qw(Exporter);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
38 @EXPORT = qw();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
39 @EXPORT_OK = qw(CalculateMolecularWeight CalculateExactMass CalculateElementalComposition FormatCompositionInfomation GetElementsAndCount IsMolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
40
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
41 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
42
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
43 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
44 # Calculate molecular weight assuming its a valid molecular formula...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
45 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
46 sub CalculateMolecularWeight {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
47 my($MolecularFormula) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
48 my($Index, $MolecularWeight, $ElementSymbol, $ElementCount, $AtomicWeight, $FormulaElementsRef, $FormulaElementCountRef);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
49
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
50 ($FormulaElementsRef, $FormulaElementCountRef) = _ProcessMolecularFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
51 if (!(defined($FormulaElementsRef) && defined($FormulaElementCountRef))) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
52 return undef;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
53 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
54
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
55 $MolecularWeight = 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
56
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
57 for $Index (0 .. $#{$FormulaElementsRef}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
58 $ElementSymbol = $FormulaElementsRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
59 $ElementCount = $FormulaElementCountRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
60 $AtomicWeight = PeriodicTable::GetElementAtomicWeight($ElementSymbol);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
61 $MolecularWeight += $AtomicWeight * $ElementCount;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
62 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
63 return $MolecularWeight;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
64 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
65
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
66 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
67 # Calculate exact mass assuming it's a valid formula...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
68 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
69 sub CalculateExactMass {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
70 my($MolecularFormula) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
71 my($Index, $ElementSymbol, $ElementCount, $ExactMass, $RelativeAtomicMass, $FormulaElementsRef, $FormulaElementCountRef);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
72
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
73 ($FormulaElementsRef, $FormulaElementCountRef) = _ProcessMolecularFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
74 if (!(defined($FormulaElementsRef) && defined($FormulaElementCountRef))) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
75 return undef;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
76 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
77 $ExactMass = 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
78
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
79 for $Index (0 .. $#{$FormulaElementsRef}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
80 $ElementSymbol = $FormulaElementsRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
81 $ElementCount = $FormulaElementCountRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
82 $RelativeAtomicMass = PeriodicTable::GetElementMostAbundantNaturalIsotopeMass($ElementSymbol);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
83 if (!defined($RelativeAtomicMass)) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
84 next ELEMENT;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
85 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
86 $ExactMass += $RelativeAtomicMass * $ElementCount;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
87 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
88 return $ExactMass;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
89 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
90
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
91
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
92 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
93 # Calculate elemental composition and return reference to arrays
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
94 # containing elements and their percent composition...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
95 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
96 sub CalculateElementalComposition {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
97 my($MolecularFormula) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
98 my($Index, $MolecularWeight, $ElementSymbol, $ElementCount, $AtomicWeight, $Composition, $CompositionMultiplier, $FormulaElementsRef, $FormulaElementCountRef, @FormulaElements, @FormulaElementComposition);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
99
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
100 $MolecularWeight = CalculateMolecularWeight($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
101 if (! defined $MolecularWeight) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
102 return (undef, undef);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
103 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
104 ($FormulaElementsRef, $FormulaElementCountRef) = _ProcessMolecularFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
105
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
106 @FormulaElements = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
107 @FormulaElementComposition = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
108
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
109 if (!$MolecularWeight) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
110 return ( \@FormulaElements, \@FormulaElementComposition);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
111 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
112
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
113 $CompositionMultiplier = 100 / $MolecularWeight;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
114
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
115 for $Index (0 .. $#{$FormulaElementsRef}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
116 $ElementSymbol = $FormulaElementsRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
117 $ElementCount = $FormulaElementCountRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
118 $AtomicWeight = PeriodicTable::GetElementAtomicWeight($ElementSymbol);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
119 $Composition = ($AtomicWeight * $ElementCount) * $CompositionMultiplier;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
120
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
121 push @FormulaElements, $ElementSymbol;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
122 push @FormulaElementComposition, $Composition;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
123 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
124
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
125 return ( \@FormulaElements, \@FormulaElementComposition);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
126 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
127
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
128 # Using refernece to element and its composition arrays, format composition information
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
129 # as: Element: Composition;...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
130 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
131 sub FormatCompositionInfomation {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
132 my($Index, $ElementSymbol, $ElementComposition, $ElementsRef, $ElementCompositionRef, $Precision, $Composition);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
133
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
134 $Precision = 2;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
135 if (@_ == 3) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
136 ($ElementsRef, $ElementCompositionRef, $Precision) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
137 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
138 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
139 ($ElementsRef, $ElementCompositionRef) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
140 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
141
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
142 $Composition = '';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
143 for $Index (0 .. $#{$ElementsRef}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
144 $ElementSymbol = $ElementsRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
145 $ElementComposition = $ElementCompositionRef->[$Index];
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
146 $ElementComposition = sprintf("%.${Precision}f", $ElementComposition);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
147
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
148 $Composition .= ($Composition) ? '; ' : '';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
149 $Composition .= "${ElementSymbol}: ${ElementComposition}%";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
150 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
151
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
152 return $Composition;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
153 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
154
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
155 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
156 # Get elements and their count...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
157 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
158 sub GetElementsAndCount {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
159 my($MolecularFormula) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
160 my($FormulaElementsRef, $FormulaElementCountRef, $ErrorMsg);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
161
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
162 ($FormulaElementsRef, $FormulaElementCountRef, $ErrorMsg) = _ProcessMolecularFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
163
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
164 return ($FormulaElementsRef, $FormulaElementCountRef);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
165 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
166
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
167 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
168 # Is it a valid molecular formula?
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
169 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
170 sub IsMolecularFormula {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
171 my($MolecularFormula, $PrintErrorMsg, $Status, $FormulaElementsRef, $FormulaElementCountRef, $ErrorMsg);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
172
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
173 ($MolecularFormula) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
174
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
175 ($FormulaElementsRef, $FormulaElementCountRef, $ErrorMsg) = _ProcessMolecularFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
176 $Status = (defined($FormulaElementsRef) && defined($FormulaElementCountRef)) ? 1 : 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
177
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
178 return (wantarray ? ($Status, $ErrorMsg) : $Status);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
179 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
180
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
181 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
182 # Process molecular formula. For a valid formula, return references to arrays conatining elements
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
183 # and element count; otherwsie, return undef.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
184 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
185 sub _ProcessMolecularFormula {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
186 my($MolecularFormula) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
187 my($ErrorMsg) = '';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
188
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
189 $MolecularFormula = _CleanUpFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
190
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
191 # Make sure it only contains numbers and letters...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
192 if ($MolecularFormula =~ /[^a-zA-Z0-9\(\)\[\]]/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
193 $ErrorMsg = 'Molecular formula contains characters other than a-zA-Z0-9';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
194 return (undef, undef, $ErrorMsg);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
195 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
196
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
197 # Parse the formula...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
198 my($ElementSpec, $FormulaElementSpec, $Spec, $ElementSymbol, $ElementCount, @FormulaElements, @ElementCount, %FormulaElementsToCountMap, @SubFormulaElements, %SubFormulaElementsToCountMap);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
199
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
200 @FormulaElements = (); @ElementCount = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
201 %FormulaElementsToCountMap = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
202
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
203 # Setup element symbol and count regular expression...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
204 # IUPAC: http://www.iupac.org/reports/provisional/abstract04/RB-prs310804/Chap4-3.04.pdf
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
205 #
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
206
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
207 $FormulaElementSpec = qr/
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
208 \G( # $1
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
209 (?:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
210 ([A-Z][a-z]?) # Two or one letter element symbol; $2
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
211 ([0-9]*) # Optionally followed by element count; $3
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
212 )
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
213 | \( | \[
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
214 | \)[0-9]* | \][0-9]*
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
215 | .
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
216 )
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
217 /x;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
218
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
219 my($ProcessingParenthesis);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
220 $ProcessingParenthesis = 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
221 # Go over the formula...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
222 FORMULA: while ($MolecularFormula =~ /$FormulaElementSpec/gx) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
223 ($Spec, $ElementSymbol, $ElementCount) = ($1, $2, $3);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
224
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
225 # Handle parenthesis in formula to indicate repeating units...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
226 if ($Spec =~ /^(\(|\[)/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
227 if ($ProcessingParenthesis) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
228 $ErrorMsg = "Molecular formula contains multiple level of () or []";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
229 return (undef, undef, $ErrorMsg);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
230 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
231 $ProcessingParenthesis = 1;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
232 @SubFormulaElements = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
233 %SubFormulaElementsToCountMap = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
234 next FORMULA;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
235 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
236 elsif ($Spec =~ /^(\)|\])/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
237 $ProcessingParenthesis = 0;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
238
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
239 # Retrieve repeat count and move data to @FormulaElements and %FormulaElementsToCountMap;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
240 my($RepeatCount, $Symbol, $Count);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
241 $RepeatCount = $Spec;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
242 $RepeatCount =~ s/(\)|\])//g;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
243 if (!$RepeatCount) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
244 $RepeatCount = 1;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
245 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
246 # Copy data...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
247 for $Symbol (@SubFormulaElements) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
248 $Count = $SubFormulaElementsToCountMap{$Symbol} * $RepeatCount;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
249 _SetupFormulaElementData(\@FormulaElements, \%FormulaElementsToCountMap, $Symbol, $Count);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
250 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
251
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
252 # Get ready again...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
253 @SubFormulaElements = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
254 %SubFormulaElementsToCountMap = ();
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
255
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
256 next FORMULA;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
257 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
258
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
259 # Retrieve element symbol and count...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
260 $ElementSymbol = ($Spec && !$ElementSymbol) ? $Spec : ($ElementSymbol ? $ElementSymbol : '');
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
261 $ElementCount = $ElementCount ? $ElementCount : 1;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
262 if (!PeriodicTable::IsElement($ElementSymbol)) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
263 $ErrorMsg = "Molecular formula contains unknown elemental symbol $ElementSymbol";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
264 return (undef, undef, $ErrorMsg);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
265 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
266
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
267 if ($ProcessingParenthesis) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
268 _SetupFormulaElementData(\@SubFormulaElements, \%SubFormulaElementsToCountMap, $ElementSymbol, $ElementCount);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
269 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
270 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
271 _SetupFormulaElementData(\@FormulaElements, \%FormulaElementsToCountMap, $ElementSymbol, $ElementCount);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
272 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
273 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
274
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
275 # Setup element count array...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
276 for $ElementSymbol (@FormulaElements) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
277 $ElementCount = $FormulaElementsToCountMap{$ElementSymbol};
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
278 push @ElementCount, $ElementCount;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
279 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
280
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
281 # Make sure it all adds up to 100%; otherwise, adjust the last value..
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
282
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
283 return (\@FormulaElements, \@ElementCount, $ErrorMsg);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
284 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
285
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
286 # Clean it up...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
287 sub _CleanUpFormula {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
288 my($MolecularFormula) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
289 #Take out any spaces...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
290 $MolecularFormula =~ s/ //g;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
291
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
292 # Eliminate any charge specifications: +, - or [1-9]+[+-]
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
293 # e.g NO+ [Al(H2O)6]3+ [H2NO3]+
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
294 if ($MolecularFormula =~ /[\+\-]/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
295 if ($MolecularFormula =~ /\][0-9]+[\+\-]/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
296 # Bracket followed optionally by number and then, +/- ...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
297 # [Al(H2O)6]3+ ...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
298 $MolecularFormula =~ s/\][0-9]+[\+\-]/\]/g;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
299 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
300 elsif ($MolecularFormula =~ /[\+\-][0-9]*/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
301 # +/- followed optionally by a number...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
302 # C37H42N2O6+2, Cu+
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
303 $MolecularFormula =~ s/[\+\-][0-9]*//g;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
304 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
305 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
306
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
307 # Eliminate any brackets - ] or ) - not followed by numbers:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
308 # e.g. Li[H2PO4]
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
309 if ($MolecularFormula !~ /\][0-9]+/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
310 $MolecularFormula =~ s/[\[\]]//g;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
311 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
312 if ($MolecularFormula !~ /\)[0-9]+/) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
313 $MolecularFormula =~ s/[\(\)]//g;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
314 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
315 # Change adducts to parenthesis format...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
316 # Na2CO3.10H2O -> Na2CO3(H2O)10
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
317 # 3CdSO4.8H2O -> (CdSO4)3(H2O)8
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
318 if ($MolecularFormula =~ /\./) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
319 my($SubFormula, $Count, $Spec);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
320 my(@MolecularFormulaSplits) = split /\./, $MolecularFormula;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
321 $MolecularFormula = '';
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
322 for $SubFormula (@MolecularFormulaSplits) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
323 ($Count, $Spec) = $SubFormula =~ /^([0-9]*)(.*?)$/;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
324 if ($Count) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
325 $MolecularFormula .= "(${Spec})${Count}";
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
326 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
327 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
328 $MolecularFormula .= $Spec;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
329 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
330 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
331 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
332
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
333 return $MolecularFormula;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
334 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
335
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
336 # Store the element and count...
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
337 sub _SetupFormulaElementData {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
338 my($ElementsRef, $ElementsToCountMapRef, $Element, $Count) = @_;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
339
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
340 if (exists $ElementsToCountMapRef->{$Element}) {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
341 $ElementsToCountMapRef->{$Element} += $Count;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
342 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
343 else {
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
344 push @{$ElementsRef}, $Element;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
345 $ElementsToCountMapRef->{$Element} = $Count;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
346 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
347 }
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
348
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
349 1;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
350
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
351 __END__
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
352
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
353 =head1 NAME
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
354
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
355 MolecularFormula
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
356
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
357 =head1 SYNOPSIS
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
358
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
359 use MolecularFormula;
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
360
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
361 use MolecularFormula qw(:all);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
362
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
363 =head1 DESCRIPTION
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
364
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
365 B<MolecularFormula> module provides the following functions:
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
366
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
367 CalculateElementalComposition, CalculateExactMass, CalculateMolecularWeight,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
368 FormatCompositionInfomation, GetElementsAndCount, IsMolecularFormula
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
369
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
370 =head1 FUNCTIONS
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
371
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
372 =over 4
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
373
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
374 =item B<CalculateMolecularWeight>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
375
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
376 $MolecularWeight = CalculateMolecularWeight($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
377
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
378 Calculates and returns the molecular weight for a specified I<MolecularFormula>.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
379
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
380 =item B<CalculateElementalComposition>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
381
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
382 ($ElementsRef, $ElementCompositionRef) =
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
383 CalculateElementalComposition($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
384
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
385 Calculates the percent composition in a specified I<MolecularFormula> and returns references
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
386 to arrays containing elements and their percent composition.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
387
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
388 =item B<CalculateExactMass>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
389
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
390 $ExactMass = CalculateMolecularWeight($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
391
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
392 Calculates and returns the exact mass for a specified I<MolecularFormula>.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
393
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
394 =item B<FormatCompositionInfomation>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
395
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
396 $FormattedString = FormatCompositionInfomation($ElementsRef,
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
397 $ElementCompositionRef, [$Precision]);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
398
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
399 Returns a formatted elemental composition string using references to elements and elemental
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
400 composition arrays. Precision is an optional parameter; its default value is I<2>.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
401
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
402 =item B<GetElementsAndCount>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
403
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
404 ($ElementsRef, $ElementCountRef) = GetElementsAndCount(
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
405 $MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
406
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
407 Retrieves elements and their count composition in a specified I<MolecularFormula> and
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
408 returns references to arrays containing elements and their count.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
409
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
410 =item B<IsMolecularFormula>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
411
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
412 $Status = IsMolecularFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
413 ($Status, $ErrorMsg) = IsMolecularFormula($MolecularFormula);
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
414
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
415 Returns 1 or 0 a based on whether it's a valid I<MolecularFormula>.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
416
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
417 =back
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
418
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
419 =head1 AUTHOR
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
420
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
421 Manish Sud <msud@san.rr.com>
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
422
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
423 =head1 SEE ALSO
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
424
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
425 Molecule.pm
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
426
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
427 =head1 COPYRIGHT
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
428
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
429 Copyright (C) 2015 Manish Sud. All rights reserved.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
430
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
431 This file is part of MayaChemTools.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
432
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
433 MayaChemTools is free software; you can redistribute it and/or modify it under
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
434 the terms of the GNU Lesser General Public License as published by the Free
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
435 Software Foundation; either version 3 of the License, or (at your option)
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
436 any later version.
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
437
73ae111cf86f Uploaded
deepakjadmin
parents:
diff changeset
438 =cut