16
16
import numpy as np
17
17
from collections import OrderedDict , Iterable
18
18
from string import join
19
+ from peaklist_tags import Tag
19
20
from peaklist import PeakList
20
21
21
22
@@ -204,21 +205,21 @@ def peaklist_tag_types(self):
204
205
Property of the source peaklist tag types.
205
206
206
207
:getter: returns a tuple including the types of the typed tags of the source peaklists
207
- :type: tuple
208
+ :type: set
208
209
209
210
"""
210
- return tuple ( set ( reduce (lambda x , y : x + y , [ t .tag_types for t in self .peaklist_tags ], ()) ))
211
+ return reduce (lambda x ,y : x . union ( y ), map ( lambda x : x .tag_types , self .peaklist_tags ))
211
212
212
213
@property
213
214
def peaklist_tag_values (self ):
214
215
"""
215
216
Property of the source peaklist tag values.
216
217
217
218
:getter: returns a tuple including the values of the source peaklists tags, both typed and untyped
218
- :type: tuple
219
+ :type: set
219
220
220
221
"""
221
- return tuple ( set ( reduce (lambda x , y : x + y , [ t .tag_values for t in self .peaklist_tags ], ()) ))
222
+ return reduce (lambda x ,y : x . union ( y ), map ( lambda x : x .tag_values , self .peaklist_tags ))
222
223
223
224
@property
224
225
def shape (self ):
@@ -398,8 +399,8 @@ def rsd(self, *args, **kwargs):
398
399
"""
399
400
Calculates relative standard deviation (RSD) array.
400
401
401
- :param args: untyped tag label for RSD calculation, no value = calculate over all samples
402
- :param kwargs: typed tag label for RSD calculation, , no value = calculate over all samples
402
+ :param args: tags or untyped tag values for RSD calculation, no value = calculate over all samples
403
+ :param kwargs: typed tags for RSD calculation, , no value = calculate over all samples
403
404
:param flagged_only: whether to calculate on flagged peaks only. Default = True
404
405
:type: numpy array
405
406
@@ -437,19 +438,19 @@ def tags_of(self, tag_type=None):
437
438
:param tag_type: the type of the returning tags. Provide None to obtain untyped tags
438
439
:rtype: tuple
439
440
440
- """
441
- if not ( tag_type is None or all ( map (lambda x : x .has_tag_type (tag_type ), self .peaklist_tags ) )):
442
- raise ValueError ('not all samples has tag type [%s]' % tag_type )
443
- tlst = [t .tag_of (tag_type ) for t in self .peaklist_tags ]
441
+ """
442
+ if any ( map (lambda x : not x .has_tag_type (tag_type ), self .peaklist_tags )):
443
+ raise KeyError ('not all samples has tag type [%s]' % tag_type )
444
+ tlst = filter ( lambda x : x is not None , [t .tag_of (tag_type ) for t in self .peaklist_tags ])
444
445
if tag_type is None : tlst = reduce (lambda x , y : x + y , tlst )
445
- return tuple ( set ( tlst ))
446
+ return reduce ( lambda x , y : x + (( y ,) if y not in x else ()), tlst , ( ))
446
447
447
448
def mask_tags (self , * args , ** kwargs ): # match to all
448
449
"""
449
450
Masks samples with particular tags.
450
451
451
- :param args: target tag values, both typed and untyped
452
- :param kwargs: target typed tag types and values
452
+ :param args: tags or untyped tag values for masking
453
+ :param kwargs: typed tags for masking
453
454
:param override: whether to override the current mask, default = False
454
455
:rtype: PeakMatrix object (self)
455
456
@@ -462,17 +463,19 @@ def mask_tags(self, *args, **kwargs): # match to all
462
463
463
464
"""
464
465
override = kwargs .pop ('override' ) if kwargs .has_key ('override' ) else False
466
+ if any (map (lambda x : isinstance (x , Tag ), kwargs .values ())):
467
+ logging .warning ('setting additional type for Tag object in kwargs will be ignored' )
465
468
mask = map (lambda x : all (map (lambda t : x .has_tag (t ), args )) and
466
- all (map (lambda t : x .has_tag (** dict ([ t ]) ), kwargs .items ())), self ._tags )
469
+ all (map (lambda t : x .has_tag (t [ 1 ], tag_type = t [ 0 ] ), kwargs .items ())), self ._tags )
467
470
self .mask = np .logical_or (False if override else self ._mask , mask )
468
471
return self
469
472
470
473
def unmask_tags (self , * args , ** kwargs ): # match to all
471
474
"""
472
475
Unmasks samples with particular tags.
473
476
474
- :param args: target tag values, both typed and untyped
475
- :param kwargs: target typed tag types and values
477
+ :param args: tags or untyped tag values for unmasking
478
+ :param kwargs: typed tags for unmasking
476
479
:param override: whether to override the current mask, default = False
477
480
:rtype: PeakMatrix object (self)
478
481
@@ -486,8 +489,10 @@ def unmask_tags(self, *args, **kwargs): # match to all
486
489
487
490
"""
488
491
override = kwargs .pop ('override' ) if kwargs .has_key ('override' ) else False
492
+ if any (map (lambda x : isinstance (x , Tag ), kwargs .values ())):
493
+ logging .warning ('setting additional type for Tag object in kwargs will be ignored' )
489
494
mask = map (lambda x : not (all (map (lambda t : x .has_tag (t ), args )) and
490
- all (map (lambda t : x .has_tag (** dict ([ t ]) ), kwargs .items ()))), self ._tags )
495
+ all (map (lambda t : x .has_tag (t [ 1 ], tag_type = t [ 0 ] ), kwargs .items ()))), self ._tags )
491
496
self .mask = np .logical_and (True if override else self ._mask , mask )
492
497
return self
493
498
@@ -757,21 +762,22 @@ def to_str(self, attr_name='intensity', delimiter='\t', samples_in_rows=True, co
757
762
[map (str , ln ) for ln in self .attr_matrix (attr_name , flagged_only = not comprehensive ).T ]
758
763
759
764
if comprehensive :
760
- ttypes = set (reduce (lambda x , y : x + y , map (lambda x : x .tag_types , self .peaklist_tags )))
765
+ ttypes = self .peaklist_tag_types
766
+ if None in ttypes : ttypes .remove (None )
761
767
tnum = len (ttypes )
762
768
hd = [hd [0 ]] + ['missing values' ] + map (lambda x : 'tags_' + x , ttypes ) + ['tags_untyped' ] + hd [1 :]
763
769
dm = [dm [0 ]] + \
764
770
[map (str , self .missing_values )] + \
765
- [map (lambda x : str (x . tag_of ( t )) if x . has_tag_type ( t ) else '' , self .peaklist_tags ) for t in ttypes ] + \
766
- [map (lambda x : join (map (str , x .tag_of (None )), ';' ), self .peaklist_tags )] + \
771
+ [map (lambda x : ( lambda v : str (v . value ) if v else '' )( x . tag_of ( t )) , self .peaklist_tags ) for t in ttypes ] + \
772
+ [map (lambda x : join (( lambda v : map (str ,v ) if v else ())( x .tag_of (None )), ';' ), self .peaklist_tags )] + \
767
773
dm [1 :]
768
774
769
775
rsd_tags = tuple (rsd_tags ) if isinstance (rsd_tags , Iterable ) else (rsd_tags ,)
770
776
771
777
prelst = ['present' ] + (['' ] * (tnum + 2 )) + map (str , self .property ('present' , flagged_only = False ))
772
778
ocrlst = ['occurrence' ] + (['' ] * (tnum + 2 )) + map (str , self .property ('occurrence' , flagged_only = False ))
773
779
puplst = ['purity' ] + (['' ] * (tnum + 2 )) + map (str , self .property ('purity' , flagged_only = False ))
774
- rsdmtx = [['rsd_' + rt ] + (['' ] * (tnum + 2 )) + map (str , self .rsd (rt , flagged_only = False )) for rt in rsd_tags ]
780
+ rsdmtx = [['rsd_' + str ( rt . value if isinstance ( rt , Tag ) else rt ) ] + (['' ] * (tnum + 2 )) + map (str , self .rsd (rt , flagged_only = False )) for rt in rsd_tags ]
775
781
rsdlst = ['rsd_all' ] + (['' ] * (tnum + 2 )) + map (str , self .rsd (flagged_only = False ))
776
782
flgmtx = [[fn ] + (['' ] * (tnum + 2 )) + map (str , self .flag_values (fn ).astype (int )) for fn in self .flag_names ]
777
783
flglst = ['flags' ] + (['' ] * (tnum + 2 )) + map (str , self .flags .astype (int ))
@@ -806,13 +812,13 @@ class mask_peakmatrix:
806
812
807
813
def __init__ (self , pm , * args , ** kwargs ):
808
814
self ._pm = pm
809
- self ._utags = args
810
- self ._ttags = kwargs
811
- if not self ._ttags .has_key ('override' ): self ._ttags ['override' ] = True # default for with statement
815
+ self ._args = args
816
+ self ._kwargs = kwargs
817
+ if not self ._kwargs .has_key ('override' ): self ._kwargs ['override' ] = True # default for with statement
812
818
self ._oldmask = dict (zip (pm ._pids , pm ._mask ))
813
819
814
820
def __enter__ (self ):
815
- self ._pm .mask_tags (* self ._utags , ** self ._ttags )
821
+ self ._pm .mask_tags (* self ._args , ** self ._kwargs )
816
822
return self ._pm
817
823
818
824
def __exit__ (self , exc_type , exc_val , exc_tb ):
@@ -843,13 +849,13 @@ class unmask_peakmatrix:
843
849
844
850
def __init__ (self , pm , * args , ** kwargs ):
845
851
self ._pm = pm
846
- self ._utags = args
847
- self ._ttags = kwargs
848
- if not self ._ttags .has_key ('override' ): self ._ttags ['override' ] = True # default for with statement
852
+ self ._args = args
853
+ self ._kwargs = kwargs
854
+ if not self ._kwargs .has_key ('override' ): self ._kwargs ['override' ] = True # default for with statement
849
855
self ._oldmask = dict (zip (pm ._pids , pm ._mask ))
850
856
851
857
def __enter__ (self ):
852
- self ._pm .unmask_tags (* self ._utags , ** self ._ttags )
858
+ self ._pm .unmask_tags (* self ._args , ** self ._kwargs )
853
859
return self ._pm
854
860
855
861
def __exit__ (self , exc_type , exc_val , exc_tb ):
0 commit comments