Completed
Pull Request — master (#175)
by
unknown
01:40
created

FifFile.inspect()   F

Complexity

Conditions 11

Size

Total Lines 64

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 11
c 1
b 0
f 0
dl 0
loc 64
rs 3.913

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

Complexity

Complex classes like FifFile.inspect() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
from __future__ import division
2
import logging
3
from datetime import datetime
4
from functools import partial
5
from niprov.basefile import BaseFile
6
from niprov.libraries import Libraries
7
8
9
class FifFile(BaseFile):
10
11
    def __init__(self, location, **kwargs):
12
        super(FifFile, self).__init__(location, **kwargs)
13
        self.libs = self.dependencies.getLibraries()
14
15
    def inspect(self):
16
        provenance = super(FifFile, self).inspect()
17
        """ try:
18
                img = self.libs.mne.io.Raw(self.path, allow_maxshield=True)
19
                except ValueError:
20
                    pass
21
                else:
22
                    inspect file
23
                    Return
24
        """
25
        ftypes = {
26
            'cov': self.libs.mne.read_cov,
27
            'epo': self.libs.mne.read_epochs,
28
            'ave': self.libs.mne.read_evokeds,
29
            'fwd': self.libs.mne.read_forward_solution,
30
            'trans': self.libs.mne.read_trans,
31
            'raw': partial(self.libs.mne.io.read_raw_fif, allow_maxshield=True),
32
            'proj': self.libs.mne.read_proj,
33
        }
34
        oldLevel = logging.getLogger('mne').getEffectiveLevel()
35
        logging.getLogger('mne').setLevel(logging.ERROR)
36
        for ftype, readfif in ftypes.items():
37
            try:
38
                img = readfif(self.path)
39
                if img == []:
40
                    continue
41
                break
42
            except (ValueError, IOError):
43
                continue
44
        else:
45
            ftype = 'other'
46
        logging.getLogger('mne').setLevel(oldLevel)
47
48
        if ftype == 'raw':
49
            sub = img.info['subject_info']
50
            if sub is not None:
51
                provenance['subject'] = sub['first_name']+' '+sub['last_name']
52
            provenance['project'] = img.info['proj_name']
53
            acqTS = img.info['meas_date'][0]
54
            provenance['acquired'] = datetime.fromtimestamp(acqTS)
55
            T = img.last_samp - img.first_samp + 1
56
            provenance['dimensions'] = [img.info['nchan'], T]
57
            provenance['sampling-frequency'] = img.info['sfreq']
58
            provenance['duration'] = T/img.info['sfreq']
59
60
        if ftype == 'epo':
61
            provenance['lowpass'] = img.info['lowpass']
62
            provenance['highpass'] = img.info['highpass']
63
            provenance['bad-channels'] = img.info['bads']
64
            provenance['dimensions'] = [img.events.shape[0], img.times.shape[0]]
65
66
        if ftype == 'ave':
67
            nEvokeds = len(img)
68
            provenance['dimensions'] = [nEvokeds] + list(img[0].data.shape)
69
70
        if ftype == 'cov':
71
            provenance['dimensions'] = list(img.data.shape)
72
73
        if ftype == 'proj':
74
            provenance['projection-description'] = img['desc']
75
76
        provenance['fif-type'] = ftype
77
        provenance['modality'] = 'MEG'
78
        return provenance
79
80
    def attach(self, form='json'):
81
        """
82
        Attach the current provenance to the file by appending it as a
83
        json-encoded string to the 'description' header field.
84
85
        This is only attempted if the file has been inspect()-ed and
86
        has been determined to be a raw fif file.
87
88
        Args:
89
            form (str): Data format in which to serialize provenance. Defaults 
90
                to 'json'.
91
        """
92
        if 'fif-type' in self.provenance:
93
            if self.provenance['fif-type'] == 'raw':
94
                info = self.libs.mne.io.read_info(self.path)
95
                provstr = self.getProvenance(form)
96
                info['description'] = info['description']+' NIPROV:'+provstr
97
                self.libs.mne.io.write_info(self.path, info)
98
99