@@ -101,8 +101,7 @@ def helptext():
101101 def __call__ (self , entry ):
102102 try :
103103 molecule = entry .crystal .molecule
104- return len ([x for x in molecule .atoms if x .atomic_number in self .allowed_atomic_numbers ]) == len (
105- molecule .atoms )
104+ return len ([x for x in molecule .atoms if x .atomic_number in self .allowed_atomic_numbers ]) == len (molecule .atoms )
106105 except TypeError :
107106 return False
108107
@@ -126,17 +125,16 @@ def __call__(self, entry):
126125 try :
127126 molecule = entry .crystal .molecule
128127
129- contains = {}
128+ contains = set ()
130129 for x in molecule .atoms :
131- if not contains .has_key (x .atomic_number ):
132- contains [x .atomic_number ] = 0
133- contains [x .atomic_number ] = contains [x .atomic_number ] + 1
130+ contains .add (x .atomic_number )
131+
134132 for x in self .must_have_atomic_numbers :
135- if not contains . has_key ( x ) :
133+ if x not in contains :
136134 return False
137135
138136 return True
139- except :
137+ except TypeError :
140138 return False
141139
142140
@@ -196,7 +194,7 @@ def helptext():
196194 def value (self , entry ):
197195 try :
198196 return entry .crystal .molecule .all_atoms_have_sites
199- except :
197+ except TypeError :
200198 return False
201199
202200
@@ -453,160 +451,3 @@ def parse_control_file(lines):
453451 cls = _filter_classes [parts [0 ].strip ()]
454452 evaluator .add_filter (cls (parts [1 ]))
455453 return evaluator
456-
457-
458- import unittest
459-
460-
461- class TestFiltering (unittest .TestCase ):
462-
463- def setUp (self ):
464-
465- self .reader = ccdc .io .EntryReader ('CSD' )
466- self .aabhtz = self .reader .entry ("AABHTZ" )
467- self .aacani_ten = self .reader .entry ("AACANI10" )
468- self .aadamc = self .reader .entry ("AADAMC" )
469- self .aadrib = self .reader .entry ("AADRIB" )
470- self .abadis = self .reader .entry ("ABADIS" )
471-
472- def test_organic_filter (self ):
473-
474- test_file = """
475- organic : 1
476- """
477- lines = test_file .split ('\n ' )
478- evaluator = parse_control_file (lines )
479-
480- self .assertTrue (evaluator .evaluate (self .aabhtz ))
481-
482- self .assertFalse (evaluator .evaluate (self .aacani_ten ))
483-
484- def test_component_filter (self ):
485- test_file = """
486- component range : 0 1
487- """
488- lines = test_file .split ('\n ' )
489- evaluator = parse_control_file (lines )
490-
491- self .assertTrue (evaluator .evaluate (self .aabhtz ))
492-
493- self .assertFalse (evaluator .evaluate (self .aacani_ten ))
494-
495- def test_donor_count_filter (self ):
496- test_file = """
497- donor count : 2 2
498- """
499- lines = test_file .split ('\n ' )
500- evaluator = parse_control_file (lines )
501-
502- self .assertFalse (evaluator .evaluate (self .aabhtz ))
503-
504- self .assertTrue (evaluator .evaluate (self .aadamc ))
505-
506- test_file = """
507- donor count : 0 3
508- """
509- lines = test_file .split ('\n ' )
510- evaluator = parse_control_file (lines )
511-
512- self .assertTrue (evaluator .evaluate (self .aabhtz ))
513- self .assertTrue (evaluator .evaluate (self .aadamc ))
514-
515- def test_acceptor_count_filter (self ):
516- test_file = """
517- acceptor count : 7 7
518- """
519- lines = test_file .split ('\n ' )
520- evaluator = parse_control_file (lines )
521-
522- # regards Cl as an acceptor ...
523- self .assertTrue (evaluator .evaluate (self .aabhtz ))
524-
525- self .assertTrue (evaluator .evaluate (self .aacani_ten ))
526-
527- def test_zprime (self ):
528- test_file = """
529- zprime range : 0.99 1.01
530- """
531- lines = test_file .split ('\n ' )
532- evaluator = parse_control_file (lines )
533- self .assertTrue (evaluator .evaluate (self .aabhtz ))
534- self .assertFalse (evaluator .evaluate (self .aadrib ))
535-
536- def test_atomic_numbers (self ):
537- test_file = """
538- allowed atomic numbers : 1 6 7 8
539- must have atomic numbers : 1 6 7 8
540- """
541- lines = test_file .split ('\n ' )
542- evaluator = parse_control_file (lines )
543- self .assertFalse (evaluator .evaluate (self .aabhtz ))
544- self .assertFalse (evaluator .evaluate (self .aadrib ))
545-
546- test_file = """
547- must have atomic numbers : 1 6 7 8
548- """
549- lines = test_file .split ('\n ' )
550- evaluator = parse_control_file (lines )
551- self .assertTrue (evaluator .evaluate (self .aabhtz ))
552- self .assertFalse (evaluator .evaluate (self .aadrib ))
553-
554- def test_rotatable_bond_count (self ):
555- test_file = """
556- rotatable bond count : 0 3
557- """
558- lines = test_file .split ('\n ' )
559- evaluator = parse_control_file (lines )
560- self .assertTrue (evaluator .evaluate (self .abadis ))
561-
562- def test_multiple (self ):
563- test_file = """
564-
565- # An example control file
566- #
567- #
568- # only include organic structures as output
569- organic : 1
570- # specify a range of donors
571- donor count : 0 10
572- # specify a range of acceptors
573- acceptor count : 5 5
574- # rotatable bond count range
575- rotatable bond count : 3 7
576- # number of atoms to allow through
577- atom count : 0 100
578- # only include structures containing Hydrogen, Carbon, Nitrogen or Oxygen and nothing else
579- allowed atomic numbers : 1 6 7 8
580- # only include structures containing all of these elements (i.e.) Hydrogen, Carbon, Nitrogen or Oxygen
581- must have atomic numbers : 1 6 7 8
582- # Ensure Z-prime is one
583- zprime range : 0.99 1.01
584- # Ensure only one component in the structure
585- component range : 2 2
586- # Dont include disordered structures
587- disordered : 0
588- # Specify an R-factor range
589- rfactor range : 0.1 5
590- #
591-
592-
593- """
594-
595- lines = test_file .split ('\n ' )
596- evaluator = parse_control_file (lines )
597-
598- counter = 0
599- hits = []
600-
601- test_entries = ['AABHTZ' , 'ABAQEB' , 'ABELEY' , 'ADAQOM' , 'ADARAA' , 'ADARAZ' , 'ADUWIG' , 'AFEREK' ]
602- for id in test_entries :
603- e = self .reader .entry (id )
604-
605- if evaluator .evaluate (e ):
606- hits .append (e .identifier )
607-
608- self .assertEquals (['ABAQEB' , 'ABELEY' , 'ADAQOM' , 'ADUWIG' , 'AFEREK' ], hits )
609-
610-
611- if __name__ == "__main__" :
612- unittest .main ()
0 commit comments