@@ -0,0 +1,34 | |||||
|
1 | from schainpy.controller import Project | |||
|
2 | ||||
|
3 | desc = "A schain project" | |||
|
4 | ||||
|
5 | controller = Project() | |||
|
6 | controller.setup(id='191', name="project", description=desc) | |||
|
7 | ||||
|
8 | readUnitConf = controller.addReadUnit(datatype='VoltageReader', | |||
|
9 | path="/home/nanosat/schain", | |||
|
10 | startDate="1970/01/01", | |||
|
11 | endDate="2017/12/31", | |||
|
12 | startTime="00:00:00", | |||
|
13 | endTime="23:59:59", | |||
|
14 | online=0, | |||
|
15 | verbose=1, | |||
|
16 | walk=1, | |||
|
17 | ) | |||
|
18 | ||||
|
19 | procUnitConf1 = controller.addProcUnit(datatype='VoltageProc', inputId=readUnitConf.getId()) | |||
|
20 | ||||
|
21 | opObj11 = procUnitConf1.addOperation(name='ProfileSelector', optype='other') | |||
|
22 | opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') | |||
|
23 | ||||
|
24 | opObj11 = procUnitConf1.addOperation(name='RTIPlot', optype='other') | |||
|
25 | opObj11.addParameter(name='wintitle', value='Jicamarca Radio Observatory', format='str') | |||
|
26 | opObj11.addParameter(name='showprofile', value='0', format='int') | |||
|
27 | opObj11.addParameter(name='xmin', value='0', format='int') | |||
|
28 | opObj11.addParameter(name='xmax', value='24', format='int') | |||
|
29 | opObj11.addParameter(name='figpath', value="/home/nanosat/schain/figs", format='str') | |||
|
30 | opObj11.addParameter(name='wr_period', value='5', format='int') | |||
|
31 | opObj11.addParameter(name='exp_code', value='22', format='int') | |||
|
32 | ||||
|
33 | ||||
|
34 | controller.start() |
@@ -0,0 +1,1 | |||||
|
1 | <Project description="A schain project" id="191" name="project"><ReadUnit datatype="Voltage" id="1911" inputId="0" name="VoltageReader"><Operation id="19111" name="run" priority="1" type="self"><Parameter format="str" id="191111" name="datatype" value="VoltageReader" /><Parameter format="str" id="191112" name="path" value="/home/nanosat/schain" /><Parameter format="date" id="191113" name="startDate" value="1970/01/01" /><Parameter format="date" id="191114" name="endDate" value="2017/12/31" /><Parameter format="time" id="191115" name="startTime" value="00:00:00" /><Parameter format="time" id="191116" name="endTime" value="23:59:59" /><Parameter format="int" id="191118" name="walk" value="1" /><Parameter format="int" id="191119" name="verbose" value="1" /><Parameter format="int" id="191120" name="online" value="0" /></Operation></ReadUnit><ProcUnit datatype="Voltage" id="1912" inputId="1911" name="VoltageProc"><Operation id="19121" name="run" priority="1" type="self" /><Operation id="19122" name="ProfileSelector" priority="2" type="other"><Parameter format="intlist" id="191221" name="profileRangeList" value="120,183" /></Operation><Operation id="19123" name="RTIPlot" priority="3" type="plotter"><Parameter format="str" id="191231" name="wintitle" value="Jicamarca Radio Observatory" /><Parameter format="int" id="191232" name="showprofile" value="0" /><Parameter format="int" id="191233" name="xmin" value="0" /><Parameter format="int" id="191234" name="xmax" value="24" /><Parameter format="str" id="191235" name="figpath" value="/home/nanosat/schain/figs" /><Parameter format="int" id="191236" name="wr_period" value="5" /><Parameter format="int" id="191237" name="exp_code" value="22" /></Operation></ProcUnit></Project> No newline at end of file |
@@ -0,0 +1,9 | |||||
|
1 | # schaing | |||
|
2 | ||||
|
3 | Command Line Interface for SIGNAL CHAIN - jro | |||
|
4 | ||||
|
5 | # Usage | |||
|
6 | ||||
|
7 | To use it: | |||
|
8 | ||||
|
9 | $ schain-cli --help |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 |
@@ -0,0 +1,34 | |||||
|
1 | from schainpy.controller import Project | |||
|
2 | ||||
|
3 | desc = "asdasddsad" | |||
|
4 | ||||
|
5 | controller = Project() | |||
|
6 | controller.setup(id='191', name="asdasd", description=desc) | |||
|
7 | ||||
|
8 | readUnitConf = controller.addReadUnit(datatype='VoltageReader', | |||
|
9 | path="/home/nanosat/schain/schain-cli", | |||
|
10 | startDate="1970/01/01", | |||
|
11 | endDate="2017/12/31", | |||
|
12 | startTime="00:00:00", | |||
|
13 | endTime="23:59:59", | |||
|
14 | online=0, | |||
|
15 | verbose=1, | |||
|
16 | walk=1, | |||
|
17 | ) | |||
|
18 | ||||
|
19 | procUnitConf1 = controller.addProcUnit(datatype='VoltageProc', inputId=readUnitConf.getId()) | |||
|
20 | ||||
|
21 | opObj11 = procUnitConf1.addOperation(name='ProfileSelector', optype='other') | |||
|
22 | opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') | |||
|
23 | ||||
|
24 | opObj11 = procUnitConf1.addOperation(name='RTIPlot', optype='other') | |||
|
25 | opObj11.addParameter(name='wintitle', value='Jicamarca Radio Observatory', format='str') | |||
|
26 | opObj11.addParameter(name='showprofile', value='0', format='int') | |||
|
27 | opObj11.addParameter(name='xmin', value='0', format='int') | |||
|
28 | opObj11.addParameter(name='xmax', value='24', format='int') | |||
|
29 | opObj11.addParameter(name='figpath', value="/home/nanosat/schain/schain-cli/figs", format='str') | |||
|
30 | opObj11.addParameter(name='wr_period', value='5', format='int') | |||
|
31 | opObj11.addParameter(name='exp_code', value='22', format='int') | |||
|
32 | ||||
|
33 | ||||
|
34 | controller.start() |
@@ -0,0 +1,188 | |||||
|
1 | import click | |||
|
2 | import schainpy | |||
|
3 | import subprocess | |||
|
4 | import os | |||
|
5 | import sys | |||
|
6 | import glob | |||
|
7 | save_stdout = sys.stdout | |||
|
8 | sys.stdout = open('trash', 'w') | |||
|
9 | from multiprocessing import cpu_count | |||
|
10 | from schaincli import templates | |||
|
11 | from schainpy import controller_api | |||
|
12 | from schainpy.model import Operation, ProcessingUnit | |||
|
13 | from schainpy.utils import log | |||
|
14 | from importlib import import_module | |||
|
15 | from pydoc import locate | |||
|
16 | from fuzzywuzzy import process | |||
|
17 | sys.stdout = save_stdout | |||
|
18 | ||||
|
19 | ||||
|
20 | def print_version(ctx, param, value): | |||
|
21 | if not value or ctx.resilient_parsing: | |||
|
22 | return | |||
|
23 | click.echo(schainpy.__version__) | |||
|
24 | ctx.exit() | |||
|
25 | ||||
|
26 | ||||
|
27 | cliLogger = log.makelogger('schain cli') | |||
|
28 | PREFIX = 'experiment' | |||
|
29 | ||||
|
30 | ||||
|
31 | @click.command() | |||
|
32 | @click.option('--version', '-v', is_flag=True, callback=print_version, help='SChain version', type=str) | |||
|
33 | @click.option('--xml', '-x', default=None, help='run an XML file', type=click.Path(exists=True, resolve_path=True)) | |||
|
34 | @click.argument('command', default='run', required=True) | |||
|
35 | @click.argument('nextcommand', default=None, required=False, type=str) | |||
|
36 | def main(command, nextcommand, version, xml): | |||
|
37 | """COMMAND LINE INTERFACE FOR SIGNAL CHAIN - JICAMARCA RADIO OBSERVATORY \n | |||
|
38 | Available commands.\n | |||
|
39 | --xml: runs a schain XML generated file\n | |||
|
40 | run: runs any python script starting 'experiment_'\n | |||
|
41 | generate: generates a template schain script\n | |||
|
42 | search: return avilable operations, procs or arguments of the give operation/proc\n""" | |||
|
43 | if xml is not None: | |||
|
44 | runFromXML(xml) | |||
|
45 | elif command == 'generate': | |||
|
46 | generate() | |||
|
47 | elif command == 'test': | |||
|
48 | test() | |||
|
49 | elif command == 'run': | |||
|
50 | runschain(nextcommand) | |||
|
51 | elif command == 'search': | |||
|
52 | search(nextcommand) | |||
|
53 | else: | |||
|
54 | log.error('Command {} is not defined'.format(command)) | |||
|
55 | ||||
|
56 | def check_module(possible, instance): | |||
|
57 | def check(x): | |||
|
58 | try: | |||
|
59 | instancia = locate('schainpy.model.{}'.format(x)) | |||
|
60 | return isinstance(instancia(), instance) | |||
|
61 | except Exception as e: | |||
|
62 | return False | |||
|
63 | clean = clean_modules(possible) | |||
|
64 | return [x for x in clean if check(x)] | |||
|
65 | ||||
|
66 | ||||
|
67 | def clean_modules(module): | |||
|
68 | noEndsUnder = [x for x in module if not x.endswith('__')] | |||
|
69 | noStartUnder = [x for x in noEndsUnder if not x.startswith('__')] | |||
|
70 | noFullUpper = [x for x in noStartUnder if not x.isupper()] | |||
|
71 | return noFullUpper | |||
|
72 | ||||
|
73 | ||||
|
74 | def search(nextcommand): | |||
|
75 | if nextcommand is None: | |||
|
76 | log.error('There is no Operation/ProcessingUnit to search') | |||
|
77 | elif nextcommand == 'procs': | |||
|
78 | module = dir(import_module('schainpy.model')) | |||
|
79 | procs = check_module(module, ProcessingUnit) | |||
|
80 | try: | |||
|
81 | procs.remove('ProcessingUnit') | |||
|
82 | except Exception as e: | |||
|
83 | pass | |||
|
84 | log.success('Current ProcessingUnits are:\n\033[1m{}\033[0m'.format('\n'.join(procs))) | |||
|
85 | ||||
|
86 | elif nextcommand == 'operations': | |||
|
87 | module = dir(import_module('schainpy.model')) | |||
|
88 | noProcs = [x for x in module if not x.endswith('Proc')] | |||
|
89 | operations = check_module(noProcs, Operation) | |||
|
90 | try: | |||
|
91 | operations.remove('Operation') | |||
|
92 | except Exception as e: | |||
|
93 | pass | |||
|
94 | log.success('Current Operations are:\n\033[1m{}\033[0m'.format('\n'.join(operations))) | |||
|
95 | else: | |||
|
96 | try: | |||
|
97 | module = locate('schainpy.model.{}'.format(nextcommand)) | |||
|
98 | args = module().getAllowedArgs() | |||
|
99 | log.warning('Use this feature with caution. It may not return all the allowed arguments') | |||
|
100 | try: | |||
|
101 | args.remove('self') | |||
|
102 | except Exception as e: | |||
|
103 | pass | |||
|
104 | try: | |||
|
105 | args.remove('dataOut') | |||
|
106 | except Exception as e: | |||
|
107 | pass | |||
|
108 | if len(args) == 0: | |||
|
109 | log.success('{} has no arguments'.format(nextcommand)) | |||
|
110 | else: | |||
|
111 | log.success('Showing arguments of {} are:\n\033[1m{}\033[0m'.format(nextcommand, '\n'.join(args))) | |||
|
112 | except Exception as e: | |||
|
113 | log.error('Module {} does not exists'.format(nextcommand)) | |||
|
114 | allModules = dir(import_module('schainpy.model')) | |||
|
115 | module = check_module(allModules, Operation) | |||
|
116 | module.extend(check_module(allModules, ProcessingUnit)) | |||
|
117 | similar = process.extractOne(nextcommand, module)[0] | |||
|
118 | log.success('Searching {} instead'.format(similar)) | |||
|
119 | search(similar) | |||
|
120 | ||||
|
121 | ||||
|
122 | def runschain(nextcommand): | |||
|
123 | if nextcommand is None: | |||
|
124 | currentfiles = glob.glob('./{}_*.py'.format(PREFIX)) | |||
|
125 | numberfiles = len(currentfiles) | |||
|
126 | if numberfiles > 1: | |||
|
127 | log.error('There is more than one file to run') | |||
|
128 | elif numberfiles == 1: | |||
|
129 | subprocess.call(['python ' + currentfiles[0]], shell=True) | |||
|
130 | else: | |||
|
131 | log.error('There is no file to run') | |||
|
132 | else: | |||
|
133 | try: | |||
|
134 | subprocess.call(['python ' + nextcommand], shell=True) | |||
|
135 | except Exception as e: | |||
|
136 | log.error("I cannot run the file. Does it exists?") | |||
|
137 | ||||
|
138 | ||||
|
139 | def basicInputs(): | |||
|
140 | inputs = {} | |||
|
141 | inputs['desc'] = click.prompt('Enter a description', default="A schain project", type=str) | |||
|
142 | inputs['name'] = click.prompt('Name of the project', default="project", type=str) | |||
|
143 | inputs['path'] = click.prompt('Data path', default=os.getcwd(), type=click.Path(exists=True, resolve_path=True)) | |||
|
144 | inputs['startDate'] = click.prompt('Start date', default='1970/01/01', type=str) | |||
|
145 | inputs['endDate'] = click.prompt('End date', default='2017/12/31', type=str) | |||
|
146 | inputs['startHour'] = click.prompt('Start hour', default='00:00:00', type=str) | |||
|
147 | inputs['endHour'] = click.prompt('End hour', default='23:59:59', type=str) | |||
|
148 | inputs['figpath'] = inputs['path'] + '/figs' | |||
|
149 | return inputs | |||
|
150 | ||||
|
151 | ||||
|
152 | def generate(): | |||
|
153 | inputs = basicInputs() | |||
|
154 | inputs['multiprocess'] = click.confirm('Is this a multiprocess script?') | |||
|
155 | if inputs['multiprocess']: | |||
|
156 | inputs['nProcess'] = click.prompt('How many process?', default=cpu_count(), type=int) | |||
|
157 | current = templates.multiprocess.format(**inputs) | |||
|
158 | else: | |||
|
159 | current = templates.basic.format(**inputs) | |||
|
160 | scriptname = '{}_{}.py'.format(PREFIX, inputs['name']) | |||
|
161 | script = open(scriptname, 'w') | |||
|
162 | try: | |||
|
163 | script.write(current) | |||
|
164 | log.success('Script {} generated'.format(scriptname)) | |||
|
165 | except Exception as e: | |||
|
166 | log.error('I cannot create the file. Do you have writing permissions?') | |||
|
167 | ||||
|
168 | ||||
|
169 | def test(): | |||
|
170 | log.warning('testing') | |||
|
171 | ||||
|
172 | ||||
|
173 | def runFromXML(filename): | |||
|
174 | controller = controller_api.ControllerThread() | |||
|
175 | if not controller.readXml(filename): | |||
|
176 | return | |||
|
177 | ||||
|
178 | plotterObj = controller.useExternalPlotter() | |||
|
179 | ||||
|
180 | controller.start() | |||
|
181 | plotterObj.start() | |||
|
182 | ||||
|
183 | cliLogger("Finishing all processes") | |||
|
184 | ||||
|
185 | controller.join(5) | |||
|
186 | ||||
|
187 | cliLogger("End of script") | |||
|
188 | return |
@@ -0,0 +1,75 | |||||
|
1 | basic = '''from schainpy.controller import Project | |||
|
2 | ||||
|
3 | desc = "{desc}" | |||
|
4 | ||||
|
5 | controller = Project() | |||
|
6 | controller.setup(id='191', name="{name}", description=desc) | |||
|
7 | ||||
|
8 | readUnitConf = controller.addReadUnit(datatype='VoltageReader', | |||
|
9 | path="{path}", | |||
|
10 | startDate="{startDate}", | |||
|
11 | endDate="{endDate}", | |||
|
12 | startTime="{startHour}", | |||
|
13 | endTime="{endHour}", | |||
|
14 | online=0, | |||
|
15 | verbose=1, | |||
|
16 | walk=1, | |||
|
17 | ) | |||
|
18 | ||||
|
19 | procUnitConf1 = controller.addProcUnit(datatype='VoltageProc', inputId=readUnitConf.getId()) | |||
|
20 | ||||
|
21 | opObj11 = procUnitConf1.addOperation(name='ProfileSelector', optype='other') | |||
|
22 | opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') | |||
|
23 | ||||
|
24 | opObj11 = procUnitConf1.addOperation(name='RTIPlot', optype='other') | |||
|
25 | opObj11.addParameter(name='wintitle', value='Jicamarca Radio Observatory', format='str') | |||
|
26 | opObj11.addParameter(name='showprofile', value='0', format='int') | |||
|
27 | opObj11.addParameter(name='xmin', value='0', format='int') | |||
|
28 | opObj11.addParameter(name='xmax', value='24', format='int') | |||
|
29 | opObj11.addParameter(name='figpath', value="{figpath}", format='str') | |||
|
30 | opObj11.addParameter(name='wr_period', value='5', format='int') | |||
|
31 | opObj11.addParameter(name='exp_code', value='22', format='int') | |||
|
32 | ||||
|
33 | ||||
|
34 | controller.start() | |||
|
35 | ''' | |||
|
36 | ||||
|
37 | multiprocess = '''from schainpy.controller import Project, multiSchain | |||
|
38 | ||||
|
39 | desc = "{desc}" | |||
|
40 | ||||
|
41 | def fiber(cursor, skip, q, day): | |||
|
42 | controller = Project() | |||
|
43 | controller.setup(id='191', name="{name}", description=desc) | |||
|
44 | ||||
|
45 | readUnitConf = controller.addReadUnit(datatype='SpectraReader', | |||
|
46 | path="{path}", | |||
|
47 | startDate=day, | |||
|
48 | endDate=day, | |||
|
49 | startTime="{startHour}", | |||
|
50 | endTime="{endHour}", | |||
|
51 | online=0, | |||
|
52 | queue=q, | |||
|
53 | cursor=cursor, | |||
|
54 | skip=skip, | |||
|
55 | verbose=1, | |||
|
56 | walk=1, | |||
|
57 | ) | |||
|
58 | ||||
|
59 | procUnitConf1 = controller.addProcUnit(datatype='Spectra', inputId=readUnitConf.getId()) | |||
|
60 | ||||
|
61 | procUnitConf2 = controller.addProcUnit(datatype='ParametersProc', inputId=readUnitConf.getId()) | |||
|
62 | opObj11 = procUnitConf2.addOperation(name='SpectralMoments', optype='other') | |||
|
63 | ||||
|
64 | opObj12 = procUnitConf2.addOperation(name='PublishData', optype='other') | |||
|
65 | opObj12.addParameter(name='zeromq', value=1, format='int') | |||
|
66 | opObj12.addParameter(name='verbose', value=0, format='bool') | |||
|
67 | ||||
|
68 | controller.start() | |||
|
69 | ||||
|
70 | ||||
|
71 | if __name__ == '__main__': | |||
|
72 | multiSchain(fiber, nProcess={nProcess}, startDate="{startDate}", endDate="{endDate}") | |||
|
73 | ||||
|
74 | ||||
|
75 | ''' |
@@ -0,0 +1,1 | |||||
|
1 |
@@ -0,0 +1,29 | |||||
|
1 | import pytest | |||
|
2 | from click.testing import CliRunner | |||
|
3 | from schaincli import cli | |||
|
4 | ||||
|
5 | ||||
|
6 | @pytest.fixture | |||
|
7 | def runner(): | |||
|
8 | return CliRunner() | |||
|
9 | ||||
|
10 | ||||
|
11 | def test_cli(runner): | |||
|
12 | result = runner.invoke(cli.main) | |||
|
13 | assert result.exit_code == 0 | |||
|
14 | assert not result.exception | |||
|
15 | assert result.output.strip() == 'Hello, world.' | |||
|
16 | ||||
|
17 | ||||
|
18 | def test_cli_with_option(runner): | |||
|
19 | result = runner.invoke(cli.main, ['--as-cowboy']) | |||
|
20 | assert not result.exception | |||
|
21 | assert result.exit_code == 0 | |||
|
22 | assert result.output.strip() == 'Howdy, world.' | |||
|
23 | ||||
|
24 | ||||
|
25 | def test_cli_with_arg(runner): | |||
|
26 | result = runner.invoke(cli.main, ['Jicamarca']) | |||
|
27 | assert result.exit_code == 0 | |||
|
28 | assert not result.exception | |||
|
29 | assert result.output.strip() == 'Hello, Jicamarca.' |
@@ -0,0 +1,34 | |||||
|
1 | from schainpy.controller import Project | |||
|
2 | ||||
|
3 | desc = "A schain project" | |||
|
4 | ||||
|
5 | controller = Project() | |||
|
6 | controller.setup(id='191', name="project", description=desc) | |||
|
7 | ||||
|
8 | readUnitConf = controller.addReadUnit(datatype='VoltageReader', | |||
|
9 | path="/home/nanosat/schain/schainpy", | |||
|
10 | startDate="1970/01/01", | |||
|
11 | endDate="2017/12/31", | |||
|
12 | startTime="00:00:00", | |||
|
13 | endTime="23:59:59", | |||
|
14 | online=0, | |||
|
15 | verbose=1, | |||
|
16 | walk=1, | |||
|
17 | ) | |||
|
18 | ||||
|
19 | procUnitConf1 = controller.addProcUnit(datatype='VoltageProc', inputId=readUnitConf.getId()) | |||
|
20 | ||||
|
21 | opObj11 = procUnitConf1.addOperation(name='ProfileSelector', optype='other') | |||
|
22 | opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') | |||
|
23 | ||||
|
24 | opObj11 = procUnitConf1.addOperation(name='RTIPlot', optype='other') | |||
|
25 | opObj11.addParameter(name='wintitle', value='Jicamarca Radio Observatory', format='str') | |||
|
26 | opObj11.addParameter(name='showprofile', value='0', format='int') | |||
|
27 | opObj11.addParameter(name='xmin', value='0', format='int') | |||
|
28 | opObj11.addParameter(name='xmax', value='24', format='int') | |||
|
29 | opObj11.addParameter(name='figpath', value="/home/nanosat/schain/schainpy/figs", format='str') | |||
|
30 | opObj11.addParameter(name='wr_period', value='5', format='int') | |||
|
31 | opObj11.addParameter(name='exp_code', value='22', format='int') | |||
|
32 | ||||
|
33 | ||||
|
34 | controller.start() |
@@ -0,0 +1,33 | |||||
|
1 | from schainpy.controller import Project | |||
|
2 | ||||
|
3 | desc = "A schain project" | |||
|
4 | ||||
|
5 | controller = Project() | |||
|
6 | controller.setup(id='191', name="project", description=desc) | |||
|
7 | ||||
|
8 | readUnitConf = controller.addReadUnit(datatype='VoltageReader', | |||
|
9 | path="/home/nanosat/schain/schainpy/scripts", | |||
|
10 | startDate="1970/01/01", | |||
|
11 | endDate="2017/12/31", | |||
|
12 | startTime="00:00:00", | |||
|
13 | endTime="23:59:59", | |||
|
14 | online=0, | |||
|
15 | walk=1, | |||
|
16 | ) | |||
|
17 | ||||
|
18 | procUnitConf1 = controller.addProcUnit(datatype='VoltageProc', inputId=readUnitConf.getId()) | |||
|
19 | ||||
|
20 | opObj11 = procUnitConf1.addOperation(name='ProfileSelector', optype='other') | |||
|
21 | opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') | |||
|
22 | ||||
|
23 | opObj11 = procUnitConf1.addOperation(name='RTIPlot', optype='other') | |||
|
24 | opObj11.addParameter(name='wintitle', value='Jicamarca Radio Observatory', format='str') | |||
|
25 | opObj11.addParameter(name='showprofile', value='0', format='int') | |||
|
26 | opObj11.addParameter(name='xmin', value='0', format='int') | |||
|
27 | opObj11.addParameter(name='xmax', value='24', format='int') | |||
|
28 | opObj11.addParameter(name='figpath', value="/home/nanosat/schain/schainpy/scripts/figs", format='str') | |||
|
29 | opObj11.addParameter(name='wr_period', value='5', format='int') | |||
|
30 | opObj11.addParameter(name='exp_code', value='22', format='int') | |||
|
31 | ||||
|
32 | ||||
|
33 | controller.start() |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 |
@@ -0,0 +1,45 | |||||
|
1 | """. | |||
|
2 | SCHAINPY - LOG | |||
|
3 | Simple helper for log standarization | |||
|
4 | Usage: | |||
|
5 | from schainpy.utils import log | |||
|
6 | log.error('A kitten died beacuse of you') | |||
|
7 | log.warning('You are doing it wrong but what the heck, I'll allow it) | |||
|
8 | log.succes('YOU ROCK!') | |||
|
9 | To create your own logger inside your class do it like this: | |||
|
10 | from schainpy.utils import log | |||
|
11 | awesomeLogger = log.makelogger("never gonna", bg="red", fg="white") | |||
|
12 | awesomeLogger('give you up') | |||
|
13 | which will look like this: | |||
|
14 | [NEVER GONNA] - give you up | |||
|
15 | with color red as background and white as foreground. | |||
|
16 | """ | |||
|
17 | ||||
|
18 | import click | |||
|
19 | ||||
|
20 | ||||
|
21 | def warning(message): | |||
|
22 | click.echo(click.style('[WARNING] - ' + message, fg='yellow')) | |||
|
23 | pass | |||
|
24 | ||||
|
25 | ||||
|
26 | def error(message): | |||
|
27 | click.echo(click.style('[ERROR] - ' + message, fg='red')) | |||
|
28 | pass | |||
|
29 | ||||
|
30 | ||||
|
31 | def success(message): | |||
|
32 | click.echo(click.style(message, fg='green')) | |||
|
33 | pass | |||
|
34 | ||||
|
35 | ||||
|
36 | def log(message): | |||
|
37 | click.echo('[LOG] - ' + message) | |||
|
38 | pass | |||
|
39 | ||||
|
40 | ||||
|
41 | def makelogger(topic, bg='reset', fg='reset'): | |||
|
42 | def func(message): | |||
|
43 | click.echo(click.style('[{}] - '.format(topic.upper()) + message, | |||
|
44 | bg=bg, fg=fg)) | |||
|
45 | return func |
@@ -0,0 +1,1 | |||||
|
1 | You should install "digital_rf_hdf5" module if you want to read USRP data |
@@ -61,7 +61,7 def multiSchain(child, nProcess=cpu_count(), startDate=None, endDate=None, by_da | |||||
61 | process.terminate() |
|
61 | process.terminate() | |
62 | process.join() |
|
62 | process.join() | |
63 | print traceback.print_tb(trace) |
|
63 | print traceback.print_tb(trace) | |
64 |
|
64 | |||
65 | sys.excepthook = beforeExit |
|
65 | sys.excepthook = beforeExit | |
66 |
|
66 | |||
67 | for process in processes: |
|
67 | for process in processes: | |
@@ -1315,9 +1315,9 class Project(): | |||||
1315 |
|
1315 | |||
1316 | print "Process finished" |
|
1316 | print "Process finished" | |
1317 |
|
1317 | |||
1318 | def start(self): |
|
1318 | def start(self, filename=None): | |
1319 |
|
1319 | |||
1320 | self.writeXml() |
|
1320 | self.writeXml(filename) | |
1321 | self.createObjects() |
|
1321 | self.createObjects() | |
1322 | self.connectObjects() |
|
1322 | self.connectObjects() | |
1323 | self.run() |
|
1323 | self.run() |
@@ -5,175 +5,175 from schainpy.controller import Project | |||||
5 | from schainpy.model.graphics.jroplotter import PlotManager |
|
5 | from schainpy.model.graphics.jroplotter import PlotManager | |
6 |
|
6 | |||
7 | class ControllerThread(threading.Thread, Project): |
|
7 | class ControllerThread(threading.Thread, Project): | |
8 |
|
8 | |||
9 | def __init__(self, plotter_queue=None): |
|
9 | def __init__(self, plotter_queue=None): | |
10 |
|
10 | |||
11 | threading.Thread.__init__(self) |
|
11 | threading.Thread.__init__(self) | |
12 | Project.__init__(self, plotter_queue) |
|
12 | Project.__init__(self, plotter_queue) | |
13 |
|
13 | |||
14 | self.setDaemon(True) |
|
14 | self.setDaemon(True) | |
15 |
|
15 | |||
16 | self.lock = threading.Lock() |
|
16 | self.lock = threading.Lock() | |
17 | self.control = {'stop':False, 'pause':False} |
|
17 | self.control = {'stop':False, 'pause':False} | |
18 |
|
18 | |||
19 | def __del__(self): |
|
19 | def __del__(self): | |
20 |
|
20 | |||
21 | self.control['stop'] = True |
|
21 | self.control['stop'] = True | |
22 |
|
22 | |||
23 | def stop(self): |
|
23 | def stop(self): | |
24 |
|
24 | |||
25 | self.lock.acquire() |
|
25 | self.lock.acquire() | |
26 |
|
26 | |||
27 | self.control['stop'] = True |
|
27 | self.control['stop'] = True | |
28 |
|
28 | |||
29 | self.lock.release() |
|
29 | self.lock.release() | |
30 |
|
30 | |||
31 | def pause(self): |
|
31 | def pause(self): | |
32 |
|
32 | |||
33 | self.lock.acquire() |
|
33 | self.lock.acquire() | |
34 |
|
34 | |||
35 | self.control['pause'] = not(self.control['pause']) |
|
35 | self.control['pause'] = not(self.control['pause']) | |
36 | paused = self.control['pause'] |
|
36 | paused = self.control['pause'] | |
37 |
|
37 | |||
38 | self.lock.release() |
|
38 | self.lock.release() | |
39 |
|
39 | |||
40 | return paused |
|
40 | return paused | |
41 |
|
41 | |||
42 | def isPaused(self): |
|
42 | def isPaused(self): | |
43 |
|
43 | |||
44 | self.lock.acquire() |
|
44 | self.lock.acquire() | |
45 | paused = self.control['pause'] |
|
45 | paused = self.control['pause'] | |
46 | self.lock.release() |
|
46 | self.lock.release() | |
47 |
|
47 | |||
48 | return paused |
|
48 | return paused | |
49 |
|
49 | |||
50 | def isStopped(self): |
|
50 | def isStopped(self): | |
51 |
|
51 | |||
52 | self.lock.acquire() |
|
52 | self.lock.acquire() | |
53 | stopped = self.control['stop'] |
|
53 | stopped = self.control['stop'] | |
54 | self.lock.release() |
|
54 | self.lock.release() | |
55 |
|
55 | |||
56 | return stopped |
|
56 | return stopped | |
57 |
|
57 | |||
58 | def run(self): |
|
58 | def run(self): | |
59 | self.control['stop'] = False |
|
59 | self.control['stop'] = False | |
60 | self.control['pause'] = False |
|
60 | self.control['pause'] = False | |
61 |
|
61 | |||
62 | self.writeXml() |
|
62 | self.writeXml() | |
63 |
|
63 | |||
64 | self.createObjects() |
|
64 | self.createObjects() | |
65 | self.connectObjects() |
|
65 | self.connectObjects() | |
66 | Project.run(self) |
|
66 | Project.run(self) | |
67 |
|
67 | |||
68 | def isRunning(self): |
|
68 | def isRunning(self): | |
69 |
|
69 | |||
70 | return self.is_alive() |
|
70 | return self.is_alive() | |
71 |
|
71 | |||
72 | def isFinished(self): |
|
72 | def isFinished(self): | |
73 |
|
73 | |||
74 | return not self.is_alive() |
|
74 | return not self.is_alive() | |
75 |
|
75 | |||
76 | def setPlotters(self): |
|
76 | def setPlotters(self): | |
77 |
|
77 | |||
78 | plotterList = PlotManager.plotterList |
|
78 | plotterList = PlotManager.plotterList | |
79 |
|
79 | |||
80 | for thisPUConfObj in self.procUnitConfObjDict.values(): |
|
80 | for thisPUConfObj in self.procUnitConfObjDict.values(): | |
81 |
|
81 | |||
82 | inputId = thisPUConfObj.getInputId() |
|
82 | inputId = thisPUConfObj.getInputId() | |
83 |
|
83 | |||
84 | if int(inputId) == 0: |
|
84 | if int(inputId) == 0: | |
85 | continue |
|
85 | continue | |
86 |
|
86 | |||
87 | for thisOpObj in thisPUConfObj.getOperationObjList(): |
|
87 | for thisOpObj in thisPUConfObj.getOperationObjList(): | |
88 |
|
88 | |||
89 | if thisOpObj.type == "self": |
|
89 | if thisOpObj.type == "self": | |
90 | continue |
|
90 | continue | |
91 |
|
91 | |||
92 | if thisOpObj.name in plotterList: |
|
92 | if thisOpObj.name in plotterList: | |
93 | thisOpObj.type = "plotter" |
|
93 | thisOpObj.type = "plotter" | |
94 |
|
94 | |||
95 | def setPlotterQueue(self, plotter_queue): |
|
95 | def setPlotterQueue(self, plotter_queue): | |
96 |
|
96 | |||
97 | self.plotterQueue = plotter_queue |
|
97 | self.plotterQueue = plotter_queue | |
98 |
|
98 | |||
99 | def getPlotterQueue(self): |
|
99 | def getPlotterQueue(self): | |
100 |
|
100 | |||
101 | return self.plotterQueue |
|
101 | return self.plotterQueue | |
102 |
|
102 | |||
103 | def useExternalPlotter(self): |
|
103 | def useExternalPlotter(self): | |
104 |
|
104 | |||
105 | self.plotterQueue = Queue(10) |
|
105 | self.plotterQueue = Queue(10) | |
106 | self.setPlotters() |
|
106 | self.setPlotters() | |
107 |
|
107 | |||
108 | plotManagerObj = PlotManager(self.plotterQueue) |
|
108 | plotManagerObj = PlotManager(self.plotterQueue) | |
109 | plotManagerObj.setController(self) |
|
109 | plotManagerObj.setController(self) | |
110 |
|
110 | |||
111 | return plotManagerObj |
|
111 | return plotManagerObj | |
112 |
|
112 | |||
113 | # from PyQt4 import QtCore |
|
113 | # from PyQt4 import QtCore | |
114 | # from PyQt4.QtCore import SIGNAL |
|
114 | # from PyQt4.QtCore import SIGNAL | |
115 |
# |
|
115 | # | |
116 | # class ControllerQThread(QtCore.QThread, Project): |
|
116 | # class ControllerQThread(QtCore.QThread, Project): | |
117 | # |
|
117 | # | |
118 | # def __init__(self, filename): |
|
118 | # def __init__(self, filename): | |
119 | # |
|
119 | # | |
120 | # QtCore.QThread.__init__(self) |
|
120 | # QtCore.QThread.__init__(self) | |
121 | # Project.__init__(self) |
|
121 | # Project.__init__(self) | |
122 | # |
|
122 | # | |
123 | # self.filename = filename |
|
123 | # self.filename = filename | |
124 | # |
|
124 | # | |
125 | # self.lock = threading.Lock() |
|
125 | # self.lock = threading.Lock() | |
126 | # self.control = {'stop':False, 'pause':False} |
|
126 | # self.control = {'stop':False, 'pause':False} | |
127 | # |
|
127 | # | |
128 | # def __del__(self): |
|
128 | # def __del__(self): | |
129 | # |
|
129 | # | |
130 | # self.control['stop'] = True |
|
130 | # self.control['stop'] = True | |
131 | # self.wait() |
|
131 | # self.wait() | |
132 | # |
|
132 | # | |
133 | # def stop(self): |
|
133 | # def stop(self): | |
134 | # |
|
134 | # | |
135 | # self.lock.acquire() |
|
135 | # self.lock.acquire() | |
136 | # |
|
136 | # | |
137 | # self.control['stop'] = True |
|
137 | # self.control['stop'] = True | |
138 | # |
|
138 | # | |
139 | # self.lock.release() |
|
139 | # self.lock.release() | |
140 | # |
|
140 | # | |
141 | # def pause(self): |
|
141 | # def pause(self): | |
142 | # |
|
142 | # | |
143 | # self.lock.acquire() |
|
143 | # self.lock.acquire() | |
144 | # |
|
144 | # | |
145 | # self.control['pause'] = not(self.control['pause']) |
|
145 | # self.control['pause'] = not(self.control['pause']) | |
146 | # paused = self.control['pause'] |
|
146 | # paused = self.control['pause'] | |
147 | # |
|
147 | # | |
148 | # self.lock.release() |
|
148 | # self.lock.release() | |
149 | # |
|
149 | # | |
150 | # return paused |
|
150 | # return paused | |
151 | # |
|
151 | # | |
152 | # def isPaused(self): |
|
152 | # def isPaused(self): | |
153 | # |
|
153 | # | |
154 | # self.lock.acquire() |
|
154 | # self.lock.acquire() | |
155 | # paused = self.control['pause'] |
|
155 | # paused = self.control['pause'] | |
156 | # self.lock.release() |
|
156 | # self.lock.release() | |
157 | # |
|
157 | # | |
158 | # return paused |
|
158 | # return paused | |
159 | # |
|
159 | # | |
160 | # def isStopped(self): |
|
160 | # def isStopped(self): | |
161 | # |
|
161 | # | |
162 | # self.lock.acquire() |
|
162 | # self.lock.acquire() | |
163 | # stopped = self.control['stop'] |
|
163 | # stopped = self.control['stop'] | |
164 | # self.lock.release() |
|
164 | # self.lock.release() | |
165 | # |
|
165 | # | |
166 | # return stopped |
|
166 | # return stopped | |
167 | # |
|
167 | # | |
168 | # def run(self): |
|
168 | # def run(self): | |
169 | # |
|
169 | # | |
170 | # self.control['stop'] = False |
|
170 | # self.control['stop'] = False | |
171 | # self.control['pause'] = False |
|
171 | # self.control['pause'] = False | |
172 | # |
|
172 | # | |
173 | # self.readXml(self.filename) |
|
173 | # self.readXml(self.filename) | |
174 | # self.createObjects() |
|
174 | # self.createObjects() | |
175 | # self.connectObjects() |
|
175 | # self.connectObjects() | |
176 | # self.emit( SIGNAL( "jobStarted( PyQt_PyObject )" ), 1) |
|
176 | # self.emit( SIGNAL( "jobStarted( PyQt_PyObject )" ), 1) | |
177 | # Project.run(self) |
|
177 | # Project.run(self) | |
178 | # self.emit( SIGNAL( "jobFinished( PyQt_PyObject )" ), 1) |
|
178 | # self.emit( SIGNAL( "jobFinished( PyQt_PyObject )" ), 1) | |
179 | # No newline at end of file |
|
179 | # |
@@ -114,10 +114,6 class GenericData(object): | |||||
114 |
|
114 | |||
115 | flagNoData = True |
|
115 | flagNoData = True | |
116 |
|
116 | |||
117 | def __init__(self): |
|
|||
118 |
|
||||
119 | raise NotImplementedError |
|
|||
120 |
|
||||
121 | def copy(self, inputObj=None): |
|
117 | def copy(self, inputObj=None): | |
122 |
|
118 | |||
123 | if inputObj == None: |
|
119 | if inputObj == None: | |
@@ -231,10 +227,6 class JROData(GenericData): | |||||
231 |
|
227 | |||
232 | profileIndex = None |
|
228 | profileIndex = None | |
233 |
|
229 | |||
234 | def __init__(self): |
|
|||
235 |
|
||||
236 | raise NotImplementedError |
|
|||
237 |
|
||||
238 | def getNoise(self): |
|
230 | def getNoise(self): | |
239 |
|
231 | |||
240 | raise NotImplementedError |
|
232 | raise NotImplementedError | |
@@ -1216,7 +1208,10 class Parameters(Spectra): | |||||
1216 |
|
1208 | |||
1217 | def getTimeInterval(self): |
|
1209 | def getTimeInterval(self): | |
1218 |
|
1210 | |||
1219 |
|
|
1211 | if hasattr(self, 'timeInterval1'): | |
|
1212 | return self.timeInterval1 | |||
|
1213 | else: | |||
|
1214 | return self.paramInterval | |||
1220 |
|
1215 | |||
1221 | def getNoise(self): |
|
1216 | def getNoise(self): | |
1222 |
|
1217 |
@@ -14,7 +14,7 from multiprocessing import Process | |||||
14 |
|
14 | |||
15 | from schainpy.model.proc.jroproc_base import Operation |
|
15 | from schainpy.model.proc.jroproc_base import Operation | |
16 |
|
16 | |||
17 |
plt.io |
|
17 | plt.ion() | |
18 |
|
18 | |||
19 | func = lambda x, pos: ('%s') %(datetime.datetime.fromtimestamp(x).strftime('%H:%M')) |
|
19 | func = lambda x, pos: ('%s') %(datetime.datetime.fromtimestamp(x).strftime('%H:%M')) | |
20 |
|
20 | |||
@@ -58,6 +58,8 class PlotData(Operation, Process): | |||||
58 | self.__MAXNUMY = kwargs.get('decimation', 80) |
|
58 | self.__MAXNUMY = kwargs.get('decimation', 80) | |
59 | self.throttle_value = 5 |
|
59 | self.throttle_value = 5 | |
60 | self.times = [] |
|
60 | self.times = [] | |
|
61 | #self.interactive = self.kwargs['parent'] | |||
|
62 | ||||
61 |
|
63 | |||
62 | def fill_gaps(self, x_buffer, y_buffer, z_buffer): |
|
64 | def fill_gaps(self, x_buffer, y_buffer, z_buffer): | |
63 |
|
65 | |||
@@ -94,16 +96,22 class PlotData(Operation, Process): | |||||
94 | print 'plotting...{}'.format(self.CODE) |
|
96 | print 'plotting...{}'.format(self.CODE) | |
95 |
|
97 | |||
96 | if self.show: |
|
98 | if self.show: | |
97 | print 'showing' |
|
|||
98 | self.figure.show() |
|
99 | self.figure.show() | |
99 | self.figure2.show() |
|
100 | self.figure2.show() | |
100 |
|
101 | |||
101 | self.plot() |
|
102 | self.plot() | |
102 | plt.tight_layout() |
|
103 | plt.tight_layout() | |
103 | self.figure.canvas.manager.set_window_title('{} {} - Date:{}'.format(self.title, self.CODE.upper(), |
|
104 | ||
104 | datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S'))) |
|
105 | # self.figure.canvas.manager.set_window_title('{} {} - Date:{}'.format(self.title, self.CODE.upper(), | |
105 | self.figure2.canvas.manager.set_window_title('{} {} - Date:{}'.format(self.title, self.CODE.upper(), |
|
106 | # datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S'))) | |
106 | datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S'))) |
|
107 | # self.figure2.canvas.manager.set_window_title('{} {} - Date:{}'.format(self.title, self.CODE.upper(), | |
|
108 | # datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S'))) | |||
|
109 | # ======= | |||
|
110 | self.figure.canvas.manager.set_window_title('{} {} - {}'.format(self.title, self.CODE.upper(), | |||
|
111 | datetime.datetime.fromtimestamp(self.max_time).strftime('%Y/%m/%d'))) | |||
|
112 | self.figure2.canvas.manager.set_window_title('{} {} - {}'.format(self.title, self.CODE.upper(), | |||
|
113 | datetime.datetime.fromtimestamp(self.max_time).strftime('%Y/%m/%d'))) | |||
|
114 | ||||
107 |
|
115 | |||
108 | if self.save: |
|
116 | if self.save: | |
109 | figname = os.path.join(self.save, '{}_{}.png'.format(self.CODE, |
|
117 | figname = os.path.join(self.save, '{}_{}.png'.format(self.CODE, | |
@@ -126,12 +134,19 class PlotData(Operation, Process): | |||||
126 | def run(self): |
|
134 | def run(self): | |
127 |
|
135 | |||
128 | print '[Starting] {}'.format(self.name) |
|
136 | print '[Starting] {}'.format(self.name) | |
|
137 | ||||
129 | context = zmq.Context() |
|
138 | context = zmq.Context() | |
130 | receiver = context.socket(zmq.SUB) |
|
139 | receiver = context.socket(zmq.SUB) | |
131 | receiver.setsockopt(zmq.SUBSCRIBE, '') |
|
140 | receiver.setsockopt(zmq.SUBSCRIBE, '') | |
132 | receiver.setsockopt(zmq.CONFLATE, self.CONFLATE) |
|
141 | receiver.setsockopt(zmq.CONFLATE, self.CONFLATE) | |
133 | receiver.connect("ipc:///tmp/zmq.plots") |
|
142 | ||
|
143 | if 'server' in self.kwargs['parent']: | |||
|
144 | receiver.connect('ipc:///tmp/{}.plots'.format(self.kwargs['parent']['server'])) | |||
|
145 | else: | |||
|
146 | receiver.connect("ipc:///tmp/zmq.plots") | |||
|
147 | ||||
134 | seconds_passed = 0 |
|
148 | seconds_passed = 0 | |
|
149 | ||||
135 | while True: |
|
150 | while True: | |
136 | try: |
|
151 | try: | |
137 | self.data = receiver.recv_pyobj(flags=zmq.NOBLOCK)#flags=zmq.NOBLOCK |
|
152 | self.data = receiver.recv_pyobj(flags=zmq.NOBLOCK)#flags=zmq.NOBLOCK | |
@@ -637,6 +652,7 class PlotNoiseData(PlotData): | |||||
637 |
|
652 | |||
638 |
|
653 | |||
639 | class PlotWindProfilerData(PlotRTIData): |
|
654 | class PlotWindProfilerData(PlotRTIData): | |
|
655 | ||||
640 | CODE = 'wind' |
|
656 | CODE = 'wind' | |
641 | colormap = 'seismic' |
|
657 | colormap = 'seismic' | |
642 |
|
658 | |||
@@ -646,7 +662,7 class PlotWindProfilerData(PlotRTIData): | |||||
646 | self.width = 10 |
|
662 | self.width = 10 | |
647 | self.height = 2.2*self.nrows |
|
663 | self.height = 2.2*self.nrows | |
648 | self.ylabel = 'Height [Km]' |
|
664 | self.ylabel = 'Height [Km]' | |
649 | self.titles = ['Zonal' ,'Meridional', 'Vertical'] |
|
665 | self.titles = ['Zonal Wind' ,'Meridional Wind', 'Vertical Wind'] | |
650 | self.clabels = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)'] |
|
666 | self.clabels = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)'] | |
651 | self.windFactor = [1, 1, 100] |
|
667 | self.windFactor = [1, 1, 100] | |
652 |
|
668 | |||
@@ -670,13 +686,13 class PlotWindProfilerData(PlotRTIData): | |||||
670 | self.z = [] |
|
686 | self.z = [] | |
671 |
|
687 | |||
672 | for ch in range(self.nrows): |
|
688 | for ch in range(self.nrows): | |
673 |
self.z.append([self.data[ |
|
689 | self.z.append([self.data['output'][t][ch] for t in self.times]) | |
674 |
|
690 | |||
675 | self.z = np.array(self.z) |
|
691 | self.z = np.array(self.z) | |
676 | self.z = numpy.ma.masked_invalid(self.z) |
|
692 | self.z = numpy.ma.masked_invalid(self.z) | |
677 |
|
693 | |||
678 | cmap=plt.get_cmap(self.colormap) |
|
694 | cmap=plt.get_cmap(self.colormap) | |
679 |
cmap.set_bad(' |
|
695 | cmap.set_bad('black', 1.) | |
680 |
|
696 | |||
681 | for n, ax in enumerate(self.axes): |
|
697 | for n, ax in enumerate(self.axes): | |
682 | x, y, z = self.fill_gaps(*self.decimate()) |
|
698 | x, y, z = self.fill_gaps(*self.decimate()) | |
@@ -695,9 +711,9 class PlotWindProfilerData(PlotRTIData): | |||||
695 | ) |
|
711 | ) | |
696 | divider = make_axes_locatable(ax) |
|
712 | divider = make_axes_locatable(ax) | |
697 | cax = divider.new_horizontal(size='2%', pad=0.05) |
|
713 | cax = divider.new_horizontal(size='2%', pad=0.05) | |
698 | cax.set_ylabel(self.clabels[n]) |
|
|||
699 | self.figure.add_axes(cax) |
|
714 | self.figure.add_axes(cax) | |
700 | plt.colorbar(plot, cax) |
|
715 | cb = plt.colorbar(plot, cax) | |
|
716 | cb.set_label(self.clabels[n]) | |||
701 | ax.set_ylim(self.ymin, self.ymax) |
|
717 | ax.set_ylim(self.ymin, self.ymax) | |
702 |
|
718 | |||
703 | ax.xaxis.set_major_formatter(FuncFormatter(func)) |
|
719 | ax.xaxis.set_major_formatter(FuncFormatter(func)) | |
@@ -734,3 +750,62 class PlotDOPData(PlotRTIData): | |||||
734 | class PlotPHASEData(PlotCOHData): |
|
750 | class PlotPHASEData(PlotCOHData): | |
735 | CODE = 'phase' |
|
751 | CODE = 'phase' | |
736 | colormap = 'seismic' |
|
752 | colormap = 'seismic' | |
|
753 | ||||
|
754 | ||||
|
755 | class PlotSkyMapData(PlotData): | |||
|
756 | ||||
|
757 | CODE = 'met' | |||
|
758 | ||||
|
759 | def setup(self): | |||
|
760 | ||||
|
761 | self.ncols = 1 | |||
|
762 | self.nrows = 1 | |||
|
763 | self.width = 7.2 | |||
|
764 | self.height = 7.2 | |||
|
765 | ||||
|
766 | self.xlabel = 'Zonal Zenith Angle (deg)' | |||
|
767 | self.ylabel = 'Meridional Zenith Angle (deg)' | |||
|
768 | ||||
|
769 | if self.figure is None: | |||
|
770 | self.figure = plt.figure(figsize=(self.width, self.height), | |||
|
771 | edgecolor='k', | |||
|
772 | facecolor='w') | |||
|
773 | else: | |||
|
774 | self.figure.clf() | |||
|
775 | ||||
|
776 | self.ax = plt.subplot2grid((self.nrows, self.ncols), (0, 0), 1, 1, polar=True) | |||
|
777 | self.ax.firsttime = True | |||
|
778 | ||||
|
779 | ||||
|
780 | def plot(self): | |||
|
781 | ||||
|
782 | arrayParameters = np.concatenate([self.data['param'][t] for t in self.times]) | |||
|
783 | error = arrayParameters[:,-1] | |||
|
784 | indValid = numpy.where(error == 0)[0] | |||
|
785 | finalMeteor = arrayParameters[indValid,:] | |||
|
786 | finalAzimuth = finalMeteor[:,3] | |||
|
787 | finalZenith = finalMeteor[:,4] | |||
|
788 | ||||
|
789 | x = finalAzimuth*numpy.pi/180 | |||
|
790 | y = finalZenith | |||
|
791 | ||||
|
792 | if self.ax.firsttime: | |||
|
793 | self.ax.plot = self.ax.plot(x, y, 'bo', markersize=5)[0] | |||
|
794 | self.ax.set_ylim(0,90) | |||
|
795 | self.ax.set_yticks(numpy.arange(0,90,20)) | |||
|
796 | self.ax.set_xlabel(self.xlabel) | |||
|
797 | self.ax.set_ylabel(self.ylabel) | |||
|
798 | self.ax.yaxis.labelpad = 40 | |||
|
799 | self.ax.firsttime = False | |||
|
800 | else: | |||
|
801 | self.ax.plot.set_data(x, y) | |||
|
802 | ||||
|
803 | ||||
|
804 | dt1 = datetime.datetime.fromtimestamp(self.min_time).strftime('%y/%m/%d %H:%M:%S') | |||
|
805 | dt2 = datetime.datetime.fromtimestamp(self.max_time).strftime('%y/%m/%d %H:%M:%S') | |||
|
806 | title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1, | |||
|
807 | dt2, | |||
|
808 | len(x)) | |||
|
809 | self.ax.set_title(title, size=8) | |||
|
810 | ||||
|
811 | self.saveTime = self.max_time |
@@ -204,7 +204,7 def createPcolor(ax, x, y, z, xmin, xmax, ymin, ymax, zmin, zmax, | |||||
204 |
|
204 | |||
205 | z = numpy.ma.masked_invalid(z) |
|
205 | z = numpy.ma.masked_invalid(z) | |
206 | cmap=matplotlib.pyplot.get_cmap(colormap) |
|
206 | cmap=matplotlib.pyplot.get_cmap(colormap) | |
207 |
cmap.set_bad(' |
|
207 | cmap.set_bad('black', 1.) | |
208 | imesh = ax.pcolormesh(x,y,z.T, vmin=zmin, vmax=zmax, cmap=cmap) |
|
208 | imesh = ax.pcolormesh(x,y,z.T, vmin=zmin, vmax=zmax, cmap=cmap) | |
209 | cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb) |
|
209 | cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb) | |
210 | cb.set_label(cblabel) |
|
210 | cb.set_label(cblabel) | |
@@ -264,7 +264,7 def addpcolorbuffer(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', col | |||||
264 | z = numpy.ma.masked_invalid(z) |
|
264 | z = numpy.ma.masked_invalid(z) | |
265 |
|
265 | |||
266 | cmap=matplotlib.pyplot.get_cmap(colormap) |
|
266 | cmap=matplotlib.pyplot.get_cmap(colormap) | |
267 |
cmap.set_bad(' |
|
267 | cmap.set_bad('black', 1.) | |
268 |
|
268 | |||
269 |
|
269 | |||
270 | ax.pcolormesh(x,y,z.T,vmin=zmin,vmax=zmax, cmap=cmap) |
|
270 | ax.pcolormesh(x,y,z.T,vmin=zmin,vmax=zmax, cmap=cmap) |
@@ -9,6 +9,7 import glob | |||||
9 | import time |
|
9 | import time | |
10 | import numpy |
|
10 | import numpy | |
11 | import fnmatch |
|
11 | import fnmatch | |
|
12 | import inspect | |||
12 | import time, datetime |
|
13 | import time, datetime | |
13 | #import h5py |
|
14 | #import h5py | |
14 | import traceback |
|
15 | import traceback | |
@@ -536,6 +537,9 class JRODataIO: | |||||
536 |
|
537 | |||
537 | return dtype_width |
|
538 | return dtype_width | |
538 |
|
539 | |||
|
540 | def getAllowedArgs(self): | |||
|
541 | return inspect.getargspec(self.run).args | |||
|
542 | ||||
539 | class JRODataReader(JRODataIO): |
|
543 | class JRODataReader(JRODataIO): | |
540 |
|
544 | |||
541 |
|
545 | |||
@@ -1432,12 +1436,52 class JRODataReader(JRODataIO): | |||||
1432 | self.__printInfo = False |
|
1436 | self.__printInfo = False | |
1433 |
|
1437 | |||
1434 |
|
1438 | |||
1435 |
def run(self, |
|
1439 | def run(self, | |
|
1440 | path=None, | |||
|
1441 | startDate=None, | |||
|
1442 | endDate=None, | |||
|
1443 | startTime=datetime.time(0,0,0), | |||
|
1444 | endTime=datetime.time(23,59,59), | |||
|
1445 | set=None, | |||
|
1446 | expLabel = "", | |||
|
1447 | ext = None, | |||
|
1448 | online = False, | |||
|
1449 | delay = 60, | |||
|
1450 | walk = True, | |||
|
1451 | getblock = False, | |||
|
1452 | nTxs = 1, | |||
|
1453 | realtime=False, | |||
|
1454 | blocksize=None, | |||
|
1455 | blocktime=None, | |||
|
1456 | queue=None, | |||
|
1457 | skip=None, | |||
|
1458 | cursor=None, | |||
|
1459 | warnings=True, | |||
|
1460 | verbose=True, **kwargs): | |||
1436 |
|
1461 | |||
1437 | if not(self.isConfig): |
|
1462 | if not(self.isConfig): | |
1438 |
|
||||
1439 | # self.dataOut = dataOut |
|
1463 | # self.dataOut = dataOut | |
1440 |
self.setup( |
|
1464 | self.setup( path=path, | |
|
1465 | startDate=startDate, | |||
|
1466 | endDate=endDate, | |||
|
1467 | startTime=startTime, | |||
|
1468 | endTime=endTime, | |||
|
1469 | set=set, | |||
|
1470 | expLabel=expLabel, | |||
|
1471 | ext=ext, | |||
|
1472 | online=online, | |||
|
1473 | delay=delay, | |||
|
1474 | walk=walk, | |||
|
1475 | getblock=getblock, | |||
|
1476 | nTxs=nTxs, | |||
|
1477 | realtime=realtime, | |||
|
1478 | blocksize=blocksize, | |||
|
1479 | blocktime=blocktime, | |||
|
1480 | queue=queue, | |||
|
1481 | skip=skip, | |||
|
1482 | cursor=cursor, | |||
|
1483 | warnings=warnings, | |||
|
1484 | verbose=verbose) | |||
1441 | self.isConfig = True |
|
1485 | self.isConfig = True | |
1442 |
|
1486 | |||
1443 | self.getData() |
|
1487 | self.getData() | |
@@ -1740,11 +1784,11 class JRODataWriter(JRODataIO): | |||||
1740 |
|
1784 | |||
1741 | return 1 |
|
1785 | return 1 | |
1742 |
|
1786 | |||
1743 | def run(self, dataOut, **kwargs): |
|
1787 | def run(self, dataOut, path, blocksPerFile, profilesPerBlock=64, set=None, ext=None, datatype=4, **kwargs): | |
1744 |
|
1788 | |||
1745 | if not(self.isConfig): |
|
1789 | if not(self.isConfig): | |
1746 |
|
1790 | |||
1747 | self.setup(dataOut, **kwargs) |
|
1791 | self.setup(dataOut, path, blocksPerFile, profilesPerBlock=profilesPerBlock, set=set, ext=ext, datatype=datatype, **kwargs) | |
1748 | self.isConfig = True |
|
1792 | self.isConfig = True | |
1749 |
|
1793 | |||
1750 | self.putData() |
|
1794 | self.putData() |
@@ -149,6 +149,7 class ProcessingUnit(object): | |||||
149 | self.mp = True |
|
149 | self.mp = True | |
150 | self.start() |
|
150 | self.start() | |
151 | else: |
|
151 | else: | |
|
152 | self.operationKwargs[opId]['parent'] = self.kwargs | |||
152 | methodToCall(**self.operationKwargs[opId]) |
|
153 | methodToCall(**self.operationKwargs[opId]) | |
153 | else: |
|
154 | else: | |
154 | if name=='run': |
|
155 | if name=='run': | |
@@ -187,6 +188,7 class ProcessingUnit(object): | |||||
187 |
|
188 | |||
188 | if hasattr(externalProcObj, 'mp'): |
|
189 | if hasattr(externalProcObj, 'mp'): | |
189 | if externalProcObj.mp is False: |
|
190 | if externalProcObj.mp is False: | |
|
191 | externalProcObj.kwargs['parent'] = self.kwargs | |||
190 | self.operationKwargs[objId] = externalProcObj.kwargs |
|
192 | self.operationKwargs[objId] = externalProcObj.kwargs | |
191 | externalProcObj.mp = True |
|
193 | externalProcObj.mp = True | |
192 | externalProcObj.start() |
|
194 | externalProcObj.start() | |
@@ -194,6 +196,7 class ProcessingUnit(object): | |||||
194 | externalProcObj.run(self.dataOut, **externalProcObj.kwargs) |
|
196 | externalProcObj.run(self.dataOut, **externalProcObj.kwargs) | |
195 | self.operationKwargs[objId] = externalProcObj.kwargs |
|
197 | self.operationKwargs[objId] = externalProcObj.kwargs | |
196 |
|
198 | |||
|
199 | ||||
197 | return True |
|
200 | return True | |
198 |
|
201 | |||
199 | def call(self, opType, opName=None, opId=None): |
|
202 | def call(self, opType, opName=None, opId=None): |
@@ -1038,7 +1038,7 class WindProfiler(Operation): | |||||
1038 |
|
1038 | |||
1039 | return data_output |
|
1039 | return data_output | |
1040 |
|
1040 | |||
1041 | def run(self, dataOut, technique, **kwargs): |
|
1041 | def run(self, dataOut, technique, hmin=70, hmax=110, nHours=1, **kwargs): | |
1042 |
|
1042 | |||
1043 | param = dataOut.data_param |
|
1043 | param = dataOut.data_param | |
1044 | if dataOut.abscissaList != None: |
|
1044 | if dataOut.abscissaList != None: |
@@ -15,6 +15,7 from threading import Thread | |||||
15 | from multiprocessing import Process |
|
15 | from multiprocessing import Process | |
16 |
|
16 | |||
17 | from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit |
|
17 | from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit | |
|
18 | from schainpy.model.data.jrodata import JROData | |||
18 |
|
19 | |||
19 | MAXNUMX = 100 |
|
20 | MAXNUMX = 100 | |
20 | MAXNUMY = 100 |
|
21 | MAXNUMY = 100 | |
@@ -257,7 +258,44 class PublishData(Operation): | |||||
257 | self.client.loop_stop() |
|
258 | self.client.loop_stop() | |
258 | self.client.disconnect() |
|
259 | self.client.disconnect() | |
259 |
|
260 | |||
260 | class ReceiverData(ProcessingUnit, Process): |
|
261 | ||
|
262 | class ReceiverData(ProcessingUnit): | |||
|
263 | ||||
|
264 | def __init__(self, **kwargs): | |||
|
265 | ||||
|
266 | ProcessingUnit.__init__(self, **kwargs) | |||
|
267 | ||||
|
268 | self.isConfig = False | |||
|
269 | server = kwargs.get('server', 'zmq.pipe') | |||
|
270 | if 'tcp://' in server: | |||
|
271 | address = server | |||
|
272 | else: | |||
|
273 | address = 'ipc:///tmp/%s' % server | |||
|
274 | ||||
|
275 | self.address = address | |||
|
276 | self.dataOut = JROData() | |||
|
277 | ||||
|
278 | def setup(self): | |||
|
279 | ||||
|
280 | self.context = zmq.Context() | |||
|
281 | self.receiver = self.context.socket(zmq.PULL) | |||
|
282 | self.receiver.bind(self.address) | |||
|
283 | time.sleep(0.5) | |||
|
284 | print '[Starting] ReceiverData from {}'.format(self.address) | |||
|
285 | ||||
|
286 | ||||
|
287 | def run(self): | |||
|
288 | ||||
|
289 | if not self.isConfig: | |||
|
290 | self.setup() | |||
|
291 | self.isConfig = True | |||
|
292 | ||||
|
293 | self.dataOut = self.receiver.recv_pyobj() | |||
|
294 | print '[Receiving] {} - {}'.format(self.dataOut.type, | |||
|
295 | self.dataOut.datatime.ctime()) | |||
|
296 | ||||
|
297 | ||||
|
298 | class PlotterReceiver(ProcessingUnit, Process): | |||
261 |
|
299 | |||
262 | throttle_value = 5 |
|
300 | throttle_value = 5 | |
263 |
|
301 | |||
@@ -268,7 +306,7 class ReceiverData(ProcessingUnit, Process): | |||||
268 | self.mp = False |
|
306 | self.mp = False | |
269 | self.isConfig = False |
|
307 | self.isConfig = False | |
270 | self.isWebConfig = False |
|
308 | self.isWebConfig = False | |
271 | self.plottypes =[] |
|
309 | self.plottypes = [] | |
272 | self.connections = 0 |
|
310 | self.connections = 0 | |
273 | server = kwargs.get('server', 'zmq.pipe') |
|
311 | server = kwargs.get('server', 'zmq.pipe') | |
274 | plot_server = kwargs.get('plot_server', 'zmq.web') |
|
312 | plot_server = kwargs.get('plot_server', 'zmq.web') | |
@@ -373,8 +411,10 class ReceiverData(ProcessingUnit, Process): | |||||
373 | self.data[plottype][t] = self.dataOut.getCoherence() |
|
411 | self.data[plottype][t] = self.dataOut.getCoherence() | |
374 | if plottype == 'phase': |
|
412 | if plottype == 'phase': | |
375 | self.data[plottype][t] = self.dataOut.getCoherence(phase=True) |
|
413 | self.data[plottype][t] = self.dataOut.getCoherence(phase=True) | |
376 |
if plottype == ' |
|
414 | if plottype == 'output': | |
377 | self.data[plottype][t] = self.dataOut.data_output |
|
415 | self.data[plottype][t] = self.dataOut.data_output | |
|
416 | if plottype == 'param': | |||
|
417 | self.data[plottype][t] = self.dataOut.data_param | |||
378 | if self.realtime: |
|
418 | if self.realtime: | |
379 | self.data_web['timestamp'] = t |
|
419 | self.data_web['timestamp'] = t | |
380 | if plottype == 'spc': |
|
420 | if plottype == 'spc': | |
@@ -402,8 +442,14 class ReceiverData(ProcessingUnit, Process): | |||||
402 | self.sender_web = self.context.socket(zmq.PUB) |
|
442 | self.sender_web = self.context.socket(zmq.PUB) | |
403 | self.sender_web.connect(self.plot_address) |
|
443 | self.sender_web.connect(self.plot_address) | |
404 | time.sleep(1) |
|
444 | time.sleep(1) | |
405 | self.sender.bind("ipc:///tmp/zmq.plots") |
|
445 | ||
|
446 | if 'server' in self.kwargs: | |||
|
447 | self.sender.bind("ipc:///tmp/{}.plots".format(self.kwargs['server'])) | |||
|
448 | else: | |||
|
449 | self.sender.bind("ipc:///tmp/zmq.plots") | |||
|
450 | ||||
406 | time.sleep(3) |
|
451 | time.sleep(3) | |
|
452 | ||||
407 | t = Thread(target=self.event_monitor, args=(monitor,)) |
|
453 | t = Thread(target=self.event_monitor, args=(monitor,)) | |
408 | t.start() |
|
454 | t.start() | |
409 |
|
455 | |||
@@ -417,7 +463,6 class ReceiverData(ProcessingUnit, Process): | |||||
417 | if self.dataOut.firstdata is True: |
|
463 | if self.dataOut.firstdata is True: | |
418 | self.data['STARTED'] = True |
|
464 | self.data['STARTED'] = True | |
419 |
|
465 | |||
420 |
|
||||
421 | if self.dataOut.finished is True: |
|
466 | if self.dataOut.finished is True: | |
422 | self.send(self.data) |
|
467 | self.send(self.data) | |
423 | self.connections -= 1 |
|
468 | self.connections -= 1 |
@@ -14,14 +14,16 if __name__ == '__main__': | |||||
14 | controllerObj = Project() |
|
14 | controllerObj = Project() | |
15 | controllerObj.setup(id='191', name='test01', description=desc) |
|
15 | controllerObj.setup(id='191', name='test01', description=desc) | |
16 |
|
16 | |||
17 |
proc1 = controllerObj.addProcUnit(name='Receiver |
|
17 | proc1 = controllerObj.addProcUnit(name='PlotterReceiver') | |
18 | # proc1.addParameter(name='realtime', value='0', format='bool') |
|
18 | # proc1.addParameter(name='realtime', value='0', format='bool') | |
19 | #proc1.addParameter(name='plottypes', value='rti,coh,phase,snr,dop', format='str') |
|
19 | #proc1.addParameter(name='plottypes', value='rti,coh,phase,snr,dop', format='str') | |
20 | #proc1.addParameter(name='plottypes', value='rti,coh,phase,snr', format='str') |
|
20 | #proc1.addParameter(name='plottypes', value='rti,coh,phase,snr', format='str') | |
21 | proc1.addParameter(name='plottypes', value='dop', format='str') |
|
21 | proc1.addParameter(name='plottypes', value='dop', format='str') | |
22 |
|
22 | |||
23 | proc1.addParameter(name='throttle', value='10', format='int') |
|
23 | #proc1.addParameter(name='throttle', value='10', format='int') | |
24 | #proc1.addParameter(name='server', value='tcp://10.10.10.82:7000', format='str') |
|
24 | ||
|
25 | proc1.addParameter(name='interactive', value='0', format='bool') # ? PREGUNTAR | |||
|
26 | # proc1.addParameter(name='server', value='tcp://10.10.10.82:7000', format='str') | |||
25 | ## TODO Agregar direccion de server de publicacion a graficos como variable |
|
27 | ## TODO Agregar direccion de server de publicacion a graficos como variable | |
26 |
|
28 | |||
27 | """ |
|
29 | """ |
@@ -1,1 +1,1 | |||||
1 |
<Project description="HF_EXAMPLE" id="191" name="test01"><ReadUnit datatype="SpectraReader" id="1911" inputId="0" name="SpectraReader"><Operation id="19111" name="run" priority="1" type="self"><Parameter format="str" id="191111" name="datatype" value="SpectraReader" /><Parameter format="str" id="191112" name="path" value="/media/ci-81/Huancayo/DATA/hfradar_2016/pdata/sp1_f1" /><Parameter format="date" id="191113" name="startDate" value="2016/04/2 |
|
1 | <Project description="HF_EXAMPLE" id="191" name="test01"><ReadUnit datatype="SpectraReader" id="1911" inputId="0" name="SpectraReader"><Operation id="19111" name="run" priority="1" type="self"><Parameter format="str" id="191111" name="datatype" value="SpectraReader" /><Parameter format="str" id="191112" name="path" value="/media/ci-81/Huancayo/DATA/hfradar_2016/pdata/sp1_f1" /><Parameter format="date" id="191113" name="startDate" value="2016/04/27" /><Parameter format="date" id="191114" name="endDate" value="2016/04/27" /><Parameter format="time" id="191115" name="startTime" value="00:00:00" /><Parameter format="time" id="191116" name="endTime" value="23:59:59" /><Parameter format="int" id="191118" name="cursor" value="0" /><Parameter format="int" id="191119" name="skip" value="0" /><Parameter format="int" id="191120" name="delay" value="10" /><Parameter format="int" id="191121" name="walk" value="1" /><Parameter format="int" id="191122" name="online" value="0" /></Operation></ReadUnit><ProcUnit datatype="ParametersProc" id="1913" inputId="1911" name="ParametersProc"><Operation id="19131" name="run" priority="1" type="self" /><Operation id="19132" name="SpectralMoments" priority="2" type="other" /><Operation id="19133" name="PublishData" priority="3" type="other"><Parameter format="int" id="191331" name="zeromq" value="1" /></Operation></ProcUnit><ProcUnit datatype="Spectra" id="1912" inputId="1911" name="SpectraProc"><Operation id="19121" name="run" priority="1" type="self" /><Operation id="19122" name="removeInterference" priority="2" type="self" /></ProcUnit></Project> No newline at end of file |
@@ -1,49 +1,57 | |||||
1 | ''' |
|
1 | """. | |
|
2 | ||||
2 | Created on Jul 16, 2014 |
|
3 | Created on Jul 16, 2014 | |
3 |
|
4 | |||
4 | @author: Miguel Urco |
|
5 | @author: Miguel Urco | |
5 | ''' |
|
6 | """ | |
6 |
|
7 | |||
7 | from schainpy import __version__ |
|
8 | from schainpy import __version__ | |
8 | from setuptools import setup, Extension |
|
9 | from setuptools import setup, Extension | |
9 |
|
10 | |||
10 | setup(name="schainpy", |
|
11 | setup(name="schainpy", | |
11 |
|
|
12 | version=__version__, | |
12 |
|
|
13 | description="Python tools to read, write and process Jicamarca data", | |
13 |
|
|
14 | author="Miguel Urco", | |
14 |
|
|
15 | author_email="miguel.urco@jro.igp.gob.pe", | |
15 |
|
|
16 | url="http://jro.igp.gob.pe", | |
16 |
|
|
17 | packages={'schainpy', | |
17 |
|
|
18 | 'schainpy.model', | |
18 |
|
|
19 | 'schainpy.model.data', | |
19 |
|
|
20 | 'schainpy.model.graphics', | |
20 |
|
|
21 | 'schainpy.model.io', | |
21 |
|
|
22 | 'schainpy.model.proc', | |
22 |
|
|
23 | 'schainpy.model.serializer', | |
23 |
|
|
24 | 'schainpy.model.utils', | |
24 |
|
|
25 | 'schainpy.gui', | |
25 |
|
|
26 | 'schainpy.gui.figures', | |
26 |
|
|
27 | 'schainpy.gui.viewcontroller', | |
27 |
|
|
28 | 'schainpy.gui.viewer', | |
28 |
|
|
29 | 'schainpy.gui.viewer.windows'}, | |
29 |
|
|
30 | ext_package='schainpy', | |
30 |
|
|
31 | py_modules=[''], | |
31 |
|
|
32 | package_data={'': ['schain.conf.template'], | |
32 |
|
|
33 | 'schainpy.gui.figures': ['*.png', '*.jpg'], | |
33 |
|
|
34 | }, | |
34 |
|
|
35 | include_package_data=False, | |
35 | scripts =['schainpy/gui/schainGUI', |
|
36 | entry_points={ | |
36 | 'schainpy/scripts/schain'], |
|
37 | 'console_scripts': [ | |
37 | ext_modules=[Extension("cSchain", ["schainpy/model/proc/extensions.c"])], |
|
38 | 'schain = schaincli.cli:main', | |
38 | install_requires=[ |
|
39 | ], | |
39 | "scipy >= 0.14.0", |
|
40 | }, | |
40 | "h5py >= 2.2.1", |
|
41 | scripts=['schainpy/gui/schainGUI'], | |
41 | "matplotlib >= 1.4.2", |
|
42 | ext_modules=[Extension("cSchain", ["schainpy/model/proc/extensions.c"])], | |
42 | "pyfits >= 3.4", |
|
43 | install_requires=[ | |
43 |
|
|
44 | "scipy >= 0.14.0", | |
44 |
|
|
45 | "h5py >= 2.2.1", | |
45 |
|
|
46 | "matplotlib >= 1.4.2", | |
46 |
|
|
47 | "pyfits >= 3.4", | |
47 |
|
|
48 | "numpy >= 1.11.2", | |
48 |
|
|
49 | "paramiko >= 2.1.2", | |
|
50 | "paho-mqtt >= 1.2", | |||
|
51 | "zmq", | |||
|
52 | "fuzzywuzzy", | |||
|
53 | "click", | |||
|
54 | "colorama", | |||
|
55 | "python-Levenshtein" | |||
|
56 | ], | |||
49 | ) |
|
57 | ) |
General Comments 0
You need to be logged in to leave comments.
Login now