1+ import unittest
2+ from ccdc .io import EntryReader
3+
4+ from entry_property_calculator import parse_control_file
5+
6+ class TestFiltering (unittest .TestCase ):
7+
8+ def setUp (self ):
9+
10+ self .reader = EntryReader ('CSD' )
11+ self .aabhtz = self .reader .entry ("AABHTZ" )
12+ self .aacani_ten = self .reader .entry ("AACANI10" )
13+ self .aadamc = self .reader .entry ("AADAMC" )
14+ self .aadrib = self .reader .entry ("AADRIB" )
15+ self .abadis = self .reader .entry ("ABADIS" )
16+
17+ def test_organic_filter (self ):
18+
19+ test_file = """
20+ organic : 1
21+ """
22+ lines = test_file .split ('\n ' )
23+ evaluator = parse_control_file (lines )
24+
25+ self .assertTrue (evaluator .evaluate (self .aabhtz ))
26+
27+ self .assertFalse (evaluator .evaluate (self .aacani_ten ))
28+
29+ def test_component_filter (self ):
30+ test_file = """
31+ component range : 0 1
32+ """
33+ lines = test_file .split ('\n ' )
34+ evaluator = parse_control_file (lines )
35+
36+ self .assertTrue (evaluator .evaluate (self .aabhtz ))
37+
38+ self .assertFalse (evaluator .evaluate (self .aacani_ten ))
39+
40+ def test_donor_count_filter (self ):
41+ test_file = """
42+ donor count : 2 2
43+ """
44+ lines = test_file .split ('\n ' )
45+ evaluator = parse_control_file (lines )
46+
47+ self .assertFalse (evaluator .evaluate (self .aabhtz ))
48+
49+ self .assertTrue (evaluator .evaluate (self .aadamc ))
50+
51+ test_file = """
52+ donor count : 0 3
53+ """
54+ lines = test_file .split ('\n ' )
55+ evaluator = parse_control_file (lines )
56+
57+ self .assertTrue (evaluator .evaluate (self .aabhtz ))
58+ self .assertTrue (evaluator .evaluate (self .aadamc ))
59+
60+ def test_acceptor_count_filter (self ):
61+ test_file = """
62+ acceptor count : 7 7
63+ """
64+ lines = test_file .split ('\n ' )
65+ evaluator = parse_control_file (lines )
66+
67+ # regards Cl as an acceptor ...
68+ self .assertTrue (evaluator .evaluate (self .aabhtz ))
69+
70+ self .assertTrue (evaluator .evaluate (self .aacani_ten ))
71+
72+ def test_zprime (self ):
73+ test_file = """
74+ zprime range : 0.99 1.01
75+ """
76+ lines = test_file .split ('\n ' )
77+ evaluator = parse_control_file (lines )
78+ self .assertTrue (evaluator .evaluate (self .aabhtz ))
79+ self .assertFalse (evaluator .evaluate (self .aadrib ))
80+
81+ def test_atomic_numbers (self ):
82+ test_file = """
83+ allowed atomic numbers : 1 6 7 8
84+ must have atomic numbers : 1 6 7 8
85+ """
86+ lines = test_file .split ('\n ' )
87+ evaluator = parse_control_file (lines )
88+ self .assertFalse (evaluator .evaluate (self .aabhtz ))
89+ self .assertFalse (evaluator .evaluate (self .aadrib ))
90+
91+ test_file = """
92+ must have atomic numbers : 1 6 7 8
93+ """
94+ lines = test_file .split ('\n ' )
95+ evaluator = parse_control_file (lines )
96+ self .assertTrue (evaluator .evaluate (self .aabhtz ))
97+ self .assertFalse (evaluator .evaluate (self .aadrib ))
98+
99+ def test_rotatable_bond_count (self ):
100+ test_file = """
101+ rotatable bond count : 0 3
102+ """
103+ lines = test_file .split ('\n ' )
104+ evaluator = parse_control_file (lines )
105+ self .assertTrue (evaluator .evaluate (self .abadis ))
106+
107+ def test_multiple (self ):
108+ test_file = """
109+
110+ # An example control file
111+ #
112+ #
113+ # only include organic structures as output
114+ organic : 1
115+ # specify a range of donors
116+ donor count : 0 10
117+ # specify a range of acceptors
118+ acceptor count : 5 5
119+ # rotatable bond count range
120+ rotatable bond count : 3 7
121+ # number of atoms to allow through
122+ atom count : 0 100
123+ # only include structures containing Hydrogen, Carbon, Nitrogen or Oxygen and nothing else
124+ allowed atomic numbers : 1 6 7 8
125+ # only include structures containing all of these elements (i.e.) Hydrogen, Carbon, Nitrogen or Oxygen
126+ must have atomic numbers : 1 6 7 8
127+ # Ensure Z-prime is one
128+ zprime range : 0.99 1.01
129+ # Ensure only one component in the structure
130+ component range : 2 2
131+ # Dont include disordered structures
132+ disordered : 0
133+ # Specify an R-factor range
134+ rfactor range : 0.1 5
135+ #
136+
137+
138+ """
139+
140+ lines = test_file .split ('\n ' )
141+ evaluator = parse_control_file (lines )
142+
143+ counter = 0
144+ hits = []
145+
146+ test_entries = ['AABHTZ' , 'ABAQEB' , 'ABELEY' , 'ADAQOM' , 'ADARAA' , 'ADARAZ' , 'ADUWIG' , 'AFEREK' ]
147+ for id in test_entries :
148+ e = self .reader .entry (id )
149+
150+ if evaluator .evaluate (e ):
151+ hits .append (e .identifier )
152+
153+ self .assertEquals (['ABAQEB' , 'ABELEY' , 'ADAQOM' , 'ADUWIG' , 'AFEREK' ], hits )
0 commit comments