File Coverage

blib/lib/HackaMol/PeriodicTable.pm
Criterion Covered Total %
statement 18 18 100.0
branch 3 4 75.0
condition n/a
subroutine 4 4 100.0
pod n/a
total 25 26 96.1


line stmt bran cond sub pod time code
1             package HackaMol::PeriodicTable;
2             $HackaMol::PeriodicTable::VERSION = '0.051';
3             #ABSTRACT: package for period table data... needs to change
4 19     19   447 use 5.008;
  19         75  
5             require Exporter;
6             our @ISA = qw(Exporter);
7             our @EXPORT_OK = qw(%KNOWN_NAMES %ATOM_MULTIPLICITY @EXHEAT @ELEMENTS
8             %ELEMENTS %ATOMIC_MASSES @COVALENT_RADII @VDW_RADII _element_name _trim _qstring_num);
9              
10             # lifted from Ivan's PerlMol
11             our @ELEMENTS = qw(
12             X
13             H He
14             Li Be B C N O F Ne
15             Na Mg Al Si P S Cl Ar
16             K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr
17             Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe
18             Cs Ba
19             La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb
20             Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn
21             Fr Ra
22             Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No
23             Lr Rf Db Sg Bh Hs Mt Ds Uuu Uub Uut Uuq Uup Uuh Uus Uuo
24             );
25              
26             our %ELEMENTS;
27             $ELEMENTS{ $ELEMENTS[$_] } = $_ foreach ( 0 .. $#ELEMENTS );
28             $ELEMENTS{D} = $ELEMENTS{T} = 1;
29              
30             # lifted from Ivan's PerlMol
31             our %ATOMIC_MASSES = (
32             H => 1.00794,
33             D => 2.014101,
34             T => 3.016049,
35             He => 4.002602,
36             Li => 6.941,
37             Be => 9.012182,
38             B => 10.811,
39             C => 12.0107,
40             N => 14.00674,
41             O => 15.9994,
42             F => 18.9984032,
43             Ne => 20.1797,
44             Na => 22.989770,
45             Mg => 24.3050,
46             Al => 26.981538,
47             Si => 28.0855,
48             P => 30.973761,
49             S => 32.066,
50             Cl => 35.4527,
51             Ar => 39.948,
52             K => 39.0983,
53             Ca => 40.078,
54             Sc => 44.955910,
55             Ti => 47.867,
56             V => 50.9415,
57             Cr => 51.9961,
58             Mn => 54.938049,
59             Fe => 55.845,
60             Co => 58.933200,
61             Ni => 58.6934,
62             Cu => 63.546,
63             Zn => 65.382,
64             Ga => 69.723,
65             Ge => 72.61,
66             As => 74.92160,
67             Se => 78.96,
68             Br => 79.904,
69             Kr => 83.80,
70             Rb => 85.4678,
71             Sr => 87.62,
72             Y => 88.90585,
73             Zr => 91.224,
74             Nb => 92.90638,
75             Mo => 95.94,
76             Tc => 98,
77             Ru => 101.07,
78             Rh => 102.90550,
79             Pd => 106.42,
80             Ag => 107.8682,
81             Cd => 112.411,
82             In => 114.818,
83             Sn => 118.710,
84             Sb => 121.760,
85             Te => 127.60,
86             I => 126.90447,
87             Xe => 131.29,
88             Cs => 132.90545,
89             Ba => 137.327,
90             La => 138.9055,
91             Ce => 140.116,
92             Pr => 140.90765,
93             Nd => 144.24,
94             Pm => 145,
95             Sm => 150.36,
96             Eu => 151.964,
97             Gd => 157.25,
98             Tb => 158.92534,
99             Dy => 162.50,
100             Ho => 164.93032,
101             Er => 167.26,
102             Tm => 168.93421,
103             Yb => 173.04,
104             Lu => 174.967,
105             Hf => 178.49,
106             Ta => 180.9479,
107             W => 183.84,
108             Re => 186.207,
109             Os => 190.23,
110             Ir => 192.217,
111             Pt => 195.078,
112             Au => 196.96655,
113             Hg => 200.592,
114             Tl => 204.3833,
115             Pb => 207.2,
116             Bi => 208.98038,
117             Po => 209,
118             At => 210,
119             Rn => 222,
120             Fr => 223,
121             Ra => 226,
122             Ac => 227,
123             Th => 232.038,
124             Pa => 231.03588,
125             U => 238.0289,
126             Np => 237,
127             Pu => 244,
128             Am => 243,
129             Cm => 247,
130             Bk => 247,
131             Cf => 251,
132             Es => 252,
133             Fm => 257,
134             Md => 258,
135             No => 259,
136             Lr => 262,
137             Rf => 261,
138             Db => 262,
139             Sg => 266,
140             Bh => 264,
141             Hs => 269,
142             Mt => 268,
143             Ds => 271,
144             X => 0.0,
145             );
146              
147             our %ATOM_MULTIPLICITY = (
148              
149             # from jerry's thermo script
150             # see webelements.com .. thinking about term symbols and shit like that
151             H => 2,
152             C => 3,
153             N => 4,
154             O => 3,
155             F => 2,
156             P => 4,
157             S => 3,
158             Cl => 2,
159             Br => 2,
160             I => 2,
161             Hg => 1,
162             );
163              
164             # directly from MNDO99, which grabbed them from mopac
165             # I believe these are at 298, from the thermo gaussian thingy
166             # enthalpy correction from 0K (as calculated by gaussian) to 298
167             # is on the order of 1 kcal/mol, which seems silly to mess with
168             # unless one is actually interested in absolute heats of formation
169             # SEQM HOF is something like this:
170             # HoF(M) = tot_Eelec(M) - sum(x[X]*Hof_exp[X] -x[X]*atom_energy)
171             our @EXHEAT;
172             $EXHEAT[0] = 0.000;
173             $EXHEAT[1] = 52.102;
174             $EXHEAT[2] = 0.000;
175             $EXHEAT[3] = 38.410;
176             $EXHEAT[4] = 76.960;
177             $EXHEAT[5] = 135.700;
178             $EXHEAT[6] = 170.890;
179             $EXHEAT[7] = 113.000;
180             $EXHEAT[8] = 59.559;
181             $EXHEAT[9] = 18.890;
182             $EXHEAT[10] = 0.000;
183             $EXHEAT[11] = 25.650;
184             $EXHEAT[12] = 35.000;
185             $EXHEAT[13] = 79.490;
186             $EXHEAT[14] = 108.390;
187             $EXHEAT[15] = 75.570;
188             $EXHEAT[16] = 66.400;
189             $EXHEAT[17] = 28.990;
190             $EXHEAT[18] = 0.000;
191             $EXHEAT[19] = 21.420;
192             $EXHEAT[20] = 42.600;
193             $EXHEAT[21] = 90.300;
194             $EXHEAT[22] = 112.300;
195             $EXHEAT[23] = 122.900;
196             $EXHEAT[24] = 95.000;
197             $EXHEAT[25] = 67.700;
198             $EXHEAT[26] = 99.300;
199             $EXHEAT[27] = 102.400;
200             $EXHEAT[28] = 102.800;
201             $EXHEAT[29] = 80.700;
202             $EXHEAT[30] = 31.170;
203             $EXHEAT[31] = 65.400;
204             $EXHEAT[32] = 89.500;
205             $EXHEAT[33] = 72.300;
206             $EXHEAT[34] = 54.300;
207             $EXHEAT[35] = 26.740;
208             $EXHEAT[36] = 0.000;
209             $EXHEAT[37] = 19.600;
210             $EXHEAT[38] = 39.100;
211             $EXHEAT[39] = 101.500;
212             $EXHEAT[40] = 145.500;
213             $EXHEAT[41] = 172.400;
214             $EXHEAT[42] = 157.300;
215             $EXHEAT[43] = 0.000;
216             $EXHEAT[44] = 155.500;
217             $EXHEAT[45] = 133.000;
218             $EXHEAT[46] = 90.000;
219             $EXHEAT[47] = 68.100;
220             $EXHEAT[48] = 26.720;
221             $EXHEAT[49] = 58.000;
222             $EXHEAT[50] = 72.200;
223             $EXHEAT[51] = 63.200;
224             $EXHEAT[52] = 47.000;
225             $EXHEAT[53] = 25.517;
226             $EXHEAT[54] = 0.000;
227             $EXHEAT[55] = 18.700;
228             $EXHEAT[56] = 42.500;
229             $EXHEAT[57] = 0.000;
230             $EXHEAT[58] = 101.300;
231             $EXHEAT[59] = 0.000;
232             $EXHEAT[60] = 0.000;
233             $EXHEAT[61] = 0.000;
234             $EXHEAT[62] = 49.400;
235             $EXHEAT[63] = 0.000;
236             $EXHEAT[64] = 0.000;
237             $EXHEAT[65] = 0.000;
238             $EXHEAT[66] = 0.000;
239             $EXHEAT[67] = 0.000;
240             $EXHEAT[68] = 75.800;
241             $EXHEAT[69] = 0.000;
242             $EXHEAT[70] = 36.350;
243             $EXHEAT[71] = 0.000;
244             $EXHEAT[72] = 148.000;
245             $EXHEAT[73] = 186.900;
246             $EXHEAT[74] = 203.100;
247             $EXHEAT[75] = 185.000;
248             $EXHEAT[76] = 188.000;
249             $EXHEAT[77] = 160.000;
250             $EXHEAT[78] = 135.200;
251             $EXHEAT[79] = 88.000;
252             $EXHEAT[80] = 14.690;
253             $EXHEAT[81] = 43.550;
254             $EXHEAT[82] = 46.620;
255             $EXHEAT[83] = 50.100;
256             $EXHEAT[84] = 0.000;
257             $EXHEAT[85] = 0.000;
258             $EXHEAT[86] = 34.800;
259              
260             our @COVALENT_RADII = (
261              
262             #in pm http://en.wikipedia.org/wiki/Covalent_radius
263             # P. Pyykkö, M. Atsumi (2009).
264             #"Molecular Single-Bond Covalent Radii for Elements 1-118". Chemistry: A European Journal 15: 186–197.
265             # doi:10.1002/chem.200800987.
266             # P. Pyykkö, M. Atsumi (2009).
267             # "Molecular Double-Bond Covalent Radii for Elements Li–E112". Chemistry: A European Journal 15 (46):
268             # 12770–12779.
269             # doi:10.1002/chem.200901472.. Figure 3 of this paper contains all radii of refs. The mean-square deviation of each set is 3 pm.
270             # P. Pyykkö, S. Riedel, M. Patzschke (2005).
271             # "Triple-Bond Covalent Radii". Chemistry: A European Journal 11 (12): 3511–3520.
272             # doi:10.1002/chem.200401299. PMID 15832398.
273             # Z sng dub trip all in pm
274             [ 0, 0, '-', '-' ],
275             [ 1, 32, '-', '-' ],
276             [ 2, 46, '-', '-' ],
277             [ 3, 133, 133, 124 ],
278             [ 4, 102, 90, 85 ],
279             [ 5, 85, 78, 73 ],
280             [ 6, 75, 67, 60 ],
281             [ 7, 71, 60, 54 ],
282             [ 8, 63, 57, 53 ],
283             [ 9, 64, 59, 53 ],
284             [ 10, 67, 96, '-' ],
285             [ 11, 155, 160, '-' ],
286             [ 12, 139, 132, 127 ],
287             [ 13, 126, 113, 111 ],
288             [ 14, 116, 107, 102 ],
289             [ 15, 111, 102, 94 ],
290             [ 16, 103, 94, 95 ],
291             [ 17, 99, 95, 93 ],
292             [ 18, 96, 107, 96 ],
293             [ 19, 196, 193, '-' ],
294             [ 20, 171, 147, 133 ],
295             [ 21, 148, 116, 114 ],
296             [ 22, 136, 117, 108 ],
297             [ 23, 134, 112, 106 ],
298             [ 24, 122, 111, 103 ],
299             [ 25, 119, 105, 103 ],
300             [ 26, 116, 109, 102 ],
301             [ 27, 111, 103, 96 ],
302             [ 28, 110, 101, 101 ],
303             [ 29, 112, 115, 120 ],
304             [ 30, 118, 120, '-' ],
305             [ 31, 124, 117, 121 ],
306             [ 32, 121, 111, 114 ],
307             [ 33, 121, 114, 106 ],
308             [ 34, 116, 107, 107 ],
309             [ 35, 114, 109, 110 ],
310             [ 36, 117, 121, 108 ],
311             [ 37, 210, 202, '-' ],
312             [ 38, 185, 157, 139 ],
313             [ 39, 163, 130, 124 ],
314             [ 40, 154, 127, 121 ],
315             [ 41, 147, 125, 116 ],
316             [ 42, 138, 121, 113 ],
317             [ 43, 128, 120, 110 ],
318             [ 44, 125, 114, 103 ],
319             [ 45, 125, 110, 106 ],
320             [ 46, 120, 117, 112 ],
321             [ 47, 128, 139, 137 ],
322             [ 48, 136, 144, '-' ],
323             [ 49, 142, 136, 146 ],
324             [ 50, 140, 130, 132 ],
325             [ 51, 140, 133, 127 ],
326             [ 52, 136, 128, 121 ],
327             [ 53, 133, 129, 125 ],
328             [ 54, 131, 135, 122 ],
329             [ 55, 232, 209, '-' ],
330             [ 56, 196, 161, 149 ],
331             [ 57, 180, 139, 139 ],
332             [ 58, 163, 137, 131 ],
333             [ 59, 176, 138, 128 ],
334             [ 60, 174, 137, '-' ],
335             [ 61, 173, 135, '-' ],
336             [ 62, 172, 134, '-' ],
337             [ 63, 168, 134, '-' ],
338             [ 64, 169, 135, 132 ],
339             [ 65, 168, 135, '-' ],
340             [ 66, 167, 133, '-' ],
341             [ 67, 166, 133, '-' ],
342             [ 68, 165, 133, '-' ],
343             [ 69, 164, 131, '-' ],
344             [ 70, 170, 129, '-' ],
345             [ 71, 162, 131, 131 ],
346             [ 72, 152, 128, 122 ],
347             [ 73, 146, 126, 119 ],
348             [ 74, 137, 120, 115 ],
349             [ 75, 131, 119, 110 ],
350             [ 76, 129, 116, 109 ],
351             [ 77, 122, 115, 107 ],
352             [ 78, 123, 112, 110 ],
353             [ 79, 124, 121, 123 ],
354             [ 80, 133, 142, '-' ],
355             [ 81, 144, 142, 150 ],
356             [ 82, 144, 135, 137 ],
357             [ 83, 151, 141, 135 ],
358             [ 84, 145, 135, 129 ],
359             [ 85, 147, 138, 138 ],
360             [ 86, 142, 145, 133 ],
361             [ 87, 223, 218, '-' ],
362             [ 88, 201, 173, 159 ],
363             [ 89, 186, 153, 140 ],
364             [ 90, 175, 143, 136 ],
365             [ 91, 169, 138, 129 ],
366             [ 92, 170, 134, 118 ],
367             [ 93, 171, 136, 116 ],
368             [ 94, 172, 135, '-' ],
369             [ 95, 166, 135, '-' ],
370             [ 96, 166, 136, '-' ],
371             [ 97, 168, 139, '-' ],
372             [ 98, 168, 140, '-' ],
373             [ 99, 165, 140, '-' ],
374             [ 100, 167, '-', '-' ],
375             [ 101, 173, 139, '-' ],
376             [ 102, 176, '-', '-' ],
377             [ 103, 161, 141, '-' ],
378             [ 104, 157, 140, 131 ],
379             [ 105, 149, 136, 126 ],
380             [ 106, 143, 128, 121 ],
381             [ 107, 141, 128, 119 ],
382             [ 108, 134, 125, 118 ],
383             [ 109, 129, 125, 113 ],
384             [ 110, 128, 116, 112 ],
385             [ 111, 121, 116, 118 ],
386             [ 112, 122, 137, 130 ],
387             [ 113, 136, '-', '-' ],
388             [ 114, 143, '-', '-' ],
389             [ 115, 162, '-', '-' ],
390             [ 116, 175, '-', '-' ],
391             [ 117, 165, '-', '-' ],
392             [ 118, 157, '-', '-' ],
393             );
394              
395             our @VDW_RADII = (
396              
397             # http://en.wikipedia.org/wiki/Atomic_radii_of_the_elements_%28data_page%29
398             # the covalent vals are shady on this page
399             [ 0, 0 ],
400             [ 1, 120 ],
401             [ 2, 140 ],
402             [ 3, 182 ],
403             [ 4, 153 ],
404             [ 5, 192 ],
405             [ 6, 170 ],
406             [ 7, 155 ],
407             [ 8, 152 ],
408             [ 9, 147 ],
409             [ 10, 154 ],
410             [ 11, 227 ],
411             [ 12, 173 ],
412             [ 13, 184 ],
413             [ 14, 210 ],
414             [ 15, 180 ],
415             [ 16, 180 ],
416             [ 17, 175 ],
417             [ 18, 188 ],
418             [ 19, 275 ],
419             [ 20, 231 ],
420             [ 21, 211 ],
421             [ 22, 999 ],
422             [ 23, 999 ],
423             [ 24, 999 ],
424             [ 25, 999 ],
425             [ 26, 999 ],
426             [ 27, 999 ],
427             [ 28, 163 ],
428             [ 29, 140 ],
429             [ 30, 139 ],
430             [ 31, 187 ],
431             [ 32, 211 ],
432             [ 33, 185 ],
433             [ 34, 190 ],
434             [ 35, 185 ],
435             [ 36, 202 ],
436             [ 37, 303 ],
437             [ 38, 249 ],
438             [ 39, 999 ],
439             [ 40, 999 ],
440             [ 41, 999 ],
441             [ 42, 999 ],
442             [ 43, 999 ],
443             [ 44, 999 ],
444             [ 45, 999 ],
445             [ 46, 163 ],
446             [ 47, 172 ],
447             [ 48, 158 ],
448             [ 49, 193 ],
449             [ 50, 217 ],
450             [ 51, 206 ],
451             [ 52, 206 ],
452             [ 53, 198 ],
453             [ 54, 216 ],
454             [ 55, 343 ],
455             [ 56, 268 ],
456             [ 57, 999 ],
457             [ 58, 999 ],
458             [ 59, 999 ],
459             [ 60, 999 ],
460             [ 61, 999 ],
461             [ 62, 999 ],
462             [ 63, 999 ],
463             [ 64, 999 ],
464             [ 65, 999 ],
465             [ 66, 999 ],
466             [ 67, 999 ],
467             [ 68, 999 ],
468             [ 69, 999 ],
469             [ 70, 999 ],
470             [ 71, 999 ],
471             [ 72, 999 ],
472             [ 73, 999 ],
473             [ 74, 999 ],
474             [ 75, 999 ],
475             [ 76, 999 ],
476             [ 77, 999 ],
477             [ 78, 175 ],
478             [ 79, 166 ],
479             [ 80, 155 ],
480             [ 81, 196 ],
481             [ 82, 202 ],
482             [ 83, 207 ],
483             [ 84, 197 ],
484             [ 85, 202 ],
485             [ 86, 220 ],
486             [ 87, 348 ],
487             [ 88, 283 ],
488             [ 89, 999 ],
489             [ 90, 999 ],
490             [ 91, 999 ],
491             [ 92, 186 ],
492             [ 93, 999 ],
493             [ 94, 999 ],
494             [ 95, 999 ],
495             [ 96, 999 ],
496             [ 97, 999 ],
497             [ 98, 999 ],
498             [ 99, 999 ],
499             [ 100, 999 ],
500             [ 101, 999 ],
501             [ 102, 999 ],
502             [ 103, 999 ],
503             [ 104, 999 ],
504             [ 105, 999 ],
505             [ 106, 999 ],
506             [ 107, 999 ],
507             [ 108, 999 ],
508             [ 109, 999 ],
509             [ 110, 999 ],
510             [ 111, 999 ],
511             [ 112, 999 ],
512             [ 113, 999 ],
513             [ 114, 999 ],
514             [ 115, 999 ],
515             [ 116, 999 ],
516             [ 117, 999 ],
517             [ 118, 999 ],
518             );
519              
520             our %KNOWN_NAMES;
521             $KNOWN_NAMES{$_} = 'C' foreach qw(C CA CB CD CD1 CD2 CE CE1
522             CE2 CE3 CG CG1 CG2 CH2 CZ CZ2 CZ3);
523             $KNOWN_NAMES{$_} = 'H' foreach qw(H H1 H2 H3 H4 HA HA1 HA2 HB HB1 HB2 HB3 HD1 HD11
524             HD12 HD13 HD2 HD21 HD22 HD23 HD3 HE
525             HE1 HE2 HE21 HE22 HE3 HG HG1 HG11 HG12
526             HG13 HG2 HG21 HG22 HG23 HH HH11 HH12 HH2
527             HH21 HH22 HN HT1 HT2 HT3 HZ HZ1 HZ2 HZ3
528             DUM);
529             $KNOWN_NAMES{$_} = 'N' foreach qw(N ND1 ND2 NE NE1 NE2 NH1 NH2 NZ);
530             $KNOWN_NAMES{$_} = 'O' foreach qw(O OD1 OD2 OE1 OE2 OG OG1 OH OT1 OT2 OH2 OXT);
531             $KNOWN_NAMES{$_} = 'S' foreach qw(S SD SG);
532             $KNOWN_NAMES{$_} = 'Cl' foreach qw(CLA);
533             $KNOWN_NAMES{$_} = 'Na' foreach qw(SOD);
534             $KNOWN_NAMES{$_} = 'K' foreach qw(POT);
535              
536             sub _trim {
537 52548     52548   74098 my $string = shift;
538 52548         101802 $string =~ s/^\s+//;
539              
540             # $string =~ s/\s+$//; #unpack will delete the \s+ in the end;
541 52548         110541 return $string;
542             }
543              
544             sub _qstring_num {
545              
546             # _qstring something like 2+ or 2-
547 7     7   24 my $string = shift;
548 7         25 $string =~ s/\+//;
549 7         24 $string =~ s/(.*?)(\-)/$2$1/;
550 7         112 $string = sprintf( "%g", $string );
551 7         30 return $string;
552              
553             }
554              
555             sub _element_name {
556              
557             # guess the element using the atom name
558 324     324   601 my $name = uc(shift);
559 324         495 my $dirt = 0;
560 324 100       961 unless ( exists( $KNOWN_NAMES{$name} ) ) {
561              
562             #carp "$name doesn not exist in HackaMol::PeriodicTable, if common please add to KNOWN_NAMES";
563 31         65 $dirt = 1;
564 31         75 my $symbol = substr $name, 0, 1; #doesn't work if two letters for symbol
565 31 50       74 $symbol = 'C' if ($symbol eq 'A');
566 31         97 return ( $symbol, $dirt );
567             }
568 293         778 return ( $KNOWN_NAMES{$name}, $dirt );
569             }
570              
571              
572             1;
573              
574             __END__
575              
576             =pod
577              
578             =head1 NAME
579              
580             HackaMol::PeriodicTable - package for period table data... needs to change
581              
582             =head1 VERSION
583              
584             version 0.051
585              
586             =head1 EXTENDS
587              
588             =over 4
589              
590             =item * L<Exporter>
591              
592             =back
593              
594             =head1 AUTHOR
595              
596             Demian Riccardi <demianriccardi@gmail.com>
597              
598             =head1 COPYRIGHT AND LICENSE
599              
600             This software is copyright (c) 2017 by Demian Riccardi.
601              
602             This is free software; you can redistribute it and/or modify it under
603             the same terms as the Perl 5 programming language system itself.
604              
605             =cut