@@ -85,6 +85,23 @@ def __call__(self, theobject):
85
85
return value >= self .minimum and value <= self .maximum
86
86
87
87
88
+ class _ValueFilter (_Filter ):
89
+ def __init__ (self , args ):
90
+ values = [p for p in args .split ()]
91
+ #To do: add option for two values?
92
+ if values [0 ] == 'None' :
93
+ self .expected_value = None
94
+ else :
95
+ self .expected_value = values [0 ]
96
+
97
+ def value (self , theobject ):
98
+ raise NotImplementedError # override this
99
+
100
+ def __call__ (self , theobject ):
101
+ value = self .value (theobject )
102
+ return value == self .expected_value
103
+
104
+
88
105
class AllowedAtomicNumbersFilter (_Filter ):
89
106
def __init__ (self , args ):
90
107
self .allowed_atomic_numbers = [int (atomic_number ) for atomic_number in args .strip ().split ()]
@@ -200,6 +217,25 @@ def value(self, entry):
200
217
register (AllHaveSitesFilter )
201
218
202
219
220
+ class Has3DStructure (_ComparativeFilter ):
221
+ def __init__ (self , args ):
222
+ super ().__init__ (args )
223
+
224
+ @staticmethod
225
+ def name ():
226
+ return "has 3D structure"
227
+
228
+ @staticmethod
229
+ def helptext ():
230
+ return "whether 3D coordinates have been determined for the structure"
231
+
232
+ def value (self , entry ):
233
+ return entry .has_3d_structure
234
+
235
+
236
+ register (Has3DStructure )
237
+
238
+
203
239
class DisorderedFilter (_ComparativeFilter ):
204
240
def __init__ (self , args ):
205
241
super ().__init__ (args )
@@ -413,6 +449,30 @@ def value(self, entry):
413
449
register (SpacegroupNumberFilter )
414
450
415
451
452
+ class ChiralityFilter (_ValueFilter ):
453
+ def __init__ (self , args ):
454
+ super ().__init__ (args )
455
+
456
+ @staticmethod
457
+ def name ():
458
+ return "chirality"
459
+
460
+ @staticmethod
461
+ def helptext ():
462
+ return "specify the chirality value to be used as filter"
463
+
464
+ def value (self , entry ):
465
+ try :
466
+ molecule = entry .crystal .molecule
467
+ chirality = next ((atom .chirality for atom in molecule .atoms if atom .is_chiral ), None )
468
+ return chirality
469
+ except TypeError :
470
+ return None
471
+
472
+
473
+ register (ChiralityFilter )
474
+
475
+
416
476
class FilterEvaluation (object ):
417
477
def __init__ (self ):
418
478
self ._methods = []
@@ -425,7 +485,7 @@ def evaluate(self, entry):
425
485
try :
426
486
if not method (entry ):
427
487
return False
428
- except TypeError :
488
+ except ( TypeError , RuntimeError ) :
429
489
return False
430
490
431
491
return True
0 commit comments