Skip to content

Commit 79a26ea

Browse files
authored
Merge pull request #42 from mvisani/refactor-periodic-table
Refactored PeriodicTable
2 parents 4c2db65 + f8b14ec commit 79a26ea

File tree

7 files changed

+400
-15
lines changed

7 files changed

+400
-15
lines changed

rdkit-sys/src/bridge/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ mod mol_standardize;
1111
pub use mol_standardize::ffi as mol_standardize_ffi;
1212

1313
mod periodic_table;
14-
pub use periodic_table::ffi as periodic_table_ffi;
14+
pub use periodic_table::{ffi as periodic_table_ffi, PeriodicTableOps};
1515

1616
mod ro_mol;
1717
pub use ro_mol::ffi as ro_mol_ffi;
Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,58 @@
1+
// allow camel case
2+
#![allow(non_snake_case)]
3+
4+
use cxx::{CxxVector, UniquePtr};
5+
use ffi::PeriodicTable;
6+
17
#[cxx::bridge(namespace = "RDKit")]
28
pub mod ffi {
39
unsafe extern "C++" {
10+
type PeriodicTable;
411
include!("wrapper/include/periodic_table.h");
5-
pub fn get_valence_list(atomic_number: u32) -> &'static CxxVector<i32>;
6-
pub fn get_most_common_isotope_mass(atom: &CxxString) -> f64;
12+
pub fn get_periodic_table() -> UniquePtr<PeriodicTable>;
13+
pub fn getAtomicWeight(self: &PeriodicTable, atomic_number: u32) -> f64;
14+
pub fn getAtomicNumber(self: &PeriodicTable, atom: &CxxString) -> i32;
15+
pub fn getElementSymbol(atomic_number: u32) -> String;
16+
pub fn getElementName(atomic_number: u32) -> String;
17+
pub fn getRvdw(self: &PeriodicTable, atomic_number: u32) -> f64;
18+
pub fn getRcovalent(self: &PeriodicTable, atomic_number: u32) -> f64;
19+
pub fn getRb0(self: &PeriodicTable, atomic_number: u32) -> f64;
20+
pub fn getDefaultValence(self: &PeriodicTable, atomic_number: u32) -> i32;
21+
fn getValenceList(atomic_number: u32) -> &'static CxxVector<i32>;
22+
pub fn getNouterElecs(self: &PeriodicTable, atomic_number: u32) -> i32;
23+
pub fn getMostCommonIsotope(self: &PeriodicTable, atomic_number: u32) -> i32;
24+
pub fn getMostCommonIsotopeMass(self: &PeriodicTable, atom: &CxxString) -> f64;
25+
pub fn getMassForIsotope(self: &PeriodicTable, atomic_number: u32, isotope: u32) -> f64;
26+
pub fn getMaxAtomicNumber(self: &PeriodicTable) -> u32;
27+
pub fn getAbundanceForIsotope(
28+
self: &PeriodicTable,
29+
atomic_number: u32,
30+
isotope: u32,
31+
) -> f64;
32+
pub fn moreElectroNegative(
33+
self: &PeriodicTable,
34+
atomic_number1: u32,
35+
atomic_number2: u32,
36+
) -> bool;
37+
pub fn getRow(self: &PeriodicTable, atomic_number: u32) -> u32;
38+
}
39+
}
40+
41+
pub trait PeriodicTableOps {
42+
fn getElementSymbol(self, atomic_number: u32) -> String;
43+
fn getElementName(self, atomic_number: u32) -> String;
44+
fn getValenceList(self, atomic_number: u32) -> &'static CxxVector<i32>;
45+
}
46+
impl<'a> PeriodicTableOps for UniquePtr<PeriodicTable> {
47+
fn getElementSymbol(self, atomic_number: u32) -> String {
48+
ffi::getElementSymbol(atomic_number)
49+
}
50+
51+
fn getElementName(self, atomic_number: u32) -> String {
52+
ffi::getElementName(atomic_number)
53+
}
54+
55+
fn getValenceList(self, atomic_number: u32) -> &'static CxxVector<i32> {
56+
ffi::getValenceList(atomic_number)
757
}
858
}
Lines changed: 115 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,126 @@
1+
// ignore camel case
2+
#![allow(non_snake_case)]
3+
14
use cxx::let_cxx_string;
5+
use rdkit_sys::PeriodicTableOps;
26

37
#[test]
48
fn test_get_valence_list() {
5-
let list = rdkit_sys::periodic_table_ffi::get_valence_list(1);
6-
assert_eq!(list.as_slice(), &[1]);
9+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
10+
let list = periodic_table.getValenceList(6);
11+
assert_eq!(list.as_slice(), &[4]);
712
}
813

914
#[test]
1015
fn test_get_monoisotopic_mass() {
1116
let_cxx_string!(atom = "C");
12-
let mass = rdkit_sys::periodic_table_ffi::get_most_common_isotope_mass(&atom);
17+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
18+
let mass = periodic_table.getMostCommonIsotopeMass(&atom);
1319
assert_eq!(mass, 12.00);
1420
}
21+
22+
#[test]
23+
fn test_getAtomicWeight() {
24+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
25+
let weight = periodic_table.getAtomicWeight(6);
26+
assert_eq!(weight, 12.011);
27+
}
28+
29+
#[test]
30+
fn test_getAtomicNumber() {
31+
let_cxx_string!(atom = "C");
32+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
33+
let number = periodic_table.getAtomicNumber(&atom);
34+
assert_eq!(number, 6);
35+
}
36+
37+
#[test]
38+
fn test_getElementSymbol() {
39+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
40+
let symbol = periodic_table.getElementSymbol(6);
41+
assert_eq!(symbol, "C");
42+
}
43+
44+
#[test]
45+
fn test_getElementName() {
46+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
47+
let name = periodic_table.getElementName(6);
48+
assert_eq!(name, "Carbon");
49+
}
50+
51+
#[test]
52+
fn test_getRvdw() {
53+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
54+
let rvdw = periodic_table.getRvdw(6);
55+
assert_eq!(rvdw, 1.7);
56+
}
57+
58+
#[test]
59+
fn test_getRcovalent() {
60+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
61+
let rcovalent = periodic_table.getRcovalent(6);
62+
assert_eq!(rcovalent, 0.76);
63+
}
64+
65+
#[test]
66+
fn test_getRb0() {
67+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
68+
let rb0 = periodic_table.getRb0(6);
69+
assert_eq!(rb0, 0.77);
70+
}
71+
72+
#[test]
73+
fn test_getDefaultValence() {
74+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
75+
let valence = periodic_table.getDefaultValence(6);
76+
assert_eq!(valence, 4);
77+
}
78+
79+
#[test]
80+
fn test_getNouterElecs() {
81+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
82+
let nouter = periodic_table.getNouterElecs(6);
83+
assert_eq!(nouter, 4);
84+
}
85+
86+
#[test]
87+
fn test_getMostCommonIsotope() {
88+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
89+
let isotope = periodic_table.getMostCommonIsotope(6);
90+
assert_eq!(isotope, 12);
91+
}
92+
93+
#[test]
94+
fn test_getRow() {
95+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
96+
let row = periodic_table.getRow(6);
97+
assert_eq!(row, 2);
98+
}
99+
100+
#[test]
101+
fn test_getMassForIsotope() {
102+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
103+
let mass = periodic_table.getMassForIsotope(6, 13);
104+
assert_eq!(mass, 13.00335484);
105+
}
106+
107+
#[test]
108+
fn test_getMaxAtomicNumber() {
109+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
110+
let max = periodic_table.getMaxAtomicNumber();
111+
assert_eq!(max, 118);
112+
}
113+
114+
#[test]
115+
fn test_getAbundanceForIsotope() {
116+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
117+
let abundance = periodic_table.getAbundanceForIsotope(6, 13);
118+
assert_eq!(abundance, 1.07);
119+
}
120+
121+
#[test]
122+
fn test_moreElectroNegative() {
123+
let periodic_table = rdkit_sys::periodic_table_ffi::get_periodic_table();
124+
let more_electro = periodic_table.moreElectroNegative(6, 7);
125+
assert_eq!(more_electro, false);
126+
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
#pragma once
22

33
#include "rust/cxx.h"
4+
#include <GraphMol/PeriodicTable.h>
45

56
namespace RDKit {
6-
const std::vector<int> &get_valence_list(unsigned int atomic_number);
7-
double get_most_common_isotope_mass(const std::string &symbol);
7+
std::unique_ptr<PeriodicTable> get_periodic_table();
8+
rust::String getElementSymbol(unsigned int atomic_number);
9+
rust::String getElementName(unsigned int atomic_number);
10+
const std::vector<int> &getValenceList(unsigned int atomic_number);
811
} // namespace RDKit

rdkit-sys/wrapper/src/periodic_table.cc

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@
22
#include <rdkit/GraphMol/PeriodicTable.h>
33

44
namespace RDKit {
5-
const std::vector<int> &get_valence_list(unsigned int atomic_number) {
5+
std::unique_ptr<PeriodicTable> get_periodic_table() {
6+
// in rdkit we have the following:
7+
// PeriodicTable::getTable() return : const PeriodicTable*
8+
// so we need to take into account that it is a const pointer
9+
return std::make_unique<PeriodicTable>(*PeriodicTable::getTable());
10+
}
11+
rust::String getElementSymbol(unsigned int atomic_number) {
612
PeriodicTable *pt = RDKit::PeriodicTable::getTable();
7-
return pt->getValenceList(atomic_number);
13+
return pt->getElementSymbol(atomic_number);
814
}
915

10-
double get_most_common_isotope_mass(const std::string &symbol) {
16+
rust::String getElementName(unsigned int atomic_number) {
1117
PeriodicTable *pt = RDKit::PeriodicTable::getTable();
12-
return pt->getMostCommonIsotopeMass(symbol);
18+
return pt->getElementName(atomic_number);
1319
}
20+
21+
const std::vector<int> &getValenceList(unsigned int atomic_number) {
22+
PeriodicTable *pt = RDKit::PeriodicTable::getTable();
23+
return pt->getValenceList(atomic_number);
24+
}
25+
1426
} // namespace RDKit

src/periodic_table.rs

Lines changed: 120 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,132 @@
11
use cxx::{let_cxx_string, CxxVector};
2+
use rdkit_sys::PeriodicTableOps;
23

34
pub struct PeriodicTable {}
45

56
impl PeriodicTable {
7+
/// Returns a vector of all stable valences. For atoms where we really don't
8+
/// have any idea what a reasonable maximum valence is (like transition
9+
/// metals), the vector ends with -1
10+
/// # Arguments
11+
/// * `atomic_number` - The atomic number of the element
612
pub fn get_valence_list(atomic_number: u32) -> &'static CxxVector<i32> {
7-
rdkit_sys::periodic_table_ffi::get_valence_list(atomic_number)
13+
rdkit_sys::periodic_table_ffi::get_periodic_table().getValenceList(atomic_number)
814
}
915

16+
/// Returns the mass of the most common isotope
17+
/// # Arguments
18+
/// * `atom` - The symbol of the element
1019
pub fn get_most_common_isotope_mass(atom: &str) -> f64 {
1120
let_cxx_string!(atom_cxx_string = atom);
12-
rdkit_sys::periodic_table_ffi::get_most_common_isotope_mass(&atom_cxx_string)
21+
rdkit_sys::periodic_table_ffi::get_periodic_table()
22+
.getMostCommonIsotopeMass(&atom_cxx_string)
23+
}
24+
25+
/// Returns the atomic weight of the atom
26+
pub fn get_atomic_weight(atomic_number: u32) -> f64 {
27+
rdkit_sys::periodic_table_ffi::get_periodic_table().getAtomicWeight(atomic_number)
28+
}
29+
30+
/// Returns the atomic number of the atom
31+
/// # Arguments
32+
/// * `atom` - The symbol of the element
33+
pub fn get_atomic_number(atom: &str) -> i32 {
34+
let_cxx_string!(atom_cxx_string = atom);
35+
rdkit_sys::periodic_table_ffi::get_periodic_table().getAtomicNumber(&atom_cxx_string)
36+
}
37+
38+
/// Returns the symbol of the element
39+
/// # Arguments
40+
/// * `atomic_number` - The atomic number of the element
41+
pub fn get_element_symbol(atomic_number: u32) -> String {
42+
rdkit_sys::periodic_table_ffi::getElementSymbol(atomic_number)
43+
}
44+
45+
/// Returns the full element name
46+
/// # Arguments
47+
/// * `atomic_number` - The atomic number of the element
48+
pub fn get_element_name(atomic_number: u32) -> String {
49+
rdkit_sys::periodic_table_ffi::getElementName(atomic_number)
50+
}
51+
52+
/// Returns the atom's Van der Waals radius
53+
/// # Arguments
54+
/// * `atomic_number` - The atomic number of the element
55+
pub fn get_radius_van_der_waals(atomic_number: u32) -> f64 {
56+
rdkit_sys::periodic_table_ffi::get_periodic_table().getRvdw(atomic_number)
57+
}
58+
59+
/// Returns the atom's covalent radius
60+
/// # Arguments
61+
/// * `atomic_number` - The atomic number of the element
62+
pub fn get_radius_covalent(atomic_number: u32) -> f64 {
63+
rdkit_sys::periodic_table_ffi::get_periodic_table().getRcovalent(atomic_number)
64+
}
65+
66+
/// Returns the atom's bond radius
67+
/// # Arguments
68+
/// * `atomic_number` - The atomic number of the element
69+
pub fn get_radius_b0(atomic_number: u32) -> f64 {
70+
rdkit_sys::periodic_table_ffi::get_periodic_table().getRb0(atomic_number)
71+
}
72+
73+
/// Returns the atom's default valence
74+
/// # Arguments
75+
/// * `atomic_number` - The atomic number of the element
76+
pub fn get_default_valence(atomic_number: u32) -> i32 {
77+
rdkit_sys::periodic_table_ffi::get_periodic_table().getDefaultValence(atomic_number)
78+
}
79+
80+
/// Returns the number of outer shell electrons
81+
/// # Arguments
82+
/// * `atomic_number` - The atomic number of the element
83+
pub fn get_n_outer_elecs(atomic_number: u32) -> i32 {
84+
rdkit_sys::periodic_table_ffi::get_periodic_table().getNouterElecs(atomic_number)
85+
}
86+
87+
/// Returns the atom's most common isotope
88+
/// # Arguments
89+
/// * `atomic_number` - The atomic number of the element
90+
pub fn get_most_common_isotope(atomic_number: u32) -> i32 {
91+
rdkit_sys::periodic_table_ffi::get_periodic_table().getMostCommonIsotope(atomic_number)
92+
}
93+
94+
/// Returns the mass of the isotope
95+
/// # Arguments
96+
/// * `atomic_number` - The atomic number of the element
97+
/// * `isotope` - The isotope number
98+
pub fn get_mass_for_isotope(atomic_number: u32, isotope: u32) -> f64 {
99+
rdkit_sys::periodic_table_ffi::get_periodic_table()
100+
.getMassForIsotope(atomic_number, isotope)
101+
}
102+
103+
/// Returns the maximum recognized atomic number
104+
pub fn get_max_atomic_number() -> u32 {
105+
rdkit_sys::periodic_table_ffi::get_periodic_table().getMaxAtomicNumber()
106+
}
107+
108+
/// Returns the abundance of the isotope
109+
/// # Arguments
110+
/// * `atomic_number` - The atomic number of the element
111+
/// * `isotope` - The isotope number
112+
pub fn get_abundance_for_isotope(atomic_number: u32, isotope: u32) -> f64 {
113+
rdkit_sys::periodic_table_ffi::get_periodic_table()
114+
.getAbundanceForIsotope(atomic_number, isotope)
115+
}
116+
117+
/// Returns true if the first atom is more electronegative than the second
118+
/// # Arguments
119+
/// * `atomic_number1` - The atomic number of the first element
120+
/// * `atomic_number2` - The atomic number of the second element
121+
pub fn more_electro_negative(atomic_number1: u32, atomic_number2: u32) -> bool {
122+
rdkit_sys::periodic_table_ffi::get_periodic_table()
123+
.moreElectroNegative(atomic_number1, atomic_number2)
124+
}
125+
126+
/// Returns the row of the periodic table
127+
/// # Arguments
128+
/// * `atomic_number` - The atomic number of the element
129+
pub fn get_row(atomic_number: u32) -> u32 {
130+
rdkit_sys::periodic_table_ffi::get_periodic_table().getRow(atomic_number)
13131
}
14132
}

0 commit comments

Comments
 (0)