File: split.pyx

package info (click to toggle)
obitools 3.0.1~b26%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 26,756 kB
  • sloc: ansic: 24,299; python: 657; sh: 27; makefile: 21
file content (105 lines) | stat: -rw-r--r-- 3,668 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#cython: language_level=3

from obitools3.apps.progress cimport ProgressBar  # @UnresolvedImport
from obitools3.dms import DMS
from obitools3.dms.view.view cimport View, Line_selection
from obitools3.uri.decode import open_uri
from obitools3.apps.optiongroups import addMinimalInputOption, addTaxonomyOption, addMinimalOutputOption, addNoProgressBarOption
from obitools3.dms.view import RollbackException
from obitools3.apps.config import logger
from obitools3.utils cimport tobytes

import sys
from cpython.exc cimport PyErr_CheckSignals

 
__title__="Split"

 
def addOptions(parser):
    
    addMinimalInputOption(parser)
    addNoProgressBarOption(parser)

    group=parser.add_argument_group("obi split specific options")
 
    group.add_argument('-p','--prefix',
                       action="store", dest="split:prefix",
                       metavar="<PREFIX>",
                       help="Prefix added to each subview name (included undefined)")

    group.add_argument('-t','--tag-name',
                       action="store", dest="split:tagname",
                       metavar="<TAG_NAME>",
                       help="Attribute/tag used to split the input")
      
    group.add_argument('-u','--undefined',
                       action="store", dest="split:undefined",
                       default=b'UNDEFINED',
                       metavar="<VIEW_NAME>",
                       help="Name of the view where undefined sequenced are stored (will be PREFIX_VIEW_NAME)")


def run(config):
     
    DMS.obi_atexit()
    
    logger("info", "obi split")

    # Open the input
    input = open_uri(config["obi"]["inputURI"])
    if input is None:
        raise Exception("Could not read input view")
    i_dms = input[0]
    i_view = input[1]

    # Initialize the progress bar
    if config['obi']['noprogressbar'] == False:
        pb = ProgressBar(len(i_view), config)
    else:
        pb = None
    
    tag_to_split = config["split"]["tagname"]
    undefined = tobytes(config["split"]["undefined"])
    selections = {}
    
    # Go through input view and split
    for i in range(len(i_view)):
        PyErr_CheckSignals()
        if pb is not None:
            pb(i)
        line = i_view[i]
        if tag_to_split not in line or line[tag_to_split] is None or len(line[tag_to_split])==0:
            value = undefined
        else:
            value = line[tag_to_split]
        if value not in selections:
            selections[value] = Line_selection(i_view)
        selections[value].append(i)
        
    if pb is not None:
        pb(len(i_view), force=True)
        print("", file=sys.stderr)

    # Create output views with the line selection
    try:
        for cat in selections:
            o_view_name = config["split"]["prefix"].encode()+cat
            o_view = selections[cat].materialize(o_view_name)
            # Save command config in View and DMS comments
            command_line = " ".join(sys.argv[1:])
            input_dms_name=[input[0].name]
            input_view_name=[input[1].name]
            if 'taxoURI' in config['obi'] and config['obi']['taxoURI'] is not None:
                input_dms_name.append(config['obi']['taxoURI'].split("/")[-3])
                input_view_name.append("taxonomy/"+config['obi']['taxoURI'].split("/")[-1])
            o_view.write_config(config, "split", command_line, input_dms_name=input_dms_name, input_view_name=input_view_name)
            o_view.close()
    except Exception, e:
        raise RollbackException("obi split error, rollbacking view: "+str(e), o_view)

    i_dms.record_command_line(command_line)
    i_dms.close(force=True)

    logger("info", "Done.")