Mercurial > repos > deepakjadmin > mayatool3_test2
comparison lib/PeriodicTable.pm @ 0:4816e4a8ae95 draft default tip
Uploaded
| author | deepakjadmin |
|---|---|
| date | Wed, 20 Jan 2016 09:23:18 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:4816e4a8ae95 |
|---|---|
| 1 package PeriodicTable; | |
| 2 # | |
| 3 # $RCSfile: PeriodicTable.pm,v $ | |
| 4 # $Date: 2015/02/28 20:47:18 $ | |
| 5 # $Revision: 1.37 $ | |
| 6 # | |
| 7 # Author: Manish Sud <msud@san.rr.com> | |
| 8 # | |
| 9 # Copyright (C) 2015 Manish Sud. All rights reserved. | |
| 10 # | |
| 11 # This file is part of MayaChemTools. | |
| 12 # | |
| 13 # MayaChemTools is free software; you can redistribute it and/or modify it under | |
| 14 # the terms of the GNU Lesser General Public License as published by the Free | |
| 15 # Software Foundation; either version 3 of the License, or (at your option) any | |
| 16 # later version. | |
| 17 # | |
| 18 # MayaChemTools is distributed in the hope that it will be useful, but without | |
| 19 # any warranty; without even the implied warranty of merchantability of fitness | |
| 20 # for a particular purpose. See the GNU Lesser General Public License for more | |
| 21 # details. | |
| 22 # | |
| 23 # You should have received a copy of the GNU Lesser General Public License | |
| 24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or | |
| 25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, | |
| 26 # Boston, MA, 02111-1307, USA. | |
| 27 # | |
| 28 | |
| 29 use strict; | |
| 30 use Carp; | |
| 31 use Text::ParseWords; | |
| 32 use TextUtil; | |
| 33 use FileUtil; | |
| 34 | |
| 35 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); | |
| 36 | |
| 37 @ISA = qw(Exporter); | |
| 38 @EXPORT = qw(); | |
| 39 @EXPORT_OK = qw(GetElements GetElementsByGroupName GetElementsByGroupNumber GetElementsByAmericanStyleGroupLabel GetElementsByEuropeanStyleGroupLabel GetElementsByPeriodNumber GetElementMostAbundantNaturalIsotopeData GetElementNaturalIsotopeCount GetElementNaturalIsotopesData GetElementNaturalIsotopeAbundance GetElementMostAbundantNaturalIsotopeMass GetElementMostAbundantNaturalIsotopeMassNumber GetElementNaturalIsotopeMass GetElementPropertiesData GetElementPropertiesNames GetElementPropertiesNamesAndUnits GetElementPropertyUnits GetIUPACGroupNumberFromAmericanStyleGroupLabel GetIUPACGroupNumberFromEuropeanStyleGroupLabel IsElement IsElementNaturalIsotopeMassNumber IsElementProperty); | |
| 40 | |
| 41 %EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); | |
| 42 | |
| 43 # | |
| 44 # Load atomic properties and isotope data for elements... | |
| 45 # | |
| 46 my(%ElementDataMap, %ElementIsotopeDataMap, %ElementSymbolMap, @ElementPropertyNames, %ElementPropertyNamesMap, %ElementIsotopeDerivedDataMap); | |
| 47 _LoadPeriodicTableElementData(); | |
| 48 | |
| 49 # | |
| 50 # Get a list of all known element symbols... | |
| 51 # | |
| 52 sub GetElements { | |
| 53 my($AtomicNumber, @ElementSymbols); | |
| 54 | |
| 55 @ElementSymbols = (); | |
| 56 for $AtomicNumber (sort {$a <=> $b} keys %ElementDataMap) { | |
| 57 push @ElementSymbols, $ElementDataMap{$AtomicNumber}{ElementSymbol}; | |
| 58 } | |
| 59 return (wantarray ? @ElementSymbols : \@ElementSymbols); | |
| 60 } | |
| 61 | |
| 62 # | |
| 63 # Get element symbols of elements with a specific group name. Valid group | |
| 64 # names are: Alkali metals, Alkaline earth metals, Coinage metals, Pnictogens, | |
| 65 # Chalcogens, Halogens, Noble gases; Additionally, usage of Lanthanides (Lanthanoids) | |
| 66 # and Actinides (Actinoids) is also supported. | |
| 67 # | |
| 68 sub GetElementsByGroupName { | |
| 69 my($SpecifiedGroupName) = @_; | |
| 70 my($AtomicNumber, @ElementSymbols, $GroupName); | |
| 71 | |
| 72 if (IsEmpty($SpecifiedGroupName)) { | |
| 73 return (wantarray ? () : undef); | |
| 74 } | |
| 75 if ($SpecifiedGroupName =~ /Lanthanide/i) { | |
| 76 $SpecifiedGroupName = 'Lanthanoids'; | |
| 77 } | |
| 78 elsif ($SpecifiedGroupName =~ /Actinide/i) { | |
| 79 $SpecifiedGroupName = 'Actinoids'; | |
| 80 } | |
| 81 @ElementSymbols = (); | |
| 82 for $AtomicNumber (sort {$a <=> $b} keys %ElementDataMap) { | |
| 83 $GroupName = $ElementDataMap{$AtomicNumber}{GroupName}; | |
| 84 if ($SpecifiedGroupName =~ /$GroupName/i ) { | |
| 85 push @ElementSymbols, $ElementDataMap{$AtomicNumber}{ElementSymbol}; | |
| 86 } | |
| 87 } | |
| 88 return (wantarray ? @ElementSymbols : \@ElementSymbols); | |
| 89 } | |
| 90 | |
| 91 # | |
| 92 # Get element symbols of elements in a specific IUPAC group number. | |
| 93 # A reference to an array containing element symbols is returned. | |
| 94 # | |
| 95 sub GetElementsByGroupNumber { | |
| 96 my($GroupNumber) = @_; | |
| 97 my($AtomicNumber, @ElementSymbols); | |
| 98 | |
| 99 if (!IsInteger($GroupNumber)) { | |
| 100 return (wantarray ? () : undef); | |
| 101 } | |
| 102 | |
| 103 @ElementSymbols = (); | |
| 104 for $AtomicNumber (sort {$a <=> $b} keys %ElementDataMap) { | |
| 105 if ($GroupNumber eq $ElementDataMap{$AtomicNumber}{GroupNumber}) { | |
| 106 push @ElementSymbols, $ElementDataMap{$AtomicNumber}{ElementSymbol}; | |
| 107 } | |
| 108 } | |
| 109 return (wantarray ? @ElementSymbols : \@ElementSymbols); | |
| 110 } | |
| 111 | |
| 112 # | |
| 113 # Get element symbols of elements in a specific American style group label. | |
| 114 # A reference to an array containing element symbols is returned. | |
| 115 # | |
| 116 sub GetElementsByAmericanStyleGroupLabel { | |
| 117 my($GroupLabel) = @_; | |
| 118 | |
| 119 return _GetElementsByGroupLabel($GroupLabel, 'AmericanStyle'); | |
| 120 } | |
| 121 | |
| 122 # | |
| 123 # Get element symbols of elements in a specific European style group label. | |
| 124 # A reference to an array containing element symbols is returned. | |
| 125 # | |
| 126 sub GetElementsByEuropeanStyleGroupLabel { | |
| 127 my($GroupLabel) = @_; | |
| 128 | |
| 129 return _GetElementsByGroupLabel($GroupLabel, 'EuropeanStyle'); | |
| 130 } | |
| 131 | |
| 132 # | |
| 133 # Get IUPAC group number from American style group label. A comma delimited | |
| 134 # string is returned for group VIII or VIIIB. | |
| 135 # | |
| 136 sub GetIUPACGroupNumberFromAmericanStyleGroupLabel { | |
| 137 my($GroupLabel) = @_; | |
| 138 my($GroupNumber); | |
| 139 | |
| 140 if (IsEmpty($GroupLabel)) { | |
| 141 return undef; | |
| 142 } | |
| 143 $GroupNumber = ""; | |
| 144 SWITCH: { | |
| 145 if ($GroupLabel =~ /^IA$/) { $GroupNumber = 1; last SWITCH;} | |
| 146 if ($GroupLabel =~ /^IIA$/) { $GroupNumber = 2; last SWITCH;} | |
| 147 if ($GroupLabel =~ /^IIIB$/) { $GroupNumber = 3; last SWITCH;} | |
| 148 if ($GroupLabel =~ /^IVB$/) { $GroupNumber = 4; last SWITCH;} | |
| 149 if ($GroupLabel =~ /^VB$/) { $GroupNumber = 5; last SWITCH;} | |
| 150 if ($GroupLabel =~ /^VIB$/) { $GroupNumber = 6; last SWITCH;} | |
| 151 if ($GroupLabel =~ /^VIIB$/) { $GroupNumber = 7; last SWITCH;} | |
| 152 if ($GroupLabel =~ /^(VIII|VIIIB)$/) { $GroupNumber = '8,9,10'; last SWITCH;} | |
| 153 if ($GroupLabel =~ /^IB$/) { $GroupNumber = 11; last SWITCH;} | |
| 154 if ($GroupLabel =~ /^IIB$/) { $GroupNumber = 12; last SWITCH;} | |
| 155 if ($GroupLabel =~ /^IIIA$/) { $GroupNumber = 13; last SWITCH;} | |
| 156 if ($GroupLabel =~ /^IVA$/) { $GroupNumber = 14; last SWITCH;} | |
| 157 if ($GroupLabel =~ /^VA$/) { $GroupNumber = 15; last SWITCH;} | |
| 158 if ($GroupLabel =~ /^VIA$/) { $GroupNumber = 16; last SWITCH;} | |
| 159 if ($GroupLabel =~ /^VIIA$/) { $GroupNumber = 17; last SWITCH;} | |
| 160 if ($GroupLabel =~ /^VIIIA$/) { $GroupNumber = 18; last SWITCH;} | |
| 161 $GroupNumber = ""; | |
| 162 } | |
| 163 if (!$GroupNumber) { | |
| 164 return undef; | |
| 165 } | |
| 166 return $GroupNumber; | |
| 167 } | |
| 168 | |
| 169 # | |
| 170 # Get IUPAC group number from European style group label. A comma delimited | |
| 171 # string is returned for group VIII or VIIIA | |
| 172 # | |
| 173 sub GetIUPACGroupNumberFromEuropeanStyleGroupLabel { | |
| 174 my($GroupLabel) = @_; | |
| 175 my($GroupNumber); | |
| 176 | |
| 177 if (IsEmpty($GroupLabel)) { | |
| 178 return undef; | |
| 179 } | |
| 180 $GroupNumber = ""; | |
| 181 SWITCH: { | |
| 182 if ($GroupLabel =~ /^IA$/) { $GroupNumber = 1; last SWITCH;} | |
| 183 if ($GroupLabel =~ /^IIA$/) { $GroupNumber = 2; last SWITCH;} | |
| 184 if ($GroupLabel =~ /^IIIA$/) { $GroupNumber = 3; last SWITCH;} | |
| 185 if ($GroupLabel =~ /^IVA$/) { $GroupNumber = 4; last SWITCH;} | |
| 186 if ($GroupLabel =~ /^VA$/) { $GroupNumber = 5; last SWITCH;} | |
| 187 if ($GroupLabel =~ /^VIA$/) { $GroupNumber = 6; last SWITCH;} | |
| 188 if ($GroupLabel =~ /^VIIA$/) { $GroupNumber = 7; last SWITCH;} | |
| 189 if ($GroupLabel =~ /^(VIII|VIIIA)$/) { $GroupNumber = '8,9,10'; last SWITCH;} | |
| 190 if ($GroupLabel =~ /^IB$/) { $GroupNumber = 11; last SWITCH;} | |
| 191 if ($GroupLabel =~ /^IIB$/) { $GroupNumber = 12; last SWITCH;} | |
| 192 if ($GroupLabel =~ /^IIIB$/) { $GroupNumber = 13; last SWITCH;} | |
| 193 if ($GroupLabel =~ /^IVB$/) { $GroupNumber = 14; last SWITCH;} | |
| 194 if ($GroupLabel =~ /^VB$/) { $GroupNumber = 15; last SWITCH;} | |
| 195 if ($GroupLabel =~ /^VIB$/) { $GroupNumber = 16; last SWITCH;} | |
| 196 if ($GroupLabel =~ /^VIIB$/) { $GroupNumber = 17; last SWITCH;} | |
| 197 if ($GroupLabel =~ /^VIIIB$/) { $GroupNumber = 18; last SWITCH;} | |
| 198 $GroupNumber = ""; | |
| 199 } | |
| 200 if (!$GroupNumber) { | |
| 201 return undef; | |
| 202 } | |
| 203 return $GroupNumber; | |
| 204 } | |
| 205 | |
| 206 # | |
| 207 # Get element symbols of elements in a specific period number. | |
| 208 # A reference to an array containing element symbols is returned. | |
| 209 # | |
| 210 sub GetElementsByPeriodNumber { | |
| 211 my($SpecifiedPeriodNumber) = @_; | |
| 212 my($AtomicNumber, $PeriodNumber, @ElementSymbols); | |
| 213 | |
| 214 if (!IsInteger($SpecifiedPeriodNumber)) { | |
| 215 return (wantarray ? () : undef); | |
| 216 } | |
| 217 | |
| 218 @ElementSymbols = (); | |
| 219 for $AtomicNumber (sort {$a <=> $b} keys %ElementDataMap) { | |
| 220 $PeriodNumber = $ElementDataMap{$AtomicNumber}{PeriodNumber}; | |
| 221 if ($PeriodNumber =~ /\(/) { | |
| 222 # Lanthanides and Actinides... | |
| 223 ($PeriodNumber) = split /\(/, $PeriodNumber; | |
| 224 } | |
| 225 if ($PeriodNumber == $SpecifiedPeriodNumber) { | |
| 226 push @ElementSymbols, $ElementDataMap{$AtomicNumber}{ElementSymbol}; | |
| 227 } | |
| 228 } | |
| 229 return (wantarray ? @ElementSymbols : \@ElementSymbols); | |
| 230 } | |
| 231 | |
| 232 # | |
| 233 # Get data for most abundant isotope of an element using element symbol or atomic number. | |
| 234 # | |
| 235 sub GetElementMostAbundantNaturalIsotopeData { | |
| 236 my($ElementID) = @_; | |
| 237 my($AtomicNumber); | |
| 238 | |
| 239 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 240 return (wantarray ? () : undef); | |
| 241 } | |
| 242 | |
| 243 my(@IsotopeData, $IsotopeSymbol, $MassNumber, $RelativeAtomicMass, $NaturalAbundance); | |
| 244 $MassNumber = $ElementIsotopeDerivedDataMap{$AtomicNumber}{MostAbundantMassNumber}; | |
| 245 $IsotopeSymbol = $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{IsotopeSymbol}; | |
| 246 $RelativeAtomicMass = $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{RelativeAtomicMass}; | |
| 247 $NaturalAbundance = $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{NaturalAbundance}; | |
| 248 @IsotopeData = (); | |
| 249 @IsotopeData = ($AtomicNumber, $IsotopeSymbol, $MassNumber, $RelativeAtomicMass, $NaturalAbundance); | |
| 250 | |
| 251 return (wantarray ? @IsotopeData : \@IsotopeData); | |
| 252 | |
| 253 } | |
| 254 # | |
| 255 # Get natural isotope count for an element... | |
| 256 # | |
| 257 sub GetElementNaturalIsotopeCount { | |
| 258 my($ElementID) = @_; | |
| 259 my($AtomicNumber); | |
| 260 | |
| 261 if ($AtomicNumber = _ValidateElementID($ElementID)) { | |
| 262 return $ElementIsotopeDerivedDataMap{$AtomicNumber}{IsotopeCount}; | |
| 263 } | |
| 264 else { | |
| 265 return undef; | |
| 266 } | |
| 267 } | |
| 268 | |
| 269 # | |
| 270 # Get all available isotope data for an element using element symbol or atomic number or | |
| 271 # data for a specific mass number using one of these two invocation methods: | |
| 272 # | |
| 273 # $HashRef = GetElementNaturalIsotopesData($ElementID); | |
| 274 # | |
| 275 # $HashRef = GetElementNaturalIsotopesData($ElementID, $MassNumber); | |
| 276 # | |
| 277 # In the first mode, a reference to a two-dimensional hash array is return where first | |
| 278 # and second dimension keys correspond to mass number and isotope data labels. | |
| 279 # | |
| 280 # And in the second mode, a refernce to one-dimensional hash array is returned with | |
| 281 # keys and values corresponding to isotope data label and values. | |
| 282 # | |
| 283 sub GetElementNaturalIsotopesData { | |
| 284 my($ElementID, $MassNumber, $InvocationMode, $AtomicNumber); | |
| 285 | |
| 286 if (@_ == 2) { | |
| 287 ($ElementID, $MassNumber) = @_; | |
| 288 $InvocationMode = 2; | |
| 289 } | |
| 290 else { | |
| 291 ($ElementID) = @_; | |
| 292 $InvocationMode = 1; | |
| 293 } | |
| 294 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 295 return undef; | |
| 296 } | |
| 297 if ($InvocationMode == 1) { | |
| 298 return \%{$ElementIsotopeDataMap{$AtomicNumber}}; | |
| 299 } | |
| 300 elsif ($InvocationMode == 2) { | |
| 301 if (exists $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}) { | |
| 302 return \%{$ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}}; | |
| 303 } | |
| 304 else { | |
| 305 return undef; | |
| 306 } | |
| 307 } | |
| 308 else { | |
| 309 return undef; | |
| 310 } | |
| 311 } | |
| 312 | |
| 313 # | |
| 314 # Get relative atomic mass for an element with specfic mass number. | |
| 315 # | |
| 316 sub GetElementNaturalIsotopeMass { | |
| 317 my($ElementID, $MassNumber) = @_; | |
| 318 my($AtomicNumber); | |
| 319 | |
| 320 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 321 return undef; | |
| 322 } | |
| 323 if (exists $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}) { | |
| 324 return $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{RelativeAtomicMass}; | |
| 325 } | |
| 326 else { | |
| 327 return undef; | |
| 328 } | |
| 329 } | |
| 330 | |
| 331 # | |
| 332 # Get relative atomic mass of most abundant isotope for an element... | |
| 333 # | |
| 334 sub GetElementMostAbundantNaturalIsotopeMass { | |
| 335 my($ElementID) = @_; | |
| 336 my($AtomicNumber); | |
| 337 | |
| 338 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 339 return undef; | |
| 340 } | |
| 341 my($MassNumber, $RelativeAtomicMass); | |
| 342 | |
| 343 $MassNumber = $ElementIsotopeDerivedDataMap{$AtomicNumber}{MostAbundantMassNumber}; | |
| 344 $RelativeAtomicMass = $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{RelativeAtomicMass}; | |
| 345 | |
| 346 return $RelativeAtomicMass; | |
| 347 } | |
| 348 | |
| 349 # | |
| 350 # Get mass number of most abundant isotope for an element... | |
| 351 # | |
| 352 sub GetElementMostAbundantNaturalIsotopeMassNumber { | |
| 353 my($ElementID) = @_; | |
| 354 my($AtomicNumber); | |
| 355 | |
| 356 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 357 return undef; | |
| 358 } | |
| 359 my($MassNumber); | |
| 360 | |
| 361 $MassNumber = $ElementIsotopeDerivedDataMap{$AtomicNumber}{MostAbundantMassNumber}; | |
| 362 | |
| 363 return $MassNumber; | |
| 364 } | |
| 365 # | |
| 366 # Get % natural abundance of natural isotope for an element with specfic mass number. | |
| 367 # | |
| 368 sub GetElementNaturalIsotopeAbundance { | |
| 369 my($ElementID, $MassNumber) = @_; | |
| 370 my($AtomicNumber); | |
| 371 | |
| 372 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 373 return undef; | |
| 374 } | |
| 375 if (exists $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}) { | |
| 376 return $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{NaturalAbundance}; | |
| 377 } | |
| 378 else { | |
| 379 return undef; | |
| 380 } | |
| 381 } | |
| 382 | |
| 383 # | |
| 384 # Get all available properties data for an element using element symbol or atomic number. | |
| 385 # A reference to a hash array is returned with keys and values representing property | |
| 386 # name and its values respectively. | |
| 387 # | |
| 388 sub GetElementPropertiesData { | |
| 389 my($ElementID) = @_; | |
| 390 my($AtomicNumber); | |
| 391 | |
| 392 if ($AtomicNumber = _ValidateElementID($ElementID)) { | |
| 393 return \%{$ElementDataMap{$AtomicNumber}}; | |
| 394 } | |
| 395 else { | |
| 396 return undef; | |
| 397 } | |
| 398 } | |
| 399 | |
| 400 # | |
| 401 # Get names of all available element properties. A reference to an array containing | |
| 402 # names of all available properties is returned. | |
| 403 # | |
| 404 sub GetElementPropertiesNames { | |
| 405 my($Mode); | |
| 406 my($PropertyName, @PropertyNames); | |
| 407 | |
| 408 $Mode = 'ByGroup'; | |
| 409 if (@_ == 1) { | |
| 410 ($Mode) = @_; | |
| 411 } | |
| 412 | |
| 413 @PropertyNames = (); | |
| 414 if ($Mode =~ /^Alphabetical$/i) { | |
| 415 # AtomicNumber, ElementSymbol and ElementName are always listed first... | |
| 416 push @PropertyNames, qw(AtomicNumber ElementSymbol ElementName); | |
| 417 for $PropertyName (sort keys %ElementPropertyNamesMap) { | |
| 418 if ($PropertyName !~ /^(AtomicNumber|ElementSymbol|ElementName)$/i) { | |
| 419 push @PropertyNames, $PropertyName; | |
| 420 } | |
| 421 } | |
| 422 } | |
| 423 else { | |
| 424 push @PropertyNames, @ElementPropertyNames; | |
| 425 } | |
| 426 return (wantarray ? @PropertyNames : \@PropertyNames); | |
| 427 } | |
| 428 | |
| 429 # | |
| 430 # Get names and units of all available element properties... | |
| 431 # A reference to a hash array is returned with keys and values representing property | |
| 432 # name and its units respectively. Names with no units contains empty strings as hash | |
| 433 # values. | |
| 434 # | |
| 435 sub GetElementPropertiesNamesAndUnits { | |
| 436 | |
| 437 return \%ElementPropertyNamesMap; | |
| 438 } | |
| 439 | |
| 440 # | |
| 441 # Get units for a specific element property. An empty string is returned for a property | |
| 442 # with no units. | |
| 443 # | |
| 444 sub GetElementPropertyUnits { | |
| 445 my($PropertyName) = @_; | |
| 446 my($PropertyUnits); | |
| 447 | |
| 448 $PropertyUnits = (exists($ElementPropertyNamesMap{$PropertyName})) ? $ElementPropertyNamesMap{$PropertyName} : undef; | |
| 449 | |
| 450 return $PropertyUnits; | |
| 451 } | |
| 452 | |
| 453 # | |
| 454 # Is it a known element? Input is either an element symol or a atomic number. | |
| 455 # | |
| 456 sub IsElement { | |
| 457 my($ElementID) = @_; | |
| 458 my($Status); | |
| 459 | |
| 460 $Status = (_ValidateElementID($ElementID)) ? 1 : 0; | |
| 461 | |
| 462 return $Status; | |
| 463 } | |
| 464 | |
| 465 # | |
| 466 # Is it a valid mass number for an element? Element ID is either an element symol or a atomic number. | |
| 467 # | |
| 468 sub IsElementNaturalIsotopeMassNumber { | |
| 469 my($ElementID, $MassNumber) = @_; | |
| 470 my($AtomicNumber, $Status); | |
| 471 | |
| 472 $Status = 0; | |
| 473 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 474 return $Status; | |
| 475 } | |
| 476 if (exists $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}) { | |
| 477 $Status = 1; | |
| 478 } | |
| 479 | |
| 480 return $Status; | |
| 481 } | |
| 482 | |
| 483 # | |
| 484 # Is it an available element property? | |
| 485 # | |
| 486 sub IsElementProperty { | |
| 487 my($PropertyName) = @_; | |
| 488 my($Status); | |
| 489 | |
| 490 $Status = (exists($ElementPropertyNamesMap{$PropertyName})) ? 1 : 0; | |
| 491 | |
| 492 return $Status; | |
| 493 } | |
| 494 | |
| 495 # | |
| 496 # Implents GetElement<PropertyName> for a valid proprty name. | |
| 497 # | |
| 498 sub AUTOLOAD { | |
| 499 my($ElementID) = @_; | |
| 500 my($FunctionName, $PropertyName, $PropertyValue, $AtomicNumber); | |
| 501 | |
| 502 $PropertyValue = undef; | |
| 503 | |
| 504 use vars qw($AUTOLOAD); | |
| 505 $FunctionName = $AUTOLOAD; | |
| 506 $FunctionName =~ s/.*:://; | |
| 507 | |
| 508 # Only Get<PropertyName> functions are supported... | |
| 509 if ($FunctionName !~ /^GetElement/) { | |
| 510 croak "Error: Function, PeriodicTable::$FunctionName, is not supported by AUTOLOAD in PeriodicTable module: Only GetElement<PropertyName> functions are implemented..."; | |
| 511 } | |
| 512 | |
| 513 $PropertyName = $FunctionName; | |
| 514 $PropertyName =~ s/^GetElement//; | |
| 515 if (!exists $ElementPropertyNamesMap{$PropertyName}) { | |
| 516 croak "Error: Function, PeriodicTable::$FunctionName, is not supported by AUTOLOAD in PeriodicTable module: Unknown element property name, $PropertyName, specified..."; | |
| 517 } | |
| 518 | |
| 519 if (!($AtomicNumber = _ValidateElementID($ElementID))) { | |
| 520 return undef; | |
| 521 } | |
| 522 $PropertyValue = $ElementDataMap{$AtomicNumber}{$PropertyName}; | |
| 523 return $PropertyValue; | |
| 524 } | |
| 525 | |
| 526 # | |
| 527 # Get elements labels for group name specified using American or European style... | |
| 528 # | |
| 529 sub _GetElementsByGroupLabel { | |
| 530 my($GroupLabel, $LabelStyle) = @_; | |
| 531 my($GroupNumber); | |
| 532 | |
| 533 if ($LabelStyle =~ /^AmericanStyle$/i) { | |
| 534 $GroupNumber = GetIUPACGroupNumberFromAmericanStyleGroupLabel($GroupLabel); | |
| 535 } | |
| 536 elsif ($LabelStyle =~ /^EuropeanStyle$/i) { | |
| 537 $GroupNumber = GetIUPACGroupNumberFromEuropeanStyleGroupLabel($GroupLabel); | |
| 538 } | |
| 539 | |
| 540 if (IsEmpty($GroupNumber)) { | |
| 541 return (wantarray ? () : undef); | |
| 542 } | |
| 543 | |
| 544 my($AtomicNumber, @GroupElements, @ElementSymbols); | |
| 545 @ElementSymbols = (); | |
| 546 if ($GroupNumber =~ /\,/) { | |
| 547 my(@GroupNumbers); | |
| 548 | |
| 549 @GroupNumbers = split /\,/, $GroupNumber; | |
| 550 for $GroupNumber (@GroupNumbers) { | |
| 551 @GroupElements = GetElementsByGroupNumber($GroupNumber); | |
| 552 push @ElementSymbols, @GroupElements; | |
| 553 } | |
| 554 } | |
| 555 else { | |
| 556 @GroupElements = GetElementsByGroupNumber($GroupNumber); | |
| 557 push @ElementSymbols, @GroupElements; | |
| 558 } | |
| 559 return (wantarray ? @ElementSymbols : \@ElementSymbols); | |
| 560 } | |
| 561 | |
| 562 # | |
| 563 # Load PeriodicTableElementData.csv and PeriodicTableIsotopeData.csv files from | |
| 564 # <MayaChemTools>/lib directory... | |
| 565 # | |
| 566 sub _LoadPeriodicTableElementData { | |
| 567 my($ElementDataFile, $ElementIsotopeDataFile, $MayaChemToolsLibDir); | |
| 568 | |
| 569 $MayaChemToolsLibDir = GetMayaChemToolsLibDirName(); | |
| 570 | |
| 571 $ElementDataFile = "$MayaChemToolsLibDir" . "/data/PeriodicTableElementData.csv"; | |
| 572 $ElementIsotopeDataFile = "$MayaChemToolsLibDir" . "/data/PeriodicTableIsotopeData.csv"; | |
| 573 | |
| 574 if (! -e "$ElementDataFile") { | |
| 575 croak "Error: MayaChemTools package file, $ElementDataFile, is missing: Possible installation problems..."; | |
| 576 } | |
| 577 if (! -e "$ElementIsotopeDataFile") { | |
| 578 croak "Error: MayaChemTools package file, $ElementIsotopeDataFile, is missing: Possible installation problems..."; | |
| 579 } | |
| 580 | |
| 581 _LoadElementData($ElementDataFile); | |
| 582 _LoadElementIsotopeData($ElementIsotopeDataFile); | |
| 583 } | |
| 584 | |
| 585 # | |
| 586 # Load PeriodicTableElementData.csv file from <MayaChemTools>/lib directory... | |
| 587 # | |
| 588 sub _LoadElementData { | |
| 589 my($ElementDataFile) = @_; | |
| 590 | |
| 591 %ElementDataMap = (); | |
| 592 @ElementPropertyNames = (); | |
| 593 %ElementPropertyNamesMap = (); | |
| 594 %ElementSymbolMap = (); | |
| 595 | |
| 596 # Load atomic properties data for all elements... | |
| 597 # | |
| 598 # File Format: | |
| 599 #"AtomicNumber","ElementSymbol","ElementName","AtomicWeight","GroupNumber","GroupName","PeriodNumber","Block","GroundStateConfiguration","ValenceElectrons","GroundStateLevel","StandardState","CommonValences","LowestCommonValence","HighestCommonValence","CommonOxidationNumbers","LowestCommonOxidationNumber","HighestCommonOxidationNumber","BondLength(pm)","AtomicRadiusEmpirical(pm)","AtomicRadiusCalculated(pm)","CovalentRadiusEmpirical(pm)","VanderWaalsRadius(pm)","ElectronAffinity(kJ mol-1)","FirstIonizationEnergy(kJ mol-1)","PaulingElectronegativity(Pauling units)","SandersonElectronegativity(Pauling units)","AllredRochowElectronegativity(Pauling units)","MullikenJaffeElectronegativity(Pauling units)","AllenElectronegativity(Pauling units)","DensityOfSolid(kg m-3)","MolarVolume(cm3)","VelocityOfSound(m s-1)","YoungsModulus(GPa)","RigidityModulus(GPa)","BulkModulus(GPa)","PoissonsRatio(No units)","MineralHardness(No units)","BrinellHardness(MN m-2)","VickersHardness(MN m-2)","ElectricalResistivity(10-8 omega m)","Reflectivity(%)","RefractiveIndex(No units)","MeltingPoint(Celsius)","BoilingPoint(Celsius)","CriticalTemperature(Celsius)","SuperconductionTemperature(Celsius)","ThermalConductivity(W m-1 K-1)","CoefficientOfLinearExpansion(K-1 x 10^6)","EnthalpyOfFusion(kJ mol-1)","EnthalpyOfVaporization(kJ mol-1)","EnthalpyOfAtmization(kJ mol-1)","Color","Classification","DiscoveredBy","DiscoveredAt","DiscoveredWhen","OriginOfName" | |
| 600 # | |
| 601 # | |
| 602 my($AtomicNumber, $ElementSymbol, $Line, $NumOfCols, $InDelim, $Index, $Name, $Value, $Units, @LineWords, @ColLabels); | |
| 603 | |
| 604 $InDelim = "\,"; | |
| 605 open ELEMENTDATAFILE, "$ElementDataFile" or croak "Couldn't open $ElementDataFile: $! ..."; | |
| 606 | |
| 607 # Skip lines up to column labels... | |
| 608 LINE: while ($Line = GetTextLine(\*ELEMENTDATAFILE)) { | |
| 609 if ($Line !~ /^#/) { | |
| 610 last LINE; | |
| 611 } | |
| 612 } | |
| 613 @ColLabels= quotewords($InDelim, 0, $Line); | |
| 614 $NumOfCols = @ColLabels; | |
| 615 | |
| 616 # Extract property names from column labels - and unit names where appropriate... | |
| 617 @ElementPropertyNames = (); | |
| 618 for $Index (0 .. $#ColLabels) { | |
| 619 $Name = $ColLabels[$Index]; | |
| 620 $Units = ""; | |
| 621 if ($Name =~ /\(/) { | |
| 622 ($Name, $Units) = split /\(/, $Name; | |
| 623 $Units =~ s/\)//g; | |
| 624 } | |
| 625 push @ElementPropertyNames, $Name; | |
| 626 | |
| 627 # Store element names and units... | |
| 628 $ElementPropertyNamesMap{$Name} = $Units; | |
| 629 } | |
| 630 | |
| 631 # Process element data... | |
| 632 LINE: while ($Line = GetTextLine(\*ELEMENTDATAFILE)) { | |
| 633 if ($Line =~ /^#/) { | |
| 634 next LINE; | |
| 635 } | |
| 636 @LineWords = (); | |
| 637 @LineWords = quotewords($InDelim, 0, $Line); | |
| 638 if (@LineWords != $NumOfCols) { | |
| 639 croak "Error: The number of data fields, @LineWords, in $ElementDataFile must be $NumOfCols.\nLine: $Line..."; | |
| 640 } | |
| 641 $AtomicNumber = $LineWords[0]; $ElementSymbol = $LineWords[1]; | |
| 642 if (exists $ElementDataMap{$AtomicNumber}) { | |
| 643 carp "Warning: Ignoring data for element $ElementSymbol: It has already been loaded.\nLine: $Line...."; | |
| 644 next LINE; | |
| 645 } | |
| 646 | |
| 647 # Store all the values... | |
| 648 %{$ElementDataMap{$AtomicNumber}} = (); | |
| 649 for $Index (0 .. $#LineWords) { | |
| 650 $Name = $ElementPropertyNames[$Index]; | |
| 651 $Value = $LineWords[$Index]; | |
| 652 $ElementDataMap{$AtomicNumber}{$Name} = $Value; | |
| 653 } | |
| 654 } | |
| 655 close ELEMENTDATAFILE; | |
| 656 | |
| 657 # Setup the element symbol map as well... | |
| 658 _SetupElementSymbolMap(); | |
| 659 } | |
| 660 | |
| 661 # | |
| 662 # Load PeriodicTableIsotopeData.csv files from <MayaChemTools>/lib directory... | |
| 663 # | |
| 664 sub _LoadElementIsotopeData { | |
| 665 my($ElementIsotopeDataFile) = @_; | |
| 666 | |
| 667 %ElementIsotopeDataMap = (); | |
| 668 %ElementIsotopeDerivedDataMap = (); | |
| 669 | |
| 670 # Load isotope data for all elements... | |
| 671 # | |
| 672 # File format: | |
| 673 # "Atomic Number","Isotope Symbol","Mass Number","Relative Atomic Mass","% Natural Abundnace" | |
| 674 # | |
| 675 # Empty values for "Relative Atomic Mass" and "% Natural Abundnace" imply absence of any | |
| 676 # naturally occuring isotopes for the element. | |
| 677 # | |
| 678 my($InDelim, $Line, $NumOfCols, @ColLabels, @LineWords); | |
| 679 | |
| 680 $InDelim = "\,"; | |
| 681 open ISOTOPEDATAFILE, "$ElementIsotopeDataFile" or croak "Couldn't open $ElementIsotopeDataFile: $! ..."; | |
| 682 | |
| 683 # Skip lines up to column labels... | |
| 684 LINE: while ($Line = GetTextLine(\*ISOTOPEDATAFILE)) { | |
| 685 if ($Line !~ /^#/) { | |
| 686 last LINE; | |
| 687 } | |
| 688 } | |
| 689 @ColLabels= quotewords($InDelim, 0, $Line); | |
| 690 $NumOfCols = @ColLabels; | |
| 691 | |
| 692 my($AtomicNumber, $IsotopeSymbol, $MassNumber, $RelativeAtomicMass, $NaturalAbundance, %ZeroNaturalAbundanceMap); | |
| 693 %ZeroNaturalAbundanceMap = (); | |
| 694 | |
| 695 # Process element data... | |
| 696 LINE: while ($Line = GetTextLine(\*ISOTOPEDATAFILE)) { | |
| 697 if ($Line =~ /^#/) { | |
| 698 next LINE; | |
| 699 } | |
| 700 @LineWords = (); | |
| 701 @LineWords = quotewords($InDelim, 0, $Line); | |
| 702 if (@LineWords != $NumOfCols) { | |
| 703 croak "Error: The number of data fields, @LineWords, in $ElementIsotopeDataFile must be $NumOfCols.\nLine: $Line..."; | |
| 704 } | |
| 705 ($AtomicNumber, $IsotopeSymbol, $MassNumber, $RelativeAtomicMass, $NaturalAbundance) = @LineWords; | |
| 706 if (exists $ZeroNaturalAbundanceMap{$AtomicNumber}) { | |
| 707 # Only one isotope data line allowed for elements with no natural isotopes... | |
| 708 carp "Warning: Ignoring isotope data for element with atomic number $AtomicNumber: Only one data line allowed for an element with no natural isotopes.\nLine: $Line..."; | |
| 709 next LINE; | |
| 710 } | |
| 711 if (IsEmpty($NaturalAbundance)) { | |
| 712 $RelativeAtomicMass = 0; | |
| 713 $NaturalAbundance = 0; | |
| 714 $ZeroNaturalAbundanceMap{$AtomicNumber} = 1; | |
| 715 } | |
| 716 if (exists $ElementIsotopeDataMap{$AtomicNumber}) { | |
| 717 # Additional data for an existing element... | |
| 718 if (exists $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}) { | |
| 719 carp "Warning: Ignoring isotope data for element with atomic number $AtomicNumber: It has already been loaded.\nLine: $Line..."; | |
| 720 next LINE; | |
| 721 } | |
| 722 } | |
| 723 else { | |
| 724 # Data for a new element... | |
| 725 %{$ElementIsotopeDataMap{$AtomicNumber}} = (); | |
| 726 } | |
| 727 %{$ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}} = (); | |
| 728 $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{IsotopeSymbol} = $IsotopeSymbol; | |
| 729 $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{RelativeAtomicMass} = $RelativeAtomicMass; | |
| 730 $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{NaturalAbundance} = $NaturalAbundance; | |
| 731 } | |
| 732 close ISOTOPEDATAFILE; | |
| 733 | |
| 734 _SetupElementIsotopeDerivedDataMap(); | |
| 735 } | |
| 736 | |
| 737 # | |
| 738 # Map mass number of most abundant isotope for each element; additionally, | |
| 739 # count number of isotopes as well. | |
| 740 # | |
| 741 sub _SetupElementIsotopeDerivedDataMap { | |
| 742 my($AtomicNumber, $MassNumber, $NaturalAbundance, $MostNaturalAbundance, $MostAbundantMassNumber, $IsotopeCount); | |
| 743 | |
| 744 %ElementIsotopeDerivedDataMap = (); | |
| 745 | |
| 746 for $AtomicNumber (sort {$a <=> $b} keys %ElementIsotopeDataMap) { | |
| 747 $IsotopeCount = 0; | |
| 748 $MostAbundantMassNumber = 0; | |
| 749 $MostNaturalAbundance = 0; | |
| 750 MASSNUMBER: for $MassNumber (sort {$a <=> $b} keys %{$ElementIsotopeDataMap{$AtomicNumber}}) { | |
| 751 $NaturalAbundance = $ElementIsotopeDataMap{$AtomicNumber}{$MassNumber}{NaturalAbundance}; | |
| 752 if (IsEmpty($NaturalAbundance)) { | |
| 753 # No natural isotopes available... | |
| 754 $MostAbundantMassNumber = $MassNumber; | |
| 755 last MASSNUMBER; | |
| 756 } | |
| 757 if ($NaturalAbundance == 0) { | |
| 758 # Not a natural isotope; Listed in periodic table data file to support non-natural | |
| 759 # elements such as T. It's not included in natural isotope count... | |
| 760 next MASSNUMBER; | |
| 761 } | |
| 762 $IsotopeCount++; | |
| 763 if ($NaturalAbundance > $MostNaturalAbundance) { | |
| 764 $MostAbundantMassNumber = $MassNumber; | |
| 765 $MostNaturalAbundance = $NaturalAbundance; | |
| 766 } | |
| 767 } | |
| 768 %{$ElementIsotopeDerivedDataMap{$AtomicNumber}} = (); | |
| 769 $ElementIsotopeDerivedDataMap{$AtomicNumber}{IsotopeCount} = $IsotopeCount; | |
| 770 $ElementIsotopeDerivedDataMap{$AtomicNumber}{MostAbundantMassNumber} = $MostAbundantMassNumber; | |
| 771 } | |
| 772 } | |
| 773 | |
| 774 # | |
| 775 # Setup element symbol map... | |
| 776 # | |
| 777 sub _SetupElementSymbolMap { | |
| 778 my($AtomicNumber, $ElementSymbol); | |
| 779 | |
| 780 %ElementSymbolMap = (); | |
| 781 | |
| 782 for $AtomicNumber (keys %ElementDataMap) { | |
| 783 $ElementSymbol = $ElementDataMap{$AtomicNumber}{ElementSymbol}; | |
| 784 $ElementSymbolMap{$ElementSymbol} = $AtomicNumber; | |
| 785 } | |
| 786 } | |
| 787 | |
| 788 # Validate element ID... | |
| 789 sub _ValidateElementID { | |
| 790 my($ElementID) = @_; | |
| 791 my($ElementSymbol, $AtomicNumber); | |
| 792 | |
| 793 if ($ElementID =~ /[^0-9]/) { | |
| 794 # Assume atomic symbol... | |
| 795 $ElementSymbol = $ElementID; | |
| 796 if (exists $ElementSymbolMap{$ElementSymbol}) { | |
| 797 $AtomicNumber = $ElementSymbolMap{$ElementSymbol}; | |
| 798 } | |
| 799 else { | |
| 800 return undef; | |
| 801 } | |
| 802 } | |
| 803 else { | |
| 804 # Assume atomic number... | |
| 805 $AtomicNumber = $ElementID; | |
| 806 if (!exists $ElementDataMap{$AtomicNumber}) { | |
| 807 return undef; | |
| 808 } | |
| 809 } | |
| 810 return $AtomicNumber; | |
| 811 } | |
| 812 | |
| 813 1; | |
| 814 | |
| 815 __END__ | |
| 816 | |
| 817 =head1 NAME | |
| 818 | |
| 819 PeriodicTable | |
| 820 | |
| 821 =head1 SYNOPSIS | |
| 822 | |
| 823 use PeriodicTable; | |
| 824 | |
| 825 use PeriodicTable qw(:all); | |
| 826 | |
| 827 =head1 DESCRIPTION | |
| 828 | |
| 829 B<PeriodicTable> module provides the following functions: | |
| 830 | |
| 831 GetElementMostAbundantNaturalIsotopeData, | |
| 832 GetElementMostAbundantNaturalIsotopeMass, | |
| 833 GetElementMostAbundantNaturalIsotopeMassNumber, GetElementNaturalIsotopeAbundance, | |
| 834 GetElementNaturalIsotopeCount, GetElementNaturalIsotopeMass, | |
| 835 GetElementNaturalIsotopesData, GetElementPropertiesData, | |
| 836 GetElementPropertiesNames, GetElementPropertiesNamesAndUnits, | |
| 837 GetElementPropertyUnits, GetElements, GetElementsByAmericanStyleGroupLabel, | |
| 838 GetElementsByEuropeanStyleGroupLabel, GetElementsByGroupName, | |
| 839 GetElementsByGroupNumber, GetElementsByPeriodNumber, | |
| 840 GetIUPACGroupNumberFromAmericanStyleGroupLabel, | |
| 841 GetIUPACGroupNumberFromEuropeanStyleGroupLabel, IsElement, | |
| 842 IsElementNaturalIsotopeMassNumber, IsElementProperty | |
| 843 | |
| 844 =head1 METHODS | |
| 845 | |
| 846 =over 4 | |
| 847 | |
| 848 =item B<GetElements> | |
| 849 | |
| 850 @ElementSymbols = GetElements(); | |
| 851 $ElementSymbolsRef = GetElements(); | |
| 852 | |
| 853 Returns an array or a reference to an array of known element symbols | |
| 854 | |
| 855 =item B<GetElementsByGroupName> | |
| 856 | |
| 857 @ElementSymbols = GetElementsByGroupName($GroupName); | |
| 858 $ElementSymbolsRef = GetElementsByGroupName($GroupName); | |
| 859 | |
| 860 Returns an array or a reference to an array of element symbols for a specified I<GroupName>. | |
| 861 Supported I<GroupName> values are: I<Alkali metals, Alkaline earth metals, Coinage metals, Pnictogens, | |
| 862 Chalcogens, Halogens, Noble gases>; Additionally, usage of I<Lanthanides> (Lanthanoids) | |
| 863 and I<Actinides> (Actinoids) is also supported. | |
| 864 | |
| 865 =item B<GetElementsByGroupNumber> | |
| 866 | |
| 867 @ElementSymbols = GetElementsByGroupNumber($GroupNumber); | |
| 868 $ElementSymbolsRef = GetElementsByGroupNumber($GroupNumber); | |
| 869 | |
| 870 Returns an array or a reference to an array of element symbols for a specified I<GroupNumber> | |
| 871 | |
| 872 =item B<GetElementsByAmericanStyleGroupLabel> | |
| 873 | |
| 874 @ElementSymbols = GetElementsByAmericanStyleGroupLabel($GroupLabel); | |
| 875 $ElementSymbolsRef = GetElementsByAmericanStyleGroupLabel($GroupLabel); | |
| 876 | |
| 877 Returns an array or a reference to an array of element symbols for a specified American | |
| 878 style I<GroupLabel>. Valid values for Amercian style group labels: I<IA to VIIIA, IB to VIIIB, VIII>. | |
| 879 | |
| 880 =item B<GetElementsByEuropeanStyleGroupLabel> | |
| 881 | |
| 882 @ElementSymbols = GetElementsByEuropeanStyleGroupLabel($GroupLabel); | |
| 883 $ElementSymbolsRef = GetElementsByEuropeanStyleGroupLabel($GroupLabel); | |
| 884 | |
| 885 Returns an array or a reference to an array of element symbols for a specified European | |
| 886 style I<GroupLabel>. Valid values for European style group labels: I<IA to VIIIA, IB to VIIIB, VIII>. | |
| 887 | |
| 888 =item B<GetElementsByPeriodNumber> | |
| 889 | |
| 890 @ElementSymbols = GetElementsByPeriodNumber($PeriodNumber); | |
| 891 $ElementSymbolsRef = GetElementsByPeriodNumber($PeriodNumber); | |
| 892 | |
| 893 Returns an array or a reference to an array of element symbols for a specified I<PeriodNumber>. | |
| 894 | |
| 895 =item B<GetElementMostAbundantNaturalIsotopeData> | |
| 896 | |
| 897 @IsotopeData = GetElementMostAbundantNaturalIsotopeData( | |
| 898 $ElementID); | |
| 899 $IsotopeDataRef = GetElementMostAbundantNaturalIsotopeData( | |
| 900 $ElementID); | |
| 901 | |
| 902 Returns an array or reference to an array containing data for most abundant isotope of | |
| 903 an element specfied by element symbol or atomic number. Isotope data arrays contain these | |
| 904 values: I<AtomicNumber, IsotopeSymbol, MassNumber, RelativeAtomicMass, and NaturalAbundance>. | |
| 905 | |
| 906 =item B<GetElementMostAbundantNaturalIsotopeMassNumber> | |
| 907 | |
| 908 $MassNumber = GetElementMostAbundantNaturalIsotopeMassNumber($ElementID); | |
| 909 | |
| 910 Returns mass number of most abundant natural isotope of an element specfied by element | |
| 911 symbol or atomic number | |
| 912 | |
| 913 =item B<GetElementNaturalIsotopeCount> | |
| 914 | |
| 915 $IsotopeCount = GetElementNaturalIsotopeCount($ElementID); | |
| 916 | |
| 917 Returns natural isotope count for an element specfied by element symbol or | |
| 918 atomic number | |
| 919 | |
| 920 =item B<GetElementNaturalIsotopesData> | |
| 921 | |
| 922 $DataHashRef = GetElementNaturalIsotopesData($ElementID, | |
| 923 [$MassNumber]); | |
| 924 | |
| 925 Reurns a reference to a hash containingall available isotope data for an element specified | |
| 926 using element symbol or aromic number; an optional mass number indicates retrieve data | |
| 927 for a specific isotope | |
| 928 | |
| 929 =item B<GetElementNaturalIsotopeAbundance> | |
| 930 | |
| 931 $Abundance = GetElementNaturalIsotopeAbundance($ElementID, | |
| 932 $MassNumber); | |
| 933 | |
| 934 Returns percent abundance of natural isotope for an element with specfic mass | |
| 935 number. | |
| 936 | |
| 937 =item B<GetElementMostAbundantNaturalIsotopeMass> | |
| 938 | |
| 939 $RelativeAtomicMass = GetElementMostAbundantNaturalIsotopeMass( | |
| 940 $ElementID); | |
| 941 | |
| 942 Returns relative atomic mass of most abundant isotope for an element specified using | |
| 943 element symbol or aromic number. | |
| 944 | |
| 945 =item B<GetElementNaturalIsotopeMass> | |
| 946 | |
| 947 $RelativeAtomicMass = GetElementNaturalIsotopeMass($ElementID, | |
| 948 $MassNumber); | |
| 949 | |
| 950 Returns relative atomic mass of an element with specfic mass number. | |
| 951 | |
| 952 =item B<GetElementPropertiesData> | |
| 953 | |
| 954 $PropertyDataHashRef = GetElementPropertiesData($ElementID); | |
| 955 | |
| 956 Returns a reference to a hash containing all available properties data for an element | |
| 957 specified using element symbol or atomic number. | |
| 958 | |
| 959 =item B<GetElementPropertyName> | |
| 960 | |
| 961 $PropertyValue = GetElement<PropertyName>($ElementID); | |
| 962 | |
| 963 Returns value of an element for a element specified using element symbol or atomic number. | |
| 964 | |
| 965 These functions are not defined in this modules; these are implemented on-the-fly using | |
| 966 Perl's AUTOLOAD funcionality. | |
| 967 | |
| 968 Here is the list of known element I<property names>: AllenElectronegativity, | |
| 969 AllredRochowElectronegativity, AtomicNumber, AtomicRadiusCalculated, | |
| 970 AtomicRadiusEmpirical, AtomicWeight, Block, BoilingPoint, BondLength, | |
| 971 BrinellHardness, BulkModulus, Classification, CoefficientOfLinearExpansion, Color, | |
| 972 CommonValences, LowestCommonValence, HighestCommonValence, | |
| 973 CommonOxidationNumbers, LowestCommonOxidationNumber, HighestCommonOxidationNumber, | |
| 974 CovalentRadiusEmpirical, CriticalTemperature, DensityOfSolid, DiscoveredAt, DiscoveredBy, | |
| 975 DiscoveredWhen, ElectricalResistivity, ElectronAffinity, ElementName, ElementSymbol, EnthalpyOfAtmization, | |
| 976 EnthalpyOfFusion, EnthalpyOfVaporization, FirstIonizationEnergy, GroundStateConfiguration, GroundStateLevel, | |
| 977 GroupName, GroupNumber, NaturalIsotopeData, MeltingPoint, MineralHardness, MolarVolume, | |
| 978 MullikenJaffeElectronegativity, OriginOfName, PaulingElectronegativity, PeriodNumber, PoissonsRatio, | |
| 979 Reflectivity, RefractiveIndex, RigidityModulus, SandersonElectronegativity, StandardState, | |
| 980 SuperconductionTemperature, ThermalConductivity, VanderWaalsRadius, VelocityOfSound, VickersHardness, | |
| 981 YoungsModulus. | |
| 982 | |
| 983 =item B<GetElementPropertiesNames> | |
| 984 | |
| 985 @PropertyNames = GetElementPropertiesNames([$Mode]); | |
| 986 $PropertyNamesRef = GetElementPropertiesNames([$Mode]); | |
| 987 | |
| 988 Returns names of all available element properties. Optional mode parameter controls | |
| 989 grouping of property names; Possible values: I<ByGroup or Alphabetical>. Default: | |
| 990 I<ByGroup>. | |
| 991 | |
| 992 =item B<GetElementPropertiesNamesAndUnits> | |
| 993 | |
| 994 $NameUnitsHashRef = GetElementPropertiesNamesAndUnits(); | |
| 995 | |
| 996 Returns a reference to a hash of property names and units of all available element | |
| 997 properties. Names with no units contains empty strings. | |
| 998 | |
| 999 =item B<GetElementPropertyUnits> | |
| 1000 | |
| 1001 $Units = GetElementPropertyUnits($PropertyName); | |
| 1002 | |
| 1003 Returns units for a specific element property name. An empty string is returned for | |
| 1004 a property with no units. | |
| 1005 | |
| 1006 =item B<GetIUPACGroupNumberFromAmericanStyleGroupLabel> | |
| 1007 | |
| 1008 $GroupNumber = GetIUPACGroupNumberFromAmericanStyleGroupLabel( | |
| 1009 $GroupLabel); | |
| 1010 | |
| 1011 Returns IUPAC group numbers of a specific American style group label. A comma delimited | |
| 1012 string is returned for group VIII or VIIIB. | |
| 1013 | |
| 1014 =item B<GetIUPACGroupNumberFromEuropeanStyleGroupLabel> | |
| 1015 | |
| 1016 $GroupNumber = GetIUPACGroupNumberFromEuropeanStyleGroupLabel( | |
| 1017 $GroupLabel); | |
| 1018 | |
| 1019 Returns IUPAC group numbers of a specific European style group label. A comma delimited | |
| 1020 string is returned for group VIII or VIIIA. | |
| 1021 | |
| 1022 =item B<IsElement> | |
| 1023 | |
| 1024 $Status = IsElement($ElementID); | |
| 1025 | |
| 1026 Returns 1 or 0 based on whether it's a known element symbol or atomic number. | |
| 1027 | |
| 1028 =item B<IsElementNaturalIsotopeMassNumber> | |
| 1029 | |
| 1030 $Status = IsElementNaturalIsotopeMassNumber($ElementID, $MassNumber); | |
| 1031 | |
| 1032 Returns 1 or 0 based on whether it's a valid mass number for an element symbol | |
| 1033 or atomic number. | |
| 1034 | |
| 1035 =item B<IsElementProperty> | |
| 1036 | |
| 1037 $Status = IsElementProperty($PropertyName); | |
| 1038 | |
| 1039 Returns 1 or 0 based on whether it's a valid property name. | |
| 1040 | |
| 1041 =back | |
| 1042 | |
| 1043 =head1 AUTHOR | |
| 1044 | |
| 1045 Manish Sud <msud@san.rr.com> | |
| 1046 | |
| 1047 =head1 SEE ALSO | |
| 1048 | |
| 1049 AminoAcids.pm, NucleicAcids.pm | |
| 1050 | |
| 1051 =head1 COPYRIGHT | |
| 1052 | |
| 1053 Copyright (C) 2015 Manish Sud. All rights reserved. | |
| 1054 | |
| 1055 This file is part of MayaChemTools. | |
| 1056 | |
| 1057 MayaChemTools is free software; you can redistribute it and/or modify it under | |
| 1058 the terms of the GNU Lesser General Public License as published by the Free | |
| 1059 Software Foundation; either version 3 of the License, or (at your option) | |
| 1060 any later version. | |
| 1061 | |
| 1062 =cut |
