annotate mayachemtool/mayachemtools/lib/MolecularFormula.pm @ 0:a4a2ad5a214e draft default tip

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