annotate lib/MolecularFormula.pm @ 2:17fef9d80c97 draft

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