From 81f892b894ebad0371027fb8ab9d9213e5eace87 2021-08-24 19:11:28 From: joabAM Date: 2021-08-24 19:11:28 Subject: [PATCH] merged branches --- diff --git a/.gitignore b/.gitignore index e0bc00e..c31424d 100644 --- a/.gitignore +++ b/.gitignore @@ -100,15 +100,3 @@ ENV/ # eclipse .project .pydevproject -# vscode - -.vscode - -schaingui/node_modules/ -schainpy/scripts/ -.svn/ -*.png -*.pyc -.vscode -trash -*.log diff --git a/schainpy/CHANGELOG.md b/CHANGELOG.md similarity index 69% rename from schainpy/CHANGELOG.md rename to CHANGELOG.md index c54d3f0..9f5379f 100644 --- a/schainpy/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,19 @@ -## CHANGELOG: +# CHANGELOG -### 3.0 -* Python 3.x compatible -* New architecture with multiprocessing and IPC communication -* Add @MPDecorator for multiprocessing Units and Operations +## 3.0.0 + +* Python 3.x & 2.X compatible +* New architecture with multiprocessing support +* Add @MPDecorator for multiprocessing Operations (Plots, Writers and Publishers) * Added new type of operation `external` for non-locking operations * New plotting architecture with buffering/throttle capabilities to speed up plots +* Clean controller to optimize scripts (format & optype are no longer required) +* Replace `ParamReader` and `ParamWriter` with new flexible `HDFReader` and `HDFWriter` +* New GUI with dynamic load of Units and operations (use Kivy framework) +* Clean code + +## 2.3 -### 2.3 * Added support for Madrigal formats (reading/writing). * Added support for reading BLTR parameters (*.sswma). * Added support for reading Julia format (*.dat). @@ -15,11 +21,11 @@ * Added two new Processing Units `PublishData` and `ReceiverData` for receiving and sending dataOut through multiple ways (tcp, ipc, inproc). * Added a new graphics Processing Unit `PlotterReceiver`. It is decoupled from normal processing sequence with support for data generated by multiprocessing scripts. * Added support for sending realtime graphic to web server. -* GUI command `schain` is now `schainGUI`. -* Added a CLI tool named `schain`. - * Scripts templates can be now generated with `schain generate`. - * Now it is possible to search Processing Units and Operations with `schain search [module]` to get the right name and its allowed parameters. - * `schain xml` to run xml scripts. +* GUI command `schain` is now `schainGUI`. +* Added a CLI tool named `schain`. + * Scripts templates can be now generated with `schain generate`. + * Now it is possible to search Processing Units and Operations with `schain search [module]` to get the right name and its allowed parameters. + * `schain xml` to run xml scripts. * Added suggestions when parameters are poorly written. * `Controller.start()` now runs in a different process than the process calling it. * Added `schainpy.utils.log` for log standarization. @@ -28,92 +34,108 @@ * Updated README for MAC OS GUI installation. * Setup now installs numpy. -### 2.2.6 +## 2.2.6 + * Graphics generated by the GUI are now the same as generated by scripts. Issue #1074. * Added support for C extensions. * Function `hildebrand_sehkon` optimized with a C wrapper. * Numpy version updated. * Migration to GIT. -### 2.2.5: +## 2.2.5 + * splitProfiles and combineProfiles modules were added to VoltageProc and Signal Chain GUI. * nProfiles of USRP data (hdf5) is the number of profiles thera are in one second. * jroPlotter works directly with data objects instead of dictionaries * script "schain" was added to Signal Chain installer -### 2.2.4.1: -* jroIO_usrp.py is update to read Sandra's data +## 2.2.4.1 + +* jroIO_usrp.py is update to read Sandra's data * decimation in Spectra and RTI plots is always enabled. * time* window option added to GUI -### 2.2.4: +## 2.2.4 + * jroproc_spectra_lags.py added to schainpy * Bug fixed in schainGUI: ProcUnit was created with the same id in some cases. * Bug fixed in jroHeaderIO: Header size validation. -### 2.2.3.1: +## 2.2.3.1 + * Filtering block by time has been added. * Bug fixed plotting RTI, CoherenceMap and others using xmin and xmax parameters. The first day worked properly but the next days did not. -### 2.2.3: +## 2.2.3 + * Bug fixed in GUI: Error getting(reading) Code value * Bug fixed in GUI: Flip option always needs channelList field * Bug fixed in jrodata: when one branch modified a value in "dataOut" (example: dataOut.code) this value was modified for every branch (because this was a reference). It was modified in data.copy() * Bug fixed in jroproc_voltage.profileSelector(): rangeList replaces to profileRangeList. -### 2.2.2: +## 2.2.2 + * VoltageProc: ProfileSelector, Reshape, Decoder with nTxs!=1 and getblock=True was tested * Rawdata and testRawdata.py added to Signal Chain project -### 2.2.1: +## 2.2.1 + * Bugs fixed in GUI * Views were improved in GUI * Support to MST* ISR experiments * Bug fixed getting noise using hyldebrant. (minimum number of points > 20%) * handleError added to jroplotter.py -### 2.2.0: +## 2.2.0 + * GUI: use of external plotter * Compatible with matplotlib 1.5.0 -### 2.1.5: +## 2.1.5 + * serializer module added to Signal Chain * jroplotter.py added to Signal Chain -### 2.1.4.2: +## 2.1.4.2 + * A new Plotter Class was added * Project.start() does not accept filename as a parameter anymore -### 2.1.4.1: +## 2.1.4.1 + * Send notifications when an error different to ValueError is detected -### 2.1.4: +## 2.1.4 + * Sending error notifications to signal chain administrator * Login to email server added -### 2.1.3.3: +## 2.1.3.3 + * Colored Button Icons were added to GUI -### 2.1.3.2: +## 2.1.3.2 + * GUI: user interaction enhanced * controller_api.py: Safe access to ControllerThead -### 2.1.3.1: +## 2.1.3.1 + * GUI: every icon were resized * jroproc_voltage.py: Print a message when "Read from code" option is selected and the code is not defined inside data file -### 2.1.3: +## 2.1.3 + * jroplot_heispectra.py: SpectraHeisScope was not showing the right channels -* jroproc_voltage.py: Bug fixed selecting profiles (self.nProfiles took a wrong value), - Bug fixed selecting heights by block (selecting profiles instead heights) +* jroproc_voltage.py: Bug fixed selecting profiles (self.nProfiles took a wrong value), Bug fixed selecting heights by block (selecting profiles instead heights) * jroproc_voltage.py: New feature added: decoding data by block using FFT. * jroIO_heispectra.py: Bug fixed in FitsReader. Using local Fits instance instead schainpy.mode.data.jrodata.Fits. * jroIO_heispectra.py: Channel index list does not exist. -### 2.1.2: -* jroutils_ftp.py: Bug fixed, Any error sending file stopped the Server Thread - Server thread opens and closes remote server each time file list is sent +## 2.1.2 + +* jroutils_ftp.py: Bug fixed, Any error sending file stopped the Server Thread Server thread opens and closes remote server each time file list is sent * jroplot_spectra.py: Noise path was not being created when noise data is saved. -* jroIO_base.py: startTime can be greater than endTime. Example: SpreadF [18:00 * 07:00] \ No newline at end of file +* jroIO_base.py: startTime can be greater than endTime. Example: SpreadF diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..79238d9 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,28 @@ +This software, unless otherwise noted, is licensed under the BSD 3-clause. + +Copyright (c) 2012-2020 Jicamarca Radio Observatory + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md index 2640d1f..d288ad6 100644 --- a/README.md +++ b/README.md @@ -1,155 +1,104 @@ # Signal Chain -## Introduction +Signal Chain is a radar data processing library wich includes modules to read, +and write different files formats, besides modules to process and visualize the +data. -Signal Chain (SCh) is a radar data processing library developed using [Python](www.python.org) at JRO. SCh provides modules to read, write, process and plot data. +## Dependencies -## Installation - -Install system dependencies, clone the latest version from [here](http://jro-dev.igp.gob.pe/rhodecode/schain/) and install it as a normal python package. +- GCC (gcc or gfortran) +- Python.h (python-dev or python-devel) +- Python-TK (python-tk) +- HDF5 libraries (libhdf5-dev) -### Linux based system -``` -$ sudo apt-get install python-pip python-dev gfortran libpng-dev freetype* libblas-dev liblapack-dev libatlas-base-dev python-qt4 python-tk libssl-dev libhdf5-dev -$ git clone http://jro-dev.igp.gob.pe/rhodecode/schain/ -$ cd schain -$ sudo pip install ./ - -``` +## Installation -### MAC Os -``` -$ brew install python -$ brew install cartr/qt4/pyqt -$ git clone http://jro-dev.igp.gob.pe/rhodecode/schain/ -$ cd schain -$ pip install ./ -``` +To get started the easiest way to install it is through +[PyPI](https://pypi.org/project/schainpy/) with pip. We strongly recommend to +use an virtual environment like virtualenv or anaconda. -**It is recommended to install schain in a virtual environment** -``` -$ virtualenv /path/to/virtual -$ source /path/to/virtual/bin/activate -(virtual) $ cd schain -(virtual) $ pip install ./ -(virtual) $ bash link_PyQt4.sh +```bash +pip install schainpy ``` -### Docker +### From source -Download Dockerfile from the repository, and create a docker image +First, ensure that you have the above-listed dependencies installed, then clone +the repository and install as normal python package: +```bash +git clone https://github.com/JRO-Peru/schainpy.git +cd schain +git checkout `branch-name` (optional) +sudo pip install ./ ``` -$ docker build -t schain . -``` - -You can run a container using an xml file or a schain script also you need to mount a volume for the data input and for the output files/plots -``` -$ docker run -it --rm --volume /path/to/host/data:/data schain xml /data/test.xml -$ docker run -it --rm --volume /path/to/host/data:/data --entrypoint /urs/local/bin/python schain /data/test.py -``` - -## First Script - -Read Spectra data (.pdata) - remove dc - plot spectra & RTI - -Import SCh and creating a project - -```python -#!/usr/bin/python -from schainpy.controller import Project - -controller = Project() -controller.setup(id = '100', - name='test', - description='Basic experiment') +### Using Docker +Download Dockerfile from the repository, and create a docker image: +```bash +docker build -t schain . ``` -Adding read unit and operations - -```python -read_unit = controller.addReadUnit(datatype='Spectra', - path='/path/to/pdata/', - startDate='2014/01/31', - endDate='2014/03/31', - startTime='00:00:00', - endTime='23:59:59', - online=0, - walk=0) - -proc_unit = controller.addProcUnit(datatype='Spectra', - inputId=read_unit.getId()) - -op = proc_unit.addOperation(name='selectChannels') -op.addParameter(name='channelList', value='0,1', format='intlist') - -op = proc_unit.addOperation(name='selectHeights') -op.addParameter(name='minHei', value='80', format='float') -op.addParameter(name='maxHei', value='200', format='float') - -op = proc_unit.addOperation(name='removeDC') +You can run a container using an xml file or a schain script also you need to +mount a volume for the data input and for the output files/plots: +```bash +docker run -it --rm --volume /path/to/host/data:/data schain xml /data/test.xml +docker run -it --rm --volume /path/to/host/data:/data --entrypoint /urs/local/bin/python schain /data/test.py ``` -Plotting data & start project +## CLI (command line interface) -```python -op = proc_unit.addOperation(name='SpectraPlot', optype='other') -op.addParameter(name='id', value='1', format='int') -op.addParameter(name='wintitle', value='Spectra', format='str') +Signal Chain provides the following commands: -op = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') -op.addParameter(name='id', value='2', format='int') -op.addParameter(name='wintitle', value='RTI', format='str') +- schainGUI: Open the GUI +- schain: Signal chain command line -controller.start() - -``` - -Full script +## Example +Here you can find an script to read Spectra data (.pdata), remove dc and plot +self-spectra & RTI: ```python #!/usr/bin/python from schainpy.controller import Project -controller = Project() -controller.setup(id = '100', - name='test', - description='Basic experiment') -read_unit = controller.addReadUnit(datatype='Spectra', - path='/path/to/pdata/', - startDate='2014/01/31', - endDate='2014/03/31', - startTime='00:00:00', - endTime='23:59:59', - online=0, - walk=0) - -proc_unit = controller.addProcUnit(datatype='Spectra', - inputId=read_unit.getId()) +prj = Project() + +read_unit = prj.addReadUnit( + datatype='Spectra', + path='/path/to/pdata/', + startDate='2014/01/31', + endDate='2014/03/31', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=0 + ) + +proc_unit = prj.addProcUnit( + datatype='Spectra', + inputId=read_unit.getId() + ) op = proc_unit.addOperation(name='selectChannels') -op.addParameter(name='channelList', value='0,1', format='intlist') +op.addParameter(name='channelList', value='0,1') op = proc_unit.addOperation(name='selectHeights') -op.addParameter(name='minHei', value='80', format='float') -op.addParameter(name='maxHei', value='200', format='float') +op.addParameter(name='minHei', value='80') +op.addParameter(name='maxHei', value='200') op = proc_unit.addOperation(name='removeDC') -op = proc_unit.addOperation(name='SpectraPlot', optype='other') -op.addParameter(name='id', value='6', format='int') +op = proc_unit.addOperation(name='SpectraPlot') op.addParameter(name='wintitle', value='Spectra', format='str') -op = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') -op.addParameter(name='id', value='2', format='int') +op = proc_unit.addOperation(name='RTIPlot') op.addParameter(name='wintitle', value='RTI', format='str') -controller.start() +prj.start() -``` \ No newline at end of file +``` diff --git a/link_PyQt4.sh b/link_PyQt4.sh deleted file mode 100755 index bc9f852..0000000 --- a/link_PyQt4.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# This hook is run after a new virtualenv is activated. - -python_version=python$(python -c "import sys; print (str(sys.version_info[0])+'.'+str(sys.version_info[1]))") -var=( $(which -a $python_version) ) - -get_python_lib_cmd="from distutils.sysconfig import get_python_lib; print (get_python_lib())" -lib_virtualenv_path=$(python -c "$get_python_lib_cmd") -lib_system_path=$(${var[-1]} -c "$get_python_lib_cmd") -sip_path=$(ls $lib_system_path/sip*.so) - -echo "Linking Qt4..." -ln -s $lib_system_path/PyQt4 $lib_virtualenv_path/PyQt4 -echo "Linking SIP..." -ln -s $sip_path $lib_virtualenv_path/sip.so diff --git a/schainc/_noise.c b/schainc/_noise.c new file mode 100644 index 0000000..32b4e30 --- /dev/null +++ b/schainc/_noise.c @@ -0,0 +1,82 @@ +#include +#include +#include + + +static PyObject *hildebrand_sekhon(PyObject *self, PyObject *args) { + double navg; + PyObject *data_obj, *data_array; + + if (!PyArg_ParseTuple(args, "Od", &data_obj, &navg)) { + return NULL; + } + + data_array = PyArray_FROM_OTF(data_obj, NPY_FLOAT64, NPY_IN_ARRAY); + + if (data_array == NULL) { + Py_XDECREF(data_array); + Py_XDECREF(data_obj); + return NULL; + } + double *sortdata = (double*)PyArray_DATA(data_array); + int lenOfData = (int)PyArray_SIZE(data_array) ; + double nums_min = lenOfData*0.2; + if (nums_min <= 5) nums_min = 5; + double sump = 0; + double sumq = 0; + long j = 0; + int cont = 1; + double rtest = 0; + while ((cont == 1) && (j < lenOfData)) { + sump = sump + sortdata[j]; + sumq = sumq + pow(sortdata[j], 2); + if (j > nums_min) { + rtest = (double)j/(j-1) + 1/navg; + if ((sumq*j) > (rtest*pow(sump, 2))) { + j = j - 1; + sump = sump - sortdata[j]; + sumq = sumq - pow(sortdata[j],2); + cont = 0; + } + } + j = j + 1; + } + + double lnoise = sump / j; + + Py_DECREF(data_array); + + // return PyLong_FromLong(lnoise); + return PyFloat_FromDouble(lnoise); +} + + +static PyMethodDef noiseMethods[] = { + { "hildebrand_sekhon", hildebrand_sekhon, METH_VARARGS, "Get noise with hildebrand_sekhon algorithm" }, + { NULL, NULL, 0, NULL } +}; + +#if PY_MAJOR_VERSION >= 3 + +static struct PyModuleDef noisemodule = { + PyModuleDef_HEAD_INIT, + "_noise", + "Get noise with hildebrand_sekhon algorithm", + -1, + noiseMethods +}; + +#endif + +#if PY_MAJOR_VERSION >= 3 + PyMODINIT_FUNC PyInit__noise(void) { + Py_Initialize(); + import_array(); + return PyModule_Create(&noisemodule); + } +#else + PyMODINIT_FUNC init_noise() { + Py_InitModule("_noise", noiseMethods); + import_array(); + } +#endif diff --git a/schainpy/ROADMAP.md b/schainpy/ROADMAP.md deleted file mode 100644 index 80b3de6..0000000 --- a/schainpy/ROADMAP.md +++ /dev/null @@ -1,10 +0,0 @@ -ROADMAP FOR SCHAIN BRANCHES -=============================== - -### BRANCH - SCHAIN_MP -* Revisar si funciona con varios publishers. -* Revisar xRange y reinicialización de gráfico. -* Grabar cada spectra independientemente. -* Agregar kwargs al init -* Agregar gráficos restantes -* Presentación diff --git a/schainpy/__init__.py b/schainpy/__init__.py index d51d41f..6b50397 100644 --- a/schainpy/__init__.py +++ b/schainpy/__init__.py @@ -1,7 +1,8 @@ -''' -Created on Jul 3, 2018 +"""Signal chain python package""" -@author $Author$ -@version $Id$ -''' -__version__ = '3.0' +try: + from schainpy.controller import Project +except: + pass + +__version__ = '3.0.0b6' diff --git a/schainpy/cli/README.md b/schainpy/cli/README.md deleted file mode 100644 index 1cc9847..0000000 --- a/schainpy/cli/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# schain - -Command Line Interface for SIGNAL CHAIN - jro - -# Usage - -To use it: - - $ schain-cli --help diff --git a/schainpy/cli/cli.py b/schainpy/cli/cli.py index 8c04d8d..897b198 100644 --- a/schainpy/cli/cli.py +++ b/schainpy/cli/cli.py @@ -1,12 +1,9 @@ import click -import schainpy import subprocess import os import sys import glob -save_stdout = sys.stdout -sys.stdout = open('/dev/null', 'w') -from multiprocessing import cpu_count +import schainpy from schainpy.controller import Project from schainpy.model import Operation, ProcessingUnit from schainpy.utils import log @@ -19,7 +16,6 @@ try: from queue import Queue except: from Queue import Queue -sys.stdout = save_stdout def getProcs(): @@ -45,11 +41,19 @@ def getOperations(): def getArgs(op): module = locate('schainpy.model.{}'.format(op)) - - if hasattr(module, '__attrs__'): - args = module.__attrs__ + try: + obj = module(1, 2, 3, Queue()) + except: + obj = module() + + if hasattr(obj, '__attrs__'): + args = obj.__attrs__ else: - args = inspect.getargspec(module.run).args + if hasattr(obj, 'myrun'): + args = inspect.getfullargspec(obj.myrun).args + else: + args = inspect.getfullargspec(obj.run).args + try: args.remove('self') except Exception as e: @@ -63,7 +67,7 @@ def getArgs(op): def getDoc(obj): module = locate('schainpy.model.{}'.format(obj)) try: - obj = module(1,2,3,Queue(),5,6) + obj = module(1, 2, 3, Queue()) except: obj = module() return obj.__doc__ @@ -89,9 +93,9 @@ PREFIX = 'experiment' @click.argument('nextcommand', default=None, required=False, type=str) def main(command, nextcommand, version): """COMMAND LINE INTERFACE FOR SIGNAL CHAIN - JICAMARCA RADIO OBSERVATORY V3.0\n - Available commands.\n + Available commands:\n xml: runs a schain XML generated file\n - run: runs any python script starting 'experiment_'\n + run: runs any python script'\n generate: generates a template schain script\n list: return a list of available procs and operations\n search: return avilable operations, procs or arguments of the given @@ -148,14 +152,12 @@ def search(nextcommand): if nextcommand is None: log.error('There is no Operation/ProcessingUnit to search', '') else: - try: + try: args = getArgs(nextcommand) doc = getDoc(nextcommand) - if len(args) == 0: - log.success('\n{} has no arguments'.format(nextcommand), '') - else: - log.success('{}\n{}\n\narguments:\n {}'.format( - nextcommand, doc, ', '.join(args)), '') + log.success('{}\n{}\n\nparameters:\n {}'.format( + nextcommand, doc, ', '.join(args)), '' + ) except Exception as e: log.error('Module `{}` does not exists'.format(nextcommand), '') allModules = getAll() diff --git a/schainpy/controller.py b/schainpy/controller.py index ede0310..a592ac0 100644 --- a/schainpy/controller.py +++ b/schainpy/controller.py @@ -1,26 +1,29 @@ -''' -Updated on January , 2018, for multiprocessing purposes -Author: Sergio Cortez -Created on September , 2012 -''' -from platform import python_version +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""API to create signal chain projects + +The API is provide through class: Project +""" + +import re import sys import ast import datetime import traceback -import math import time -import zmq -from multiprocessing import Process, Queue, Event, Value, cpu_count +import multiprocessing +from multiprocessing import Process, Queue from threading import Thread -from xml.etree.ElementTree import ElementTree, Element, SubElement, tostring -from xml.dom import minidom - +from xml.etree.ElementTree import ElementTree, Element, SubElement from schainpy.admin import Alarm, SchainWarning from schainpy.model import * from schainpy.utils import log +if 'darwin' in sys.platform and sys.version_info[0] == 3 and sys.version_info[1] > 7: + multiprocessing.set_start_method('fork') DTYPES = { 'Voltage': '.r', @@ -287,282 +290,157 @@ class OperationConf(): self.id = '0' self.name = None self.priority = None - self.topic = None - - def __getNewId(self): - - return int(self.id) * 10 + len(self.parmConfObjList) + 1 + self.parameters = {} + self.object = None + self.operations = [] def getId(self): + return self.id + def getNewId(self): + + return int(self.id) * 10 + len(self.operations) + 1 + def updateId(self, new_id): self.id = str(new_id) n = 1 - for parmObj in self.parmConfObjList: - - idParm = str(int(new_id) * 10 + n) - parmObj.updateId(idParm) - + for conf in self.operations: + conf_id = str(int(new_id) * 10 + n) + conf.updateId(conf_id) n += 1 - def getElementName(self): - - return self.ELEMENTNAME - - def getParameterObjList(self): - - return self.parmConfObjList - - def getParameterObj(self, parameterName): + def getKwargs(self): - for parmConfObj in self.parmConfObjList: + params = {} - if parmConfObj.name != parameterName: - continue + for key, value in self.parameters.items(): + if value not in (None, '', ' '): + params[key] = value - return parmConfObj + return params - return None + def update(self, **kwargs): - def getParameterObjfromValue(self, parameterValue): + for key, value in kwargs.items(): + self.addParameter(name=key, value=value) - for parmConfObj in self.parmConfObjList: + def addParameter(self, name, value, format=None): + ''' + ''' - if parmConfObj.getValue() != parameterValue: - continue + if isinstance(value, str) and re.search(r'(\d+/\d+/\d+)', value): + self.parameters[name] = datetime.date(*[int(x) for x in value.split('/')]) + elif isinstance(value, str) and re.search(r'(\d+:\d+:\d+)', value): + self.parameters[name] = datetime.time(*[int(x) for x in value.split(':')]) + else: + try: + self.parameters[name] = ast.literal_eval(value) + except: + if isinstance(value, str) and ',' in value: + self.parameters[name] = value.split(',') + else: + self.parameters[name] = value + + def getParameters(self): + + params = {} + for key, value in self.parameters.items(): + s = type(value).__name__ + if s == 'date': + params[key] = value.strftime('%Y/%m/%d') + elif s == 'time': + params[key] = value.strftime('%H:%M:%S') + else: + params[key] = str(value) - return parmConfObj.getValue() + return params - return None + def makeXml(self, element): - def getParameterValue(self, parameterName): + xml = SubElement(element, self.ELEMENTNAME) + for label in self.xml_labels: + xml.set(label, str(getattr(self, label))) - parameterObj = self.getParameterObj(parameterName) + for key, value in self.getParameters().items(): + xml_param = SubElement(xml, 'Parameter') + xml_param.set('name', key) + xml_param.set('value', value) - # if not parameterObj: - # return None + for conf in self.operations: + conf.makeXml(xml) - value = parameterObj.getValue() + def __str__(self): - return value + if self.ELEMENTNAME == 'Operation': + s = ' {}[id={}]\n'.format(self.name, self.id) + else: + s = '{}[id={}, inputId={}]\n'.format(self.name, self.id, self.inputId) - def getKwargs(self): + for key, value in self.parameters.items(): + if self.ELEMENTNAME == 'Operation': + s += ' {}: {}\n'.format(key, value) + else: + s += ' {}: {}\n'.format(key, value) - kwargs = {} + for conf in self.operations: + s += str(conf) - for parmConfObj in self.parmConfObjList: - if self.name == 'run' and parmConfObj.name == 'datatype': - continue + return s - kwargs[parmConfObj.name] = parmConfObj.getValue() +class OperationConf(ConfBase): - return kwargs + ELEMENTNAME = 'Operation' + xml_labels = ['id', 'name'] - def setup(self, id, name, priority, type, project_id, err_queue, lock): + def setup(self, id, name, priority, project_id, err_queue): self.id = str(id) self.project_id = project_id self.name = name - self.type = type - self.priority = priority + self.type = 'other' self.err_queue = err_queue - self.lock = lock - self.parmConfObjList = [] - def removeParameters(self): + def readXml(self, element, project_id, err_queue): - for obj in self.parmConfObjList: - del obj - - self.parmConfObjList = [] - - def addParameter(self, name, value, format='str'): - - if value is None: - return None - id = self.__getNewId() - - parmConfObj = ParameterConf() - if not parmConfObj.setup(id, name, value, format): - return None - - self.parmConfObjList.append(parmConfObj) - - return parmConfObj - - def changeParameter(self, name, value, format='str'): - - parmConfObj = self.getParameterObj(name) - parmConfObj.update(name, value, format) - - return parmConfObj - - def makeXml(self, procUnitElement): - - opElement = SubElement(procUnitElement, self.ELEMENTNAME) - opElement.set('id', str(self.id)) - opElement.set('name', self.name) - opElement.set('type', self.type) - opElement.set('priority', str(self.priority)) - - for parmConfObj in self.parmConfObjList: - parmConfObj.makeXml(opElement) - - def readXml(self, opElement, project_id): - - self.id = opElement.get('id') - self.name = opElement.get('name') - self.type = opElement.get('type') - self.priority = opElement.get('priority') + self.id = element.get('id') + self.name = element.get('name') + self.type = 'other' self.project_id = str(project_id) + self.err_queue = err_queue - # Compatible with old signal chain version - # Use of 'run' method instead 'init' - if self.type == 'self' and self.name == 'init': - self.name = 'run' - - self.parmConfObjList = [] - - parmElementList = opElement.iter(ParameterConf().getElementName()) - - for parmElement in parmElementList: - parmConfObj = ParameterConf() - parmConfObj.readXml(parmElement) - - # Compatible with old signal chain version - # If an 'plot' OPERATION is found, changes name operation by the value of its type PARAMETER - if self.type != 'self' and self.name == 'Plot': - if parmConfObj.format == 'str' and parmConfObj.name == 'type': - self.name = parmConfObj.value - continue - - self.parmConfObjList.append(parmConfObj) - - def printattr(self): - - print('%s[%s]: name = %s, type = %s, priority = %s, project_id = %s' % (self.ELEMENTNAME, - self.id, - self.name, - self.type, - self.priority, - self.project_id)) - - for parmConfObj in self.parmConfObjList: - parmConfObj.printattr() + for elm in element.iter('Parameter'): + self.addParameter(elm.get('name'), elm.get('value')) def createObject(self): className = eval(self.name) - if self.type == 'other': - opObj = className() - elif self.type == 'external': + if 'Plot' in self.name or 'Writer' in self.name or 'Send' in self.name or 'print' in self.name: kwargs = self.getKwargs() - opObj = className(self.id, self.id, self.project_id, self.err_queue, self.lock, 'Operation', **kwargs) + opObj = className(self.id, self.id, self.project_id, self.err_queue, **kwargs) opObj.start() - self.opObj = opObj + self.type = 'external' + else: + opObj = className() + self.object = opObj return opObj -class ProcUnitConf(): +class ProcUnitConf(ConfBase): ELEMENTNAME = 'ProcUnit' + xml_labels = ['id', 'inputId', 'name'] - def __init__(self): - - self.id = None - self.datatype = None - self.name = None - self.inputId = None - self.opConfObjList = [] - self.procUnitObj = None - self.opObjDict = {} - - def __getPriority(self): - - return len(self.opConfObjList) + 1 - - def __getNewId(self): - - return int(self.id) * 10 + len(self.opConfObjList) + 1 - - def getElementName(self): - - return self.ELEMENTNAME - - def getId(self): - - return self.id - - def updateId(self, new_id): - ''' - new_id = int(parentId) * 10 + (int(self.id) % 10) - new_inputId = int(parentId) * 10 + (int(self.inputId) % 10) - - # If this proc unit has not inputs - #if self.inputId == '0': - #new_inputId = 0 - - n = 1 - for opConfObj in self.opConfObjList: - - idOp = str(int(new_id) * 10 + n) - opConfObj.updateId(idOp) - - n += 1 - - self.parentId = str(parentId) - self.id = str(new_id) - #self.inputId = str(new_inputId) - ''' - n = 1 - - def getInputId(self): - - return self.inputId - - def getOperationObjList(self): - - return self.opConfObjList - - def getOperationObj(self, name=None): - - for opConfObj in self.opConfObjList: - - if opConfObj.name != name: - continue - - return opConfObj - - return None - - def getOpObjfromParamValue(self, value=None): - - for opConfObj in self.opConfObjList: - if opConfObj.getParameterObjfromValue(parameterValue=value) != value: - continue - return opConfObj - return None - - def getProcUnitObj(self): - - return self.procUnitObj - - def setup(self, project_id, id, name, datatype, inputId, err_queue, lock): + def setup(self, project_id, id, name, datatype, inputId, err_queue): ''' - id sera el topico a publicar - inputId sera el topico a subscribirse ''' - # Compatible with old signal chain version if datatype == None and name == None: raise ValueError('datatype or name should be defined') - #Definir una condicion para inputId cuando sea 0 - if name == None: if 'Proc' in datatype: name = datatype @@ -578,100 +456,49 @@ class ProcUnitConf(): self.datatype = datatype self.inputId = inputId self.err_queue = err_queue - self.lock = lock - self.opConfObjList = [] - - self.addOperation(name='run', optype='self') - - def removeOperations(self): + self.operations = [] + self.parameters = {} - for obj in self.opConfObjList: - del obj + def removeOperation(self, id): - self.opConfObjList = [] - self.addOperation(name='run') + i = [1 if x.id==id else 0 for x in self.operations] + self.operations.pop(i.index(1)) - def addParameter(self, **kwargs): - ''' - Add parameters to 'run' operation - ''' - opObj = self.opConfObjList[0] + def getOperation(self, id): - opObj.addParameter(**kwargs) - - return opObj + for conf in self.operations: + if conf.id == id: + return conf def addOperation(self, name, optype='self'): ''' - Actualizacion - > proceso comunicacion - En el caso de optype='self', elminar. DEfinir comuncacion IPC -> Topic - definir el tipoc de socket o comunicacion ipc++ - ''' - id = self.__getNewId() - priority = self.__getPriority() # Sin mucho sentido, pero puede usarse - opConfObj = OperationConf() - opConfObj.setup(id, name=name, priority=priority, type=optype, project_id=self.project_id, err_queue=self.err_queue, lock=self.lock) - self.opConfObjList.append(opConfObj) - - return opConfObj - - def makeXml(self, projectElement): - - procUnitElement = SubElement(projectElement, self.ELEMENTNAME) - procUnitElement.set('id', str(self.id)) - procUnitElement.set('name', self.name) - procUnitElement.set('datatype', self.datatype) - procUnitElement.set('inputId', str(self.inputId)) + id = self.getNewId() + conf = OperationConf() + conf.setup(id, name=name, priority='0', project_id=self.project_id, err_queue=self.err_queue) + self.operations.append(conf) - for opConfObj in self.opConfObjList: - opConfObj.makeXml(procUnitElement) + return conf - def readXml(self, upElement, project_id): + def readXml(self, element, project_id, err_queue): - self.id = upElement.get('id') - self.name = upElement.get('name') - self.datatype = upElement.get('datatype') - self.inputId = upElement.get('inputId') + self.id = element.get('id') + self.name = element.get('name') + self.inputId = None if element.get('inputId') == 'None' else element.get('inputId') + self.datatype = element.get('datatype', self.name.replace(self.ELEMENTNAME.replace('Unit', ''), '')) self.project_id = str(project_id) + self.err_queue = err_queue + self.operations = [] + self.parameters = {} - if self.ELEMENTNAME == 'ReadUnit': - self.datatype = self.datatype.replace('Reader', '') - - if self.ELEMENTNAME == 'ProcUnit': - self.datatype = self.datatype.replace('Proc', '') - - if self.inputId == 'None': - self.inputId = '0' - - self.opConfObjList = [] - - opElementList = upElement.iter(OperationConf().getElementName()) - - for opElement in opElementList: - opConfObj = OperationConf() - opConfObj.readXml(opElement, project_id) - self.opConfObjList.append(opConfObj) - - def printattr(self): - - print('%s[%s]: name = %s, datatype = %s, inputId = %s, project_id = %s' % (self.ELEMENTNAME, - self.id, - self.name, - self.datatype, - self.inputId, - self.project_id)) - - for opConfObj in self.opConfObjList: - opConfObj.printattr() - - def getKwargs(self): - - opObj = self.opConfObjList[0] - kwargs = opObj.getKwargs() - - return kwargs + for elm in element: + if elm.tag == 'Parameter': + self.addParameter(elm.get('name'), elm.get('value')) + elif elm.tag == 'Operation': + conf = OperationConf() + conf.readXml(elm, project_id, err_queue) + self.operations.append(conf) def createObjects(self): ''' @@ -681,42 +508,27 @@ class ProcUnitConf(): className = eval(self.name) #print(self.name) kwargs = self.getKwargs() - #print(kwargs) - #print("mark_a") - procUnitObj = className(self.id, self.inputId, self.project_id, self.err_queue, self.lock, 'ProcUnit', **kwargs) - #print("mark_b") + procUnitObj = className() + procUnitObj.name = self.name log.success('creating process...', self.name) - for opConfObj in self.opConfObjList: + for conf in self.operations: - if opConfObj.type == 'self' and opConfObj.name == 'run': - continue - elif opConfObj.type == 'self': - opObj = getattr(procUnitObj, opConfObj.name) - else: - opObj = opConfObj.createObject() + opObj = conf.createObject() log.success('adding operation: {}, type:{}'.format( - opConfObj.name, - opConfObj.type), self.name) - - procUnitObj.addOperation(opConfObj, opObj) + conf.name, + conf.type), self.name) - procUnitObj.start() - self.procUnitObj = procUnitObj + procUnitObj.addOperation(conf, opObj) - def close(self): - - for opConfObj in self.opConfObjList: - if opConfObj.type == 'self': - continue + self.object = procUnitObj - opObj = self.procUnitObj.getOperationObj(opConfObj.id) - opObj.close() - - self.procUnitObj.close() + def run(self): + ''' + ''' - return + return self.object.call(**self.getKwargs()) class ReadUnitConf(ProcUnitConf): @@ -729,28 +541,12 @@ class ReadUnitConf(ProcUnitConf): self.datatype = None self.name = None self.inputId = None - self.opConfObjList = [] - self.lock = Event() - self.lock.set() - self.lock.n = Value('d', 0) - - def getElementName(self): - - return self.ELEMENTNAME + self.operations = [] + self.parameters = {} def setup(self, project_id, id, name, datatype, err_queue, path='', startDate='', endDate='', startTime='', endTime='', server=None, **kwargs): - - ''' - *****el id del proceso sera el Topico - - Adicion de {topic}, si no esta presente -> error - kwargs deben ser trasmitidos en la instanciacion - - ''' - - # Compatible with old signal chain version if datatype == None and name == None: raise ValueError('datatype or name should be defined') if name == None: @@ -770,133 +566,41 @@ class ReadUnitConf(ProcUnitConf): self.project_id = project_id self.name = name self.datatype = datatype - if path != '': - self.path = os.path.abspath(path) - print (self.path) - self.startDate = startDate - self.endDate = endDate - self.startTime = startTime - self.endTime = endTime - self.server = server self.err_queue = err_queue - self.addRunOperation(**kwargs) - def update(self, **kwargs): - - if 'datatype' in kwargs: - datatype = kwargs.pop('datatype') - if 'Reader' in datatype: - self.name = datatype - else: - self.name = '%sReader' % (datatype) - self.datatype = self.name.replace('Reader', '') - - attrs = ('path', 'startDate', 'endDate', - 'startTime', 'endTime') - - for attr in attrs: - if attr in kwargs: - setattr(self, attr, kwargs.pop(attr)) - - self.updateRunOperation(**kwargs) - - def removeOperations(self): + self.addParameter(name='path', value=path) + self.addParameter(name='startDate', value=startDate) + self.addParameter(name='endDate', value=endDate) + self.addParameter(name='startTime', value=startTime) + self.addParameter(name='endTime', value=endTime) - for obj in self.opConfObjList: - del obj - - self.opConfObjList = [] - - def addRunOperation(self, **kwargs): - - opObj = self.addOperation(name='run', optype='self') - - if self.server is None: - opObj.addParameter( - name='datatype', value=self.datatype, format='str') - opObj.addParameter(name='path', value=self.path, format='str') - opObj.addParameter( - name='startDate', value=self.startDate, format='date') - opObj.addParameter( - name='endDate', value=self.endDate, format='date') - opObj.addParameter( - name='startTime', value=self.startTime, format='time') - opObj.addParameter( - name='endTime', value=self.endTime, format='time') - - for key, value in list(kwargs.items()): - opObj.addParameter(name=key, value=value, - format=type(value).__name__) - else: - opObj.addParameter(name='server', value=self.server, format='str') - - return opObj - - def updateRunOperation(self, **kwargs): - - opObj = self.getOperationObj(name='run') - opObj.removeParameters() - - opObj.addParameter(name='datatype', value=self.datatype, format='str') - opObj.addParameter(name='path', value=self.path, format='str') - opObj.addParameter( - name='startDate', value=self.startDate, format='date') - opObj.addParameter(name='endDate', value=self.endDate, format='date') - opObj.addParameter( - name='startTime', value=self.startTime, format='time') - opObj.addParameter(name='endTime', value=self.endTime, format='time') - - for key, value in list(kwargs.items()): - opObj.addParameter(name=key, value=value, - format=type(value).__name__) - - return opObj - - def readXml(self, upElement, project_id): - - self.id = upElement.get('id') - self.name = upElement.get('name') - self.datatype = upElement.get('datatype') - self.project_id = str(project_id) #yong - - if self.ELEMENTNAME == 'ReadUnit': - self.datatype = self.datatype.replace('Reader', '') - - self.opConfObjList = [] - - opElementList = upElement.iter(OperationConf().getElementName()) - - for opElement in opElementList: - opConfObj = OperationConf() - opConfObj.readXml(opElement, project_id) - self.opConfObjList.append(opConfObj) - - if opConfObj.name == 'run': - self.path = opConfObj.getParameterValue('path') - self.startDate = opConfObj.getParameterValue('startDate') - self.endDate = opConfObj.getParameterValue('endDate') - self.startTime = opConfObj.getParameterValue('startTime') - self.endTime = opConfObj.getParameterValue('endTime') + for key, value in kwargs.items(): + self.addParameter(name=key, value=value) class Project(Process): + """API to create signal chain projects""" ELEMENTNAME = 'Project' - def __init__(self): + def __init__(self, name=''): Process.__init__(self) - self.id = None + self.id = '1' + if name: + self.name = '{} ({})'.format(Process.__name__, name) self.filename = None self.description = None self.email = None - self.alarm = None - self.procUnitConfObjDict = {} - self.err_queue = Queue() + self.alarm = [] + self.configurations = {} + # self.err_queue = Queue() + self.err_queue = None + self.started = False - def __getNewId(self): + def getNewId(self): - idList = list(self.procUnitConfObjDict.keys()) + idList = list(self.configurations.keys()) id = int(self.id) * 10 while True: @@ -909,43 +613,28 @@ class Project(Process): return str(id) - def getElementName(self): - - return self.ELEMENTNAME - - def getId(self): - - return self.id - def updateId(self, new_id): self.id = str(new_id) - keyList = list(self.procUnitConfObjDict.keys()) + keyList = list(self.configurations.keys()) keyList.sort() n = 1 - newProcUnitConfObjDict = {} + new_confs = {} for procKey in keyList: - procUnitConfObj = self.procUnitConfObjDict[procKey] + conf = self.configurations[procKey] idProcUnit = str(int(self.id) * 10 + n) - procUnitConfObj.updateId(idProcUnit) - newProcUnitConfObjDict[idProcUnit] = procUnitConfObj + conf.updateId(idProcUnit) + new_confs[idProcUnit] = conf n += 1 - self.procUnitConfObjDict = newProcUnitConfObjDict + self.configurations = new_confs def setup(self, id=1, name='', description='', email=None, alarm=[]): - print(' ') - print('*' * 60) - print('* Starting SIGNAL CHAIN PROCESSING (Multiprocessing) v%s *' % schainpy.__version__) - print('*' * 60) - print("* Python " + python_version() + " *") - print('*' * 19) - print(' ') self.id = str(id) self.description = description self.email = email @@ -955,108 +644,91 @@ class Project(Process): def update(self, **kwargs): - for key, value in list(kwargs.items()): + for key, value in kwargs.items(): setattr(self, key, value) def clone(self): p = Project() - p.procUnitConfObjDict = self.procUnitConfObjDict + p.id = self.id + p.name = self.name + p.description = self.description + p.configurations = self.configurations.copy() + return p def addReadUnit(self, id=None, datatype=None, name=None, **kwargs): ''' - Actualizacion: - Se agrego un nuevo argumento: topic -relativo a la forma de comunicar los procesos simultaneos - - * El id del proceso sera el topico al que se deben subscribir los procUnits para recibir la informacion(data) - ''' if id is None: - idReadUnit = self.__getNewId() + idReadUnit = self.getNewId() else: idReadUnit = str(id) - readUnitConfObj = ReadUnitConf() - readUnitConfObj.setup(self.id, idReadUnit, name, datatype, self.err_queue, **kwargs) - self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj + conf = ReadUnitConf() + conf.setup(self.id, idReadUnit, name, datatype, self.err_queue, **kwargs) + self.configurations[conf.id] = conf - return readUnitConfObj + return conf - def addProcUnit(self, inputId='0', datatype=None, name=None): + def addProcUnit(self, id=None, inputId='0', datatype=None, name=None): ''' - Actualizacion: - Se agrego dos nuevos argumentos: topic_read (lee data de otro procUnit) y topic_write(escribe o envia data a otro procUnit) - Deberia reemplazar a "inputId" - - ** A fin de mantener el inputID, este sera la representaacion del topicoal que deben subscribirse. El ID propio de la intancia - (proceso) sera el topico de la publicacion, todo sera asignado de manera dinamica. - ''' - idProcUnit = self.__getNewId() - procUnitConfObj = ProcUnitConf() - input_proc = self.procUnitConfObjDict[inputId] - procUnitConfObj.setup(self.id, idProcUnit, name, datatype, inputId, self.err_queue, input_proc.lock) - self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj - - return procUnitConfObj - - def removeProcUnit(self, id): + if id is None: + idProcUnit = self.getNewId() + else: + idProcUnit = id - if id in list(self.procUnitConfObjDict.keys()): - self.procUnitConfObjDict.pop(id) + conf = ProcUnitConf() + conf.setup(self.id, idProcUnit, name, datatype, inputId, self.err_queue) + self.configurations[conf.id] = conf - def getReadUnitId(self): + return conf - readUnitConfObj = self.getReadUnitObj() + def removeProcUnit(self, id): - return readUnitConfObj.id + if id in self.configurations: + self.configurations.pop(id) - def getReadUnitObj(self): + def getReadUnit(self): - for obj in list(self.procUnitConfObjDict.values()): - if obj.getElementName() == 'ReadUnit': + for obj in list(self.configurations.values()): + if obj.ELEMENTNAME == 'ReadUnit': return obj return None - def getProcUnitObj(self, id=None, name=None): - - if id != None: - return self.procUnitConfObjDict[id] + def getProcUnit(self, id): - if name != None: - return self.getProcUnitObjByName(name) - - return None + return self.configurations[id] - def getProcUnitObjByName(self, name): + def getUnits(self): - for obj in list(self.procUnitConfObjDict.values()): - if obj.name == name: - return obj + keys = list(self.configurations) + keys.sort() - return None + for key in keys: + yield self.configurations[key] - def procUnitItems(self): + def updateUnit(self, id, **kwargs): - return list(self.procUnitConfObjDict.items()) + conf = self.configurations[id].update(**kwargs) def makeXml(self): - projectElement = Element('Project') - projectElement.set('id', str(self.id)) - projectElement.set('name', self.name) - projectElement.set('description', self.description) + xml = Element('Project') + xml.set('id', str(self.id)) + xml.set('name', self.name) + xml.set('description', self.description) - for procUnitConfObj in list(self.procUnitConfObjDict.values()): - procUnitConfObj.makeXml(projectElement) + for conf in self.configurations.values(): + conf.makeXml(xml) - self.projectElement = projectElement + self.xml = xml def writeXml(self, filename=None): @@ -1082,54 +754,38 @@ class Project(Process): self.makeXml() - ElementTree(self.projectElement).write(abs_file, method='xml') + ElementTree(self.xml).write(abs_file, method='xml') self.filename = abs_file return 1 - def readXml(self, filename=None): - - if not filename: - print('filename is not defined') - return 0 + def readXml(self, filename): abs_file = os.path.abspath(filename) - if not os.path.isfile(abs_file): - print('%s file does not exist' % abs_file) - return 0 - - self.projectElement = None - self.procUnitConfObjDict = {} + self.configurations = {} try: - self.projectElement = ElementTree().parse(abs_file) + self.xml = ElementTree().parse(abs_file) except: - print('Error reading %s, verify file format' % filename) + log.error('Error reading %s, verify file format' % filename) return 0 - self.project = self.projectElement.tag - - self.id = self.projectElement.get('id') - self.name = self.projectElement.get('name') - self.description = self.projectElement.get('description') - - readUnitElementList = self.projectElement.iter( - ReadUnitConf().getElementName()) - - for readUnitElement in readUnitElementList: - readUnitConfObj = ReadUnitConf() - readUnitConfObj.readXml(readUnitElement, self.id) - self.procUnitConfObjDict[readUnitConfObj.getId()] = readUnitConfObj - - procUnitElementList = self.projectElement.iter( - ProcUnitConf().getElementName()) - - for procUnitElement in procUnitElementList: - procUnitConfObj = ProcUnitConf() - procUnitConfObj.readXml(procUnitElement, self.id) - self.procUnitConfObjDict[procUnitConfObj.getId()] = procUnitConfObj + self.id = self.xml.get('id') + self.name = self.xml.get('name') + self.description = self.xml.get('description') + + for element in self.xml: + if element.tag == 'ReadUnit': + conf = ReadUnitConf() + conf.readXml(element, self.id, self.err_queue) + self.configurations[conf.id] = conf + elif element.tag == 'ProcUnit': + conf = ProcUnitConf() + input_proc = self.configurations[element.get('inputId')] + conf.readXml(element, self.id, self.err_queue) + self.configurations[conf.id] = conf self.filename = abs_file @@ -1137,28 +793,33 @@ class Project(Process): def __str__(self): - print('Project: name = %s, description = %s, id = %s' % ( - self.name, - self.description, - self.id)) + text = '\nProject[id=%s, name=%s, description=%s]\n\n' % ( + self.id, + self.name, + self.description, + ) + + for conf in self.configurations.values(): + text += '{}'.format(conf) - for procUnitConfObj in self.procUnitConfObjDict.values(): - print(procUnitConfObj) + return text def createObjects(self): - - keys = list(self.procUnitConfObjDict.keys()) + keys = list(self.configurations.keys()) keys.sort() for key in keys: - self.procUnitConfObjDict[key].createObjects() + conf = self.configurations[key] + conf.createObjects() + if conf.inputId is not None: + conf.object.setInput(self.configurations[conf.inputId].object) def monitor(self): - t = Thread(target=self.__monitor, args=(self.err_queue, self.ctx)) + t = Thread(target=self._monitor, args=(self.err_queue, self.ctx)) t.start() - def __monitor(self, queue, ctx): + def _monitor(self, queue, ctx): import socket @@ -1189,13 +850,7 @@ class Project(Process): else: name, err = self.name, err_msg - time.sleep(2) - - for conf in self.procUnitConfObjDict.values(): - for confop in conf.opConfObjList: - if confop.type == 'external': - confop.opObj.terminate() - conf.procUnitObj.terminate() + time.sleep(1) ctx.term() @@ -1211,15 +866,14 @@ class Project(Process): subtitle += 'Configuration file: %s\n' % self.filename subtitle += 'Time: %s\n' % str(datetime.datetime.now()) - readUnitConfObj = self.getReadUnitObj() + readUnitConfObj = self.getReadUnit() if readUnitConfObj: subtitle += '\nInput parameters:\n' - subtitle += '[Data path = %s]\n' % readUnitConfObj.path - subtitle += '[Data type = %s]\n' % readUnitConfObj.datatype - subtitle += '[Start date = %s]\n' % readUnitConfObj.startDate - subtitle += '[End date = %s]\n' % readUnitConfObj.endDate - subtitle += '[Start time = %s]\n' % readUnitConfObj.startTime - subtitle += '[End time = %s]\n' % readUnitConfObj.endTime + subtitle += '[Data path = %s]\n' % readUnitConfObj.parameters['path'] + subtitle += '[Start date = %s]\n' % readUnitConfObj.parameters['startDate'] + subtitle += '[End date = %s]\n' % readUnitConfObj.parameters['endDate'] + subtitle += '[Start time = %s]\n' % readUnitConfObj.parameters['startTime'] + subtitle += '[End time = %s]\n' % readUnitConfObj.parameters['endTime'] a = Alarm( modes=self.alarm, @@ -1232,64 +886,33 @@ class Project(Process): a.start() - def isPaused(self): - return 0 - - def isStopped(self): - return 0 - - def runController(self): - ''' - returns 0 when this process has been stopped, 1 otherwise - ''' - - if self.isPaused(): - print('Process suspended') - - while True: - time.sleep(0.1) - - if not self.isPaused(): - break - - if self.isStopped(): - break - - print('Process reinitialized') - - if self.isStopped(): - print('Process stopped') - return 0 - - return 1 - def setFilename(self, filename): self.filename = filename - def setProxy(self): + def runProcs(self): - if not os.path.exists('/tmp/schain'): - os.mkdir('/tmp/schain') + err = False + n = len(self.configurations) - self.ctx = zmq.Context() - xpub = self.ctx.socket(zmq.XPUB) - xpub.bind('ipc:///tmp/schain/{}_pub'.format(self.id)) - xsub = self.ctx.socket(zmq.XSUB) - xsub.bind('ipc:///tmp/schain/{}_sub'.format(self.id)) - self.monitor() - try: - zmq.proxy(xpub, xsub) - except zmq.ContextTerminated: - xpub.close() - xsub.close() + while not err: + for conf in self.getUnits(): + ok = conf.run() + if ok == 'Error': + n -= 1 + continue + elif not ok: + break + if n == 0: + err = True def run(self): - log.success('Starting {}: {}'.format(self.name, self.id), tag='') + log.success('\nStarting Project {} [id={}]'.format(self.name, self.id), tag='') + self.started = True self.start_time = time.time() self.createObjects() - self.setProxy() - log.success('{} Done (Time: {}s)'.format( + self.runProcs() + log.success('{} Done (Time: {:4.2f}s)'.format( self.name, time.time()-self.start_time), '') diff --git a/schainpy/controller_api.py b/schainpy/controller_api.py deleted file mode 100644 index 1d07f11..0000000 --- a/schainpy/controller_api.py +++ /dev/null @@ -1,179 +0,0 @@ -import threading -from queue import Queue - -from schainpy.controller import Project -from schainpy.model.graphics.jroplotter import PlotManager - -class ControllerThread(threading.Thread, Project): - - def __init__(self, plotter_queue=None): - - threading.Thread.__init__(self) - Project.__init__(self, plotter_queue) - - self.setDaemon(True) - - self.lock = threading.Lock() - self.control = { 'stop':False, 'pause':False } - - def __del__(self): - - self.control['stop'] = True - - def stop(self): - - self.lock.acquire() - - self.control['stop'] = True - - self.lock.release() - - def pause(self): - - self.lock.acquire() - - self.control['pause'] = not(self.control['pause']) - paused = self.control['pause'] - - self.lock.release() - - return paused - - def isPaused(self): - - self.lock.acquire() - paused = self.control['pause'] - self.lock.release() - - return paused - - def isStopped(self): - - self.lock.acquire() - stopped = self.control['stop'] - self.lock.release() - - return stopped - - def run(self): - self.control['stop'] = False - self.control['pause'] = False - - self.writeXml() - - self.createObjects() - self.connectObjects() - Project.run(self) - - def isRunning(self): - - return self.is_alive() - - def isFinished(self): - - return not self.is_alive() - - def setPlotters(self): - - plotterList = PlotManager.plotterList - - for thisPUConfObj in list(self.procUnitConfObjDict.values()): - - inputId = thisPUConfObj.getInputId() - - if int(inputId) == 0: - continue - - for thisOpObj in thisPUConfObj.getOperationObjList(): - - if thisOpObj.type == "self": - continue - - if thisOpObj.name in plotterList: - thisOpObj.type = "other" - - def setPlotterQueue(self, plotter_queue): - - self.plotterQueue = plotter_queue - - def getPlotterQueue(self): - - return self.plotterQueue - - def useExternalPlotter(self): - - self.plotterQueue = Queue(10) - self.setPlotters() - - plotManagerObj = PlotManager(self.plotterQueue) - plotManagerObj.setController(self) - - return plotManagerObj - -# from PyQt4 import QtCore -# from PyQt4.QtCore import SIGNAL -# -# class ControllerQThread(QtCore.QThread, Project): -# -# def __init__(self, filename): -# -# QtCore.QThread.__init__(self) -# Project.__init__(self) -# -# self.filename = filename -# -# self.lock = threading.Lock() -# self.control = {'stop':False, 'pause':False} -# -# def __del__(self): -# -# self.control['stop'] = True -# self.wait() -# -# def stop(self): -# -# self.lock.acquire() -# -# self.control['stop'] = True -# -# self.lock.release() -# -# def pause(self): -# -# self.lock.acquire() -# -# self.control['pause'] = not(self.control['pause']) -# paused = self.control['pause'] -# -# self.lock.release() -# -# return paused -# -# def isPaused(self): -# -# self.lock.acquire() -# paused = self.control['pause'] -# self.lock.release() -# -# return paused -# -# def isStopped(self): -# -# self.lock.acquire() -# stopped = self.control['stop'] -# self.lock.release() -# -# return stopped -# -# def run(self): -# -# self.control['stop'] = False -# self.control['pause'] = False -# -# self.readXml(self.filename) -# self.createObjects() -# self.connectObjects() -# self.emit( SIGNAL( "jobStarted( PyQt_PyObject )" ), 1) -# Project.run(self) -# self.emit( SIGNAL( "jobFinished( PyQt_PyObject )" ), 1) -# \ No newline at end of file diff --git a/schainpy/gui/__init__.py b/schainpy/gui/__init__.py index 6eac6ef..e69de29 100644 --- a/schainpy/gui/__init__.py +++ b/schainpy/gui/__init__.py @@ -1 +0,0 @@ -from viewcontroller import * \ No newline at end of file diff --git a/schainpy/gui/figures/.bash_logout b/schainpy/gui/figures/.bash_logout deleted file mode 100644 index de4f5f7..0000000 --- a/schainpy/gui/figures/.bash_logout +++ /dev/null @@ -1,7 +0,0 @@ -# ~/.bash_logout: executed by bash(1) when login shell exits. - -# when leaving the console clear the screen to increase privacy - -if [ "$SHLVL" = 1 ]; then - [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q -fi diff --git a/schainpy/gui/figures/branch.png b/schainpy/gui/figures/branch.png deleted file mode 100644 index f7a68f1ef9a7616c9068b0611842780e91f01c5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@8?tx|+>e7D!cXTANSS^LR>~GoGN9-mSG3ymbG_RZ&VGOR>NNhS`_5Gh13s;|ab`|@+ClXdFY3H= zYtMCBrMo?@DayMyxwu(-hhMf{tj5-_oQu8xow;fK;_`xk2WQtDc3k(dsqs3;mam=m zzU52KD$ecXn0F{T+&?-#;mR+YjOAO+Ura83EBrxI$HMuy;ImV=ez_=}eCS*hXZGJa z;NzV`f1(bs7@Vv0EBz>-GJk#KpT)O6F#g{8Sg|S2(&nXF0r$K%!P@5Bsp4Xp%M^<{ zPnE{`-pSonlzR4V*_^ zF{#3Qnm_+u=`-`ym#vDszQX2<aX40H^Q=#@$p^i*dfa~WtANJ?^<_AE83e~43w)qUHx3v IIVCg!0EM8%#sB~S diff --git a/schainpy/gui/figures/close.png b/schainpy/gui/figures/close.png deleted file mode 100644 index 49a888419aec1337de0d806ebdd8938ba2bdec70..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@jZo;Ptn zCXmHIkf|&R4IyB#0V{?TVB}i{jYrlKFhZGJi~tAw6M>QMSHeh`-k%WOQ5?*h=%Q!K z;?VSVAj}ac7#^&rr-$WGgD@mJ`=4~Vhl3sA@z@w7lF#QO_}dXIPB0Q}Wo3m#nIX;0 zOyvkuu8_$i3rv|@gC9wL<*}o2137dykIrK1t@vaL>lhCQgZ;$(u%Gv2u>Vtt$^EHH zt`8|7vyo^73i)>=9z7`N?^!D+KWO;>^04wE7+VgF%wuufS*%d}o)x?vfk6(Yk!WP9 z5R3dP;(y31DKQ5)bedf2iXuE3i~PUXFZIa3$p6t>~f!SYJK9tsaOLbT%m03eZI zx5wQZ^hhL2>h)OD+&MM4;U4?^C+|R>D?uEVO-Gr*GB$yqh<2}ze-UBir0!)@ApO_OAn~svf<_J9f;&DX&|-yuAD!HCH2F(F&f+?K+Z4Q|b-*{7x!$rCFiQ z1U$*=Xnlz(^HG_(WWg|g|FYI!GI-0Q5F-p#ozJt$MIF!~m=iYnrjNe+{B@OusyJHk zX) zbAmHr4Thq}lEkMv+2_ANkDu_^xD@eZW3_$Vs;e++8ZhpAX0}P-ntRf9U{I2NrkJv^ z!F#+xZJ*J>2RzmAH<=>KY)nDU#{;`j>#VLpPu}FoM$4aQG1~C+(zJ0FA84k z3tBW8uPU}XLs#q$9h^m%)22vlFW*L~*_2Jq*g$Du3?)WZ%6Z+oSU-^P(%G@rJ;iti zs=akQv14HLU_B?>ihI))A+ipt?MuH;L)z}pT@{_Pz~#->B&|pKZJ#NlJ)X?U$zh_1 z>MhrbO4>(9M+5Rm3*coS>RBMva|nYrc5`!^MINqXw+xWgu_4;2lmJVk!t^MGIc((o zjo_+^iZ8^`qmJz6mX;P)aeKxa91eGuQm$0XBFu9~H7POLMH*E4uAt%V#?sfTiNwmw z%F~ecKqye;&tk{&%lVPHrUT2Nw+HqEo$D`(sn!g=qLIuG+@WGuW)tC?EP=UH>Q?_YYlA+2b$mcMzYPq zFzym1O1|2wx$q{n3-+$kg%S-daq_`))bW$T=~*{V`j$;QHgt$Ge1eP`T7?Nt|8kS0 z{9eETZKZT1p|OlxaFx;JDCRJ_J<*3tom;4A&mEJ3F+bRp)0`?9eWoDWZ0ZD>g}0zVi5d zYj}b;D7`?P2ui*muK>|D4mBLR6jf-YU$-mcv%=^LcCo_;Gsu_Z6Nt;HY0CAtCzR%x zXjtEy(~Pnvvx2zl&1pN^>eQM1h<&D151D!VcQ__uweQ|Z*IDDq5!}a9qldFF?;ol( zsH!fVm3Qpsz@5p8iVw-9vo)bEx|O9k%NnZ7#plko0hNyz6=MFGmh90^o-Ces$AnlE zaA|KV{bYAcNLiYdr}4vk`wTM0tF&gLUM=klJoWU|qoe~c0iq+x{4QviIPNN*czw}#~S&b>{I$+&2XV4O^8&WSoO@rHz{Xy_T9j=XvTi!yvGT;7Vh zKlsqx(`9Jnk5X9!VQAvDyM46ELOGLmCXbaLtK|@S^TBL$qjGh4d+J!_l@1H_!nsbz zN&{4BR`;}rE-;=Qx%Z?+y@Nlx5xSk?bNNkWfg<7JH}jUoM{Oe=%T`3fbhSZD=Xa&5 W64}fGO~+{ES3ub7Y*%6v5dUvWeYQ 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 DB~=*Y diff --git a/schainpy/gui/figures/open.png b/schainpy/gui/figures/open.png deleted file mode 100644 index 04030f97175183f8e2aeea4b8e62c1a4a7786277..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@NSwWJ?9znhg z3{`3j3=J&|48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxDSY3;nDA{o-C@9zzrKDK}xwt{K19`Se86_nJR{Hwo z<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{r ziAnjTCALaRP&E($v8W_74PjGWG1OZ?59)(t^bPe4^x#An4GAd< zJOkrpQ^)r7Yl7+XZsda>VlpHzYajE0N+lz9!Yj=H}x+~^oSgDoTzLcw# z@Asa!TmI_a!3X>Q6|%Lhei45=JAw0&dgFWc(iF+o!^CJ)_3^X69jM7 zUAs81`Su6*oeQ+3vsR01@}>wGf1Q(Py=m9_h>haj?GKE%{GHJlUck;~rlj8^{@5U< zLH|OWNAc03xhwmNbJw@#Z(uFa>#fz6cAVSlnW=rVeDNn2hLa7)dc$HHKYtLN#j&z{ z;_I!oY<`V)cV1Mln8L8_q80n=hr)Z9kH_2zm3tnxgJp99gIueZW!A@%MdFK7W+i7! z?XFH(nEKzS)YL@CP&M3frrPEE;`$pMWmxo|F#qsfc9X&9`sAuBw`VP0x!X#dZG-f; zgSr-s$(MFc4pG{&eoD>TD}p;Buhvzjd@q~b$bW(F)IYmZ(I%}EZ(NTvvn`X3H~4TS z@QROwskQyx9xJZAcMEy1+&G`7yVs;&)^%x}*4c(_WsTnx*seq{l&M_$ZN{ZN`=eaU z`rPLkQpY=A1lk@nUpVDa4p;NZf;z+53_?rApX%<=a14CAH065rgYawHbAxr#49>+F zeb^%B6aTDCck|4-5+CGzoa=tf;>ozPWp?Kh&B($v>p$6A^exPOARVYFxnbhwUDi^o z=A|uU*;p%7o%X}@MfJ+RC(riHH(s!cb8*(j=NoUWvokwfqjb5sw0yU$-}T(CN1y&5 zya>RXmR-vAH z;6G!&g5<&|m%M^~+qMXFPY%i{nfz<>GXIwwv*M?o`*7mbeY<*wuK4S(PX6AZ0m|W? Lu6{1-oD!M<4c5`* diff --git a/schainpy/gui/figures/pause.png b/schainpy/gui/figures/pause.png deleted file mode 100644 index 366bb9423145e19ae0974c2a5660d5e8e675d2e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)CWx~Gd{h=pKksJC~rr^vc! z^N+bT3l}M6x^pZNbS!!3mf2LOZQRk(&1l}c_8-H+R_nwAXEV%MuJ03YpLx$iDzoJ3 z4ndQSW3G>zJ37|?Fx&b4-1pGsmoAq$-gUoQyzlee^?q}+JLC_)c=>Xox3{<0^kvJI zWzCy6&q}z{<-#VN{f{lC#+dUcr_D+`^0usf^XAR={XIQ3kF9Eaf844l`H}abDY2)& zzxdV+ISbysd-m*MUh)0w*HD$oC*OyyTz&efkffv}QQ#H7_H>;Pk0eE?id{WSAP~K7XEGSXrt0?fdt&YuD;> zJ`*~l{Nvy8BS&1O%<$rJ`N;4_eu=yTTj#oUdcq5g%+13aIvbW{Eo)#63ZKl#$It(^ zz#^w{f;7vug}>h)=-#a%&9fr2!DsjG-DjUYOPe`)vhsl@t4l5pa;514e6Q-t%hf#^ zgx0QEbK?X5gG!G1>Ss1?+&Js^@8A2^uUp4;`}Xa%+qRia-c@L0XV=x<&c0N)d4g>Y zYmTRz=Mjeu>CeJcgc>{7@Uk`k_i}mJ@^SX0NkSK|Tv6GX$dYKfX6@R}lP5hlZr;3@ z>Eouodv)2^*a}aP0^^N$nvnYOpFejp zwQsC?-YU6f-MUo?H$0ZwzU}Vr=AC~&-B>uuE93QY#lkdtbo+cl}l znz6Y+Wz3E8FZ6EVr_wL2X zOVqWry(wWj$Wql18ydQ_OP*0ALr1LmMnPG5`Ba|?*|H1Xi;Iibn^avo=F$B9`}gVq zRp%F+?{_RL2sn3TT65{CI)_e%3Km~ypZc=0Z`0!^7ae%IeE!P=2M**HyhvHjB=NiR w*G#1h9!I4=6PZkGY;FJcGOV-@{FVMoeg)SRg_^J@pu(QP)78&qol`;+0PD(~e*gdg diff --git a/schainpy/gui/figures/pause_blue.png b/schainpy/gui/figures/pause_blue.png deleted file mode 100644 index 2221e854815f2e0f55c19d3b831a6557592b09e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@DDLE!tv_-i{e2@^D|>;5SdIs0zhPBq+aAPJv=cGFhC#>fIbX> z!F2fuT@nRH_KDKPk<@lczVev)lYEK61adGQ2NC2x7x3X^V<>bFvunGJ$iV^scEXYN zWbp+8f)l_%PapWkEua@vk+#HOe|~2HKiU8V{IB+P7T`a_>?#HJq@pEIz_({ZOIWvR zxq(0;ZkA>yjz+SfPM$%^PV(CU5hrpUmT8E?1F$Jdv0j^|mnB^19rCEM>Uq_+pPo^j z+ka7-Go`jOse_%=qx9y-G8hvNY-LRbLswT5o~)hhU1P)E#5KHr(Yw&A+(HTrc#;bK z+}lLD(!4QtZ1zEQh1+^N1`x^6i0{U<*~!V6A53zXl8@sK)y8QB^yJ3Gz<)?UKbH)5 zuG1&YzLLGnt-=oLwv8^j7koEbGP-Km0dA=s#$Eq2k3cWC_8+4GiYb|CJv#~UcU9va zId304FSc;!G-Ydi$VGMQEoZV12=s&MR?YQZx{lQ% z`!RR2Qq5Rv#t(_DK%rBV6Xa+z*P2Vb7%(Va$}4i<=W&OQm*iHI@X+K^e7+(voqHGw zF0@-Ncpu%Wu`g|{KT=w)Jpvb&Gd{tlZdWeAjLbGsstxOB`j+YsFd;qRw>NK|Vc|s1 zYw)%?_U0?sYw&Tk_eL2AsT;NoCdiJlUqK}_i{nxQSQhZ)=A`{ z^#jo>HoRnXfAwlt`SeFyPAOY1#Z{q{`%0xTOgrTdhNLU2E^4{==v!GytB+tbPc218 zYnf;8?oC=k>U2g?I#X$?qGqP?zE<`${bI=9DtK(u&$*a|n@KOGS>+A9nE1OczG|s* z((?6zhbp`l7ne||7{zICp^ES6^j% zKXt_Yh)iebxT5bh+=#nxZZf=I!GWe4#F$BVQ@>t31_vi;GI^ZE+j1Rk4zcO1Fk+I= z=i|3&hSagag0yQQvTqMo%}r%62QlfIh=C%uWFfKJFjnYsf4pkE)flTTTcroS?p|3` zI3w&@^6n%qC=s{W)swxJ9|Edt7~G!^dq3x$01u;s@m;}wD+`adq;u^sA)fk-w0xvv zF%9ft6!F_if1$EZwu05KrC16_HQNIpWSZsQ!qyKT616(i747QIB_wMobm(l55GM5K z>2tU4H8`+X>oo*oC81{`({qkh?Np7)Qkx31HI)Yp&HFPd79&XC8#*;(Rdfn!5%d~& z$xB9Bwb^~`9B*-%&>a|BCZfqiH2+>1ew{qms(yq%4w>I4>bycMSC?$0U}>q(OG~Vu z-KEUA40~#`T{eu4 zy)nO{)X)*J=BM-2W9NPD_{-pd#8bH?b>`03BaRu+z!o}) zR~phA5;Ib$`Int=qEcg4sgToE@PvMuNSS)dnZ>JWeHSy4(E%pqEDG%DOb?P<+=S?) zByto3QHPBTXJ?sMbt80^m{F}u?T>9cs2Vi+1k=|dyp!9wvAUGKjByhk&K&;G_mg%3 o{VFdgUKJZTuI!a17F)C<+%n+Bv>bi-yWqdJG(T%re#)Er58YPAXaE2J diff --git a/schainpy/gui/figures/pause_green.png b/schainpy/gui/figures/pause_green.png deleted file mode 100644 index 1da39df10109da36ef37d7099df24913182b5176..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)CWil>WXh=pKn=-q6YP?7&< z-?&dY+wK`H9NGLL_<)w1XFx!9^CH13EJw1s5*!8oH)XlLI@Z48in`zz$DDYRjnm8) zdTDNq$~d@Xp=svDRVad!{p)@3KIv@~wtAhIvrNK*EM!sJHzS6e?Sm;iIjbJ#*&RACcSkzz+3MIRl{I8lAHJT=m6o2=2x8}H{|x?uQ*cjJ#)9#4P1%>Q`m#TiCE-$tv({s;G? zR+Vi#`|{VLJ9XbT9)8h(;Gnpw-)j1`WHK+Fo1FOcMA=!XlKDE@mwZvJcE0&D z=X}z7tMJVK{D0GTILx}zYWtrpuD0^`hu5*WdxMe;^-SNs|Fhm=zU<*g&s;_3zP>SS zm$ad6wLQAsF@eFI>KE4U`f~nl@j-A6p0ZUw87}SNq9AVt(>& z#h8nsb6*^unvfPq-cfrejmqj!#?Or+EvG{hc61xeNu7~5Z|c>K3ca0{A`$r(k?X|F8J_V* zYMc+9qFY<!YH6*?UAV6_b))K3w`ynpaF+AEw-wK*P3l?t-$`|~jqG3NTxrn$b1ujb40Sx%cS3 z{0+{or`O2eJ@Bq@kFt(x%b`afKFl!w^FP)6+G#8P-EXA7Tz$jw)~d_AS)}E^=@XqR z>N;Cr>1^m1D%@xJM_|g6A3`s?w=OU}cu%4F-kXbtHrhI0?@ravT=+pc_txt(1!6nr z9WI_}w#Iapx!&cA-t!Cn^Bx`~PkV&p4tO!R4T|wl3g5E2B$B!n!|Ye4wJ+)78&qol`;+0G+PH Ay8r+H diff --git a/schainpy/gui/figures/pause_red.png b/schainpy/gui/figures/pause_red.png deleted file mode 100644 index 04f578e59069a9b7e6344e7a9dbfa252bb0582a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)DBho_5Uh=pKnXl#Z|sK~!( z=khMi3ea4e?J2SsnauY_p7D?RRBo&FXKT{dXj#EbZOLImX7fds+GK%-s3>&gZ$s=kHtm z;1^7o;mWr@B4r=@u9yYJmZvsl*$4Q1V~=?5d(Ys$n$5p`evt?6vbG$u#lQc)dmH=uPKngD&nNZ=&G>Bh^V4QUAoq5`QQ9_Po1sDEGR;brM&|S2D zIm_u!pDJ1R9Ga$D{ZRO6QOVD(3qP1_&}Y0}aLh3Dp8kQ`Px>~MxN~5AUWr7 z>C36%e}xY?2*(JSZd_V#vu|I8*Q6y0Wz+sV3gyxk{TikyX%iEXP&ct@XXU1%#U~c1 z|J-q*_`Sw)%T)^d4t1+~hKL03l>2L3*7QvNw&T)$b*uRJgCm}{7_u%E3jMacd(7qF|?d8JuJ!!Ugs{dm%m)Y*}qx}0j|JvP|C8+EtRDAi~vbm4G*|8K~ zm(8)$tGs?7=N3zO@%n4a4{u%D)ptrZ{V>~>x3@MQ^>Fw6xH$OmBL%Ai`vRtfu0OOO zNAK3g8T~u%B*d9A^+-?IE1GhAXC?2_yw~r%I9}mRs5;+_7LObuT^)W}&fo{5zP}%E!FlbH8qRVTv0c)9NSp zqz)L)+iSCQ4UdSLe%@uZ8Fhc|uSrl>i@y<_KIiN!UFOsB&YjV}OJ@ds{4>>2-V^gTe~DWM4flGv?F diff --git a/schainpy/gui/figures/pause_yellow.png b/schainpy/gui/figures/pause_yellow.png deleted file mode 100644 index 5e6d7384ab1bb05d76b6d40410d9eb8b5f0f103f..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)DBtfz}(h=pKmsBcb4sK~!} zvo&QCGc+VjV;j6Xx$i0(9+dFakY0UIs8>7usH?E=1cAkw$vukiLYjOH|23@MWw2E7 zn1ai#BO;;~(NfSAX}jIP=5Zb_}VT`C#;On6P%uh;jwo6=r?V2Rt7 zUKT&`zJJ%1b)6oq%Ifddd3-gWxLRGs>hB5v-a?z{Kc5xWEU8jxZf^Y`(s$~OwbI4- zt|t~c?vs_z@!nk>r?N+{>{suNc}FIS?U;7?y2;g+_=mMWza~dr-_yP0#?CYsk0gtK z?q((O(aRTIcy!I>+5O2MxMj{AP-KdKULd1?^3ClntF<$pBwr1kt>M?MqSX|Bnek ztzLh_C;D0+zj5Scy4`uYe8wZaiLK?F^WqYItUs~!uu`#q$L!nM@Ai8~a_wQ>b*^6J zY~dUJ9}&%m{@&<*yZftslE*KR)iukma@WL(H{SYg^N=|#^V&}Pqm^Q5f2|knoATo5 z#wEuRkINm|TVa>5^LNVU3&|R`E7+p)RjpE~oHUOK(_yTqd2lE-+PXj;ZM42bQ->G&y)?xC-jb&1_pMmv4MEVaYMU z!X*aadV?W+|gO@Yj>_bUgE#DHf>en7C(Kx%f)3}UiSh*)26>m zcrW3?ZQk6Q9Py-G9>-Vt`J6hPm(vEfgcgy9J6EA4L`H*^T%`8(#qv#^%-dOQX%(17GUxn}0x@c~3 z`h?f_9Z5XQXJ1~Qt1iNSuW#y`n&55n6>>@$dz8NYS^fG+m#ya(ufmlr@sD&RdaRSLeUi{<;E(*5-V#FP4015u6qCo_N-NJG3Fx$IOD{@;P?Tc+C8s$WvL zU6r0B(8?UY{Ju?4{1={`rP6F$zHjxt8Q9hz-}K^`Z}?2B<=gMq3Z!!`;=f#PvWfrI Z|6TcAS7*EIy$C9EJzf1=);T3K0RSM(j+_7h diff --git a/schainpy/gui/figures/pausered.png b/schainpy/gui/figures/pausered.png deleted file mode 100644 index 1fbf3428438f6fa5f5c39d0f969645c074feca5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 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 LS3j3^P6GK4GQ<#=IWDQi$wiq3 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 diff --git a/schainpy/gui/figures/start.png b/schainpy/gui/figures/start.png deleted file mode 100644 index 2820368e8596875c15fe786090cbcf7690d489b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@MzCV_|S* zE^l&Yo9;Xs0007CNklTJ^-NtaC6FHZ?MqQLnc#`bzHl-0uUx?E;eD6A=A4EMr4#!e*wIqo4I{U@WYAkU9nMX9MZcO%5JaVx zX^-3&hx-=H5h@=|mEU!}Wn4?2Jr^XPR5)?uC(GK>w?AJ=_ge9X!!wsn>i3MghaS76 zE)ir>iMGFV)Ly^;RZ>ix4DyD4b$wE7`OGE~shWnScW^RTOeDSW+;c9d$)pmw1Aq9! zf&-*#>Y6Uf^~RGpc4|PblnBTj+SB#Ghkis*)8~>?aV&|Wg&}nW0Z%;fuc!X8>r;!4 zq*5;_#L+B@2m;_YTmE+9yz}}*5Cl<_#f>oZyGjK}W$F@{bLL$^Pi0#WHI&( zi!YtZmhR3GD$KO2&ED{_SIs!1Pb#RCj@|Q6L$(`6?sN$im~K}KaW>cRycfMJ_|>)@ zN9vNLaQ$umjP9QGB$3^sv#I6A>F zp>zsN521_Df}4V2Fc_NdAAoYkT5nw!W+w1JCNm5L04x>@!O}s5(oX~0Mn*<}77{=r zHH8RGMkI~t8=*;KsBV&c6Xm{sp=X#TaQGHx(>5D1g985TL}P5p z5()%FCxA9W3;510q8C+BczO^;*jdDHs*MKzSNk>#@SkBel>%E*O~Gj3`?HyX9ctAH zAdmzLhqZ7ul%cqJIS}3Ut#=Fxx_ThCyqI41nCN-+l!BW6f&3ACy?kb-zUiH#j)jeJ zaVby=S#l=ULZExsn(U|hJ~puUUPY-{PC0nTn7XXHM!7lorWfR96>DiIe4JC+nj^lH zrSqvaTLZfL{dAIjyK8U07hzo59x`I#s_Pl}%djnwy)=YE}FzU6N|5 z&Krw5^wx_V@usQ!X~Fulsx}%5P}}82p0NtsrLIRzUP`kDC1Lgh#&j(86 zBqbuG3DXCfeqAogP(oSX>aCetEsS$9i+<&6o?K)vT}3y=<;wO?UoA*5R9tWQ1lq&v$A`l&T?$5B1fsy zht?wplREa9e!+$?f2gujwm`~+oc*Z!ZUvkvphD$|a&1r2A2erd&xkt!B}2-%A4dez z-pf=u!O52%EeCZ=A)b&5P3wppG`G((TI*=qhCAjr|J=cYI`P*!+*IoLg8dZ_f>YyN z6l+}^_*2y-K0ZSiN0YI@av?gWpyY&;sw+%kPx?N+fyT5UpCVADLn-{~A-|G3rDkIn zqv^j*Vl&D$+>JD(EiLk5K5GP>>*iXe>^(c*8)T=L z@iwUq{NZs`5@{hf`$0e5!_GL>b7%6xk@UNYD|a>wv6r54ye(e!)Amz?SW{4w-j*sA z3h$-sV;mli9CSo+CTZwIn@Oif7oJ6}?ig<8*O_i#cN*Y4S;VEKB#bQSDfZR{H1v7R z0h3d<_7?WBRvOFv;if$MMI!M|O(c8Vo%j=jh>>DHEGA_v7X1C1J6ulf$KMuT3}5qf zmW>=XV0#`OIG!11Q@(;L`BM3(Ltc*3IOoG;&xaK|-=lq(A48VOGwnZ1B)!A~$%s+F($;AKw diff --git a/schainpy/gui/figures/start_green.png b/schainpy/gui/figures/start_green.png deleted file mode 100644 index a3b4e7ed408ab6ee04c8191df2ae23d16cd0263c..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)D>1Wy;o5DUTF(6`yqsUrXH zR!?4*y;*H;^hJ}&yi-rPgr&b`Dcz=VtMS&Uf+#^5jz{qZb5HpE4VYRd?C4nd+sOKP zOms<4pmrdybMC^%jq7UC?eBd&c<^P*lPmERwG4NkFYo)z>3#0Re1_nA zr#}~*{A^>Ia_;>m^}~}oe*OC~#p-v#jpL89m8L#V-*;4d@BXhFvbnBIJM4E)?efm4 zZ2k<~+kQwaHrghUvQg*MrRmfAtor9WMRUs31Wvk~^kW)B*P4{)883c`o9z73&A;H< zQ3pebRF63c8^zvcTK!7C%^~g)5qslv{-dqax@FvvTUnO*QC_Mes7rY zS9V#lVoFP3s37BXCHJTg-uGO8tPGV7)J?Z8KVQil&a`Kl`8B(*Z`MUje$$=ltgrQY zSEI)Yxpmw7RN4GzUtY2PX7k&NcXJf9eogXn3-v$vO|Hj&mA%Q`3xWsKJFbSCzVBn( z-ZgK9NX!Ju?sJ>H7E8@;5;WV;IP;3@oin~la+MNaC&qHT5cTTk`n$xnxwNA_I*OS` zH0G7Cq}6z+a%X=tMPN(L1hny7P|a{L(7BX4jPaQ1-&th84-d z3C6j6*N%p)Wc|vuRYQ6^cl+@;X@eUL2P@6LC`hjeJfD&!5&q0iIaya*{mGgq$}8F< zW*`0bCaC}Po*0#Ox&NP@eA=|o#_X=?)Z5kD-=z1?7F>B}*|SG2A>DJ$1s%8~U)D*3pz>`D!ur)}xkY_RsR z?H}EiOE}f*Z2_om^=oxc+AMvE6(R=B=$3?!CAA%UhSW1VpqLh-h|9EGi3T<9eg^ds@RhiTBHz(?3jO()~Mi;^u()8>R@< z1d8mi*R*TZtGuhs8E<17z!&xGjqaxO?Ebk&>JnGVud8)Ec_!2=(%kanvPFTXZ!Rz` z?p$_BxFqe7@wu16%}YQ0T=W0pkMiT4&;ObCuUx;BF}He~$(G}*qoS7jE?vCiN9Su3 sO;yul+v^|7uocQI>x#3{tqb_icsQr%@67#Hb)aJ2)78&qol`;+07t#acmMzZ diff --git a/schainpy/gui/figures/start_red.png b/schainpy/gui/figures/start_red.png deleted file mode 100644 index 3d8f9c1fda5fc7222d144413026f42b427cec38d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)CWs;7%%h=pKmXlzbMsKCE> zd*5z55ViKISCqlUUnw;P3p+2ea~dj&Zb;bDVyAJ?MX=UzqDilvhsoM$F7rc74t`K@ zye!dSfAPvOb;qS#OC7j!xBXw6+4%O_yGw8P?*86)f6ngjyGl20u0A(s=KC{eX3pID z!CvUVG7p`imnZ%SW)w7}EIGCL>DvSMFaG1mz4x%~lftCJzw%$1&cz)F_mmHaXMPhG z|3AU|>*w8arDo<=ET>N8hzaMqY;1n_{Qi9f(lh6aHNG!rl-#Ph{rX--QMcEh9e!WU zz1@CE-M_P^w=<=9Q`^5tF-gg(t@?f^ran_=JIAzkVy`U|W-pER6U6XzSViOKuHZy}LR zQIZk!rkWEokp-(4cpon@VV%BMf<8}fr}c^z$;57hiR9eI?`laW(q;>C;H zqBgUqUNpa_^M`HAkq5s5W?c^Yk@ukT*tNOyrX4*jyXn&R%`Xa^w?aB-}v5?ahM|#Z-6}zp=Jghi9&7F*Nqo00TIXNh1MtH09 zNIk}QE1iGGs=x2Q5V?K%R21@NrN7R3tD#$`;v1zCs+8k%Z5PX$tXpBx8)nNjT)xwk zkiziu`mKp?-?f=na0Y2?2<6?CdN)#8bhecAmfFN{wMTqC;(}Y8JwruzPP+H;)Ys4r zv*g&!Y+2T?=HA)7ezAqM__S$^n{}-xZqO>xeV29T@zZ-!IrD|CD__<&TfXLrV2m_N zm{wrv7mZcX<%=KvJDb2IsWUfWU+r~QR^Lsxen*_U*E-9(MT$-T*QC&_3ZL^@vJ(6G zcABz1UpYNs>vG;s-Lr{(p)=nv&+|?@`AI!pt@p1$*8WTP)LTOZuc@w13c6%n?ltSz zORHONs>8zeSu5A21(x!e%NQ9f`^PNq8S(wrLQqO;HEa&nXW`sO< zb8z>r4sTn3QsC8Ze}=0c*H|3Cd0JC+irbRar*7SHw6JyxU^N$Pk6tVs_rgm}S$Vz8 zDZ%HSk9FstnldNv#;yF9Q!X_+U20sIH_Puz<$_ETnYe_aQ^m|ycYkj4+aAuF@#W~k zK)WZ_C0?Fgx^h+N2RH-#6j%89wb_6Av@pgpW9R0N8?K-J(f?tKpQfzFt=~smrGrwu zYL>axcYpr;C|1UV-?XLr*W(YF(v~}yT?~=<`@C>&&Xb(G2kxkU+m>&fd#W$#W4FDj x@zc5Q{;KlVRLj1wXV`Em(#mJ`wvKiGS#Jh%dp+Ce5C$r{Jzf1=);T3K0RR$Lq_F@1 diff --git a/schainpy/gui/figures/startred.png b/schainpy/gui/figures/startred.png deleted file mode 100644 index 3d8f9c1fda5fc7222d144413026f42b427cec38d..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)CWs;7%%h=pKmXlzbMsKCE> zd*5z55ViKISCqlUUnw;P3p+2ea~dj&Zb;bDVyAJ?MX=UzqDilvhsoM$F7rc74t`K@ zye!dSfAPvOb;qS#OC7j!xBXw6+4%O_yGw8P?*86)f6ngjyGl20u0A(s=KC{eX3pID z!CvUVG7p`imnZ%SW)w7}EIGCL>DvSMFaG1mz4x%~lftCJzw%$1&cz)F_mmHaXMPhG z|3AU|>*w8arDo<=ET>N8hzaMqY;1n_{Qi9f(lh6aHNG!rl-#Ph{rX--QMcEh9e!WU zz1@CE-M_P^w=<=9Q`^5tF-gg(t@?f^ran_=JIAzkVy`U|W-pER6U6XzSViOKuHZy}LR zQIZk!rkWEokp-(4cpon@VV%BMf<8}fr}c^z$;57hiR9eI?`laW(q;>C;H zqBgUqUNpa_^M`HAkq5s5W?c^Yk@ukT*tNOyrX4*jyXn&R%`Xa^w?aB-}v5?ahM|#Z-6}zp=Jghi9&7F*Nqo00TIXNh1MtH09 zNIk}QE1iGGs=x2Q5V?K%R21@NrN7R3tD#$`;v1zCs+8k%Z5PX$tXpBx8)nNjT)xwk zkiziu`mKp?-?f=na0Y2?2<6?CdN)#8bhecAmfFN{wMTqC;(}Y8JwruzPP+H;)Ys4r zv*g&!Y+2T?=HA)7ezAqM__S$^n{}-xZqO>xeV29T@zZ-!IrD|CD__<&TfXLrV2m_N zm{wrv7mZcX<%=KvJDb2IsWUfWU+r~QR^Lsxen*_U*E-9(MT$-T*QC&_3ZL^@vJ(6G zcABz1UpYNs>vG;s-Lr{(p)=nv&+|?@`AI!pt@p1$*8WTP)LTOZuc@w13c6%n?ltSz zORHONs>8zeSu5A21(x!e%NQ9f`^PNq8S(wrLQqO;HEa&nXW`sO< zb8z>r4sTn3QsC8Ze}=0c*H|3Cd0JC+irbRar*7SHw6JyxU^N$Pk6tVs_rgm}S$Vz8 zDZ%HSk9FstnldNv#;yF9Q!X_+U20sIH_Puz<$_ETnYe_aQ^m|ycYkj4+aAuF@#W~k zK)WZ_C0?Fgx^h+N2RH-#6j%89wb_6Av@pgpW9R0N8?K-J(f?tKpQfzFt=~smrGrwu zYL>axcYpr;C|1UV-?XLr*W(YF(v~}yT?~=<`@C>&&Xb(G2kxkU+m>&fd#W$#W4FDj x@zc5Q{;KlVRLj1wXV`Em(#mJ`wvKiGS#Jh%dp+Ce5C$r{Jzf1=);T3K0RR$Lq_F@1 diff --git a/schainpy/gui/figures/stop.png b/schainpy/gui/figures/stop.png deleted file mode 100644 index 4ecbdf6edaf819a5f1f7d1a850f6fe0c0662d252..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@MzCV_|S* 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 diff --git a/schainpy/gui/figures/stop_red.png b/schainpy/gui/figures/stop_red.png deleted file mode 100644 index 0bda47e2902052c0dc258c3b0cc73b177ee5a2ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@h?X&sHg; zq@=(~U%$M(T(8_%FTW^V-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGMsb3~lr=#9(gGM{^9sr}|K@+Hu+F!-LI^%jb}KBm)DBkEe@ch=pKlXmmzQs7UPh zGiMi{-D0-U_mWCf>6U;A8e*)jEx#_hCFi(G-{N1WWEb=&U`oK3!;jke1z0~eF8Jac zc+%Zb#I;GoOf)*zAU7a5=*;08K9dZS(`J1+SDSO)&bZvj)75;A<@Yz6zuWzOv-!Fd z`)U^k=cyJlOLaf9UYNu%X`|+Mu`;ImW3LZ?shr3CYH`Hz_o*+Lh3-16n6zy2y0JzI9$kB{N|v3*ku-+1o2xV=38k^6(E z9}nwy{4rd*QHgK9@&gX-wsoQUpMKBivAZlikA?5(!CXsk)2+MaH;6yKU*(>X=^1O& zxky7tMCH@pM;uL0^Y1@jI8pA6r=9-G>2ZShwwUv+(@%N*hj~N3kFhSBuFFETum6QU z8gwmxYW4fc<$vED+%0$5UHQ;A*Lmsd>c9ih#xo6Oi~j$!h2`ZJRp+k@uSI?4+v>$* zXQh=MbX`7q?&NiD_ZjYN|M`&lZANZjvzB_|fdwb_{$pG8zVBen-qyX3Hm|(VDQJBv zwY+DJbCSRKwXZg8!QsmjW0nMERJ?ldHr%eTV7k_sm&>jM{{B@Xa4qzwso9%;V70GR#$QN$e*A?lJ=sb+;Q?pzDFQeM`%f0Z`Za<;A7 z_cpt0d7tHxxqp4fSF7uVvAW&KKW4mZWEbS)`S8_TT;3}_E`P~PKfi^q-to;a)!ApY zW8J-LbN)Yz)?u6<_4K*J-w)rS{WTT_bnH=@<6P8`CX!+_o$u9Q?(VGpJ$vHorYf3z zlV{929aA{xj`y@KmFeNp>sf;T{`1#7Tv-?ACinKF@i|$u=s2JMhHECwofkSy>tlYS zptEbp%)3d`w9koUZu!{asLp4*{LQxtnbYS~dc7vS51kg|q}gfI(^|PkW3BV)S$qDS zP`3SfYQfZ#(@w_uOEJ6)nl`KIb8g@p_Lq{J9?MUiwPL?~IY>fg%E$2dWMA`d)7Sgo zw>T+!AuzT4rG5YXlVL^LmD$^q;uF1GEOY8OkEkc)I$ztaD0e0svZ1r=$P? diff --git a/schainpy/gui/figures/stopred.png b/schainpy/gui/figures/stopred.png deleted file mode 100644 index 845e10b56b0782150701c1857dc236a95fcf4e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z~m3YjNd0( zOkiMOjLZy)D2ed(u}aR*)k{ptPfFFR$Sq(10hlpi<;HsXMd|v6mX?DWr0I{efGYw%=UNO{LKo9DJWb_U74D{hTKN}crUGpSnQv!k zqmLm5bBjKjV<0}&hkDhH%SIm_Y<65ehtwm1k+#m$#WBP}us8H?_mohPx_kYR*CW&K zh@PIQqskv=!pAH_Fy6^UVx%c}R=Tu0Z=-@Yu`StlY-|y0tK(pJ8FV-K( zetEb09Iw3XvMWpLl8+th4LlXGGNeaR)^zGUJL4OrDjxg)9eY`PVB1@V*sJjchZ?dM z^lbWQb7A7|4w@xU&+;UQ`#{PW5tz8XljMKNY$ougz7uPfM z@s-!5ov~0hS*D|~D=1KgX;G=7GEX^q2d;>nbQcFh1lFzjb2U z0#&P!_kM5hDV3>CK0o`+Kj!~m7@}FPOzs!SI{D64UZ?W+*`*#TOnN^9PK7>x9Pm?c z#!Al@osZTSGKOkwC>Oc2%ZgnuTda50k43Hcn}4l)TzTQBXGm4mf_;{JI?+tQNvGW;+*@_y%=urff4$~Z%nV(9 zE~cJq*Vb=*y7AY=uhQ`!B$JzJZ@sabFeQV>d2=p%|8s+&H4$9jJH_68$h;zGp|IhK zd+38>$%)US{F9^4c&o%bT3ePWR4(*g*P+L4GtVlkIS=@*GWgjVO2z#1@``9P%1?L` zy=fVb#+$p9yz9Ov7`^nKbl1b>k^-A?r--(@-h=7_71pmYo#!^PHW(GyeEhTC!lmT3 zQlG!d;?s@OxDJ0l6rBFXGPK8Qo&DOxj;*G``KxH!S9Ozw*ukzI8Enueraj zRrkJImFbOmlE#eJuWe z#w?4=f1B4H;0=m@bLHf`Ba^k~yJhX1k*RNYfA02T^)q4n0u&EREqLSATRB0x_twFg z%UT!z{vG(^<#XdB)~RQoC|{XgyFS^4|4)i8v3uCHNm9zp{MNU-D(Bp|vo!mn ztWP_Z-BQ<4ZE@OoX6e*TZ_Ezo94a_e_GJ4iUss3Cvh7_<&XseB+8H=L4}G(wyGHBE z^t<&5H@@&sFgf~NPO1IR&Fs8wd#i&T>=~b(IVOBJbA1!{{BIL}{faK1EAi(~cc-*Ik{rx=l$$E&-ruzy}hkIe(yfsb#1}A8xsyEM%}q3|58w4 zCX?CmYx!08yqAVmpL7X|o1!^2XFl7@)9KymyXyDw%~^6@mvO>u;S2jd*E6QuFeX3n RG;RY`0-mmZF6*2UngHrL<6Qs% diff --git a/schainpy/gui/figures/tools.py b/schainpy/gui/figures/tools.py deleted file mode 100644 index 0b5e891..0000000 --- a/schainpy/gui/figures/tools.py +++ /dev/null @@ -1,15 +0,0 @@ -import os, sys - -def get_path (): - """Borrowed from wxglade.py""" - try: - root = __file__ - if os.path.islink (root): - root = os.path.realpath (root) - - return os.path.dirname (os.path.abspath (root)) - except: - print "I'm sorry, but something is wrong." - print "There is no __file__ variable. Please contact the author." - return "" - \ No newline at end of file diff --git a/schainpy/gui/figures/w.jpg b/schainpy/gui/figures/w.jpg deleted file mode 100644 index aa878552f0e19afc59e86847265981d09d4c34e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@W+$BJ8w_rgg7A(O-a0?#X-Tjia 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%0DT-OvSZ!fG? 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 0: - self.proComEndDate.setCurrentIndex(self.proComEndDate.count() - stopIndex - 1) - else: - self.proComEndDate.setCurrentIndex(self.proComEndDate.count() - 1) - - @pyqtSignature("int") - def on_proComEndDate_activated(self, index): - """ - SELECCION DEL RANGO DE FECHAS-END DATE - """ - pass - - @pyqtSignature("") - def on_proOk_clicked(self): - """ - Añade al Obj XML de Projecto, name,datatype,date,time,readmode,wait,etc, crea el readUnitProcess del archivo xml. - Prepara la configuración del diágrama del Arbol del treeView numero 2 - """ - - self._disable_play_button() - self._disable_save_button() - - self.console.clear() - - if self.create: - - projectId = self.__getNewProjectId() - - if not projectId: - return 0 - - projectObjView = self.createProjectView(projectId) - - if not projectObjView: - return 0 - - self.create = False - - readUnitObj = self.createReadUnitView(projectObjView) - - if not readUnitObj: - return 0 - - else: - projectObjView = self.updateProjectView() - - if not projectObjView: - return 0 - - projectId = projectObjView.getId() - idReadUnit = projectObjView.getReadUnitId() - readUnitObj = self.updateReadUnitView(projectObjView, idReadUnit) - - if not readUnitObj: - return 0 - - self.__itemTreeDict[projectId].setText(projectObjView.name) - # Project Properties - self.refreshProjectProperties(projectObjView) - # Disable tabProject after finish the creation - - self._enable_play_button() - self._enable_save_button() - - self.console.clear() - self.console.append("The project parameters were validated") - - return 1 - - @pyqtSignature("") - def on_proClear_clicked(self): - - self.console.clear() - - @pyqtSignature("int") - def on_volOpCebChannels_stateChanged(self, p0): - """ - Check Box habilita operaciones de Selecci�n de Canales - """ - if p0 == 2: - self.volOpComChannels.setEnabled(True) - self.volOpChannel.setEnabled(True) - - if p0 == 0: - self.volOpComChannels.setEnabled(False) - self.volOpChannel.setEnabled(False) -# self.volOpChannel.clear() - - @pyqtSignature("int") - def on_volOpCebHeights_stateChanged(self, p0): - """ - Check Box habilita operaciones de Selecci�n de Alturas - """ - if p0 == 2: - self.volOpHeights.setEnabled(True) - self.volOpComHeights.setEnabled(True) - - if p0 == 0: - self.volOpHeights.setEnabled(False) -# self.volOpHeights.clear() - self.volOpComHeights.setEnabled(False) - - @pyqtSignature("int") - def on_volOpCebSplitter_stateChanged(self, p0): - """ - Name='Splitter', optype='other' - """ - if p0 == 2: - self.volOpSplitter.setEnabled(True) - - if p0 == 0: - self.volOpSplitter.setEnabled(False) - - @pyqtSignature("int") - def on_volOpCebCombiner_stateChanged(self, p0): - """ - Name='Combiner', optype='other' - """ - if p0 == 2: - self.volOpCombiner.setEnabled(True) - - if p0 == 0: - self.volOpCombiner.setEnabled(False) - - @pyqtSignature("int") - def on_volOpCebFilter_stateChanged(self, p0): - """ - Name='Decoder', optype='other' - """ - if p0 == 2: - self.volOpFilter.setEnabled(True) - - if p0 == 0: - self.volOpFilter.setEnabled(False) -# self.volOpFilter.clear() - - @pyqtSignature("int") - def on_volOpCebProfile_stateChanged(self, p0): - """ - Check Box habilita ingreso del rango de Perfiles - """ - if p0 == 2: - self.volOpComProfile.setEnabled(True) - self.volOpProfile.setEnabled(True) - - if p0 == 0: - self.volOpComProfile.setEnabled(False) - self.volOpProfile.setEnabled(False) -# self.volOpProfile.clear() - - @pyqtSignature("int") - def on_volOpComProfile_activated(self, index): - """ - Check Box habilita ingreso del rango de Perfiles - """ - #Profile List - if index == 0: - self.volOpProfile.setToolTip('List of selected profiles. Example: 0, 1, 2, 3, 4, 5, 6, 7') - - #Profile Range - if index == 1: - self.volOpProfile.setToolTip('Minimum and maximum profile index. Example: 0, 7') - - #Profile Range List - if index == 2: - self.volOpProfile.setToolTip('List of profile ranges. Example: (0, 7), (12, 19), (100, 200)') - - @pyqtSignature("int") - def on_volOpCebDecodification_stateChanged(self, p0): - """ - Check Box habilita - """ - if p0 == 2: - self.volOpComCode.setEnabled(True) - self.volOpComMode.setEnabled(True) - if p0 == 0: - self.volOpComCode.setEnabled(False) - self.volOpComMode.setEnabled(False) - - @pyqtSignature("int") - def on_volOpComCode_activated(self, index): - """ - Check Box habilita ingreso - """ - if index == 13: - self.volOpCode.setEnabled(True) - else: - self.volOpCode.setEnabled(False) - - if index == 0: -# code = '' -# self.volOpCode.setText(str(code)) - return - - if index == 1: - code = '(1,1,-1)' - nCode = '1' - nBaud = '3' - if index == 2: - code = '(1,1,-1,1)' - nCode = '1' - nBaud = '4' - if index == 3: - code = '(1,1,1,-1,1)' - nCode = '1' - nBaud = '5' - if index == 4: - code = '(1,1,1,-1,-1,1,-1)' - nCode = '1' - nBaud = '7' - if index == 5: - code = '(1,1,1,-1,-1,-1,1,-1,-1,1,-1)' - nCode = '1' - nBaud = '11' - if index == 6: - code = '(1,1,1,1,1,-1,-1,1,1,-1,1,-1,1)' - nCode = '1' - nBaud = '13' - if index == 7: - code = '(1,1,-1,-1,-1,1)' - nCode = '2' - nBaud = '3' - if index == 8: - code = '(1,1,-1,1,-1,-1,1,-1)' - nCode = '2' - nBaud = '4' - if index == 9: - code = '(1,1,1,-1,1,-1,-1,-1,1,-1)' - nCode = '2' - nBaud = '5' - if index == 10: - code = '(1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1)' - nCode = '2' - nBaud = '7' - if index == 11: - code = '(1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1 ,-1 ,-1 ,1 ,1,1,-1 ,1 ,1 ,-1 ,1)' - nCode = '2' - nBaud = '11' - if index == 12: - code = '(1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1)' - nCode = '2' - nBaud = '13' - - code = ast.literal_eval(code) - nCode = int(nCode) - nBaud = int(nBaud) - - code = numpy.asarray(code).reshape((nCode, nBaud)).tolist() - - self.volOpCode.setText(str(code)) - - @pyqtSignature("int") - def on_volOpCebFlip_stateChanged(self, p0): - """ - Check Box habilita ingresode del numero de Integraciones a realizar - """ - if p0 == 2: - self.volOpFlip.setEnabled(True) - if p0 == 0: - self.volOpFlip.setEnabled(False) -# self.volOpFlip.clear() - - @pyqtSignature("int") - def on_volOpCebCohInt_stateChanged(self, p0): - """ - Check Box habilita ingresode del numero de Integraciones a realizar - """ - if p0 == 2: - self.volOpCohInt.setEnabled(True) - if p0 == 0: - self.volOpCohInt.setEnabled(False) -# self.volOpCohInt.clear() - - @pyqtSignature("int") - def on_volOpCebRadarfrequency_stateChanged(self, p0): - """ - Check Box habilita ingresode del numero de Integraciones a realizar - """ - if p0 == 2: - self.volOpRadarfrequency.setEnabled(True) - if p0 == 0: - self.volOpRadarfrequency.clear() - self.volOpRadarfrequency.setEnabled(False) - - @pyqtSignature("") - def on_volOutputToolPath_clicked(self): - dirOutPath = str(QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)) - self.volOutputPath.setText(dirOutPath) - - @pyqtSignature("") - def on_specOutputToolPath_clicked(self): - dirOutPath = str(QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)) - self.specOutputPath.setText(dirOutPath) - - @pyqtSignature("") - def on_specHeisOutputToolPath_clicked(self): - dirOutPath = str(QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)) - self.specHeisOutputPath.setText(dirOutPath) - - @pyqtSignature("") - def on_specHeisOutputMetadaToolPath_clicked(self): - - filename = str(QtGui.QFileDialog.getOpenFileName(self, "Open text file", self.pathWorkSpace, self.tr("Text Files (*.xml)"))) - self.specHeisOutputMetada.setText(filename) - - @pyqtSignature("") - def on_volOpOk_clicked(self): - """ - BUSCA EN LA LISTA DE OPERACIONES DEL TIPO VOLTAJE Y LES A�ADE EL PARAMETRO ADECUADO ESPERANDO LA ACEPTACION DEL USUARIO - PARA AGREGARLO AL ARCHIVO DE CONFIGURACION XML - """ - - checkPath = False - - self._disable_play_button() - self._disable_save_button() - - self.console.clear() - self.console.append("Checking input parameters:\n") - - puObj = self.getSelectedItemObj() - puObj.removeOperations() - - if self.volOpCebRadarfrequency.isChecked(): - value = str(self.volOpRadarfrequency.text()) - format = 'float' - name_operation = 'setRadarFrequency' - name_parameter = 'frequency' - - if not isFloat(value): - self.console.append("Invalid value '%s' for Radar Frequency" %value) - return 0 - - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter, value=radarfreq, format=format) - - if self.volOpCebChannels.isChecked(): - - format = 'intlist' - if self.volOpComChannels.currentIndex() == 0: - name_operation = "selectChannels" - name_parameter = 'channelList' - else: - name_operation = "selectChannelsByIndex" - name_parameter = 'channelIndexList' - - value = str(self.volOpChannel.text()) - - if not isIntList(value): - self.console.append("Invalid value '%s' for %s" %(value,name_parameter)) - return 0 - - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.volOpCebHeights.isChecked(): - value = str(self.volOpHeights.text()) - - if not isFloatRange(value): - self.console.append("Invalid value '%s' for Height range" %value) - return 0 - - valueList = value.split(',') - - if self.volOpComHeights.currentIndex() == 0: - format = 'float' - name_operation = 'selectHeights' - name_parameter1 = 'minHei' - name_parameter2 = 'maxHei' - else: - format = 'int' - name_operation = 'selectHeightsByIndex' - name_parameter1 = 'minIndex' - name_parameter2 = 'maxIndex' - - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter1, value=valueList[0], format=format) - opObj.addParameter(name=name_parameter2, value=valueList[1], format=format) - - if self.volOpCebSplitter.isChecked(): - value = str(self.volOpSplitter.text()) - - if not isInt(value): - self.console.append("Invalid value '%s' for Profile Splitter" %value) - return 0 - - opObj = puObj.addOperation(name="SplitProfiles", optype='external') - opObj.addParameter(name='n', value=value, format='int') - - if self.volOpCebProfile.isChecked(): - value = str(self.volOpProfile.text()) - - format = 'intlist' - optype = 'other' - name_operation = 'ProfileSelector' - - if self.volOpComProfile.currentIndex() == 0: - name_parameter = 'profileList' - if self.volOpComProfile.currentIndex() == 1: - name_parameter = 'profileRangeList' - if self.volOpComProfile.currentIndex() == 2: - name_parameter = 'rangeList' - - if not isIntList(value): - self.console.append("Invalid value '%s' for %s" %(value, name_parameter) ) - return 0 - - opObj = puObj.addOperation(name='ProfileSelector', optype='other') - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.volOpCebCombiner.isChecked(): - value = str(self.volOpCombiner.text()) - - if not isInt(value): - self.console.append("Invalid value '%s' for Profile Combiner" %value) - return 0 - - opObj = puObj.addOperation(name="CombineProfiles", optype='external') - opObj.addParameter(name='n', value=value, format='int') - - if self.volOpCebFilter.isChecked(): - value = str(self.volOpFilter.text()) - - if not isInt(value): - self.console.append("Invalid value '%s' for Filter" %value) - return 0 - - format = 'int' - name_operation = 'filterByHeights' - name_parameter = 'window' - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.volOpCebDecodification.isChecked(): - name_operation = 'Decoder' - opObj = puObj.addOperation(name=name_operation, optype='other') - - if self.volOpComCode.currentIndex() != 0: - - code = str(self.volOpCode.text()) - - if not isMultiList(code): - self.console.append("Please write a valid Code (Example: [1,1,-1], [1,-1,1])") - return 0 - - real_code = getCode(code) - nCode = len(real_code) - nBaud = len(real_code[0]) - - opObj.addParameter(name='code', value=code, format='intlist') - opObj.addParameter(name='nCode', value=nCode, format='int') - opObj.addParameter(name='nBaud', value=nBaud, format='int') - - name_parameter = 'mode' - format = 'int' - value = str(self.volOpComMode.currentIndex()) - - opObj.addParameter(name=name_parameter, value=value, format=format) - - - if self.volOpCebFlip.isChecked(): - name_operation = 'deFlip' - optype = 'self' - - opObj = puObj.addOperation(name=name_operation, optype=optype) - - value = str(self.volOpFlip.text()) - - if value: - - name_parameter = 'channelList' - format = 'intlist' - - if not isIntList(value): - self.console.append("Invalid value '%s' for '%s'" %(value,name_parameter)) - return 0 - - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.volOpCebCohInt.isChecked(): - name_operation = 'CohInt' - optype = 'other' - value = str(self.volOpCohInt.text()) - - if not isInt(value): - self.console.append("Invalid value '%s' for '%s'" %(value,name_parameter)) - return 0 - - name_parameter = 'n' - format = 'int' - - opObj = puObj.addOperation(name=name_operation, optype=optype) - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.volGraphCebshow.isChecked(): - name_operation = 'Scope' - optype = 'other' - - name_parameter1 = 'id' - format1 = 'int' - - opObj = puObj.addOperation(name=name_operation, optype=optype) - opObj.addParameter(name=name_parameter1, value=opObj.id, format=format1) - - channelList = str(self.volGraphChannelList.text()).strip() - xvalue = str(self.volGraphHeightrange.text()).strip() - yvalue = str(self.volGraphIntensityRange.text()).strip() - figpath = str(self.volGraphPath.text()).strip() - figfile = str(self.volGraphPrefix.text()).strip() - - if channelList != "": - if not isIntList(channelList): - self.console.append("Invalid value '%s' for 'Graphics:ChannelList'" %(channelList)) - return 0 - - if xvalue != "": - if not isFloatRange(xvalue): - self.console.append("Invalid value '%s' for 'Graphics:Height-Range'" %(xvalue)) - return 0 - - if yvalue != "": - if not isFloatRange(yvalue): - self.console.append("Invalid value '%s' for 'Graphics:Amplitude-Range'" %(yvalue)) - return 0 - - - if channelList: - opObj.addParameter(name='channelList', value=channelList, format='intlist') - - if xvalue: - xvalueList = xvalue.split(',') - - opObj.addParameter(name='xmin', value=xvalueList[0], format='float') - opObj.addParameter(name='xmax', value=xvalueList[1], format='float') - - if yvalue: - yvalueList = yvalue.split(",") - - opObj.addParameter(name='ymin', value=yvalueList[0], format='int') - opObj.addParameter(name='ymax', value=yvalueList[1], format='int') - - plot_type = self.volComScopeType.currentIndex() - - if plot_type == 0: - opObj.addParameter(name='type', value="iq") - if plot_type == 1: - opObj.addParameter(name='type', value="power") - - if self.volGraphCebSave.isChecked(): - checkPath = True - - opObj.addParameter(name='save', value='1', format='int') - opObj.addParameter(name='figpath', value=figpath, format='str') - - if figfile: - opObj.addParameter(name='figfile', value=value, format='str') - - if checkPath: - - if not figpath: - self.console.clear() - self.console.append("Graphic path should be defined") - return 0 - -# if os.path.isdir(figpath): -# self.console.clear() -# self.console.append("Graphic path does not exist, it has to be created") -# return 0 - - self.console.clear() - - # if something happend - parms_ok, output_path, blocksperfile, profilesperblock = self.checkInputsPUSave(datatype='Voltage') - if parms_ok: - name_operation = 'VoltageWriter' - optype = 'other' - name_parameter1 = 'path' - name_parameter2 = 'blocksPerFile' - name_parameter3 = 'profilesPerBlock' - value1 = output_path - value2 = blocksperfile - value3 = profilesperblock - format = "int" - opObj = puObj.addOperation(name=name_operation, optype=optype) - opObj.addParameter(name=name_parameter1, value=value1) - opObj.addParameter(name=name_parameter2, value=value2, format=format) - opObj.addParameter(name=name_parameter3, value=value3, format=format) - - try: - self.refreshPUProperties(puObj) - except: - self.console.append("An error reading input parameters was found ...Check them!") - return 0 - - self.console.append("Save your project and press Play button to start signal processing") - - self._enable_play_button() - self._enable_save_button() - - return 1 - - @pyqtSignature("") - def on_volGraphClear_clicked(self): - - self.console.clear() - - """ - Voltage Graph - """ - @pyqtSignature("int") - def on_volGraphCebSave_stateChanged(self, p0): - """ - Check Box habilita ingresode del numero de Integraciones a realizar - """ - if p0 == 2: - self.volGraphPath.setEnabled(True) - self.volGraphPrefix.setEnabled(True) - self.volGraphToolPath.setEnabled(True) - - if p0 == 0: - self.volGraphPath.setEnabled(False) - self.volGraphPrefix.setEnabled(False) - self.volGraphToolPath.setEnabled(False) - - @pyqtSignature("") - def on_volGraphToolPath_clicked(self): - """ - Donde se guardan los DATOS - """ - save_path = str(QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)) - self.volGraphPath.setText(save_path) - - if not os.path.exists(save_path): - self.console.clear() - self.console.append("Set a valid path") - self.volGraphOk.setEnabled(False) - return - - @pyqtSignature("int") - def on_volGraphCebshow_stateChanged(self, p0): - """ - Check Box habilita ingresode del numero de Integraciones a realizar - """ - if p0 == 0: - - self.volGraphChannelList.setEnabled(False) - self.volGraphIntensityRange.setEnabled(False) - self.volGraphHeightrange.setEnabled(False) - if p0 == 2: - - self.volGraphChannelList.setEnabled(True) - self.volGraphIntensityRange.setEnabled(True) - self.volGraphHeightrange.setEnabled(True) - - """ - Spectra operation - """ - @pyqtSignature("int") - def on_specOpCebRadarfrequency_stateChanged(self, p0): - """ - Check Box habilita ingresode del numero de Integraciones a realizar - """ - if p0 == 2: - self.specOpRadarfrequency.setEnabled(True) - if p0 == 0: -# self.specOpRadarfrequency.clear() - self.specOpRadarfrequency.setEnabled(False) - - - @pyqtSignature("int") - def on_specOpCebCrossSpectra_stateChanged(self, p0): - """ - Habilita la opcion de a�adir el par�metro CrossSpectra a la Unidad de Procesamiento . - """ - if p0 == 2: - # self.specOpnFFTpoints.setEnabled(True) - self.specOpComCrossSpectra.setEnabled(True) - self.specOppairsList.setEnabled(True) - - if p0 == 0: - # self.specOpnFFTpoints.setEnabled(False) - self.specOpComCrossSpectra.setEnabled(False) - self.specOppairsList.setEnabled(False) - - @pyqtSignature("int") - def on_specOpCebChannel_stateChanged(self, p0): - """ - Habilita la opcion de a�adir el par�metro numero de Canales a la Unidad de Procesamiento . - """ - if p0 == 2: - self.specOpChannel.setEnabled(True) - self.specOpComChannel.setEnabled(True) - if p0 == 0: - self.specOpChannel.setEnabled(False) - self.specOpComChannel.setEnabled(False) - - @pyqtSignature("int") - def on_specOpCebHeights_stateChanged(self, p0): - """ - Habilita la opcion de a�adir el par�metro de alturas a la Unidad de Procesamiento . - """ - if p0 == 2: - self.specOpComHeights.setEnabled(True) - self.specOpHeights.setEnabled(True) - if p0 == 0: - self.specOpComHeights.setEnabled(False) - self.specOpHeights.setEnabled(False) - - - @pyqtSignature("int") - def on_specOpCebIncoherent_stateChanged(self, p0): - """ - Habilita la opcion de a�adir el par�metro integraciones incoherentes a la Unidad de Procesamiento . - """ - if p0 == 2: - self.specOpIncoherent.setEnabled(True) - if p0 == 0: - self.specOpIncoherent.setEnabled(False) - - @pyqtSignature("int") - def on_specOpCebRemoveDC_stateChanged(self, p0): - """ - Habilita la opcion de a�adir el par�metro remover DC a la Unidad de Procesamiento . - """ - if p0 == 2: - self.specOpComRemoveDC.setEnabled(True) - if p0 == 0: - self.specOpComRemoveDC.setEnabled(False) - - @pyqtSignature("int") - def on_specOpCebgetNoise_stateChanged(self, p0): - """ - Habilita la opcion de a�adir la estimacion de ruido a la Unidad de Procesamiento . - """ - if p0 == 2: - self.specOpgetNoise.setEnabled(True) - - if p0 == 0: - self.specOpgetNoise.setEnabled(False) - - @pyqtSignature("") - def on_specOpOk_clicked(self): - """ - AÑADE OPERACION SPECTRA - """ - - addFTP = False - checkPath = False - - self._disable_play_button() - self._disable_save_button() - - self.console.clear() - self.console.append("Checking input parameters:\n") - - projectObj = self.getSelectedProjectObj() - - if not projectObj: - self.console.append("Please select a project before update it") - return - - puObj = self.getSelectedItemObj() - - puObj.removeOperations() - - if self.specOpCebRadarfrequency.isChecked(): - value = str(self.specOpRadarfrequency.text()) - format = 'float' - name_operation = 'setRadarFrequency' - name_parameter = 'frequency' - - if not isFloat(value): - self.console.clear() - self.console.append("Invalid value [%s] for '%s'" %(value, name_parameter)) - return 0 - - radarfreq = float(value)*1e6 - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter, value=radarfreq, format=format) - - inputId = puObj.getInputId() - inputPuObj = projectObj.getProcUnitObj(inputId) - - if inputPuObj.datatype == 'Voltage' or inputPuObj.datatype == 'USRP': - - value = str(self.specOpnFFTpoints.text()) - - if not isInt(value): - self.console.append("Invalid value [%s] for '%s'" %(value, 'nFFTPoints')) - return 0 - - puObj.addParameter(name='nFFTPoints', value=value, format='int') - - value = str(self.specOpProfiles.text()) - if not isInt(value): - self.console.append("Please write a value on Profiles field") - else: - puObj.addParameter(name='nProfiles', value=value, format='int') - - value = str(self.specOpippFactor.text()) - if not isInt(value): - self.console.append("Please write a value on IppFactor field") - else: - puObj.addParameter(name='ippFactor' , value=value , format='int') - - if self.specOpCebCrossSpectra.isChecked(): - name_parameter = 'pairsList' - format = 'pairslist' - value = str(self.specOppairsList.text()) - - if not isPairList(value): - self.console.append("Invalid value [%s] for '%s'" %(value, name_parameter)) - return 0 - - puObj.addParameter(name=name_parameter, value=value, format=format) - - if self.specOpCebHeights.isChecked(): - value = str(self.specOpHeights.text()) - - if not isFloatRange(value): - self.console.append("Invalid value [%s] for Height range" %value) - return 0 - - valueList = value.split(',') - value0 = valueList[0] - value1 = valueList[1] - - if self.specOpComHeights.currentIndex() == 0: - name_operation = 'selectHeights' - name_parameter1 = 'minHei' - name_parameter2 = 'maxHei' - else: - name_operation = 'selectHeightsByIndex' - name_parameter1 = 'minIndex' - name_parameter2 = 'maxIndex' - - format = 'float' - - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter1, value=value0, format=format) - opObj.addParameter(name=name_parameter2, value=value1, format=format) - - if self.specOpCebChannel.isChecked(): - - if self.specOpComChannel.currentIndex() == 0: - name_operation = "selectChannels" - name_parameter = 'channelList' - else: - name_operation = "selectChannelsByIndex" - name_parameter = 'channelIndexList' - - format = 'intlist' - value = str(self.specOpChannel.text()) - - if not isIntList(value): - self.console.append("Invalid value [%s] for '%s'" %(value, name_parameter)) - return 0 - - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.specOpCebIncoherent.isChecked(): - - name_operation = 'IncohInt' - optype = 'other' - - if self.specOpCobIncInt.currentIndex() == 0: - name_parameter = 'timeInterval' - format = 'float' - else: - name_parameter = 'n' - format = 'int' - - value = str(self.specOpIncoherent.text()) - - if not isFloat(value): - self.console.append("Invalid value [%s] for '%s'" %(value, name_parameter)) - return 0 - - opObj = puObj.addOperation(name=name_operation, optype=optype) - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.specOpCebRemoveDC.isChecked(): - name_operation = 'removeDC' - name_parameter = 'mode' - format = 'int' - - if self.specOpComRemoveDC.currentIndex() == 0: - value = 1 - else: - value = 2 - - opObj = puObj.addOperation(name=name_operation) - opObj.addParameter(name=name_parameter, value=value, format=format) - - if self.specOpCebRemoveInt.isChecked(): - name_operation = 'removeInterference' - opObj = puObj.addOperation(name=name_operation) - - - if self.specOpCebgetNoise.isChecked(): - value = str(self.specOpgetNoise.text()) - valueList = value.split(',') - format = 'float' - name_operation = "getNoise" - opObj = puObj.addOperation(name=name_operation) - - if not value == '': - valueList = value.split(',') - length = len(valueList) - if length == 1: - try: - value1 = float(valueList[0]) - except: - self.console.clear() - self.console.append("Please Write correct parameter Get Noise") - return 0 - name1 = 'minHei' - opObj.addParameter(name=name1, value=value1, format=format) - elif length == 2: - try: - value1 = float(valueList[0]) - value2 = float(valueList[1]) - except: - self.console.clear() - self.console.append("Please Write corrects parameter Get Noise") - return 0 - name1 = 'minHei' - name2 = 'maxHei' - opObj.addParameter(name=name1, value=value1, format=format) - opObj.addParameter(name=name2, value=value2, format=format) - - elif length == 3: - try: - value1 = float(valueList[0]) - value2 = float(valueList[1]) - value3 = float(valueList[2]) - except: - self.console.clear() - self.console.append("Please Write corrects parameter Get Noise") - return 0 - name1 = 'minHei' - name2 = 'maxHei' - name3 = 'minVel' - opObj.addParameter(name=name1, value=value1, format=format) - opObj.addParameter(name=name2, value=value2, format=format) - opObj.addParameter(name=name3, value=value3, format=format) - - elif length == 4: - try: - value1 = float(valueList[0]) - value2 = float(valueList[1]) - value3 = float(valueList[2]) - value4 = float(valueList[3]) - except: - self.console.clear() - self.console.append("Please Write corrects parameter Get Noise") - return 0 - name1 = 'minHei' - name2 = 'maxHei' - name3 = 'minVel' - name4 = 'maxVel' - opObj.addParameter(name=name1, value=value1, format=format) - opObj.addParameter(name=name2, value=value2, format=format) - opObj.addParameter(name=name3, value=value3, format=format) - opObj.addParameter(name=name4, value=value4, format=format) - - elif length > 4: - self.console.clear() - self.console.append("Get Noise Operation only accepts 4 parameters") - return 0 - - channelList = str(self.specGgraphChannelList.text()).strip() - vel_range = str(self.specGgraphFreq.text()).strip() - hei_range = str(self.specGgraphHeight.text()).strip() - db_range = str(self.specGgraphDbsrange.text()).strip() - - trange = str(self.specGgraphTminTmax.text()).strip() - magrange = str(self.specGgraphmagnitud.text()).strip() - phaserange = str(self.specGgraphPhase.text()).strip() - timerange = str(self.specGgraphTimeRange.text()).strip() - - figpath = str(self.specGraphPath.text()).strip() - figfile = str(self.specGraphPrefix.text()).strip() - - try: - wrperiod = int(str(self.specGgraphftpratio.text()).strip()) - except: - wrperiod = None - - #-----Spectra Plot----- - if self.specGraphCebSpectraplot.isChecked() or self.specGraphSaveSpectra.isChecked(): - - opObj = puObj.addOperation(name='SpectraPlot', optype='other') - opObj.addParameter(name='id', value=opObj.id, format='int') - - if channelList: - - if not isList(channelList): - self.console.append("Invalid value [%s] for 'Graphic:ChannelList" %(channelList)) - return 0 - - opObj.addParameter(name='channelList', value=channelList, format='intlist') - - if vel_range: - - if not isFloatRange(vel_range): - self.console.append("Invalid value [%s] for 'Graphic:Velocity-Range" %(vel_range)) - return 0 - - xvalueList = vel_range.split(',') - value1 = float(xvalueList[0]) - value2 = float(xvalueList[1]) - - opObj.addParameter(name='xmin', value=value1, format='float') - opObj.addParameter(name='xmax', value=value2, format='float') - - if hei_range: - - if not isFloatRange(hei_range): - self.console.append("Invalid value [%s] for 'Graphic:Height-Range" %(hei_range)) - return 0 - - yvalueList = hei_range.split(",") - value1 = float(yvalueList[0]) - value2 = float(yvalueList[1]) - - opObj.addParameter(name='ymin', value=value1, format='float') - opObj.addParameter(name='ymax', value=value2, format='float') - - if db_range: - - if not isFloatRange(db_range): - self.console.append("Invalid value [%s] for 'Graphic:dB-Range" %(db_range)) - return 0 - - zvalueList = db_range.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='zmin', value=value1, format='float') - opObj.addParameter(name='zmax', value=value2, format='float') - - if not self.specGraphCebSpectraplot.isChecked(): - - opObj.addParameter(name='show', value=0 , format='bool') - - if self.specGraphSaveSpectra.isChecked(): - - checkPath = True - opObj.addParameter(name='save', value=1 , format='bool') - opObj.addParameter(name='figpath', value=figpath, format='str') - if figfile: - opObj.addParameter(name='figfile', value=figfile, format='str') - if wrperiod: - opObj.addParameter(name='wr_period', value=wrperiod,format='int') - - if self.specGraphftpSpectra.isChecked(): - - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - - if self.specGraphCebCrossSpectraplot.isChecked() or self.specGraphSaveCross.isChecked(): - - opObj = puObj.addOperation(name='CrossSpectraPlot', optype='other') - opObj.addParameter(name='id', value=opObj.id, format='int') - - if vel_range: - - if not isFloatRange(vel_range): - self.console.append("Invalid value [%s] for 'Graphic:Velocity-Range" %(vel_range)) - return 0 - - xvalueList = vel_range.split(',') - value1 = float(xvalueList[0]) - value2 = float(xvalueList[1]) - - opObj.addParameter(name='xmin', value=value1, format='float') - opObj.addParameter(name='xmax', value=value2, format='float') - - if hei_range: - - if not isFloatRange(hei_range): - self.console.append("Invalid value [%s] for 'Graphic:Height-Range" %(hei_range)) - return 0 - - yvalueList = hei_range.split(",") - value1 = float(yvalueList[0]) - value2 = float(yvalueList[1]) - - opObj.addParameter(name='ymin', value=value1, format='float') - opObj.addParameter(name='ymax', value=value2, format='float') - - if db_range: - - if not isFloatRange(db_range): - self.console.append("Invalid value [%s] for 'Graphic:dB-Range" %(db_range)) - return 0 - - zvalueList = db_range.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='zmin', value=value1, format='float') - opObj.addParameter(name='zmax', value=value2, format='float') - - if magrange: - - if not isFloatRange(magrange): - self.console.append("Invalid value [%s] for 'Graphic:Magnitud-Range" %(magrange)) - return 0 - - zvalueList = magrange.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='coh_min', value=value1, format='float') - opObj.addParameter(name='coh_max', value=value2, format='float') - - if phaserange: - - if not isFloatRange(phaserange): - self.console.append("Invalid value [%s] for 'Graphic:Phase-Range" %(phaserange)) - return 0 - - zvalueList = phaserange.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='phase_min', value=value1, format='float') - opObj.addParameter(name='phase_max', value=value2, format='float') - - if not self.specGraphCebCrossSpectraplot.isChecked(): - - opObj.addParameter(name='show', value=0 , format='bool') - - if self.specGraphSaveCross.isChecked(): - - checkPath = True - opObj.addParameter(name='save', value='1', format='bool') - opObj.addParameter(name='figpath', value=figpath, format='str') - if figfile: - opObj.addParameter(name='figfile', value=figfile, format='str') - if wrperiod: - opObj.addParameter(name='wr_period', value=wrperiod,format='int') - - if self.specGraphftpCross.isChecked(): - - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - - if self.specGraphCebRTIplot.isChecked() or self.specGraphSaveRTIplot.isChecked(): - - opObj = puObj.addOperation(name='RTIPlot', optype='other') - opObj.addParameter(name='id', value=opObj.id, format='int') - - if channelList: - - if not isIntList(channelList): - self.console.append("Invalid value [%s] for 'Graphic:ChannelList" %(channelList)) - return 0 - - opObj.addParameter(name='channelList', value=channelList, format='intlist') - - if trange: - - if not isFloatRange(trange): - self.console.append("Invalid value [%s] for 'Graphic:Time-Range" %(trange)) - return 0 - - zvalueList = trange.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='xmin', value=value1, format='float') - opObj.addParameter(name='xmax', value=value2, format='float') - - if timerange: - try: - timerange = int(timerange) - except: - return 0 - opObj.addParameter(name='timerange', value=timerange, format='int') - - if hei_range: - - if not isFloatRange(hei_range): - self.console.append("Invalid value [%s] for 'Graphic:Height-Range" %(hei_range)) - return 0 - - yvalueList = hei_range.split(",") - value1 = float(yvalueList[0]) - value2 = float(yvalueList[1]) - - opObj.addParameter(name='ymin', value=value1, format='float') - opObj.addParameter(name='ymax', value=value2, format='float') - - if db_range: - - if not isFloatRange(db_range): - self.console.append("Invalid value [%s] for 'Graphic:dB-Range" %(db_range)) - return 0 - - zvalueList = db_range.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='zmin', value=value1, format='float') - opObj.addParameter(name='zmax', value=value2, format='float') - - if not self.specGraphCebRTIplot.isChecked(): - - opObj.addParameter(name='show', value=0 , format='bool') - - if self.specGraphSaveRTIplot.isChecked(): - - checkPath = True - opObj.addParameter(name='save', value='1', format='bool') - opObj.addParameter(name='figpath', value=figpath, format='str') - if figfile: - opObj.addParameter(name='figfile', value=value, format='str') - if wrperiod: - opObj.addParameter(name='wr_period', value=wrperiod,format='int') - - if self.specGraphftpRTIplot.isChecked(): - - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - - if self.specGraphCebCoherencmap.isChecked() or self.specGraphSaveCoherencemap.isChecked(): - - opObj = puObj.addOperation(name='CoherenceMap', optype='other') - opObj.addParameter(name='id', value=opObj.id, format='int') - - if trange: - - if not isFloatRange(trange): - self.console.append("Invalid value [%s] for 'Graphic:Time-Range" %(trange)) - return 0 - - zvalueList = trange.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='xmin', value=value1, format='float') - opObj.addParameter(name='xmax', value=value2, format='float') - - if hei_range: - - if not isFloatRange(hei_range): - self.console.append("Invalid value [%s] for 'Graphic:Height-Range" %(hei_range)) - return 0 - - yvalueList = hei_range.split(",") - value1 = float(yvalueList[0]) - value2 = float(yvalueList[1]) - - opObj.addParameter(name='ymin', value=value1, format='float') - opObj.addParameter(name='ymax', value=value2, format='float') - - if magrange: - - if not isFloatRange(magrange): - self.console.append("Invalid value [%s] for 'Graphic:Magnitud-Range" %(magrange)) - return 0 - - zvalueList = magrange.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='zmin', value=value1, format='float') - opObj.addParameter(name='zmax', value=value2, format='float') - - if phaserange: - - if not isFloatRange(phaserange): - self.console.append("Invalid value [%s] for 'Graphic:Phase-Range" %(phaserange)) - return 0 - - zvalueList = phaserange.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='phase_min', value=value1, format='float') - opObj.addParameter(name='phase_max', value=value2, format='float') - - if not self.specGraphCebCoherencmap.isChecked(): - opObj.addParameter(name='show', value=0 , format='bool') - - if self.specGraphSaveCoherencemap.isChecked(): - checkPath = True - opObj.addParameter(name='save', value='1', format='bool') - opObj.addParameter(name='figpath', value=figpath, format='str') - if figfile: - opObj.addParameter(name='figfile', value=value, format='str') - if wrperiod: - opObj.addParameter(name='wr_period', value=wrperiod,format='int') - - if self.specGraphftpCoherencemap.isChecked(): - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - - if self.specGraphPowerprofile.isChecked() or self.specGraphSavePowerprofile.isChecked(): - - opObj = puObj.addOperation(name='PowerProfilePlot', optype='other') - opObj.addParameter(name='id', value=opObj.id, format='int') - - if channelList: - - if not isList(channelList): - self.console.append("Invalid value [%s] for 'Graphic:ChannelList" %(channelList)) - return 0 - - opObj.addParameter(name='channelList', value=channelList, format='intlist') - - if hei_range: - - if not isFloatRange(hei_range): - self.console.append("Invalid value [%s] for 'Graphic:Height-Range" %(hei_range)) - return 0 - - yvalueList = hei_range.split(",") - value1 = float(yvalueList[0]) - value2 = float(yvalueList[1]) - - opObj.addParameter(name='ymin', value=value1, format='float') - opObj.addParameter(name='ymax', value=value2, format='float') - - if db_range: - - if not isFloatRange(db_range): - self.console.append("Invalid value [%s] for 'Graphic:dB-Range" %(db_range)) - return 0 - - zvalueList = db_range.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='xmin', value=value1, format='float') - opObj.addParameter(name='xmax', value=value2, format='float') - - if not self.specGraphPowerprofile.isChecked(): - opObj.addParameter(name='show', value=0 , format='bool') - - if self.specGraphSavePowerprofile.isChecked(): - checkPath = True - opObj.addParameter(name='save', value='1', format='bool') - opObj.addParameter(name='figpath', value=figpath, format='str') - if figfile: - opObj.addParameter(name='figfile', value=value, format='str') - if wrperiod: - opObj.addParameter(name='wr_period', value=wrperiod,format='int') - - if self.specGraphftpPowerprofile.isChecked(): - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - # rti noise - - if self.specGraphCebRTInoise.isChecked() or self.specGraphSaveRTInoise.isChecked(): - - opObj = puObj.addOperation(name='Noise', optype='other') - opObj.addParameter(name='id', value=opObj.id, format='int') - - if channelList: - - if not isList(channelList): - self.console.append("Invalid value [%s] for 'Graphic:ChannelList" %(channelList)) - return 0 - - opObj.addParameter(name='channelList', value=channelList, format='intlist') - - if trange: - - if not isFloatRange(trange): - self.console.append("Invalid value [%s] for 'Graphic:Time-Range" %(trange)) - return 0 - - zvalueList = trange.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='xmin', value=value1, format='float') - opObj.addParameter(name='xmax', value=value2, format='float') - - if db_range: - - if not isFloatRange(db_range): - self.console.append("Invalid value [%s] for 'Graphic:dB-Range" %(db_range)) - return 0 - - zvalueList = db_range.split(",") - value1 = float(zvalueList[0]) - value2 = float(zvalueList[1]) - - opObj.addParameter(name='ymin', value=value1, format='float') - opObj.addParameter(name='ymax', value=value2, format='float') - - if not self.specGraphCebRTInoise.isChecked(): - opObj.addParameter(name='show', value=0 , format='bool') - - if self.specGraphSaveRTInoise.isChecked(): - checkPath = True - opObj.addParameter(name='save', value='1', format='bool') - opObj.addParameter(name='figpath', value=figpath, format='str') - if figfile: - opObj.addParameter(name='figfile', value=value, format='str') - if wrperiod: - opObj.addParameter(name='wr_period', value=wrperiod,format='int') - - # test_ftp - if self.specGraphftpRTInoise.isChecked(): - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - - if checkPath: - if not figpath: - self.console.clear() - self.console.append("Graphic path should be defined") - return 0 - - if addFTP and not figpath: - self.console.clear() - self.console.append("You have to save the plots before sending them to FTP Server") - return 0 - - self.console.clear() - -# if something happend - parms_ok, output_path, blocksperfile, profilesperblock = self.checkInputsPUSave(datatype='Spectra') - if parms_ok: - opObj = puObj.addOperation(name='SpectraWriter', optype='other') - opObj.addParameter(name='path', value=output_path) - opObj.addParameter(name='blocksPerFile', value=blocksperfile, format='int') - - try: - self.refreshPUProperties(puObj) - except: - self.console.append("An error reading input parameters was found ... Check them!") - return 0 - - self.console.append("Save your project and press Play button to start signal processing") - - self._enable_play_button() - self._enable_save_button() - - return 1 - - - @pyqtSignature("") - def on_specGraphClear_clicked(self): - - self.console.clear() - - """ - Spectra Graph - """ - @pyqtSignature("int") - def on_specGraphCebSpectraplot_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - - - @pyqtSignature("int") - def on_specGraphCebCrossSpectraplot_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - - @pyqtSignature("int") - def on_specGraphCebRTIplot_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - - - @pyqtSignature("int") - def on_specGraphCebRTInoise_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - - - @pyqtSignature("int") - def on_specGraphCebCoherencmap_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - - @pyqtSignature("int") - def on_specGraphPowerprofile_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - - @pyqtSignature("int") - def on_specGraphPhase_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - - @pyqtSignature("int") - def on_specGraphSaveSpectra_stateChanged(self, p0): - """ - """ - self.__checkSpecGraphFilters() - self.__checkSpecGraphSaving() - - @pyqtSignature("int") - def on_specGraphSaveCross_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - self.__checkSpecGraphSaving() - - @pyqtSignature("int") - def on_specGraphSaveRTIplot_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - self.__checkSpecGraphSaving() - - @pyqtSignature("int") - def on_specGraphSaveRTInoise_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - self.__checkSpecGraphSaving() - - @pyqtSignature("int") - def on_specGraphSaveCoherencemap_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - self.__checkSpecGraphSaving() - - @pyqtSignature("int") - def on_specGraphSavePowerprofile_stateChanged(self, p0): - - self.__checkSpecGraphFilters() - self.__checkSpecGraphSaving() - - @pyqtSignature("int") - def on_specGraphftpSpectra_stateChanged(self, p0): - """ - """ - self.__checkSpecGraphFTP() - - - @pyqtSignature("int") - def on_specGraphftpCross_stateChanged(self, p0): - - self.__checkSpecGraphFTP() - - @pyqtSignature("int") - def on_specGraphftpRTIplot_stateChanged(self, p0): - - self.__checkSpecGraphFTP() - - @pyqtSignature("int") - def on_specGraphftpRTInoise_stateChanged(self, p0): - - self.__checkSpecGraphFTP() - - @pyqtSignature("int") - def on_specGraphftpCoherencemap_stateChanged(self, p0): - - self.__checkSpecGraphFTP() - - @pyqtSignature("int") - def on_specGraphftpPowerprofile_stateChanged(self, p0): - - self.__checkSpecGraphFTP() - - @pyqtSignature("") - def on_specGraphToolPath_clicked(self): - """ - """ - save_path = str(QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)) - self.specGraphPath.setText(save_path) - if not os.path.exists(save_path): - self.console.clear() - self.console.append("Write a valid path") - return - - @pyqtSignature("") - def on_specHeisGraphToolPath_clicked(self): - """ - """ - save_path = str(QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)) - self.specHeisGraphPath.setText(save_path) - if not os.path.exists(save_path): - self.console.clear() - self.console.append("Write a valid path") - return - - @pyqtSignature("int") - def on_specHeisOpCebIncoherent_stateChanged(self, p0): - """ - Habilita la opcion de a�adir el par�metro integraciones incoherentes a la Unidad de Procesamiento . - """ - if p0 == 2: - self.specHeisOpIncoherent.setEnabled(True) - self.specHeisOpCobIncInt.setEnabled(True) - if p0 == 0: - self.specHeisOpIncoherent.setEnabled(False) - self.specHeisOpCobIncInt.setEnabled(False) - - @pyqtSignature("") - def on_specHeisOpOk_clicked(self): - """ - AÑADE OPERACION SPECTRAHEIS - """ - addFTP = False - checkPath = False - - self._disable_play_button() - self._disable_save_button() - - self.console.clear() - self.console.append("Checking input parameters ...") - - puObj = self.getSelectedItemObj() - puObj.removeOperations() - - if self.specHeisOpCebIncoherent.isChecked(): - value = str(self.specHeisOpIncoherent.text()) - name_operation = 'IncohInt4SpectraHeis' - optype = 'other' - - name_parameter = 'timeInterval' - format = 'float' - - if self.specOpCobIncInt.currentIndex() == 0: - name_parameter = 'timeInterval' - format = 'float' - - if not isFloat(value): - self.console.append("Invalid value '%s' for '%s'" %(value, name_parameter)) - return 0 - - opObj = puObj.addOperation(name=name_operation, optype=optype) - - if not opObj.addParameter(name=name_parameter, value=value, format=format): - self.console.append("Invalid value '%s' for '%s'" %(value, name_parameter)) - return 0 - - channelList = str(self.specHeisGgraphChannelList.text()) - freq_range = str(self.specHeisGgraphXminXmax.text()) - power_range = str(self.specHeisGgraphYminYmax.text()) - time_range = str(self.specHeisGgraphTminTmax.text()) - timerange = str(self.specHeisGgraphTimeRange.text()) - - if self.specHeisGraphCebSpectraplot.isChecked(): - - name_operation = 'SpectraHeisScope' - optype = 'other' - opObj = puObj.addOperation(name=name_operation, optype=optype) - - name_parameter = 'id' - format = 'int' - value = opObj.id - - if not opObj.addParameter(name=name_parameter, value=value, format=format): - self.console.append("Invalid value '%s' for '%s'" %(value, name_parameter)) - return 0 - - if not (channelList == ''): - name_parameter = 'channelList' - format = 'intlist' - - if not isList(channelList): - self.console.append("Invalid value '%s' for '%s'" %(channelList, name_parameter)) - return 0 - - opObj.addParameter(name=name_parameter, value=channelList, format=format) - - if not freq_range == '': - xvalueList = freq_range.split(',') - - if len(xvalueList) != 2: - self.console.append("Invalid value '%s' for '%s'" %(freq_range, "xrange")) - return 0 - - value1 = xvalueList[0] - value2 = xvalueList[1] - - if not isFloat(value1) or not isFloat(value2): - self.console.append("Invalid value '%s' for '%s'" %(freq_range, "xrange")) - return 0 - - name1 = 'xmin' - name2 = 'xmax' - format = 'float' - - opObj.addParameter(name=name1, value=value1, format=format) - opObj.addParameter(name=name2, value=value2, format=format) - - if not power_range == '': - yvalueList = power_range.split(",") - - if len(yvalueList) != 2: - self.console.append("Invalid value '%s' for '%s'" %(power_range, "xrange")) - return 0 - - value1 = yvalueList[0] - value2 = yvalueList[1] - - if not isFloat(value1) or not isFloat(value2): - self.console.append("Invalid value '%s' for '%s'" %(power_range, "yrange")) - return 0 - - name1 = 'ymin' - name2 = 'ymax' - format = 'float' - opObj.addParameter(name=name1, value=value1, format=format) - opObj.addParameter(name=name2, value=value2, format=format) - - if self.specHeisGraphSaveSpectra.isChecked(): - checkPath = True - name_parameter1 = 'save' - name_parameter2 = 'figpath' - name_parameter3 = 'figfile' - value1 = '1' - value2 = str(self.specHeisGraphPath.text()) - value3 = str(self.specHeisGraphPrefix.text()) - format1 = 'bool' - format2 = 'str' - opObj.addParameter(name=name_parameter1, value=value1 , format=format1) - opObj.addParameter(name=name_parameter2, value=value2, format=format2) - if not value3 == "": - try: - value3 = str(self.specHeisGraphPrefix.text()) - except: - self.console.clear() - self.console.append("Please Write prefix") - return 0 - opObj.addParameter(name='figfile', value=str(self.specHeisGraphPrefix.text()), format='str') - - # opObj.addParameter(name=name_parameter3, value=value3, format=format2) - # opObj.addParameter(name='wr_period', value='5',format='int') - - if self.specHeisGraphftpSpectra.isChecked(): - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - - if self.specHeisGraphCebRTIplot.isChecked(): - name_operation = 'RTIfromSpectraHeis' - optype = 'other' - - name_parameter = 'id' - format = 'int' - - opObj = puObj.addOperation(name=name_operation, optype=optype) - value = opObj.id - opObj.addParameter(name=name_parameter, value=value, format=format) - - if not channelList == '': - opObj.addParameter(name='channelList', value=channelList, format='intlist') - - if not time_range == '': - xvalueList = time_range.split(',') - try: - value = float(xvalueList[0]) - value = float(xvalueList[1]) - except: - return 0 - format = 'float' - opObj.addParameter(name='xmin', value=xvalueList[0], format=format) - opObj.addParameter(name='xmax', value=xvalueList[1], format=format) - - if not timerange == '': - format = 'int' - try: - timerange = int(timerange) - except: - return 0 - opObj.addParameter(name='timerange', value=timerange, format=format) - - - if not power_range == '': - yvalueList = power_range.split(",") - try: - value = float(yvalueList[0]) - value = float(yvalueList[1]) - except: - return 0 - - format = 'float' - opObj.addParameter(name='ymin', value=yvalueList[0], format=format) - opObj.addParameter(name='ymax', value=yvalueList[1], format=format) - - if self.specHeisGraphSaveRTIplot.isChecked(): - checkPath = True - opObj.addParameter(name='save', value='1', format='bool') - opObj.addParameter(name='figpath', value=str(self.specHeisGraphPath.text()), format='str') - value = str(self.specHeisGraphPrefix.text()) - if not value == "": - try: - value = str(self.specHeisGraphPrefix.text()) - except: - self.console.clear() - self.console.append("Please Write prefix") - return 0 - opObj.addParameter(name='figfile', value=value, format='str') - - # test_ftp - if self.specHeisGraphftpRTIplot.isChecked(): - opObj.addParameter(name='ftp', value='1', format='int') - self.addFTPConf2Operation(puObj, opObj) - addFTP = True - - localfolder = None - if checkPath: - localfolder = str(self.specHeisGraphPath.text()) - if localfolder == '': - self.console.clear() - self.console.append("Graphic path should be defined") - return 0 - - if addFTP and not localfolder: - self.console.clear() - self.console.append("You should save plots before send them to FTP Server") - return 0 - - # if something happened - parms_ok, output_path, blocksperfile, metadata_file = self.checkInputsPUSave(datatype='SpectraHeis') - if parms_ok: - name_operation = 'FitsWriter' - optype = 'other' - name_parameter1 = 'path' - name_parameter2 = 'dataBlocksPerFile' - name_parameter3 = 'metadatafile' - value1 = output_path - value2 = blocksperfile - value3 = metadata_file - format2 = "int" - format3 = "str" - opObj = puObj.addOperation(name=name_operation, optype=optype) - - opObj.addParameter(name=name_parameter1, value=value1) - - if blocksperfile: - opObj.addParameter(name=name_parameter2, value=value2, format=format2) - - if metadata_file: - opObj.addParameter(name=name_parameter3, value=value3, format=format3) - - self.console.clear() - try: - self.refreshPUProperties(puObj) - except: - self.console.append("An error reading input parameters was found ... Check them!") - return 0 - - self.console.append("Save your project and press Play button to start signal processing") - - self._enable_save_button() - self._enable_play_button() - - return 1 - - @pyqtSignature("") - def on_specHeisGraphClear_clicked(self): - - self.console.clear() - - @pyqtSignature("int") - def on_specHeisGraphCebSpectraplot_stateChanged(self, p0): - - if p0 == 2: - self.specHeisGgraphChannelList.setEnabled(True) - self.specHeisGgraphXminXmax.setEnabled(True) - self.specHeisGgraphYminYmax.setEnabled(True) - if p0 == 0: - self.specHeisGgraphXminXmax.setEnabled(False) - self.specHeisGgraphYminYmax.setEnabled(False) - - @pyqtSignature("int") - def on_specHeisGraphCebRTIplot_stateChanged(self, p0): - - if p0 == 2: - self.specHeisGgraphChannelList.setEnabled(True) - self.specHeisGgraphTminTmax.setEnabled(True) - self.specHeisGgraphYminYmax.setEnabled(True) - self.specHeisGgraphTimeRange.setEnabled(True) - - if p0 == 0: - self.specHeisGgraphTminTmax.setEnabled(False) - self.specHeisGgraphYminYmax.setEnabled(False) - self.specHeisGgraphTimeRange.setEnabled(False) - - @pyqtSignature("int") - def on_specHeisGraphSaveSpectra_stateChanged(self, p0): - """ - """ - if p0 == 2: - self.specHeisGraphPath.setEnabled(True) - self.specHeisGraphPrefix.setEnabled(True) - self.specHeisGraphToolPath.setEnabled(True) - if p0 == 0: - self.specHeisGraphPath.setEnabled(False) - self.specHeisGraphPrefix.setEnabled(False) - self.specHeisGraphToolPath.setEnabled(False) - - @pyqtSignature("int") - def on_specHeisGraphSaveRTIplot_stateChanged(self, p0): - if p0 == 2: - self.specHeisGraphPath.setEnabled(True) - self.specHeisGraphPrefix.setEnabled(True) - self.specHeisGraphToolPath.setEnabled(True) - - @pyqtSignature("int") - def on_specHeisGraphftpSpectra_stateChanged(self, p0): - """ - """ - if p0 == 2: - self.specHeisGgraphftpratio.setEnabled(True) - - if p0 == 0: - self.specHeisGgraphftpratio.setEnabled(False) - - @pyqtSignature("int") - def on_specHeisGraphftpRTIplot_stateChanged(self, p0): - if p0 == 2: - self.specHeisGgraphftpratio.setEnabled(True) - - def __checkSpecGraphSaving(self): - - enable = False - - if self.specGraphSaveSpectra.checkState(): - enable = True - - if self.specGraphSaveCross.checkState(): - enable = True - - if self.specGraphSaveRTIplot.checkState(): - enable = True - - if self.specGraphSaveCoherencemap.checkState(): - enable = True - - if self.specGraphSavePowerprofile.checkState(): - enable = True - - if self.specGraphSaveRTInoise.checkState(): - enable = True - - self.specGraphPath.setEnabled(enable) - self.specGraphPrefix.setEnabled(enable) - self.specGraphToolPath.setEnabled(enable) - - self.specGgraphftpratio.setEnabled(enable) - - def __checkSpecGraphFTP(self): - - enable = False - - if self.specGraphftpSpectra.checkState(): - enable = True - - if self.specGraphftpCross.checkState(): - enable = True - - if self.specGraphftpRTIplot.checkState(): - enable = True - - if self.specGraphftpCoherencemap.checkState(): - enable = True - - if self.specGraphftpPowerprofile.checkState(): - enable = True - - if self.specGraphftpRTInoise.checkState(): - enable = True - -# self.specGgraphftpratio.setEnabled(enable) - - def __checkSpecGraphFilters(self): - - freq = False - height = False - db = False - timerange = False - magnitud = False - phase = False - channelList = False - - if self.specGraphCebSpectraplot.checkState() or self.specGraphSaveSpectra.checkState(): - freq = True - height = True - db = True - channelList = True - - if self.specGraphCebCrossSpectraplot.checkState() or self.specGraphSaveCross.checkState(): - freq = True - height = True - db = True - magnitud = True - phase = True - - if self.specGraphCebRTIplot.checkState() or self.specGraphSaveRTIplot.checkState(): - height = True - db = True - timerange = True - channelList = True - - if self.specGraphCebCoherencmap.checkState() or self.specGraphSaveCoherencemap.checkState(): - height = True - timerange = True - magnitud = True - phase = True - - if self.specGraphPowerprofile.checkState() or self.specGraphSavePowerprofile.checkState(): - height = True - db = True - channelList = True - - if self.specGraphCebRTInoise.checkState() or self.specGraphSaveRTInoise.checkState(): - db = True - timerange = True - channelList = True - - - self.specGgraphFreq.setEnabled(freq) - self.specGgraphHeight.setEnabled(height) - self.specGgraphDbsrange.setEnabled(db) - self.specGgraphTminTmax.setEnabled(timerange) - self.specGgraphTimeRange.setEnabled(timerange) - - self.specGgraphmagnitud.setEnabled(magnitud) - self.specGgraphPhase.setEnabled(phase) - self.specGgraphChannelList.setEnabled(channelList) - - def __getParmsFromProjectWindow(self): - """ - Check Inputs Project: - - project_name - - datatype - - ext - - data_path - - readmode - - delay - - set - - walk - """ - parms_ok = True - - project_name = str(self.proName.text()) - - if project_name == '' or project_name == None: - outputstr = "Enter a project Name" - self.console.append(outputstr) - parms_ok = False - project_name = None - - description = str(self.proDescription.toPlainText()) - - datatype = str(self.proComDataType.currentText()) - - ext = str(self.proDataType.text()) - - dpath = str(self.proDataPath.text()) - - if dpath == '': - outputstr = 'Datapath is empty' - self.console.append(outputstr) - parms_ok = False - dpath = None - - if dpath != None: - if not os.path.isdir(dpath): - outputstr = 'Datapath (%s) does not exist' % dpath - self.console.append(outputstr) - parms_ok = False - dpath = None - - online = int(self.proComReadMode.currentIndex()) - - delay = None - if online==1: - try: - delay = int(str(self.proDelay.text())) - except: - outputstr = 'Delay value (%s) must be a integer number' %str(self.proDelay.text()) - self.console.append(outputstr) - parms_ok = False - - - set = None - value = str(self.proSet.text()) - try: - set = int(value) - except: - pass - - ippKm = None - - value = str(self.proIPPKm.text()) - - try: - ippKm = float(value) - except: - if datatype=="USRP": - outputstr = 'IPP value "%s" must be a float number' % str(self.proIPPKm.text()) - self.console.append(outputstr) - parms_ok = False - - walk = int(self.proComWalk.currentIndex()) - expLabel = str(self.proExpLabel.text()) - - startDate = str(self.proComStartDate.currentText()).strip() - endDate = str(self.proComEndDate.currentText()).strip() - - if not startDate: - parms_ok = False - - if not endDate: - parms_ok = False - -# startDateList = startDate.split("/") -# endDateList = endDate.split("/") -# -# startDate = datetime.date(int(startDateList[0]), int(startDateList[1]), int(startDateList[2])) -# endDate = datetime.date(int(endDateList[0]), int(endDateList[1]), int(endDateList[2])) - - startTime = self.proStartTime.time() - endTime = self.proEndTime.time() - - startTime = str(startTime.toString("H:m:s")) - endTime = str(endTime.toString("H:m:s")) - - projectParms = ProjectParms() - - projectParms.name = project_name - projectParms.description = description - projectParms.datatype = datatype - projectParms.ext = ext - projectParms.dpath = dpath - projectParms.online = online - projectParms.startDate = startDate - projectParms.endDate = endDate - projectParms.startTime = startTime - projectParms.endTime = endTime - projectParms.delay = delay - projectParms.walk = walk - projectParms.expLabel = expLabel - projectParms.set = set - projectParms.ippKm = ippKm - projectParms.parmsOk = parms_ok - - return projectParms - - - def __getParmsFromProjectObj(self, projectObjView): - - parms_ok = True - - project_name, description = projectObjView.name, projectObjView.description - - readUnitObj = projectObjView.getReadUnitObj() - datatype = readUnitObj.datatype - - operationObj = readUnitObj.getOperationObj(name='run') - - dpath = operationObj.getParameterValue(parameterName='path') - startDate = operationObj.getParameterValue(parameterName='startDate') - endDate = operationObj.getParameterValue(parameterName='endDate') - - startDate = startDate.strftime("%Y/%m/%d") - endDate = endDate.strftime("%Y/%m/%d") - - startTime = operationObj.getParameterValue(parameterName='startTime') - endTime = operationObj.getParameterValue(parameterName='endTime') - - startTime = startTime.strftime("%H:%M:%S") - endTime = endTime.strftime("%H:%M:%S") - - online = 0 - try: - online = operationObj.getParameterValue(parameterName='online') - except: - pass - - delay = '' - try: - delay = operationObj.getParameterValue(parameterName='delay') - except: - pass - - walk = 0 - try: - walk = operationObj.getParameterValue(parameterName='walk') - except: - pass - - set = '' - try: - set = operationObj.getParameterValue(parameterName='set') - except: - pass - - expLabel = '' - try: - expLabel = operationObj.getParameterValue(parameterName='expLabel') - except: - pass - - ippKm = '' - if datatype.lower() == 'usrp': - try: - ippKm = operationObj.getParameterValue(parameterName='ippKm') - except: - pass - - projectParms = ProjectParms() - - projectParms.name = project_name - projectParms.description = description - projectParms.datatype = datatype - projectParms.ext = None - projectParms.dpath = dpath - projectParms.online = online - projectParms.startDate = startDate - projectParms.endDate = endDate - projectParms.startTime = startTime - projectParms.endTime = endTime - projectParms.delay=delay - projectParms.walk=walk - projectParms.set=set - projectParms.ippKm=ippKm - projectParms.expLabel = expLabel - projectParms.parmsOk=parms_ok - - return projectParms - - def refreshProjectWindow(self, projectObjView): - - self.proOk.setEnabled(False) - - projectParms = self.__getParmsFromProjectObj(projectObjView) - - index = projectParms.getDatatypeIndex() - - self.proName.setText(projectParms.name) - self.proDescription.clear() - self.proDescription.append(projectParms.description) - - self.on_proComDataType_activated(index=index) - self.proDataPath.setText(projectParms.dpath) - self.proComDataType.setCurrentIndex(index) - self.proComReadMode.setCurrentIndex(projectParms.online) - self.proDelay.setText(str(projectParms.delay)) - self.proSet.setText(str(projectParms.set)) - self.proIPPKm.setText(str(projectParms.ippKm)) - self.proComWalk.setCurrentIndex(projectParms.walk) - self.proExpLabel.setText(str(projectParms.expLabel).strip()) - - self.on_proComReadMode_activated(projectParms.online) - self.on_proComWalk_activated(projectParms.walk) - - dateList = self.loadDays(data_path = projectParms.dpath, - ext = projectParms.getExt(), - walk = projectParms.walk, - expLabel = projectParms.expLabel) - - if not dateList: - return 0 - - try: - startDateIndex = dateList.index(projectParms.startDate) - except: - startDateIndex = 0 - - try: - endDateIndex = dateList.index(projectParms.endDate) - except: - endDateIndex = int(self.proComEndDate.count()-1) - - self.proComStartDate.setCurrentIndex(startDateIndex) - self.proComEndDate.setCurrentIndex(endDateIndex) - - startlist = projectParms.startTime.split(":") - endlist = projectParms.endTime.split(":") - - self.time.setHMS(int(startlist[0]), int(startlist[1]), int(startlist[2])) - self.proStartTime.setTime(self.time) - - self.time.setHMS(int(endlist[0]), int(endlist[1]), int(endlist[2])) - self.proEndTime.setTime(self.time) - - self.proOk.setEnabled(True) - - return 1 - - def __refreshVoltageWindow(self, puObj): - - opObj = puObj.getOperationObj(name='setRadarFrequency') - if opObj == None: - self.volOpRadarfrequency.clear() - self.volOpCebRadarfrequency.setCheckState(0) - else: - value = opObj.getParameterValue(parameterName='frequency') - value = str(float(value)/1e6) - self.volOpRadarfrequency.setText(value) - self.volOpRadarfrequency.setEnabled(True) - self.volOpCebRadarfrequency.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="selectChannels") - - if opObj == None: - opObj = puObj.getOperationObj(name="selectChannelsByIndex") - - if opObj == None: - self.volOpChannel.clear() - self.volOpCebChannels.setCheckState(0) - else: - channelEnabled = False - try: - value = opObj.getParameterValue(parameterName='channelList') - value = str(value)[1:-1] - channelEnabled = True - channelMode = 0 - except: - pass - try: - value = opObj.getParameterValue(parameterName='channelIndexList') - value = str(value)[1:-1] - channelEnabled = True - channelMode = 1 - except: - pass - - if channelEnabled: - self.volOpChannel.setText(value) - self.volOpChannel.setEnabled(True) - self.volOpCebChannels.setCheckState(QtCore.Qt.Checked) - self.volOpComChannels.setCurrentIndex(channelMode) - - opObj = puObj.getOperationObj(name="selectHeights") - if opObj == None: - self.volOpHeights.clear() - self.volOpCebHeights.setCheckState(0) - else: - value1 = str(opObj.getParameterValue(parameterName='minHei')) - value2 = str(opObj.getParameterValue(parameterName='maxHei')) - value = value1 + "," + value2 - self.volOpHeights.setText(value) - self.volOpHeights.setEnabled(True) - self.volOpCebHeights.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="SplitProfiles") - if opObj == None: - self.volOpSplitter.clear() - self.volOpCebSplitter.setCheckState(0) - else: - value = opObj.getParameterValue(parameterName='n') - value = str(value) - self.volOpSplitter.setText(value) - self.volOpSplitter.setEnabled(True) - self.volOpCebSplitter.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="CombineProfiles") - if opObj == None: - self.volOpCombiner.clear() - self.volOpCebCombiner.setCheckState(0) - else: - value = opObj.getParameterValue(parameterName='n') - value = str(value) - self.volOpCombiner.setText(value) - self.volOpCombiner.setEnabled(True) - self.volOpCebCombiner.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="filterByHeights") - if opObj == None: - self.volOpFilter.clear() - self.volOpCebFilter.setCheckState(0) - else: - value = opObj.getParameterValue(parameterName='window') - value = str(value) - self.volOpFilter.setText(value) - self.volOpFilter.setEnabled(True) - self.volOpCebFilter.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="ProfileSelector") - if opObj == None: - self.volOpProfile.clear() - self.volOpCebProfile.setCheckState(0) - else: - for parmObj in opObj.getParameterObjList(): - - if parmObj.name == "profileList": - value = parmObj.getValue() - value = str(value)[1:-1] - self.volOpProfile.setText(value) - self.volOpProfile.setEnabled(True) - self.volOpCebProfile.setCheckState(QtCore.Qt.Checked) - self.volOpComProfile.setCurrentIndex(0) - - if parmObj.name == "profileRangeList": - value = parmObj.getValue() - value = str(value)[1:-1] - self.volOpProfile.setText(value) - self.volOpProfile.setEnabled(True) - self.volOpCebProfile.setCheckState(QtCore.Qt.Checked) - self.volOpComProfile.setCurrentIndex(1) - - if parmObj.name == "rangeList": - value = parmObj.getValue() - value = str(value)[1:-1] - self.volOpProfile.setText(value) - self.volOpProfile.setEnabled(True) - self.volOpCebProfile.setCheckState(QtCore.Qt.Checked) - self.volOpComProfile.setCurrentIndex(2) - - opObj = puObj.getOperationObj(name="Decoder") - self.volOpCode.setText("") - if opObj == None: - self.volOpCebDecodification.setCheckState(0) - else: - self.volOpCebDecodification.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj('code') - - if parmObj == None: - self.volOpComCode.setCurrentIndex(0) - else: - - parmObj1 = opObj.getParameterObj('nCode') - parmObj2 = opObj.getParameterObj('nBaud') - - if parmObj1 == None or parmObj2 == None: - self.volOpComCode.setCurrentIndex(0) - else: - code = ast.literal_eval(str(parmObj.getValue())) - nCode = parmObj1.getValue() - nBaud = parmObj2.getValue() - - code = numpy.asarray(code).reshape((nCode, nBaud)).tolist() - - #User defined by default - self.volOpComCode.setCurrentIndex(13) - self.volOpCode.setText(str(code)) - - if nCode == 1: - if nBaud == 3: - self.volOpComCode.setCurrentIndex(1) - if nBaud == 4: - self.volOpComCode.setCurrentIndex(2) - if nBaud == 5: - self.volOpComCode.setCurrentIndex(3) - if nBaud == 7: - self.volOpComCode.setCurrentIndex(4) - if nBaud == 11: - self.volOpComCode.setCurrentIndex(5) - if nBaud == 13: - self.volOpComCode.setCurrentIndex(6) - - if nCode == 2: - if nBaud == 3: - self.volOpComCode.setCurrentIndex(7) - if nBaud == 4: - self.volOpComCode.setCurrentIndex(8) - if nBaud == 5: - self.volOpComCode.setCurrentIndex(9) - if nBaud == 7: - self.volOpComCode.setCurrentIndex(10) - if nBaud == 11: - self.volOpComCode.setCurrentIndex(11) - if nBaud == 13: - self.volOpComCode.setCurrentIndex(12) - - - opObj = puObj.getOperationObj(name="deFlip") - if opObj == None: - self.volOpFlip.clear() - self.volOpFlip.setEnabled(False) - self.volOpCebFlip.setCheckState(0) - else: - try: - value = opObj.getParameterValue(parameterName='channelList') - value = str(value)[1:-1] - except: - value = "" - - self.volOpFlip.setText(value) - self.volOpFlip.setEnabled(True) - self.volOpCebFlip.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="CohInt") - if opObj == None: - self.volOpCohInt.clear() - self.volOpCebCohInt.setCheckState(0) - else: - value = opObj.getParameterValue(parameterName='n') - self.volOpCohInt.setText(str(value)) - self.volOpCohInt.setEnabled(True) - self.volOpCebCohInt.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name='Scope') - if opObj == None: - self.volGraphCebshow.setCheckState(0) - else: - self.volGraphCebshow.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='channelList') - - if parmObj == None: - self.volGraphChannelList.clear() - else: - value = parmObj.getValue() - value = str(value) - self.volGraphChannelList.setText(value) -# self.volOpChannel.setEnabled(True) - - parmObj1 = opObj.getParameterObj(parameterName='ymin') - parmObj2 = opObj.getParameterObj(parameterName='ymax') - - if parmObj1 == None or parmObj2 ==None: - self.volGraphIntensityRange.clear() - else: - value1 = parmObj1.getValue() - value1 = str(value1) - value2 = parmObj2.getValue() - value2 = str(value2) - value = value1 + "," + value2 - self.volGraphIntensityRange.setText(value) - - parmObj1 = opObj.getParameterObj(parameterName='xmin') - parmObj2 = opObj.getParameterObj(parameterName='xmax') - - if parmObj1 == None or parmObj2 ==None: - self.volGraphHeightrange.clear() - else: - value1 = parmObj1.getValue() - value1 = str(value1) - value2 = parmObj2.getValue() - value2 = str(value2) - value = value1 + "," + value2 - value2 = str(value2) - self.volGraphHeightrange.setText(value) - - parmObj = opObj.getParameterObj(parameterName='type') - - if parmObj == None: - self.volComScopeType.setCurrentIndex(0) - else: - value = parmObj.getValue() - if value == "iq": - self.volComScopeType.setCurrentIndex(0) - if value == "power": - self.volComScopeType.setCurrentIndex(1) - - parmObj = opObj.getParameterObj(parameterName='save') - - if parmObj == None: - self.volGraphCebSave.setCheckState(QtCore.Qt.Unchecked) - else: - value = parmObj.getValue() - if value: - self.volGraphCebSave.setCheckState(QtCore.Qt.Checked) - else: - self.volGraphCebSave.setCheckState(QtCore.Qt.Unchecked) - - parmObj = opObj.getParameterObj(parameterName='figpath') - if parmObj == None: - self.volGraphPath.clear() - else: - value = parmObj.getValue() - path = str(value) - self.volGraphPath.setText(path) - - parmObj = opObj.getParameterObj(parameterName='figfile') - if parmObj == None: - self.volGraphPrefix.clear() - else: - value = parmObj.getValue() - figfile = str(value) - self.volGraphPrefix.setText(figfile) - - # outputVoltageWrite - opObj = puObj.getOperationObj(name='VoltageWriter') - - if opObj == None: - self.volOutputPath.clear() - self.volOutputblocksperfile.clear() - self.volOutputprofilesperblock.clear() - else: - parmObj = opObj.getParameterObj(parameterName='path') - if parmObj == None: - self.volOutputPath.clear() - else: - value = parmObj.getValue() - path = str(value) - self.volOutputPath.setText(path) - - parmObj = opObj.getParameterObj(parameterName='blocksPerFile') - if parmObj == None: - self.volOutputblocksperfile.clear() - else: - value = parmObj.getValue() - blocksperfile = str(value) - self.volOutputblocksperfile.setText(blocksperfile) - - parmObj = opObj.getParameterObj(parameterName='profilesPerBlock') - if parmObj == None: - self.volOutputprofilesperblock.clear() - else: - value = parmObj.getValue() - profilesPerBlock = str(value) - self.volOutputprofilesperblock.setText(profilesPerBlock) - - return - - def __refreshSpectraWindow(self, puObj): - - inputId = puObj.getInputId() - inputPUObj = self.__puObjDict[inputId] - - if inputPUObj.datatype == 'Voltage': - self.specOpnFFTpoints.setEnabled(True) - self.specOpProfiles.setEnabled(True) - self.specOpippFactor.setEnabled(True) - else: - self.specOpnFFTpoints.setEnabled(False) - self.specOpProfiles.setEnabled(False) - self.specOpippFactor.setEnabled(False) - - opObj = puObj.getOperationObj(name='setRadarFrequency') - if opObj == None: - self.specOpRadarfrequency.clear() - self.specOpCebRadarfrequency.setCheckState(0) - else: - value = opObj.getParameterValue(parameterName='frequency') - value = str(float(value)/1e6) - self.specOpRadarfrequency.setText(value) - self.specOpRadarfrequency.setEnabled(True) - self.specOpCebRadarfrequency.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="run") - if opObj == None: - self.specOpnFFTpoints.clear() - self.specOpProfiles.clear() - self.specOpippFactor.clear() - else: - parmObj = opObj.getParameterObj(parameterName='nFFTPoints') - if parmObj == None: - self.specOpnFFTpoints.clear() - else: - self.specOpnFFTpoints.setEnabled(True) - value = opObj.getParameterValue(parameterName='nFFTPoints') - self.specOpnFFTpoints.setText(str(value)) - - parmObj = opObj.getParameterObj(parameterName='nProfiles') - if parmObj == None: - self.specOpProfiles.clear() - else: - self.specOpProfiles.setEnabled(True) - value = opObj.getParameterValue(parameterName='nProfiles') - self.specOpProfiles.setText(str(value)) - - parmObj = opObj.getParameterObj(parameterName='ippFactor') - if parmObj == None: - self.specOpippFactor.clear() - else: - self.specOpippFactor.setEnabled(True) - value = opObj.getParameterValue(parameterName='ippFactor') - self.specOpippFactor.setText(str(value)) - - opObj = puObj.getOperationObj(name="run") - if opObj == None: - self.specOppairsList.clear() - self.specOpCebCrossSpectra.setCheckState(0) - else: - parmObj = opObj.getParameterObj(parameterName='pairsList') - if parmObj == None: - self.specOppairsList.clear() - self.specOpCebCrossSpectra.setCheckState(0) - else: - value = opObj.getParameterValue(parameterName='pairsList') - value = str(value)[1:-1] - self.specOppairsList.setText(str(value)) - self.specOppairsList.setEnabled(True) - self.specOpCebCrossSpectra.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="selectChannels") - - if opObj == None: - opObj = puObj.getOperationObj(name="selectChannelsByIndex") - - if opObj == None: - self.specOpChannel.clear() - self.specOpCebChannel.setCheckState(0) - else: - channelEnabled = False - try: - value = opObj.getParameterValue(parameterName='channelList') - value = str(value)[1:-1] - channelEnabled = True - channelMode = 0 - except: - pass - try: - value = opObj.getParameterValue(parameterName='channelIndexList') - value = str(value)[1:-1] - channelEnabled = True - channelMode = 1 - except: - pass - - if channelEnabled: - self.specOpChannel.setText(value) - self.specOpChannel.setEnabled(True) - self.specOpCebChannel.setCheckState(QtCore.Qt.Checked) - self.specOpComChannel.setCurrentIndex(channelMode) - - opObj = puObj.getOperationObj(name="selectHeights") - if opObj == None: - self.specOpHeights.clear() - self.specOpCebHeights.setCheckState(0) - else: - value1 = int(opObj.getParameterValue(parameterName='minHei')) - value1 = str(value1) - value2 = int(opObj.getParameterValue(parameterName='maxHei')) - value2 = str(value2) - value = value1 + "," + value2 - self.specOpHeights.setText(value) - self.specOpHeights.setEnabled(True) - self.specOpCebHeights.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name="IncohInt") - if opObj == None: - self.specOpIncoherent.clear() - self.specOpCebIncoherent.setCheckState(0) - else: - for parmObj in opObj.getParameterObjList(): - if parmObj.name == 'timeInterval': - value = opObj.getParameterValue(parameterName='timeInterval') - self.specOpIncoherent.setText(str(value)) - self.specOpIncoherent.setEnabled(True) - self.specOpCebIncoherent.setCheckState(QtCore.Qt.Checked) - self.specOpCobIncInt.setCurrentIndex(0) - - if parmObj.name == 'n': - value = opObj.getParameterValue(parameterName='n') - self.specOpIncoherent.setText(str(value)) - self.specOpIncoherent.setEnabled(True) - self.specOpCebIncoherent.setCheckState(QtCore.Qt.Checked) - self.specOpCobIncInt.setCurrentIndex(1) - - opObj = puObj.getOperationObj(name="removeDC") - if opObj == None: - self.specOpCebRemoveDC.setCheckState(0) - else: - self.specOpCebRemoveDC.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='mode') - - value = 1 - if parmObj: - value = parmObj.getValue() - - if value == 1: - self.specOpComRemoveDC.setCurrentIndex(0) - elif value == 2: - self.specOpComRemoveDC.setCurrentIndex(1) - - opObj = puObj.getOperationObj(name="removeInterference") - if opObj == None: - self.specOpCebRemoveInt.setCheckState(0) - else: - self.specOpCebRemoveInt.setCheckState(QtCore.Qt.Checked) - - opObj = puObj.getOperationObj(name='getNoise') - if opObj == None: - self.specOpCebgetNoise.setCheckState(0) - self.specOpgetNoise.clear() - else: - self.specOpCebgetNoise.setCheckState(QtCore.Qt.Checked) - parmObj = opObj.getParameterObj(parameterName='minHei') - if parmObj == None: - self.specOpgetNoise.clear() - value1 = None - else: - value1 = opObj.getParameterValue(parameterName='minHei') - value1 = str(value1) - parmObj = opObj.getParameterObj(parameterName='maxHei') - if parmObj == None: - value2 = None - value = value1 - self.specOpgetNoise.setText(value) - self.specOpgetNoise.setEnabled(True) - else: - value2 = opObj.getParameterValue(parameterName='maxHei') - value2 = str(value2) - parmObj = opObj.getParameterObj(parameterName='minVel') - if parmObj == None: - value3 = None - value = value1 + "," + value2 - self.specOpgetNoise.setText(value) - self.specOpgetNoise.setEnabled(True) - else: - value3 = opObj.getParameterValue(parameterName='minVel') - value3 = str(value3) - parmObj = opObj.getParameterObj(parameterName='maxVel') - if parmObj == None: - value4 = None - value = value1 + "," + value2 + "," + value3 - self.specOpgetNoise.setText(value) - self.specOpgetNoise.setEnabled(True) - else: - value4 = opObj.getParameterValue(parameterName='maxVel') - value4 = str(value4) - value = value1 + "," + value2 + "," + value3 + ',' + value4 - self.specOpgetNoise.setText(value) - self.specOpgetNoise.setEnabled(True) - - self.specGraphPath.clear() - self.specGraphPrefix.clear() - self.specGgraphFreq.clear() - self.specGgraphHeight.clear() - self.specGgraphDbsrange.clear() - self.specGgraphmagnitud.clear() - self.specGgraphPhase.clear() - self.specGgraphChannelList.clear() - self.specGgraphTminTmax.clear() - self.specGgraphTimeRange.clear() - self.specGgraphftpratio.clear() - - opObj = puObj.getOperationObj(name='SpectraPlot') - - if opObj == None: - self.specGraphCebSpectraplot.setCheckState(0) - self.specGraphSaveSpectra.setCheckState(0) - self.specGraphftpSpectra.setCheckState(0) - else: -# operationSpectraPlot = "Enable" - self.specGraphCebSpectraplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='show') - if parmObj: - if not parmObj.getValue(): - self.specGraphCebSpectraplot.setCheckState(0) - - parmObj = opObj.getParameterObj(parameterName='channelList') - if parmObj == None: - self.specGgraphChannelList.clear() - else: - value = opObj.getParameterValue(parameterName='channelList') - channelListSpectraPlot = str(value)[1:-1] - self.specGgraphChannelList.setText(channelListSpectraPlot) - self.specGgraphChannelList.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specGgraphFreq.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphFreq.setText(value) - self.specGgraphFreq.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specGgraphHeight.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphHeight.setText(value) - self.specGgraphHeight.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='zmin') - if parmObj == None: - self.specGgraphDbsrange.clear() - else: - value1 = opObj.getParameterValue(parameterName='zmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='zmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphDbsrange.setText(value) - self.specGgraphDbsrange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specGraphSaveSpectra.setCheckState(0) - else: - self.specGraphSaveSpectra.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specGraphftpSpectra.setCheckState(0) - else: - self.specGraphftpSpectra.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specGgraphftpratio.setText(str(value)) - - opObj = puObj.getOperationObj(name='CrossSpectraPlot') - - if opObj == None: - self.specGraphCebCrossSpectraplot.setCheckState(0) - self.specGraphSaveCross.setCheckState(0) - self.specGraphftpCross.setCheckState(0) - else: -# operationCrossSpectraPlot = "Enable" - self.specGraphCebCrossSpectraplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='show') - if parmObj: - if not parmObj.getValue(): - self.specGraphCebCrossSpectraplot.setCheckState(0) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specGgraphFreq.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphFreq.setText(value) - self.specGgraphFreq.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specGgraphHeight.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphHeight.setText(value) - self.specGgraphHeight.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='zmin') - if parmObj == None: - self.specGgraphDbsrange.clear() - else: - value1 = opObj.getParameterValue(parameterName='zmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='zmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphDbsrange.setText(value) - self.specGgraphDbsrange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='coh_min') - if parmObj == None: - self.specGgraphmagnitud.clear() - else: - value1 = opObj.getParameterValue(parameterName='coh_min') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='coh_max') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphmagnitud.setText(value) - self.specGgraphmagnitud.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='phase_min') - if parmObj == None: - self.specGgraphPhase.clear() - else: - value1 = opObj.getParameterValue(parameterName='phase_min') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='phase_max') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphPhase.setText(value) - self.specGgraphPhase.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specGraphSaveCross.setCheckState(0) - else: - self.specGraphSaveCross.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specGraphftpCross.setCheckState(0) - else: - self.specGraphftpCross.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specGgraphftpratio.setText(str(value)) - - opObj = puObj.getOperationObj(name='RTIPlot') - - if opObj == None: - self.specGraphCebRTIplot.setCheckState(0) - self.specGraphSaveRTIplot.setCheckState(0) - self.specGraphftpRTIplot.setCheckState(0) - else: - self.specGraphCebRTIplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='show') - if parmObj: - if not parmObj.getValue(): - self.specGraphCebRTIplot.setCheckState(0) - - parmObj = opObj.getParameterObj(parameterName='channelList') - if parmObj == None: - self.specGgraphChannelList.clear() - else: - value = opObj.getParameterValue(parameterName='channelList') - channelListRTIPlot = str(value)[1:-1] - self.specGgraphChannelList.setText(channelListRTIPlot) - self.specGgraphChannelList.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specGgraphTminTmax.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphTminTmax.setText(value) - self.specGgraphTminTmax.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='timerange') - if parmObj == None: - self.specGgraphTimeRange.clear() - else: - value1 = opObj.getParameterValue(parameterName='timerange') - value1 = str(value1) - self.specGgraphTimeRange.setText(value1) - self.specGgraphTimeRange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specGgraphHeight.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphHeight.setText(value) - self.specGgraphHeight.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='zmin') - if parmObj == None: - self.specGgraphDbsrange.clear() - else: - value1 = opObj.getParameterValue(parameterName='zmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='zmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphDbsrange.setText(value) - self.specGgraphDbsrange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specGraphSaveRTIplot.setCheckState(0) - else: - self.specGraphSaveRTIplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specGraphftpRTIplot.setCheckState(0) - else: - self.specGraphftpRTIplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specGgraphftpratio.setText(str(value)) - - opObj = puObj.getOperationObj(name='CoherenceMap') - - if opObj == None: - self.specGraphCebCoherencmap.setCheckState(0) - self.specGraphSaveCoherencemap.setCheckState(0) - self.specGraphftpCoherencemap.setCheckState(0) - else: -# operationCoherenceMap = "Enable" - self.specGraphCebCoherencmap.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='show') - if parmObj: - if not parmObj.getValue(): - self.specGraphCebCoherencmap.setCheckState(0) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specGgraphTminTmax.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphTminTmax.setText(value) - self.specGgraphTminTmax.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='timerange') - if parmObj == None: - self.specGgraphTimeRange.clear() - else: - value1 = opObj.getParameterValue(parameterName='timerange') - value1 = str(value1) - self.specGgraphTimeRange.setText(value1) - self.specGgraphTimeRange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specGgraphHeight.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphHeight.setText(value) - self.specGgraphHeight.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='zmin') - if parmObj == None: - self.specGgraphmagnitud.clear() - else: - value1 = opObj.getParameterValue(parameterName='zmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='zmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphmagnitud.setText(value) - self.specGgraphmagnitud.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='coh_min') - if parmObj == None: - self.specGgraphmagnitud.clear() - else: - value1 = opObj.getParameterValue(parameterName='coh_min') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='coh_max') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphmagnitud.setText(value) - self.specGgraphmagnitud.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='phase_min') - if parmObj == None: - self.specGgraphPhase.clear() - else: - value1 = opObj.getParameterValue(parameterName='phase_min') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='phase_max') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphPhase.setText(value) - self.specGgraphPhase.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specGraphSaveCoherencemap.setCheckState(0) - else: - self.specGraphSaveCoherencemap.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specGraphftpCoherencemap.setCheckState(0) - else: - self.specGraphftpCoherencemap.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specGgraphftpratio.setText(str(value)) - - opObj = puObj.getOperationObj(name='PowerProfilePlot') - - if opObj == None: - self.specGraphPowerprofile.setCheckState(0) - self.specGraphSavePowerprofile.setCheckState(0) - self.specGraphftpPowerprofile.setCheckState(0) - operationPowerProfilePlot = "Disabled" - channelList = None - freq_vel = None - heightsrange = None - else: -# operationPowerProfilePlot = "Enable" - self.specGraphPowerprofile.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='show') - if parmObj: - if not parmObj.getValue(): - self.specGraphPowerprofile.setCheckState(0) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specGgraphDbsrange.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphDbsrange.setText(value) - self.specGgraphDbsrange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specGgraphHeight.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphHeight.setText(value) - self.specGgraphHeight.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specGraphSavePowerprofile.setCheckState(0) - else: - self.specGraphSavePowerprofile.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specGraphftpPowerprofile.setCheckState(0) - else: - self.specGraphftpPowerprofile.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specGgraphftpratio.setText(str(value)) - - opObj = puObj.getOperationObj(name='Noise') - - if opObj == None: - self.specGraphCebRTInoise.setCheckState(0) - self.specGraphSaveRTInoise.setCheckState(0) - self.specGraphftpRTInoise.setCheckState(0) - else: - self.specGraphCebRTInoise.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='show') - if parmObj: - if not parmObj.getValue(): - self.specGraphCebRTInoise.setCheckState(0) - - parmObj = opObj.getParameterObj(parameterName='channelList') - if parmObj == None: - self.specGgraphChannelList.clear() - else: - value = opObj.getParameterValue(parameterName='channelList') - channelListRTINoise = str(value)[1:-1] - self.specGgraphChannelList.setText(channelListRTINoise) - self.specGgraphChannelList.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specGgraphTminTmax.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphTminTmax.setText(value) - self.specGgraphTminTmax.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='timerange') - if parmObj == None: - self.specGgraphTimeRange.clear() - else: - value1 = opObj.getParameterValue(parameterName='timerange') - value1 = str(value1) - self.specGgraphTimeRange.setText(value1) - self.specGgraphTimeRange.setEnabled(True) - - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specGgraphDbsrange.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specGgraphDbsrange.setText(value) - self.specGgraphDbsrange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specGraphSaveRTInoise.setCheckState(0) - else: - self.specGraphSaveRTInoise.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specGraphftpRTInoise.setCheckState(0) - else: - self.specGraphftpRTInoise.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specGgraphftpratio.setText(str(value)) - - opObj = puObj.getOperationObj(name='SpectraWriter') - if opObj == None: - self.specOutputPath.clear() - self.specOutputblocksperfile.clear() - else: - value = opObj.getParameterObj(parameterName='path') - if value == None: - self.specOutputPath.clear() - else: - value = opObj.getParameterValue(parameterName='path') - path = str(value) - self.specOutputPath.setText(path) - value = opObj.getParameterObj(parameterName='blocksPerFile') - if value == None: - self.specOutputblocksperfile.clear() - else: - value = opObj.getParameterValue(parameterName='blocksPerFile') - blocksperfile = str(value) - self.specOutputblocksperfile.setText(blocksperfile) - - return - - def __refreshSpectraHeisWindow(self, puObj): - - opObj = puObj.getOperationObj(name="IncohInt4SpectraHeis") - if opObj == None: - self.specHeisOpIncoherent.clear() - self.specHeisOpCebIncoherent.setCheckState(0) - else: - for parmObj in opObj.getParameterObjList(): - if parmObj.name == 'timeInterval': - value = opObj.getParameterValue(parameterName='timeInterval') - self.specHeisOpIncoherent.setText(str(value)) - self.specHeisOpIncoherent.setEnabled(True) - self.specHeisOpCebIncoherent.setCheckState(QtCore.Qt.Checked) - self.specHeisOpCobIncInt.setCurrentIndex(0) - - # SpectraHeis Graph - - self.specHeisGgraphXminXmax.clear() - self.specHeisGgraphYminYmax.clear() - - self.specHeisGgraphChannelList.clear() - self.specHeisGgraphTminTmax.clear() - self.specHeisGgraphTimeRange.clear() - self.specHeisGgraphftpratio.clear() - - opObj = puObj.getOperationObj(name='SpectraHeisScope') - if opObj == None: - self.specHeisGraphCebSpectraplot.setCheckState(0) - self.specHeisGraphSaveSpectra.setCheckState(0) - self.specHeisGraphftpSpectra.setCheckState(0) - else: - operationSpectraHeisScope = "Enable" - self.specHeisGraphCebSpectraplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName='channelList') - if parmObj == None: - self.specHeisGgraphChannelList.clear() - else: - value = opObj.getParameterValue(parameterName='channelList') - channelListSpectraHeisScope = str(value)[1:-1] - self.specHeisGgraphChannelList.setText(channelListSpectraHeisScope) - self.specHeisGgraphChannelList.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specHeisGgraphXminXmax.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specHeisGgraphXminXmax.setText(value) - self.specHeisGgraphXminXmax.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specHeisGgraphYminYmax.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specHeisGgraphYminYmax.setText(value) - self.specHeisGgraphYminYmax.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specHeisGraphSaveSpectra.setCheckState(0) - else: - self.specHeisGraphSaveSpectra.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specHeisGraphftpSpectra.setCheckState(0) - else: - self.specHeisGraphftpSpectra.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specHeisGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specHeisGgraphftpratio.setText(str(value)) - - opObj = puObj.getOperationObj(name='RTIfromSpectraHeis') - - if opObj == None: - self.specHeisGraphCebRTIplot.setCheckState(0) - self.specHeisGraphSaveRTIplot.setCheckState(0) - self.specHeisGraphftpRTIplot.setCheckState(0) - else: - self.specHeisGraphCebRTIplot.setCheckState(QtCore.Qt.Checked) - parmObj = opObj.getParameterObj(parameterName='channelList') - if parmObj == None: - self.specHeisGgraphChannelList.clear() - else: - value = opObj.getParameterValue(parameterName='channelList') - channelListRTIPlot = str(value)[1:-1] - self.specGgraphChannelList.setText(channelListRTIPlot) - self.specGgraphChannelList.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='xmin') - if parmObj == None: - self.specHeisGgraphTminTmax.clear() - else: - value1 = opObj.getParameterValue(parameterName='xmin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='xmax') - value2 = str(value2) - value = value1 + "," + value2 - self.specHeisGgraphTminTmax.setText(value) - self.specHeisGgraphTminTmax.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='timerange') - if parmObj == None: - self.specGgraphTimeRange.clear() - else: - value1 = opObj.getParameterValue(parameterName='timerange') - value1 = str(value1) - self.specHeisGgraphTimeRange.setText(value1) - self.specHeisGgraphTimeRange.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName='ymin') - if parmObj == None: - self.specHeisGgraphYminYmax.clear() - else: - value1 = opObj.getParameterValue(parameterName='ymin') - value1 = str(value1) - value2 = opObj.getParameterValue(parameterName='ymax') - value2 = str(value2) - value = value1 + "," + value2 - self.specHeisGgraphYminYmax.setText(value) - self.specHeisGgraphYminYmax.setEnabled(True) - - parmObj = opObj.getParameterObj(parameterName="save") - if parmObj == None: - self.specHeisGraphSaveRTIplot.setCheckState(0) - else: - self.specHeisGraphSaveRTIplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="ftp") - if parmObj == None: - self.specHeisGraphftpRTIplot.setCheckState(0) - else: - self.specHeisGraphftpRTIplot.setCheckState(QtCore.Qt.Checked) - - parmObj = opObj.getParameterObj(parameterName="figpath") - if parmObj: - value = parmObj.getValue() - self.specHeisGraphPath.setText(value) - - parmObj = opObj.getParameterObj(parameterName="wr_period") - if parmObj: - value = parmObj.getValue() - self.specHeisGgraphftpratio.setText(str(value)) - - # outputSpectraHeisWrite - opObj = puObj.getOperationObj(name='FitsWriter') - if opObj == None: - self.specHeisOutputPath.clear() - self.specHeisOutputblocksperfile.clear() - self.specHeisOutputMetada.clear() - else: - value = opObj.getParameterObj(parameterName='path') - if value == None: - self.specHeisOutputPath.clear() - else: - value = opObj.getParameterValue(parameterName='path') - path = str(value) - self.specHeisOutputPath.setText(path) - value = opObj.getParameterObj(parameterName='dataBlocksPerFile') - if value == None: - self.specHeisOutputblocksperfile.clear() - else: - value = opObj.getParameterValue(parameterName='dataBlocksPerFile') - blocksperfile = str(value) - self.specHeisOutputblocksperfile.setText(blocksperfile) - value = opObj.getParameterObj(parameterName='metadatafile') - if value == None: - self.specHeisOutputMetada.clear() - else: - value = opObj.getParameterValue(parameterName='metadatafile') - metadata_file = str(value) - self.specHeisOutputMetada.setText(metadata_file) - - return - - def __refreshCorrelationWindow(self, puObj): - pass - - def refreshPUWindow(self, puObj): - - if puObj.datatype == 'Voltage': - self.__refreshVoltageWindow(puObj) - - if puObj.datatype == 'Spectra': - self.__refreshSpectraWindow(puObj) - - if puObj.datatype == 'SpectraHeis': - self.__refreshSpectraHeisWindow(puObj) - - def refreshProjectProperties(self, projectObjView): - - propertyBuffObj = PropertyBuffer() - name = projectObjView.name - - propertyBuffObj.append("Properties", "Name", projectObjView.name), - propertyBuffObj.append("Properties", "Description", projectObjView.description) - propertyBuffObj.append("Properties", "Workspace", self.pathWorkSpace) - - readUnitObj = projectObjView.getReadUnitObj() - runOperationObj = readUnitObj.getOperationObj(name='run') - - for thisParmObj in runOperationObj.getParameterObjList(): - propertyBuffObj.append("Reading parms", thisParmObj.name, str(thisParmObj.getValue())) - - propertiesModel = propertyBuffObj.getPropertyModel() - - self.treeProjectProperties.setModel(propertiesModel) - self.treeProjectProperties.expandAll() - self.treeProjectProperties.resizeColumnToContents(0) - self.treeProjectProperties.resizeColumnToContents(1) - - def refreshPUProperties(self, puObjView): - - ############ FTP CONFIG ################################ - #Deleting FTP Conf. This processing unit have not got any - #FTP configuration by default - if puObjView.id in self.__puLocalFolder2FTP.keys(): - self.__puLocalFolder2FTP.pop(puObjView.id) - ######################################################## - - propertyBuffObj = PropertyBuffer() - - for thisOp in puObjView.getOperationObjList(): - - operationName = thisOp.name - - if operationName == 'run': - operationName = 'Properties' - - else: - if not thisOp.getParameterObjList(): - propertyBuffObj.append(operationName, '--', '--') - continue - - for thisParmObj in thisOp.getParameterObjList(): - propertyBuffObj.append(operationName, thisParmObj.name, str(thisParmObj.getValue())) - - ############ FTP CONFIG ################################ - if thisParmObj.name == "ftp_wei" and thisParmObj.getValue(): - value = thisParmObj.getValue() - self.temporalFTP.ftp_wei = value - - if thisParmObj.name == "exp_code" and thisParmObj.getValue(): - value = thisParmObj.getValue() - self.temporalFTP.exp_code = value - - if thisParmObj.name == "sub_exp_code" and thisParmObj.getValue(): - value = thisParmObj.getValue() - self.temporalFTP.sub_exp_code = value - - if thisParmObj.name == "plot_pos" and thisParmObj.getValue(): - value = thisParmObj.getValue() - self.temporalFTP.plot_pos = value - - if thisParmObj.name == 'ftp' and thisParmObj.getValue(): - figpathObj = thisOp.getParameterObj('figpath') - if figpathObj: - self.__puLocalFolder2FTP[puObjView.id] = figpathObj.getValue() - - ######################################################## - - propertiesModel = propertyBuffObj.getPropertyModel() - - self.treeProjectProperties.setModel(propertiesModel) - self.treeProjectProperties.expandAll() - self.treeProjectProperties.resizeColumnToContents(0) - self.treeProjectProperties.resizeColumnToContents(1) - - def refreshGraphicsId(self): - - projectObj = self.getSelectedProjectObj() - - if not projectObj: - return - - for idPU, puObj in projectObj.procUnitConfObjDict.items(): - - for opObj in puObj.getOperationObjList(): - - if opObj.name not in ('Scope', 'SpectraPlot', 'CrossSpectraPlot', 'RTIPlot', 'CoherenceMap', 'PowerProfilePlot', 'Noise', 'SpectraHeisScope', 'RTIfromSpectraHeis'): - continue - - opObj.changeParameter(name='id', value=opObj.id, format='int') - - def on_click(self, index): - - self._disable_save_button() - self._disable_play_button() - - self.console.clear() - - self.selectedItemTree = self.projectExplorerModel.itemFromIndex(index) - - projectObjView = self.getSelectedProjectObj() - - if not projectObjView: - return - - self.create = False - selectedObjView = self.getSelectedItemObj() - - self.refreshProjectWindow(projectObjView) - self.refreshProjectProperties(projectObjView) - - #A project has been selected - if projectObjView == selectedObjView: - - self.tabProject.setEnabled(True) - self.tabVoltage.setEnabled(False) - self.tabSpectra.setEnabled(False) - self.tabCorrelation.setEnabled(False) - self.tabSpectraHeis.setEnabled(False) - self.tabWidgetProject.setCurrentWidget(self.tabProject) - - if self.dateList: - self._enable_save_button() - self._enable_play_button() - - return - - #A processing unit has been selected - voltEnable = False - specEnable = False - corrEnable = False - specHeisEnable = False - tabSelected = self.tabProject - - puObj = selectedObjView - - self.refreshPUWindow(puObj) - self.refreshPUProperties(puObj) - self.showtabPUCreated(puObj.datatype) - - if self.dateList: - self._enable_save_button() - self._enable_play_button() - - def on_right_click(self, pos): - - self.menu = QtGui.QMenu() - quitAction0 = self.menu.addAction("Create a New Project") - quitAction1 = self.menu.addAction("Create a New Processing Unit") - quitAction2 = self.menu.addAction("Delete Item") - quitAction3 = self.menu.addAction("Quit") - - if len(self.__itemTreeDict) == 0: - quitAction2.setEnabled(False) - else: - quitAction2.setEnabled(True) - - action = self.menu.exec_(self.mapToGlobal(pos)) - - if action == quitAction0: - self. setInputsProject_View() - self.create = True - - if action == quitAction1: - if len(self.__projectObjDict) == 0: - outputstr = "You need to create a Project before adding a Processing Unit" - self.console.clear() - self.console.append(outputstr) - return 0 - else: - self.addPUWindow() - self.console.clear() - self.console.append("Please, Choose the type of Processing Unit") -# self.console.append("If your Datatype is rawdata, you will start with processing unit Type Voltage") -# self.console.append("If your Datatype is pdata, you will choose between processing unit Type Spectra or Correlation") -# self.console.append("If your Datatype is fits, you will start with processing unit Type SpectraHeis") - - if action == quitAction2: - index = self.selectedItemTree - try: - index.parent() - except: - self.console.append('Please, first at all select a Project or Processing Unit') - return 0 - # print index.parent(),index - if index.parent() == None: - self.projectExplorerModel.removeRow(index.row()) - else: - index.parent().removeRow(index.row()) - self.removeItemTreeFromProject() - self.console.clear() - # for i in self.projectExplorerTree.selectionModel().selection().indexes(): - # print i.row() - - if action == quitAction3: - self.close() - return 0 - - def createProjectView(self, id): - -# project_name, description, datatype, data_path, starDate, endDate, startTime, endTime, online, delay, walk, set = self.getParmsFromProjectWindow() - id = str(id) - projectParms = self.__getParmsFromProjectWindow() - - if not projectParms.isValid(): - return None - - projectObjView = Project() - projectObjView.setup(id=id, name=projectParms.name, description=projectParms.description) - - self.__projectObjDict[id] = projectObjView - self.addProject2ProjectExplorer(id=id, name=projectObjView.name) - - return projectObjView - - def updateProjectView(self): - -# project_name, description, datatype, data_path, starDate, endDate, startTime, endTime, online, delay, walk, set = self.getParmsFromProjectWindow() - - projectParms = self.__getParmsFromProjectWindow() - - if not projectParms.isValid(): - return None - - projectObjView = self.getSelectedProjectObj() - - if not projectObjView: - self.console.append("Please select a project before update it") - return None - - projectObjView.update(name=projectParms.name, description=projectParms.description) - - return projectObjView - - def createReadUnitView(self, projectObjView, idReadUnit=None): - - projectParms = self.__getParmsFromProjectWindow() - - if not projectParms.isValid(): - return None - - if projectParms.datatype in ("Voltage", "Spectra", "Fits"): - readUnitConfObj = projectObjView.addReadUnit(id=idReadUnit, - datatype=projectParms.datatype, - path=projectParms.dpath, - startDate=projectParms.startDate, - endDate=projectParms.endDate, - startTime=projectParms.startTime, - endTime=projectParms.endTime, - online=projectParms.online, - walk=projectParms.walk - ) - - if projectParms.set: - readUnitConfObj.addParameter(name="set", value=projectParms.set, format="int") - - if projectParms.delay: - readUnitConfObj.addParameter(name="delay", value=projectParms.delay, format="int") - - if projectParms.expLabel: - readUnitConfObj.addParameter(name="expLabel", value=projectParms.expLabel) - - readUnitConfObj.addOperation(name="printInfo") - - if projectParms.datatype == "USRP": - readUnitConfObj = projectObjView.addReadUnit(id=idReadUnit, - datatype=projectParms.datatype, - path=projectParms.dpath, - startDate=projectParms.startDate, - endDate=projectParms.endDate, - startTime=projectParms.startTime, - endTime=projectParms.endTime, - online=projectParms.online, - ippKm=projectParms.ippKm - ) - - if projectParms.delay: - readUnitConfObj.addParameter(name="delay", value=projectParms.delay, format="int") - - return readUnitConfObj - - def updateReadUnitView(self, projectObjView, idReadUnit): - - projectObjView.removeProcUnit(idReadUnit) - - readUnitConfObj = self.createReadUnitView(projectObjView, idReadUnit) - - return readUnitConfObj - - def createProcUnitView(self, projectObjView, datatype, inputId): - - procUnitConfObj = projectObjView.addProcUnit(datatype=datatype, inputId=inputId) - - self.__puObjDict[procUnitConfObj.getId()] = procUnitConfObj - - return procUnitConfObj - - def updateProcUnitView(self, id): - - pass - - def addPUWindow(self): - - self.configUPWindowObj = UnitProcessWindow(self) - fatherObj = self.getSelectedItemObj() - try: - fatherObj.getElementName() - except: - self.console.append("First left click on Project or Processing Unit") - return 0 - - if fatherObj.getElementName() == 'Project': - readUnitConfObj = fatherObj.getReadUnitObj() - self.configUPWindowObj.dataTypeProject = str(readUnitConfObj.datatype) - - self.configUPWindowObj.getfromWindowList.append(fatherObj) - self.configUPWindowObj.loadTotalList() - self.configUPWindowObj.show() - self.configUPWindowObj.closed.connect(self.createPUWindow) - - def createPUWindow(self): - - if not self.configUPWindowObj.create: - return - - fatherObj = self.configUPWindowObj.getFromWindow - datatype = self.configUPWindowObj.typeofUP - - if fatherObj.getElementName() == 'Project': - inputId = fatherObj.getReadUnitId() - projectObjView = fatherObj - else: - inputId = fatherObj.getId() - projectObjView = self.getSelectedProjectObj() - - if not projectObjView: - return - - puObj = self.createProcUnitView(projectObjView, datatype, inputId) - - self.addPU2ProjectExplorer(puObj) - - self.showtabPUCreated(datatype) - - self.clearPUWindow(datatype) - - self.showPUinitView() - - def addFTPConf2Operation(self, puObj, opObj): - - if not self.temporalFTP.create: - self.temporalFTP.setwithoutconfiguration() - -# opObj.addParameter(name='server', value=self.temporalFTP.server, format='str') -# opObj.addParameter(name='remotefolder', value=self.temporalFTP.remotefolder, format='str') -# opObj.addParameter(name='username', value=self.temporalFTP.username, format='str') -# opObj.addParameter(name='password', value=self.temporalFTP.password, format='str') - - if self.temporalFTP.ftp_wei: - opObj.addParameter(name='ftp_wei', value=int(self.temporalFTP.ftp_wei), format='int') - if self.temporalFTP.exp_code: - opObj.addParameter(name='exp_code', value=int(self.temporalFTP.exp_code), format='int') - if self.temporalFTP.sub_exp_code: - opObj.addParameter(name='sub_exp_code', value=int(self.temporalFTP.sub_exp_code), format='int') - if self.temporalFTP.plot_pos: - opObj.addParameter(name='plot_pos', value=int(self.temporalFTP.plot_pos), format='int') - -# def __checkFTPProcUnit(self, projectObj, localfolder): -# -# puId = None -# puObj = None -# -# for thisPuId, thisPuObj in projectObj.procUnitItems(): -# -# if not thisPuObj.name == "SendToServer": -# continue -# -# opObj = thisPuObj.getOperationObj(name='run') -# -# parmObj = opObj.getParameterObj('localfolder') -# -# #localfolder parameter should always be set, if it is not set then ProcUnit should be removed -# if not parmObj: -# projectObj.removeProcUnit(thisPuId) -# continue -# -# thisLocalfolder = parmObj.getValue() -# -# if localfolder != thisLocalfolder: -# continue -# -# puId = thisPuId -# puObj = thisPuObj -# break -# -# return puObj - - def createFTPProcUnitView(self): - - if not self.temporalFTP.create: - self.temporalFTP.setwithoutconfiguration() - - projectObj = self.getSelectedProjectObj() - - if not projectObj: - return - - self.removeAllFTPProcUnitView(projectObj) - - if not self.__puLocalFolder2FTP: - return - - folderList = ",".join(self.__puLocalFolder2FTP.values()) - - procUnitConfObj = projectObj.addProcUnit(name="SendToServer") - - procUnitConfObj.addParameter(name='server', value=self.temporalFTP.server, format='str') - procUnitConfObj.addParameter(name='username', value=self.temporalFTP.username, format='str') - procUnitConfObj.addParameter(name='password', value=self.temporalFTP.password, format='str') - procUnitConfObj.addParameter(name='localfolder', value=folderList, format='list') - procUnitConfObj.addParameter(name='remotefolder', value=self.temporalFTP.remotefolder, format='str') - procUnitConfObj.addParameter(name='ext', value=self.temporalFTP.extension, format='str') - procUnitConfObj.addParameter(name='period', value=self.temporalFTP.period, format='int') - procUnitConfObj.addParameter(name='protocol', value=self.temporalFTP.protocol, format='str') - - procUnitConfObj.addParameter(name='ftp_wei', value=self.temporalFTP.ftp_wei, format='int') - procUnitConfObj.addParameter(name='exp_code', value=self.temporalFTP.exp_code, format='int') - procUnitConfObj.addParameter(name='sub_exp_code', value=self.temporalFTP.sub_exp_code, format='int') - procUnitConfObj.addParameter(name='plot_pos', value=self.temporalFTP.plot_pos, format='int') - - self.__puObjDict[procUnitConfObj.getId()] = procUnitConfObj - - def removeAllFTPProcUnitView(self, projectObj): - - for thisPuId, thisPuObj in projectObj.procUnitItems(): - - if not thisPuObj.name == "SendToServer": - continue - - projectObj.removeProcUnit(thisPuId) - - if thisPuId not in self.__puObjDict.keys(): - continue - - self.__puObjDict.pop(thisPuId) - - def showPUinitView(self): - - self.propertiesModel = TreeModel() - self.propertiesModel.initPUVoltageView() - self.treeProjectProperties.setModel(self.propertiesModel) - self.treeProjectProperties.expandAll() - self.treeProjectProperties.allColumnsShowFocus() - self.treeProjectProperties.resizeColumnToContents(1) - - def saveFTPFromOpObj(self, operationObj): - - if operationObj.name != "SendByFTP": - return - - server = operationObj.getParameterValue("server") - username = operationObj.getParameterValue("username") - password = operationObj.getParameterValue("password") - localfolder = operationObj.getParameterValue("localfolder") - remotefolder = operationObj.getParameterValue("remotefolder") - ext = operationObj.getParameterValue("ext") - period = operationObj.getParameterValue("period") - - self.temporalFTP.save(server=server, - remotefolder=remotefolder, - username=username, - password=password, - localfolder=localfolder, - extension=ext) - - return - - def saveFTPFromProcUnitObj(self, puObj): - - opObj = puObj.getOperationObj(name="run") - - parmObj = opObj.getParameterObj(parameterName="server") - if parmObj == None: - server = 'jro-app.igp.gob.pe' - else: - server = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="remotefolder") - if parmObj == None: - remotefolder = '/home/wmaster/graficos' - else: - remotefolder = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="username") - if parmObj == None: - username = 'wmaster' - else: - username = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="password") - if parmObj == None: - password = 'mst2010vhf' - else: - password = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="ftp_wei") - if parmObj == None: - ftp_wei = 0 - else: - ftp_wei = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="exp_code") - if parmObj == None: - exp_code = 0 - else: - exp_code = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="sub_exp_code") - if parmObj == None: - sub_exp_code = 0 - else: - sub_exp_code = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="plot_pos") - if parmObj == None: - plot_pos = 0 - else: - plot_pos = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="localfolder") - if parmObj == None: - localfolder = None - else: - localfolder = parmObj.getValue() - - parmObj = opObj.getParameterObj(parameterName="ext") - if parmObj == None: - extension = '.png' - else: - extension = parmObj.getValue() - - self.temporalFTP.save(server=server, - remotefolder=remotefolder, - username=username, - password=password, - ftp_wei=ftp_wei, - exp_code=exp_code, - sub_exp_code=sub_exp_code, - plot_pos=plot_pos, - localfolder=localfolder, - extension=extension) - - def addProject2ProjectExplorer(self, id, name): - - itemTree = QtGui.QStandardItem(QtCore.QString(str(name))) - - parentItem = self.projectExplorerModel.invisibleRootItem() - parentItem.appendRow(itemTree) - - self.projectExplorerTree.setCurrentIndex(itemTree.index()) - - self.selectedItemTree = itemTree - - self.__itemTreeDict[id] = itemTree - - def addPU2ProjectExplorer(self, puObj): - - id, name = puObj.id, puObj.datatype - - itemTree = QtGui.QStandardItem(QtCore.QString(str(name))) - - parentItem = self.selectedItemTree - parentItem.appendRow(itemTree) - self.projectExplorerTree.expandAll() - - self.projectExplorerTree.setCurrentIndex(itemTree.index()) - - self.selectedItemTree = itemTree - - self.__itemTreeDict[id] = itemTree - - def addPU2PELoadXML(self, puObj): - - id, name, inputId = puObj.id, puObj.datatype, puObj.inputId - - itemTree = QtGui.QStandardItem(QtCore.QString(str(name))) - - if self.__itemTreeDict.has_key(inputId): - parentItem = self.__itemTreeDict[inputId] - else: - #If parent is a Reader object - parentItem = self.__itemTreeDict[id[:-1]] - - parentItem.appendRow(itemTree) - self.projectExplorerTree.expandAll() - parentItem = itemTree - self.projectExplorerTree.setCurrentIndex(parentItem.index()) - - self.__itemTreeDict[id] = itemTree - self.selectedItemTree = itemTree - - def getSelectedProjectObj(self): - """ - Return the current project object selected. If a processing unit is - actually selected this function returns associated project. - - None if any project or processing unit is selected - """ - for key in self.__itemTreeDict.keys(): - if self.__itemTreeDict[key] != self.selectedItemTree: - continue - - if self.__projectObjDict.has_key(key): - projectObj = self.__projectObjDict[key] - return projectObj - - puObj = self.__puObjDict[key] - - if puObj.parentId == None: - projectId = puObj.getId()[0] - else: - projectId = puObj.parentId - - projectObj = self.__projectObjDict[projectId] - return projectObj - - return None - - def getSelectedItemObj(self): - """ - Return the current project or processing unit object selected - - None if any project or processing unit is selected - """ - for key in self.__itemTreeDict.keys(): - if self.__itemTreeDict[key] != self.selectedItemTree: - continue - - if self.__projectObjDict.has_key(key) == True: - fatherObj = self.__projectObjDict[key] - else: - fatherObj = self.__puObjDict[key] - - return fatherObj - - return None - - def _WarningWindow(self, text, information): - - msgBox = QtGui.QMessageBox() - msgBox.setText(text) - msgBox.setInformativeText(information) - msgBox.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) - msgBox.setDefaultButton(QtGui.QMessageBox.Ok) - ret = msgBox.exec_() - - answer = False - - if ret == QtGui.QMessageBox.Ok: - answer = True - - return answer - - def __getNewProjectId(self): - - loadProject = False - - for thisId in range(1,10): - newId = str(thisId) - if newId in self.__projectObjDict.keys(): - continue - - loadProject = True - projectId = newId - break - - if not loadProject: - self.console.clear() - self.console.append("The maximum number of projects has been loaded, a new project can not be loaded") - return None - - return projectId - - def openProject(self): - - self._disable_save_button() - self._disable_play_button() - - self.console.clear() - - self.frame_2.setEnabled(True) - - # print self.dir - filename = str(QtGui.QFileDialog.getOpenFileName(self, "Open a project file", self.pathWorkSpace, self.tr("Html Files (*.xml)"))) - - projectObjLoad = Project() - - if not projectObjLoad.readXml(filename): - self.console.append("The selected xml file could not be loaded ...") - return 0 - - self.create = False - self.refreshProjectWindow(projectObjLoad) - self.refreshProjectProperties(projectObjLoad) - - projectId = projectObjLoad.id - - if projectId in self.__projectObjDict.keys(): - - projectId = self.__getNewProjectId() - - if not projectId: - return 0 - - projectObjLoad.updateId(projectId) - - self.__projectObjDict[projectId] = projectObjLoad - - self.addProject2ProjectExplorer(id=projectId, name=projectObjLoad.name) - - self.tabWidgetProject.setEnabled(True) - self.tabWidgetProject.setCurrentWidget(self.tabProject) - # Disable tabProject after finish the creation - self.tabProject.setEnabled(True) - puObjorderList = OrderedDict(sorted(projectObjLoad.procUnitConfObjDict.items(), key=lambda x: x[0])) - - for puId, puObj in puObjorderList.items(): - - self.__puObjDict[puId] = puObj - - if puObj.name == "SendToServer": - self.saveFTPFromProcUnitObj(puObj) - - ############## COMPATIBLE WITH OLD VERSIONS ################ - operationObj = puObj.getOperationObj("SendByFTP") - - if operationObj: - self.saveFTPFromOpObj(operationObj) - ############################################################ - - if puObj.inputId == '0': - continue - - self.addPU2PELoadXML(puObj) - - self.refreshPUWindow(puObj) - self.refreshPUProperties(puObj) - self.showtabPUCreated(datatype=puObj.datatype) - -# self.console.clear() - self.console.append("\nThe selected xml file has been loaded successfully") - - if self.dateList: - self._disable_save_button() - self._enable_play_button() - - def create_updating_timer(self): - - self.comm_data_timer = QtCore.QTimer(self) - self.comm_data_timer.timeout.connect(self.on_comm_updating_timer) - self.comm_data_timer.start(1000) - - def on_comm_updating_timer(self): - # Verifica si algun proceso ha sido inicializado y sigue ejecutandose - # Si el proceso se ha parado actualizar el GUI (stopProject) - if not self.threadStarted: - return - - if self.controllerThread.isFinished(): - self.stopProject() - return - - def use_plotmanager(self, controllerThread): - - self.plotManager = controllerThread.useExternalPlotter() - - self.plot_timer = QtCore.QTimer() - self.plot_timer.timeout.connect(self.on_plotmanager_timer) - self.plot_timer.start(10) - - def on_plotmanager_timer(self): - - if not self.plotManager: - return - - self.plotManager.run() - - if self.plotManager.isErrorDetected(): - self.stopProject() - return - - def playProject(self, ext=".xml", save=1): - - self._disable_play_button() - self._disable_save_button() - - if self.controllerThread: - if self.controllerThread.isRunning(): - self.console.append("There is already another process running") - self._enable_stop_button() - return - - if not self.dateList: - self.console.append("No data found, check datapath") - - projectObj = self.getSelectedProjectObj() - - if not projectObj: - self.console.append("Please, select a project to start it") - return - - if save: - filename = self.saveProject() - if filename == None: - self.console.append("Process not initialized.") - return - else: - filename = TEMPORAL_FILE - projectObj.writeXml( os.path.join(self.pathWorkSpace,filename) ) - - self.console.clear() - self.console.append("Please wait...") - - self.controllerThread = ControllerThread() - self.controllerThread.readXml(filename) - - self.use_plotmanager(self.controllerThread) - - self.console.clear() - - self.controllerThread.start() - - sleep(0.5) - - - self.threadStarted = True - - self._disable_play_button() - self._disable_save_button() - self._enable_stop_button() - - def stopProject(self): - - self.threadStarted = False - self.controllerThread.stop() - self.plot_timer.stop() - - self.plotManager.join() - self.plotManager = None - - while self.controllerThread.isRunning(): - sleep(0.5) - - self._disable_stop_button() - self._enable_play_button() - - def pauseProject(self): - -# self.commCtrlPThread.cmd_q.put(ProcessCommand(ProcessCommand.PAUSE, data=True)) - paused = self.controllerThread.pause() - - self.changePauseIcon(paused) - - def saveProject(self, filename=None): - - self._disable_save_button() - self._disable_play_button() - - projectObj = self.getSelectedProjectObj() - - if not projectObj: - - if self.create: - self.console.append("Please press Ok before save it") - else: - self.console.append("Please select a project before save it") - return - - self.refreshGraphicsId() - - sts = True - selectedItemObj = self.getSelectedItemObj() - - #A Processing Unit has been selected - if projectObj == selectedItemObj: - if not self.on_proOk_clicked(): - return None - - #A Processing Unit has been selected - if projectObj != selectedItemObj: - puObj = selectedItemObj - - if puObj.name == 'VoltageProc': - sts = self.on_volOpOk_clicked() - if puObj.name == 'SpectraProc': - sts = self.on_specOpOk_clicked() - if puObj.name == 'SpectraHeisProc': - sts = self.on_specHeisOpOk_clicked() - - if not sts: - return None - - self.createFTPProcUnitView() - - if not filename: - filename = os.path.join( str(self.pathWorkSpace), "%s%s" %(str(projectObj.name), '.xml') ) - - projectObj.writeXml(filename) - self.console.clear() - self.console.append("Project saved") - self.console.append("Press Play button to start data processing ...") - - self._disable_save_button() - self._enable_play_button() - - return filename - - def removeItemTreeFromProject(self): - """ - Metodo para eliminar el proyecto en el dictionario de proyectos y en el dictionario de vista de arbol - """ - for key in self.__itemTreeDict.keys(): - - #Check again because an item can delete multiple items (childs) - if key not in self.__itemTreeDict.keys(): - continue - - if self.__itemTreeDict[key] != self.selectedItemTree: - continue - - if self.__projectObjDict.has_key(key) == True: - - del self.__projectObjDict[key] - del self.__itemTreeDict[key] - - else: - puObj = self.__puObjDict[key] - idProjectParent = puObj.parentId - projectObj = self.__projectObjDict[idProjectParent] - - del self.__puObjDict[key] - del self.__itemTreeDict[key] - del projectObj.procUnitConfObjDict[key] - - for key in projectObj.procUnitConfObjDict.keys(): - if projectObj.procUnitConfObjDict[key].inputId != puObj.getId(): - continue - del self.__puObjDict[projectObj.procUnitConfObjDict[key].getId()] - del self.__itemTreeDict[projectObj.procUnitConfObjDict[key].getId()] - del projectObj.procUnitConfObjDict[key] - # print projectObj.procUnitConfObjDict - # print self.__itemTreeDict,self.__projectObjDict,self.__puObjDict - - def setInputsProject_View(self): - - self.tabWidgetProject.setEnabled(True) - self.tabWidgetProject.setCurrentWidget(self.tabProject) - self.tabProject.setEnabled(True) - self.frame_2.setEnabled(False) - self.proName.clear() - self.proName.setFocus() - self.proName.setSelection(0, 0) - self.proName.setCursorPosition(0) - self.proDataType.setText('.r') - self.proDataPath.clear() - self.proComDataType.clear() - self.proComDataType.addItem("Voltage") - self.proComDataType.addItem("Spectra") - self.proComDataType.addItem("Fits") - self.proComDataType.addItem("USRP") - - self.proComStartDate.clear() - self.proComEndDate.clear() - - startTime = "00:00:00" - endTime = "23:59:59" - starlist = startTime.split(":") - endlist = endTime.split(":") - self.proDelay.setText("60") - self.proSet.setText("") - - self.labelSet.show() - self.proSet.show() - - self.labelIPPKm.hide() - self.proIPPKm.hide() - - self.time.setHMS(int(starlist[0]), int(starlist[1]), int(starlist[2])) - self.proStartTime.setTime(self.time) - self.time.setHMS(int(endlist[0]), int(endlist[1]), int(endlist[2])) - self.proEndTime.setTime(self.time) - self.proDescription.clear() - self.proOk.setEnabled(False) -# self.console.append("Please, Write a name Project") -# self.console.append("Introduce Project Parameters")DC -# self.console.append("Select data type Voltage( .rawdata) or Spectra(.pdata)") - - def clearPUWindow(self, datatype): - - projectObjView = self.getSelectedProjectObj() - - if not projectObjView: - return - - puObj = self.getSelectedItemObj() - inputId = puObj.getInputId() - inputPUObj = projectObjView.getProcUnitObj(inputId) - - if datatype == 'Voltage': - self.volOpComChannels.setEnabled(False) - self.volOpComHeights.setEnabled(False) - self.volOpFilter.setEnabled(False) - self.volOpComProfile.setEnabled(False) - self.volOpComCode.setEnabled(False) - self.volOpCohInt.setEnabled(False) - self.volOpChannel.setEnabled(False) - self.volOpHeights.setEnabled(False) - self.volOpProfile.setEnabled(False) - self.volOpRadarfrequency.setEnabled(False) - self.volOpSplitter.setEnabled(False) - self.volOpCombiner.setEnabled(False) - - self.volOpCebChannels.setCheckState(0) - self.volOpCebRadarfrequency.setCheckState(0) - self.volOpCebHeights.setCheckState(0) - self.volOpCebFilter.setCheckState(0) - self.volOpCebProfile.setCheckState(0) - self.volOpCebDecodification.setCheckState(0) - self.volOpCebCohInt.setCheckState(0) - self.volOpCebSplitter.setCheckState(0) - self.volOpCebCombiner.setCheckState(0) - - self.volOpChannel.clear() - self.volOpHeights.clear() - self.volOpProfile.clear() - self.volOpFilter.clear() - self.volOpCohInt.clear() - self.volOpRadarfrequency.clear() - self.volOpSplitter.clear() - self.volOpCombiner.clear() - - if datatype == 'Spectra': - - if inputPUObj.datatype == 'Spectra': - self.specOpnFFTpoints.setEnabled(False) - self.specOpProfiles.setEnabled(False) - self.specOpippFactor.setEnabled(False) - else: - self.specOpnFFTpoints.setEnabled(True) - self.specOpProfiles.setEnabled(True) - self.specOpippFactor.setEnabled(True) - - self.specOpCebCrossSpectra.setCheckState(0) - self.specOpCebChannel.setCheckState(0) - self.specOpCebHeights.setCheckState(0) - self.specOpCebIncoherent.setCheckState(0) - self.specOpCebRemoveDC.setCheckState(0) - self.specOpCebRemoveInt.setCheckState(0) - self.specOpCebgetNoise.setCheckState(0) - self.specOpCebRadarfrequency.setCheckState(0) - - self.specOpRadarfrequency.setEnabled(False) - self.specOppairsList.setEnabled(False) - self.specOpChannel.setEnabled(False) - self.specOpHeights.setEnabled(False) - self.specOpIncoherent.setEnabled(False) - self.specOpgetNoise.setEnabled(False) - - self.specOpRadarfrequency.clear() - self.specOpnFFTpoints.clear() - self.specOpProfiles.clear() - self.specOpippFactor.clear - self.specOppairsList.clear() - self.specOpChannel.clear() - self.specOpHeights.clear() - self.specOpIncoherent.clear() - self.specOpgetNoise.clear() - - self.specGraphCebSpectraplot.setCheckState(0) - self.specGraphCebCrossSpectraplot.setCheckState(0) - self.specGraphCebRTIplot.setCheckState(0) - self.specGraphCebRTInoise.setCheckState(0) - self.specGraphCebCoherencmap.setCheckState(0) - self.specGraphPowerprofile.setCheckState(0) - - self.specGraphSaveSpectra.setCheckState(0) - self.specGraphSaveCross.setCheckState(0) - self.specGraphSaveRTIplot.setCheckState(0) - self.specGraphSaveRTInoise.setCheckState(0) - self.specGraphSaveCoherencemap.setCheckState(0) - self.specGraphSavePowerprofile.setCheckState(0) - - self.specGraphftpRTIplot.setCheckState(0) - self.specGraphftpRTInoise.setCheckState(0) - self.specGraphftpCoherencemap.setCheckState(0) - - self.specGraphPath.clear() - self.specGraphPrefix.clear() - - self.specGgraphftpratio.clear() - - self.specGgraphChannelList.clear() - self.specGgraphFreq.clear() - self.specGgraphHeight.clear() - self.specGgraphDbsrange.clear() - self.specGgraphmagnitud.clear() - self.specGgraphTminTmax.clear() - self.specGgraphTimeRange.clear() - - if datatype == 'SpectraHeis': - self.specHeisOpCebIncoherent.setCheckState(0) - self.specHeisOpIncoherent.setEnabled(False) - self.specHeisOpIncoherent.clear() - - self.specHeisGraphCebSpectraplot.setCheckState(0) - self.specHeisGraphCebRTIplot.setCheckState(0) - - self.specHeisGraphSaveSpectra.setCheckState(0) - self.specHeisGraphSaveRTIplot.setCheckState(0) - - self.specHeisGraphftpSpectra.setCheckState(0) - self.specHeisGraphftpRTIplot.setCheckState(0) - - self.specHeisGraphPath.clear() - self.specHeisGraphPrefix.clear() - self.specHeisGgraphChannelList.clear() - self.specHeisGgraphXminXmax.clear() - self.specHeisGgraphYminYmax.clear() - self.specHeisGgraphTminTmax.clear() - self.specHeisGgraphTimeRange.clear() - self.specHeisGgraphftpratio.clear() - - def showtabPUCreated(self, datatype): - - if datatype == "Voltage": - self.tabVoltage.setEnabled(True) - self.tabProject.setEnabled(False) - self.tabSpectra.setEnabled(False) - self.tabCorrelation.setEnabled(False) - self.tabSpectraHeis.setEnabled(False) - self.tabWidgetProject.setCurrentWidget(self.tabVoltage) - - if datatype == "Spectra": - self.tabVoltage.setEnabled(False) - self.tabProject.setEnabled(False) - self.tabSpectra.setEnabled(True) - self.tabCorrelation.setEnabled(False) - self.tabSpectraHeis.setEnabled(False) - self.tabWidgetProject.setCurrentWidget(self.tabSpectra) - - if datatype == "SpectraHeis": - self.tabVoltage.setEnabled(False) - self.tabProject.setEnabled(False) - self.tabSpectra.setEnabled(False) - self.tabCorrelation.setEnabled(False) - self.tabSpectraHeis.setEnabled(True) - self.tabWidgetProject.setCurrentWidget(self.tabSpectraHeis) - - def checkInputsProject(self): - """ - Check Inputs Project: - - project_name - - datatype - - ext - - data_path - - readmode - - delay - - set - - walk - """ - parms_ok = True - project_name = str(self.proName.text()) - if project_name == '' or project_name == None: - outputstr = "Enter the Project Name" - self.console.append(outputstr) - parms_ok = False - project_name = None - - datatype = str(self.proComDataType.currentText()) - if not(datatype in ['Voltage', 'Spectra', 'Fits', 'USRP']): - outputstr = 'datatype = %s, this must be either Voltage, Spectra, SpectraHeis or USRP' % datatype - self.console.append(outputstr) - parms_ok = False - datatype = None - - ext = str(self.proDataType.text()) - if not(ext in ['.r', '.pdata', '.fits', '.hdf5']): - outputstr = "extension files must be .r , .pdata, .fits or .hdf5" - self.console.append(outputstr) - parms_ok = False - ext = None - - data_path = str(self.proDataPath.text()) - - if data_path == '': - outputstr = 'Datapath is empty' - self.console.append(outputstr) - parms_ok = False - data_path = None - - if data_path != None: - if not os.path.isdir(data_path): - outputstr = 'Datapath:%s does not exist' % data_path - self.console.append(outputstr) - parms_ok = False - data_path = None - - read_mode = str(self.proComReadMode.currentText()) - if not(read_mode in ['Online', 'Offline']): - outputstr = 'Read Mode: %s, this must be either Online or Offline' % read_mode - self.console.append(outputstr) - parms_ok = False - read_mode = None - - delay = None - if read_mode == "Online": - parms_ok = False - try: - delay = int(str(self.proDelay.text())) - parms_ok = True - except: - outputstr = 'Delay: %s, this must be a integer number' % str(self.proDelay.text()) - self.console.append(outputstr) - - try: - set = int(str(self.proSet.text())) - except: - # outputstr = 'Set: %s, this must be a integer number' % str(self.proName.text()) - # self.console.append(outputstr) - # parms_ok = False - set = None - - walk = int(self.proComWalk.currentIndex()) - expLabel = str(self.proExpLabel.text()) - - return parms_ok, project_name, datatype, ext, data_path, read_mode, delay, walk, set, expLabel - - def checkInputsPUSave(self, datatype): - """ - Check Inputs Spectra Save: - - path - - blocks Per File - - sufix - - dataformat - """ - parms_ok = True - - if datatype == "Voltage": - output_path = str(self.volOutputPath.text()) - blocksperfile = str(self.volOutputblocksperfile.text()) - profilesperblock = str(self.volOutputprofilesperblock.text()) - - if datatype == "Spectra": - output_path = str(self.specOutputPath.text()) - blocksperfile = str(self.specOutputblocksperfile.text()) - profilesperblock = 0 - - if datatype == "SpectraHeis": - output_path = str(self.specHeisOutputPath.text()) - blocksperfile = str(self.specHeisOutputblocksperfile.text()) - metadata_file = str(self.specHeisOutputMetada.text()) - - message = '' - - if not os.path.isdir(output_path): - message += 'OutputPath:%s does not exist\n' % output_path - parms_ok = False - - try: - profilesperblock = int(profilesperblock) - except: - if datatype == "Voltage": - message += 'Profilesperblock: %s, this must be a integer number\n' % str(self.volOutputprofilesperblock.text()) - parms_ok = False - profilesperblock = None - - try: - blocksperfile = int(blocksperfile) - except: - if datatype == "Voltage": - message += 'Blocksperfile: %s, this must be a integer number\n' % str(self.volOutputblocksperfile.text()) - elif datatype == "Spectra": - message += 'Blocksperfile: %s, this must be a integer number\n' % str(self.specOutputblocksperfile.text()) - elif datatype == "SpectraHeis": - message += 'Blocksperfile: %s, this must be a integer number\n' % str(self.specHeisOutputblocksperfile.text()) - - parms_ok = False - blocksperfile = None - - if datatype == "SpectraHeis": - if metadata_file != '': - if not os.path.isfile(metadata_file): - message += 'Metadata file %s does not exist\n' % metadata_file - parms_ok = False - - if str.strip(output_path) != '': - self.console.append(message) - - if datatype == "Voltage": - return parms_ok, output_path, blocksperfile, profilesperblock - - - if datatype == "Spectra": - return parms_ok, output_path, blocksperfile, profilesperblock - - - if datatype == "SpectraHeis": - return parms_ok, output_path, blocksperfile, metadata_file - - def findDatafiles(self, data_path, ext, walk, expLabel=''): - - dateList = [] - fileList = [] - - if ext == ".r": - from schainpy.model.io.jroIO_base import JRODataReader - - readerObj = JRODataReader() - dateList = readerObj.findDatafiles(path=data_path, - expLabel=expLabel, - ext=ext, - walk=walk) - - if ext == ".pdata": - from schainpy.model.io.jroIO_base import JRODataReader - - readerObj = JRODataReader() - dateList = readerObj.findDatafiles(path=data_path, - expLabel=expLabel, - ext=ext, - walk=walk) - - if ext == ".fits": - from schainpy.model.io.jroIO_base import JRODataReader - - readerObj = JRODataReader() - dateList = readerObj.findDatafiles(path=data_path, - expLabel=expLabel, - ext=ext, - walk=walk) - - if ext == ".hdf5": - from schainpy.model.io.jroIO_usrp import USRPReader - - readerObj = USRPReader() - dateList = readerObj.findDatafiles(path=data_path) - - return dateList - - def loadDays(self, data_path, ext, walk, expLabel=''): - """ - Method to loads day - """ -# self._disable_save_button() -# self._disable_play_button() -# self.proOk.setEnabled(False) - - self.proComStartDate.clear() - self.proComEndDate.clear() - - self.dateList = [] - - if not data_path: - self.console.append("Datapath has not been set") - return [] - - if not os.path.isdir(data_path): - self.console.append("Directory %s does not exist" %data_path) - return [] - - self.dataPath = data_path - - dateList = self.findDatafiles(data_path, ext=ext, walk=walk, expLabel=expLabel) - - if not dateList: -# self.console.clear() - if walk: - if expLabel: - outputstr = "No files (*%s) were found on %s/DOYPATH/%s" % (ext, data_path, expLabel) - else: - outputstr = "No files (*%s) were found on %s" % (ext, data_path) - else: - outputstr = "No files (*%s) were found on %s" % (ext, data_path) - - self.console.append(outputstr) - return [] - - dateStrList = [] - for thisDate in dateList: - dateStr = thisDate.strftime("%Y/%m/%d") - - self.proComStartDate.addItem(dateStr) - self.proComEndDate.addItem(dateStr) - dateStrList.append(dateStr) - - self.proComStartDate.setCurrentIndex(0) - self.proComEndDate.setCurrentIndex(self.proComEndDate.count() - 1) - - self.dateList = dateStrList - - self.console.clear() - self.console.append("Successful load") - -# self.proOk.setEnabled(True) -# self._enable_play_button() -# self._enable_save_button() - - return self.dateList - - def setWorkSpaceGUI(self, pathWorkSpace=None): - - if pathWorkSpace == None: - home = os.path.expanduser("~") - pathWorkSpace = os.path.join(home,'schain_workspace') - - self.pathWorkSpace = pathWorkSpace - - """ - Comandos Usados en Console - """ - def __del__(self): - sys.stdout = sys.__stdout__ - sys.stderr = sys.__stderr__ - - def normalOutputWritten(self, text): - color_black = QtGui.QColor(0,0,0) - self.console.setTextColor(color_black) - self.console.append(text) - - def errorOutputWritten(self, text): - color_red = QtGui.QColor(255,0,0) - color_black = QtGui.QColor(0,0,0) - - self.console.setTextColor(color_red) - self.console.append(text) - self.console.setTextColor(color_black) - - def _enable_save_button(self): - - self.actionSaveToolbar.setEnabled(True) - self.actionSave.setEnabled(True) - - def _disable_save_button(self): - - self.actionSaveToolbar.setEnabled(False) - self.actionSave.setEnabled(False) - - def _enable_play_button(self): - - if self.controllerThread: - if self.controllerThread.isRunning(): - return - - self.actionStart.setEnabled(True) - self.actionStarToolbar.setEnabled(True) - - self.changeStartIcon(started=False) - - def _disable_play_button(self): - - self.actionStart.setEnabled(False) - self.actionStarToolbar.setEnabled(False) - - self.changeStartIcon(started=True) - - def _enable_stop_button(self): - - self.actionPause.setEnabled(True) - self.actionStop.setEnabled(True) - - self.actionPauseToolbar.setEnabled(True) - self.actionStopToolbar.setEnabled(True) - - self.changePauseIcon(paused=False) - self.changeStopIcon(started=True) - - def _disable_stop_button(self): - - self.actionPause.setEnabled(False) - self.actionStop.setEnabled(False) - - self.actionPauseToolbar.setEnabled(False) - self.actionStopToolbar.setEnabled(False) - - self.changePauseIcon(paused=False) - self.changeStopIcon(started=False) - - def setGUIStatus(self): - - self.setWindowTitle("ROJ-Signal Chain") - self.setWindowIcon(QtGui.QIcon( os.path.join(FIGURES_PATH,"logo.png") )) - - self.tabWidgetProject.setEnabled(False) - self.tabVoltage.setEnabled(False) - self.tabSpectra.setEnabled(False) - self.tabCorrelation.setEnabled(False) - self.frame_2.setEnabled(False) - - self.actionCreate.setShortcut('Ctrl+N') - self.actionOpen.setShortcut('Ctrl+O') - self.actionSave.setShortcut('Ctrl+S') - self.actionClose.setShortcut('Ctrl+X') - - self.actionStart.setShortcut('Ctrl+1') - self.actionPause.setShortcut('Ctrl+2') - self.actionStop.setShortcut('Ctrl+3') - - self.actionFTP.setShortcut('Ctrl+F') - - self.actionStart.setEnabled(False) - self.actionPause.setEnabled(False) - self.actionStop.setEnabled(False) - - self.actionStarToolbar.setEnabled(False) - self.actionPauseToolbar.setEnabled(False) - self.actionStopToolbar.setEnabled(False) - - self.proName.clear() - self.proDataPath.setText('') - self.console.setReadOnly(True) - self.console.append("Welcome to Signal Chain\n\n") - self.console.append("Open a project or Create a new one\n") - self.proStartTime.setDisplayFormat("hh:mm:ss") - self.proDataType.setEnabled(False) - self.time = QtCore.QTime() - self.proEndTime.setDisplayFormat("hh:mm:ss") - startTime = "00:00:00" - endTime = "23:59:59" - starlist = startTime.split(":") - endlist = endTime.split(":") - self.time.setHMS(int(starlist[0]), int(starlist[1]), int(starlist[2])) - self.proStartTime.setTime(self.time) - self.time.setHMS(int(endlist[0]), int(endlist[1]), int(endlist[2])) - self.proEndTime.setTime(self.time) - self.proOk.setEnabled(False) - # set model Project Explorer - self.projectExplorerModel = QtGui.QStandardItemModel() - self.projectExplorerModel.setHorizontalHeaderLabels(("Project Explorer",)) - layout = QtGui.QVBoxLayout() - layout.addWidget(self.projectExplorerTree) - self.projectExplorerTree.setModel(self.projectExplorerModel) - self.projectExplorerTree.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.projectExplorerTree.customContextMenuRequested.connect(self.on_right_click) - self.projectExplorerTree.clicked.connect(self.on_click) - self.projectExplorerTree.expandAll() - # set model Project Properties - - self.propertiesModel = TreeModel() - self.propertiesModel.initProjectView() - self.treeProjectProperties.setModel(self.propertiesModel) - self.treeProjectProperties.expandAll() - self.treeProjectProperties.allColumnsShowFocus() - self.treeProjectProperties.resizeColumnToContents(1) - - # set Project - self.pronTxs.setEnabled(False) - self.proComByBlock.setEnabled(False) - self.proExpLabel.setEnabled(False) - self.proDelay.setEnabled(False) - self.proSet.setEnabled(True) - self.proDataType.setReadOnly(True) - - # set Operation Voltage - self.volOpComChannels.setEnabled(False) - self.volOpComHeights.setEnabled(False) - self.volOpFilter.setEnabled(False) - self.volOpComProfile.setEnabled(False) - self.volOpComCode.setEnabled(False) - self.volOpFlip.setEnabled(False) - self.volOpCohInt.setEnabled(False) - self.volOpRadarfrequency.setEnabled(False) - - self.volOpChannel.setEnabled(False) - self.volOpHeights.setEnabled(False) - self.volOpProfile.setEnabled(False) - self.volOpComMode.setEnabled(False) - - self.volOpSplitter.setEnabled(False) - self.volOpCombiner.setEnabled(False) - self.volOpAdjustHei.setEnabled(False) - - self.volOpCebAdjustHei.setEnabled(False) - - self.volGraphPath.setEnabled(False) - self.volGraphPrefix.setEnabled(False) - self.volGraphToolPath.setEnabled(False) - - # set Graph Voltage - self.volGraphChannelList.setEnabled(False) - self.volGraphIntensityRange.setEnabled(False) - self.volGraphHeightrange.setEnabled(False) - - # set Operation Spectra - self.specOpnFFTpoints.setEnabled(False) - self.specOpProfiles.setEnabled(False) - self.specOpippFactor.setEnabled(False) - self.specOppairsList.setEnabled(False) - - self.specOpComCrossSpectra.setEnabled(False) - self.specOpComChannel.setEnabled(False) - self.specOpComHeights.setEnabled(False) - self.specOpIncoherent.setEnabled(False) - self.specOpgetNoise.setEnabled(False) - self.specOpRadarfrequency.setEnabled(False) - - - self.specOpChannel.setEnabled(False) - self.specOpHeights.setEnabled(False) - # set Graph Spectra - self.specGgraphChannelList.setEnabled(False) - self.specGgraphFreq.setEnabled(False) - self.specGgraphHeight.setEnabled(False) - self.specGgraphDbsrange.setEnabled(False) - self.specGgraphmagnitud.setEnabled(False) - self.specGgraphTminTmax.setEnabled(False) - self.specGgraphTimeRange.setEnabled(False) - self.specGraphPath.setEnabled(False) - self.specGraphToolPath.setEnabled(False) - self.specGraphPrefix.setEnabled(False) - - self.specGgraphftpratio.setEnabled(False) - # set Operation SpectraHeis - self.specHeisOpIncoherent.setEnabled(False) - self.specHeisOpCobIncInt.setEnabled(False) - # set Graph SpectraHeis - self.specHeisGgraphChannelList.setEnabled(False) - self.specHeisGgraphXminXmax.setEnabled(False) - self.specHeisGgraphYminYmax.setEnabled(False) - self.specHeisGgraphTminTmax.setEnabled(False) - self.specHeisGgraphTimeRange.setEnabled(False) - self.specHeisGgraphftpratio.setEnabled(False) - self.specHeisGraphPath.setEnabled(False) - self.specHeisGraphPrefix.setEnabled(False) - self.specHeisGraphToolPath.setEnabled(False) - - self.proComWalk.setCurrentIndex(0) - - # tool tip gui - QtGui.QToolTip.setFont(QtGui.QFont('SansSerif', 10)) - self.projectExplorerTree.setToolTip('Right clik to add Project or Unit Process') - # tool tip gui project - - # tool tip gui volOp -# self.volOpChannel.setToolTip('Example: 1,2,3,4,5') -# self.volOpHeights.setToolTip('Example: 90,180') -# self.volOpFilter.setToolTip('Example: 2') -# self.volOpProfile.setToolTip('Example:0,127') -# self.volOpCohInt.setToolTip('Example: 128') -# self.volOpFlip.setToolTip('ChannelList where flip will be applied. Example: 0,2,3') -# self.volOpOk.setToolTip('If you have finished, please Ok ') -# # tool tip gui volGraph -# self.volGraphIntensityRange.setToolTip('Height range. Example: 50,100') -# self.volGraphHeightrange.setToolTip('Amplitude. Example: 0,10000') - # tool tip gui specOp -# self.specOpnFFTpoints.setToolTip('Example: 128') -# self.specOpProfiles.setToolTip('Example: 128') -# self.specOpippFactor.setToolTip('Example:1.0') -# self.specOpIncoherent.setToolTip('Example: 10') -# self.specOpgetNoise.setToolTip('Example:20,180,30,120 (minHei,maxHei,minVel,maxVel)') -# -# self.specOpChannel.setToolTip('Example: 0,1,2,3') -# self.specOpHeights.setToolTip('Example: 90,180') -# self.specOppairsList.setToolTip('Example: (0,1),(2,3)') -# # tool tip gui specGraph -# -# self.specGgraphChannelList.setToolTip('Example: 0,3,4') -# self.specGgraphFreq.setToolTip('Example: -20,20') -# self.specGgraphHeight.setToolTip('Example: 100,400') -# self.specGgraphDbsrange.setToolTip('Example: 30,170') -# -# self.specGraphPrefix.setToolTip('Example: EXPERIMENT_NAME') -# -# -# self.specHeisOpIncoherent.setToolTip('Example: 10') -# -# self.specHeisGgraphChannelList.setToolTip('Example: 0,2,3') -# self.specHeisGgraphXminXmax.setToolTip('Example (Hz): -1000, 1000') -# self.specHeisGgraphYminYmax.setToolTip('Example (dB): 5, 35') -# self.specHeisGgraphTminTmax.setToolTip('Example (hours): 0, 24') -# self.specHeisGgraphTimeRange.setToolTip('Example (hours): 8') - - self.labelSet.show() - self.proSet.show() - - self.labelIPPKm.hide() - self.proIPPKm.hide() - - sys.stdout = ShowMeConsole(textWritten=self.normalOutputWritten) -# sys.stderr = ShowMeConsole(textWritten=self.errorOutputWritten) - - -class UnitProcessWindow(QMainWindow, Ui_UnitProcess): - """ - Class documentation goes here. - """ - closed = pyqtSignal() - create = False - - def __init__(self, parent=None): - """ - Constructor - """ - QMainWindow.__init__(self, parent) - self.setupUi(self) - self.getFromWindow = None - self.getfromWindowList = [] - self.dataTypeProject = None - - self.listUP = None - - @pyqtSignature("") - def on_unitPokbut_clicked(self): - """ - Slot documentation goes here. - """ - self.create = True - self.getFromWindow = self.getfromWindowList[int(self.comboInputBox.currentIndex())] - # self.nameofUP= str(self.nameUptxt.text()) - self.typeofUP = str(self.comboTypeBox.currentText()) - self.close() - - - @pyqtSignature("") - def on_unitPcancelbut_clicked(self): - """ - Slot documentation goes here. - """ - self.create = False - self.close() - - def loadTotalList(self): - self.comboInputBox.clear() - for i in self.getfromWindowList: - - name = i.getElementName() - if name == 'Project': - id = i.id - name = i.name - if self.dataTypeProject == 'Voltage': - self.comboTypeBox.clear() - self.comboTypeBox.addItem("Voltage") - - if self.dataTypeProject == 'Spectra': - self.comboTypeBox.clear() - self.comboTypeBox.addItem("Spectra") - self.comboTypeBox.addItem("Correlation") - if self.dataTypeProject == 'Fits': - self.comboTypeBox.clear() - self.comboTypeBox.addItem("SpectraHeis") - - - if name == 'ProcUnit': - id = int(i.id) - 1 - name = i.datatype - if name == 'Voltage': - self.comboTypeBox.clear() - self.comboTypeBox.addItem("Spectra") - self.comboTypeBox.addItem("SpectraHeis") - self.comboTypeBox.addItem("Correlation") - if name == 'Spectra': - self.comboTypeBox.clear() - self.comboTypeBox.addItem("Spectra") - self.comboTypeBox.addItem("SpectraHeis") - self.comboTypeBox.addItem("Correlation") - if name == 'SpectraHeis': - self.comboTypeBox.clear() - self.comboTypeBox.addItem("SpectraHeis") - - self.comboInputBox.addItem(str(name)) - # self.comboInputBox.addItem(str(name)+str(id)) - - def closeEvent(self, event): - self.closed.emit() - event.accept() - -class Ftp(QMainWindow, Ui_Ftp): - """ - Class documentation goes here. - """ - create = False - closed = pyqtSignal() - server = None - remotefolder = None - username = None - password = None - ftp_wei = None - exp_code = None - sub_exp_code = None - plot_pos = None - - def __init__(self, parent=None): - """ - Constructor - """ - QMainWindow.__init__(self, parent) - self.setupUi(self) - self.setGUIStatus() - - def setGUIStatus(self): - self.setWindowTitle("ROJ-Signal Chain") - self.serverFTP.setToolTip('Example: jro-app.igp.gob.pe') - self.folderFTP.setToolTip('Example: /home/wmaster/graficos') - self.usernameFTP.setToolTip('Example: myusername') - self.passwordFTP.setToolTip('Example: mypass ') - self.weightFTP.setToolTip('Example: 0') - self.expcodeFTP.setToolTip('Example: 0') - self.subexpFTP.setToolTip('Example: 0') - self.plotposFTP.setToolTip('Example: 0') - - def setParmsfromTemporal(self, server, remotefolder, username, password, ftp_wei, exp_code, sub_exp_code, plot_pos): - self.serverFTP.setText(str(server)) - self.folderFTP.setText(str(remotefolder)) - self.usernameFTP.setText(str(username)) - self.passwordFTP.setText(str(password)) - self.weightFTP.setText(str(ftp_wei)) - self.expcodeFTP.setText(str(exp_code)) - self.subexpFTP.setText(str(sub_exp_code)) - self.plotposFTP.setText(str(plot_pos)) - - def getParmsFromFtpWindow(self): - """ - Return Inputs Project: - - server - - remotefolder - - username - - password - - ftp_wei - - exp_code - - sub_exp_code - - plot_pos - """ - name_server_ftp = str(self.serverFTP.text()) - if not name_server_ftp: - self.console.clear() - self.console.append("Please Write a FTP Server") - return 0 - - folder_server_ftp = str(self.folderFTP.text()) - if not folder_server_ftp: - self.console.clear() - self.console.append("Please Write a Folder") - return 0 - - username_ftp = str(self.usernameFTP.text()) - if not username_ftp: - self.console.clear() - self.console.append("Please Write a User Name") - return 0 - - password_ftp = str(self.passwordFTP.text()) - if not password_ftp: - self.console.clear() - self.console.append("Please Write a passwordFTP") - return 0 - - ftp_wei = str(self.weightFTP.text()) - if not ftp_wei == "": - try: - ftp_wei = int(self.weightFTP.text()) - except: - self.console.clear() - self.console.append("Please Write a ftp_wei number") - return 0 - - exp_code = str(self.expcodeFTP.text()) - if not exp_code == "": - try: - exp_code = int(self.expcodeFTP.text()) - except: - self.console.clear() - self.console.append("Please Write a exp_code number") - return 0 - - - sub_exp_code = str(self.subexpFTP.text()) - if not sub_exp_code == "": - try: - sub_exp_code = int(self.subexpFTP.text()) - except: - self.console.clear() - self.console.append("Please Write a sub_exp_code number") - return 0 - - plot_pos = str(self.plotposFTP.text()) - if not plot_pos == "": - try: - plot_pos = int(self.plotposFTP.text()) - except: - self.console.clear() - self.console.append("Please Write a plot_pos number") - return 0 - - return name_server_ftp, folder_server_ftp, username_ftp, password_ftp, ftp_wei, exp_code, sub_exp_code, plot_pos - - @pyqtSignature("") - def on_ftpOkButton_clicked(self): - server, remotefolder, username, password, ftp_wei, exp_code, sub_exp_code, plot_pos = self.getParmsFromFtpWindow() - self.create = True - self.close() - - @pyqtSignature("") - def on_ftpCancelButton_clicked(self): - self.create = False - self.close() - - def closeEvent(self, event): - self.closed.emit() - event.accept() - -class ftpBuffer(): - - server = None - remotefolder = None - username = None - password = None - ftp_wei = None - exp_code = None - sub_exp_code = None - plot_pos = None - create = False - withoutconfig = False - createforView = False - localfolder = None - extension = None - period = None - protocol = None - - def __init__(self): - - self.create = False - self.server = None - self.remotefolder = None - self.username = None - self.password = None - self.ftp_wei = None - self.exp_code = None - self.sub_exp_code = None - self.plot_pos = None - # self.create = False - self.localfolder = None - self.extension = None - self.period = None - self.protocol = None - - def setwithoutconfiguration(self): - - self.create = False - self.server = "jro-app.igp.gob.pe" - self.remotefolder = "/home/wmaster/graficos" - self.username = "wmaster" - self.password = "mst2010vhf" - self.withoutconfig = True - self.localfolder = './' - self.extension = '.png' - self.period = 60 - self.protocol = 'ftp' - self.createforView = True - - if not self.ftp_wei: - self.ftp_wei = 0 - - if not self.exp_code: - self.exp_code = 0 - - if not self.sub_exp_code: - self.sub_exp_code = 0 - - if not self.plot_pos: - self.plot_pos = 0 - - def save(self, server, remotefolder, username, password, ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, localfolder='./', extension='.png', period=60, protocol='ftp'): - - self.server = server - self.remotefolder = remotefolder - self.username = username - self.password = password - self.ftp_wei = ftp_wei - self.exp_code = exp_code - self.sub_exp_code = sub_exp_code - self.plot_pos = plot_pos - self.create = True - self.withoutconfig = False - self.createforView = True - self.localfolder = localfolder - self.extension = extension - self.period = period - self.protocol = protocol - - def recover(self): - - return self.server, self.remotefolder, self.username, self.password, self.ftp_wei, self.exp_code, self.sub_exp_code, self.plot_pos, self.extension, self.period, self.protocol - -class ShowMeConsole(QtCore.QObject): - - textWritten = QtCore.pyqtSignal(str) - - def write(self, text): - - if len(text) == 0: - self.textWritten.emit("\n") - return - - if text[-1] == "\n": - text = text[:-1] - - self.textWritten.emit(str(text)) - - def flush(self): - pass diff --git a/schainpy/gui/viewcontroller/ftp.py b/schainpy/gui/viewcontroller/ftp.py deleted file mode 100644 index 5b08bbc..0000000 --- a/schainpy/gui/viewcontroller/ftp.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -Module implementing Ftp. -""" - -from PyQt4.QtGui import QMainWindow -from PyQt4.QtCore import pyqtSignature - -from schainpy.gui.viewer.ftp import Ui_Ftp - -class Ftp(QMainWindow, Ui_MainWindow): - """ - Class documentation goes here. - """ - def __init__(self, parent = None): - """ - Constructor - """ - QMainWindow.__init__(self, parent) - self.setupUi(self) diff --git a/schainpy/gui/viewcontroller/initwindow.py b/schainpy/gui/viewcontroller/initwindow.py deleted file mode 100644 index 3ee1396..0000000 --- a/schainpy/gui/viewcontroller/initwindow.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- - -""" -Module implementing InitWindow. -""" -import os - -from PyQt4.QtGui import QDialog -from PyQt4.QtCore import pyqtSignature -from PyQt4 import QtCore -from PyQt4 import QtGui - -from schainpy.gui.viewer.ui_initwindow import Ui_InitWindow -from schainpy.gui.figures import tools - -FIGURES_PATH = tools.get_path() - -class InitWindow(QDialog, Ui_InitWindow): - """ - Class documentation goes here. - """ - def __init__(self, parent = None): - """ - Constructor - """ - QDialog.__init__(self, parent) - self.setupUi(self) - self.setWindowTitle("ROJ-Signal Chain") - self.setWindowIcon(QtGui.QIcon( os.path.join(FIGURES_PATH,"logo.png") )) - - @pyqtSignature("") - def on_ExitBtn_clicked(self): - """ - Exit cierra la ventana de Bienvenida - """ - self.close() - - @pyqtSignature("") - def on_ContinueBtn_clicked(self): - """ - Continue cierra la ventana de Bienvenida, a este evento se le complementa con la accion - conectar con la ventana de configuracion de Workspace - """ - # TODO: not implemented yet - #raise NotImplementedError - self.accept() diff --git a/schainpy/gui/viewcontroller/parametersModel.py b/schainpy/gui/viewcontroller/parametersModel.py deleted file mode 100644 index 665c01f..0000000 --- a/schainpy/gui/viewcontroller/parametersModel.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -Classes to save parameters from Windows. - --Project window --Voltage window --Spectra window --SpectraHeis window --Correlation window - -""" - -class ProjectParms(): - - parmsOk = False - name = None - description = None - datatype = None - ext = None - dpath = None - startDate = None - endDate = None - startTime = None - endTime = None - online = None - delay = None - walk = None - expLabel = None - set = None - ippKm = None - - def __init__(self): - - self.parmsOk = True - self.description = '' - self.expLabel = '' - self.set = '' - self.ippKm = '' - self.walk = None - self.delay = '' - - def getDatatypeIndex(self): - - indexDatatype = None - - if 'voltage' in self.datatype.lower(): - indexDatatype = 0 - if 'spectra' in self.datatype.lower(): - indexDatatype = 1 - if 'fits' in self.datatype.lower(): - indexDatatype = 2 - if 'usrp' in self.datatype.lower(): - indexDatatype = 3 - return indexDatatype - - def getExt(self): - - ext = None - - if self.datatype.lower() == 'voltage': - ext = '.r' - if self.datatype.lower() == 'spectra': - ext = '.pdata' - if self.datatype.lower() == 'fits': - ext = '.fits' - if self.datatype.lower() == 'usrp': - ext = '.hdf5' - return ext - - def set(self, project_name, datatype, ext, dpath, online, - startDate=None, endDate=None, startTime=None, endTime=None, - delay=None, walk=None, set=None, ippKm=None, parmsOk=True, expLabel=''): - - name = project_name - datatype = datatype - ext = ext - dpath = dpath - startDate = startDate - endDate = endDate - startTime = startTime - endTime = endTime - online = online - delay = delay - walk = walk - set = set - ippKm = ippKm - expLabel = expLabel - - self.parmsOk = parmsOk - - def isValid(self): - - return self.parmsOk \ No newline at end of file diff --git a/schainpy/gui/viewcontroller/propertiesViewModel.py b/schainpy/gui/viewcontroller/propertiesViewModel.py deleted file mode 100644 index 1a278ee..0000000 --- a/schainpy/gui/viewcontroller/propertiesViewModel.py +++ /dev/null @@ -1,211 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module contains every model class to create, modify and show a property tree on a GUI. -""" - -from PyQt4 import QtCore -import itertools - -HORIZONTAL_HEADERS = ("Property","Value " ) - -HORIZONTAL = ("RAMA :",) - -class PropertyBuffer(): - - def __init__(self): - - self.clear() - - def clear(self): - - self.headerList = [] - self.parmList = [] - self.valueList = [] - - def append(self, header, parm, value): - - self.headerList.append(header) - self.parmList.append(parm) - self.valueList.append(value) - - return - - def get(self): - - return self.headerList, self.parmList, self.valueList - - def getPropertyModel(self): - - propertiesModel = TreeModel() - propertiesModel.showProperties(self.headerList, self.parmList, self.valueList) - - return propertiesModel - - -class TreeModel(QtCore.QAbstractItemModel): - ''' - a model to display a few names, ordered by encabezado - - ''' - def __init__(self ,parent=None): - super(TreeModel, self).__init__(parent) - self.people = [] - - def initProjectView(self): - """ - Reemplazo del método showtree - """ - HORIZONTAL_HEADERS = ("Property","Value " ) - HORIZONTAL = ("RAMA :",) - self.rootItem = TreeItem(None, "ALL", None) - self.parents = {0 : self.rootItem} - self.__setupModelData() - - def initPUVoltageView(self): - HORIZONTAL_HEADERS = ("Operation"," Parameter Value " ) - HORIZONTAL = ("RAMA :",) - self.rootItem = TreeItem(None, "ALL", None) - self.parents = {0 : self.rootItem} - self.__setupModelData() - - def showProperties(self,headerList, parmList, valueList): - """ - set2Obje - """ - for header, parameter, value in itertools.izip(headerList, parmList, valueList): - person = person_class(header, parameter, value) - self.people.append(person) - - self.rootItem = TreeItem(None, "ALL", None) - self.parents = {0 : self.rootItem} - self.__setupModelData() - - def columnCount(self, parent=None): - if parent and parent.isValid(): - return parent.internalPointer().columnCount() - else: - return len(HORIZONTAL_HEADERS) - - def data(self, index, role): - if not index.isValid(): - return QtCore.QVariant() - - item = index.internalPointer() - if role == QtCore.Qt.DisplayRole: - return item.data(index.column()) - if role == QtCore.Qt.UserRole: - if item: - return item.person - - return QtCore.QVariant() - - def index(self, row, column, parent): - if not self.hasIndex(row, column, parent): - return QtCore.QModelIndex() - - if not parent.isValid(): - parentItem = self.rootItem - else: - parentItem = parent.internalPointer() - - childItem = parentItem.child(row) - if childItem: - return self.createIndex(row, column, childItem) - else: - return QtCore.QModelIndex() - - def parent(self, index): - if not index.isValid(): - return QtCore.QModelIndex() - - childItem = index.internalPointer() - if not childItem: - return QtCore.QModelIndex() - - parentItem = childItem.parent() - - if parentItem == self.rootItem: - return QtCore.QModelIndex() - - return self.createIndex(parentItem.row(), 0, parentItem) - - def rowCount(self, parent=QtCore.QModelIndex()): - if parent.column() > 0: - return 0 - if not parent.isValid(): - p_Item = self.rootItem - else: - p_Item = parent.internalPointer() - return p_Item.childCount() - - def __setupModelData(self): - for person in self.people: - if person.value: - encabezado = person.header - - if not self.parents.has_key(encabezado): - newparent = TreeItem(None, encabezado, self.rootItem) - self.rootItem.appendChild(newparent) - - self.parents[encabezado] = newparent - - parentItem = self.parents[encabezado] - newItem = TreeItem(person, "", parentItem) - parentItem.appendChild(newItem) - -class person_class(object): - ''' - a trivial custom data object - ''' - def __init__(self, header, parameter, value): - self.header = header - self.parameter = parameter - self.value = value - - def __repr__(self): - return "PERSON - %s %s"% (self.parameter, self.header) - -class TreeItem(object): - ''' - a python object used to return row/column data, and keep note of - it's parents and/or children - ''' - def __init__(self, person, header, parentItem): - self.person = person - self.parentItem = parentItem - self.header = header - self.childItems = [] - - def appendChild(self, item): - self.childItems.append(item) - - def child(self, row): - return self.childItems[row] - - def childCount(self): - return len(self.childItems) - - def columnCount(self): - return 2 - - def data(self, column): - if self.person == None: - if column == 0: - return QtCore.QVariant(self.header) - if column == 1: - return QtCore.QVariant("") - else: - if column == 0: - return QtCore.QVariant(self.person.parameter) - if column == 1: - return QtCore.QVariant(self.person.value) - return QtCore.QVariant() - - def parent(self): - return self.parentItem - - def row(self): - if self.parentItem: - return self.parentItem.childItems.index(self) - return 0 - \ No newline at end of file diff --git a/schainpy/gui/viewcontroller/workspace.py b/schainpy/gui/viewcontroller/workspace.py deleted file mode 100644 index 4ad7729..0000000 --- a/schainpy/gui/viewcontroller/workspace.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -import os -from os.path import expanduser - -from PyQt4.QtGui import QDialog -from PyQt4.QtCore import pyqtSignature -from PyQt4.QtCore import pyqtSignal -from PyQt4 import QtGui, QtCore - -from schainpy.gui.viewer.ui_workspace import Ui_Workspace -from schainpy.gui.figures import tools - -FIGURES_PATH = tools.get_path() - -class Workspace(QDialog, Ui_Workspace): - """ - Class documentation goes here. - """ - - def __init__(self, parent = None): - """ - Constructor - """ - QDialog.__init__(self, parent) - self.dirList=[] - self.setupUi(self) - self.setWindowTitle("ROJ-Signal Chain") - self.setWindowIcon(QtGui.QIcon( os.path.join(FIGURES_PATH,"logo.png") )) - #*####### DIRECTORIO DE TRABAJO #########*# - #self.dirCmbBox.setItemText(0, QtGui.QApplication.translate("MainWindow", "C:\WorkSpaceGui", None, QtGui.QApplication.UnicodeUTF8)) - home=expanduser("~") - self.dir=os.path.join(home,'schain_workspace') - if not os.path.exists(self.dir): - os.makedirs(self.dir) - self.dirComBox.addItem(self.dir) - self.i=0 - - - @pyqtSignature("") - def on_dirToolPath_clicked(self): - """ - Slot documentation goes here. - """ - self.i +=1 - self.dirBrowse = str(QtGui.QFileDialog.getExistingDirectory(self, 'Open Directory', './', QtGui.QFileDialog.ShowDirsOnly)) - self.dirComBox.addItem(self.dirBrowse) - self.dirComBox.setCurrentIndex(self.i) - - - - @pyqtSignature("") - def on_dirOkBtn_clicked(self): - """ - VISTA DE INTERFAZ GRÁFICA - """ - self.accept() - # self.close() -# - @pyqtSignature("") - def on_dirCancelBtn_clicked(self): - """ - Cerrar - """ - self.close() - - - - - - \ No newline at end of file diff --git a/schainpy/gui/viewer/__init__.py b/schainpy/gui/viewer/__init__.py deleted file mode 100644 index 416f53f..0000000 --- a/schainpy/gui/viewer/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# import ui_initwindow -# import ui_workspace -# import ui_mainwindow -# import ui_window -# import ui_ftp \ No newline at end of file diff --git a/schainpy/gui/viewer/ui_ftp.py b/schainpy/gui/viewer/ui_ftp.py deleted file mode 100644 index b785509..0000000 --- a/schainpy/gui/viewer/ui_ftp.py +++ /dev/null @@ -1,140 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file '/home/alex/ui/ftpConfig4.ui' -# -# Created: Tue Aug 20 08:24:35 2013 -# by: PyQt4 UI code generator 4.10 -# -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_Ftp(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName(_fromUtf8("MainWindow")) - MainWindow.resize(374, 399) - MainWindow.setMinimumSize(QtCore.QSize(374, 399)) - MainWindow.setMaximumSize(QtCore.QSize(374, 399)) - self.centralWidget = QtGui.QWidget(MainWindow) - self.centralWidget.setObjectName(_fromUtf8("centralWidget")) - self.label = QtGui.QLabel(self.centralWidget) - self.label.setGeometry(QtCore.QRect(9, 38, 47, 17)) - self.label.setObjectName(_fromUtf8("label")) - self.label_2 = QtGui.QLabel(self.centralWidget) - self.label_2.setGeometry(QtCore.QRect(9, 133, 77, 17)) - self.label_2.setObjectName(_fromUtf8("label_2")) - self.label_3 = QtGui.QLabel(self.centralWidget) - self.label_3.setGeometry(QtCore.QRect(9, 166, 68, 17)) - self.label_3.setObjectName(_fromUtf8("label_3")) - self.label_4 = QtGui.QLabel(self.centralWidget) - self.label_4.setGeometry(QtCore.QRect(9, 9, 101, 17)) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.label_4.setFont(font) - self.label_4.setObjectName(_fromUtf8("label_4")) - self.label_5 = QtGui.QLabel(self.centralWidget) - self.label_5.setGeometry(QtCore.QRect(9, 104, 87, 17)) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.label_5.setFont(font) - self.label_5.setObjectName(_fromUtf8("label_5")) - self.label_6 = QtGui.QLabel(self.centralWidget) - self.label_6.setGeometry(QtCore.QRect(9, 71, 47, 17)) - self.label_6.setObjectName(_fromUtf8("label_6")) - self.serverFTP = QtGui.QLineEdit(self.centralWidget) - self.serverFTP.setGeometry(QtCore.QRect(130, 40, 231, 27)) - self.serverFTP.setObjectName(_fromUtf8("serverFTP")) - self.folderFTP = QtGui.QLineEdit(self.centralWidget) - self.folderFTP.setGeometry(QtCore.QRect(130, 70, 231, 27)) - self.folderFTP.setObjectName(_fromUtf8("folderFTP")) - self.usernameFTP = QtGui.QLineEdit(self.centralWidget) - self.usernameFTP.setGeometry(QtCore.QRect(130, 130, 231, 27)) - self.usernameFTP.setObjectName(_fromUtf8("usernameFTP")) - self.passwordFTP = QtGui.QLineEdit(self.centralWidget) - self.passwordFTP.setEchoMode(QtGui.QLineEdit.Password) - self.passwordFTP.setGeometry(QtCore.QRect(130, 160, 231, 27)) - self.passwordFTP.setObjectName(_fromUtf8("passwordFTP")) - self.ftpCancelButton = QtGui.QPushButton(self.centralWidget) - self.ftpCancelButton.setGeometry(QtCore.QRect(130, 360, 111, 27)) - self.ftpCancelButton.setObjectName(_fromUtf8("ftpCancelButton")) - self.ftpOkButton = QtGui.QPushButton(self.centralWidget) - self.ftpOkButton.setGeometry(QtCore.QRect(250, 360, 111, 27)) - self.ftpOkButton.setObjectName(_fromUtf8("ftpOkButton")) - self.label_7 = QtGui.QLabel(self.centralWidget) - self.label_7.setGeometry(QtCore.QRect(10, 200, 66, 17)) - font = QtGui.QFont() - font.setBold(True) - font.setWeight(75) - self.label_7.setFont(font) - self.label_7.setObjectName(_fromUtf8("label_7")) - self.label_8 = QtGui.QLabel(self.centralWidget) - self.label_8.setGeometry(QtCore.QRect(10, 230, 81, 17)) - self.label_8.setObjectName(_fromUtf8("label_8")) - self.label_9 = QtGui.QLabel(self.centralWidget) - self.label_9.setGeometry(QtCore.QRect(10, 260, 81, 17)) - self.label_9.setObjectName(_fromUtf8("label_9")) - self.label_10 = QtGui.QLabel(self.centralWidget) - self.label_10.setGeometry(QtCore.QRect(10, 290, 81, 17)) - self.label_10.setObjectName(_fromUtf8("label_10")) - self.label_11 = QtGui.QLabel(self.centralWidget) - self.label_11.setGeometry(QtCore.QRect(10, 320, 81, 17)) - self.label_11.setObjectName(_fromUtf8("label_11")) - self.weightFTP = QtGui.QLineEdit(self.centralWidget) - self.weightFTP.setGeometry(QtCore.QRect(130, 230, 231, 27)) - self.weightFTP.setObjectName(_fromUtf8("weightFTP")) - self.expcodeFTP = QtGui.QLineEdit(self.centralWidget) - self.expcodeFTP.setGeometry(QtCore.QRect(130, 260, 231, 27)) - self.expcodeFTP.setObjectName(_fromUtf8("expcodeFTP")) - self.subexpFTP = QtGui.QLineEdit(self.centralWidget) - self.subexpFTP.setGeometry(QtCore.QRect(130, 290, 231, 27)) - self.subexpFTP.setObjectName(_fromUtf8("subexpFTP")) - self.plotposFTP = QtGui.QLineEdit(self.centralWidget) - self.plotposFTP.setGeometry(QtCore.QRect(130, 320, 231, 27)) - self.plotposFTP.setObjectName(_fromUtf8("plotposFTP")) - MainWindow.setCentralWidget(self.centralWidget) - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) - self.label.setText(_translate("MainWindow", "Server:", None)) - self.label_2.setText(_translate("MainWindow", "User Name:", None)) - self.label_3.setText(_translate("MainWindow", "Password:", None)) - self.label_4.setText(_translate("MainWindow", "Server Details", None)) - self.label_5.setText(_translate("MainWindow", "User Details", None)) - self.label_6.setText(_translate("MainWindow", "Remote Folder:", None)) - self.ftpCancelButton.setText(_translate("MainWindow", "Cancel", None)) - self.ftpOkButton.setText(_translate("MainWindow", "Ok", None)) - self.label_7.setText(_translate("MainWindow", "Project Details", None)) - self.label_8.setText(_translate("MainWindow", "Ftp_wei:", None)) - self.label_9.setText(_translate("MainWindow", "Exp_code:", None)) - self.label_10.setText(_translate("MainWindow", "Sub_exp:", None)) - self.label_11.setText(_translate("MainWindow", "Plot_pos:", None)) - - -if __name__ == "__main__": - import sys - app = QtGui.QApplication(sys.argv) - MainWindow = QtGui.QMainWindow() - ui = Ui_Ftp() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) - diff --git a/schainpy/gui/viewer/ui_initwindow.py b/schainpy/gui/viewer/ui_initwindow.py deleted file mode 100644 index d6bc947..0000000 --- a/schainpy/gui/viewer/ui_initwindow.py +++ /dev/null @@ -1,95 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file '/home/roj-idl71/SignalChain/initwindowv2.ui' -# -# Created: Wed Mar 6 15:32:39 2013 -# by: PyQt4 UI code generator 4.8.6 -# -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - _fromUtf8 = lambda s: s - -import os -from schainpy.gui.figures import tools -from schainpy import __version__ - -INITIAL_MSG = "Signal Chain GUI - v%s" %__version__ -FIGURES_PATH = tools.get_path() - -class Ui_InitWindow(object): - def setupUi(self, Dialog): - Dialog.setObjectName(_fromUtf8("Dialog")) - Dialog.resize(652, 496) - Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) - self.gridLayout = QtGui.QGridLayout(Dialog) - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - self.verticalLayout_3 = QtGui.QVBoxLayout() - self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.verticalLayout_4 = QtGui.QVBoxLayout() - self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - self.label_3 = QtGui.QLabel(Dialog) - font = QtGui.QFont() - font.setFamily(_fromUtf8("Cambria")) - font.setPointSize(22) - font.setBold(False) - font.setWeight(50) - self.label_3.setFont(font) - self.label_3.setText(QtGui.QApplication.translate("Dialog", INITIAL_MSG, None, QtGui.QApplication.UnicodeUTF8)) - self.label_3.setObjectName(_fromUtf8("label_3")) - self.verticalLayout_4.addWidget(self.label_3) - self.line_2 = QtGui.QFrame(Dialog) - self.line_2.setFrameShape(QtGui.QFrame.HLine) - self.line_2.setFrameShadow(QtGui.QFrame.Sunken) - self.line_2.setObjectName(_fromUtf8("line_2")) - self.verticalLayout_4.addWidget(self.line_2) - self.label_4 = QtGui.QLabel(Dialog) - self.label_4.setText(_fromUtf8("")) - self.label_4.setPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH,"w.jpg") ))) - self.label_4.setScaledContents(True) - self.label_4.setObjectName(_fromUtf8("label_4")) - self.verticalLayout_4.addWidget(self.label_4) - self.verticalLayout_3.addLayout(self.verticalLayout_4) - self.horizontalLayout_3 = QtGui.QHBoxLayout() - self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - self.horizontalLayout_4 = QtGui.QHBoxLayout() - self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) - spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.horizontalLayout_4.addItem(spacerItem) - self.ExitBtn = QtGui.QPushButton(Dialog) - self.ExitBtn.setText(QtGui.QApplication.translate("Dialog", "Exit", None, QtGui.QApplication.UnicodeUTF8)) - self.ExitBtn.setObjectName(_fromUtf8("ExitBtn")) - self.horizontalLayout_4.addWidget(self.ExitBtn) - self.ContinueBtn = QtGui.QPushButton(Dialog) - self.ContinueBtn.setText(QtGui.QApplication.translate("Dialog", "Continue", None, QtGui.QApplication.UnicodeUTF8)) - self.ContinueBtn.setObjectName(_fromUtf8("ContinueBtn")) - self.horizontalLayout_4.addWidget(self.ContinueBtn) - spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.horizontalLayout_4.addItem(spacerItem1) - self.horizontalLayout_3.addLayout(self.horizontalLayout_4) - self.verticalLayout_3.addLayout(self.horizontalLayout_3) - self.gridLayout.addLayout(self.verticalLayout_3, 0, 0, 1, 1) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - pass - - -if __name__ == "__main__": - import sys - app = QtGui.QApplication(sys.argv) - Dialog = QtGui.QDialog() - ui = Ui_InitWindow() - ui.setupUi(Dialog) - Dialog.show() - sys.exit(app.exec_()) - - - - diff --git a/schainpy/gui/viewer/ui_mainwindow.py b/schainpy/gui/viewer/ui_mainwindow.py deleted file mode 100644 index fb097e4..0000000 --- a/schainpy/gui/viewer/ui_mainwindow.py +++ /dev/null @@ -1,352 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file '/home/alex/ui/MainWindow_21_02_13_v49.ui' -# -# Created: Mon Mar 24 13:28:36 2014 -# by: PyQt4 UI code generator 4.10 -# -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui -from windows import * - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -import os -from schainpy.gui.figures import tools -from schainpy import __version__ - -FIGURES_PATH = tools.get_path() - -ICON_START = "start_green.png" -ICON_PAUSE = "pause_yellow.png" -ICON_STOP = "stop_red.png" - -ICON_PAUSE_ENA = "restart_yellow.png" - -ICON_START_DIS = "start.png" -ICON_PAUSE_DIS = "pause.png" -ICON_STOP_DIS = "stop.png" - -class Ui_EnvWindow(object): - - def changeStartIcon(self, started=False): - - if started == False: - icon_name = ICON_START - else: - icon_name = ICON_START_DIS - - iconStart = QtGui.QIcon() - iconStart.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH, icon_name) )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionStarToolbar.setIcon(iconStart) - - return - - def changePauseIcon(self, paused=False): - - if paused == True: - icon_name = ICON_PAUSE_ENA - else: - icon_name = ICON_PAUSE - - iconPause = QtGui.QIcon() - iconPause.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH, icon_name) )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionPauseToolbar.setIcon(iconPause) - - return - - def changeStopIcon(self, started=False): - - if started == True: - icon_name = ICON_STOP - else: - icon_name = ICON_STOP_DIS - - iconStop = QtGui.QIcon() - iconStop.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH, icon_name) )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.actionStopToolbar.setIcon(iconStop) - - return - - def setupUi(self, MainWindow): - - self.paused=False - - MainWindow.setObjectName(_fromUtf8("MainWindow")) - MainWindow.resize(1200, 800) - - self.centralWidget = QtGui.QWidget(MainWindow) - self.centralWidget.setObjectName(_fromUtf8("centralWidget")) - self.gridLayout_16 = QtGui.QGridLayout(self.centralWidget) - self.gridLayout_16.setObjectName(_fromUtf8("gridLayout_16")) - self.splitter_2 = QtGui.QSplitter(self.centralWidget) - self.splitter_2.setOrientation(QtCore.Qt.Horizontal) - self.splitter_2.setObjectName(_fromUtf8("splitter_2")) - self.projectExplorerTree = QtGui.QTreeView(self.splitter_2) - self.projectExplorerTree.setObjectName(_fromUtf8("projectExplorerTree")) - self.splitter = QtGui.QSplitter(self.splitter_2) - self.splitter.setOrientation(QtCore.Qt.Vertical) - self.splitter.setObjectName(_fromUtf8("splitter")) - self.tabWidgetProject = QtGui.QTabWidget(self.splitter) - self.tabWidgetProject.setMinimumSize(QtCore.QSize(0, 278)) - self.tabWidgetProject.setMaximumSize(QtCore.QSize(16777215, 16777215)) - self.tabWidgetProject.setObjectName(_fromUtf8("tabWidgetProject")) - - self.tabConsole = QtGui.QTabWidget(self.splitter) - self.tabConsole.setMinimumSize(QtCore.QSize(0, 0)) - self.tabConsole.setObjectName(_fromUtf8("tabConsole")) - self.tab_5 = QtGui.QWidget() - self.tab_5.setObjectName(_fromUtf8("tab_5")) - self.gridLayout_4 = QtGui.QGridLayout(self.tab_5) - self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4")) - self.console = QtGui.QTextEdit(self.tab_5) - self.console.setObjectName(_fromUtf8("console")) - self.gridLayout_4.addWidget(self.console, 0, 0, 1, 1) - self.tabConsole.addTab(self.tab_5, _fromUtf8("")) - self.tabWidget = QtGui.QTabWidget(self.splitter_2) - self.tabWidget.setObjectName(_fromUtf8("tabWidget")) - self.tabProjectProperty = QtGui.QWidget() - self.tabProjectProperty.setObjectName(_fromUtf8("tabProjectProperty")) - self.gridLayout_8 = QtGui.QGridLayout(self.tabProjectProperty) - self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8")) - self.treeProjectProperties = QtGui.QTreeView(self.tabProjectProperty) - self.treeProjectProperties.setObjectName(_fromUtf8("treeProjectProperties")) - self.gridLayout_8.addWidget(self.treeProjectProperties, 0, 0, 1, 1) - self.tabWidget.addTab(self.tabProjectProperty, _fromUtf8("")) - self.gridLayout_16.addWidget(self.splitter_2, 1, 0, 1, 1) - - MainWindow.setCentralWidget(self.centralWidget) - self.toolBar = QtGui.QToolBar(MainWindow) - self.toolBar.setObjectName(_fromUtf8("toolBar")) - MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar) - - self.menuBar = QtGui.QMenuBar(MainWindow) - self.menuBar.setGeometry(QtCore.QRect(0, 0, 1065, 25)) - self.menuBar.setObjectName(_fromUtf8("menuBar")) - self.menuProject = QtGui.QMenu(self.menuBar) - self.menuProject.setObjectName(_fromUtf8("menuProject")) - self.menuRun = QtGui.QMenu(self.menuBar) - self.menuRun.setObjectName(_fromUtf8("menuRun")) - self.menuOptions = QtGui.QMenu(self.menuBar) - self.menuOptions.setObjectName(_fromUtf8("menuOptions")) - self.menuHelp = QtGui.QMenu(self.menuBar) - self.menuHelp.setObjectName(_fromUtf8("menuHelp")) - MainWindow.setMenuBar(self.menuBar) - - iconOpen = QtGui.QIcon() - iconOpen.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH,"open.png") )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - iconCreate = QtGui.QIcon() - iconCreate.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH,"new.png") )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - iconSave = QtGui.QIcon() - iconSave.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH,"save.png") )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - iconStart = QtGui.QIcon() - iconStart.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH, ICON_START_DIS) )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - iconStop = QtGui.QIcon() - iconStop.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH, ICON_STOP_DIS) )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - iconPause = QtGui.QIcon() - iconPause.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH, ICON_PAUSE_DIS) )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - iconAddPU = QtGui.QIcon() - iconAddPU.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH,"branch.png") )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - iconClose = QtGui.QIcon() - iconClose.addPixmap(QtGui.QPixmap(_fromUtf8( os.path.join(FIGURES_PATH,"close.png") )), QtGui.QIcon.Normal, QtGui.QIcon.Off) - - - self.actionOpen = QtGui.QAction(MainWindow) - self.actionOpen.setIcon(iconOpen) - self.actionOpen.setObjectName(_fromUtf8("actionOpen")) - self.actionCreate = QtGui.QAction(MainWindow) - self.actionCreate.setIcon(iconCreate) - self.actionCreate.setObjectName(_fromUtf8("actionCreate")) - self.actionSave = QtGui.QAction(MainWindow) - self.actionSave.setIcon(iconSave) - self.actionSave.setObjectName(_fromUtf8("actionSave")) - self.actionClose = QtGui.QAction(MainWindow) - self.actionClose.setIcon(iconClose) - self.actionClose.setObjectName(_fromUtf8("actionClose")) - self.actionStart = QtGui.QAction(MainWindow) - self.actionStart.setIcon(iconStart) - self.actionStart.setObjectName(_fromUtf8("actionStart")) - self.actionPause = QtGui.QAction(MainWindow) - self.actionPause.setIcon(iconPause) - self.actionPause.setObjectName(_fromUtf8("actionPause")) - self.actionStop = QtGui.QAction(MainWindow) - self.actionStop.setIcon(iconStop) - self.actionStop.setObjectName(_fromUtf8("actionStop")) - self.actionAbout = QtGui.QAction(MainWindow) - self.actionAbout.setObjectName(_fromUtf8("actionAbout")) - - self.actionOpenToolbar = QtGui.QAction(MainWindow) - self.actionOpenToolbar.setIcon(iconOpen) - self.actionOpenToolbar.setObjectName(_fromUtf8("actionOpenToolbar")) - self.actionCreateToolbar = QtGui.QAction(MainWindow) - self.actionCreateToolbar.setIcon(iconCreate) - self.actionCreateToolbar.setObjectName(_fromUtf8("actionCreateToolbar")) - self.actionSaveToolbar = QtGui.QAction(MainWindow) - self.actionSaveToolbar.setIcon(iconSave) - self.actionSaveToolbar.setObjectName(_fromUtf8("actionSaveToolbar")) - self.actionStarToolbar = QtGui.QAction(MainWindow) - self.actionStarToolbar.setIcon(iconStart) - self.actionStarToolbar.setObjectName(_fromUtf8("actionStarToolbar")) - self.actionStopToolbar = QtGui.QAction(MainWindow) - self.actionStopToolbar.setIcon(iconStop) - self.actionStopToolbar.setObjectName(_fromUtf8("actionStopToolbar")) - self.actionPauseToolbar = QtGui.QAction(MainWindow) - self.actionPauseToolbar.setIcon(iconPause) - self.actionPauseToolbar.setObjectName(_fromUtf8("actionPauseToolbar")) - self.actionAddPU = QtGui.QAction(MainWindow) - self.actionAddPU.setIcon(iconAddPU) - self.actionAddPU.setObjectName(_fromUtf8("actionAddPU")) - self.actionFTP = QtGui.QAction(MainWindow) - self.actionFTP.setObjectName(_fromUtf8("actionFTP")) - self.toolBar.addAction(self.actionOpenToolbar) - self.toolBar.addSeparator() - self.toolBar.addAction(self.actionCreateToolbar) - self.toolBar.addSeparator() - self.toolBar.addAction(self.actionAddPU) - self.toolBar.addSeparator() - self.toolBar.addAction(self.actionSaveToolbar) - self.toolBar.addSeparator() - self.toolBar.addAction(self.actionStarToolbar) - self.toolBar.addSeparator() - self.toolBar.addAction(self.actionPauseToolbar) - self.toolBar.addSeparator() - self.toolBar.addAction(self.actionStopToolbar) - self.toolBar.addSeparator() - -# self.actionPause.triggered.connect(self.changePauseIcon) -# self.actionPauseToolbar.triggered.connect(self.changePauseIcon) - - self.menuProject.addAction(self.actionOpen) - self.menuProject.addAction(self.actionCreate) - self.menuProject.addAction(self.actionSave) - self.menuProject.addAction(self.actionClose) - self.menuRun.addAction(self.actionStart) - self.menuRun.addAction(self.actionPause) - self.menuRun.addAction(self.actionStop) - self.menuOptions.addAction(self.actionFTP) - self.menuHelp.addAction(self.actionAbout) - self.menuBar.addAction(self.menuProject.menuAction()) - self.menuBar.addAction(self.menuRun.menuAction()) - self.menuBar.addAction(self.menuOptions.menuAction()) - self.menuBar.addAction(self.menuHelp.menuAction()) - - self.tabConsole.setCurrentIndex(0) - self.tabWidget.setCurrentIndex(0) - - def retranslateUi(self, MainWindow): - - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) - - self.tabConsole.setTabText(self.tabConsole.indexOf(self.tab_5), _translate("MainWindow", "Console", None)) - - self.tabWidget.setTabText(self.tabWidget.indexOf(self.tabProjectProperty), _translate("MainWindow", "Project Property", None)) - self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar", None)) - self.menuProject.setTitle(_translate("MainWindow", "Project", None)) - self.menuRun.setTitle(_translate("MainWindow", "Run", None)) - self.menuOptions.setTitle(_translate("MainWindow", "Options", None)) - self.menuHelp.setTitle(_translate("MainWindow", "Help", None)) - self.actionOpen.setText(_translate("MainWindow", "Open", None)) - self.actionCreate.setText(_translate("MainWindow", "Create", None)) - self.actionSave.setText(_translate("MainWindow", "Save", None)) - self.actionClose.setText(_translate("MainWindow", "Close", None)) - self.actionStart.setText(_translate("MainWindow", "Start", None)) - self.actionPause.setText(_translate("MainWindow", "Pause", None)) - self.actionStop.setText(_translate("MainWindow", "Stop", None)) - self.actionAbout.setText(_translate("MainWindow", "About SChain", None)) - self.actionOpenToolbar.setText(_translate("MainWindow", "openToolbar", None)) - self.actionOpenToolbar.setToolTip(_translate("MainWindow", "Open a project", None)) - self.actionCreateToolbar.setText(_translate("MainWindow", "createToolbar", None)) - self.actionCreateToolbar.setToolTip(_translate("MainWindow", "Create a new project", None)) - self.actionSaveToolbar.setText(_translate("MainWindow", "saveToolbar", None)) - self.actionSaveToolbar.setToolTip(_translate("MainWindow", "Save a project", None)) - self.actionStarToolbar.setText(_translate("MainWindow", "starToolbar", None)) - self.actionStarToolbar.setToolTip(_translate("MainWindow", "Start process", None)) - self.actionStopToolbar.setText(_translate("MainWindow", "stopToolbar", None)) - self.actionStopToolbar.setToolTip(_translate("MainWindow", "Stop process", None)) - self.actionPauseToolbar.setText(_translate("MainWindow", "pauseToolbar", None)) - self.actionPauseToolbar.setToolTip(_translate("MainWindow", "Pause process", None)) - self.actionAddPU.setText(_translate("MainWindow", "Add Processing Unit", None)) - self.actionFTP.setText(_translate("MainWindow", "FTP", None)) - - def closeEvent(self, event): - - reply = QtGui.QMessageBox.question(self, 'Message', - "Are you sure to quit?", QtGui.QMessageBox.Yes | - QtGui.QMessageBox.No, QtGui.QMessageBox.No) - if reply == QtGui.QMessageBox.Yes: - event.accept() - else: - event.ignore() - - def aboutEvent(self): - title = "Signal Chain Processing Software v%s" %__version__ - message = """ - Developed by: - Miguel Urco - miguel.urco@jro.igp.gob.pe -Jicamarca Radio Observatory -""" - QtGui.QMessageBox.about(self, title, message) - - -class Ui_BasicWindow(Ui_EnvWindow, Ui_ProjectTab, Ui_VoltageTab, Ui_SpectraTab, Ui_SpectraHeisTab, Ui_CorrelationTab): - - def setupUi(self, MainWindow): - - Ui_EnvWindow.setupUi(self, MainWindow) - - Ui_ProjectTab.setupUi(self) - Ui_VoltageTab.setupUi(self) - Ui_SpectraTab.setupUi(self) - Ui_SpectraHeisTab.setupUi(self) - Ui_CorrelationTab.setupUi(self) - - self.retranslateUi(MainWindow) - - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - - Ui_EnvWindow.retranslateUi(self, MainWindow) - - Ui_ProjectTab.retranslateUi(self) - Ui_VoltageTab.retranslateUi(self) - Ui_SpectraTab.retranslateUi(self) - Ui_SpectraHeisTab.retranslateUi(self) - Ui_CorrelationTab.retranslateUi(self) - - -class Ui_AdvancedWindow(Ui_EnvWindow): - - def setupUi(self, AdvancedWindow): - - Ui_MainWindow.setupUi(self, AdvancedWindow) - - def retranslateUi(self, AdvancedWindow): - - Ui_MainWindow.retranslateUi(self, AdvancedWindow) - - - -if __name__ == "__main__": - import sys - app = QtGui.QApplication(sys.argv) - MainWindow = QtGui.QMainWindow() - ui = Ui_BasicWindow() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) - diff --git a/schainpy/gui/viewer/ui_unitprocess.py b/schainpy/gui/viewer/ui_unitprocess.py deleted file mode 100644 index 63b61c8..0000000 --- a/schainpy/gui/viewer/ui_unitprocess.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file '/home/alex/ui/unitProcess4.ui' -# -# Created: Fri May 24 05:23:03 2013 -# by: PyQt4 UI code generator 4.10 -# -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_UnitProcess(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName(_fromUtf8("MainWindow")) - MainWindow.resize(312, 195) - self.centralWidget = QtGui.QWidget(MainWindow) - self.centralWidget.setObjectName(_fromUtf8("centralWidget")) - self.gridLayout = QtGui.QGridLayout(self.centralWidget) - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - self.inputLabel = QtGui.QLabel(self.centralWidget) - font = QtGui.QFont() - font.setPointSize(12) - font.setBold(False) - font.setWeight(50) - self.inputLabel.setFont(font) - self.inputLabel.setObjectName(_fromUtf8("inputLabel")) - self.gridLayout.addWidget(self.inputLabel, 2, 0, 1, 1) - self.unitPcancelbut = QtGui.QPushButton(self.centralWidget) - font = QtGui.QFont() - font.setBold(False) - font.setWeight(50) - self.unitPcancelbut.setFont(font) - self.unitPcancelbut.setObjectName(_fromUtf8("unitPcancelbut")) - self.gridLayout.addWidget(self.unitPcancelbut, 5, 2, 1, 2) - self.unitPokbut = QtGui.QPushButton(self.centralWidget) - font = QtGui.QFont() - font.setBold(False) - font.setWeight(50) - self.unitPokbut.setFont(font) - self.unitPokbut.setObjectName(_fromUtf8("unitPokbut")) - self.gridLayout.addWidget(self.unitPokbut, 5, 0, 1, 2) - self.typeLabel = QtGui.QLabel(self.centralWidget) - font = QtGui.QFont() - font.setPointSize(12) - font.setBold(False) - font.setWeight(50) - self.typeLabel.setFont(font) - self.typeLabel.setObjectName(_fromUtf8("typeLabel")) - self.gridLayout.addWidget(self.typeLabel, 3, 0, 1, 1) - self.nameUP = QtGui.QLabel(self.centralWidget) - font = QtGui.QFont() - font.setPointSize(13) - font.setBold(False) - font.setWeight(50) - self.nameUP.setFont(font) - self.nameUP.setObjectName(_fromUtf8("nameUP")) - self.gridLayout.addWidget(self.nameUP, 0, 1, 1, 2) - spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout.addItem(spacerItem, 0, 3, 1, 1) - self.comboInputBox = QtGui.QComboBox(self.centralWidget) - font = QtGui.QFont() - font.setPointSize(12) - self.comboInputBox.setFont(font) - self.comboInputBox.setObjectName(_fromUtf8("comboInputBox")) - self.gridLayout.addWidget(self.comboInputBox, 2, 1, 1, 3) - self.comboTypeBox = QtGui.QComboBox(self.centralWidget) - font = QtGui.QFont() - font.setPointSize(12) - self.comboTypeBox.setFont(font) - self.comboTypeBox.setObjectName(_fromUtf8("comboTypeBox")) - self.comboTypeBox.addItem(_fromUtf8("")) - self.comboTypeBox.addItem(_fromUtf8("")) - self.comboTypeBox.addItem(_fromUtf8("")) - self.gridLayout.addWidget(self.comboTypeBox, 3, 1, 1, 3) - spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout.addItem(spacerItem1, 0, 0, 1, 1) - spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout.addItem(spacerItem2, 4, 0, 1, 1) - self.line = QtGui.QFrame(self.centralWidget) - self.line.setFrameShape(QtGui.QFrame.HLine) - self.line.setFrameShadow(QtGui.QFrame.Sunken) - self.line.setObjectName(_fromUtf8("line")) - self.gridLayout.addWidget(self.line, 1, 0, 1, 4) - MainWindow.setCentralWidget(self.centralWidget) - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) - self.inputLabel.setText(_translate("MainWindow", "Input:", None)) - self.unitPcancelbut.setText(_translate("MainWindow", "Cancel", None)) - self.unitPokbut.setText(_translate("MainWindow", "Ok", None)) - self.typeLabel.setText(_translate("MainWindow", "Type:", None)) - self.nameUP.setText(_translate("MainWindow", "Processing Unit", None)) - self.comboTypeBox.setItemText(0, _translate("MainWindow", "Voltage", None)) - self.comboTypeBox.setItemText(1, _translate("MainWindow", "Spectra", None)) - self.comboTypeBox.setItemText(2, _translate("MainWindow", "Correlation", None)) - - -if __name__ == "__main__": - import sys - app = QtGui.QApplication(sys.argv) - MainWindow = QtGui.QMainWindow() - ui = Ui_UnitProcess() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) - diff --git a/schainpy/gui/viewer/ui_window.py b/schainpy/gui/viewer/ui_window.py deleted file mode 100644 index efe81e3..0000000 --- a/schainpy/gui/viewer/ui_window.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'C:\Users\alex\ericworkspace\UIDOS\window.ui' -# -# Created: Thu Dec 06 08:56:59 2012 -# by: PyQt4 UI code generator 4.9.4 -# -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - _fromUtf8 = lambda s: s - -class Ui_window(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName(_fromUtf8("MainWindow")) - MainWindow.resize(220, 198) - self.centralWidget = QtGui.QWidget(MainWindow) - self.centralWidget.setObjectName(_fromUtf8("centralWidget")) - self.label = QtGui.QLabel(self.centralWidget) - self.label.setGeometry(QtCore.QRect(20, 10, 131, 20)) - font = QtGui.QFont() - font.setPointSize(12) - self.label.setFont(font) - self.label.setObjectName(_fromUtf8("label")) - self.label_2 = QtGui.QLabel(self.centralWidget) - self.label_2.setGeometry(QtCore.QRect(20, 60, 131, 20)) - font = QtGui.QFont() - font.setPointSize(12) - self.label_2.setFont(font) - self.label_2.setObjectName(_fromUtf8("label_2")) - self.cancelButton = QtGui.QPushButton(self.centralWidget) - self.cancelButton.setGeometry(QtCore.QRect(150, 160, 51, 23)) - self.cancelButton.setObjectName(_fromUtf8("cancelButton")) - self.okButton = QtGui.QPushButton(self.centralWidget) - self.okButton.setGeometry(QtCore.QRect(80, 160, 61, 23)) - self.okButton.setObjectName(_fromUtf8("okButton")) - self.proyectNameLine = QtGui.QLineEdit(self.centralWidget) - self.proyectNameLine.setGeometry(QtCore.QRect(20, 30, 181, 20)) - self.proyectNameLine.setObjectName(_fromUtf8("proyectNameLine")) - self.descriptionTextEdit = QtGui.QTextEdit(self.centralWidget) - self.descriptionTextEdit.setGeometry(QtCore.QRect(20, 80, 181, 71)) - self.descriptionTextEdit.setObjectName(_fromUtf8("descriptionTextEdit")) - self.saveButton = QtGui.QPushButton(self.centralWidget) - self.saveButton.setGeometry(QtCore.QRect(20, 160, 51, 23)) - self.saveButton.setObjectName(_fromUtf8("saveButton")) - MainWindow.setCentralWidget(self.centralWidget) - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("MainWindow", "Project Name:", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("MainWindow", "Description :", None, QtGui.QApplication.UnicodeUTF8)) - self.cancelButton.setText(QtGui.QApplication.translate("MainWindow", "Cancel", None, QtGui.QApplication.UnicodeUTF8)) - self.okButton.setText(QtGui.QApplication.translate("MainWindow", "Ok", None, QtGui.QApplication.UnicodeUTF8)) - self.saveButton.setText(QtGui.QApplication.translate("MainWindow", "Save", None, QtGui.QApplication.UnicodeUTF8)) - - -if __name__ == "__main__": - import sys - app = QtGui.QApplication(sys.argv) - MainWindow = QtGui.QMainWindow() - ui = Ui_window() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) - diff --git a/schainpy/gui/viewer/ui_workspace.py b/schainpy/gui/viewer/ui_workspace.py deleted file mode 100644 index 3775c09..0000000 --- a/schainpy/gui/viewer/ui_workspace.py +++ /dev/null @@ -1,115 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file '/home/alex/ui/workspacev5.ui' -# -# Created: Sun May 12 16:45:47 2013 -# by: PyQt4 UI code generator 4.10 -# -# WARNING! All changes made in this file will be lost! - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_Workspace(object): - def setupUi(self, Dialog): - Dialog.setObjectName(_fromUtf8("Dialog")) - Dialog.setEnabled(True) - Dialog.resize(730, 295) - Dialog.setMinimumSize(QtCore.QSize(730, 295)) - Dialog.setMaximumSize(QtCore.QSize(730, 295)) - self.dirLabel = QtGui.QTextEdit(Dialog) - self.dirLabel.setGeometry(QtCore.QRect(0, 0, 731, 71)) - self.dirLabel.setReadOnly(True) - self.dirLabel.setObjectName(_fromUtf8("dirLabel")) - self.dirWork = QtGui.QLabel(Dialog) - self.dirWork.setGeometry(QtCore.QRect(10, 90, 91, 16)) - font = QtGui.QFont() - font.setPointSize(11) - self.dirWork.setFont(font) - self.dirWork.setObjectName(_fromUtf8("dirWork")) - self.dirComBox = QtGui.QComboBox(Dialog) - self.dirComBox.setGeometry(QtCore.QRect(110, 80, 501, 31)) - palette = QtGui.QPalette() - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.SolidPattern) - palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.SolidPattern) - palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) - brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) - brush.setStyle(QtCore.Qt.SolidPattern) - palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) - self.dirComBox.setPalette(palette) - self.dirComBox.setObjectName(_fromUtf8("dirComBox")) - self.dirToolPath = QtGui.QToolButton(Dialog) - self.dirToolPath.setGeometry(QtCore.QRect(620, 80, 101, 31)) - font = QtGui.QFont() - font.setPointSize(11) - self.dirToolPath.setFont(font) - self.dirToolPath.setObjectName(_fromUtf8("dirToolPath")) - self.widget = QtGui.QWidget(Dialog) - self.widget.setGeometry(QtCore.QRect(10, 120, 711, 121)) - self.widget.setObjectName(_fromUtf8("widget")) - self.horizontalLayout_3 = QtGui.QHBoxLayout(self.widget) - self.horizontalLayout_3.setMargin(0) - self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.horizontalLayout_3.addItem(spacerItem) - spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.horizontalLayout_3.addItem(spacerItem1) - spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.horizontalLayout_3.addItem(spacerItem2) - spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.horizontalLayout_3.addItem(spacerItem3) - spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.horizontalLayout_3.addItem(spacerItem4) - self.dirCancelBtn = QtGui.QPushButton(Dialog) - self.dirCancelBtn.setGeometry(QtCore.QRect(490, 250, 111, 31)) - self.dirCancelBtn.setObjectName(_fromUtf8("dirCancelBtn")) - self.dirOkBtn = QtGui.QPushButton(Dialog) - self.dirOkBtn.setGeometry(QtCore.QRect(610, 250, 111, 31)) - font = QtGui.QFont() - font.setPointSize(11) - self.dirOkBtn.setFont(font) - self.dirOkBtn.setObjectName(_fromUtf8("dirOkBtn")) - - self.retranslateUi(Dialog) - QtCore.QMetaObject.connectSlotsByName(Dialog) - - def retranslateUi(self, Dialog): - Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) - self.dirLabel.setHtml(_translate("Dialog", "\n" -"\n" -"

Select a workspace

\n" -"

Signal Chain stores your projects in a folder called a workspace.

\n" -"

Choose a workspace folder to use for this session.

", None)) - self.dirWork.setText(_translate("Dialog", "Workspace :", None)) - self.dirToolPath.setText(_translate("Dialog", "Browse...", None)) - self.dirCancelBtn.setText(_translate("Dialog", "Cancel", None)) - self.dirOkBtn.setText(_translate("Dialog", "OK", None)) - - -if __name__ == "__main__": - import sys - app = QtGui.QApplication(sys.argv) - Dialog = QtGui.QDialog() - ui = Ui_Workspace() - ui.setupUi(Dialog) - Dialog.show() - sys.exit(app.exec_()) - diff --git a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v44.ui b/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v44.ui deleted file mode 100644 index 02e8a90..0000000 --- a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v44.ui +++ /dev/null @@ -1,1765 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1065 - 711 - - - - MainWindow - - - - - - - Qt::Horizontal - - - - - Qt::Vertical - - - - - 0 - 278 - - - - - 16777215 - 16777215 - - - - 0 - - - - Project - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Project Name : - - - - - - - - - - DataType : - - - - - - - - Voltage - - - - - Spectra - - - - - - - - - - - DataPath : - - - - - - - ... - - - - - - - - - - Read Mode: - - - - - - - - Off Line - - - - - On Line - - - - - - - - Delay: - - - - - - - - - - Walk : - - - - - - - - Search 0 - - - - - Search 1 - - - - - - - - Load - - - - - - - Set: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Star Date: - - - - - - - - - - End Date: - - - - - - - - - - Start Time: - - - - - - - - - - End Time: - - - - - - - - - - Description: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - - Voltage - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - - - - - Value - - - - - Index - - - - - - - - - Value - - - - - Index - - - - - - - - Profile Selector - - - - - - - - Profile List - - - - - Profile Range List - - - - - - - - Decoder - - - - - - - Coherent Integration - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Code: - - - - - - - Select Channels - - - - - - - Select Heights - - - - - - - Filter - - - - - - - - - - Radar Frequency - - - - - - - Mode: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Barker 3 - - - - - Barker 4 - - - - - Barker 5 - - - - - Barker 7 - - - - - Barker 11 - - - - - Barker 13 - - - - - Barker 3 + Comp. - - - - - Barker 4 + Comp. - - - - - Barker 5 + Comp. - - - - - Barker 7 + Comp. - - - - - Barker 11+ Comp. - - - - - Barker 13+ Comp. - - - - - None - - - - - - - - - Time - - - - - Freq 1 - - - - - - - - - Graphics - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - ... - - - - - - - - - - Scope - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Channel List - - - - - - - Show - - - - - - - Freq/Vel - - - - - - - - - - - - - - Path : - - - - - - - Prefix: - - - - - - - Height range - - - - - - - Qt::Horizontal - - - - 40 - 12 - - - - - - - - Qt::Horizontal - - - - 18 - 12 - - - - - - - - - - - - - - Save - - - - - - - - - - - - - - - Output - - - - - - Type: - - - - - - - Path: - - - - - - - - - - ... - - - - - - - - .rawdata - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Blocks per File : - - - - - - - Profiles per Block: - - - - - - - - - - - - - - - Spectra - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - Select Cross Spectra - - - - - - - - Value - - - - - Index - - - - - - - - - - - - Value - - - - - Index - - - - - - - - - - - - - - Remove DC - - - - - - - Select Heights - - - - - - - Select Channel - - - - - - - - - - - - - x-y pairs - - - - - - - nFFTPoints - - - - - - - Incoherent Integration - - - - - - - - Time Interval - - - - - Profiles - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Radar Frequency - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Profiles - - - - - - - - - - - Graphics - - - - - - Coherence Map - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Tmin, Tmax: - - - - - - - - - - - - - - - - - - - - - - - - - - - Prefix - - - - - - - - - - Qt::Horizontal - - - - 28 - 15 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - RTI Plot - - - - - - - Height range: - - - - - - - dBs range: - - - - - - - magnitud [0-1] - - - - - - - - - - - - - Qt::Horizontal - - - - 49 - 15 - - - - - - - - Path - - - - - - - - - - - - - Power Profile - - - - - - - Freq/Vel: - - - - - - - - - - Cross Spectra Plot - - - - - - - ... - - - - - - - Channel List: - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 39 - 15 - - - - - - - - - - - Show - - - - - - - - - - - - - - Wr Period: - - - - - - - Save - - - - - - - - - - - - - - - - - - - - - - - - - - - - ftp - - - - - - - - - - - - - - RTI Noise - - - - - - - - - - - - - - - - - - - - - Time Range: - - - - - - - - - - - Output - - - - - - Type: - - - - - - - - .pdata - - - - - - - - Path: - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - Blocks per File: - - - - - - - Profile per Block: - - - - - - - - - - - - - - - Correlation - - - - - - 0 - - - - Operation - - - - - Graphics - - - - - - - - - - - 0 - 0 - - - - 0 - - - - Console - - - - - - - - - - - - 0 - - - - Project Property - - - - - - - - - - - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1065 - 25 - - - - - Project - - - - - - - - - Run - - - - - - - Options - - - - - - Help - - - - - - - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - Save - - - - - Close - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - Start - - - - - Pause - - - - - About - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - openToolbar - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - createToolbar - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - saveToolbar - - - Save - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - starToolbar - - - Start - - - - - - ../Documents/figure/stopServer.png../Documents/figure/stopServer.png - - - stopToolbar - - - Stop - - - - - - ../workspace/branch_gui_may/gui/figure/pause.png../workspace/branch_gui_may/gui/figure/pause.png - - - pauseToolbar - - - Pause - - - - - - ../addpu.jpg../addpu.jpg - - - addPU - - - - - FTP - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v46.ui b/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v46.ui deleted file mode 100644 index 789d5d2..0000000 --- a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v46.ui +++ /dev/null @@ -1,2179 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1065 - 711 - - - - MainWindow - - - - - - - Qt::Horizontal - - - - - Qt::Vertical - - - - - 0 - 278 - - - - - 16777215 - 16777215 - - - - 0 - - - - Project - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Project Name : - - - - - - - - - - DataType : - - - - - - - - Voltage - - - - - Spectra - - - - - Fits - - - - - - - - - - - DataPath : - - - - - - - ... - - - - - - - - - - Read Mode: - - - - - - - - Off Line - - - - - On Line - - - - - - - - Delay: - - - - - - - - - - Walk : - - - - - - - - Search 0 - - - - - Search 1 - - - - - - - - Load - - - - - - - Set: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Star Date: - - - - - - - - - - End Date: - - - - - - - - - - Start Time: - - - - - - - - - - End Time: - - - - - - - - - - Description: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - - Voltage - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - - - - - Value - - - - - Index - - - - - - - - - Value - - - - - Index - - - - - - - - Profile Selector - - - - - - - - Profile List - - - - - Profile Range List - - - - - - - - Decoder - - - - - - - Coherent Integration - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Code: - - - - - - - Select Channels - - - - - - - Select Heights - - - - - - - Filter - - - - - - - - - - Radar Frequency - - - - - - - Mode: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Barker 3 - - - - - Barker 4 - - - - - Barker 5 - - - - - Barker 7 - - - - - Barker 11 - - - - - Barker 13 - - - - - Barker 3 + Comp. - - - - - Barker 4 + Comp. - - - - - Barker 5 + Comp. - - - - - Barker 7 + Comp. - - - - - Barker 11+ Comp. - - - - - Barker 13+ Comp. - - - - - None - - - - - - - - - Time - - - - - Freq 1 - - - - - - - - - Graphics - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - ... - - - - - - - - - - Scope - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Channel List - - - - - - - Show - - - - - - - Freq/Vel - - - - - - - - - - - - - - Path : - - - - - - - Prefix: - - - - - - - Height range - - - - - - - Qt::Horizontal - - - - 40 - 12 - - - - - - - - Qt::Horizontal - - - - 18 - 12 - - - - - - - - - - - - - - Save - - - - - - - - - - - - - - - Output - - - - - - Type: - - - - - - - Path: - - - - - - - - - - ... - - - - - - - - .rawdata - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Blocks per File : - - - - - - - Profiles per Block: - - - - - - - - - - - - - - - Spectra - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - Select Cross Spectra - - - - - - - - Value - - - - - Index - - - - - - - - - - - - Value - - - - - Index - - - - - - - - - - - - - - Remove DC - - - - - - - Select Heights - - - - - - - Select Channel - - - - - - - - - - - - - x-y pairs - - - - - - - nFFTPoints - - - - - - - Incoherent Integration - - - - - - - - Time Interval - - - - - Profiles - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Radar Frequency - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Profiles - - - - - - - - - - Remove Interference - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - Mode 1 - - - - - Mode 2 - - - - - - - - - Graphics - - - - - - Coherence Map - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Tmin, Tmax: - - - - - - - - - - - - - - - - - - - - - - - - - - - Prefix : - - - - - - - - - - Qt::Horizontal - - - - 28 - 15 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - RTI Plot - - - - - - - Height range: - - - - - - - dBs range: - - - - - - - magnitud [0-1] - - - - - - - - - - - - - Qt::Horizontal - - - - 49 - 15 - - - - - - - - Path : - - - - - - - - - - - - - Power Profile - - - - - - - Freq/Vel: - - - - - - - - - - Cross Spectra Plot - - - - - - - ... - - - - - - - Channel List: - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 39 - 15 - - - - - - - - - - - Show - - - - - - - - - - - - - - Wr Period: - - - - - - - Save - - - - - - - - - - - - - - - - - - - - - - - - - - - - ftp - - - - - - - - - - - - - - RTI Noise - - - - - - - - - - - - - - - - - - - - - Time Range: - - - - - - - - - - - Output - - - - - - Type: - - - - - - - - .pdata - - - - - - - - Path: - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - Blocks per File: - - - - - - - Profile per Block: - - - - - - - - - - - - - - - SpectraHeis - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Clear - - - - - - - Ok - - - - - - - - - - 0 - - - - Operation - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - Time Interval - - - - - - - - Incoherent Intergration - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Graphics - - - - - - Prefix - - - - - - - ... - - - - - - - - - - - - - - ymin - ymax - - - - - - - Tmin - Tmax: - - - - - - - Time Range: - - - - - - - Wr Period - - - - - - - Qt::Horizontal - - - - 134 - 20 - - - - - - - - - - - - - - - - - - - - - Channel List: - - - - - - - xmin - xmax - - - - - - - - - - Save - - - - - - - ftp - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - Path - - - - - - - Show - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 106 - 20 - - - - - - - - - - - - - - - - - - - - - - RTI PLot - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Output - - - - - - Path: - - - - - - - Blocks per File: - - - - - - - Type: - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - - .fits - - - - - - - - Profile per Block: - - - - - - - - - - - - - - - - - - Correlation - - - - - - 0 - - - - Operation - - - - - Graphics - - - - - - - - - - - 0 - 0 - - - - 0 - - - - Console - - - - - - - - - - - - 0 - - - - Project Property - - - - - - - - - - - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1065 - 25 - - - - - Project - - - - - - - - - Run - - - - - - - Options - - - - - - Help - - - - - - - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - Save - - - - - Close - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - Start - - - - - Pause - - - - - About - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - openToolbar - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - createToolbar - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - saveToolbar - - - Save - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - starToolbar - - - Start - - - - - - ../Documents/figure/stopServer.png../Documents/figure/stopServer.png - - - stopToolbar - - - Stop - - - - - - ../workspace/branch_gui_may/gui/figure/pause.png../workspace/branch_gui_may/gui/figure/pause.png - - - pauseToolbar - - - Pause - - - - - - ../addpu.jpg../addpu.jpg - - - addPU - - - - - FTP - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v47.ui b/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v47.ui deleted file mode 100644 index 2035e1a..0000000 --- a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v47.ui +++ /dev/null @@ -1,2186 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1065 - 711 - - - - MainWindow - - - - - - - Qt::Horizontal - - - - - Qt::Vertical - - - - - 0 - 278 - - - - - 16777215 - 16777215 - - - - 0 - - - - Project - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Project Name : - - - - - - - - - - DataType : - - - - - - - - Voltage - - - - - Spectra - - - - - Fits - - - - - - - - - - - DataPath : - - - - - - - ... - - - - - - - - - - Read Mode: - - - - - - - - Off Line - - - - - On Line - - - - - - - - Delay: - - - - - - - - - - Walk : - - - - - - - - Search 0 - - - - - Search 1 - - - - - - - - Load - - - - - - - Set: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Star Date: - - - - - - - - - - End Date: - - - - - - - - - - Start Time: - - - - - - - - - - End Time: - - - - - - - - - - Description: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - - Voltage - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - - - - - Value - - - - - Index - - - - - - - - - Value - - - - - Index - - - - - - - - Profile Selector - - - - - - - - Profile List - - - - - Profile Range List - - - - - - - - Decoder - - - - - - - Coherent Integration - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Code: - - - - - - - Select Channels - - - - - - - Select Heights - - - - - - - Filter - - - - - - - - - - Radar Frequency - - - - - - - Mode: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Barker 3 - - - - - Barker 4 - - - - - Barker 5 - - - - - Barker 7 - - - - - Barker 11 - - - - - Barker 13 - - - - - Barker 3 + Comp. - - - - - Barker 4 + Comp. - - - - - Barker 5 + Comp. - - - - - Barker 7 + Comp. - - - - - Barker 11+ Comp. - - - - - Barker 13+ Comp. - - - - - None - - - - - - - - - Time - - - - - Freq 1 - - - - - - - - - Graphics - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - ... - - - - - - - - - - Scope - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Channel List - - - - - - - Show - - - - - - - Freq/Vel - - - - - - - - - - - - - - Path : - - - - - - - Prefix: - - - - - - - Height range - - - - - - - Qt::Horizontal - - - - 40 - 12 - - - - - - - - Qt::Horizontal - - - - 18 - 12 - - - - - - - - - - - - - - Save - - - - - - - - - - - - - - - Output - - - - - - Type: - - - - - - - Path: - - - - - - - - - - ... - - - - - - - - .rawdata - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Blocks per File : - - - - - - - Profiles per Block: - - - - - - - - - - - - - - - Spectra - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - Select Cross Spectra - - - - - - - - Value - - - - - Index - - - - - - - - - - - - Value - - - - - Index - - - - - - - - - - - - - - Remove DC - - - - - - - Select Heights - - - - - - - Select Channel - - - - - - - - - - - - - x-y pairs - - - - - - - nFFTPoints - - - - - - - Incoherent Integration - - - - - - - - Time Interval - - - - - Profiles - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Radar Frequency - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Profiles - - - - - - - - - - Remove Interference - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - Mode 1 - - - - - Mode 2 - - - - - - - - - Graphics - - - - - - Coherence Map - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Tmin, Tmax: - - - - - - - - - - - - - - - - - - - - - - - - - - - Prefix : - - - - - - - - - - Qt::Horizontal - - - - 28 - 15 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - RTI Plot - - - - - - - Height range: - - - - - - - dBs range: - - - - - - - magnitud [0-1] - - - - - - - - - - - - - Qt::Horizontal - - - - 49 - 15 - - - - - - - - Path : - - - - - - - - - - - - - Power Profile - - - - - - - Freq/Vel: - - - - - - - - - - Cross Spectra Plot - - - - - - - ... - - - - - - - Channel List: - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 39 - 15 - - - - - - - - - - - Show - - - - - - - - - - - - - - Wr Period: - - - - - - - Save - - - - - - - - - - - - - - - - - - - - - - - - - - - - ftp - - - - - - - - - - - - - - RTI Noise - - - - - - - - - - - - - - - - - - - - - Time Range: - - - - - - - - - - - Output - - - - - - Type: - - - - - - - - .pdata - - - - - - - - Path: - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - Blocks per File: - - - - - - - Profile per Block: - - - - - - - - - - - - - - - SpectraHeis - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Clear - - - - - - - Ok - - - - - - - - - - 0 - - - - Operation - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - Time Interval - - - - - - - - Incoherent Intergration - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Graphics - - - - - - Prefix - - - - - - - ... - - - - - - - - - - - - - - ymin - ymax - - - - - - - Tmin - Tmax: - - - - - - - Time Range: - - - - - - - Wr Period - - - - - - - Qt::Horizontal - - - - 134 - 20 - - - - - - - - - - - - - - - - - - - - - Channel List: - - - - - - - xmin - xmax - - - - - - - - - - Save - - - - - - - ftp - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - Path - - - - - - - Show - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 106 - 20 - - - - - - - - - - - - - - - - - - - - - - RTI PLot - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Output - - - - - - Path: - - - - - - - Blocks per File: - - - - - - - Type: - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - - .fits - - - - - - - - Metada - - - - - - - - - - - - - ... - - - - - - - - - - - - Correlation - - - - - - 0 - - - - Operation - - - - - Graphics - - - - - - - - - - - 0 - 0 - - - - 0 - - - - Console - - - - - - - - - - - - 0 - - - - Project Property - - - - - - - - - - - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1065 - 25 - - - - - Project - - - - - - - - - Run - - - - - - - Options - - - - - - Help - - - - - - - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - Save - - - - - Close - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - Start - - - - - Pause - - - - - About - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - openToolbar - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - createToolbar - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - saveToolbar - - - Save - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - starToolbar - - - Start - - - - - - ../Documents/figure/stopServer.png../Documents/figure/stopServer.png - - - stopToolbar - - - Stop - - - - - - ../workspace/branch_gui_may/gui/figure/pause.png../workspace/branch_gui_may/gui/figure/pause.png - - - pauseToolbar - - - Pause - - - - - - ../addpu.jpg../addpu.jpg - - - addPU - - - - - FTP - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v48.ui b/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v48.ui deleted file mode 100644 index d34bd2e..0000000 --- a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v48.ui +++ /dev/null @@ -1,2206 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1065 - 711 - - - - MainWindow - - - - - - - Qt::Horizontal - - - - - Qt::Vertical - - - - - 0 - 278 - - - - - 16777215 - 16777215 - - - - 0 - - - - Project - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Project Name : - - - - - - - - - - DataType : - - - - - - - - Voltage - - - - - Spectra - - - - - Fits - - - - - - - - - - - DataPath : - - - - - - - ... - - - - - - - - - - Read Mode: - - - - - - - - Off Line - - - - - On Line - - - - - - - - Delay: - - - - - - - - - - Walk : - - - - - - - - Search 0 - - - - - Search 1 - - - - - - - - Load - - - - - - - Set: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Star Date: - - - - - - - - - - End Date: - - - - - - - - - - Start Time: - - - - - - - - - - End Time: - - - - - - - - - - Description: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - - Voltage - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - - - - - Value - - - - - Index - - - - - - - - - Value - - - - - Index - - - - - - - - Profile Selector - - - - - - - - Profile List - - - - - Profile Range List - - - - - - - - Decoder - - - - - - - Coherent Integration - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Code: - - - - - - - Select Channels - - - - - - - Select Heights - - - - - - - Filter - - - - - - - - - - Radar Frequency - - - - - - - Mode: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Barker 3 - - - - - Barker 4 - - - - - Barker 5 - - - - - Barker 7 - - - - - Barker 11 - - - - - Barker 13 - - - - - Barker 3 + Comp. - - - - - Barker 4 + Comp. - - - - - Barker 5 + Comp. - - - - - Barker 7 + Comp. - - - - - Barker 11+ Comp. - - - - - Barker 13+ Comp. - - - - - None - - - - - - - - - Time - - - - - Freq 1 - - - - - - - - - Graphics - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - ... - - - - - - - - - - Scope - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Channel List - - - - - - - Show - - - - - - - Freq/Vel - - - - - - - - - - - - - - Path : - - - - - - - Prefix: - - - - - - - Height range - - - - - - - Qt::Horizontal - - - - 40 - 12 - - - - - - - - Qt::Horizontal - - - - 18 - 12 - - - - - - - - - - - - - - Save - - - - - - - - - - - - - - - Output - - - - - - Type: - - - - - - - Path: - - - - - - - - - - ... - - - - - - - - .rawdata - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Blocks per File : - - - - - - - Profiles per Block: - - - - - - - - - - - - - - - Spectra - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - Select Cross Spectra - - - - - - - - Value - - - - - Index - - - - - - - - - - - - Value - - - - - Index - - - - - - - - - - - - - - Remove DC - - - - - - - Select Heights - - - - - - - Select Channel - - - - - - - - - - - - - x-y pairs - - - - - - - nFFTPoints - - - - - - - Incoherent Integration - - - - - - - - Time Interval - - - - - Profiles - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Radar Frequency - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Profiles - - - - - - - - - - Remove Interference - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - Mode 1 - - - - - Mode 2 - - - - - - - - IppFactor - - - - - - - - - - Get Noise - - - - - - - - - - - Graphics - - - - - - Coherence Map - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Tmin, Tmax: - - - - - - - - - - - - - - - - - - - - - - - - - - - Prefix : - - - - - - - - - - Qt::Horizontal - - - - 28 - 15 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - RTI Plot - - - - - - - Height range: - - - - - - - dBs range: - - - - - - - magnitud [0-1] - - - - - - - - - - - - - Qt::Horizontal - - - - 49 - 15 - - - - - - - - Path : - - - - - - - - - - - - - Power Profile - - - - - - - Freq/Vel: - - - - - - - - - - Cross Spectra Plot - - - - - - - ... - - - - - - - Channel List: - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 39 - 15 - - - - - - - - - - - Show - - - - - - - - - - - - - - Wr Period: - - - - - - - Save - - - - - - - - - - - - - - - - - - - - - - - - - - - - ftp - - - - - - - - - - - - - - RTI Noise - - - - - - - - - - - - - - - - - - - - - Time Range: - - - - - - - - - - - Output - - - - - - Type: - - - - - - - - .pdata - - - - - - - - Path: - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - Blocks per File: - - - - - - - Profile per Block: - - - - - - - - - - - - - - - SpectraHeis - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Clear - - - - - - - Ok - - - - - - - - - - 0 - - - - Operation - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - Time Interval - - - - - - - - Incoherent Intergration - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Graphics - - - - - - Prefix - - - - - - - ... - - - - - - - - - - - - - - ymin - ymax - - - - - - - Tmin - Tmax: - - - - - - - Time Range: - - - - - - - Wr Period - - - - - - - Qt::Horizontal - - - - 134 - 20 - - - - - - - - - - - - - - - - - - - - - Channel List: - - - - - - - xmin - xmax - - - - - - - - - - Save - - - - - - - ftp - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - Path - - - - - - - Show - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 106 - 20 - - - - - - - - - - - - - - - - - - - - - - RTI PLot - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Output - - - - - - Path: - - - - - - - Blocks per File: - - - - - - - Type: - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - - .fits - - - - - - - - Metada - - - - - - - - - - - - - ... - - - - - - - - - - - - Correlation - - - - - - 0 - - - - Operation - - - - - Graphics - - - - - - - - - - - 0 - 0 - - - - 0 - - - - Console - - - - - - - - - - - - 0 - - - - Project Property - - - - - - - - - - - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1065 - 25 - - - - - Project - - - - - - - - - Run - - - - - - - Options - - - - - - Help - - - - - - - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - Save - - - - - Close - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - Start - - - - - Pause - - - - - About - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - openToolbar - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - createToolbar - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - saveToolbar - - - Save - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - starToolbar - - - Start - - - - - - ../Documents/figure/stopServer.png../Documents/figure/stopServer.png - - - stopToolbar - - - Stop - - - - - - ../workspace/branch_gui_may/gui/figure/pause.png../workspace/branch_gui_may/gui/figure/pause.png - - - pauseToolbar - - - Pause - - - - - - ../addpu.jpg../addpu.jpg - - - addPU - - - - - FTP - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v49.ui b/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v49.ui deleted file mode 100644 index 31cff87..0000000 --- a/schainpy/gui/viewer/viewer_ui/MainWindow_21_02_13_v49.ui +++ /dev/null @@ -1,2206 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 1065 - 711 - - - - MainWindow - - - - - - - Qt::Horizontal - - - - - Qt::Vertical - - - - - 0 - 278 - - - - - 16777215 - 16777215 - - - - 0 - - - - Project - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Project Name : - - - - - - - - - - DataType : - - - - - - - - Voltage - - - - - Spectra - - - - - Fits - - - - - - - - - - - DataPath : - - - - - - - ... - - - - - - - - - - Read Mode: - - - - - - - - Off Line - - - - - On Line - - - - - - - - Delay: - - - - - - - - - - Walk : - - - - - - - - Search 0 - - - - - Search 1 - - - - - - - - Load - - - - - - - Set: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Star Date: - - - - - - - - - - End Date: - - - - - - - - - - Start Time: - - - - - - - - - - End Time: - - - - - - - - - - Description: - - - - - - - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - - Voltage - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - - - - - Value - - - - - Index - - - - - - - - - Value - - - - - Index - - - - - - - - Profile Selector - - - - - - - - Profile List - - - - - Profile Range List - - - - - - - - Decoder - - - - - - - Coherent Integration - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Code: - - - - - - - Select Channels - - - - - - - Select Heights - - - - - - - Filter - - - - - - - - - - Radar Frequency - - - - - - - Mode: - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Barker 3 - - - - - Barker 4 - - - - - Barker 5 - - - - - Barker 7 - - - - - Barker 11 - - - - - Barker 13 - - - - - Barker 3 + Comp. - - - - - Barker 4 + Comp. - - - - - Barker 5 + Comp. - - - - - Barker 7 + Comp. - - - - - Barker 11+ Comp. - - - - - Barker 13+ Comp. - - - - - None - - - - - - - - - Time - - - - - Freq 1 - - - - - - - - - Graphics - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - ... - - - - - - - - - - Scope - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Channel List - - - - - - - Show - - - - - - - Freq/Vel - - - - - - - - - - - - - - Path : - - - - - - - Prefix: - - - - - - - Height range - - - - - - - Qt::Horizontal - - - - 40 - 12 - - - - - - - - Qt::Horizontal - - - - 18 - 12 - - - - - - - - - - - - - - Save - - - - - - - - - - - - - - - Output - - - - - - Type: - - - - - - - Path: - - - - - - - - - - ... - - - - - - - - .rawdata - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - Blocks per File : - - - - - - - Profiles per Block: - - - - - - - - - - - - - - - Spectra - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Ok - - - - - - - Clear - - - - - - - - - - 0 - - - - Operation - - - - - - Select Cross Spectra - - - - - - - - Value - - - - - Index - - - - - - - - - - - - Value - - - - - Index - - - - - - - - - - - - - - Remove DC - - - - - - - Select Heights - - - - - - - Select Channel - - - - - - - - - - - - - x-y pairs - - - - - - - nFFTPoints - - - - - - - Incoherent Integration - - - - - - - - Time Interval - - - - - Profiles - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Radar Frequency - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Profiles - - - - - - - - - - Remove Interference - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - IppFactor - - - - - - - Get Noise - - - - - - - - - - - Mode 1 - - - - - Mode 2 - - - - - - - - - - - - Graphics - - - - - - Coherence Map - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Tmin, Tmax: - - - - - - - - - - - - - - - - - - - - - - - - - - - Prefix : - - - - - - - - - - Qt::Horizontal - - - - 28 - 15 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - RTI Plot - - - - - - - Height range: - - - - - - - dBs range: - - - - - - - magnitud [0-1] - - - - - - - - - - - - - Qt::Horizontal - - - - 49 - 15 - - - - - - - - Path : - - - - - - - - - - - - - Power Profile - - - - - - - Freq/Vel: - - - - - - - - - - Cross Spectra Plot - - - - - - - ... - - - - - - - Channel List: - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 39 - 15 - - - - - - - - - - - Show - - - - - - - - - - - - - - Wr Period: - - - - - - - Save - - - - - - - - - - - - - - - - - - - - - - - - - - - - ftp - - - - - - - - - - - - - - RTI Noise - - - - - - - - - - - - - - - - - - - - - Time Range: - - - - - - - - - - - Output - - - - - - Type: - - - - - - - - .pdata - - - - - - - - Path: - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - Blocks per File: - - - - - - - Profile per Block: - - - - - - - - - - - - - - - SpectraHeis - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Clear - - - - - - - Ok - - - - - - - - - - 0 - - - - Operation - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - Time Interval - - - - - - - - Incoherent Intergration - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Graphics - - - - - - Prefix - - - - - - - ... - - - - - - - - - - - - - - ymin - ymax - - - - - - - Tmin - Tmax: - - - - - - - Time Range: - - - - - - - Wr Period - - - - - - - Qt::Horizontal - - - - 134 - 20 - - - - - - - - - - - - - - - - - - - - - Channel List: - - - - - - - xmin - xmax - - - - - - - - - - Save - - - - - - - ftp - - - - - - - Spectra Plot - - - - - - - - - - - - - - - - - Path - - - - - - - Show - - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - - - Qt::Horizontal - - - - 106 - 20 - - - - - - - - - - - - - - - - - - - - - - RTI PLot - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - Output - - - - - - Path: - - - - - - - Blocks per File: - - - - - - - Type: - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - ... - - - - - - - - - - - .fits - - - - - - - - Metada - - - - - - - - - - - - - ... - - - - - - - - - - - - Correlation - - - - - - 0 - - - - Operation - - - - - Graphics - - - - - - - - - - - 0 - 0 - - - - 0 - - - - Console - - - - - - - - - - - - 0 - - - - Project Property - - - - - - - - - - - - - - - toolBar - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - - 0 - 0 - 1065 - 25 - - - - - Project - - - - - - - - - Run - - - - - - - Options - - - - - - Help - - - - - - - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - Save - - - - - Close - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - Start - - - - - Pause - - - - - About - - - - - - ../Documents/figure/open.png../Documents/figure/open.png - - - openToolbar - - - Open - - - - - - ../Documents/figure/create_class_obj.png../Documents/figure/create_class_obj.png - - - createToolbar - - - Create - - - - - - ../Documents/figure/save.gif../Documents/figure/save.gif - - - saveToolbar - - - Save - - - - - - ../Documents/figure/startServer.png../Documents/figure/startServer.png - - - starToolbar - - - Start - - - - - - ../Documents/figure/stopServer.png../Documents/figure/stopServer.png - - - stopToolbar - - - Stop - - - - - - ../workspace/branch_gui_may/gui/figure/pause.png../workspace/branch_gui_may/gui/figure/pause.png - - - pauseToolbar - - - Pause - - - - - - ../addpu.jpg../addpu.jpg - - - addPU - - - - - FTP - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/ftpConfig4.ui b/schainpy/gui/viewer/viewer_ui/ftpConfig4.ui deleted file mode 100644 index ec05dbf..0000000 --- a/schainpy/gui/viewer/viewer_ui/ftpConfig4.ui +++ /dev/null @@ -1,300 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 374 - 399 - - - - - 374 - 399 - - - - - 374 - 399 - - - - MainWindow - - - - - - 9 - 38 - 47 - 17 - - - - Server: - - - - - - 9 - 133 - 77 - 17 - - - - User Name: - - - - - - 9 - 166 - 68 - 17 - - - - Password: - - - - - - 9 - 9 - 101 - 17 - - - - - 75 - true - - - - Server Details - - - - - - 9 - 104 - 87 - 17 - - - - - 75 - true - - - - User Details - - - - - - 9 - 71 - 47 - 17 - - - - Folder: - - - - - - 130 - 40 - 231 - 27 - - - - - - - 130 - 70 - 231 - 27 - - - - - - - 130 - 130 - 231 - 27 - - - - - - - 130 - 160 - 231 - 27 - - - - - - - 130 - 360 - 111 - 27 - - - - Cancel - - - - - - 250 - 360 - 111 - 27 - - - - Ok - - - - - - 10 - 200 - 66 - 17 - - - - - 75 - true - - - - Others - - - - - - 10 - 230 - 81 - 17 - - - - Ftp_wei: - - - - - - 10 - 260 - 81 - 17 - - - - Exp_code: - - - - - - 10 - 290 - 81 - 17 - - - - Sub_exp: - - - - - - 10 - 320 - 81 - 17 - - - - Plot_pos: - - - - - - 130 - 230 - 231 - 27 - - - - - - - 130 - 260 - 231 - 27 - - - - - - - 130 - 290 - 231 - 27 - - - - - - - 130 - 320 - 231 - 27 - - - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/initwindowv2.ui b/schainpy/gui/viewer/viewer_ui/initwindowv2.ui deleted file mode 100644 index d254434..0000000 --- a/schainpy/gui/viewer/viewer_ui/initwindowv2.ui +++ /dev/null @@ -1,112 +0,0 @@ - - - Dialog - - - - 0 - 0 - 652 - 496 - - - - Dialog - - - - - - - - - - - Cambria - 22 - 50 - false - - - - Signal Chain - Ver. 1.0 - - - - - - - Qt::Horizontal - - - - - - - - - - ../../Downloads/IMAGENES/w.jpg - - - true - - - - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Exit - - - - - - - Continue - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/unitProcess4.ui b/schainpy/gui/viewer/viewer_ui/unitProcess4.ui deleted file mode 100644 index d077917..0000000 --- a/schainpy/gui/viewer/viewer_ui/unitProcess4.ui +++ /dev/null @@ -1,170 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 312 - 195 - - - - MainWindow - - - - - - - - 12 - 50 - false - - - - Input: - - - - - - - - 50 - false - - - - Cancel - - - - - - - - 50 - false - - - - Ok - - - - - - - - 12 - 50 - false - - - - Type: - - - - - - - - 13 - 50 - false - - - - Processing Unit - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - 12 - - - - - - - - - 12 - - - - - Voltage - - - - - Spectra - - - - - Correlation - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - - - - - - - diff --git a/schainpy/gui/viewer/viewer_ui/workspacev5.ui b/schainpy/gui/viewer/viewer_ui/workspacev5.ui deleted file mode 100644 index 5aad07a..0000000 --- a/schainpy/gui/viewer/viewer_ui/workspacev5.ui +++ /dev/null @@ -1,247 +0,0 @@ - - - Dialog - - - true - - - - 0 - 0 - 730 - 295 - - - - - 730 - 295 - - - - - 730 - 295 - - - - Dialog - - - - - 0 - 0 - 731 - 71 - - - - true - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell'; font-size:12pt; font-weight:600;">Select a workspace</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell';">Signal Chain stores your projects in a folder called a workspace.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Cantarell';">Choose a workspace folder to use for this session.</span></p></body></html> - - - - - - 10 - 90 - 91 - 16 - - - - - 11 - - - - Workspace : - - - - - - 110 - 80 - 501 - 31 - - - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - - - 255 - 255 - 255 - - - - - - - - - - - 620 - 80 - 101 - 31 - - - - - 11 - - - - Browse... - - - - - - 10 - 120 - 711 - 121 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - 490 - 250 - 111 - 31 - - - - Cancel - - - - - - 610 - 250 - 111 - 31 - - - - - 11 - - - - OK - - - - - - diff --git a/schainpy/gui/viewer/windows/__init__.py b/schainpy/gui/viewer/windows/__init__.py deleted file mode 100644 index af97a97..0000000 --- a/schainpy/gui/viewer/windows/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from ui_project import * -from ui_voltage import * -from ui_spectra import * -from ui_spectra_heis import * -from ui_correlation import * \ No newline at end of file diff --git a/schainpy/gui/viewer/windows/ui_correlation.py b/schainpy/gui/viewer/windows/ui_correlation.py deleted file mode 100644 index 0c80785..0000000 --- a/schainpy/gui/viewer/windows/ui_correlation.py +++ /dev/null @@ -1,45 +0,0 @@ - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_CorrelationTab(object): - - def setupUi(self): - - self.tabCorrelation = QtGui.QWidget() - self.tabCorrelation.setObjectName(_fromUtf8("tabCorrelation")) - self.gridLayout_13 = QtGui.QGridLayout(self.tabCorrelation) - self.gridLayout_13.setObjectName(_fromUtf8("gridLayout_13")) - self.tabWidgetCorrelation = QtGui.QTabWidget(self.tabCorrelation) - self.tabWidgetCorrelation.setObjectName(_fromUtf8("tabWidgetCorrelation")) - self.tabopCorrelation = QtGui.QWidget() - self.tabopCorrelation.setObjectName(_fromUtf8("tabopCorrelation")) - self.tabWidgetCorrelation.addTab(self.tabopCorrelation, _fromUtf8("")) - self.tabopCorrelation1 = QtGui.QWidget() - self.tabopCorrelation1.setObjectName(_fromUtf8("tabopCorrelation1")) - self.tabWidgetCorrelation.addTab(self.tabopCorrelation1, _fromUtf8("")) - self.gridLayout_13.addWidget(self.tabWidgetCorrelation, 0, 0, 1, 1) - - self.tabWidgetProject.addTab(self.tabCorrelation, _fromUtf8("")) - - self.tabWidgetCorrelation.setCurrentIndex(0) - - def retranslateUi(self): - - self.tabWidgetCorrelation.setTabText(self.tabWidgetCorrelation.indexOf(self.tabopCorrelation), _translate("MainWindow", "Operation", None)) - self.tabWidgetCorrelation.setTabText(self.tabWidgetCorrelation.indexOf(self.tabopCorrelation1), _translate("MainWindow", "Graphics", None)) - self.tabWidgetProject.setTabText(self.tabWidgetProject.indexOf(self.tabCorrelation), _translate("MainWindow", "Correlation", None)) - \ No newline at end of file diff --git a/schainpy/gui/viewer/windows/ui_project.py b/schainpy/gui/viewer/windows/ui_project.py deleted file mode 100644 index 7b22c32..0000000 --- a/schainpy/gui/viewer/windows/ui_project.py +++ /dev/null @@ -1,257 +0,0 @@ - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_ProjectTab(object): - - def setupUi(self): - - self.tabProject = QtGui.QWidget() - self.tabProject.setObjectName(_fromUtf8("tabProject")) - self.gridLayout_15 = QtGui.QGridLayout(self.tabProject) - self.gridLayout_15.setObjectName(_fromUtf8("gridLayout_15")) - - self.frame = QtGui.QFrame(self.tabProject) - self.frame.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame.setFrameShadow(QtGui.QFrame.Raised) - self.frame.setObjectName(_fromUtf8("frame")) - - self.gridLayout_2 = QtGui.QGridLayout(self.frame) - self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) - - self.label = QtGui.QLabel(self.frame) - self.label.setObjectName(_fromUtf8("label")) - self.gridLayout_2.addWidget(self.label, 0, 0, 1, 1) - - self.proName = QtGui.QLineEdit(self.frame) - self.proName.setObjectName(_fromUtf8("proName")) - self.gridLayout_2.addWidget(self.proName, 0, 1, 1, 8) - - self.labDatatype = QtGui.QLabel(self.frame) - self.labDatatype.setObjectName(_fromUtf8("labDatatype")) - self.gridLayout_2.addWidget(self.labDatatype, 1, 0, 1, 1) - - self.proComDataType = QtGui.QComboBox(self.frame) - self.proComDataType.setObjectName(_fromUtf8("proComDataType")) - self.proComDataType.addItem(_fromUtf8("")) - self.proComDataType.addItem(_fromUtf8("")) - self.proComDataType.addItem(_fromUtf8("")) - self.proComDataType.addItem(_fromUtf8("")) - self.gridLayout_2.addWidget(self.proComDataType, 1, 1, 1, 6) - - self.proDataType = QtGui.QLineEdit(self.frame) - self.proDataType.setObjectName(_fromUtf8("proDataType")) - self.gridLayout_2.addWidget(self.proDataType, 1, 7, 1, 2) - - self.labDatapath = QtGui.QLabel(self.frame) - self.labDatapath.setObjectName(_fromUtf8("labDatapath")) - self.gridLayout_2.addWidget(self.labDatapath, 2, 0, 1, 1) - - self.proToolPath = QtGui.QToolButton(self.frame) - self.proToolPath.setObjectName(_fromUtf8("proToolPath")) - self.gridLayout_2.addWidget(self.proToolPath, 2, 1, 1, 1) - - self.proDataPath = QtGui.QLineEdit(self.frame) - self.proDataPath.setObjectName(_fromUtf8("proDataPath")) - self.gridLayout_2.addWidget(self.proDataPath, 2, 2, 1, 7) - - self.labelWalk = QtGui.QLabel(self.frame) - self.labelWalk.setObjectName(_fromUtf8("labelWalk")) - self.gridLayout_2.addWidget(self.labelWalk, 3, 0, 1, 1) - - self.proComWalk = QtGui.QComboBox(self.frame) - self.proComWalk.setObjectName(_fromUtf8("proComWalk")) - self.proComWalk.addItem(_fromUtf8("")) - self.proComWalk.addItem(_fromUtf8("")) - self.gridLayout_2.addWidget(self.proComWalk, 3, 1, 1, 4) - - self.labExpLabel = QtGui.QLabel(self.frame) - self.labExpLabel.setObjectName(_fromUtf8("labExpLabel")) - self.gridLayout_2.addWidget(self.labExpLabel, 3, 5, 1, 1) - - self.proExpLabel = QtGui.QLineEdit(self.frame) - self.proExpLabel.setObjectName(_fromUtf8("proExpLabel")) - self.gridLayout_2.addWidget(self.proExpLabel, 3, 6, 1, 1) - - self.labReadMode = QtGui.QLabel(self.frame) - self.labReadMode.setObjectName(_fromUtf8("labReadMode")) - self.gridLayout_2.addWidget(self.labReadMode, 4, 0, 1, 1) - - self.proComReadMode = QtGui.QComboBox(self.frame) - self.proComReadMode.setObjectName(_fromUtf8("proComReadMode")) - self.proComReadMode.addItem(_fromUtf8("")) - self.proComReadMode.addItem(_fromUtf8("")) - self.gridLayout_2.addWidget(self.proComReadMode, 4, 1, 1, 4) - - self.labDelay = QtGui.QLabel(self.frame) - self.labDelay.setObjectName(_fromUtf8("labDelay")) - self.gridLayout_2.addWidget(self.labDelay, 4, 5, 1, 1) - - self.proDelay = QtGui.QLineEdit(self.frame) - self.proDelay.setObjectName(_fromUtf8("proDelay")) - self.gridLayout_2.addWidget(self.proDelay, 4, 6, 1, 1) - - self.labelSet = QtGui.QLabel(self.frame) - self.labelSet.setObjectName(_fromUtf8("labelSet")) - self.gridLayout_2.addWidget(self.labelSet, 4, 7, 1, 1) - - self.proSet = QtGui.QLineEdit(self.frame) - self.proSet.setObjectName(_fromUtf8("proSet")) - self.gridLayout_2.addWidget(self.proSet, 4, 8, 1, 1) - - - self.proLoadButton = QtGui.QPushButton(self.frame) - self.proLoadButton.setObjectName(_fromUtf8("proLoadButton")) - self.gridLayout_2.addWidget(self.proLoadButton, 5, 0, 1, 9) - - self.frame_data = QtGui.QFrame(self.tabProject) - self.frame_data.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame_data.setFrameShadow(QtGui.QFrame.Raised) - self.frame_data.setObjectName(_fromUtf8("frame_data")) - - self.gridLayout_data = QtGui.QGridLayout(self.frame_data) - self.gridLayout_data.setObjectName(_fromUtf8("gridLayout_data")) - - self.labelIPPKm = QtGui.QLabel(self.frame_data) - self.labelIPPKm.setObjectName(_fromUtf8("labelIPPKm")) - self.gridLayout_data.addWidget(self.labelIPPKm, 6, 0, 1, 1) - - self.proIPPKm = QtGui.QLineEdit(self.frame_data) - self.proIPPKm.setObjectName(_fromUtf8("proIPPKm")) - self.gridLayout_data.addWidget(self.proIPPKm, 6, 1, 1, 6) - - self.labnTxs = QtGui.QLabel(self.frame_data) - self.labnTxs.setObjectName(_fromUtf8("labnTxs")) - self.gridLayout_data.addWidget(self.labnTxs, 6, 0, 1, 1) - - self.pronTxs = QtGui.QLineEdit(self.frame_data) - self.pronTxs.setObjectName(_fromUtf8("pronTxs")) - self.gridLayout_data.addWidget(self.pronTxs, 6, 1, 1, 6) - - self.labByBlock = QtGui.QLabel(self.frame_data) - self.labByBlock.setObjectName(_fromUtf8("labByBlock")) - self.gridLayout_data.addWidget(self.labByBlock, 6, 7, 1, 1) - - self.proComByBlock = QtGui.QComboBox(self.frame_data) - self.proComByBlock.setObjectName(_fromUtf8("proComByBlock")) - self.proComByBlock.addItem(_fromUtf8("")) - self.proComByBlock.addItem(_fromUtf8("")) - self.gridLayout_data.addWidget(self.proComByBlock, 6, 8, 1, 1) - - - self.frame_2 = QtGui.QFrame(self.tabProject) - self.frame_2.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame_2.setFrameShadow(QtGui.QFrame.Raised) - self.frame_2.setObjectName(_fromUtf8("frame_2")) - - self.gridLayout_10 = QtGui.QGridLayout(self.frame_2) - self.gridLayout_10.setObjectName(_fromUtf8("gridLayout_10")) - - self.label_27 = QtGui.QLabel(self.frame_2) - self.label_27.setObjectName(_fromUtf8("label_27")) - self.gridLayout_10.addWidget(self.label_27, 0, 0, 1, 1) - self.proComStartDate = QtGui.QComboBox(self.frame_2) - self.proComStartDate.setObjectName(_fromUtf8("proComStartDate")) - self.gridLayout_10.addWidget(self.proComStartDate, 0, 1, 1, 1) - self.label_28 = QtGui.QLabel(self.frame_2) - self.label_28.setObjectName(_fromUtf8("label_28")) - self.gridLayout_10.addWidget(self.label_28, 1, 0, 1, 1) - self.proComEndDate = QtGui.QComboBox(self.frame_2) - self.proComEndDate.setObjectName(_fromUtf8("proComEndDate")) - self.gridLayout_10.addWidget(self.proComEndDate, 1, 1, 1, 1) - self.label_2 = QtGui.QLabel(self.frame_2) - self.label_2.setObjectName(_fromUtf8("label_2")) - self.gridLayout_10.addWidget(self.label_2, 2, 0, 1, 1) - self.proStartTime = QtGui.QTimeEdit(self.frame_2) - self.proStartTime.setObjectName(_fromUtf8("proStartTime")) - self.gridLayout_10.addWidget(self.proStartTime, 2, 1, 1, 1) - self.label_3 = QtGui.QLabel(self.frame_2) - self.label_3.setObjectName(_fromUtf8("label_3")) - self.gridLayout_10.addWidget(self.label_3, 3, 0, 1, 1) - self.proEndTime = QtGui.QTimeEdit(self.frame_2) - self.proEndTime.setObjectName(_fromUtf8("proEndTime")) - self.gridLayout_10.addWidget(self.proEndTime, 3, 1, 1, 1) - self.label_30 = QtGui.QLabel(self.frame_2) - self.label_30.setObjectName(_fromUtf8("label_30")) - self.gridLayout_10.addWidget(self.label_30, 4, 0, 1, 1) - self.proDescription = QtGui.QTextEdit(self.frame_2) - self.proDescription.setObjectName(_fromUtf8("proDescription")) - self.gridLayout_10.addWidget(self.proDescription, 4, 1, 1, 1) - - self.frame_3 = QtGui.QFrame(self.tabProject) - self.frame_3.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame_3.setFrameShadow(QtGui.QFrame.Raised) - self.frame_3.setObjectName(_fromUtf8("frame_3")) - self.gridLayout_14 = QtGui.QGridLayout(self.frame_3) - self.gridLayout_14.setObjectName(_fromUtf8("gridLayout_14")) - self.proOk = QtGui.QPushButton(self.frame_3) - self.proOk.setObjectName(_fromUtf8("proOk")) - self.gridLayout_14.addWidget(self.proOk, 0, 0, 1, 1) - self.proClear = QtGui.QPushButton(self.frame_3) - self.proClear.setObjectName(_fromUtf8("proClear")) - self.gridLayout_14.addWidget(self.proClear, 0, 1, 1, 1) - - self.gridLayout_15.addWidget(self.frame, 0, 0, 8, 1) - self.gridLayout_15.addWidget(self.frame_data, 8, 0, 2, 1) - self.gridLayout_15.addWidget(self.frame_2, 10, 0, 7, 1) - self.gridLayout_15.addWidget(self.frame_3, 17, 0, 2, 1) - - self.tabWidgetProject.addTab(self.tabProject, _fromUtf8("")) - - def retranslateUi(self): - - self.label.setText(_translate("MainWindow", "Project Name :", None)) - self.labDatatype.setText(_translate("MainWindow", "Data type :", None)) - self.proComDataType.setItemText(0, _translate("MainWindow", "Voltage", None)) - self.proComDataType.setItemText(1, _translate("MainWindow", "Spectra", None)) - self.proComDataType.setItemText(2, _translate("MainWindow", "Fits", None)) - self.proComDataType.setItemText(3, _translate("MainWindow", "USRP", None)) - self.labDatapath.setText(_translate("MainWindow", "Data path :", None)) - self.proToolPath.setText(_translate("MainWindow", "...", None)) - self.labReadMode.setText(_translate("MainWindow", "Read mode:", None)) - self.proComReadMode.setItemText(0, _translate("MainWindow", "Offline", None)) - self.proComReadMode.setItemText(1, _translate("MainWindow", "Online", None)) - self.labDelay.setText(_translate("MainWindow", "Delay:", None)) - self.labExpLabel.setText(_translate("MainWindow", "Exp. Label:", None)) - self.labelWalk.setText(_translate("MainWindow", "Search data :", None)) - self.proComWalk.setItemText(0, _translate("MainWindow", "On files", None)) - self.proComWalk.setItemText(1, _translate("MainWindow", "On sub-folders", None)) - self.proComByBlock.setItemText(0, _translate("MainWindow", "By profile", None)) - self.proComByBlock.setItemText(1, _translate("MainWindow", "By block", None)) - self.labByBlock.setText(_translate("MainWindow", "Get data:", None)) - - - self.proLoadButton.setText(_translate("MainWindow", "Load", None)) - self.labelSet.setText(_translate("MainWindow", "File set:", None)) - self.labelIPPKm.setText(_translate("MainWindow", "IPP (km):", None)) - self.labnTxs.setText(_translate("MainWindow", "Number of Txs:", None)) - - self.label_27.setText(_translate("MainWindow", "Star Date:", None)) - self.label_28.setText(_translate("MainWindow", "End Date:", None)) - self.label_2.setText(_translate("MainWindow", "Start Time:", None)) - self.label_3.setText(_translate("MainWindow", "End Time:", None)) - self.label_30.setText(_translate("MainWindow", "Description:", None)) - self.proOk.setText(_translate("MainWindow", "Ok", None)) - self.proClear.setText(_translate("MainWindow", "Clear", None)) - - self.tabWidgetProject.setTabText(self.tabWidgetProject.indexOf(self.tabProject), _translate("MainWindow", "Project", None)) - - self.__setToolTip() - - def __setToolTip(self): - - self.proComWalk.setToolTip('On Files:Search file in format .r or pdata On Folders:Search file in a directory DYYYYDOY') - \ No newline at end of file diff --git a/schainpy/gui/viewer/windows/ui_spectra.py b/schainpy/gui/viewer/windows/ui_spectra.py deleted file mode 100644 index c1d09ab..0000000 --- a/schainpy/gui/viewer/windows/ui_spectra.py +++ /dev/null @@ -1,528 +0,0 @@ -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_SpectraTab(object): - - def setupUi(self): - - self.tabSpectra = QtGui.QWidget() - self.tabSpectra.setObjectName(_fromUtf8("tabSpectra")) - self.gridLayout_7 = QtGui.QGridLayout(self.tabSpectra) - self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7")) - self.frame_5 = QtGui.QFrame(self.tabSpectra) - self.frame_5.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame_5.setFrameShadow(QtGui.QFrame.Raised) - self.frame_5.setObjectName(_fromUtf8("frame_5")) - self.gridLayout_18 = QtGui.QGridLayout(self.frame_5) - self.gridLayout_18.setObjectName(_fromUtf8("gridLayout_18")) - - self.specOpOk = QtGui.QPushButton(self.frame_5) - self.specOpOk.setObjectName(_fromUtf8("specOpOk")) - self.gridLayout_18.addWidget(self.specOpOk, 0, 0, 1, 1) - - self.specGraphClear = QtGui.QPushButton(self.frame_5) - self.specGraphClear.setObjectName(_fromUtf8("specGraphClear")) - self.gridLayout_18.addWidget(self.specGraphClear, 0, 1, 1, 1) - - self.gridLayout_7.addWidget(self.frame_5, 1, 1, 1, 1) - - self.tabWidgetSpectra = QtGui.QTabWidget(self.tabSpectra) - self.tabWidgetSpectra.setObjectName(_fromUtf8("tabWidgetSpectra")) - - self.tabopSpectra = QtGui.QWidget() - self.tabopSpectra.setObjectName(_fromUtf8("tabopSpectra")) - - self.gridLayout_5 = QtGui.QGridLayout(self.tabopSpectra) - self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5")) - - - - self.specOpCebRadarfrequency = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebRadarfrequency.setObjectName(_fromUtf8("specOpCebRadarfrequency")) - self.gridLayout_5.addWidget(self.specOpCebRadarfrequency, 0, 0, 1, 1) - - self.specOpRadarfrequency = QtGui.QLineEdit(self.tabopSpectra) - self.specOpRadarfrequency.setObjectName(_fromUtf8("specOpRadarfrequency")) - self.gridLayout_5.addWidget(self.specOpRadarfrequency, 0, 1, 1, 4) - - - self.specLabProfiles = QtGui.QLabel(self.tabopSpectra) - self.specLabProfiles.setObjectName(_fromUtf8("specLabProfiles")) - self.gridLayout_5.addWidget(self.specLabProfiles, 1, 0, 1, 1) - - self.specOpProfiles = QtGui.QLineEdit(self.tabopSpectra) - self.specOpProfiles.setObjectName(_fromUtf8("specOpProfiles")) - self.gridLayout_5.addWidget(self.specOpProfiles, 1, 1, 1, 4) - - - self.specLabnFFTPoints = QtGui.QLabel(self.tabopSpectra) - self.specLabnFFTPoints.setObjectName(_fromUtf8("specLabnFFTPoints")) - self.gridLayout_5.addWidget(self.specLabnFFTPoints, 2, 0, 1, 1) - - self.specOpnFFTpoints = QtGui.QLineEdit(self.tabopSpectra) - self.specOpnFFTpoints.setObjectName(_fromUtf8("specOpnFFTpoints")) - self.gridLayout_5.addWidget(self.specOpnFFTpoints, 2, 1, 1, 4) - - - self.specLabippFactor = QtGui.QLabel(self.tabopSpectra) - self.specLabippFactor.setObjectName(_fromUtf8("specLabippFactor")) - self.gridLayout_5.addWidget(self.specLabippFactor, 3, 0, 1, 1) - - self.specOpippFactor = QtGui.QLineEdit(self.tabopSpectra) - self.specOpippFactor.setObjectName(_fromUtf8("specOpippFactor")) - self.gridLayout_5.addWidget(self.specOpippFactor, 3, 1, 1, 4) - - - self.specOpCebChannel = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebChannel.setObjectName(_fromUtf8("specOpCebChannel")) - self.gridLayout_5.addWidget(self.specOpCebChannel, 4, 0, 1, 1) - - self.specOpComChannel = QtGui.QComboBox(self.tabopSpectra) - self.specOpComChannel.setObjectName(_fromUtf8("specOpComChannel")) - self.specOpComChannel.addItem(_fromUtf8("")) - self.specOpComChannel.addItem(_fromUtf8("")) - self.gridLayout_5.addWidget(self.specOpComChannel, 4, 1, 1, 2) - - self.specOpChannel = QtGui.QLineEdit(self.tabopSpectra) - self.specOpChannel.setObjectName(_fromUtf8("specOpChannel")) - self.gridLayout_5.addWidget(self.specOpChannel, 4, 3, 1, 2) - - - self.specOpCebCrossSpectra = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebCrossSpectra.setObjectName(_fromUtf8("specOpCebCrossSpectra")) - self.gridLayout_5.addWidget(self.specOpCebCrossSpectra, 5, 0, 1, 1) - - self.specOpComCrossSpectra = QtGui.QComboBox(self.tabopSpectra) - self.specOpComCrossSpectra.setObjectName(_fromUtf8("specOpComCrossSpectra")) - self.specOpComCrossSpectra.addItem(_fromUtf8("")) - self.gridLayout_5.addWidget(self.specOpComCrossSpectra, 5, 1, 1, 2) - - self.specOppairsList = QtGui.QLineEdit(self.tabopSpectra) - self.specOppairsList.setObjectName(_fromUtf8("specOppairsList")) - self.gridLayout_5.addWidget(self.specOppairsList, 5, 3, 1, 2) - - - self.specOpCebHeights = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebHeights.setObjectName(_fromUtf8("specOpCebHeights")) - self.gridLayout_5.addWidget(self.specOpCebHeights, 6, 0, 1, 1) - - self.specOpComHeights = QtGui.QComboBox(self.tabopSpectra) - self.specOpComHeights.setObjectName(_fromUtf8("specOpComHeights")) - self.specOpComHeights.addItem(_fromUtf8("")) - self.specOpComHeights.addItem(_fromUtf8("")) - self.gridLayout_5.addWidget(self.specOpComHeights, 6, 1, 1, 2) - - self.specOpHeights = QtGui.QLineEdit(self.tabopSpectra) - self.specOpHeights.setObjectName(_fromUtf8("specOpHeights")) - self.gridLayout_5.addWidget(self.specOpHeights, 6, 3, 1, 2) - - - self.specOpCebIncoherent = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebIncoherent.setObjectName(_fromUtf8("specOpCebIncoherent")) - self.gridLayout_5.addWidget(self.specOpCebIncoherent, 7, 0, 1, 1) - - self.specOpCobIncInt = QtGui.QComboBox(self.tabopSpectra) - self.specOpCobIncInt.setObjectName(_fromUtf8("specOpCobIncInt")) - self.specOpCobIncInt.addItem(_fromUtf8("")) - self.specOpCobIncInt.addItem(_fromUtf8("")) - self.gridLayout_5.addWidget(self.specOpCobIncInt, 7, 1, 1, 2) - - self.specOpIncoherent = QtGui.QLineEdit(self.tabopSpectra) - self.specOpIncoherent.setObjectName(_fromUtf8("specOpIncoherent")) - self.gridLayout_5.addWidget(self.specOpIncoherent, 7, 3, 1, 2) - - - self.specOpCebRemoveDC = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebRemoveDC.setObjectName(_fromUtf8("specOpCebRemoveDC")) - self.gridLayout_5.addWidget(self.specOpCebRemoveDC, 8, 0, 1, 1) - - self.specOpComRemoveDC = QtGui.QComboBox(self.tabopSpectra) - self.specOpComRemoveDC.setObjectName(_fromUtf8("specOpComRemoveDC")) - self.specOpComRemoveDC.addItem(_fromUtf8("")) - self.specOpComRemoveDC.addItem(_fromUtf8("")) - self.gridLayout_5.addWidget(self.specOpComRemoveDC, 8, 1, 1, 2) - - - self.specOpCebRemoveInt = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebRemoveInt.setObjectName(_fromUtf8("specOpCebRemoveInt")) - self.gridLayout_5.addWidget(self.specOpCebRemoveInt, 9, 0, 1, 1) - - - self.specOpCebgetNoise = QtGui.QCheckBox(self.tabopSpectra) - self.specOpCebgetNoise.setObjectName(_fromUtf8("specOpCebgetNoise")) - self.gridLayout_5.addWidget(self.specOpCebgetNoise, 10, 0, 1, 1) - - self.specOpgetNoise = QtGui.QLineEdit(self.tabopSpectra) - self.specOpgetNoise.setObjectName(_fromUtf8("specOpgetNoise")) - self.gridLayout_5.addWidget(self.specOpgetNoise, 10, 1, 1, 4) - -# spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_5.addItem(spacerItem9, 12, 3, 1, 1) -# -# spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_5.addItem(spacerItem10, 9, 3, 1, 1) -# -# spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_5.addItem(spacerItem11, 7, 3, 1, 1) -# -# spacerItem12 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_5.addItem(spacerItem12, 4, 3, 1, 1) -# -# spacerItem13 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_5.addItem(spacerItem13, 15, 3, 1, 1) - - - self.tabWidgetSpectra.addTab(self.tabopSpectra, _fromUtf8("")) - - ################################################################ - ################################################################ - - self.tabgraphSpectra = QtGui.QWidget() - self.tabgraphSpectra.setObjectName(_fromUtf8("tabgraphSpectra")) - self.gridLayout_9 = QtGui.QGridLayout(self.tabgraphSpectra) - self.gridLayout_9.setObjectName(_fromUtf8("gridLayout_9")) - -# spacerItem14 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) -# self.gridLayout_9.addItem(spacerItem14, 14, 2, 1, 1) - xi = 0 - - self.label_24 = QtGui.QLabel(self.tabgraphSpectra) - self.label_24.setObjectName(_fromUtf8("label_24")) - self.gridLayout_9.addWidget(self.label_24, xi, 0, 1, 1) - - self.specGraphPath = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGraphPath.setObjectName(_fromUtf8("specGraphPath")) - self.gridLayout_9.addWidget(self.specGraphPath, xi, 1, 1, 6) - - self.specGraphToolPath = QtGui.QToolButton(self.tabgraphSpectra) - self.specGraphToolPath.setObjectName(_fromUtf8("specGraphToolPath")) - self.gridLayout_9.addWidget(self.specGraphToolPath, xi, 7, 1, 1) - - self.label_25 = QtGui.QLabel(self.tabgraphSpectra) - self.label_25.setObjectName(_fromUtf8("label_25")) - self.gridLayout_9.addWidget(self.label_25, xi+1, 0, 1, 1) - self.specGraphPrefix = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGraphPrefix.setObjectName(_fromUtf8("specGraphPrefix")) - self.gridLayout_9.addWidget(self.specGraphPrefix, xi+1, 1, 1, 7) - - xi = 2 - - self.label_40 = QtGui.QLabel(self.tabgraphSpectra) - self.label_40.setObjectName(_fromUtf8("label_40")) - self.gridLayout_9.addWidget(self.label_40, xi+1, 0, 1, 1) - self.label_41 = QtGui.QLabel(self.tabgraphSpectra) - self.label_41.setObjectName(_fromUtf8("label_41")) - self.gridLayout_9.addWidget(self.label_41, xi+2, 0, 1, 1) - self.label_42 = QtGui.QLabel(self.tabgraphSpectra) - self.label_42.setObjectName(_fromUtf8("label_42")) - self.gridLayout_9.addWidget(self.label_42, xi+3, 0, 1, 1) - self.label_44 = QtGui.QLabel(self.tabgraphSpectra) - self.label_44.setObjectName(_fromUtf8("label_44")) - self.gridLayout_9.addWidget(self.label_44, xi+4, 0, 1, 1) - self.label_46 = QtGui.QLabel(self.tabgraphSpectra) - self.label_46.setObjectName(_fromUtf8("label_46")) - self.gridLayout_9.addWidget(self.label_46, xi+5, 0, 1, 1) - self.label_45 = QtGui.QLabel(self.tabgraphSpectra) - self.label_45.setObjectName(_fromUtf8("label_45")) - self.gridLayout_9.addWidget(self.label_45, xi+6, 0, 1, 1) - - self.label_43 = QtGui.QLabel(self.tabgraphSpectra) - self.label_43.setObjectName(_fromUtf8("label_43")) - self.gridLayout_9.addWidget(self.label_43, xi, 3, 1, 1) - self.specGraphCebSpectraplot = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphCebSpectraplot.setText(_fromUtf8("")) - self.specGraphCebSpectraplot.setObjectName(_fromUtf8("specGraphCebSpectraplot")) - self.gridLayout_9.addWidget(self.specGraphCebSpectraplot, xi+1, 3, 1, 1) - self.specGraphCebCrossSpectraplot = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphCebCrossSpectraplot.setText(_fromUtf8("")) - self.specGraphCebCrossSpectraplot.setObjectName(_fromUtf8("specGraphCebCrossSpectraplot")) - self.gridLayout_9.addWidget(self.specGraphCebCrossSpectraplot, xi+2, 3, 1, 1) - self.specGraphCebRTIplot = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphCebRTIplot.setText(_fromUtf8("")) - self.specGraphCebRTIplot.setObjectName(_fromUtf8("specGraphCebRTIplot")) - self.gridLayout_9.addWidget(self.specGraphCebRTIplot, xi+3, 3, 1, 1) - self.specGraphCebCoherencmap = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphCebCoherencmap.setText(_fromUtf8("")) - self.specGraphCebCoherencmap.setObjectName(_fromUtf8("specGraphCebCoherencmap")) - self.gridLayout_9.addWidget(self.specGraphCebCoherencmap, xi+4, 3, 1, 1) - self.specGraphPowerprofile = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphPowerprofile.setText(_fromUtf8("")) - self.specGraphPowerprofile.setObjectName(_fromUtf8("specGraphPowerprofile")) - self.gridLayout_9.addWidget(self.specGraphPowerprofile, xi+5, 3, 1, 1) - self.specGraphCebRTInoise = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphCebRTInoise.setText(_fromUtf8("")) - self.specGraphCebRTInoise.setObjectName(_fromUtf8("specGraphCebRTInoise")) - self.gridLayout_9.addWidget(self.specGraphCebRTInoise, xi+6, 3, 1, 1) - -# spacerItem18 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_9.addItem(spacerItem18, 4, 3, 1, 1) - - self.label_47 = QtGui.QLabel(self.tabgraphSpectra) - self.label_47.setObjectName(_fromUtf8("label_47")) - self.gridLayout_9.addWidget(self.label_47, xi, 5, 1, 1) - self.specGraphSaveSpectra = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphSaveSpectra.setText(_fromUtf8("")) - self.specGraphSaveSpectra.setObjectName(_fromUtf8("specGraphSaveSpectra")) - self.gridLayout_9.addWidget(self.specGraphSaveSpectra, xi+1, 5, 1, 1) - self.specGraphSaveCross = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphSaveCross.setText(_fromUtf8("")) - self.specGraphSaveCross.setObjectName(_fromUtf8("specGraphSaveCross")) - self.gridLayout_9.addWidget(self.specGraphSaveCross, xi+2, 5, 1, 1) - self.specGraphSaveRTIplot = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphSaveRTIplot.setText(_fromUtf8("")) - self.specGraphSaveRTIplot.setObjectName(_fromUtf8("specGraphSaveRTIplot")) - self.gridLayout_9.addWidget(self.specGraphSaveRTIplot, xi+3, 5, 1, 1) - self.specGraphSaveCoherencemap = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphSaveCoherencemap.setText(_fromUtf8("")) - self.specGraphSaveCoherencemap.setObjectName(_fromUtf8("specGraphSaveCoherencemap")) - self.gridLayout_9.addWidget(self.specGraphSaveCoherencemap, xi+4, 5, 1, 1) - self.specGraphSavePowerprofile = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphSavePowerprofile.setText(_fromUtf8("")) - self.specGraphSavePowerprofile.setObjectName(_fromUtf8("specGraphSavePowerprofile")) - self.gridLayout_9.addWidget(self.specGraphSavePowerprofile, xi+5, 5, 1, 1) - self.specGraphSaveRTInoise = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphSaveRTInoise.setText(_fromUtf8("")) - self.specGraphSaveRTInoise.setObjectName(_fromUtf8("specGraphSaveRTInoise")) - self.gridLayout_9.addWidget(self.specGraphSaveRTInoise, xi+6, 5, 1, 1) - - self.label_19 = QtGui.QLabel(self.tabgraphSpectra) - self.label_19.setObjectName(_fromUtf8("label_19")) - self.gridLayout_9.addWidget(self.label_19, xi, 7, 1, 1) - self.specGraphftpSpectra = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphftpSpectra.setText(_fromUtf8("")) - self.specGraphftpSpectra.setObjectName(_fromUtf8("specGraphftpSpectra")) - self.gridLayout_9.addWidget(self.specGraphftpSpectra, xi+1, 7, 1, 1) - self.specGraphftpCross = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphftpCross.setText(_fromUtf8("")) - self.specGraphftpCross.setObjectName(_fromUtf8("specGraphftpCross")) - self.gridLayout_9.addWidget(self.specGraphftpCross, xi+2, 7, 1, 1) - self.specGraphftpRTIplot = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphftpRTIplot.setText(_fromUtf8("")) - self.specGraphftpRTIplot.setObjectName(_fromUtf8("specGraphftpRTIplot")) - self.gridLayout_9.addWidget(self.specGraphftpRTIplot, xi+3, 7, 1, 1) - self.specGraphftpCoherencemap = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphftpCoherencemap.setText(_fromUtf8("")) - self.specGraphftpCoherencemap.setObjectName(_fromUtf8("specGraphftpCoherencemap")) - self.gridLayout_9.addWidget(self.specGraphftpCoherencemap, xi+4, 7, 1, 1) - self.specGraphftpPowerprofile = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphftpPowerprofile.setText(_fromUtf8("")) - self.specGraphftpPowerprofile.setObjectName(_fromUtf8("specGraphftpPowerprofile")) - self.gridLayout_9.addWidget(self.specGraphftpPowerprofile, xi+5, 7, 1, 1) - self.specGraphftpRTInoise = QtGui.QCheckBox(self.tabgraphSpectra) - self.specGraphftpRTInoise.setText(_fromUtf8("")) - self.specGraphftpRTInoise.setObjectName(_fromUtf8("specGraphftpRTInoise")) - self.gridLayout_9.addWidget(self.specGraphftpRTInoise, xi+6, 7, 1, 1) - -# spacerItem19 = QtGui.QSpacerItem(39, 15, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_9.addItem(spacerItem19, 27, 4, 1, 1) - - xi = 11 - - self.label_22 = QtGui.QLabel(self.tabgraphSpectra) - self.label_22.setObjectName(_fromUtf8("label_22")) - self.gridLayout_9.addWidget(self.label_22, xi, 0, 1, 1) - self.specGgraphFreq = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphFreq.setObjectName(_fromUtf8("specGgraphFreq")) - self.gridLayout_9.addWidget(self.specGgraphFreq, xi, 2, 1, 2) - - self.label_16 = QtGui.QLabel(self.tabgraphSpectra) - self.label_16.setObjectName(_fromUtf8("label_16")) - self.gridLayout_9.addWidget(self.label_16, xi+1, 0, 1, 1) - self.specGgraphHeight = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphHeight.setObjectName(_fromUtf8("specGgraphHeight")) - self.gridLayout_9.addWidget(self.specGgraphHeight, xi+1, 2, 1, 2) - - self.label_17 = QtGui.QLabel(self.tabgraphSpectra) - self.label_17.setObjectName(_fromUtf8("label_17")) - self.gridLayout_9.addWidget(self.label_17, xi+2, 0, 1, 1) - self.specGgraphDbsrange = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphDbsrange.setObjectName(_fromUtf8("specGgraphDbsrange")) - self.gridLayout_9.addWidget(self.specGgraphDbsrange, xi+2, 2, 1, 2) - - self.specGraphTminTmaxLabel = QtGui.QLabel(self.tabgraphSpectra) - self.specGraphTminTmaxLabel.setObjectName(_fromUtf8("specGraphTminTmaxLabel")) - self.gridLayout_9.addWidget(self.specGraphTminTmaxLabel, xi+3, 0, 1, 2) - self.specGgraphTminTmax = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphTminTmax.setObjectName(_fromUtf8("specGgraphTminTmax")) - self.gridLayout_9.addWidget(self.specGgraphTminTmax, xi+3, 2, 1, 2) - - self.label_48 = QtGui.QLabel(self.tabgraphSpectra) - self.label_48.setObjectName(_fromUtf8("label_48")) - self.gridLayout_9.addWidget(self.label_48, xi+4, 0, 1, 2) - self.specGgraphTimeRange = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphTimeRange.setObjectName(_fromUtf8("specGgraphTimeRange")) - self.gridLayout_9.addWidget(self.specGgraphTimeRange, xi+4, 2, 1, 2) - - self.specGraphMagLabel = QtGui.QLabel(self.tabgraphSpectra) - self.specGraphMagLabel.setObjectName(_fromUtf8("specGraphMagLabel")) - self.gridLayout_9.addWidget(self.specGraphMagLabel, xi, 4, 1, 2) - self.specGgraphmagnitud = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphmagnitud.setObjectName(_fromUtf8("specGgraphmagnitud")) - self.gridLayout_9.addWidget(self.specGgraphmagnitud, xi, 6, 1, 2) - - self.specGraphPhaseLabel = QtGui.QLabel(self.tabgraphSpectra) - self.specGraphPhaseLabel.setObjectName(_fromUtf8("specGraphPhaseLabel")) - self.gridLayout_9.addWidget(self.specGraphPhaseLabel, xi+1, 4, 1, 2) - self.specGgraphPhase = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphPhase.setObjectName(_fromUtf8("specGgraphPhase")) - self.gridLayout_9.addWidget(self.specGgraphPhase, xi+1, 6, 1, 2) - - self.label_6 = QtGui.QLabel(self.tabgraphSpectra) - self.label_6.setObjectName(_fromUtf8("label_6")) - self.gridLayout_9.addWidget(self.label_6, xi+2, 4, 1, 1) - self.specGgraphChannelList = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphChannelList.setObjectName(_fromUtf8("specGgraphChannelList")) - self.gridLayout_9.addWidget(self.specGgraphChannelList, xi+2, 6, 1, 2) - - self.label_29 = QtGui.QLabel(self.tabgraphSpectra) - self.label_29.setObjectName(_fromUtf8("label_29")) - self.gridLayout_9.addWidget(self.label_29, xi+3, 4, 1, 2) - self.specGgraphftpratio = QtGui.QLineEdit(self.tabgraphSpectra) - self.specGgraphftpratio.setObjectName(_fromUtf8("specGgraphftpratio")) - self.gridLayout_9.addWidget(self.specGgraphftpratio, xi+3, 6, 1, 2) - -# spacerItem15 = QtGui.QSpacerItem(28, 15, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_9.addItem(spacerItem15, 27, 6, 1, 2) -# spacerItem16 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) -# self.gridLayout_9.addItem(spacerItem16, 3, 5, 1, 1) -# spacerItem17 = QtGui.QSpacerItem(49, 15, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout_9.addItem(spacerItem17, 27, 0, 1, 1) - - - - self.tabWidgetSpectra.addTab(self.tabgraphSpectra, _fromUtf8("")) - self.taboutputSpectra = QtGui.QWidget() - self.taboutputSpectra.setObjectName(_fromUtf8("taboutputSpectra")) - self.gridLayout_11 = QtGui.QGridLayout(self.taboutputSpectra) - self.gridLayout_11.setObjectName(_fromUtf8("gridLayout_11")) - self.label_39 = QtGui.QLabel(self.taboutputSpectra) - self.label_39.setObjectName(_fromUtf8("label_39")) - self.gridLayout_11.addWidget(self.label_39, 0, 0, 1, 1) - self.specOutputComData = QtGui.QComboBox(self.taboutputSpectra) - self.specOutputComData.setObjectName(_fromUtf8("specOutputComData")) - self.specOutputComData.addItem(_fromUtf8("")) - self.gridLayout_11.addWidget(self.specOutputComData, 0, 2, 1, 2) - self.label_34 = QtGui.QLabel(self.taboutputSpectra) - self.label_34.setObjectName(_fromUtf8("label_34")) - self.gridLayout_11.addWidget(self.label_34, 1, 0, 1, 1) - self.specOutputPath = QtGui.QLineEdit(self.taboutputSpectra) - self.specOutputPath.setObjectName(_fromUtf8("specOutputPath")) - self.gridLayout_11.addWidget(self.specOutputPath, 1, 2, 1, 1) - spacerItem20 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_11.addItem(spacerItem20, 4, 2, 1, 1) - self.specOutputToolPath = QtGui.QToolButton(self.taboutputSpectra) - self.specOutputToolPath.setObjectName(_fromUtf8("specOutputToolPath")) - self.gridLayout_11.addWidget(self.specOutputToolPath, 1, 3, 1, 1) - self.specOutputblocksperfile = QtGui.QLineEdit(self.taboutputSpectra) - self.specOutputblocksperfile.setObjectName(_fromUtf8("specOutputblocksperfile")) - self.gridLayout_11.addWidget(self.specOutputblocksperfile, 2, 2, 1, 1) - self.label_9 = QtGui.QLabel(self.taboutputSpectra) - self.label_9.setObjectName(_fromUtf8("label_9")) - self.gridLayout_11.addWidget(self.label_9, 2, 0, 1, 2) - - self.tabWidgetSpectra.addTab(self.taboutputSpectra, _fromUtf8("")) - self.gridLayout_7.addWidget(self.tabWidgetSpectra, 0, 1, 1, 1) - - self.tabWidgetProject.addTab(self.tabSpectra, _fromUtf8("")) - - self.tabWidgetSpectra.setCurrentIndex(0) - - def retranslateUi(self): - - self.specOpOk.setText(_translate("MainWindow", "Ok", None)) - self.specGraphClear.setText(_translate("MainWindow", "Clear", None)) - self.specOpCebCrossSpectra.setText(_translate("MainWindow", "Select Cross Spectra:", None)) - self.specOpComChannel.setItemText(0, _translate("MainWindow", "Value", None)) - self.specOpComChannel.setItemText(1, _translate("MainWindow", "Index", None)) - self.specOpComHeights.setItemText(0, _translate("MainWindow", "Value", None)) - self.specOpComHeights.setItemText(1, _translate("MainWindow", "Index", None)) - self.specOpCebRemoveDC.setText(_translate("MainWindow", "Remove DC:", None)) - self.specOpCebHeights.setText(_translate("MainWindow", "Select Heights:", None)) - self.specOpCebChannel.setText(_translate("MainWindow", "Select Channel:", None)) - - self.specOpComCrossSpectra.setItemText(0, _translate("MainWindow", "x-y pairs", None)) - - self.specLabnFFTPoints.setText(_translate("MainWindow", "Number of FFT points:", None)) - self.specOpCebIncoherent.setText(_translate("MainWindow", "Incoherent Integration:", None)) - self.specOpCobIncInt.setItemText(0, _translate("MainWindow", "Time Interval", None)) - self.specOpCobIncInt.setItemText(1, _translate("MainWindow", "Number of Profiles", None)) - self.specOpCebRadarfrequency.setText(_translate("MainWindow", "Radar frequency (MHz):", None)) - self.specLabProfiles.setText(_translate("MainWindow", "Number of Profiles", None)) - self.specOpCebRemoveInt.setText(_translate("MainWindow", "Remove Interference:", None)) - self.specLabippFactor.setText(_translate("MainWindow", "Ipp Factor:", None)) - self.specOpCebgetNoise.setText(_translate("MainWindow", "Set Noise area:", None)) - self.specOpComRemoveDC.setItemText(0, _translate("MainWindow", "Mode 1", None)) - self.specOpComRemoveDC.setItemText(1, _translate("MainWindow", "Mode 2", None)) - self.tabWidgetSpectra.setTabText(self.tabWidgetSpectra.indexOf(self.tabopSpectra), _translate("MainWindow", "Operation", None)) - - self.label_44.setText(_translate("MainWindow", "Coherence Map:", None)) - self.specGraphTminTmaxLabel.setText(_translate("MainWindow", "Time range (hours):", None)) - self.label_25.setText(_translate("MainWindow", "Prefix:", None)) - self.label_42.setText(_translate("MainWindow", "RTI Plot:", None)) - self.label_16.setText(_translate("MainWindow", "Height range:", None)) - self.label_17.setText(_translate("MainWindow", "dB range:", None)) - self.specGraphMagLabel.setText(_translate("MainWindow", "Coh. Magnitud:", None)) - self.label_24.setText(_translate("MainWindow", "Path:", None)) - self.label_46.setText(_translate("MainWindow", "Power Profile:", None)) - self.label_22.setText(_translate("MainWindow", "Freq/Vel range:", None)) - self.label_41.setText(_translate("MainWindow", "Cross Spectra Plot:", None)) - self.specGraphToolPath.setText(_translate("MainWindow", "...", None)) - self.label_6.setText(_translate("MainWindow", "Channel List:", None)) - self.label_40.setText(_translate("MainWindow", "Spectra Plot:", None)) - self.label_43.setText(_translate("MainWindow", "Show:", None)) - self.label_29.setText(_translate("MainWindow", "Writing Period:", None)) - self.label_47.setText(_translate("MainWindow", "Save:", None)) - self.label_19.setText(_translate("MainWindow", "Ftp:", None)) - self.label_45.setText(_translate("MainWindow", "Noise:", None)) - self.label_48.setText(_translate("MainWindow", "Time window (seconds):", None)) - self.specGraphPhaseLabel.setText(_translate("MainWindow", "Coh. Phase:", None)) -# self.label_48.hide() -# self.specGgraphTimeRange.hide() - self.tabWidgetSpectra.setTabText(self.tabWidgetSpectra.indexOf(self.tabgraphSpectra), _translate("MainWindow", "Graphics", None)) - - self.label_39.setText(_translate("MainWindow", "Type:", None)) - self.specOutputComData.setItemText(0, _translate("MainWindow", ".pdata", None)) - self.label_34.setText(_translate("MainWindow", "Path:", None)) - self.specOutputToolPath.setText(_translate("MainWindow", "...", None)) - self.label_9.setText(_translate("MainWindow", "Blocks per File: ", None)) - - self.tabWidgetSpectra.setTabText(self.tabWidgetSpectra.indexOf(self.taboutputSpectra), _translate("MainWindow", "Output", None)) - - self.tabWidgetProject.setTabText(self.tabWidgetProject.indexOf(self.tabSpectra), _translate("MainWindow", "Spectra", None)) - - self.__setToolTip() - - def __setToolTip(self): - - self.specOpnFFTpoints.setToolTip('Number of FFT points used in FFT function. Example: 128') - self.specOpProfiles.setToolTip('Number of data points used in FFT function. Example: 128') - self.specOpippFactor.setToolTip('This factor is multiplied to IPP value to get velocity and frequency range. Example: 4') - self.specOpIncoherent.setToolTip('Example: 10') - self.specOpgetNoise.setToolTip('Example:20,180,30,120 (minHei,maxHei,minVel,maxVel)') - - self.specOpChannel.setToolTip('Example: 0,1,2,3') - self.specOpHeights.setToolTip('Example: 90,180') - self.specOppairsList.setToolTip('Example: (0,1),(2,3)') - # tool tip gui specGraph - - self.specGgraphChannelList.setToolTip('Example: 0,3,4') - self.specGgraphFreq.setToolTip('Example: -20,20') - self.specGgraphHeight.setToolTip('Example: 100,400') - self.specGgraphDbsrange.setToolTip('Example: 30,170') - - self.specGraphPrefix.setToolTip('Example: EXPERIMENT_NAME') - - \ No newline at end of file diff --git a/schainpy/gui/viewer/windows/ui_spectra_heis.py b/schainpy/gui/viewer/windows/ui_spectra_heis.py deleted file mode 100644 index 7fcbcd3..0000000 --- a/schainpy/gui/viewer/windows/ui_spectra_heis.py +++ /dev/null @@ -1,252 +0,0 @@ -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_SpectraHeisTab(object): - - def setupUi(self): - - self.tabSpectraHeis = QtGui.QWidget() - self.tabSpectraHeis.setObjectName(_fromUtf8("tabSpectraHeis")) - self.gridLayout_23 = QtGui.QGridLayout(self.tabSpectraHeis) - self.gridLayout_23.setObjectName(_fromUtf8("gridLayout_23")) - self.frame_6 = QtGui.QFrame(self.tabSpectraHeis) - self.frame_6.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame_6.setFrameShadow(QtGui.QFrame.Raised) - self.frame_6.setObjectName(_fromUtf8("frame_6")) - self.gridLayout_22 = QtGui.QGridLayout(self.frame_6) - self.gridLayout_22.setObjectName(_fromUtf8("gridLayout_22")) - self.specHeisGraphClear = QtGui.QPushButton(self.frame_6) - self.specHeisGraphClear.setObjectName(_fromUtf8("specHeisGraphClear")) - self.gridLayout_22.addWidget(self.specHeisGraphClear, 0, 1, 1, 1) - self.specHeisOpOk = QtGui.QPushButton(self.frame_6) - self.specHeisOpOk.setObjectName(_fromUtf8("specHeisOpOk")) - self.gridLayout_22.addWidget(self.specHeisOpOk, 0, 0, 1, 1) - self.gridLayout_23.addWidget(self.frame_6, 1, 0, 1, 1) - self.tabWidgetSpectraHeis = QtGui.QTabWidget(self.tabSpectraHeis) - self.tabWidgetSpectraHeis.setObjectName(_fromUtf8("tabWidgetSpectraHeis")) - self.tabopSpectraHeis = QtGui.QWidget() - self.tabopSpectraHeis.setObjectName(_fromUtf8("tabopSpectraHeis")) - self.gridLayout_21 = QtGui.QGridLayout(self.tabopSpectraHeis) - self.gridLayout_21.setObjectName(_fromUtf8("gridLayout_21")) - spacerItem21 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_21.addItem(spacerItem21, 0, 1, 1, 1) - self.specHeisOpCobIncInt = QtGui.QComboBox(self.tabopSpectraHeis) - self.specHeisOpCobIncInt.setObjectName(_fromUtf8("specHeisOpCobIncInt")) - self.specHeisOpCobIncInt.addItem(_fromUtf8("")) - self.gridLayout_21.addWidget(self.specHeisOpCobIncInt, 1, 0, 1, 1) - self.specHeisOpCebIncoherent = QtGui.QCheckBox(self.tabopSpectraHeis) - self.specHeisOpCebIncoherent.setObjectName(_fromUtf8("specHeisOpCebIncoherent")) - self.gridLayout_21.addWidget(self.specHeisOpCebIncoherent, 0, 0, 1, 1) - self.specHeisOpIncoherent = QtGui.QLineEdit(self.tabopSpectraHeis) - self.specHeisOpIncoherent.setObjectName(_fromUtf8("specHeisOpIncoherent")) - self.gridLayout_21.addWidget(self.specHeisOpIncoherent, 1, 1, 1, 1) - spacerItem22 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_21.addItem(spacerItem22, 2, 0, 1, 1) - self.tabWidgetSpectraHeis.addTab(self.tabopSpectraHeis, _fromUtf8("")) - self.tabgraphSpectraHeis = QtGui.QWidget() - self.tabgraphSpectraHeis.setObjectName(_fromUtf8("tabgraphSpectraHeis")) - self.gridLayout_20 = QtGui.QGridLayout(self.tabgraphSpectraHeis) - self.gridLayout_20.setObjectName(_fromUtf8("gridLayout_20")) - self.label_54 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_54.setObjectName(_fromUtf8("label_54")) - self.gridLayout_20.addWidget(self.label_54, 1, 0, 1, 1) - self.specHeisGraphToolPath = QtGui.QToolButton(self.tabgraphSpectraHeis) - self.specHeisGraphToolPath.setObjectName(_fromUtf8("specHeisGraphToolPath")) - self.gridLayout_20.addWidget(self.specHeisGraphToolPath, 0, 6, 1, 1) - self.specHeisGraphCebRTIplot = QtGui.QCheckBox(self.tabgraphSpectraHeis) - self.specHeisGraphCebRTIplot.setText(_fromUtf8("")) - self.specHeisGraphCebRTIplot.setObjectName(_fromUtf8("specHeisGraphCebRTIplot")) - self.gridLayout_20.addWidget(self.specHeisGraphCebRTIplot, 4, 2, 1, 1) - self.label_62 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_62.setObjectName(_fromUtf8("label_62")) - self.gridLayout_20.addWidget(self.label_62, 7, 0, 1, 1) - self.label_63 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_63.setObjectName(_fromUtf8("label_63")) - self.gridLayout_20.addWidget(self.label_63, 8, 0, 1, 1) - self.label_64 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_64.setObjectName(_fromUtf8("label_64")) - self.gridLayout_20.addWidget(self.label_64, 9, 0, 1, 1) - self.label_65 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_65.setObjectName(_fromUtf8("label_65")) - self.gridLayout_20.addWidget(self.label_65, 10, 0, 1, 1) - spacerItem23 = QtGui.QSpacerItem(134, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_20.addItem(spacerItem23, 11, 0, 1, 2) - self.specHeisGgraphftpratio = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGgraphftpratio.setObjectName(_fromUtf8("specHeisGgraphftpratio")) - self.gridLayout_20.addWidget(self.specHeisGgraphftpratio, 10, 1, 1, 6) - self.specHeisGraphftpRTIplot = QtGui.QCheckBox(self.tabgraphSpectraHeis) - self.specHeisGraphftpRTIplot.setText(_fromUtf8("")) - self.specHeisGraphftpRTIplot.setObjectName(_fromUtf8("specHeisGraphftpRTIplot")) - self.gridLayout_20.addWidget(self.specHeisGraphftpRTIplot, 4, 6, 1, 1) - self.specHeisGgraphTminTmax = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGgraphTminTmax.setObjectName(_fromUtf8("specHeisGgraphTminTmax")) - self.gridLayout_20.addWidget(self.specHeisGgraphTminTmax, 8, 1, 1, 6) - self.label_60 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_60.setObjectName(_fromUtf8("label_60")) - self.gridLayout_20.addWidget(self.label_60, 5, 0, 1, 1) - self.label_61 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_61.setObjectName(_fromUtf8("label_61")) - self.gridLayout_20.addWidget(self.label_61, 6, 0, 1, 1) - self.specHeisGraphPrefix = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGraphPrefix.setObjectName(_fromUtf8("specHeisGraphPrefix")) - self.gridLayout_20.addWidget(self.specHeisGraphPrefix, 1, 1, 1, 6) - self.label_56 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_56.setObjectName(_fromUtf8("label_56")) - self.gridLayout_20.addWidget(self.label_56, 2, 4, 1, 1) - self.label_57 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_57.setObjectName(_fromUtf8("label_57")) - self.gridLayout_20.addWidget(self.label_57, 2, 6, 1, 1) - self.label_58 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_58.setObjectName(_fromUtf8("label_58")) - self.gridLayout_20.addWidget(self.label_58, 3, 0, 1, 1) - self.specHeisGraphCebSpectraplot = QtGui.QCheckBox(self.tabgraphSpectraHeis) - self.specHeisGraphCebSpectraplot.setText(_fromUtf8("")) - self.specHeisGraphCebSpectraplot.setObjectName(_fromUtf8("specHeisGraphCebSpectraplot")) - self.gridLayout_20.addWidget(self.specHeisGraphCebSpectraplot, 3, 2, 1, 1) - self.specHeisGgraphYminYmax = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGgraphYminYmax.setObjectName(_fromUtf8("specHeisGgraphYminYmax")) - self.gridLayout_20.addWidget(self.specHeisGgraphYminYmax, 7, 1, 1, 6) - self.label_53 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_53.setObjectName(_fromUtf8("label_53")) - self.gridLayout_20.addWidget(self.label_53, 0, 0, 1, 1) - self.label_55 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_55.setObjectName(_fromUtf8("label_55")) - self.gridLayout_20.addWidget(self.label_55, 2, 2, 1, 1) - self.specHeisGraphSaveRTIplot = QtGui.QCheckBox(self.tabgraphSpectraHeis) - self.specHeisGraphSaveRTIplot.setText(_fromUtf8("")) - self.specHeisGraphSaveRTIplot.setObjectName(_fromUtf8("specHeisGraphSaveRTIplot")) - self.gridLayout_20.addWidget(self.specHeisGraphSaveRTIplot, 4, 4, 1, 1) - spacerItem24 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_20.addItem(spacerItem24, 2, 3, 1, 1) - self.specHeisGgraphXminXmax = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGgraphXminXmax.setObjectName(_fromUtf8("specHeisGgraphXminXmax")) - self.gridLayout_20.addWidget(self.specHeisGgraphXminXmax, 6, 1, 1, 6) - self.specHeisGgraphChannelList = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGgraphChannelList.setObjectName(_fromUtf8("specHeisGgraphChannelList")) - self.gridLayout_20.addWidget(self.specHeisGgraphChannelList, 5, 1, 1, 6) - self.specHeisGgraphTimeRange = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGgraphTimeRange.setObjectName(_fromUtf8("specHeisGgraphTimeRange")) - self.gridLayout_20.addWidget(self.specHeisGgraphTimeRange, 9, 1, 1, 6) - spacerItem25 = QtGui.QSpacerItem(106, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_20.addItem(spacerItem25, 11, 3, 1, 3) - self.specHeisGraphSaveSpectra = QtGui.QCheckBox(self.tabgraphSpectraHeis) - self.specHeisGraphSaveSpectra.setText(_fromUtf8("")) - self.specHeisGraphSaveSpectra.setObjectName(_fromUtf8("specHeisGraphSaveSpectra")) - self.gridLayout_20.addWidget(self.specHeisGraphSaveSpectra, 3, 4, 1, 1) - self.specHeisGraphftpSpectra = QtGui.QCheckBox(self.tabgraphSpectraHeis) - self.specHeisGraphftpSpectra.setText(_fromUtf8("")) - self.specHeisGraphftpSpectra.setObjectName(_fromUtf8("specHeisGraphftpSpectra")) - self.gridLayout_20.addWidget(self.specHeisGraphftpSpectra, 3, 6, 1, 1) - self.label_59 = QtGui.QLabel(self.tabgraphSpectraHeis) - self.label_59.setObjectName(_fromUtf8("label_59")) - self.gridLayout_20.addWidget(self.label_59, 4, 0, 1, 1) - spacerItem26 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_20.addItem(spacerItem26, 2, 5, 1, 1) - self.specHeisGraphPath = QtGui.QLineEdit(self.tabgraphSpectraHeis) - self.specHeisGraphPath.setObjectName(_fromUtf8("specHeisGraphPath")) - self.gridLayout_20.addWidget(self.specHeisGraphPath, 0, 1, 1, 5) - self.tabWidgetSpectraHeis.addTab(self.tabgraphSpectraHeis, _fromUtf8("")) - self.taboutputSpectraHeis = QtGui.QWidget() - self.taboutputSpectraHeis.setObjectName(_fromUtf8("taboutputSpectraHeis")) - self.gridLayout_19 = QtGui.QGridLayout(self.taboutputSpectraHeis) - self.gridLayout_19.setObjectName(_fromUtf8("gridLayout_19")) - self.label_67 = QtGui.QLabel(self.taboutputSpectraHeis) - self.label_67.setObjectName(_fromUtf8("label_67")) - self.gridLayout_19.addWidget(self.label_67, 1, 0, 1, 1) - self.label_68 = QtGui.QLabel(self.taboutputSpectraHeis) - self.label_68.setObjectName(_fromUtf8("label_68")) - self.gridLayout_19.addWidget(self.label_68, 2, 0, 1, 2) - self.label_66 = QtGui.QLabel(self.taboutputSpectraHeis) - self.label_66.setObjectName(_fromUtf8("label_66")) - self.gridLayout_19.addWidget(self.label_66, 0, 0, 1, 1) - spacerItem27 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_19.addItem(spacerItem27, 4, 0, 1, 1) - self.specHeisOutputToolPath = QtGui.QToolButton(self.taboutputSpectraHeis) - self.specHeisOutputToolPath.setObjectName(_fromUtf8("specHeisOutputToolPath")) - self.gridLayout_19.addWidget(self.specHeisOutputToolPath, 1, 4, 1, 1) - self.specHeisOutputPath = QtGui.QLineEdit(self.taboutputSpectraHeis) - self.specHeisOutputPath.setObjectName(_fromUtf8("specHeisOutputPath")) - self.gridLayout_19.addWidget(self.specHeisOutputPath, 1, 3, 1, 1) - self.specHeisOutputComdata = QtGui.QComboBox(self.taboutputSpectraHeis) - self.specHeisOutputComdata.setObjectName(_fromUtf8("specHeisOutputComdata")) - self.specHeisOutputComdata.addItem(_fromUtf8("")) - self.gridLayout_19.addWidget(self.specHeisOutputComdata, 0, 3, 1, 2) - self.label_69 = QtGui.QLabel(self.taboutputSpectraHeis) - self.label_69.setObjectName(_fromUtf8("label_69")) - self.gridLayout_19.addWidget(self.label_69, 3, 0, 1, 2) - self.specHeisOutputblocksperfile = QtGui.QLineEdit(self.taboutputSpectraHeis) - self.specHeisOutputblocksperfile.setObjectName(_fromUtf8("specHeisOutputblocksperfile")) - self.gridLayout_19.addWidget(self.specHeisOutputblocksperfile, 2, 3, 1, 1) - self.specHeisOutputMetada = QtGui.QLineEdit(self.taboutputSpectraHeis) - self.specHeisOutputMetada.setObjectName(_fromUtf8("specHeisOutputMetada")) - self.gridLayout_19.addWidget(self.specHeisOutputMetada, 3, 3, 1, 1) - self.specHeisOutputMetadaToolPath = QtGui.QToolButton(self.taboutputSpectraHeis) - self.specHeisOutputMetadaToolPath.setObjectName(_fromUtf8("specHeisOutputMetadaToolPath")) - self.gridLayout_19.addWidget(self.specHeisOutputMetadaToolPath, 3, 4, 1, 1) - self.tabWidgetSpectraHeis.addTab(self.taboutputSpectraHeis, _fromUtf8("")) - self.gridLayout_23.addWidget(self.tabWidgetSpectraHeis, 0, 0, 1, 1) - - self.tabWidgetProject.addTab(self.tabSpectraHeis, _fromUtf8("")) - - self.tabWidgetSpectraHeis.setCurrentIndex(0) - - def retranslateUi(self): - - self.specHeisGraphClear.setText(_translate("MainWindow", "Clear", None)) - self.specHeisOpOk.setText(_translate("MainWindow", "Ok", None)) - self.specHeisOpCobIncInt.setItemText(0, _translate("MainWindow", "Time Interval", None)) - self.specHeisOpCebIncoherent.setText(_translate("MainWindow", "Incoherent Intergration", None)) - - self.tabWidgetSpectraHeis.setTabText(self.tabWidgetSpectraHeis.indexOf(self.tabopSpectraHeis), _translate("MainWindow", "Operation", None)) - self.label_54.setText(_translate("MainWindow", "Prefix", None)) - self.specHeisGraphToolPath.setText(_translate("MainWindow", "...", None)) - self.label_62.setText(_translate("MainWindow", "Intensity range (dB)", None)) - self.label_63.setText(_translate("MainWindow", "Time range (hours):", None)) - self.label_64.setText(_translate("MainWindow", "Time interval:", None)) - self.label_65.setText(_translate("MainWindow", "Wr Period", None)) - self.label_60.setText(_translate("MainWindow", "Channel List:", None)) - self.label_61.setText(_translate("MainWindow", "Frequency range", None)) - self.label_56.setText(_translate("MainWindow", "Save", None)) - self.label_57.setText(_translate("MainWindow", "ftp", None)) - self.label_58.setText(_translate("MainWindow", "Spectra Plot", None)) - self.label_53.setText(_translate("MainWindow", "Path", None)) - self.label_55.setText(_translate("MainWindow", "Show", None)) - self.label_59.setText(_translate("MainWindow", "RTI Plot", None)) - - self.tabWidgetSpectraHeis.setTabText(self.tabWidgetSpectraHeis.indexOf(self.tabgraphSpectraHeis), _translate("MainWindow", "Graphics", None)) - self.label_67.setText(_translate("MainWindow", "Path:", None)) - self.label_68.setText(_translate("MainWindow", "Blocks per file:", None)) - self.label_66.setText(_translate("MainWindow", "Type:", None)) - - self.tabWidgetSpectraHeis.setTabText(self.tabWidgetSpectraHeis.indexOf(self.taboutputSpectraHeis), _translate("MainWindow", "Output", None)) - self.specHeisOutputToolPath.setText(_translate("MainWindow", "...", None)) - self.specHeisOutputComdata.setItemText(0, _translate("MainWindow", ".fits", None)) - self.label_69.setText(_translate("MainWindow", "Metadata file:", None)) - self.specHeisOutputMetadaToolPath.setText(_translate("MainWindow", "...", None)) - - self.tabWidgetProject.setTabText(self.tabWidgetProject.indexOf(self.tabSpectraHeis), _translate("MainWindow", "SpectraHeis", None)) - - self.__setToolTip() - - def __setToolTip(self): - - self.specHeisOpIncoherent.setToolTip('Example: 10') - - self.specHeisGgraphChannelList.setToolTip('Example: 0,2,3') - self.specHeisGgraphXminXmax.setToolTip('Example (Hz): -1000, 1000') - self.specHeisGgraphYminYmax.setToolTip('Example (dB): 5, 35') - self.specHeisGgraphTminTmax.setToolTip('Example (hours): 0, 24') - self.specHeisGgraphTimeRange.setToolTip('Example (hours): 8') \ No newline at end of file diff --git a/schainpy/gui/viewer/windows/ui_voltage.py b/schainpy/gui/viewer/windows/ui_voltage.py deleted file mode 100644 index 4536b0f..0000000 --- a/schainpy/gui/viewer/windows/ui_voltage.py +++ /dev/null @@ -1,414 +0,0 @@ - -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) - -class Ui_VoltageTab(object): - - def setupUi(self): - - self.tabVoltage = QtGui.QWidget() - self.tabVoltage.setObjectName(_fromUtf8("tabVoltage")) - - self.gridLayout_3 = QtGui.QGridLayout(self.tabVoltage) - self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3")) - - self.frame_4 = QtGui.QFrame(self.tabVoltage) - self.frame_4.setFrameShape(QtGui.QFrame.StyledPanel) - self.frame_4.setFrameShadow(QtGui.QFrame.Raised) - self.frame_4.setObjectName(_fromUtf8("frame_4")) - - self.gridLayout_17 = QtGui.QGridLayout(self.frame_4) - self.gridLayout_17.setObjectName(_fromUtf8("gridLayout_17")) - self.volOpOk = QtGui.QPushButton(self.frame_4) - self.volOpOk.setObjectName(_fromUtf8("volOpOk")) - self.gridLayout_17.addWidget(self.volOpOk, 0, 0, 1, 1) - self.volGraphClear = QtGui.QPushButton(self.frame_4) - self.volGraphClear.setObjectName(_fromUtf8("volGraphClear")) - self.gridLayout_17.addWidget(self.volGraphClear, 0, 1, 1, 1) - self.gridLayout_3.addWidget(self.frame_4, 1, 1, 1, 1) - - - self.tabWidgetVoltage = QtGui.QTabWidget(self.tabVoltage) - self.tabWidgetVoltage.setObjectName(_fromUtf8("tabWidgetVoltage")) - self.tabopVoltage = QtGui.QWidget() - self.tabopVoltage.setObjectName(_fromUtf8("tabopVoltage")) - self.gridLayout = QtGui.QGridLayout(self.tabopVoltage) - self.gridLayout.setObjectName(_fromUtf8("gridLayout")) - - self.volOpCebRadarfrequency = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebRadarfrequency.setObjectName(_fromUtf8("volOpCebRadarfrequency")) - self.gridLayout.addWidget(self.volOpCebRadarfrequency, 0, 0, 1, 1) - - self.volOpRadarfrequency = QtGui.QLineEdit(self.tabopVoltage) - self.volOpRadarfrequency.setObjectName(_fromUtf8("volOpRadarfrequency")) - self.gridLayout.addWidget(self.volOpRadarfrequency, 0, 1, 1, 4) - - self.volOpCebChannels = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebChannels.setObjectName(_fromUtf8("volOpCebChannels")) - self.gridLayout.addWidget(self.volOpCebChannels, 1, 0, 1, 1) - - self.volOpComChannels = QtGui.QComboBox(self.tabopVoltage) - self.volOpComChannels.setObjectName(_fromUtf8("volOpComChannels")) - self.volOpComChannels.addItem(_fromUtf8("")) - self.volOpComChannels.addItem(_fromUtf8("")) - self.gridLayout.addWidget(self.volOpComChannels, 1, 1, 1, 2) - - self.volOpChannel = QtGui.QLineEdit(self.tabopVoltage) - self.volOpChannel.setObjectName(_fromUtf8("volOpChannel")) - self.gridLayout.addWidget(self.volOpChannel, 1, 3, 1, 2) - - - self.volOpCebHeights = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebHeights.setObjectName(_fromUtf8("volOpCebHeights")) - self.gridLayout.addWidget(self.volOpCebHeights, 3, 0, 1, 1) - - self.volOpComHeights = QtGui.QComboBox(self.tabopVoltage) - self.volOpComHeights.setObjectName(_fromUtf8("volOpComHeights")) - self.volOpComHeights.addItem(_fromUtf8("")) - self.volOpComHeights.addItem(_fromUtf8("")) - self.gridLayout.addWidget(self.volOpComHeights, 3, 1, 1, 2) - - self.volOpHeights = QtGui.QLineEdit(self.tabopVoltage) - self.volOpHeights.setObjectName(_fromUtf8("volOpHeights")) - self.gridLayout.addWidget(self.volOpHeights, 3, 3, 1, 2) - - self.volOpCebSplitter = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebSplitter.setObjectName(_fromUtf8("volOpCebSplitter")) - self.gridLayout.addWidget(self.volOpCebSplitter, 5, 0, 1, 1) - - self.volOpSplitter = QtGui.QLineEdit(self.tabopVoltage) - self.volOpSplitter.setObjectName(_fromUtf8("volOpSplitter")) - self.gridLayout.addWidget(self.volOpSplitter, 5, 1, 1, 4) - - self.volOpCebProfile = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebProfile.setObjectName(_fromUtf8("volOpCebProfile")) - self.gridLayout.addWidget(self.volOpCebProfile, 6, 0, 1, 1) - - self.volOpComProfile = QtGui.QComboBox(self.tabopVoltage) - self.volOpComProfile.setObjectName(_fromUtf8("volOpComProfile")) - self.volOpComProfile.addItem(_fromUtf8("")) - self.volOpComProfile.addItem(_fromUtf8("")) - self.volOpComProfile.addItem(_fromUtf8("")) - self.gridLayout.addWidget(self.volOpComProfile, 6, 1, 1, 2) - - self.volOpProfile = QtGui.QLineEdit(self.tabopVoltage) - self.volOpProfile.setObjectName(_fromUtf8("volOpProfile")) - self.gridLayout.addWidget(self.volOpProfile, 6, 3, 1, 2) - - self.volOpCebCombiner = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebCombiner.setObjectName(_fromUtf8("volOpCebCombiner")) - self.gridLayout.addWidget(self.volOpCebCombiner, 7, 0, 1, 1) - - self.volOpCombiner = QtGui.QLineEdit(self.tabopVoltage) - self.volOpCombiner.setObjectName(_fromUtf8("volOpCombiner")) - self.gridLayout.addWidget(self.volOpCombiner, 7, 1, 1, 4) - - self.volOpCebFilter = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebFilter.setObjectName(_fromUtf8("volOpCebFilter")) - self.gridLayout.addWidget(self.volOpCebFilter, 8, 0, 1, 1) - - self.volOpFilter = QtGui.QLineEdit(self.tabopVoltage) - self.volOpFilter.setObjectName(_fromUtf8("volOpFilter")) - self.gridLayout.addWidget(self.volOpFilter, 8, 1, 1, 4) - -# spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout.addItem(spacerItem, 6, 4, 1, 1) -# spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout.addItem(spacerItem1, 8, 4, 1, 1) -# spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout.addItem(spacerItem2, 3, 4, 1, 1) - - - -# spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) -# self.gridLayout.addItem(spacerItem3, 1, 4, 1, 1) - - - self.volOpCebDecodification = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebDecodification.setObjectName(_fromUtf8("volOpCebDecodification")) - self.gridLayout.addWidget(self.volOpCebDecodification, 9, 0, 1, 1) - - self.volLabCodeMode = QtGui.QLabel(self.tabopVoltage) - self.volLabCodeMode.setObjectName(_fromUtf8("volLabCodeMode")) - self.gridLayout.addWidget(self.volLabCodeMode, 9, 1, 1, 1) - - self.volOpComMode = QtGui.QComboBox(self.tabopVoltage) - self.volOpComMode.setObjectName(_fromUtf8("volOpComMode")) - self.volOpComMode.addItem(_fromUtf8("")) - self.volOpComMode.addItem(_fromUtf8("")) - self.gridLayout.addWidget(self.volOpComMode, 9, 2, 1, 3) - - self.volLabCodeType = QtGui.QLabel(self.tabopVoltage) - self.volLabCodeType.setObjectName(_fromUtf8("volLabCodeType")) - self.gridLayout.addWidget(self.volLabCodeType, 10, 1, 1, 1) - - self.volOpComCode = QtGui.QComboBox(self.tabopVoltage) - self.volOpComCode.setObjectName(_fromUtf8("volOpComCode")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.volOpComCode.addItem(_fromUtf8("")) - self.gridLayout.addWidget(self.volOpComCode, 10, 2, 1, 3) - - self.volLabCode = QtGui.QLabel(self.tabopVoltage) - self.volLabCode.setObjectName(_fromUtf8("volLabCode")) - self.gridLayout.addWidget(self.volLabCode, 11, 1, 1, 1) - - self.volOpCode = QtGui.QLineEdit(self.tabopVoltage) - self.volOpCode.setObjectName(_fromUtf8("volOpCode")) - self.gridLayout.addWidget(self.volOpCode, 11, 2, 1, 3) - - self.volOpCebFlip = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebFlip.setObjectName(_fromUtf8("volOpCebFlip")) - self.gridLayout.addWidget(self.volOpCebFlip, 12, 0, 1, 1) - - self.volOpFlip = QtGui.QLineEdit(self.tabopVoltage) - self.volOpFlip.setObjectName(_fromUtf8("volOpFlip")) - self.gridLayout.addWidget(self.volOpFlip, 13, 1, 1, 4) - - self.volOpCebCohInt = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebCohInt.setObjectName(_fromUtf8("volOpCebCohInt")) - self.gridLayout.addWidget(self.volOpCebCohInt, 13, 0, 1, 1) - - self.volOpCohInt = QtGui.QLineEdit(self.tabopVoltage) - self.volOpCohInt.setObjectName(_fromUtf8("volOpCohInt")) - self.gridLayout.addWidget(self.volOpCohInt, 13, 1, 1, 4) - - self.volOpCebAdjustHei = QtGui.QCheckBox(self.tabopVoltage) - self.volOpCebAdjustHei.setObjectName(_fromUtf8("volOpCebAdjustHei")) - self.gridLayout.addWidget(self.volOpCebAdjustHei, 14, 0, 1, 1) - - self.volOpAdjustHei = QtGui.QLineEdit(self.tabopVoltage) - self.volOpAdjustHei.setObjectName(_fromUtf8("volOpAdjustHei")) - self.gridLayout.addWidget(self.volOpAdjustHei, 14, 1, 1, 4) - - self.tabWidgetVoltage.addTab(self.tabopVoltage, _fromUtf8("")) - - self.tabgraphVoltage = QtGui.QWidget() - self.tabgraphVoltage.setObjectName(_fromUtf8("tabgraphVoltage")) - self.gridLayout_6 = QtGui.QGridLayout(self.tabgraphVoltage) - self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6")) - spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_6.addItem(spacerItem4, 12, 3, 1, 1) - self.volGraphIntensityRange = QtGui.QLineEdit(self.tabgraphVoltage) - self.volGraphIntensityRange.setObjectName(_fromUtf8("volGraphIntensityRange")) - self.gridLayout_6.addWidget(self.volGraphIntensityRange, 9, 1, 1, 6) - self.volGraphPrefix = QtGui.QLineEdit(self.tabgraphVoltage) - self.volGraphPrefix.setObjectName(_fromUtf8("volGraphPrefix")) - self.gridLayout_6.addWidget(self.volGraphPrefix, 2, 1, 1, 6) - self.volGraphToolPath = QtGui.QToolButton(self.tabgraphVoltage) - self.volGraphToolPath.setObjectName(_fromUtf8("volGraphToolPath")) - self.gridLayout_6.addWidget(self.volGraphToolPath, 1, 5, 1, 2) - self.volGraphPath = QtGui.QLineEdit(self.tabgraphVoltage) - self.volGraphPath.setObjectName(_fromUtf8("volGraphPath")) - self.gridLayout_6.addWidget(self.volGraphPath, 1, 1, 1, 4) - self.label_14 = QtGui.QLabel(self.tabgraphVoltage) - self.label_14.setObjectName(_fromUtf8("label_14")) - self.gridLayout_6.addWidget(self.label_14, 6, 0, 1, 1) - spacerItem5 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_6.addItem(spacerItem5, 3, 3, 1, 1) - self.label_8 = QtGui.QLabel(self.tabgraphVoltage) - self.label_8.setObjectName(_fromUtf8("label_8")) - self.gridLayout_6.addWidget(self.label_8, 8, 0, 1, 1) - self.label_49 = QtGui.QLabel(self.tabgraphVoltage) - self.label_49.setObjectName(_fromUtf8("label_49")) - self.gridLayout_6.addWidget(self.label_49, 4, 3, 1, 1) - self.label_51 = QtGui.QLabel(self.tabgraphVoltage) - self.label_51.setObjectName(_fromUtf8("label_51")) - self.gridLayout_6.addWidget(self.label_51, 9, 0, 1, 1) - self.volGraphCebshow = QtGui.QCheckBox(self.tabgraphVoltage) - self.volGraphCebshow.setText(_fromUtf8("")) - self.volGraphCebshow.setObjectName(_fromUtf8("volGraphCebshow")) - self.gridLayout_6.addWidget(self.volGraphCebshow, 6, 3, 1, 1) - self.label_12 = QtGui.QLabel(self.tabgraphVoltage) - self.label_12.setObjectName(_fromUtf8("label_12")) - self.gridLayout_6.addWidget(self.label_12, 1, 0, 1, 1) - self.label_13 = QtGui.QLabel(self.tabgraphVoltage) - self.label_13.setObjectName(_fromUtf8("label_13")) - self.gridLayout_6.addWidget(self.label_13, 2, 0, 1, 1) - self.label_52 = QtGui.QLabel(self.tabgraphVoltage) - self.label_52.setObjectName(_fromUtf8("label_52")) - - self.gridLayout_6.addWidget(self.label_52, 11, 0, 1, 1) - spacerItem6 = QtGui.QSpacerItem(40, 12, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_6.addItem(spacerItem6, 14, 5, 1, 2) - spacerItem7 = QtGui.QSpacerItem(18, 12, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.gridLayout_6.addItem(spacerItem7, 14, 3, 1, 1) - - self.volLabScopeType = QtGui.QLabel(self.tabgraphVoltage) - self.volLabScopeType.setObjectName(_fromUtf8("volLabScopeType")) - self.gridLayout_6.addWidget(self.volLabScopeType, 7, 0, 1, 1) - - self.volComScopeType = QtGui.QComboBox(self.tabgraphVoltage) - self.volComScopeType.setObjectName(_fromUtf8("volComScopeType")) - self.volComScopeType.addItem(_fromUtf8("")) - self.volComScopeType.addItem(_fromUtf8("")) - self.gridLayout_6.addWidget(self.volComScopeType, 7, 1, 1, 6) - - self.volGraphChannelList = QtGui.QLineEdit(self.tabgraphVoltage) - self.volGraphChannelList.setObjectName(_fromUtf8("volGraphChannelList")) - self.gridLayout_6.addWidget(self.volGraphChannelList, 8, 1, 1, 6) - - - self.volGraphHeightrange = QtGui.QLineEdit(self.tabgraphVoltage) - self.volGraphHeightrange.setObjectName(_fromUtf8("volGraphHeightrange")) - self.gridLayout_6.addWidget(self.volGraphHeightrange, 11, 1, 1, 6) - self.label_50 = QtGui.QLabel(self.tabgraphVoltage) - self.label_50.setObjectName(_fromUtf8("label_50")) - self.gridLayout_6.addWidget(self.label_50, 4, 4, 1, 1) - self.volGraphCebSave = QtGui.QCheckBox(self.tabgraphVoltage) - self.volGraphCebSave.setText(_fromUtf8("")) - self.volGraphCebSave.setObjectName(_fromUtf8("volGraphCebSave")) - self.gridLayout_6.addWidget(self.volGraphCebSave, 6, 4, 1, 1) - self.tabWidgetVoltage.addTab(self.tabgraphVoltage, _fromUtf8("")) - - self.taboutputVoltage = QtGui.QWidget() - self.taboutputVoltage.setObjectName(_fromUtf8("taboutputVoltage")) - self.gridLayout_12 = QtGui.QGridLayout(self.taboutputVoltage) - self.gridLayout_12.setObjectName(_fromUtf8("gridLayout_12")) - self.label_36 = QtGui.QLabel(self.taboutputVoltage) - self.label_36.setObjectName(_fromUtf8("label_36")) - self.gridLayout_12.addWidget(self.label_36, 0, 0, 1, 1) - self.label_37 = QtGui.QLabel(self.taboutputVoltage) - self.label_37.setObjectName(_fromUtf8("label_37")) - self.gridLayout_12.addWidget(self.label_37, 1, 0, 1, 1) - self.volOutputPath = QtGui.QLineEdit(self.taboutputVoltage) - self.volOutputPath.setObjectName(_fromUtf8("volOutputPath")) - self.gridLayout_12.addWidget(self.volOutputPath, 1, 2, 1, 1) - self.volOutputToolPath = QtGui.QToolButton(self.taboutputVoltage) - self.volOutputToolPath.setObjectName(_fromUtf8("volOutputToolPath")) - self.gridLayout_12.addWidget(self.volOutputToolPath, 1, 3, 1, 1) - self.volOutputComData = QtGui.QComboBox(self.taboutputVoltage) - self.volOutputComData.setObjectName(_fromUtf8("volOutputComData")) - self.volOutputComData.addItem(_fromUtf8("")) - self.gridLayout_12.addWidget(self.volOutputComData, 0, 2, 1, 2) - spacerItem8 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.gridLayout_12.addItem(spacerItem8, 5, 2, 1, 1) - self.volOutputblocksperfile = QtGui.QLineEdit(self.taboutputVoltage) - self.volOutputblocksperfile.setObjectName(_fromUtf8("volOutputblocksperfile")) - self.gridLayout_12.addWidget(self.volOutputblocksperfile, 3, 2, 1, 1) - self.label_7 = QtGui.QLabel(self.taboutputVoltage) - self.label_7.setObjectName(_fromUtf8("label_7")) - self.gridLayout_12.addWidget(self.label_7, 3, 0, 1, 1) - self.label_35 = QtGui.QLabel(self.taboutputVoltage) - self.label_35.setObjectName(_fromUtf8("label_35")) - self.gridLayout_12.addWidget(self.label_35, 4, 0, 1, 1) - self.volOutputprofilesperblock = QtGui.QLineEdit(self.taboutputVoltage) - self.volOutputprofilesperblock.setObjectName(_fromUtf8("volOutputprofilesperblock")) - self.gridLayout_12.addWidget(self.volOutputprofilesperblock, 4, 2, 1, 1) - self.tabWidgetVoltage.addTab(self.taboutputVoltage, _fromUtf8("")) - self.gridLayout_3.addWidget(self.tabWidgetVoltage, 0, 1, 1, 1) - - self.tabWidgetProject.addTab(self.tabVoltage, _fromUtf8("")) - - self.tabWidgetVoltage.setCurrentIndex(0) - - def retranslateUi(self): - - self.volOpOk.setText(_translate("MainWindow", "Ok", None)) - self.volGraphClear.setText(_translate("MainWindow", "Clear", None)) - self.volOpComHeights.setItemText(0, _translate("MainWindow", "Value", None)) - self.volOpComHeights.setItemText(1, _translate("MainWindow", "Index", None)) - self.volOpComChannels.setItemText(0, _translate("MainWindow", "Value", None)) - self.volOpComChannels.setItemText(1, _translate("MainWindow", "Index", None)) - self.volOpCebProfile.setText(_translate("MainWindow", "Select Profiles", None)) - self.volOpComProfile.setItemText(0, _translate("MainWindow", "Profile List", None)) - self.volOpComProfile.setItemText(1, _translate("MainWindow", "Profile Range", None)) - self.volOpComProfile.setItemText(2, _translate("MainWindow", "List of Profile Ranges", None)) - self.volOpCebDecodification.setText(_translate("MainWindow", "Decoder:", None)) - self.volOpCebCohInt.setText(_translate("MainWindow", "Coherent Integration:", None)) - self.volOpCebFlip.setText(_translate("MainWindow", "Flip:", None)) - self.volLabCodeType.setText(_translate("MainWindow", "Code type:", None)) - self.volOpCebChannels.setText(_translate("MainWindow", "Select Channels:", None)) - self.volOpCebHeights.setText(_translate("MainWindow", "Select Heights:", None)) - self.volOpCebFilter.setText(_translate("MainWindow", "Range Window Filter:", None)) - self.volOpCebSplitter.setText(_translate("MainWindow", "Split Profiles: ", None)) - self.volOpCebCombiner.setText(_translate("MainWindow", "Combine Profiles: ", None)) - self.volOpCebRadarfrequency.setText(_translate("MainWindow", "Radar frequency (MHz):", None)) - self.volLabCodeMode.setText(_translate("MainWindow", "Mode:", None)) - self.volLabCode.setText(_translate("MainWindow", "Code:", None)) - self.volOpComCode.setItemText(0, _translate("MainWindow", "Read from header", None)) - self.volOpComCode.setItemText(1, _translate("MainWindow", "Barker 3", None)) - self.volOpComCode.setItemText(2, _translate("MainWindow", "Barker 4", None)) - self.volOpComCode.setItemText(3, _translate("MainWindow", "Barker 5", None)) - self.volOpComCode.setItemText(4, _translate("MainWindow", "Barker 7", None)) - self.volOpComCode.setItemText(5, _translate("MainWindow", "Barker 11", None)) - self.volOpComCode.setItemText(6, _translate("MainWindow", "Barker 13", None)) - self.volOpComCode.setItemText(7, _translate("MainWindow", "Barker 3 + Comp.", None)) - self.volOpComCode.setItemText(8, _translate("MainWindow", "Barker 4 + Comp.", None)) - self.volOpComCode.setItemText(9, _translate("MainWindow", "Barker 5 + Comp.", None)) - self.volOpComCode.setItemText(10, _translate("MainWindow", "Barker 7 + Comp.", None)) - self.volOpComCode.setItemText(11, _translate("MainWindow", "Barker 11+ Comp.", None)) - self.volOpComCode.setItemText(12, _translate("MainWindow", "Barker 13+ Comp.", None)) - self.volOpComCode.setItemText(13, _translate("MainWindow", "User defined", None)) - self.volOpComMode.setItemText(0, _translate("MainWindow", "Time", None)) - self.volOpComMode.setItemText(1, _translate("MainWindow", "Frequency", None)) - self.volOpCebAdjustHei.setText(_translate("MainWindow", "Calibrate H0:", None)) - - self.tabWidgetVoltage.setTabText(self.tabWidgetVoltage.indexOf(self.tabopVoltage), _translate("MainWindow", "Operation", None)) - - self.volGraphToolPath.setText(_translate("MainWindow", "...", None)) - self.label_14.setText(_translate("MainWindow", "Scope:", None)) - self.label_8.setText(_translate("MainWindow", "Channel List:", None)) - self.label_49.setText(_translate("MainWindow", "Show:", None)) - self.label_51.setText(_translate("MainWindow", "Amplitude/Intensity:", None)) - self.label_12.setText(_translate("MainWindow", "Path :", None)) - self.label_13.setText(_translate("MainWindow", "Figure name:", None)) - self.label_52.setText(_translate("MainWindow", "Height range:", None)) - self.label_50.setText(_translate("MainWindow", "Save:", None)) - - self.volLabScopeType.setText(_translate("MainWindow", "Scope type:", None)) - self.volComScopeType.setItemText(0, _translate("MainWindow", "I&Q", None)) - self.volComScopeType.setItemText(1, _translate("MainWindow", "Power", None)) - - self.tabWidgetVoltage.setTabText(self.tabWidgetVoltage.indexOf(self.tabgraphVoltage), _translate("MainWindow", "Graphics", None)) - - self.label_36.setText(_translate("MainWindow", "Type:", None)) - self.label_37.setText(_translate("MainWindow", "Path:", None)) - self.volOutputToolPath.setText(_translate("MainWindow", "...", None)) - self.volOutputComData.setItemText(0, _translate("MainWindow", ".rawdata", None)) - self.label_7.setText(_translate("MainWindow", "Blocks per File: ", None)) - self.label_35.setText(_translate("MainWindow", "Profiles per Block: ", None)) - self.tabWidgetVoltage.setTabText(self.tabWidgetVoltage.indexOf(self.taboutputVoltage), _translate("MainWindow", "Output", None)) - - self.tabWidgetProject.setTabText(self.tabWidgetProject.indexOf(self.tabVoltage), _translate("MainWindow", "Voltage", None)) - - self.__setToolTip() - - def __setToolTip(self): - - self.volOpChannel.setToolTip('Example: 1,2,3,4,5') - self.volOpHeights.setToolTip('Example: 90,180') - self.volOpFilter.setToolTip('Example: 2') - self.volOpProfile.setToolTip('Example:0,127') - self.volOpCohInt.setToolTip('Example: 128') - self.volOpFlip.setToolTip('ChannelList where flip will be applied. Example: 0,2,3') - self.volOpOk.setToolTip('If you have finished, please Ok ') - # tool tip gui volGraph - self.volGraphIntensityRange.setToolTip('Height range. Example: 50,100') - self.volGraphHeightrange.setToolTip('Amplitude. Example: 0,10000') - - \ No newline at end of file diff --git a/schainpy/model/data/jroamisr.py b/schainpy/model/data/jroamisr.py index 954502b..8267504 100644 --- a/schainpy/model/data/jroamisr.py +++ b/schainpy/model/data/jroamisr.py @@ -71,7 +71,8 @@ class AMISR: for key in list(inputObj.__dict__.keys()): self.__dict__[key] = inputObj.__dict__[key] - def getNHeights(self): + @property + def nHeights(self): return len(self.heightList) @@ -80,11 +81,7 @@ class AMISR: return self.flagNoData - def getTimeInterval(self): + @property + def timeInterval(self): - timeInterval = self.ippSeconds * self.nCohInt - - return timeInterval - - timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property") - nHeights = property(getNHeights, "I'm the 'nHeights' property.") \ No newline at end of file + return self.ippSeconds * self.nCohInt diff --git a/schainpy/model/data/jrodata.py b/schainpy/model/data/jrodata.py index 2ee7936..7d7bec8 100644 --- a/schainpy/model/data/jrodata.py +++ b/schainpy/model/data/jrodata.py @@ -1,16 +1,24 @@ -''' +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""Definition of diferent Data objects for different types of data -$Author: murco $ -$Id: JROData.py 173 2012-11-20 15:06:21Z murco $ -''' +Here you will find the diferent data objects for the different types +of data, this data objects must be used as dataIn or dataOut objects in +processing units and operations. Currently the supported data objects are: +Voltage, Spectra, SpectraHeis, Fits, Correlation and Parameters +""" import copy import numpy import datetime import json +import schainpy.admin from schainpy.utils import log from .jroheaderIO import SystemHeader, RadarControllerHeader +from schainpy.model.data import _noise def getNumpyDtype(dataTypeCode): @@ -68,6 +76,7 @@ def hildebrand_sekhon(data, navg): """ sortdata = numpy.sort(data, axis=None) + ''' lenOfData = len(sortdata) nums_min = lenOfData*0.2 @@ -97,8 +106,8 @@ def hildebrand_sekhon(data, navg): j += 1 lnoise = sump / j - - return lnoise + ''' + return _noise.hildebrand_sekhon(sortdata, navg) class Beam: @@ -114,7 +123,7 @@ class GenericData(object): flagNoData = True def copy(self, inputObj=None): - + if inputObj == None: return copy.deepcopy(self) @@ -142,20 +151,17 @@ class GenericData(object): return self.flagNoData + def isReady(self): -class JROData(GenericData): + return not self.flagNoData - # m_BasicHeader = BasicHeader() - # m_ProcessingHeader = ProcessingHeader() + +class JROData(GenericData): systemHeaderObj = SystemHeader() radarControllerHeaderObj = RadarControllerHeader() -# data = None type = None datatype = None # dtype but in string -# dtype = None -# nChannels = None -# nHeights = None nProfiles = None heightList = None channelList = None @@ -166,18 +172,11 @@ class JROData(GenericData): dstFlag = None errorCount = None blocksize = None -# nCode = None -# nBaud = None -# code = None flagDecodeData = False # asumo q la data no esta decodificada flagDeflipData = False # asumo q la data no esta sin flip flagShiftFFT = False -# ippSeconds = None -# timeInterval = None nCohInt = None -# noise = None windowOfFilter = 1 - # Speed of ligth C = 3e8 frequency = 49.92e6 realtime = False @@ -191,50 +190,45 @@ class JROData(GenericData): error = None data = None nmodes = None + metadata_list = ['heightList', 'timeZone', 'type'] def __str__(self): - return '{} - {}'.format(self.type, self.getDatatime()) + return '{} - {}'.format(self.type, self.datatime()) def getNoise(self): raise NotImplementedError - def getNChannels(self): + @property + def nChannels(self): return len(self.channelList) - def getChannelIndexList(self): + @property + def channelIndexList(self): return list(range(self.nChannels)) - def getNHeights(self): + @property + def nHeights(self): return len(self.heightList) - def getHeiRange(self, extrapoints=0): - - heis = self.heightList -# deltah = self.heightList[1] - self.heightList[0] -# -# heis.append(self.heightList[-1]) - - return heis - def getDeltaH(self): - delta = self.heightList[1] - self.heightList[0] - - return delta + return self.heightList[1] - self.heightList[0] - def getltctime(self): + @property + def ltctime(self): if self.useLocalTime: return self.utctime - self.timeZone * 60 return self.utctime - def getDatatime(self): + @property + def datatime(self): datatimeValue = datetime.datetime.utcfromtimestamp(self.ltctime) return datatimeValue @@ -274,85 +268,80 @@ class JROData(GenericData): return vmax - def get_ippSeconds(self): + @property + def ippSeconds(self): ''' ''' return self.radarControllerHeaderObj.ippSeconds - def set_ippSeconds(self, ippSeconds): + @ippSeconds.setter + def ippSeconds(self, ippSeconds): ''' ''' - self.radarControllerHeaderObj.ippSeconds = ippSeconds - return - - def get_dtype(self): + @property + def code(self): ''' ''' - return getNumpyDtype(self.datatype) + return self.radarControllerHeaderObj.code - def set_dtype(self, numpyDtype): + @code.setter + def code(self, code): ''' ''' + self.radarControllerHeaderObj.code = code - self.datatype = getDataTypeCode(numpyDtype) - - def get_code(self): + @property + def nCode(self): ''' ''' - return self.radarControllerHeaderObj.code + return self.radarControllerHeaderObj.nCode - def set_code(self, code): + @nCode.setter + def nCode(self, ncode): ''' ''' - self.radarControllerHeaderObj.code = code - - return + self.radarControllerHeaderObj.nCode = ncode - def get_ncode(self): + @property + def nBaud(self): ''' ''' - return self.radarControllerHeaderObj.nCode + return self.radarControllerHeaderObj.nBaud - def set_ncode(self, nCode): + @nBaud.setter + def nBaud(self, nbaud): ''' ''' - self.radarControllerHeaderObj.nCode = nCode + self.radarControllerHeaderObj.nBaud = nbaud - return - - def get_nbaud(self): + @property + def ipp(self): ''' ''' - return self.radarControllerHeaderObj.nBaud + return self.radarControllerHeaderObj.ipp - def set_nbaud(self, nBaud): + @ipp.setter + def ipp(self, ipp): ''' ''' - self.radarControllerHeaderObj.nBaud = nBaud + self.radarControllerHeaderObj.ipp = ipp - return + @property + def metadata(self): + ''' + ''' - nChannels = property(getNChannels, "I'm the 'nChannel' property.") - channelIndexList = property( - getChannelIndexList, "I'm the 'channelIndexList' property.") - nHeights = property(getNHeights, "I'm the 'nHeights' property.") - #noise = property(getNoise, "I'm the 'nHeights' property.") - datatime = property(getDatatime, "I'm the 'datatime' property") - ltctime = property(getltctime, "I'm the 'ltctime' property") - ippSeconds = property(get_ippSeconds, set_ippSeconds) - dtype = property(get_dtype, set_dtype) -# timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property") - code = property(get_code, set_code) - nCode = property(get_ncode, set_ncode) - nBaud = property(get_nbaud, set_nbaud) + return {attr: getattr(self, attr) for attr in self.metadata_list} class Voltage(JROData): - # data es un numpy array de 2 dmensiones (canales, alturas) - data = None + dataPP_POW = None + dataPP_DOP = None + dataPP_WIDTH = None + dataPP_SNR = None def __init__(self): ''' @@ -364,26 +353,25 @@ class Voltage(JROData): self.systemHeaderObj = SystemHeader() self.type = "Voltage" self.data = None -# self.dtype = None -# self.nChannels = 0 -# self.nHeights = 0 self.nProfiles = None self.heightList = None self.channelList = None -# self.channelIndexList = None self.flagNoData = True self.flagDiscontinuousBlock = False self.utctime = None - self.timeZone = None + self.timeZone = 0 self.dstFlag = None self.errorCount = None self.nCohInt = None self.blocksize = None + self.flagCohInt = False self.flagDecodeData = False # asumo q la data no esta decodificada self.flagDeflipData = False # asumo q la data no esta sin flip self.flagShiftFFT = False self.flagDataAsBlock = False # Asumo que la data es leida perfil a perfil self.profileIndex = 0 + self.metadata_list = ['type', 'heightList', 'timeZone', 'nProfiles', 'channelList', 'nCohInt', + 'code', 'nCode', 'nBaud', 'ippSeconds', 'ipp'] def getNoisebyHildebrand(self, channel=None): """ @@ -432,53 +420,32 @@ class Voltage(JROData): return powerdB - def getTimeInterval(self): - - timeInterval = self.ippSeconds * self.nCohInt + @property + def timeInterval(self): - return timeInterval + return self.ippSeconds * self.nCohInt noise = property(getNoise, "I'm the 'nHeights' property.") - timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property") class Spectra(JROData): - # data spc es un numpy array de 2 dmensiones (canales, perfiles, alturas) - data_spc = None - # data cspc es un numpy array de 2 dmensiones (canales, pares, alturas) - data_cspc = None - # data dc es un numpy array de 2 dmensiones (canales, alturas) - data_dc = None - # data power - data_pwr = None - nFFTPoints = None -# nPairs = None - pairsList = None - nIncohInt = None - wavelength = None # Necesario para cacular el rango de velocidad desde la frecuencia - nCohInt = None # se requiere para determinar el valor de timeInterval - ippFactor = None - profileIndex = 0 - plotting = "spectra" - def __init__(self): ''' Constructor ''' + self.data_dc = None + self.data_spc = None + self.data_cspc = None self.useLocalTime = True self.radarControllerHeaderObj = RadarControllerHeader() self.systemHeaderObj = SystemHeader() self.type = "Spectra" -# self.data = None -# self.dtype = None -# self.nChannels = 0 -# self.nHeights = 0 + self.timeZone = 0 self.nProfiles = None self.heightList = None self.channelList = None -# self.channelIndexList = None self.pairsList = None self.flagNoData = True self.flagDiscontinuousBlock = False @@ -492,9 +459,10 @@ class Spectra(JROData): self.flagDeflipData = False # asumo q la data no esta sin flip self.flagShiftFFT = False self.ippFactor = 1 - #self.noise = None self.beacon_heiIndexList = [] self.noise_estimation = None + self.metadata_list = ['type', 'heightList', 'timeZone', 'pairsList', 'channelList', 'nCohInt', + 'code', 'nCode', 'nBaud', 'ippSeconds', 'ipp','nIncohInt', 'nFFTPoints', 'nProfiles'] def getNoisebyHildebrand(self, xmin_index=None, xmax_index=None, ymin_index=None, ymax_index=None): """ @@ -526,7 +494,7 @@ class Spectra(JROData): def getFreqRangeTimeResponse(self, extrapoints=0): deltafreq = self.getFmaxTimeResponse() / (self.nFFTPoints * self.ippFactor) - freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) -self.nFFTPoints / 2.) - deltafreq / 2 + freqrange = deltafreq * (numpy.arange(self.nFFTPoints + extrapoints) - self.nFFTPoints / 2.) - deltafreq / 2 return freqrange @@ -554,15 +522,18 @@ class Spectra(JROData): else: return velrange - def getNPairs(self): + @property + def nPairs(self): return len(self.pairsList) - def getPairsIndexList(self): + @property + def pairsIndexList(self): return list(range(self.nPairs)) - def getNormFactor(self): + @property + def normFactor(self): pwcode = 1 @@ -573,21 +544,24 @@ class Spectra(JROData): return normFactor - def getFlagCspc(self): + @property + def flag_cspc(self): if self.data_cspc is None: return True return False - def getFlagDc(self): + @property + def flag_dc(self): if self.data_dc is None: return True return False - def getTimeInterval(self): + @property + def timeInterval(self): timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt * self.nProfiles * self.ippFactor if self.nmodes: @@ -638,68 +612,29 @@ class Spectra(JROData): return - nPairs = property(getNPairs, setValue, "I'm the 'nPairs' property.") - pairsIndexList = property( - getPairsIndexList, setValue, "I'm the 'pairsIndexList' property.") - normFactor = property(getNormFactor, setValue, - "I'm the 'getNormFactor' property.") - flag_cspc = property(getFlagCspc, setValue) - flag_dc = property(getFlagDc, setValue) noise = property(getNoise, setValue, "I'm the 'nHeights' property.") - timeInterval = property(getTimeInterval, setValue, - "I'm the 'timeInterval' property") class SpectraHeis(Spectra): - data_spc = None - data_cspc = None - data_dc = None - nFFTPoints = None -# nPairs = None - pairsList = None - nCohInt = None - nIncohInt = None - def __init__(self): self.radarControllerHeaderObj = RadarControllerHeader() - self.systemHeaderObj = SystemHeader() - self.type = "SpectraHeis" - -# self.dtype = None - -# self.nChannels = 0 - -# self.nHeights = 0 - self.nProfiles = None - self.heightList = None - self.channelList = None - -# self.channelIndexList = None - self.flagNoData = True - self.flagDiscontinuousBlock = False - -# self.nPairs = 0 - self.utctime = None - self.blocksize = None - self.profileIndex = 0 - self.nCohInt = 1 - self.nIncohInt = 1 - def getNormFactor(self): + @property + def normFactor(self): pwcode = 1 if self.flagDecodeData: pwcode = numpy.sum(self.code[0]**2) @@ -708,87 +643,27 @@ class SpectraHeis(Spectra): return normFactor - def getTimeInterval(self): - - timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt - - return timeInterval + @property + def timeInterval(self): - normFactor = property(getNormFactor, "I'm the 'getNormFactor' property.") - timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property") + return self.ippSeconds * self.nCohInt * self.nIncohInt class Fits(JROData): - heightList = None - channelList = None - flagNoData = True - flagDiscontinuousBlock = False - useLocalTime = False - utctime = None - timeZone = None -# ippSeconds = None -# timeInterval = None - nCohInt = None - nIncohInt = None - noise = None - windowOfFilter = 1 - # Speed of ligth - C = 3e8 - frequency = 49.92e6 - realtime = False - def __init__(self): self.type = "Fits" - self.nProfiles = None - self.heightList = None - self.channelList = None - -# self.channelIndexList = None - self.flagNoData = True - self.utctime = None - self.nCohInt = 1 - self.nIncohInt = 1 - self.useLocalTime = True - self.profileIndex = 0 - -# self.utctime = None -# self.timeZone = None -# self.ltctime = None -# self.timeInterval = None -# self.header = None -# self.data_header = None -# self.data = None -# self.datatime = None -# self.flagNoData = False -# self.expName = '' -# self.nChannels = None -# self.nSamples = None -# self.dataBlocksPerFile = None -# self.comments = '' -# - - def getltctime(self): - - if self.useLocalTime: - return self.utctime - self.timeZone * 60 - - return self.utctime - - def getDatatime(self): - - datatime = datetime.datetime.utcfromtimestamp(self.ltctime) - return datatime + self.timeZone = 0 def getTimeRange(self): @@ -801,27 +676,12 @@ class Fits(JROData): return datatime - def getHeiRange(self): - - heis = self.heightList - - return heis - - def getNHeights(self): - - return len(self.heightList) - - def getNChannels(self): - - return len(self.channelList) - def getChannelIndexList(self): return list(range(self.nChannels)) def getNoise(self, type=1): - #noise = numpy.zeros(self.nChannels) if type == 1: noise = self.getNoisebyHildebrand() @@ -834,87 +694,46 @@ class Fits(JROData): return noise - def getTimeInterval(self): + @property + def timeInterval(self): timeInterval = self.ippSeconds * self.nCohInt * self.nIncohInt return timeInterval - def get_ippSeconds(self): + @property + def ippSeconds(self): ''' ''' return self.ipp_sec - - datatime = property(getDatatime, "I'm the 'datatime' property") - nHeights = property(getNHeights, "I'm the 'nHeights' property.") - nChannels = property(getNChannels, "I'm the 'nChannel' property.") - channelIndexList = property( - getChannelIndexList, "I'm the 'channelIndexList' property.") noise = property(getNoise, "I'm the 'nHeights' property.") - ltctime = property(getltctime, "I'm the 'ltctime' property") - timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property") - ippSeconds = property(get_ippSeconds, '') class Correlation(JROData): - noise = None - SNR = None - #-------------------------------------------------- - mode = None - split = False - data_cf = None - lags = None - lagRange = None - pairsList = None - normFactor = None - #-------------------------------------------------- -# calculateVelocity = None - nLags = None - nPairs = None - nAvg = None - def __init__(self): ''' Constructor ''' self.radarControllerHeaderObj = RadarControllerHeader() - self.systemHeaderObj = SystemHeader() - self.type = "Correlation" - self.data = None - self.dtype = None - self.nProfiles = None - self.heightList = None - self.channelList = None - self.flagNoData = True - self.flagDiscontinuousBlock = False - self.utctime = None - - self.timeZone = None - + self.timeZone = 0 self.dstFlag = None - self.errorCount = None - self.blocksize = None - self.flagDecodeData = False # asumo q la data no esta decodificada - self.flagDeflipData = False # asumo q la data no esta sin flip - self.pairsList = None - self.nPoints = None def getPairsList(self): @@ -969,11 +788,10 @@ class Correlation(JROData): return noise - def getTimeInterval(self): - - timeInterval = self.ippSeconds * self.nCohInt * self.nProfiles + @property + def timeInterval(self): - return timeInterval + return self.ippSeconds * self.nCohInt * self.nProfiles def splitFunctions(self): @@ -999,7 +817,8 @@ class Correlation(JROData): return acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf - def getNormFactor(self): + @property + def normFactor(self): acf_ind, ccf_ind, acf_pairs, ccf_pairs, data_acf, data_ccf = self.splitFunctions() acf_pairs = numpy.array(acf_pairs) normFactor = numpy.zeros((self.nPairs, self.nHeights)) @@ -1016,25 +835,14 @@ class Correlation(JROData): return normFactor - timeInterval = property(getTimeInterval, "I'm the 'timeInterval' property") - normFactor = property(getNormFactor, "I'm the 'normFactor property'") - class Parameters(Spectra): - experimentInfo = None # Information about the experiment - # Information from previous data - inputUnit = None # Type of data to be processed - operation = None # Type of operation to parametrize - # normFactor = None #Normalization Factor groupList = None # List of Pairs, Groups, etc - # Parameters data_param = None # Parameters obtained data_pre = None # Data Pre Parametrization data_SNR = None # Signal to Noise Ratio -# heightRange = None #Heights abscissaList = None # Abscissa, can be velocities, lags or time -# noise = None #Noise Potency utctimeInit = None # Initial UTC time paramInterval = None # Time interval to calculate Parameters in seconds useLocalTime = True @@ -1054,10 +862,9 @@ class Parameters(Spectra): Constructor ''' self.radarControllerHeaderObj = RadarControllerHeader() - self.systemHeaderObj = SystemHeader() - self.type = "Parameters" + self.timeZone = 0 def getTimeRange1(self, interval): @@ -1074,7 +881,8 @@ class Parameters(Spectra): return datatime - def getTimeInterval(self): + @property + def timeInterval(self): if hasattr(self, 'timeInterval1'): return self.timeInterval1 @@ -1091,7 +899,6 @@ class Parameters(Spectra): return self.spc_noise - timeInterval = property(getTimeInterval) noise = property(getNoise, setValue, "I'm the 'Noise' property.") @@ -1100,176 +907,68 @@ class PlotterData(object): Object to hold data to be plotted ''' - MAXNUMX = 100 - MAXNUMY = 100 + MAXNUMX = 200 + MAXNUMY = 200 - def __init__(self, code, throttle_value, exp_code, buffering=True, snr=False): + def __init__(self, code, exp_code, localtime=True): self.key = code - self.throttle = throttle_value self.exp_code = exp_code - self.buffering = buffering self.ready = False - self.localtime = False + self.flagNoData = False + self.localtime = localtime self.data = {} self.meta = {} - self.__times = [] self.__heights = [] - if 'snr' in code: - self.plottypes = ['snr'] - elif code == 'spc': - self.plottypes = ['spc', 'noise', 'rti'] - elif code == 'rti': - self.plottypes = ['noise', 'rti'] - else: - self.plottypes = [code] - - if 'snr' not in self.plottypes and snr: - self.plottypes.append('snr') - - for plot in self.plottypes: - self.data[plot] = {} - def __str__(self): dum = ['{}{}'.format(key, self.shape(key)) for key in self.data] - return 'Data[{}][{}]'.format(';'.join(dum), len(self.__times)) + return 'Data[{}][{}]'.format(';'.join(dum), len(self.times)) def __len__(self): - return len(self.__times) + return len(self.data) def __getitem__(self, key): - - if key not in self.data: - raise KeyError(log.error('Missing key: {}'.format(key))) - if 'spc' in key or not self.buffering: - ret = self.data[key] - elif 'scope' in key: - ret = numpy.array(self.data[key][float(self.tm)]) - else: - ret = numpy.array([self.data[key][x] for x in self.times]) + if isinstance(key, int): + return self.data[self.times[key]] + elif isinstance(key, str): + ret = numpy.array([self.data[x][key] for x in self.times]) if ret.ndim > 1: ret = numpy.swapaxes(ret, 0, 1) - return ret + return ret def __contains__(self, key): - return key in self.data + return key in self.data[self.min_time] def setup(self): ''' Configure object ''' - self.type = '' self.ready = False + del self.data self.data = {} - self.__times = [] self.__heights = [] self.__all_heights = set() - for plot in self.plottypes: - if 'snr' in plot: - plot = 'snr' - elif 'spc_moments' == plot: - plot = 'moments' - self.data[plot] = {} - - if 'spc' in self.data or 'rti' in self.data or 'cspc' in self.data or 'moments' in self.data: - self.data['noise'] = {} - self.data['rti'] = {} - if 'noise' not in self.plottypes: - self.plottypes.append('noise') - if 'rti' not in self.plottypes: - self.plottypes.append('rti') def shape(self, key): ''' Get the shape of the one-element data for the given key ''' - if len(self.data[key]): - if 'spc' in key or not self.buffering: - return self.data[key].shape - return self.data[key][self.__times[0]].shape + if len(self.data[self.min_time][key]): + return self.data[self.min_time][key].shape return (0,) - def update(self, dataOut, tm): + def update(self, data, tm, meta={}): ''' Update data object with new dataOut ''' - if tm in self.__times: - return - self.profileIndex = dataOut.profileIndex - self.tm = tm - self.type = dataOut.type - self.parameters = getattr(dataOut, 'parameters', []) - - if hasattr(dataOut, 'meta'): - self.meta.update(dataOut.meta) - - self.pairs = dataOut.pairsList - self.interval = dataOut.getTimeInterval() - self.localtime = dataOut.useLocalTime - if 'spc' in self.plottypes or 'cspc' in self.plottypes or 'spc_moments' in self.plottypes: - self.xrange = (dataOut.getFreqRange(1)/1000., - dataOut.getAcfRange(1), dataOut.getVelRange(1)) - self.factor = dataOut.normFactor - self.__heights.append(dataOut.heightList) - self.__all_heights.update(dataOut.heightList) - self.__times.append(tm) - - for plot in self.plottypes: - if plot in ('spc', 'spc_moments'): - z = dataOut.data_spc/dataOut.normFactor - buffer = 10*numpy.log10(z) - if plot == 'cspc': - z = dataOut.data_spc/dataOut.normFactor - buffer = (dataOut.data_spc, dataOut.data_cspc) - if plot == 'noise': - buffer = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) - if plot == 'rti': - buffer = dataOut.getPower() - if plot == 'snr_db': - buffer = dataOut.data_SNR - if plot == 'snr': - buffer = 10*numpy.log10(dataOut.data_SNR) - if plot == 'dop': - buffer = dataOut.data_DOP - if plot == 'pow': - buffer = 10*numpy.log10(dataOut.data_POW) - if plot == 'width': - buffer = dataOut.data_WIDTH - if plot == 'coh': - buffer = dataOut.getCoherence() - if plot == 'phase': - buffer = dataOut.getCoherence(phase=True) - if plot == 'output': - buffer = dataOut.data_output - if plot == 'param': - buffer = dataOut.data_param - if plot == 'scope': - buffer = dataOut.data - self.flagDataAsBlock = dataOut.flagDataAsBlock - self.nProfiles = dataOut.nProfiles - - if plot == 'spc': - self.data['spc'] = buffer - elif plot == 'cspc': - self.data['spc'] = buffer[0] - self.data['cspc'] = buffer[1] - elif plot == 'spc_moments': - self.data['spc'] = buffer - self.data['moments'][tm] = dataOut.moments - else: - if self.buffering: - self.data[plot][tm] = buffer - else: - self.data[plot] = buffer + self.data[tm] = data - if dataOut.channelList is None: - self.channels = range(buffer.shape[0]) - else: - self.channels = dataOut.channelList + for key, value in meta.items(): + setattr(self, key, value) def normalize_heights(self): ''' @@ -1281,7 +980,7 @@ class PlotterData(object): for key in self.data: shape = self.shape(key)[:-1] + H.shape for tm, obj in list(self.data[key].items()): - h = self.__heights[self.__times.index(tm)] + h = self.__heights[self.times.tolist().index(tm)] if H.size == h.size: continue index = numpy.where(numpy.in1d(H, h))[0] @@ -1292,25 +991,28 @@ class PlotterData(object): dummy[index] = obj self.data[key][tm] = dummy - self.__heights = [H for tm in self.__times] + self.__heights = [H for tm in self.times] - def jsonify(self, plot_name, plot_type, decimate=False): + def jsonify(self, tm, plot_name, plot_type, decimate=False): ''' Convert data to json ''' - tm = self.times[-1] - dy = int(self.heights.size/self.MAXNUMY) + 1 - if self.key in ('spc', 'cspc') or not self.buffering: - dx = int(self.data[self.key].shape[1]/self.MAXNUMX) + 1 + meta = {} + meta['xrange'] = [] + dy = int(len(self.yrange)/self.MAXNUMY) + 1 + tmp = self.data[tm][self.key] + shape = tmp.shape + if len(shape) == 2: + data = self.roundFloats(self.data[tm][self.key][::, ::dy].tolist()) + elif len(shape) == 3: + dx = int(self.data[tm][self.key].shape[1]/self.MAXNUMX) + 1 data = self.roundFloats( - self.data[self.key][::, ::dx, ::dy].tolist()) + self.data[tm][self.key][::, ::dx, ::dy].tolist()) + meta['xrange'] = self.roundFloats(self.xrange[2][::dx].tolist()) else: - data = self.roundFloats(self.data[self.key][tm].tolist()) - if self.key is 'noise': - data = [[x] for x in data] + data = self.roundFloats(self.data[tm][self.key].tolist()) - meta = {} ret = { 'plot': plot_name, 'code': self.exp_code, @@ -1320,12 +1022,7 @@ class PlotterData(object): meta['type'] = plot_type meta['interval'] = float(self.interval) meta['localtime'] = self.localtime - meta['yrange'] = self.roundFloats(self.heights[::dy].tolist()) - if 'spc' in self.data or 'cspc' in self.data: - meta['xrange'] = self.roundFloats(self.xrange[2][::dx].tolist()) - else: - meta['xrange'] = [] - + meta['yrange'] = self.roundFloats(self.yrange[::dy].tolist()) meta.update(self.meta) ret['metadata'] = meta return json.dumps(ret) @@ -1336,9 +1033,9 @@ class PlotterData(object): Return the list of times of the current data ''' - ret = numpy.array(self.__times) + ret = [t for t in self.data] ret.sort() - return ret + return numpy.array(ret) @property def min_time(self): @@ -1356,13 +1053,13 @@ class PlotterData(object): return self.times[-1] - @property - def heights(self): - ''' - Return the list of heights of the current data - ''' + # @property + # def heights(self): + # ''' + # Return the list of heights of the current data + # ''' - return numpy.array(self.__heights[-1]) + # return numpy.array(self.__heights[-1]) @staticmethod def roundFloats(obj): diff --git a/schainpy/model/data/jroheaderIO.py b/schainpy/model/data/jroheaderIO.py index 8971c52..7b4a907 100644 --- a/schainpy/model/data/jroheaderIO.py +++ b/schainpy/model/data/jroheaderIO.py @@ -302,7 +302,7 @@ class RadarControllerHeader(Header): nWindows=None, nHeights=None, firstHeight=None, deltaHeight=None, numTaus=0, line6Function=0, line5Function=0, fClock=None, prePulseBefore=0, prePulseAfter=0, - codeType=0, nCode=0, nBaud=0, code=None, + codeType=0, nCode=0, nBaud=0, code=[], flip1=0, flip2=0): # self.size = 116 diff --git a/schainpy/model/graphics/__init__.py b/schainpy/model/graphics/__init__.py index 439b190..a0d1295 100644 --- a/schainpy/model/graphics/__init__.py +++ b/schainpy/model/graphics/__init__.py @@ -3,4 +3,3 @@ from .jroplot_spectra import * from .jroplot_heispectra import * from .jroplot_correlation import * from .jroplot_parameters import * -from .jroplot_data import * diff --git a/schainpy/model/graphics/figure.py b/schainpy/model/graphics/figure.py deleted file mode 100644 index 041d89c..0000000 --- a/schainpy/model/graphics/figure.py +++ /dev/null @@ -1,658 +0,0 @@ -import os -import numpy -import time, datetime -from schainpy.model.graphics import mpldriver - -from schainpy.model.proc.jroproc_base import MPDecorator, Operation - - -def isTimeInHourRange(datatime, xmin, xmax): - - if xmin == None or xmax == None: - return 1 - hour = datatime.hour + datatime.minute/60.0 - - if xmin < (xmax % 24): - - if hour >= xmin and hour <= xmax: - return 1 - else: - return 0 - - else: - - if hour >= xmin or hour <= (xmax % 24): - return 1 - else: - return 0 - - return 0 - -def isRealtime(utcdatatime): - - utcnow = time.mktime(time.localtime()) - delta = abs(utcnow - utcdatatime) # abs - if delta >= 30.: - return False - return True - -class Figure(Operation): - - __driver = mpldriver - fig = None - - id = None - wintitle = None - width = None - height = None - nplots = None - timerange = None - - axesObjList = [] - - WIDTH = 300 - HEIGHT = 200 - PREFIX = 'fig' - - xmin = None - xmax = None - - counter_imagwr = 0 - - figfile = None - - created = False - parameters = {} - def __init__(self):#, **kwargs): - - Operation.__init__(self)#, **kwargs) - - def __del__(self): - - self.__driver.closeFigure() - - def getFilename(self, name, ext='.png'): - - path = '%s%03d' %(self.PREFIX, self.id) - filename = '%s_%s%s' %(self.PREFIX, name, ext) - return os.path.join(path, filename) - - def getAxesObjList(self): - - return self.axesObjList - - def getSubplots(self): - - raise NotImplementedError - - def getScreenDim(self, widthplot, heightplot): - - nrow, ncol = self.getSubplots() - - widthscreen = widthplot*ncol - heightscreen = heightplot*nrow - - return widthscreen, heightscreen - - def getTimeLim(self, x, xmin=None, xmax=None, timerange=None): - -# if self.xmin != None and self.xmax != None: -# if timerange == None: -# timerange = self.xmax - self.xmin -# xmin = self.xmin + timerange -# xmax = self.xmax + timerange -# -# return xmin, xmax - - if timerange == None and (xmin==None or xmax==None): - timerange = 14400 #seconds - - if timerange != None: - txmin = x[0] #- x[0] % min(timerange/10, 10*60) - else: - txmin = x[0] #- x[0] % 10*60 - - thisdatetime = datetime.datetime.utcfromtimestamp(txmin) - thisdate = datetime.datetime.combine(thisdatetime.date(), datetime.time(0,0,0)) - - if timerange != None: - xmin = (thisdatetime - thisdate).seconds/(60*60.) - xmax = xmin + timerange/(60*60.) - - d1970 = datetime.datetime(1970,1,1) - - mindt = thisdate + datetime.timedelta(hours=xmin) #- datetime.timedelta(seconds=time.timezone) - xmin_sec = (mindt - d1970).total_seconds() #time.mktime(mindt.timetuple()) - time.timezone - - maxdt = thisdate + datetime.timedelta(hours=xmax) #- datetime.timedelta(seconds=time.timezone) - xmax_sec = (maxdt - d1970).total_seconds() #time.mktime(maxdt.timetuple()) - time.timezone - - return xmin_sec, xmax_sec - - def init(self, id, nplots, wintitle): - - raise NotImplementedError("This method has been replaced by createFigure") - - def createFigure(self, id, wintitle, widthplot=None, heightplot=None, show=True): - - """ - Crea la figura de acuerdo al driver y parametros seleccionados seleccionados. - Las dimensiones de la pantalla es calculada a partir de los atributos self.WIDTH - y self.HEIGHT y el numero de subplots (nrow, ncol) - - Input: - id : Los parametros necesarios son - wintitle : - - """ - - if widthplot == None: - widthplot = self.WIDTH - - if heightplot == None: - heightplot = self.HEIGHT - - self.id = id - - self.wintitle = wintitle - - self.widthscreen, self.heightscreen = self.getScreenDim(widthplot, heightplot) - -# if self.created: -# self.__driver.closeFigure(self.fig) - - if not self.created: - self.fig = self.__driver.createFigure(id=self.id, - wintitle=self.wintitle, - width=self.widthscreen, - height=self.heightscreen, - show=show) - else: - self.__driver.clearFigure(self.fig) - - self.axesObjList = [] - self.counter_imagwr = 0 - - self.created = True - - def setDriver(self, driver=mpldriver): - - self.__driver = driver - - def setTitle(self, title): - - self.__driver.setTitle(self.fig, title) - - def setWinTitle(self, title): - - self.__driver.setWinTitle(self.fig, title=title) - - def setTextFromAxes(self, text): - - raise NotImplementedError("This method has been replaced with Axes.setText") - - def makeAxes(self, nrow, ncol, xpos, ypos, colspan, rowspan): - - raise NotImplementedError("This method has been replaced with Axes.addAxes") - - def addAxes(self, *args): - """ - - Input: - *args : Los parametros necesarios son - nrow, ncol, xpos, ypos, colspan, rowspan - """ - - axesObj = Axes(self.fig, *args) - self.axesObjList.append(axesObj) - - def saveFigure(self, figpath, figfile, *args): - - filename = os.path.join(figpath, figfile) - - fullpath = os.path.split(filename)[0] - - if not os.path.exists(fullpath): - subpath = os.path.split(fullpath)[0] - - if not os.path.exists(subpath): - os.mkdir(subpath) - - os.mkdir(fullpath) - - self.__driver.saveFigure(self.fig, filename, *args) - - def save(self, figpath, figfile=None, save=True, ftp=False, wr_period=1, thisDatetime=None, update_figfile=True): - - self.counter_imagwr += 1 - if self.counter_imagwr < wr_period: - return - - self.counter_imagwr = 0 - - if save: - - if not figfile: - - if not thisDatetime: - raise ValueError("Saving figure: figfile or thisDatetime should be defined") - return - - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") - figfile = self.getFilename(name = str_datetime) - - if self.figfile == None: - self.figfile = figfile - - if update_figfile: - self.figfile = figfile - - # store png plot to local folder - self.saveFigure(figpath, self.figfile) - - - if not ftp: - return - - if not thisDatetime: - return - - # store png plot to FTP server according to RT-Web format - ftp_filename = self.getNameToFtp(thisDatetime, self.FTP_WEI, self.EXP_CODE, self.SUB_EXP_CODE, self.PLOT_CODE, self.PLOT_POS) -# ftp_filename = os.path.join(figpath, name) - self.saveFigure(figpath, ftp_filename) - - def getNameToFtp(self, thisDatetime, FTP_WEI, EXP_CODE, SUB_EXP_CODE, PLOT_CODE, PLOT_POS): - YEAR_STR = '%4.4d'%thisDatetime.timetuple().tm_year - DOY_STR = '%3.3d'%thisDatetime.timetuple().tm_yday - FTP_WEI = '%2.2d'%FTP_WEI - EXP_CODE = '%3.3d'%EXP_CODE - SUB_EXP_CODE = '%2.2d'%SUB_EXP_CODE - PLOT_CODE = '%2.2d'%PLOT_CODE - PLOT_POS = '%2.2d'%PLOT_POS - name = YEAR_STR + DOY_STR + FTP_WEI + EXP_CODE + SUB_EXP_CODE + PLOT_CODE + PLOT_POS - return name - - def draw(self): - - self.__driver.draw(self.fig) - - def run(self): - - raise NotImplementedError - - def close(self, show=False): - - self.__driver.closeFigure(show=show, fig=self.fig) - - axesList = property(getAxesObjList) - - -class Axes: - - __driver = mpldriver - fig = None - ax = None - plot = None - __missing = 1E30 - __firsttime = None - - __showprofile = False - - xmin = None - xmax = None - ymin = None - ymax = None - zmin = None - zmax = None - - x_buffer = None - z_buffer = None - - decimationx = None - decimationy = None - - __MAXNUMX = 200 - __MAXNUMY = 400 - - __MAXNUMTIME = 500 - - def __init__(self, *args): - - """ - - Input: - *args : Los parametros necesarios son - fig, nrow, ncol, xpos, ypos, colspan, rowspan - """ - - ax = self.__driver.createAxes(*args) - self.fig = args[0] - self.ax = ax - self.plot = None - - self.__firsttime = True - self.idlineList = [] - - self.x_buffer = numpy.array([]) - self.z_buffer = numpy.array([]) - - def setText(self, text): - - self.__driver.setAxesText(self.ax, text) - - def setXAxisAsTime(self): - pass - - def pline(self, x, y, - xmin=None, xmax=None, - ymin=None, ymax=None, - xlabel='', ylabel='', - title='', - **kwargs): - - """ - - Input: - x : - y : - xmin : - xmax : - ymin : - ymax : - xlabel : - ylabel : - title : - **kwargs : Los parametros aceptados son - - ticksize - ytick_visible - """ - - if self.__firsttime: - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - - self.plot = self.__driver.createPline(self.ax, x, y, - xmin, xmax, - ymin, ymax, - xlabel=xlabel, - ylabel=ylabel, - title=title, - **kwargs) - - self.idlineList.append(0) - self.__firsttime = False - return - - self.__driver.pline(self.plot, x, y, xlabel=xlabel, - ylabel=ylabel, - title=title) - -# self.__driver.pause() - - def addpline(self, x, y, idline, **kwargs): - lines = self.ax.lines - - if idline in self.idlineList: - self.__driver.set_linedata(self.ax, x, y, idline) - - if idline not in(self.idlineList): - self.__driver.addpline(self.ax, x, y, **kwargs) - self.idlineList.append(idline) - - return - - def pmultiline(self, x, y, - xmin=None, xmax=None, - ymin=None, ymax=None, - xlabel='', ylabel='', - title='', - **kwargs): - - if self.__firsttime: - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - - self.plot = self.__driver.createPmultiline(self.ax, x, y, - xmin, xmax, - ymin, ymax, - xlabel=xlabel, - ylabel=ylabel, - title=title, - **kwargs) - self.__firsttime = False - return - - self.__driver.pmultiline(self.plot, x, y, xlabel=xlabel, - ylabel=ylabel, - title=title) - -# self.__driver.pause() - - def pmultilineyaxis(self, x, y, - xmin=None, xmax=None, - ymin=None, ymax=None, - xlabel='', ylabel='', - title='', - **kwargs): - - if self.__firsttime: - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - - self.plot = self.__driver.createPmultilineYAxis(self.ax, x, y, - xmin, xmax, - ymin, ymax, - xlabel=xlabel, - ylabel=ylabel, - title=title, - **kwargs) - if self.xmin == None: self.xmin = xmin - if self.xmax == None: self.xmax = xmax - if self.ymin == None: self.ymin = ymin - if self.ymax == None: self.ymax = ymax - - self.__firsttime = False - return - - self.__driver.pmultilineyaxis(self.plot, x, y, xlabel=xlabel, - ylabel=ylabel, - title=title) - -# self.__driver.pause() - - def pcolor(self, x, y, z, - xmin=None, xmax=None, - ymin=None, ymax=None, - zmin=None, zmax=None, - xlabel='', ylabel='', - title='', colormap='jet', - **kwargs): - - """ - Input: - x : - y : - x : - xmin : - xmax : - ymin : - ymax : - zmin : - zmax : - xlabel : - ylabel : - title : - **kwargs : Los parametros aceptados son - ticksize=9, - cblabel='' - """ - - #Decimating data - xlen = len(x) - ylen = len(y) - - decimationx = int(xlen/self.__MAXNUMX) + 1 - decimationy = int(ylen/self.__MAXNUMY) + 1 - - - x_buffer = x#[::decimationx] - y_buffer = y#[::decimationy] - z_buffer = z#[::decimationx, ::decimationy] - #=================================================== - - if self.__firsttime: - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.nanmin(z) - if zmax == None: zmax = numpy.nanmax(z) - - - self.plot = self.__driver.createPcolor(self.ax, x_buffer, - y_buffer, - z_buffer, - xmin, xmax, - ymin, ymax, - zmin, zmax, - xlabel=xlabel, - ylabel=ylabel, - title=title, - colormap=colormap, - **kwargs) - - if self.xmin == None: self.xmin = xmin - if self.xmax == None: self.xmax = xmax - if self.ymin == None: self.ymin = ymin - if self.ymax == None: self.ymax = ymax - if self.zmin == None: self.zmin = zmin - if self.zmax == None: self.zmax = zmax - - self.__firsttime = False - return - - self.__driver.pcolor(self.plot, - z_buffer, - xlabel=xlabel, - ylabel=ylabel, - title=title) - -# self.__driver.pause() - - def pcolorbuffer(self, x, y, z, - xmin=None, xmax=None, - ymin=None, ymax=None, - zmin=None, zmax=None, - xlabel='', ylabel='', - title='', rti = True, colormap='jet', - maxNumX = None, maxNumY = None, - **kwargs): - - if maxNumX == None: - maxNumX = self.__MAXNUMTIME - - if maxNumY == None: - maxNumY = self.__MAXNUMY - - if self.__firsttime: - self.z_buffer = z - self.x_buffer = numpy.hstack((self.x_buffer, x)) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.nanmin(z) - if zmax == None: zmax = numpy.nanmax(z) - - self.plot = self.__driver.createPcolor(self.ax, self.x_buffer, y, z, - xmin, xmax, - ymin, ymax, - zmin, zmax, - xlabel=xlabel, - ylabel=ylabel, - title=title, - colormap=colormap, - **kwargs) - - if self.xmin == None: self.xmin = xmin - if self.xmax == None: self.xmax = xmax - if self.ymin == None: self.ymin = ymin - if self.ymax == None: self.ymax = ymax - if self.zmin == None: self.zmin = zmin - if self.zmax == None: self.zmax = zmax - - self.__firsttime = False - return - - self.x_buffer = numpy.hstack((self.x_buffer[:-1], x[0], x[-1])) - self.z_buffer = numpy.hstack((self.z_buffer, z)) - z_buffer = self.z_buffer.reshape(-1,len(y)) - - #Decimating data - xlen = len(self.x_buffer) - ylen = len(y) - - decimationx = int(xlen/maxNumX) + 1 - decimationy = int(ylen/maxNumY) + 1 - - x_buffer = self.x_buffer#[::decimationx] - y_buffer = y#[::decimationy] - z_buffer = z_buffer#[::decimationx, ::decimationy] - #=================================================== - - x_buffer, y_buffer, z_buffer = self.__fillGaps(x_buffer, y_buffer, z_buffer) - - self.__driver.addpcolorbuffer(self.ax, x_buffer, y_buffer, z_buffer, self.zmin, self.zmax, - xlabel=xlabel, - ylabel=ylabel, - title=title, - colormap=colormap) - -# self.__driver.pause() - - def polar(self, x, y, - title='', xlabel='',ylabel='',**kwargs): - - if self.__firsttime: - self.plot = self.__driver.createPolar(self.ax, x, y, title = title, xlabel = xlabel, ylabel = ylabel) - self.__firsttime = False - self.x_buffer = x - self.y_buffer = y - return - - self.x_buffer = numpy.hstack((self.x_buffer,x)) - self.y_buffer = numpy.hstack((self.y_buffer,y)) - self.__driver.polar(self.plot, self.x_buffer, self.y_buffer, xlabel=xlabel, - ylabel=ylabel, - title=title) - -# self.__driver.pause() - - def __fillGaps(self, x_buffer, y_buffer, z_buffer): - - if x_buffer.shape[0] < 2: - return x_buffer, y_buffer, z_buffer - - deltas = x_buffer[1:] - x_buffer[0:-1] - x_median = numpy.median(deltas) - - index = numpy.where(deltas > 5*x_median) - - if len(index[0]) != 0: - z_buffer[index[0],::] = self.__missing - z_buffer = numpy.ma.masked_inside(z_buffer,0.99*self.__missing,1.01*self.__missing) - - return x_buffer, y_buffer, z_buffer \ No newline at end of file diff --git a/schainpy/model/graphics/jroplot_base.py b/schainpy/model/graphics/jroplot_base.py index 2bbf382..04ed2e6 100644 --- a/schainpy/model/graphics/jroplot_base.py +++ b/schainpy/model/graphics/jroplot_base.py @@ -1,3 +1,10 @@ +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""Base class to create plot operations + +""" import os import sys @@ -5,6 +12,7 @@ import zmq import time import numpy import datetime +from collections import deque from functools import wraps from threading import Thread import matplotlib @@ -14,7 +22,7 @@ if 'BACKEND' in os.environ: elif 'linux' in sys.platform: matplotlib.use("TkAgg") elif 'darwin' in sys.platform: - matplotlib.use('WxAgg') + matplotlib.use('MacOSX') else: from schainpy.utils import log log.warning('Using default Backend="Agg"', 'INFO') @@ -75,7 +83,6 @@ def figpause(interval): pass return - def popup(message): ''' ''' @@ -141,28 +148,45 @@ def apply_throttle(value): @MPDecorator class Plot(Operation): - ''' - Base class for Schain plotting operations - ''' + """Base class for Schain plotting operations + + This class should never be use directtly you must subclass a new operation, + children classes must be defined as follow: + + ExamplePlot(Plot): + + CODE = 'code' + colormap = 'jet' + plot_type = 'pcolor' # options are ('pcolor', 'pcolorbuffer', 'scatter', 'scatterbuffer') + + def setup(self): + pass + + def plot(self): + pass + + """ CODE = 'Figure' colormap = 'jet' bgcolor = 'white' + buffering = True __missing = 1E30 - __attrs__ = ['show', 'save', 'xmin', 'xmax', 'ymin', 'ymax', 'zmin', 'zmax', - 'zlimits', 'xlabel', 'ylabel', 'xaxis', 'cb_label', 'title', - 'colorbar', 'bgcolor', 'width', 'height', 'localtime', 'oneFigure', - 'showprofile', 'decimation', 'pause'] + __attrs__ = ['show', 'save', 'ymin', 'ymax', 'zmin', 'zmax', 'title', + 'showprofile'] def __init__(self): Operation.__init__(self) self.isConfig = False self.isPlotConfig = False - self.save_counter = 1 - self.sender_counter = 1 + self.save_time = 0 + self.sender_time = 0 self.data = None + self.firsttime = True + self.sender_queue = deque(maxlen=10) + self.plots_adjust = {'left': 0.125, 'right': 0.9, 'bottom': 0.15, 'top': 0.9, 'wspace': 0.2, 'hspace': 0.2} def __fmtTime(self, x, pos): ''' @@ -181,8 +205,7 @@ class Plot(Operation): self.localtime = kwargs.pop('localtime', True) self.show = kwargs.get('show', True) self.save = kwargs.get('save', False) - self.save_period = kwargs.get('save_period', 1) - self.ftp = kwargs.get('ftp', False) + self.save_period = kwargs.get('save_period', 0) self.colormap = kwargs.get('colormap', self.colormap) self.colormap_coh = kwargs.get('colormap_coh', 'jet') self.colormap_phase = kwargs.get('colormap_phase', 'RdBu_r') @@ -199,14 +222,15 @@ class Plot(Operation): self.zlimits = kwargs.get('zlimits', None) self.xmin = kwargs.get('xmin', None) self.xmax = kwargs.get('xmax', None) - self.xrange = kwargs.get('xrange', 24) + self.xrange = kwargs.get('xrange', 12) self.xscale = kwargs.get('xscale', None) self.ymin = kwargs.get('ymin', None) self.ymax = kwargs.get('ymax', None) self.yscale = kwargs.get('yscale', None) self.xlabel = kwargs.get('xlabel', None) + self.attr_time = kwargs.get('attr_time', 'utctime') + self.attr_data = kwargs.get('attr_data', 'data_param') self.decimation = kwargs.get('decimation', None) - self.showSNR = kwargs.get('showSNR', False) self.oneFigure = kwargs.get('oneFigure', True) self.width = kwargs.get('width', None) self.height = kwargs.get('height', None) @@ -218,26 +242,27 @@ class Plot(Operation): self.type = kwargs.get('type', 'iq') self.grid = kwargs.get('grid', False) self.pause = kwargs.get('pause', False) - self.save_labels = kwargs.get('save_labels', None) - self.realtime = kwargs.get('realtime', True) - self.buffering = kwargs.get('buffering', True) - self.throttle = kwargs.get('throttle', 2) + self.save_code = kwargs.get('save_code', self.CODE) + self.throttle = kwargs.get('throttle', 0) self.exp_code = kwargs.get('exp_code', None) - self.plot_server = kwargs.get('plot_server', False) - self.sender_period = kwargs.get('sender_period', 1) + self.server = kwargs.get('server', False) + self.sender_period = kwargs.get('sender_period', 60) + self.tag = kwargs.get('tag', '') + self.height_index = kwargs.get('height_index', None) self.__throttle_plot = apply_throttle(self.throttle) - self.data = PlotterData( - self.CODE, self.throttle, self.exp_code, self.buffering, snr=self.showSNR) + code = self.attr_data if self.attr_data else self.CODE + self.data = PlotterData(self.CODE, self.exp_code, self.localtime) - if self.plot_server: - if not self.plot_server.startswith('tcp://'): - self.plot_server = 'tcp://{}'.format(self.plot_server) + if self.server: + if not self.server.startswith('tcp://'): + self.server = 'tcp://{}'.format(self.server) log.success( - 'Sending to server: {}'.format(self.plot_server), + 'Sending to server: {}'.format(self.server), self.name ) - if 'plot_name' in kwargs: - self.plot_name = kwargs['plot_name'] + + if isinstance(self.attr_data, str): + self.attr_data = [self.attr_data] def __setup_plot(self): ''' @@ -306,105 +331,6 @@ class Plot(Operation): cmap.set_bad(self.bgcolor, 1.) self.cmaps.append(cmap) - for fig in self.figures: - fig.canvas.mpl_connect('key_press_event', self.OnKeyPress) - fig.canvas.mpl_connect('scroll_event', self.OnBtnScroll) - fig.canvas.mpl_connect('button_press_event', self.onBtnPress) - fig.canvas.mpl_connect('motion_notify_event', self.onMotion) - fig.canvas.mpl_connect('button_release_event', self.onBtnRelease) - - def OnKeyPress(self, event): - ''' - Event for pressing keys (up, down) change colormap - ''' - ax = event.inaxes - if ax in self.axes: - if event.key == 'down': - ax.index += 1 - elif event.key == 'up': - ax.index -= 1 - if ax.index < 0: - ax.index = len(CMAPS) - 1 - elif ax.index == len(CMAPS): - ax.index = 0 - cmap = CMAPS[ax.index] - ax.cbar.set_cmap(cmap) - ax.cbar.draw_all() - ax.plt.set_cmap(cmap) - ax.cbar.patch.figure.canvas.draw() - self.colormap = cmap.name - - def OnBtnScroll(self, event): - ''' - Event for scrolling, scale figure - ''' - cb_ax = event.inaxes - if cb_ax in [ax.cbar.ax for ax in self.axes if ax.cbar]: - ax = [ax for ax in self.axes if cb_ax == ax.cbar.ax][0] - pt = ax.cbar.ax.bbox.get_points()[:, 1] - nrm = ax.cbar.norm - vmin, vmax, p0, p1, pS = ( - nrm.vmin, nrm.vmax, pt[0], pt[1], event.y) - scale = 2 if event.step == 1 else 0.5 - point = vmin + (vmax - vmin) / (p1 - p0) * (pS - p0) - ax.cbar.norm.vmin = point - scale * (point - vmin) - ax.cbar.norm.vmax = point - scale * (point - vmax) - ax.plt.set_norm(ax.cbar.norm) - ax.cbar.draw_all() - ax.cbar.patch.figure.canvas.draw() - - def onBtnPress(self, event): - ''' - Event for mouse button press - ''' - cb_ax = event.inaxes - if cb_ax is None: - return - - if cb_ax in [ax.cbar.ax for ax in self.axes if ax.cbar]: - cb_ax.press = event.x, event.y - else: - cb_ax.press = None - - def onMotion(self, event): - ''' - Event for move inside colorbar - ''' - cb_ax = event.inaxes - if cb_ax is None: - return - if cb_ax not in [ax.cbar.ax for ax in self.axes if ax.cbar]: - return - if cb_ax.press is None: - return - - ax = [ax for ax in self.axes if cb_ax == ax.cbar.ax][0] - xprev, yprev = cb_ax.press - dx = event.x - xprev - dy = event.y - yprev - cb_ax.press = event.x, event.y - scale = ax.cbar.norm.vmax - ax.cbar.norm.vmin - perc = 0.03 - - if event.button == 1: - ax.cbar.norm.vmin -= (perc * scale) * numpy.sign(dy) - ax.cbar.norm.vmax -= (perc * scale) * numpy.sign(dy) - elif event.button == 3: - ax.cbar.norm.vmin -= (perc * scale) * numpy.sign(dy) - ax.cbar.norm.vmax += (perc * scale) * numpy.sign(dy) - - ax.cbar.draw_all() - ax.plt.set_norm(ax.cbar.norm) - ax.cbar.patch.figure.canvas.draw() - - def onBtnRelease(self, event): - ''' - Event for mouse button release - ''' - cb_ax = event.inaxes - if cb_ax is not None: - cb_ax.press = None - def __add_axes(self, ax, size='30%', pad='8%'): ''' Add new axes to the given figure @@ -451,87 +377,29 @@ class Plot(Operation): Set min and max values, labels, ticks and titles ''' - if self.xmin is None: - xmin = self.data.min_time - else: - if self.xaxis is 'time': - dt = self.getDateTime(self.data.min_time) - xmin = (dt.replace(hour=int(self.xmin), minute=0, second=0) - - datetime.datetime(1970, 1, 1)).total_seconds() - if self.data.localtime: - xmin += time.timezone - else: - xmin = self.xmin - - if self.xmax is None: - xmax = xmin + self.xrange * 60 * 60 - else: - if self.xaxis is 'time': - dt = self.getDateTime(self.data.max_time) - xmax = (dt.replace(hour=int(self.xmax), minute=59, second=59) - - datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=1)).total_seconds() - if self.data.localtime: - xmax += time.timezone - else: - xmax = self.xmax - - ymin = self.ymin if self.ymin else numpy.nanmin(self.y) - ymax = self.ymax if self.ymax else numpy.nanmax(self.y) - #Y = numpy.array([1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000]) - - #i = 1 if numpy.where( - # abs(ymax-ymin) <= Y)[0][0] < 0 else numpy.where(abs(ymax-ymin) <= Y)[0][0] - #ystep = Y[i] / 10. - dig = int(numpy.log10(ymax)) - if dig == 0: - digD = len(str(ymax)) - 2 - ydec = ymax*(10**digD) - - dig = int(numpy.log10(ydec)) - ystep = ((ydec + (10**(dig)))//10**(dig))*(10**(dig)) - ystep = ystep/5 - ystep = ystep/(10**digD) - - else: - ystep = ((ymax + (10**(dig)))//10**(dig))*(10**(dig)) - ystep = ystep/5 - - if self.xaxis is not 'time': - - dig = int(numpy.log10(xmax)) - - if dig <= 0: - digD = len(str(xmax)) - 2 - xdec = xmax*(10**digD) - - dig = int(numpy.log10(xdec)) - xstep = ((xdec + (10**(dig)))//10**(dig))*(10**(dig)) - xstep = xstep*0.5 - xstep = xstep/(10**digD) - - else: - xstep = ((xmax + (10**(dig)))//10**(dig))*(10**(dig)) - xstep = xstep/5 - for n, ax in enumerate(self.axes): if ax.firsttime: + if self.xaxis != 'time': + xmin = self.xmin + xmax = self.xmax + else: + xmin = self.tmin + xmax = self.tmin + self.xrange*60*60 + ax.xaxis.set_major_formatter(FuncFormatter(self.__fmtTime)) + ax.xaxis.set_major_locator(LinearLocator(9)) + ymin = self.ymin if self.ymin is not None else numpy.nanmin(self.y[numpy.isfinite(self.y)]) + ymax = self.ymax if self.ymax is not None else numpy.nanmax(self.y[numpy.isfinite(self.y)]) ax.set_facecolor(self.bgcolor) - ax.yaxis.set_major_locator(MultipleLocator(ystep)) if self.xscale: ax.xaxis.set_major_formatter(FuncFormatter( lambda x, pos: '{0:g}'.format(x*self.xscale))) - if self.xscale: + if self.yscale: ax.yaxis.set_major_formatter(FuncFormatter( lambda x, pos: '{0:g}'.format(x*self.yscale))) - if self.xaxis is 'time': - ax.xaxis.set_major_formatter(FuncFormatter(self.__fmtTime)) - ax.xaxis.set_major_locator(LinearLocator(9)) - else: - ax.xaxis.set_major_locator(MultipleLocator(xstep)) if self.xlabel is not None: ax.set_xlabel(self.xlabel) - ax.set_ylabel(self.ylabel) - ax.firsttime = False + if self.ylabel is not None: + ax.set_ylabel(self.ylabel) if self.showprofile: self.pf_axes[n].set_ylim(ymin, ymax) self.pf_axes[n].set_xlim(self.zmin, self.zmax) @@ -550,12 +418,12 @@ class Plot(Operation): ax.cbar.set_label(self.cb_labels[n], size=8) else: ax.cbar = None - if self.grid: - ax.grid(True) - - if not self.polar: ax.set_xlim(xmin, xmax) ax.set_ylim(ymin, ymax) + ax.firsttime = False + if self.grid: + ax.grid(True) + if not self.polar: ax.set_title('{} {} {}'.format( self.titles[n], self.getDateTime(self.data.max_time).strftime( @@ -568,15 +436,20 @@ class Plot(Operation): ax.set_yticks(numpy.arange(0, 90, 20)) ax.yaxis.labelpad = 40 + if self.firsttime: + for n, fig in enumerate(self.figures): + fig.subplots_adjust(**self.plots_adjust) + self.firsttime = False + def clear_figures(self): ''' Reset axes for redraw plots ''' - for ax in self.axes: + for ax in self.axes+self.pf_axes+self.cb_axes: ax.clear() ax.firsttime = True - if ax.cbar: + if hasattr(ax, 'cbar') and ax.cbar: ax.cbar.remove() def __plot(self): @@ -584,14 +457,8 @@ class Plot(Operation): Main function to plot, format and save figures ''' - try: - self.plot() - self.format() - except Exception as e: - log.warning('{} Plot could not be updated... check data'.format( - self.CODE), self.name) - log.error(str(e), '') - return + self.plot() + self.format() for n, fig in enumerate(self.figures): if self.nrows == 0 or self.nplots == 0: @@ -600,50 +467,67 @@ class Plot(Operation): fig.canvas.manager.set_window_title(self.CODE) continue - fig.tight_layout() fig.canvas.manager.set_window_title('{} - {}'.format(self.title, self.getDateTime(self.data.max_time).strftime('%Y/%m/%d'))) fig.canvas.draw() if self.show: fig.show() - figpause(0.1) + figpause(0.01) if self.save: self.save_figure(n) - if self.plot_server: + if self.server: self.send_to_server() - # t = Thread(target=self.send_to_server) - # t.start() + + def __update(self, dataOut, timestamp): + ''' + ''' + + metadata = { + 'yrange': dataOut.heightList, + 'interval': dataOut.timeInterval, + 'channels': dataOut.channelList + } + + data, meta = self.update(dataOut) + metadata.update(meta) + self.data.update(data, timestamp, metadata) def save_figure(self, n): ''' ''' - if self.save_counter < self.save_period: - self.save_counter += 1 + if (self.data.max_time - self.save_time) <= self.save_period: return - self.save_counter = 1 + self.save_time = self.data.max_time fig = self.figures[n] - if self.save_labels: - labels = self.save_labels - else: - labels = list(range(self.nrows)) + if self.throttle == 0: + figname = os.path.join( + self.save, + self.save_code, + '{}_{}.png'.format( + self.save_code, + self.getDateTime(self.data.max_time).strftime( + '%Y%m%d_%H%M%S' + ), + ) + ) + log.log('Saving figure: {}'.format(figname), self.name) + if not os.path.isdir(os.path.dirname(figname)): + os.makedirs(os.path.dirname(figname)) + fig.savefig(figname) - if self.oneFigure: - label = '' - else: - label = '-{}'.format(labels[n]) figname = os.path.join( self.save, - self.CODE, - '{}{}_{}.png'.format( - self.CODE, - label, - self.getDateTime(self.data.max_time).strftime('%Y%m%d_%H%M%S'), + '{}_{}.png'.format( + self.save_code, + self.getDateTime(self.data.min_time).strftime( + '%Y%m%d' + ), ) ) @@ -652,61 +536,65 @@ class Plot(Operation): os.makedirs(os.path.dirname(figname)) fig.savefig(figname) - if self.realtime: - figname = os.path.join( - self.save, - '{}{}_{}.png'.format( - self.CODE, - label, - self.getDateTime(self.data.min_time).strftime( - '%Y%m%d' - ), - ) - ) - fig.savefig(figname) - def send_to_server(self): ''' ''' - if self.sender_counter < self.sender_period: - self.sender_counter += 1 + if self.exp_code == None: + log.warning('Missing `exp_code` skipping sending to server...') + + last_time = self.data.max_time + interval = last_time - self.sender_time + if interval < self.sender_period: return - self.sender_counter = 1 - self.data.meta['titles'] = self.titles - retries = 2 + self.sender_time = last_time + + attrs = ['titles', 'zmin', 'zmax', 'tag', 'ymin', 'ymax'] + for attr in attrs: + value = getattr(self, attr) + if value: + if isinstance(value, (numpy.float32, numpy.float64)): + value = round(float(value), 2) + self.data.meta[attr] = value + if self.colormap == 'jet': + self.data.meta['colormap'] = 'Jet' + elif 'RdBu' in self.colormap: + self.data.meta['colormap'] = 'RdBu' + else: + self.data.meta['colormap'] = 'Viridis' + self.data.meta['interval'] = int(interval) + + self.sender_queue.append(last_time) + while True: - self.socket.send_string(self.data.jsonify(self.plot_name, self.plot_type)) - socks = dict(self.poll.poll(5000)) + try: + tm = self.sender_queue.popleft() + except IndexError: + break + msg = self.data.jsonify(tm, self.save_code, self.plot_type) + self.socket.send_string(msg) + socks = dict(self.poll.poll(2000)) if socks.get(self.socket) == zmq.POLLIN: reply = self.socket.recv_string() if reply == 'ok': log.log("Response from server ok", self.name) - break + time.sleep(0.1) + continue else: log.warning( "Malformed reply from server: {}".format(reply), self.name) - else: log.warning( "No response from server, retrying...", self.name) + self.sender_queue.appendleft(tm) self.socket.setsockopt(zmq.LINGER, 0) self.socket.close() self.poll.unregister(self.socket) - retries -= 1 - if retries == 0: - log.error( - "Server seems to be offline, abandoning", self.name) - self.socket = self.context.socket(zmq.REQ) - self.socket.connect(self.plot_server) - self.poll.register(self.socket, zmq.POLLIN) - time.sleep(1) - break self.socket = self.context.socket(zmq.REQ) - self.socket.connect(self.plot_server) + self.socket.connect(self.server) self.poll.register(self.socket, zmq.POLLIN) - time.sleep(0.5) + break def setup(self): ''' @@ -724,10 +612,22 @@ class Plot(Operation): def plot(self): ''' - Must be defined in the child class + Must be defined in the child class, the actual plotting method ''' raise NotImplementedError + def update(self, dataOut): + ''' + Must be defined in the child class, update self.data with new data + ''' + + data = { + self.CODE: getattr(dataOut, 'data_{}'.format(self.CODE)) + } + meta = {} + + return data, meta + def run(self, dataOut, **kwargs): ''' Main plotting routine @@ -735,74 +635,59 @@ class Plot(Operation): if self.isConfig is False: self.__setup(**kwargs) - if dataOut.type == 'Parameters': - t = dataOut.utctimeInit - else: - t = dataOut.utctime - if dataOut.useLocalTime: + if self.localtime: self.getDateTime = datetime.datetime.fromtimestamp - if not self.localtime: - t += time.timezone else: self.getDateTime = datetime.datetime.utcfromtimestamp - if self.localtime: - t -= time.timezone - - if 'buffer' in self.plot_type: - if self.xmin is None: - self.tmin = t - else: - self.tmin = ( - self.getDateTime(t).replace( - hour=self.xmin, - minute=0, - second=0) - self.getDateTime(0)).total_seconds() self.data.setup() self.isConfig = True - if self.plot_server: + if self.server: self.context = zmq.Context() self.socket = self.context.socket(zmq.REQ) - self.socket.connect(self.plot_server) + self.socket.connect(self.server) self.poll = zmq.Poller() self.poll.register(self.socket, zmq.POLLIN) - if dataOut.type == 'Parameters': - tm = dataOut.utctimeInit - else: - tm = dataOut.utctime - - if not dataOut.useLocalTime and self.localtime: - tm -= time.timezone - if dataOut.useLocalTime and not self.localtime: - tm += time.timezone + tm = getattr(dataOut, self.attr_time) - if self.xaxis is 'time' and self.data and (tm - self.tmin) >= self.xrange*60*60: - self.save_counter = self.save_period + if self.data and 'time' in self.xaxis and (tm - self.tmin) >= self.xrange*60*60: + self.save_time = tm self.__plot() - self.xmin += self.xrange - if self.xmin >= 24: - self.xmin -= 24 self.tmin += self.xrange*60*60 self.data.setup() self.clear_figures() - self.data.update(dataOut, tm) + self.__update(dataOut, tm) if self.isPlotConfig is False: self.__setup_plot() self.isPlotConfig = True + if self.xaxis == 'time': + dt = self.getDateTime(tm) + if self.xmin is None: + self.tmin = tm + self.xmin = dt.hour + minutes = (self.xmin-int(self.xmin)) * 60 + seconds = (minutes - int(minutes)) * 60 + self.tmin = (dt.replace(hour=int(self.xmin), minute=int(minutes), second=int(seconds)) - + datetime.datetime(1970, 1, 1)).total_seconds() + if self.localtime: + self.tmin += time.timezone + + if self.xmin is not None and self.xmax is not None: + self.xrange = self.xmax - self.xmin - if self.realtime: + if self.throttle == 0: self.__plot() else: self.__throttle_plot(self.__plot)#, coerce=coerce) def close(self): - if self.data: - self.save_counter = self.save_period + if self.data and not self.data.flagNoData: + self.save_time = 0 self.__plot() - if self.data and self.pause: + if self.data and not self.data.flagNoData and self.pause: figpause(10) diff --git a/schainpy/model/graphics/jroplot_correlation.py b/schainpy/model/graphics/jroplot_correlation.py index 37fdc5c..f91aa2d 100644 --- a/schainpy/model/graphics/jroplot_correlation.py +++ b/schainpy/model/graphics/jroplot_correlation.py @@ -2,10 +2,10 @@ import os import datetime import numpy import copy -from schainpy.model import * -from .figure import Figure, isRealtime +from schainpy.model.graphics.jroplot_base import Plot -class CorrelationPlot_(Figure): + +class CorrelationPlot(Plot): isConfig = None __nsubplots = None @@ -114,7 +114,7 @@ class CorrelationPlot_(Figure): factor = dataOut.normFactor lenfactor = factor.shape[1] x = dataOut.getLagTRange(1) - y = dataOut.getHeiRange() + y = dataOut.heightList z = copy.copy(dataOut.data_corr[:,:,0,:]) for i in range(dataOut.data_corr.shape[0]): diff --git a/schainpy/model/graphics/jroplot_data.py b/schainpy/model/graphics/jroplot_data.py deleted file mode 100644 index a916fd0..0000000 --- a/schainpy/model/graphics/jroplot_data.py +++ /dev/null @@ -1,779 +0,0 @@ -''' -New Plots Operations - -@author: juan.espinoza@jro.igp.gob.pe -''' - - -import time -import datetime -import numpy - -from schainpy.model.graphics.jroplot_base import Plot, plt -from schainpy.utils import log - -EARTH_RADIUS = 6.3710e3 - - -def ll2xy(lat1, lon1, lat2, lon2): - - p = 0.017453292519943295 - a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \ - numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2 - r = 12742 * numpy.arcsin(numpy.sqrt(a)) - theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p) - * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p)) - theta = -theta + numpy.pi/2 - return r*numpy.cos(theta), r*numpy.sin(theta) - - -def km2deg(km): - ''' - Convert distance in km to degrees - ''' - - return numpy.rad2deg(km/EARTH_RADIUS) - - -class SpectraPlot(Plot): - ''' - Plot for Spectra data - ''' - - CODE = 'spc' - colormap = 'jro' - plot_name = 'Spectra' - plot_type = 'pcolor' - - def setup(self): - self.nplots = len(self.data.channels) - self.ncols = int(numpy.sqrt(self.nplots) + 0.9) - self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9) - self.width = 3.4 * self.ncols - self.height = 3 * self.nrows - self.cb_label = 'dB' - if self.showprofile: - self.width += 0.8 * self.ncols - - self.ylabel = 'Range [km]' - - def plot(self): - if self.xaxis == "frequency": - x = self.data.xrange[0] - self.xlabel = "Frequency (kHz)" - elif self.xaxis == "time": - x = self.data.xrange[1] - self.xlabel = "Time (ms)" - else: - x = self.data.xrange[2] - self.xlabel = "Velocity (m/s)" - - if self.CODE == 'spc_moments': - x = self.data.xrange[2] - self.xlabel = "Velocity (m/s)" - - self.titles = [] - - y = self.data.heights - self.y = y - z = self.data['spc'] - - for n, ax in enumerate(self.axes): - noise = self.data['noise'][n][-1] - if self.CODE == 'spc_moments': - mean = self.data['moments'][n, :, 1, :][-1] - if ax.firsttime: - self.xmax = self.xmax if self.xmax else numpy.nanmax(x) - self.xmin = self.xmin if self.xmin else -self.xmax - self.zmin = self.zmin if self.zmin else numpy.nanmin(z) - self.zmax = self.zmax if self.zmax else numpy.nanmax(z) - ax.plt = ax.pcolormesh(x, y, z[n].T, - vmin=self.zmin, - vmax=self.zmax, - cmap=plt.get_cmap(self.colormap) - ) - - if self.showprofile: - ax.plt_profile = self.pf_axes[n].plot( - self.data['rti'][n][-1], y)[0] - ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y, - color="k", linestyle="dashed", lw=1)[0] - if self.CODE == 'spc_moments': - ax.plt_mean = ax.plot(mean, y, color='k')[0] - else: - ax.plt.set_array(z[n].T.ravel()) - if self.showprofile: - ax.plt_profile.set_data(self.data['rti'][n][-1], y) - ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y) - if self.CODE == 'spc_moments': - ax.plt_mean.set_data(mean, y) - self.titles.append('CH {}: {:3.2f}dB'.format(n, noise)) - - -class CrossSpectraPlot(Plot): - - CODE = 'cspc' - colormap = 'jet' - plot_name = 'CrossSpectra' - plot_type = 'pcolor' - zmin_coh = None - zmax_coh = None - zmin_phase = None - zmax_phase = None - - def setup(self): - - self.ncols = 4 - self.nrows = len(self.data.pairs) - self.nplots = self.nrows * 4 - self.width = 3.4 * self.ncols - self.height = 3 * self.nrows - self.ylabel = 'Range [km]' - self.showprofile = False - - def plot(self): - - if self.xaxis == "frequency": - x = self.data.xrange[0] - self.xlabel = "Frequency (kHz)" - elif self.xaxis == "time": - x = self.data.xrange[1] - self.xlabel = "Time (ms)" - else: - x = self.data.xrange[2] - self.xlabel = "Velocity (m/s)" - - self.titles = [] - - y = self.data.heights - self.y = y - spc = self.data['spc'] - cspc = self.data['cspc'] - - for n in range(self.nrows): - noise = self.data['noise'][n][-1] - pair = self.data.pairs[n] - ax = self.axes[4 * n] - spc0 = 10.*numpy.log10(spc[pair[0]]/self.data.factor) - if ax.firsttime: - self.xmax = self.xmax if self.xmax else numpy.nanmax(x) - self.xmin = self.xmin if self.xmin else -self.xmax - self.zmin = self.zmin if self.zmin else numpy.nanmin(spc) - self.zmax = self.zmax if self.zmax else numpy.nanmax(spc) - ax.plt = ax.pcolormesh(x , y , spc0.T, - vmin=self.zmin, - vmax=self.zmax, - cmap=plt.get_cmap(self.colormap) - ) - else: - ax.plt.set_array(spc0.T.ravel()) - self.titles.append('CH {}: {:3.2f}dB'.format(pair[0], noise)) - - ax = self.axes[4 * n + 1] - spc1 = 10.*numpy.log10(spc[pair[1]]/self.data.factor) - if ax.firsttime: - ax.plt = ax.pcolormesh(x , y, spc1.T, - vmin=self.zmin, - vmax=self.zmax, - cmap=plt.get_cmap(self.colormap) - ) - else: - ax.plt.set_array(spc1.T.ravel()) - self.titles.append('CH {}: {:3.2f}dB'.format(pair[1], noise)) - - out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]]) - coh = numpy.abs(out) - phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi - - ax = self.axes[4 * n + 2] - if ax.firsttime: - ax.plt = ax.pcolormesh(x, y, coh.T, - vmin=0, - vmax=1, - cmap=plt.get_cmap(self.colormap_coh) - ) - else: - ax.plt.set_array(coh.T.ravel()) - self.titles.append( - 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1])) - - ax = self.axes[4 * n + 3] - if ax.firsttime: - ax.plt = ax.pcolormesh(x, y, phase.T, - vmin=-180, - vmax=180, - cmap=plt.get_cmap(self.colormap_phase) - ) - else: - ax.plt.set_array(phase.T.ravel()) - self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1])) - - -class SpectralMomentsPlot(SpectraPlot): - ''' - Plot for Spectral Moments - ''' - CODE = 'spc_moments' - colormap = 'jro' - plot_name = 'SpectralMoments' - plot_type = 'pcolor' - - -class RTIPlot(Plot): - ''' - Plot for RTI data - ''' - - CODE = 'rti' - colormap = 'jro' - plot_name = 'RTI' - plot_type = 'pcolorbuffer' - - def setup(self): - self.xaxis = 'time' - self.ncols = 1 - self.nrows = len(self.data.channels) - self.nplots = len(self.data.channels) - self.ylabel = 'Range [km]' - self.cb_label = 'dB' - self.titles = ['{} Channel {}'.format( - self.CODE.upper(), x) for x in range(self.nrows)] - - def plot(self): - self.x = self.data.times - self.y = self.data.heights - self.z = self.data[self.CODE] - self.z = numpy.ma.masked_invalid(self.z) - - if self.decimation is None: - x, y, z = self.fill_gaps(self.x, self.y, self.z) - else: - x, y, z = self.fill_gaps(*self.decimate()) - - for n, ax in enumerate(self.axes): - self.zmin = self.zmin if self.zmin else numpy.min(self.z) - self.zmax = self.zmax if self.zmax else numpy.max(self.z) - if ax.firsttime: - ax.plt = ax.pcolormesh(x, y, z[n].T, - vmin=self.zmin, - vmax=self.zmax, - cmap=plt.get_cmap(self.colormap) - ) - if self.showprofile: - ax.plot_profile = self.pf_axes[n].plot( - self.data['rti'][n][-1], self.y)[0] - ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(self.data['noise'][n][-1], len(self.y)), self.y, - color="k", linestyle="dashed", lw=1)[0] - else: - ax.collections.remove(ax.collections[0]) - ax.plt = ax.pcolormesh(x, y, z[n].T, - vmin=self.zmin, - vmax=self.zmax, - cmap=plt.get_cmap(self.colormap) - ) - if self.showprofile: - ax.plot_profile.set_data(self.data['rti'][n][-1], self.y) - ax.plot_noise.set_data(numpy.repeat( - self.data['noise'][n][-1], len(self.y)), self.y) - - -class CoherencePlot(RTIPlot): - ''' - Plot for Coherence data - ''' - - CODE = 'coh' - plot_name = 'Coherence' - - def setup(self): - self.xaxis = 'time' - self.ncols = 1 - self.nrows = len(self.data.pairs) - self.nplots = len(self.data.pairs) - self.ylabel = 'Range [km]' - if self.CODE == 'coh': - self.cb_label = '' - self.titles = [ - 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs] - else: - self.cb_label = 'Degrees' - self.titles = [ - 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs] - - -class PhasePlot(CoherencePlot): - ''' - Plot for Phase map data - ''' - - CODE = 'phase' - colormap = 'seismic' - plot_name = 'Phase' - - -class NoisePlot(Plot): - ''' - Plot for noise - ''' - - CODE = 'noise' - plot_name = 'Noise' - plot_type = 'scatterbuffer' - - - def setup(self): - self.xaxis = 'time' - self.ncols = 1 - self.nrows = 1 - self.nplots = 1 - self.ylabel = 'Intensity [dB]' - self.titles = ['Noise'] - self.colorbar = False - - def plot(self): - - x = self.data.times - xmin = self.data.min_time - xmax = xmin + self.xrange * 60 * 60 - Y = self.data[self.CODE] - - if self.axes[0].firsttime: - for ch in self.data.channels: - y = Y[ch] - self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch)) - plt.legend() - else: - for ch in self.data.channels: - y = Y[ch] - self.axes[0].lines[ch].set_data(x, y) - - self.ymin = numpy.nanmin(Y) - 5 - self.ymax = numpy.nanmax(Y) + 5 - - -class SnrPlot(RTIPlot): - ''' - Plot for SNR Data - ''' - - CODE = 'snr' - colormap = 'jet' - plot_name = 'SNR' - - -class DopplerPlot(RTIPlot): - ''' - Plot for DOPPLER Data (1st moment) - ''' - - CODE = 'dop' - colormap = 'jet' - plot_name = 'DopplerShift' - - -class PowerPlot(RTIPlot): - ''' - Plot for Power Data (0 moment) - ''' - - CODE = 'pow' - colormap = 'jet' - plot_name = 'TotalPower' - - -class SpectralWidthPlot(RTIPlot): - ''' - Plot for Spectral Width Data (2nd moment) - ''' - - CODE = 'width' - colormap = 'jet' - plot_name = 'SpectralWidth' - - -class SkyMapPlot(Plot): - ''' - Plot for meteors detection data - ''' - - CODE = 'param' - - def setup(self): - - self.ncols = 1 - self.nrows = 1 - self.width = 7.2 - self.height = 7.2 - self.nplots = 1 - self.xlabel = 'Zonal Zenith Angle (deg)' - self.ylabel = 'Meridional Zenith Angle (deg)' - self.polar = True - self.ymin = -180 - self.ymax = 180 - self.colorbar = False - - def plot(self): - - arrayParameters = numpy.concatenate(self.data['param']) - error = arrayParameters[:, -1] - indValid = numpy.where(error == 0)[0] - finalMeteor = arrayParameters[indValid, :] - finalAzimuth = finalMeteor[:, 3] - finalZenith = finalMeteor[:, 4] - - x = finalAzimuth * numpy.pi / 180 - y = finalZenith - - ax = self.axes[0] - - if ax.firsttime: - ax.plot = ax.plot(x, y, 'bo', markersize=5)[0] - else: - ax.plot.set_data(x, y) - - dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S') - dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S') - title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1, - dt2, - len(x)) - self.titles[0] = title - - -class ParametersPlot(RTIPlot): - ''' - Plot for data_param object - ''' - - CODE = 'param' - colormap = 'seismic' - plot_name = 'Parameters' - - def setup(self): - self.xaxis = 'time' - self.ncols = 1 - self.nrows = self.data.shape(self.CODE)[0] - self.nplots = self.nrows - if self.showSNR: - self.nrows += 1 - self.nplots += 1 - - self.ylabel = 'Height [km]' - if not self.titles: - self.titles = self.data.parameters \ - if self.data.parameters else ['Param {}'.format(x) for x in range(self.nrows)] - if self.showSNR: - self.titles.append('SNR') - - def plot(self): - self.data.normalize_heights() - self.x = self.data.times - self.y = self.data.heights - if self.showSNR: - self.z = numpy.concatenate( - (self.data[self.CODE], self.data['snr']) - ) - else: - self.z = self.data[self.CODE] - - self.z = numpy.ma.masked_invalid(self.z) - - if self.decimation is None: - x, y, z = self.fill_gaps(self.x, self.y, self.z) - else: - x, y, z = self.fill_gaps(*self.decimate()) - - for n, ax in enumerate(self.axes): - - self.zmax = self.zmax if self.zmax is not None else numpy.max( - self.z[n]) - self.zmin = self.zmin if self.zmin is not None else numpy.min( - self.z[n]) - - if ax.firsttime: - if self.zlimits is not None: - self.zmin, self.zmax = self.zlimits[n] - - ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n], - vmin=self.zmin, - vmax=self.zmax, - cmap=self.cmaps[n] - ) - else: - if self.zlimits is not None: - self.zmin, self.zmax = self.zlimits[n] - ax.collections.remove(ax.collections[0]) - ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n], - vmin=self.zmin, - vmax=self.zmax, - cmap=self.cmaps[n] - ) - - -class OutputPlot(ParametersPlot): - ''' - Plot data_output object - ''' - - CODE = 'output' - colormap = 'seismic' - plot_name = 'Output' - - -class PolarMapPlot(Plot): - ''' - Plot for weather radar - ''' - - CODE = 'param' - colormap = 'seismic' - - def setup(self): - self.ncols = 1 - self.nrows = 1 - self.width = 9 - self.height = 8 - self.mode = self.data.meta['mode'] - if self.channels is not None: - self.nplots = len(self.channels) - self.nrows = len(self.channels) - else: - self.nplots = self.data.shape(self.CODE)[0] - self.nrows = self.nplots - self.channels = list(range(self.nplots)) - if self.mode == 'E': - self.xlabel = 'Longitude' - self.ylabel = 'Latitude' - else: - self.xlabel = 'Range (km)' - self.ylabel = 'Height (km)' - self.bgcolor = 'white' - self.cb_labels = self.data.meta['units'] - self.lat = self.data.meta['latitude'] - self.lon = self.data.meta['longitude'] - self.xmin, self.xmax = float( - km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon) - self.ymin, self.ymax = float( - km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat) - # self.polar = True - - def plot(self): - - for n, ax in enumerate(self.axes): - data = self.data['param'][self.channels[n]] - - zeniths = numpy.linspace( - 0, self.data.meta['max_range'], data.shape[1]) - if self.mode == 'E': - azimuths = -numpy.radians(self.data.heights)+numpy.pi/2 - r, theta = numpy.meshgrid(zeniths, azimuths) - x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin( - theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])) - x = km2deg(x) + self.lon - y = km2deg(y) + self.lat - else: - azimuths = numpy.radians(self.data.heights) - r, theta = numpy.meshgrid(zeniths, azimuths) - x, y = r*numpy.cos(theta), r*numpy.sin(theta) - self.y = zeniths - - if ax.firsttime: - if self.zlimits is not None: - self.zmin, self.zmax = self.zlimits[n] - ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)), - x, y, numpy.ma.array(data, mask=numpy.isnan(data)), - vmin=self.zmin, - vmax=self.zmax, - cmap=self.cmaps[n]) - else: - if self.zlimits is not None: - self.zmin, self.zmax = self.zlimits[n] - ax.collections.remove(ax.collections[0]) - ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)), - x, y, numpy.ma.array(data, mask=numpy.isnan(data)), - vmin=self.zmin, - vmax=self.zmax, - cmap=self.cmaps[n]) - - if self.mode == 'A': - continue - - # plot district names - f = open('/data/workspace/schain_scripts/distrito.csv') - for line in f: - label, lon, lat = [s.strip() for s in line.split(',') if s] - lat = float(lat) - lon = float(lon) - # ax.plot(lon, lat, '.b', ms=2) - ax.text(lon, lat, label.decode('utf8'), ha='center', - va='bottom', size='8', color='black') - - # plot limites - limites = [] - tmp = [] - for line in open('/data/workspace/schain_scripts/lima.csv'): - if '#' in line: - if tmp: - limites.append(tmp) - tmp = [] - continue - values = line.strip().split(',') - tmp.append((float(values[0]), float(values[1]))) - for points in limites: - ax.add_patch( - Polygon(points, ec='k', fc='none', ls='--', lw=0.5)) - - # plot Cuencas - for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'): - f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca)) - values = [line.strip().split(',') for line in f] - points = [(float(s[0]), float(s[1])) for s in values] - ax.add_patch(Polygon(points, ec='b', fc='none')) - - # plot grid - for r in (15, 30, 45, 60): - ax.add_artist(plt.Circle((self.lon, self.lat), - km2deg(r), color='0.6', fill=False, lw=0.2)) - ax.text( - self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180), - self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180), - '{}km'.format(r), - ha='center', va='bottom', size='8', color='0.6', weight='heavy') - - if self.mode == 'E': - title = 'El={}$^\circ$'.format(self.data.meta['elevation']) - label = 'E{:02d}'.format(int(self.data.meta['elevation'])) - else: - title = 'Az={}$^\circ$'.format(self.data.meta['azimuth']) - label = 'A{:02d}'.format(int(self.data.meta['azimuth'])) - - self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels] - self.titles = ['{} {}'.format( - self.data.parameters[x], title) for x in self.channels] - - -class ScopePlot(Plot): - - ''' - Plot for Scope - ''' - - CODE = 'scope' - plot_name = 'Scope' - plot_type = 'scatter' - - def setup(self): - - self.xaxis = 'Range (Km)' - self.ncols = 1 - self.nrows = 1 - self.nplots = 1 - self.ylabel = 'Intensity [dB]' - self.titles = ['Scope'] - self.colorbar = False - colspan = 3 - rowspan = 1 - - def plot_iq(self, x, y, channelIndexList, thisDatetime, wintitle): - - yreal = y[channelIndexList,:].real - yimag = y[channelIndexList,:].imag - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) - self.xlabel = "Range (Km)" - self.ylabel = "Intensity - IQ" - - self.y = yreal - self.x = x - self.xmin = min(x) - self.xmax = max(x) - - - self.titles[0] = title - - for i,ax in enumerate(self.axes): - title = "Channel %d" %(i) - if ax.firsttime: - ax.plt_r = ax.plot(x, yreal[i,:], color='b')[0] - ax.plt_i = ax.plot(x, yimag[i,:], color='r')[0] - else: - #pass - ax.plt_r.set_data(x, yreal[i,:]) - ax.plt_i.set_data(x, yimag[i,:]) - - def plot_power(self, x, y, channelIndexList, thisDatetime, wintitle): - y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:]) - yreal = y.real - self.y = yreal - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) - self.xlabel = "Range (Km)" - self.ylabel = "Intensity" - self.xmin = min(x) - self.xmax = max(x) - - - self.titles[0] = title - - for i,ax in enumerate(self.axes): - title = "Channel %d" %(i) - - ychannel = yreal[i,:] - - if ax.firsttime: - ax.plt_r = ax.plot(x, ychannel)[0] - else: - #pass - ax.plt_r.set_data(x, ychannel) - - - def plot(self): - - if self.channels: - channels = self.channels - else: - channels = self.data.channels - - - - thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]) - - scope = self.data['scope'] - - - if self.data.flagDataAsBlock: - - for i in range(self.data.nProfiles): - - wintitle1 = " [Profile = %d] " %i - - if self.type == "power": - self.plot_power(self.data.heights, - scope[:,i,:], - channels, - thisDatetime, - wintitle1 - ) - - if self.type == "iq": - self.plot_iq(self.data.heights, - scope[:,i,:], - channels, - thisDatetime, - wintitle1 - ) - else: - wintitle = " [Profile = %d] " %self.data.profileIndex - - if self.type == "power": - self.plot_power(self.data.heights, - scope, - channels, - thisDatetime, - wintitle - ) - - if self.type == "iq": - self.plot_iq(self.data.heights, - scope, - channels, - thisDatetime, - wintitle - ) diff --git a/schainpy/model/graphics/jroplot_heispectra.py b/schainpy/model/graphics/jroplot_heispectra.py index e69070c..a98a5cd 100644 --- a/schainpy/model/graphics/jroplot_heispectra.py +++ b/schainpy/model/graphics/jroplot_heispectra.py @@ -1,345 +1,101 @@ -''' -Created on Jul 9, 2014 +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""Classes to plo Specra Heis data -@author: roj-idl71 -''' -import os -import datetime -import numpy - -from .figure import Figure, isRealtime -from .plotting_codes import * -from schainpy.model.proc.jroproc_base import MPDecorator - - -@MPDecorator -class SpectraHeisScope_(Figure): - - - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'spc' - - def __init__(self):#, **kwargs): - - Figure.__init__(self)#, **kwargs) - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 230 - self.HEIGHT = 250 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = SPEC_CODE - - def getSubplots(self): - - ncol = int(numpy.sqrt(self.nplots)+0.9) - nrow = int(self.nplots*1./ncol + 0.9) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, show): - - showprofile = False - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - if showprofile: - ncolspan = 3 - colspan = 2 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show = show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) - - counter += 1 - - - def run(self, dataOut, id, wintitle="", channelList=None, - xmin=None, xmax=None, ymin=None, ymax=None, save=False, - figpath='./', figfile=None, ftp=False, wr_period=1, show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - """ - - if dataOut.flagNoData: - return dataOut - - if dataOut.realtime: - if not(isRealtime(utcdatatime = dataOut.utctime)): - print('Skipping this plot function') - return - - if channelList == None: - channelIndexList = dataOut.channelIndexList - else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) - -# x = dataOut.heightList - c = 3E8 - deltaHeight = dataOut.heightList[1] - dataOut.heightList[0] - #deberia cambiar para el caso de 1Mhz y 100KHz - x = numpy.arange(-1*dataOut.nHeights/2.,dataOut.nHeights/2.)*(c/(2*deltaHeight*dataOut.nHeights*1000)) - #para 1Mhz descomentar la siguiente linea - #x= x/(10000.0) -# y = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:]) -# y = y.real - factor = dataOut.normFactor - data = dataOut.data_spc / factor - datadB = 10.*numpy.log10(data) - y = datadB - - #thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - xlabel = "" - #para 1Mhz descomentar la siguiente linea - #xlabel = "Frequency x 10000" - ylabel = "Intensity (dB)" - - if not self.isConfig: - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.isConfig = True - - self.setWinTitle(title) - - for i in range(len(self.axesList)): - ychannel = y[i,:] - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[channelIndexList[i]], numpy.max(ychannel), str_datetime) - axes = self.axesList[i] - axes.pline(x, ychannel, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title, grid='both') - - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - return dataOut - -@MPDecorator -class RTIfromSpectraHeis_(Figure): - - isConfig = None - __nsubplots = None - - PREFIX = 'rtinoise' - - def __init__(self):#, **kwargs): - Figure.__init__(self)#, **kwargs) - self.timerange = 24*60*60 - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 820 - self.HEIGHT = 200 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - self.xdata = None - self.ydata = None - self.figfile = None - - self.PLOT_CODE = RTI_CODE - - def getSubplots(self): - - ncol = 1 - nrow = 1 - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 7 - colspan = 6 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH+self.WIDTHPROF, - heightplot = self.HEIGHT+self.HEIGHTPROF, - show = show) - - nrow, ncol = self.getSubplots() - - self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1) +""" +import numpy - def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True', - xmin=None, xmax=None, ymin=None, ymax=None, - timerange=None, - save=False, figpath='./', figfile=None, ftp=False, wr_period=1, show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): +from schainpy.model.graphics.jroplot_base import Plot, plt - if dataOut.flagNoData: - return dataOut +class SpectraHeisPlot(Plot): - if channelList == None: - channelIndexList = dataOut.channelIndexList - channelList = dataOut.channelList - else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) + CODE = 'spc_heis' - if timerange != None: - self.timerange = timerange + def setup(self): - x = dataOut.getTimeRange() - y = dataOut.getHeiRange() + self.nplots = len(self.data.channels) + self.ncols = int(numpy.sqrt(self.nplots) + 0.9) + self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9) + self.height = 2.6 * self.nrows + self.width = 3.5 * self.ncols + self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.95, 'bottom': 0.08}) + self.ylabel = 'Intensity [dB]' + self.xlabel = 'Frequency [KHz]' + self.colorbar = False - factor = dataOut.normFactor - data = dataOut.data_spc / factor - data = numpy.average(data,axis=1) - datadB = 10*numpy.log10(data) + def update(self, dataOut): -# factor = dataOut.normFactor -# noise = dataOut.getNoise()/factor -# noisedB = 10*numpy.log10(noise) + data = {} + meta = {} + spc = 10*numpy.log10(dataOut.data_spc / dataOut.normFactor) + data['spc_heis'] = spc + + return data, meta - #thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " RTI: %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "Local Time" - ylabel = "Intensity (dB)" + def plot(self): - if not self.isConfig: + c = 3E8 + deltaHeight = self.data.yrange[1] - self.data.yrange[0] + x = numpy.arange(-1*len(self.data.yrange)/2., len(self.data.yrange)/2.)*(c/(2*deltaHeight*len(self.data.yrange)*1000)) + self.y = self.data[-1]['spc_heis'] + self.titles = [] - nplots = 1 + for n, ax in enumerate(self.axes): + ychannel = self.y[n,:] + if ax.firsttime: + self.xmin = min(x) if self.xmin is None else self.xmin + self.xmax = max(x) if self.xmax is None else self.xmax + ax.plt = ax.plot(x, ychannel, lw=1, color='b')[0] + else: + ax.plt.set_data(x, ychannel) - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) + self.titles.append("Channel {}: {:4.2f}dB".format(n, numpy.max(ychannel))) - self.tmin, self.tmax = self.getTimeLim(x, xmin, xmax) - if ymin == None: ymin = numpy.nanmin(datadB) - if ymax == None: ymax = numpy.nanmax(datadB) +class RTIHeisPlot(Plot): - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - self.figfile = figfile - self.xdata = numpy.array([]) - self.ydata = numpy.array([]) + CODE = 'rti_heis' - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos + def setup(self): - self.setWinTitle(title) + self.xaxis = 'time' + self.ncols = 1 + self.nrows = 1 + self.nplots = 1 + self.ylabel = 'Intensity [dB]' + self.xlabel = 'Time' + self.titles = ['RTI'] + self.colorbar = False + self.height = 4 + self.plots_adjust.update({'right': 0.85 }) + def update(self, dataOut): -# title = "RTI %s" %(thisDatetime.strftime("%d-%b-%Y")) - title = "RTI - %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) + data = {} + meta = {} + spc = dataOut.data_spc / dataOut.normFactor + spc = 10*numpy.log10(numpy.average(spc, axis=1)) + data['rti_heis'] = spc + + return data, meta - legendlabels = ["channel %d"%idchannel for idchannel in channelList] - axes = self.axesList[0] + def plot(self): - self.xdata = numpy.hstack((self.xdata, x[0:1])) + x = self.data.times + Y = self.data['rti_heis'] - if len(self.ydata)==0: - self.ydata = datadB[channelIndexList].reshape(-1,1) + if self.axes[0].firsttime: + self.ymin = numpy.nanmin(Y) - 5 if self.ymin == None else self.ymin + self.ymax = numpy.nanmax(Y) + 5 if self.ymax == None else self.ymax + for ch in self.data.channels: + y = Y[ch] + self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch)) + plt.legend(bbox_to_anchor=(1.18, 1.0)) else: - self.ydata = numpy.hstack((self.ydata, datadB[channelIndexList].reshape(-1,1))) - - - axes.pmultilineyaxis(x=self.xdata, y=self.ydata, - xmin=self.tmin, xmax=self.tmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='.', markersize=8, linestyle="solid", grid='both', - XAxisAsTime=True - ) - - self.draw() - - update_figfile = False - - if dataOut.ltctime >= self.tmax: - self.counter_imagwr = wr_period - self.isConfig = False - update_figfile = True - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) - - - return dataOut \ No newline at end of file + for ch in self.data.channels: + y = Y[ch] + self.axes[0].lines[ch].set_data(x, y) diff --git a/schainpy/model/graphics/jroplot_parameters.py b/schainpy/model/graphics/jroplot_parameters.py index b0dab65..06032b4 100644 --- a/schainpy/model/graphics/jroplot_parameters.py +++ b/schainpy/model/graphics/jroplot_parameters.py @@ -1,2394 +1,357 @@ import os import datetime import numpy -import inspect -from .figure import Figure, isRealtime, isTimeInHourRange -from .plotting_codes import * -from schainpy.model.proc.jroproc_base import MPDecorator -from schainpy.utils import log - -class ParamLine_(Figure): - - isConfig = None - - def __init__(self): - - self.isConfig = False - self.WIDTH = 300 - self.HEIGHT = 200 - self.counter_imagwr = 0 - - def getSubplots(self): - - nrow = self.nplots - ncol = 3 - return nrow, ncol - - def setup(self, id, nplots, wintitle, show): - - self.nplots = nplots - - self.createFigure(id=id, - wintitle=wintitle, - show=show) - - nrow,ncol = self.getSubplots() - colspan = 3 - rowspan = 1 - - for i in range(nplots): - self.addAxes(nrow, ncol, i, 0, colspan, rowspan) - - def plot_iq(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax): - yreal = y[channelIndexList,:].real - yimag = y[channelIndexList,:].imag - - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - xlabel = "Range (Km)" - ylabel = "Intensity - IQ" - - if not self.isConfig: - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle='', - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = min(numpy.nanmin(yreal),numpy.nanmin(yimag)) - if ymax == None: ymax = max(numpy.nanmax(yreal),numpy.nanmax(yimag)) - - self.isConfig = True - - self.setWinTitle(title) - - for i in range(len(self.axesList)): - title = "Channel %d" %(i) - axes = self.axesList[i] - - axes.pline(x, yreal[i,:], - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title) - - axes.addpline(x, yimag[i,:], idline=1, color="red", linestyle="solid", lw=2) - - def plot_power(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax): - y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:]) - yreal = y.real - - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - xlabel = "Range (Km)" - ylabel = "Intensity" - - if not self.isConfig: - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle='', - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(yreal) - if ymax == None: ymax = numpy.nanmax(yreal) - - self.isConfig = True - - self.setWinTitle(title) - - for i in range(len(self.axesList)): - title = "Channel %d" %(i) - axes = self.axesList[i] - ychannel = yreal[i,:] - axes.pline(x, ychannel, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title) - - def run(self, dataOut, id, wintitle="", channelList=None, - xmin=None, xmax=None, ymin=None, ymax=None, save=False, - figpath='./', figfile=None, show=True, wr_period=1, - ftp=False, server=None, folder=None, username=None, password=None): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - """ - - if channelList == None: - channelIndexList = dataOut.channelIndexList - else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList" % channel) - channelIndexList.append(dataOut.channelList.index(channel)) - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - - y = dataOut.RR - - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - xlabel = "Range (Km)" - ylabel = "Intensity" - - if not self.isConfig: - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle='', - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - - self.isConfig = True - - self.setWinTitle(title) - - for i in range(len(self.axesList)): - title = "Channel %d" %(i) - axes = self.axesList[i] - ychannel = y[i,:] - axes.pline(x, ychannel, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title) - - - self.draw() - - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") + "_" + str(dataOut.profileIndex) - figfile = self.getFilename(name = str_datetime) - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) +from schainpy.model.graphics.jroplot_base import Plot, plt +from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot +from schainpy.utils import log +EARTH_RADIUS = 6.3710e3 -class SpcParamPlot_(Figure): - - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'SpcParam' - - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 250 - self.HEIGHT = 250 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = SPEC_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - self.__xfilter_ena = False - self.__yfilter_ena = False - - def getSubplots(self): - - ncol = int(numpy.sqrt(self.nplots)+0.9) - nrow = int(self.nplots*1./ncol + 0.9) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - if showprofile: - ncolspan = 3 - colspan = 2 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True, - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False, - xaxis="frequency", colormap='jet', normFactor=None , Selector = 0): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - if realtime: - if not(isRealtime(utcdatatime = dataOut.utctime)): - print('Skipping this plot function') - return - - if channelList == None: - channelIndexList = dataOut.channelIndexList - else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList" %channel) - channelIndexList.append(dataOut.channelList.index(channel)) - - # if normFactor is None: - # factor = dataOut.normFactor - # else: - # factor = normFactor - if xaxis == "frequency": - x = dataOut.spcparam_range[0] - xlabel = "Frequency (kHz)" +def ll2xy(lat1, lon1, lat2, lon2): - elif xaxis == "time": - x = dataOut.spcparam_range[1] - xlabel = "Time (ms)" - - else: - x = dataOut.spcparam_range[2] - xlabel = "Velocity (m/s)" - - ylabel = "Range (km)" - - y = dataOut.getHeiRange() - - z = dataOut.SPCparam[Selector] /1966080.0#/ dataOut.normFactor#GauSelector] #dataOut.data_spc/factor - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - zdB = 10*numpy.log10(z) - - avg = numpy.average(z, axis=1) - avgdB = 10*numpy.log10(avg) - - noise = dataOut.spc_noise - noisedB = 10*numpy.log10(noise) - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Spectra" - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith) - - if not self.isConfig: + p = 0.017453292519943295 + a = 0.5 - numpy.cos((lat2 - lat1) * p)/2 + numpy.cos(lat1 * p) * \ + numpy.cos(lat2 * p) * (1 - numpy.cos((lon2 - lon1) * p)) / 2 + r = 12742 * numpy.arcsin(numpy.sqrt(a)) + theta = numpy.arctan2(numpy.sin((lon2-lon1)*p)*numpy.cos(lat2*p), numpy.cos(lat1*p) + * numpy.sin(lat2*p)-numpy.sin(lat1*p)*numpy.cos(lat2*p)*numpy.cos((lon2-lon1)*p)) + theta = -theta + numpy.pi/2 + return r*numpy.cos(theta), r*numpy.sin(theta) - nplots = len(channelIndexList) - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) +def km2deg(km): + ''' + Convert distance in km to degrees + ''' - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3 - if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3 - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos + return numpy.rad2deg(km/EARTH_RADIUS) - self.isConfig = True - - self.setWinTitle(title) - for i in range(self.nplots): - index = channelIndexList[i] - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime) - if len(dataOut.beam.codeList) != 0: - title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[index], noisedB[index], dataOut.beam.azimuthList[index], dataOut.beam.zenithList[index], str_datetime) - axes = self.axesList[i*self.__nsubplots] - axes.pcolor(x, y, zdB[index,:,:], - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap, - ticksize=9, cblabel='') +class SpectralMomentsPlot(SpectraPlot): + ''' + Plot for Spectral Moments + ''' + CODE = 'spc_moments' + colormap = 'jet' + plot_type = 'pcolor' - if self.__showprofile: - axes = self.axesList[i*self.__nsubplots +1] - axes.pline(avgdB[index,:], y, - xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax, - xlabel='dB', ylabel='', title='', - ytick_visible=False, - grid='x') - noiseline = numpy.repeat(noisedB[index], len(y)) - axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) +class SnrPlot(RTIPlot): + ''' + Plot for SNR Data + ''' - self.draw() - - if figfile == None: - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") - name = str_datetime - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith) - figfile = self.getFilename(name) - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - - -class MomentsPlot_(Figure): + CODE = 'snr' + colormap = 'jet' - isConfig = None - __nsubplots = None + def update(self, dataOut): - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'prm' - def __init__(self): - Figure.__init__(self) - self.isConfig = False - self.__nsubplots = 1 + data = { + 'snr': 10*numpy.log10(dataOut.data_snr) + } - self.WIDTH = 280 - self.HEIGHT = 250 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = MOMENTS_CODE + return data, {} - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - def getSubplots(self): - - ncol = int(numpy.sqrt(self.nplots)+0.9) - nrow = int(self.nplots*1./ncol + 0.9) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - if showprofile: - ncolspan = 3 - colspan = 2 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() +class DopplerPlot(RTIPlot): + ''' + Plot for DOPPLER Data (1st moment) + ''' - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) + CODE = 'dop' + colormap = 'jet' - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True, - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False): + def update(self, dataOut): - """ + data = { + 'dop': 10*numpy.log10(dataOut.data_dop) + } - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ + return data, {} - if dataOut.flagNoData: - return None +class PowerPlot(RTIPlot): + ''' + Plot for Power Data (0 moment) + ''' - if realtime: - if not(isRealtime(utcdatatime = dataOut.utctime)): - print('Skipping this plot function') - return + CODE = 'pow' + colormap = 'jet' - if channelList == None: - channelIndexList = dataOut.channelIndexList - else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) - - factor = dataOut.normFactor - x = dataOut.abscissaList - y = dataOut.heightList - - z = dataOut.data_pre[channelIndexList,:,:]/factor - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - avg = numpy.average(z, axis=1) - noise = dataOut.noise/factor - - zdB = 10*numpy.log10(z) - avgdB = 10*numpy.log10(avg) - noisedB = 10*numpy.log10(noise) - - #thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Parameters" - xlabel = "Velocity (m/s)" - ylabel = "Range (Km)" - - update_figfile = False - - if not self.isConfig: - - nplots = len(channelIndexList) + def update(self, dataOut): - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.nanmin(avgdB)*0.9 - if zmax == None: zmax = numpy.nanmax(avgdB)*0.9 - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.isConfig = True - update_figfile = True - - self.setWinTitle(title) - - for i in range(self.nplots): - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[i], noisedB[i], str_datetime) - axes = self.axesList[i*self.__nsubplots] - axes.pcolor(x, y, zdB[i,:,:], - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, - ticksize=9, cblabel='') - #Mean Line - mean = dataOut.data_param[i, 1, :] - axes.addpline(mean, y, idline=0, color="black", linestyle="solid", lw=1) - - if self.__showprofile: - axes = self.axesList[i*self.__nsubplots +1] - axes.pline(avgdB[i], y, - xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax, - xlabel='dB', ylabel='', title='', - ytick_visible=False, - grid='x') - - noiseline = numpy.repeat(noisedB[i], len(y)) - axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - -class SkyMapPlot_(Figure): - - __isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'mmap' - - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) - self.isConfig = False - self.__nsubplots = 1 - - # self.WIDTH = 280 - # self.HEIGHT = 250 - self.WIDTH = 600 - self.HEIGHT = 600 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = MSKYMAP_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - def getSubplots(self): - - ncol = int(numpy.sqrt(self.nplots)+0.9) - nrow = int(self.nplots*1./ncol + 0.9) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=False, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH, #+ self.WIDTHPROF, - heightplot = self.HEIGHT,# + self.HEIGHTPROF, - show=show) - - nrow, ncol = 1,1 - counter = 0 - x = 0 - y = 0 - self.addAxes(1, 1, 0, 0, 1, 1, True) - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False, - tmin=0, tmax=24, timerange=None, - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - - arrayParameters = dataOut.data_param - error = arrayParameters[:,-1] - indValid = numpy.where(error == 0)[0] - finalMeteor = arrayParameters[indValid,:] - finalAzimuth = finalMeteor[:,3] - finalZenith = finalMeteor[:,4] + data = { + 'pow': 10*numpy.log10(dataOut.data_pow) + } - x = finalAzimuth*numpy.pi/180 - y = finalZenith - x1 = [dataOut.ltctime, dataOut.ltctime] + return data, {} - #thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime) - title = wintitle + " Parameters" - xlabel = "Zonal Zenith Angle (deg) " - ylabel = "Meridional Zenith Angle (deg)" - update_figfile = False +class SpectralWidthPlot(RTIPlot): + ''' + Plot for Spectral Width Data (2nd moment) + ''' - if not self.isConfig: + CODE = 'width' + colormap = 'jet' - nplots = 1 + def update(self, dataOut): - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) + data = { + 'width': dataOut.data_width + } - if self.xmin is None and self.xmax is None: - self.xmin, self.xmax = self.getTimeLim(x1, tmin, tmax, timerange) + return data, {} - if timerange != None: - self.timerange = timerange - else: - self.timerange = self.xmax - self.xmin +class SkyMapPlot(Plot): + ''' + Plot for meteors detection data + ''' - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.firstdate = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - self.isConfig = True - update_figfile = True + CODE = 'param' - self.setWinTitle(title) + def setup(self): - i = 0 - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) + self.ncols = 1 + self.nrows = 1 + self.width = 7.2 + self.height = 7.2 + self.nplots = 1 + self.xlabel = 'Zonal Zenith Angle (deg)' + self.ylabel = 'Meridional Zenith Angle (deg)' + self.polar = True + self.ymin = -180 + self.ymax = 180 + self.colorbar = False - axes = self.axesList[i*self.__nsubplots] - nevents = axes.x_buffer.shape[0] + x.shape[0] - title = "Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n" %(self.firstdate,str_datetime,nevents) - axes.polar(x, y, - title=title, xlabel=xlabel, ylabel=ylabel, - ticksize=9, cblabel='') + def plot(self): - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) - - if dataOut.ltctime >= self.xmax: - self.isConfigmagwr = wr_period - self.isConfig = False - update_figfile = True - axes.__firsttime = True - self.xmin += self.timerange - self.xmax += self.timerange - - - -@MPDecorator -class WindProfilerPlot_(Figure): - - __isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'wind' - - def __init__(self): - Figure.__init__(self) - self.timerange = None - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 800 - self.HEIGHT = 300 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = WIND_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - self.tmin = None - self.tmax = None - - self.xmin = None - self.xmax = None - - self.figfile = None - - def getSubplots(self): - - ncol = 1 - nrow = self.nplots - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1) - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile='False', - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - zmax_ver = None, zmin_ver = None, SNRmin = None, SNRmax = None, - timerange=None, SNRthresh = None, - save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - - if dataOut.flagNoData: - return dataOut - - # if timerange is not None: - # self.timerange = timerange - # - # tmin = None - # tmax = None - - x = dataOut.getTimeRange1(dataOut.paramInterval) - y = dataOut.heightList - z = dataOut.data_output.copy() - nplots = z.shape[0] #Number of wind dimensions estimated - nplotsw = nplots - - - #If there is a SNR function defined - if dataOut.data_SNR is not None: - nplots += 1 - SNR = dataOut.data_SNR[0] - SNRavg = SNR#numpy.average(SNR, axis=0) - - SNRdB = 10*numpy.log10(SNR) - SNRavgdB = 10*numpy.log10(SNRavg) - - if SNRthresh == None: - SNRthresh = -5.0 - ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0] - - for i in range(nplotsw): - z[i,ind] = numpy.nan - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime) - #thisDatetime = datetime.datetime.now() - title = wintitle + "Wind" - xlabel = "" - ylabel = "Height (km)" - update_figfile = False - - if not self.isConfig: - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - if timerange is not None: - self.timerange = timerange - - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) - - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - - if zmax == None: zmax = numpy.nanmax(abs(z[list(range(2)),:])) - #if numpy.isnan(zmax): zmax = 50 - if zmin == None: zmin = -zmax - - if nplotsw == 3: - if zmax_ver == None: zmax_ver = numpy.nanmax(abs(z[2,:])) - if zmin_ver == None: zmin_ver = -zmax_ver - - if dataOut.data_SNR is not None: - if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB) - if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB) + arrayParameters = numpy.concatenate(self.data['param']) + error = arrayParameters[:, -1] + indValid = numpy.where(error == 0)[0] + finalMeteor = arrayParameters[indValid, :] + finalAzimuth = finalMeteor[:, 3] + finalZenith = finalMeteor[:, 4] + x = finalAzimuth * numpy.pi / 180 + y = finalZenith - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - self.figfile = figfile - update_figfile = True + ax = self.axes[0] - self.setWinTitle(title) + if ax.firsttime: + ax.plot = ax.plot(x, y, 'bo', markersize=5)[0] + else: + ax.plot.set_data(x, y) - if ((self.xmax - x[1]) < (x[1]-x[0])): - x[1] = self.xmax + dt1 = self.getDateTime(self.data.min_time).strftime('%y/%m/%d %H:%M:%S') + dt2 = self.getDateTime(self.data.max_time).strftime('%y/%m/%d %H:%M:%S') + title = 'Meteor Detection Sky Map\n %s - %s \n Number of events: %5.0f\n' % (dt1, + dt2, + len(x)) + self.titles[0] = title - strWind = ['Zonal', 'Meridional', 'Vertical'] - strCb = ['Velocity (m/s)','Velocity (m/s)','Velocity (cm/s)'] - zmaxVector = [zmax, zmax, zmax_ver] - zminVector = [zmin, zmin, zmin_ver] - windFactor = [1,1,100] - for i in range(nplotsw): +class GenericRTIPlot(Plot): + ''' + Plot for data_xxxx object + ''' - title = "%s Wind: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[i*self.__nsubplots] + CODE = 'param' + colormap = 'viridis' + plot_type = 'pcolorbuffer' - z1 = z[i,:].reshape((1,-1))*windFactor[i] - - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i], - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel=strCb[i], cbsize="1%", colormap="seismic" ) + def setup(self): + self.xaxis = 'time' + self.ncols = 1 + self.nrows = self.data.shape('param')[0] + self.nplots = self.nrows + self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95, 'top': 0.95}) + + if not self.xlabel: + self.xlabel = 'Time' - if dataOut.data_SNR is not None: - i += 1 - title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[i*self.__nsubplots] - SNRavgdB = SNRavgdB.reshape((1,-1)) - axes.pcolorbuffer(x, y, SNRavgdB, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%", colormap="jet") + self.ylabel = 'Height [km]' + if not self.titles: + self.titles = ['Param {}'.format(x) for x in range(self.nrows)] - self.draw() + def update(self, dataOut): - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) + data = { + 'param' : numpy.concatenate([getattr(dataOut, attr) for attr in self.attr_data], axis=0) + } - if dataOut.ltctime + dataOut.paramInterval >= self.xmax: - self.counter_imagwr = wr_period - self.isConfig = False - update_figfile = True - - return dataOut - -@MPDecorator -class ParametersPlot_(Figure): - - __isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'param' + meta = {} - nplots = None - nchan = None + return data, meta + + def plot(self): + # self.data.normalize_heights() + self.x = self.data.times + self.y = self.data.yrange + self.z = self.data['param'] - def __init__(self):#, **kwargs): - Figure.__init__(self)#, **kwargs) - self.timerange = None - self.isConfig = False - self.__nsubplots = 1 + self.z = numpy.ma.masked_invalid(self.z) - self.WIDTH = 300 - self.HEIGHT = 550 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = RTI_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - self.tmin = None - self.tmax = None - - self.xmin = None - self.xmax = None - - self.figfile = None - - def getSubplots(self): - - ncol = 1 - nrow = self.nplots - - return nrow, ncol - - def setup(self, id, nplots, wintitle, show=True): - - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, paramIndex = 0, colormap="jet", - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, timerange=None, - showSNR=False, SNRthresh = -numpy.inf, SNRmin=None, SNRmax=None, - save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, HEIGHT=None): - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - if dataOut.flagNoData: - return dataOut - - - if HEIGHT is not None: - self.HEIGHT = HEIGHT - - - if not isTimeInHourRange(dataOut.datatime, xmin, xmax): - return - - if channelList == None: - channelIndexList = list(range(dataOut.data_param.shape[0])) + if self.decimation is None: + x, y, z = self.fill_gaps(self.x, self.y, self.z) else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) + x, y, z = self.fill_gaps(*self.decimate()) - x = dataOut.getTimeRange1(dataOut.paramInterval) - y = dataOut.getHeiRange() + for n, ax in enumerate(self.axes): - if dataOut.data_param.ndim == 3: - z = dataOut.data_param[channelIndexList,paramIndex,:] - else: - z = dataOut.data_param[channelIndexList,:] - - if showSNR: - #SNR data - SNRarray = dataOut.data_SNR[channelIndexList,:] - SNRdB = 10*numpy.log10(SNRarray) - ind = numpy.where(SNRdB < SNRthresh) - z[ind] = numpy.nan - - thisDatetime = dataOut.datatime - # thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "" - ylabel = "Range (km)" - - update_figfile = False - - if not self.isConfig: - - nchan = len(channelIndexList) - self.nchan = nchan - self.plotFact = 1 - nplots = nchan - - if showSNR: - nplots = nchan*2 - self.plotFact = 2 - if SNRmin == None: SNRmin = numpy.nanmin(SNRdB) - if SNRmax == None: SNRmax = numpy.nanmax(SNRdB) - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - show=show) - - if timerange != None: - self.timerange = timerange - - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) - - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.nanmin(z) - if zmax == None: zmax = numpy.nanmax(z) - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - self.figfile = figfile - update_figfile = True - - self.setWinTitle(title) - - # for i in range(self.nchan): - # index = channelIndexList[i] - # title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - # axes = self.axesList[i*self.plotFact] - # z1 = z[i,:].reshape((1,-1)) - # axes.pcolorbuffer(x, y, z1, - # xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - # xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - # ticksize=9, cblabel='', cbsize="1%",colormap=colormap) - # - # if showSNR: - # title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - # axes = self.axesList[i*self.plotFact + 1] - # SNRdB1 = SNRdB[i,:].reshape((1,-1)) - # axes.pcolorbuffer(x, y, SNRdB1, - # xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, - # xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - # ticksize=9, cblabel='', cbsize="1%",colormap='jet') - - i=0 - index = channelIndexList[i] - title = "Factor de reflectividad Z [dBZ]" - axes = self.axesList[i*self.plotFact] - z1 = z[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%",colormap=colormap) - - if showSNR: - title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[i*self.plotFact + 1] - SNRdB1 = SNRdB[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, SNRdB1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%",colormap='jet') - - i=1 - index = channelIndexList[i] - title = "Velocidad vertical Doppler [m/s]" - axes = self.axesList[i*self.plotFact] - z1 = z[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=-10, zmax=10, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%",colormap='seismic_r') - - if showSNR: - title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[i*self.plotFact + 1] - SNRdB1 = SNRdB[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, SNRdB1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%",colormap='jet') - - i=2 - index = channelIndexList[i] - title = "Intensidad de lluvia [mm/h]" - axes = self.axesList[i*self.plotFact] - z1 = z[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=0, zmax=40, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%",colormap='ocean_r') - - if showSNR: - title = "Channel %d SNR: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[i*self.plotFact + 1] - SNRdB1 = SNRdB[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, SNRdB1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%",colormap='jet') - - - self.draw() - - if dataOut.ltctime >= self.xmax: - self.counter_imagwr = wr_period - self.isConfig = False - update_figfile = True - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) - - return dataOut -@MPDecorator -class Parameters1Plot_(Figure): - - __isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'prm' - - def __init__(self): - Figure.__init__(self) - self.timerange = 2*60*60 - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 800 - self.HEIGHT = 180 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = PARMS_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - self.tmin = None - self.tmax = None - - self.xmin = None - self.xmax = None - - self.figfile = None - - def getSubplots(self): - - ncol = 1 - nrow = self.nplots - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile=False, - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None,timerange=None, - parameterIndex = None, onlyPositive = False, - SNRthresh = -numpy.inf, SNR = True, SNRmin = None, SNRmax = None, onlySNR = False, - DOP = True, - zlabel = "", parameterName = "", parameterObject = "data_param", - save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): + self.zmax = self.zmax if self.zmax is not None else numpy.max( + self.z[n]) + self.zmin = self.zmin if self.zmin is not None else numpy.min( + self.z[n]) - """ - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - if dataOut.flagNoData: - return dataOut - - data_param = getattr(dataOut, parameterObject) + if ax.firsttime: + if self.zlimits is not None: + self.zmin, self.zmax = self.zlimits[n] - if channelList == None: - channelIndexList = numpy.arange(data_param.shape[0]) + ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n], + vmin=self.zmin, + vmax=self.zmax, + cmap=self.cmaps[n] + ) + else: + if self.zlimits is not None: + self.zmin, self.zmax = self.zlimits[n] + ax.collections.remove(ax.collections[0]) + ax.plt = ax.pcolormesh(x, y, z[n].T * self.factors[n], + vmin=self.zmin, + vmax=self.zmax, + cmap=self.cmaps[n] + ) + + +class PolarMapPlot(Plot): + ''' + Plot for weather radar + ''' + + CODE = 'param' + colormap = 'seismic' + + def setup(self): + self.ncols = 1 + self.nrows = 1 + self.width = 9 + self.height = 8 + self.mode = self.data.meta['mode'] + if self.channels is not None: + self.nplots = len(self.channels) + self.nrows = len(self.channels) else: - channelIndexList = numpy.array(channelList) - - nchan = len(channelIndexList) #Number of channels being plotted - - if nchan < 1: - return - - nGraphsByChannel = 0 - - if SNR: - nGraphsByChannel += 1 - if DOP: - nGraphsByChannel += 1 - - if nGraphsByChannel < 1: - return - - nplots = nGraphsByChannel*nchan - - if timerange is not None: - self.timerange = timerange - - #tmin = None - #tmax = None - if parameterIndex == None: - parameterIndex = 1 - - x = dataOut.getTimeRange1(dataOut.paramInterval) - y = dataOut.heightList - - if dataOut.data_param.ndim == 3: - z = dataOut.data_param[channelIndexList,parameterIndex,:] + self.nplots = self.data.shape(self.CODE)[0] + self.nrows = self.nplots + self.channels = list(range(self.nplots)) + if self.mode == 'E': + self.xlabel = 'Longitude' + self.ylabel = 'Latitude' else: - z = dataOut.data_param[channelIndexList,:] - - if dataOut.data_SNR is not None: - if dataOut.data_SNR.ndim == 2: - SNRavg = numpy.average(dataOut.data_SNR, axis=0) + self.xlabel = 'Range (km)' + self.ylabel = 'Height (km)' + self.bgcolor = 'white' + self.cb_labels = self.data.meta['units'] + self.lat = self.data.meta['latitude'] + self.lon = self.data.meta['longitude'] + self.xmin, self.xmax = float( + km2deg(self.xmin) + self.lon), float(km2deg(self.xmax) + self.lon) + self.ymin, self.ymax = float( + km2deg(self.ymin) + self.lat), float(km2deg(self.ymax) + self.lat) + # self.polar = True + + def plot(self): + + for n, ax in enumerate(self.axes): + data = self.data['param'][self.channels[n]] + + zeniths = numpy.linspace( + 0, self.data.meta['max_range'], data.shape[1]) + if self.mode == 'E': + azimuths = -numpy.radians(self.data.yrange)+numpy.pi/2 + r, theta = numpy.meshgrid(zeniths, azimuths) + x, y = r*numpy.cos(theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])), r*numpy.sin( + theta)*numpy.cos(numpy.radians(self.data.meta['elevation'])) + x = km2deg(x) + self.lon + y = km2deg(y) + self.lat else: - SNRavg = dataOut.data_SNR - SNRdB = 10*numpy.log10(SNRavg) - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Parameters Plot" #: %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "" - ylabel = "Range (Km)" - - if onlyPositive: - colormap = "jet" - zmin = 0 - else: colormap = "RdBu_r" - - if not self.isConfig: - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) - - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.nanmin(z) - if zmax == None: zmax = numpy.nanmax(z) - - if SNR: - if SNRmin == None: SNRmin = numpy.nanmin(SNRdB) - if SNRmax == None: SNRmax = numpy.nanmax(SNRdB) - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - self.figfile = figfile - - self.setWinTitle(title) - - if ((self.xmax - x[1]) < (x[1]-x[0])): - x[1] = self.xmax - - for i in range(nchan): - - if (SNR and not onlySNR): j = 2*i - else: j = i - - j = nGraphsByChannel*i - - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith) - - if not onlySNR: - axes = self.axesList[j*self.__nsubplots] - z1 = z[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap, - ticksize=9, cblabel=zlabel, cbsize="1%") - - if DOP: - title = "%s Channel %d: %s" %(parameterName, channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith) - axes = self.axesList[j] - z1 = z[i,:].reshape((1,-1)) - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap=colormap, - ticksize=9, cblabel=zlabel, cbsize="1%") - - if SNR: - title = "Channel %d Signal Noise Ratio (SNR): %s" %(channelIndexList[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[(j)*self.__nsubplots] - if not onlySNR: - axes = self.axesList[(j + 1)*self.__nsubplots] - - axes = self.axesList[(j + nGraphsByChannel-1)] - z1 = SNRdB.reshape((1,-1)) - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True,colormap="jet", - ticksize=9, cblabel=zlabel, cbsize="1%") - - - - self.draw() - - if x[1] >= self.axesList[0].xmax: - self.counter_imagwr = wr_period - self.isConfig = False - self.figfile = None - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=False) - return dataOut - -class SpectralFittingPlot_(Figure): - - __isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'prm' - - - N = None - ippSeconds = None - - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) - self.isConfig = False - self.__nsubplots = 1 - - self.PLOT_CODE = SPECFIT_CODE - - self.WIDTH = 450 - self.HEIGHT = 250 - self.WIDTHPROF = 0 - self.HEIGHTPROF = 0 - - def getSubplots(self): - - ncol = int(numpy.sqrt(self.nplots)+0.9) - nrow = int(self.nplots*1./ncol + 0.9) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=False, show=True): - - showprofile = False - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 5 - colspan = 4 - if showprofile: - ncolspan = 5 - colspan = 4 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) - - counter += 1 - - def run(self, dataOut, id, cutHeight=None, fit=False, wintitle="", channelList=None, showprofile=True, - xmin=None, xmax=None, ymin=None, ymax=None, - save=False, figpath='./', figfile=None, show=True): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - zmin : None, - zmax : None - """ - - if cutHeight==None: - h=270 - heightindex = numpy.abs(cutHeight - dataOut.heightList).argmin() - cutHeight = dataOut.heightList[heightindex] - - factor = dataOut.normFactor - x = dataOut.abscissaList[:-1] - #y = dataOut.getHeiRange() - - z = dataOut.data_pre[:,:,heightindex]/factor - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - avg = numpy.average(z, axis=1) - listChannels = z.shape[0] - - #Reconstruct Function - if fit==True: - groupArray = dataOut.groupList - listChannels = groupArray.reshape((groupArray.size)) - listChannels.sort() - spcFitLine = numpy.zeros(z.shape) - constants = dataOut.constants - - nGroups = groupArray.shape[0] - nChannels = groupArray.shape[1] - nProfiles = z.shape[1] - - for f in range(nGroups): - groupChann = groupArray[f,:] - p = dataOut.data_param[f,:,heightindex] - # p = numpy.array([ 89.343967,0.14036615,0.17086219,18.89835291,1.58388365,1.55099167]) - fitLineAux = dataOut.library.modelFunction(p, constants)*nProfiles - fitLineAux = fitLineAux.reshape((nChannels,nProfiles)) - spcFitLine[groupChann,:] = fitLineAux - # spcFitLine = spcFitLine/factor - - z = z[listChannels,:] - spcFitLine = spcFitLine[listChannels,:] - spcFitLinedB = 10*numpy.log10(spcFitLine) - - zdB = 10*numpy.log10(z) - #thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Doppler Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - xlabel = "Velocity (m/s)" - ylabel = "Spectrum" - - if not self.isConfig: - - nplots = listChannels.size - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(zdB) - if ymax == None: ymax = numpy.nanmax(zdB)+2 - - self.isConfig = True - - self.setWinTitle(title) - for i in range(self.nplots): - # title = "Channel %d: %4.2fdB" %(dataOut.channelList[i]+1, noisedB[i]) - title = "Height %4.1f km\nChannel %d:" %(cutHeight, listChannels[i]) - axes = self.axesList[i*self.__nsubplots] - if fit == False: - axes.pline(x, zdB[i,:], - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title - ) - if fit == True: - fitline=spcFitLinedB[i,:] - y=numpy.vstack([zdB[i,:],fitline] ) - legendlabels=['Data','Fitting'] - axes.pmultilineyaxis(x, y, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title, - legendlabels=legendlabels, marker=None, - linestyle='solid', grid='both') - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - -class EWDriftsPlot_(Figure): - - __isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'drift' - - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) - self.timerange = 2*60*60 - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 800 - self.HEIGHT = 150 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = EWDRIFT_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - self.tmin = None - self.tmax = None - - self.xmin = None - self.xmax = None - - self.figfile = None - - def getSubplots(self): - - ncol = 1 - nrow = self.nplots - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, 0, colspan, 1) - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - zmaxVertical = None, zminVertical = None, zmaxZonal = None, zminZonal = None, - timerange=None, SNRthresh = -numpy.inf, SNRmin = None, SNRmax = None, SNR_1 = False, - save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - - if timerange is not None: - self.timerange = timerange - - tmin = None - tmax = None - - x = dataOut.getTimeRange1(dataOut.outputInterval) - # y = dataOut.heightList - y = dataOut.heightList - - z = dataOut.data_output - nplots = z.shape[0] #Number of wind dimensions estimated - nplotsw = nplots - - #If there is a SNR function defined - if dataOut.data_SNR is not None: - nplots += 1 - SNR = dataOut.data_SNR - - if SNR_1: - SNR += 1 - - SNRavg = numpy.average(SNR, axis=0) - - SNRdB = 10*numpy.log10(SNR) - SNRavgdB = 10*numpy.log10(SNRavg) - - ind = numpy.where(SNRavg < 10**(SNRthresh/10))[0] - - for i in range(nplotsw): - z[i,ind] = numpy.nan - - - showprofile = False - # thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(x[1]) - title = wintitle + " EW Drifts" - xlabel = "" - ylabel = "Height (Km)" - - if not self.isConfig: - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) - - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - - if zmaxZonal == None: zmaxZonal = numpy.nanmax(abs(z[0,:])) - if zminZonal == None: zminZonal = -zmaxZonal - if zmaxVertical == None: zmaxVertical = numpy.nanmax(abs(z[1,:])) - if zminVertical == None: zminVertical = -zmaxVertical - - if dataOut.data_SNR is not None: - if SNRmin == None: SNRmin = numpy.nanmin(SNRavgdB) - if SNRmax == None: SNRmax = numpy.nanmax(SNRavgdB) - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - - - self.setWinTitle(title) - - if ((self.xmax - x[1]) < (x[1]-x[0])): - x[1] = self.xmax - - strWind = ['Zonal','Vertical'] - strCb = 'Velocity (m/s)' - zmaxVector = [zmaxZonal, zmaxVertical] - zminVector = [zminZonal, zminVertical] - - for i in range(nplotsw): - - title = "%s Drifts: %s" %(strWind[i], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[i*self.__nsubplots] - - z1 = z[i,:].reshape((1,-1)) - - axes.pcolorbuffer(x, y, z1, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zminVector[i], zmax=zmaxVector[i], - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel=strCb, cbsize="1%", colormap="RdBu_r") - - if dataOut.data_SNR is not None: - i += 1 - if SNR_1: - title = "Signal Noise Ratio + 1 (SNR+1): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) + azimuths = numpy.radians(self.data.yrange) + r, theta = numpy.meshgrid(zeniths, azimuths) + x, y = r*numpy.cos(theta), r*numpy.sin(theta) + self.y = zeniths + + if ax.firsttime: + if self.zlimits is not None: + self.zmin, self.zmax = self.zlimits[n] + ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)), + x, y, numpy.ma.array(data, mask=numpy.isnan(data)), + vmin=self.zmin, + vmax=self.zmax, + cmap=self.cmaps[n]) else: - title = "Signal Noise Ratio (SNR): %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - axes = self.axesList[i*self.__nsubplots] - SNRavgdB = SNRavgdB.reshape((1,-1)) - - axes.pcolorbuffer(x, y, SNRavgdB, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=SNRmin, zmax=SNRmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%", colormap="jet") - - self.draw() - - if x[1] >= self.axesList[0].xmax: - self.counter_imagwr = wr_period - self.isConfig = False - self.figfile = None - - - - -class PhasePlot_(Figure): - - __isConfig = None - __nsubplots = None - - PREFIX = 'mphase' - - - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) - self.timerange = 24*60*60 - self.isConfig = False - self.__nsubplots = 1 - self.counter_imagwr = 0 - self.WIDTH = 600 - self.HEIGHT = 300 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.xdata = None - self.ydata = None - - self.PLOT_CODE = MPHASE_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - - self.filename_phase = None - - self.figfile = None - - def getSubplots(self): - - ncol = 1 - nrow = 1 - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 7 - colspan = 6 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH+self.WIDTHPROF, - heightplot = self.HEIGHT+self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1) - - - def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True', - xmin=None, xmax=None, ymin=None, ymax=None, - timerange=None, - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): - - - tmin = None - tmax = None - x = dataOut.getTimeRange1(dataOut.outputInterval) - y = dataOut.getHeiRange() - - - #thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime) - title = wintitle + " Phase of Beacon Signal" # : %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "Local Time" - ylabel = "Phase" - - - #phase = numpy.zeros((len(pairsIndexList),len(dataOut.beacon_heiIndexList))) - phase_beacon = dataOut.data_output - update_figfile = False - - if not self.isConfig: - - self.nplots = phase_beacon.size - - self.setup(id=id, - nplots=self.nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - if timerange is not None: - self.timerange = timerange - - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) - - if ymin == None: ymin = numpy.nanmin(phase_beacon) - 10.0 - if ymax == None: ymax = numpy.nanmax(phase_beacon) + 10.0 - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - self.figfile = figfile - self.xdata = numpy.array([]) - self.ydata = numpy.array([]) - - #open file beacon phase - path = '%s%03d' %(self.PREFIX, self.id) - beacon_file = os.path.join(path,'%s.txt'%self.name) - self.filename_phase = os.path.join(figpath,beacon_file) - update_figfile = True - - - #store data beacon phase - #self.save_data(self.filename_phase, phase_beacon, thisDatetime) - - self.setWinTitle(title) - - - title = "Phase Offset %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - - legendlabels = ["phase %d"%(chan) for chan in numpy.arange(self.nplots)] - - axes = self.axesList[0] - - self.xdata = numpy.hstack((self.xdata, x[0:1])) - - if len(self.ydata)==0: - self.ydata = phase_beacon.reshape(-1,1) + if self.zlimits is not None: + self.zmin, self.zmax = self.zlimits[n] + ax.collections.remove(ax.collections[0]) + ax.plt = ax.pcolormesh( # r, theta, numpy.ma.array(data, mask=numpy.isnan(data)), + x, y, numpy.ma.array(data, mask=numpy.isnan(data)), + vmin=self.zmin, + vmax=self.zmax, + cmap=self.cmaps[n]) + + if self.mode == 'A': + continue + + # plot district names + f = open('/data/workspace/schain_scripts/distrito.csv') + for line in f: + label, lon, lat = [s.strip() for s in line.split(',') if s] + lat = float(lat) + lon = float(lon) + # ax.plot(lon, lat, '.b', ms=2) + ax.text(lon, lat, label.decode('utf8'), ha='center', + va='bottom', size='8', color='black') + + # plot limites + limites = [] + tmp = [] + for line in open('/data/workspace/schain_scripts/lima.csv'): + if '#' in line: + if tmp: + limites.append(tmp) + tmp = [] + continue + values = line.strip().split(',') + tmp.append((float(values[0]), float(values[1]))) + for points in limites: + ax.add_patch( + Polygon(points, ec='k', fc='none', ls='--', lw=0.5)) + + # plot Cuencas + for cuenca in ('rimac', 'lurin', 'mala', 'chillon', 'chilca', 'chancay-huaral'): + f = open('/data/workspace/schain_scripts/{}.csv'.format(cuenca)) + values = [line.strip().split(',') for line in f] + points = [(float(s[0]), float(s[1])) for s in values] + ax.add_patch(Polygon(points, ec='b', fc='none')) + + # plot grid + for r in (15, 30, 45, 60): + ax.add_artist(plt.Circle((self.lon, self.lat), + km2deg(r), color='0.6', fill=False, lw=0.2)) + ax.text( + self.lon + (km2deg(r))*numpy.cos(60*numpy.pi/180), + self.lat + (km2deg(r))*numpy.sin(60*numpy.pi/180), + '{}km'.format(r), + ha='center', va='bottom', size='8', color='0.6', weight='heavy') + + if self.mode == 'E': + title = 'El={}$^\circ$'.format(self.data.meta['elevation']) + label = 'E{:02d}'.format(int(self.data.meta['elevation'])) else: - self.ydata = numpy.hstack((self.ydata, phase_beacon.reshape(-1,1))) - - - axes.pmultilineyaxis(x=self.xdata, y=self.ydata, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid", - XAxisAsTime=True, grid='both' - ) - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) - - if dataOut.ltctime + dataOut.outputInterval >= self.xmax: - self.counter_imagwr = wr_period - self.isConfig = False - update_figfile = True - - - -class NSMeteorDetection1Plot_(Figure): - - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'nsm' - - zminList = None - zmaxList = None - cmapList = None - titleList = None - nPairs = None - nChannels = None - nParam = None - - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 750 - self.HEIGHT = 250 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = SPEC_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - self.__xfilter_ena = False - self.__yfilter_ena = False - - def getSubplots(self): - - ncol = 3 - nrow = int(numpy.ceil(self.nplots/3.0)) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, show=True): - - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True, - xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None, - vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA', - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False, - xaxis="frequency"): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - #SEPARAR EN DOS PLOTS - nParam = dataOut.data_param.shape[1] - 3 - - utctime = dataOut.data_param[0,0] - tmet = dataOut.data_param[:,1].astype(int) - hmet = dataOut.data_param[:,2].astype(int) - - x = dataOut.abscissaList - y = dataOut.heightList - - z = numpy.zeros((nParam, y.size, x.size - 1)) - z[:,:] = numpy.nan - z[:,hmet,tmet] = dataOut.data_param[:,3:].T - z[0,:,:] = 10*numpy.log10(z[0,:,:]) - - xlabel = "Time (s)" - ylabel = "Range (km)" - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime) - - if not self.isConfig: - - nplots = nParam - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - show=show) - - if xmin is None: xmin = numpy.nanmin(x) - if xmax is None: xmax = numpy.nanmax(x) - if ymin is None: ymin = numpy.nanmin(y) - if ymax is None: ymax = numpy.nanmax(y) - if SNRmin is None: SNRmin = numpy.nanmin(z[0,:]) - if SNRmax is None: SNRmax = numpy.nanmax(z[0,:]) - if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:])) - if vmin is None: vmin = -vmax - if wmin is None: wmin = 0 - if wmax is None: wmax = 50 - - pairsList = dataOut.groupList - self.nPairs = len(dataOut.groupList) - - zminList = [SNRmin, vmin, cmin] + [pmin]*self.nPairs - zmaxList = [SNRmax, vmax, cmax] + [pmax]*self.nPairs - titleList = ["SNR","Radial Velocity","Coherence"] - cmapList = ["jet","RdBu_r","jet"] + title = 'Az={}$^\circ$'.format(self.data.meta['azimuth']) + label = 'A{:02d}'.format(int(self.data.meta['azimuth'])) - for i in range(self.nPairs): - strAux1 = "Phase Difference "+ str(pairsList[i][0]) + str(pairsList[i][1]) - titleList = titleList + [strAux1] - cmapList = cmapList + ["RdBu_r"] - - self.zminList = zminList - self.zmaxList = zmaxList - self.cmapList = cmapList - self.titleList = titleList - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos + self.save_labels = ['{}-{}'.format(lbl, label) for lbl in self.labels] + self.titles = ['{} {}'.format( + self.data.parameters[x], title) for x in self.channels] - self.isConfig = True - - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - - for i in range(nParam): - title = self.titleList[i] + ": " +str_datetime - axes = self.axesList[i] - axes.pcolor(x, y, z[i,:].T, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i], - xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='') - self.draw() - - if figfile == None: - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") - name = str_datetime - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith) - figfile = self.getFilename(name) - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - -class NSMeteorDetection2Plot_(Figure): - - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'nsm' - - zminList = None - zmaxList = None - cmapList = None - titleList = None - nPairs = None - nChannels = None - nParam = None - - def __init__(self, **kwargs): - Figure.__init__(self, **kwargs) - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 750 - self.HEIGHT = 250 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = SPEC_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - self.__xfilter_ena = False - self.__yfilter_ena = False - - def getSubplots(self): - - ncol = 3 - nrow = int(numpy.ceil(self.nplots/3.0)) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, show=True): - - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True, - xmin=None, xmax=None, ymin=None, ymax=None, SNRmin=None, SNRmax=None, - vmin=None, vmax=None, wmin=None, wmax=None, mode = 'SA', - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False, - xaxis="frequency"): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - #Rebuild matrix - utctime = dataOut.data_param[0,0] - cmet = dataOut.data_param[:,1].astype(int) - tmet = dataOut.data_param[:,2].astype(int) - hmet = dataOut.data_param[:,3].astype(int) - - nParam = 3 - nChan = len(dataOut.groupList) - x = dataOut.abscissaList - y = dataOut.heightList - - z = numpy.full((nChan, nParam, y.size, x.size - 1),numpy.nan) - z[cmet,:,hmet,tmet] = dataOut.data_param[:,4:] - z[:,0,:,:] = 10*numpy.log10(z[:,0,:,:]) #logarithmic scale - z = numpy.reshape(z, (nChan*nParam, y.size, x.size-1)) - - xlabel = "Time (s)" - ylabel = "Range (km)" - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.ltctime) - - if not self.isConfig: - - nplots = nParam*nChan - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - show=show) - - if xmin is None: xmin = numpy.nanmin(x) - if xmax is None: xmax = numpy.nanmax(x) - if ymin is None: ymin = numpy.nanmin(y) - if ymax is None: ymax = numpy.nanmax(y) - if SNRmin is None: SNRmin = numpy.nanmin(z[0,:]) - if SNRmax is None: SNRmax = numpy.nanmax(z[0,:]) - if vmax is None: vmax = numpy.nanmax(numpy.abs(z[1,:])) - if vmin is None: vmin = -vmax - if wmin is None: wmin = 0 - if wmax is None: wmax = 50 - - self.nChannels = nChan - - zminList = [] - zmaxList = [] - titleList = [] - cmapList = [] - for i in range(self.nChannels): - strAux1 = "SNR Channel "+ str(i) - strAux2 = "Radial Velocity Channel "+ str(i) - strAux3 = "Spectral Width Channel "+ str(i) - - titleList = titleList + [strAux1,strAux2,strAux3] - cmapList = cmapList + ["jet","RdBu_r","jet"] - zminList = zminList + [SNRmin,vmin,wmin] - zmaxList = zmaxList + [SNRmax,vmax,wmax] - - self.zminList = zminList - self.zmaxList = zmaxList - self.cmapList = cmapList - self.titleList = titleList - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.isConfig = True - - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - - for i in range(self.nplots): - title = self.titleList[i] + ": " +str_datetime - axes = self.axesList[i] - axes.pcolor(x, y, z[i,:].T, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=self.zminList[i], zmax=self.zmaxList[i], - xlabel=xlabel, ylabel=ylabel, title=title, colormap=self.cmapList[i],ticksize=9, cblabel='') - self.draw() - - if figfile == None: - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") - name = str_datetime - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith) - figfile = self.getFilename(name) - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - \ No newline at end of file diff --git a/schainpy/model/graphics/jroplot_spectra.py b/schainpy/model/graphics/jroplot_spectra.py index c3a39fe..8a5d813 100644 --- a/schainpy/model/graphics/jroplot_spectra.py +++ b/schainpy/model/graphics/jroplot_spectra.py @@ -1,1363 +1,476 @@ -''' -Created on Jul 9, 2014 +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""Classes to plot Spectra data -@author: roj-idl71 -''' -import os -import datetime -import numpy - -from .figure import Figure, isRealtime, isTimeInHourRange -from .plotting_codes import * -from schainpy.model.proc.jroproc_base import MPDecorator - -from schainpy.utils import log - -@MPDecorator -class SpectraPlot_(Figure): - - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'spc' - - def __init__(self): - Figure.__init__(self) - self.isConfig = False - self.__nsubplots = 1 - self.WIDTH = 250 - self.HEIGHT = 250 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = SPEC_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - self.__xfilter_ena = False - self.__yfilter_ena = False - - self.indice=1 - - def getSubplots(self): - - ncol = int(numpy.sqrt(self.nplots)+0.9) - nrow = int(self.nplots*1./ncol + 0.9) - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - if showprofile: - ncolspan = 3 - colspan = 2 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile=True, - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, realtime=False, - xaxis="frequency", colormap='jet', normFactor=None): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - if dataOut.flagNoData: - return dataOut - - if realtime: - if not(isRealtime(utcdatatime = dataOut.utctime)): - print('Skipping this plot function') - return - - if channelList == None: - channelIndexList = dataOut.channelIndexList - else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList" %channel) - channelIndexList.append(dataOut.channelList.index(channel)) - - if normFactor is None: - factor = dataOut.normFactor - else: - factor = normFactor - if xaxis == "frequency": - x = dataOut.getFreqRange(1)/1000. - xlabel = "Frequency (kHz)" - - elif xaxis == "time": - x = dataOut.getAcfRange(1) - xlabel = "Time (ms)" - - else: - x = dataOut.getVelRange(1) - xlabel = "Velocity (m/s)" - - ylabel = "Range (km)" - - y = dataOut.getHeiRange() - z = dataOut.data_spc/factor - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - zdB = 10*numpy.log10(z) - - avg = numpy.average(z, axis=1) - avgdB = 10*numpy.log10(avg) - - noise = dataOut.getNoise()/factor - noisedB = 10*numpy.log10(noise) - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Spectra" - - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith) - - if not self.isConfig: - - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3 - if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3 - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.isConfig = True - - self.setWinTitle(title) - - for i in range(self.nplots): - index = channelIndexList[i] - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - title = "Channel %d: %4.2fdB: %s" %(dataOut.channelList[index], noisedB[index], str_datetime) - if len(dataOut.beam.codeList) != 0: - title = "Ch%d:%4.2fdB,%2.2f,%2.2f:%s" %(dataOut.channelList[index], noisedB[index], dataOut.beam.azimuthList[index], dataOut.beam.zenithList[index], str_datetime) - - axes = self.axesList[i*self.__nsubplots] - axes.pcolor(x, y, zdB[index,:,:], - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, colormap=colormap, - ticksize=9, cblabel='') - - if self.__showprofile: - axes = self.axesList[i*self.__nsubplots +1] - axes.pline(avgdB[index,:], y, - xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax, - xlabel='dB', ylabel='', title='', - ytick_visible=False, - grid='x') - - noiseline = numpy.repeat(noisedB[index], len(y)) - axes.addpline(noiseline, y, idline=1, color="black", linestyle="dashed", lw=2) - - self.draw() - - if figfile == None: - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") - name = str_datetime - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - name = name + '_az' + '_%2.2f'%(dataOut.azimuth) + '_zn' + '_%2.2f'%(dataOut.zenith) - figfile = self.getFilename(name) - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - - return dataOut - -@MPDecorator -class CrossSpectraPlot_(Figure): - - isConfig = None - __nsubplots = None - - WIDTH = None - HEIGHT = None - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'cspc' - - def __init__(self): - Figure.__init__(self) - self.isConfig = False - self.__nsubplots = 4 - self.counter_imagwr = 0 - self.WIDTH = 250 - self.HEIGHT = 250 - self.WIDTHPROF = 0 - self.HEIGHTPROF = 0 - - self.PLOT_CODE = CROSS_CODE - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - - self.indice=0 - - def getSubplots(self): - - ncol = 4 - nrow = self.nplots - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=True) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", pairsList=None, - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - coh_min=None, coh_max=None, phase_min=None, phase_max=None, - save=False, figpath='./', figfile=None, ftp=False, wr_period=1, - power_cmap='jet', coherence_cmap='jet', phase_cmap='RdBu_r', show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None, - xaxis='frequency'): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - - if dataOut.flagNoData: - return dataOut - - if pairsList == None: - pairsIndexList = dataOut.pairsIndexList - else: - pairsIndexList = [] - for pair in pairsList: - if pair not in dataOut.pairsList: - raise ValueError("Pair %s is not in dataOut.pairsList" %str(pair)) - pairsIndexList.append(dataOut.pairsList.index(pair)) - - if not pairsIndexList: - return - - if len(pairsIndexList) > 4: - pairsIndexList = pairsIndexList[0:4] - - if normFactor is None: - factor = dataOut.normFactor - else: - factor = normFactor - x = dataOut.getVelRange(1) - y = dataOut.getHeiRange() - z = dataOut.data_spc[:,:,:]/factor - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - - noise = dataOut.noise/factor - - zdB = 10*numpy.log10(z) - noisedB = 10*numpy.log10(noise) - - if coh_min == None: - coh_min = 0.0 - if coh_max == None: - coh_max = 1.0 - - if phase_min == None: - phase_min = -180 - if phase_max == None: - phase_max = 180 - - #thisDatetime = dataOut.datatime - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Cross-Spectra: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - # xlabel = "Velocity (m/s)" - ylabel = "Range (Km)" - - if xaxis == "frequency": - x = dataOut.getFreqRange(1)/1000. - xlabel = "Frequency (kHz)" - - elif xaxis == "time": - x = dataOut.getAcfRange(1) - xlabel = "Time (ms)" - - else: - x = dataOut.getVelRange(1) - xlabel = "Velocity (m/s)" - - if not self.isConfig: - - nplots = len(pairsIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=False, - show=show) - - avg = numpy.abs(numpy.average(z, axis=1)) - avgdB = 10*numpy.log10(avg) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3 - if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3 - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.isConfig = True - - self.setWinTitle(title) - - - for i in range(self.nplots): - pair = dataOut.pairsList[pairsIndexList[i]] - - chan_index0 = dataOut.channelList.index(pair[0]) - chan_index1 = dataOut.channelList.index(pair[1]) - - str_datetime = '%s %s'%(thisDatetime.strftime("%Y/%m/%d"),thisDatetime.strftime("%H:%M:%S")) - title = "Ch%d: %4.2fdB: %s" %(pair[0], noisedB[chan_index0], str_datetime) - zdB = 10.*numpy.log10(dataOut.data_spc[chan_index0,:,:]/factor) - axes0 = self.axesList[i*self.__nsubplots] - axes0.pcolor(x, y, zdB, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, - ticksize=9, colormap=power_cmap, cblabel='') - - title = "Ch%d: %4.2fdB: %s" %(pair[1], noisedB[chan_index1], str_datetime) - zdB = 10.*numpy.log10(dataOut.data_spc[chan_index1,:,:]/factor) - axes0 = self.axesList[i*self.__nsubplots+1] - axes0.pcolor(x, y, zdB, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, - ticksize=9, colormap=power_cmap, cblabel='') - - coherenceComplex = dataOut.data_cspc[pairsIndexList[i],:,:] / numpy.sqrt( dataOut.data_spc[chan_index0,:,:]*dataOut.data_spc[chan_index1,:,:] ) - coherence = numpy.abs(coherenceComplex) - # phase = numpy.arctan(-1*coherenceComplex.imag/coherenceComplex.real)*180/numpy.pi - phase = numpy.arctan2(coherenceComplex.imag, coherenceComplex.real)*180/numpy.pi - - title = "Coherence Ch%d * Ch%d" %(pair[0], pair[1]) - axes0 = self.axesList[i*self.__nsubplots+2] - axes0.pcolor(x, y, coherence, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=coh_min, zmax=coh_max, - xlabel=xlabel, ylabel=ylabel, title=title, - ticksize=9, colormap=coherence_cmap, cblabel='') - - title = "Phase Ch%d * Ch%d" %(pair[0], pair[1]) - axes0 = self.axesList[i*self.__nsubplots+3] - axes0.pcolor(x, y, phase, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max, - xlabel=xlabel, ylabel=ylabel, title=title, - ticksize=9, colormap=phase_cmap, cblabel='') - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - return dataOut - -@MPDecorator -class RTIPlot_(Figure): - - __isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'rti' - - def __init__(self): - - Figure.__init__(self) - self.timerange = None - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 800 - self.HEIGHT = 250 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = RTI_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - self.tmin = None - self.tmax = None - - self.xmin = None - self.xmax = None - - self.figfile = None - - def getSubplots(self): - - ncol = 1 - nrow = self.nplots - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - if showprofile: - ncolspan = 7 - colspan = 6 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - - if counter >= self.nplots: - break - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) - - counter += 1 - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True', - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - timerange=None, colormap='jet', - save=False, figpath='./', lastone=0,figfile=None, ftp=False, wr_period=1, show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0, normFactor=None, HEIGHT=None): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - showProfile : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - zmin : None, - zmax : None - """ - if dataOut.flagNoData: - return dataOut - - #colormap = kwargs.get('colormap', 'jet') - if HEIGHT is not None: - self.HEIGHT = HEIGHT - - if not isTimeInHourRange(dataOut.datatime, xmin, xmax): - return - - if channelList == None: - channelIndexList = dataOut.channelIndexList - else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) - - if normFactor is None: - factor = dataOut.normFactor - else: - factor = normFactor - - #factor = dataOut.normFactor - x = dataOut.getTimeRange() - y = dataOut.getHeiRange() - - z = dataOut.data_spc/factor - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - avg = numpy.average(z, axis=1) - avgdB = 10.*numpy.log10(avg) - # avgdB = dataOut.getPower() - - - thisDatetime = dataOut.datatime - #thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " RTI" #: %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "" - ylabel = "Range (Km)" - - update_figfile = False - - if self.xmax is not None and dataOut.ltctime >= self.xmax: #yong - self.counter_imagwr = wr_period - self.isConfig = False - update_figfile = True - - if not self.isConfig: - - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - if timerange != None: - self.timerange = timerange - - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) - - noise = dataOut.noise/factor - noisedB = 10*numpy.log10(noise) - - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = numpy.floor(numpy.nanmin(noisedB)) - 3 - if zmax == None: zmax = numpy.ceil(numpy.nanmax(avgdB)) + 3 - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - self.figfile = figfile - update_figfile = True - - self.setWinTitle(title) - - for i in range(self.nplots): - index = channelIndexList[i] - title = "Channel %d: %s" %(dataOut.channelList[index], thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) - if ((dataOut.azimuth!=None) and (dataOut.zenith!=None)): - title = title + '_' + 'azimuth,zenith=%2.2f,%2.2f'%(dataOut.azimuth, dataOut.zenith) - axes = self.axesList[i*self.__nsubplots] - zdB = avgdB[index].reshape((1,-1)) - axes.pcolorbuffer(x, y, zdB, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', cbsize="1%", colormap=colormap) - - if self.__showprofile: - axes = self.axesList[i*self.__nsubplots +1] - axes.pline(avgdB[index], y, - xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax, - xlabel='dB', ylabel='', title='', - ytick_visible=False, - grid='x') - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) - return dataOut - -@MPDecorator -class CoherenceMap_(Figure): - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'cmap' - - def __init__(self): - Figure.__init__(self) - self.timerange = 2*60*60 - self.isConfig = False - self.__nsubplots = 1 - - self.WIDTH = 800 - self.HEIGHT = 180 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.counter_imagwr = 0 - - self.PLOT_CODE = COH_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - self.counter_imagwr = 0 - - self.xmin = None - self.xmax = None - - def getSubplots(self): - ncol = 1 - nrow = self.nplots*2 - - return nrow, ncol - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - if showprofile: - ncolspan = 7 - colspan = 6 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH + self.WIDTHPROF, - heightplot = self.HEIGHT + self.HEIGHTPROF, - show=True) - - nrow, ncol = self.getSubplots() - - for y in range(nrow): - for x in range(ncol): - - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - if showprofile: - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan+colspan, 1, 1) - - def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True', - xmin=None, xmax=None, ymin=None, ymax=None, zmin=None, zmax=None, - timerange=None, phase_min=None, phase_max=None, - save=False, figpath='./', figfile=None, ftp=False, wr_period=1, - coherence_cmap='jet', phase_cmap='RdBu_r', show=True, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): - - - if dataOut.flagNoData: - return dataOut - - if not isTimeInHourRange(dataOut.datatime, xmin, xmax): - return - - if pairsList == None: - pairsIndexList = dataOut.pairsIndexList - else: - pairsIndexList = [] - for pair in pairsList: - if pair not in dataOut.pairsList: - raise ValueError("Pair %s is not in dataOut.pairsList" %(pair)) - pairsIndexList.append(dataOut.pairsList.index(pair)) - - if pairsIndexList == []: - return - - if len(pairsIndexList) > 4: - pairsIndexList = pairsIndexList[0:4] - - if phase_min == None: - phase_min = -180 - if phase_max == None: - phase_max = 180 - - x = dataOut.getTimeRange() - y = dataOut.getHeiRange() - - thisDatetime = dataOut.datatime - - title = wintitle + " CoherenceMap" #: %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "" - ylabel = "Range (Km)" - update_figfile = False - - if not self.isConfig: - nplots = len(pairsIndexList) - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) - - if timerange != None: - self.timerange = timerange - - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) - - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if zmin == None: zmin = 0. - if zmax == None: zmax = 1. - - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos - - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - - self.isConfig = True - update_figfile = True - - self.setWinTitle(title) - - for i in range(self.nplots): - - pair = dataOut.pairsList[pairsIndexList[i]] - - ccf = numpy.average(dataOut.data_cspc[pairsIndexList[i],:,:],axis=0) - powa = numpy.average(dataOut.data_spc[pair[0],:,:],axis=0) - powb = numpy.average(dataOut.data_spc[pair[1],:,:],axis=0) - - - avgcoherenceComplex = ccf/numpy.sqrt(powa*powb) - coherence = numpy.abs(avgcoherenceComplex) - - z = coherence.reshape((1,-1)) - - counter = 0 - - title = "Coherence Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - axes = self.axesList[i*self.__nsubplots*2] - axes.pcolorbuffer(x, y, z, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=zmin, zmax=zmax, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', colormap=coherence_cmap, cbsize="1%") - - if self.__showprofile: - counter += 1 - axes = self.axesList[i*self.__nsubplots*2 + counter] - axes.pline(coherence, y, - xmin=zmin, xmax=zmax, ymin=ymin, ymax=ymax, - xlabel='', ylabel='', title='', ticksize=7, - ytick_visible=False, nxticks=5, - grid='x') - - counter += 1 - - phase = numpy.arctan2(avgcoherenceComplex.imag, avgcoherenceComplex.real)*180/numpy.pi - - z = phase.reshape((1,-1)) - - title = "Phase Ch%d * Ch%d: %s" %(pair[0], pair[1], thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - axes = self.axesList[i*self.__nsubplots*2 + counter] - axes.pcolorbuffer(x, y, z, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, zmin=phase_min, zmax=phase_max, - xlabel=xlabel, ylabel=ylabel, title=title, rti=True, XAxisAsTime=True, - ticksize=9, cblabel='', colormap=phase_cmap, cbsize="1%") - - if self.__showprofile: - counter += 1 - axes = self.axesList[i*self.__nsubplots*2 + counter] - axes.pline(phase, y, - xmin=phase_min, xmax=phase_max, ymin=ymin, ymax=ymax, - xlabel='', ylabel='', title='', ticksize=7, - ytick_visible=False, nxticks=4, - grid='x') - - self.draw() - - if dataOut.ltctime >= self.xmax: - self.counter_imagwr = wr_period - self.isConfig = False - update_figfile = True - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) - - return dataOut - -@MPDecorator -class PowerProfilePlot_(Figure): - - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'spcprofile' - - def __init__(self): - Figure.__init__(self) - self.isConfig = False - self.__nsubplots = 1 - - self.PLOT_CODE = POWER_CODE - - self.WIDTH = 300 - self.HEIGHT = 500 - self.counter_imagwr = 0 - - def getSubplots(self): - ncol = 1 - nrow = 1 - - return nrow, ncol - - def setup(self, id, nplots, wintitle, show): - - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH, - heightplot = self.HEIGHT, - show=show) +""" - nrow, ncol = self.getSubplots() +import os +import numpy - counter = 0 - for y in range(nrow): - for x in range(ncol): - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) +from schainpy.model.graphics.jroplot_base import Plot, plt, log - def run(self, dataOut, id, wintitle="", channelList=None, - xmin=None, xmax=None, ymin=None, ymax=None, - save=False, figpath='./', figfile=None, show=True, - ftp=False, wr_period=1, server=None, - folder=None, username=None, password=None): - if dataOut.flagNoData: - return dataOut +class SpectraPlot(Plot): + ''' + Plot for Spectra data + ''' + CODE = 'spc' + colormap = 'jet' + plot_type = 'pcolor' + buffering = False - if channelList == None: - channelIndexList = dataOut.channelIndexList - channelList = dataOut.channelList + def setup(self): + self.nplots = len(self.data.channels) + self.ncols = int(numpy.sqrt(self.nplots) + 0.9) + self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9) + self.height = 2.6 * self.nrows + self.cb_label = 'dB' + if self.showprofile: + self.width = 4 * self.ncols else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) - - factor = dataOut.normFactor - - y = dataOut.getHeiRange() - - #for voltage - if dataOut.type == 'Voltage': - x = dataOut.data[channelIndexList,:] * numpy.conjugate(dataOut.data[channelIndexList,:]) - x = x.real - x = numpy.where(numpy.isfinite(x), x, numpy.NAN) - - #for spectra - if dataOut.type == 'Spectra': - x = dataOut.data_spc[channelIndexList,:,:]/factor - x = numpy.where(numpy.isfinite(x), x, numpy.NAN) - x = numpy.average(x, axis=1) - - - xdB = 10*numpy.log10(x) - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Power Profile %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "dB" - ylabel = "Range (Km)" - - if not self.isConfig: - - nplots = 1 - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - show=show) - - if ymin == None: ymin = numpy.nanmin(y) - if ymax == None: ymax = numpy.nanmax(y) - if xmin == None: xmin = numpy.nanmin(xdB)*0.9 - if xmax == None: xmax = numpy.nanmax(xdB)*1.1 - - self.isConfig = True - - self.setWinTitle(title) - - title = "Power Profile: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - axes = self.axesList[0] - - legendlabels = ["channel %d"%x for x in channelList] - axes.pmultiline(xdB, y, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, - ytick_visible=True, nxticks=5, - grid='x') - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) + self.width = 3.5 * self.ncols + self.plots_adjust.update({'wspace': 0.4, 'hspace':0.4, 'left': 0.1, 'right': 0.9, 'bottom': 0.08}) + self.ylabel = 'Range [km]' + + def update(self, dataOut): + + data = {} + meta = {} + spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor) + data['spc'] = spc + data['rti'] = dataOut.getPower() + data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) + meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1)) + if self.CODE == 'spc_moments': + data['moments'] = dataOut.moments - return dataOut - -@MPDecorator -class SpectraCutPlot_(Figure): - - isConfig = None - __nsubplots = None - - WIDTHPROF = None - HEIGHTPROF = None - PREFIX = 'spc_cut' - - def __init__(self): - Figure.__init__(self) - self.isConfig = False - self.__nsubplots = 1 - - self.PLOT_CODE = POWER_CODE - - self.WIDTH = 700 - self.HEIGHT = 500 - self.counter_imagwr = 0 - - def getSubplots(self): - ncol = 1 - nrow = 1 - - return nrow, ncol - - def setup(self, id, nplots, wintitle, show): - - self.nplots = nplots - - ncolspan = 1 - colspan = 1 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH, - heightplot = self.HEIGHT, - show=show) - - nrow, ncol = self.getSubplots() - - counter = 0 - for y in range(nrow): - for x in range(ncol): - self.addAxes(nrow, ncol*ncolspan, y, x*ncolspan, colspan, 1) - - def run(self, dataOut, id, wintitle="", channelList=None, - xmin=None, xmax=None, ymin=None, ymax=None, - save=False, figpath='./', figfile=None, show=True, - ftp=False, wr_period=1, server=None, - folder=None, username=None, password=None, - xaxis="frequency"): - - if dataOut.flagNoData: - return dataOut - - if channelList == None: - channelIndexList = dataOut.channelIndexList - channelList = dataOut.channelList + return data, meta + + def plot(self): + if self.xaxis == "frequency": + x = self.data.xrange[0] + self.xlabel = "Frequency (kHz)" + elif self.xaxis == "time": + x = self.data.xrange[1] + self.xlabel = "Time (ms)" else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) - - factor = dataOut.normFactor - - y = dataOut.getHeiRange() - - z = dataOut.data_spc/factor - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - - hei_index = numpy.arange(25)*3 + 20 - - if xaxis == "frequency": - x = dataOut.getFreqRange()/1000. - zdB = 10*numpy.log10(z[0,:,hei_index]) - xlabel = "Frequency (kHz)" - ylabel = "Power (dB)" - - elif xaxis == "time": - x = dataOut.getAcfRange() - zdB = z[0,:,hei_index] - xlabel = "Time (ms)" - ylabel = "ACF" - + x = self.data.xrange[2] + self.xlabel = "Velocity (m/s)" + + if self.CODE == 'spc_moments': + x = self.data.xrange[2] + self.xlabel = "Velocity (m/s)" + + self.titles = [] + + y = self.data.yrange + self.y = y + + data = self.data[-1] + z = data['spc'] + + for n, ax in enumerate(self.axes): + noise = data['noise'][n] + if self.CODE == 'spc_moments': + mean = data['moments'][n, 1] + if ax.firsttime: + self.xmax = self.xmax if self.xmax else numpy.nanmax(x) + self.xmin = self.xmin if self.xmin else -self.xmax + self.zmin = self.zmin if self.zmin else numpy.nanmin(z) + self.zmax = self.zmax if self.zmax else numpy.nanmax(z) + ax.plt = ax.pcolormesh(x, y, z[n].T, + vmin=self.zmin, + vmax=self.zmax, + cmap=plt.get_cmap(self.colormap) + ) + + if self.showprofile: + ax.plt_profile = self.pf_axes[n].plot( + data['rti'][n], y)[0] + ax.plt_noise = self.pf_axes[n].plot(numpy.repeat(noise, len(y)), y, + color="k", linestyle="dashed", lw=1)[0] + if self.CODE == 'spc_moments': + ax.plt_mean = ax.plot(mean, y, color='k')[0] + else: + ax.plt.set_array(z[n].T.ravel()) + if self.showprofile: + ax.plt_profile.set_data(data['rti'][n], y) + ax.plt_noise.set_data(numpy.repeat(noise, len(y)), y) + if self.CODE == 'spc_moments': + ax.plt_mean.set_data(mean, y) + self.titles.append('CH {}: {:3.2f}dB'.format(n, noise)) + + +class CrossSpectraPlot(Plot): + + CODE = 'cspc' + colormap = 'jet' + plot_type = 'pcolor' + zmin_coh = None + zmax_coh = None + zmin_phase = None + zmax_phase = None + + def setup(self): + + self.ncols = 4 + self.nplots = len(self.data.pairs) * 2 + self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9) + self.width = 3.1 * self.ncols + self.height = 2.6 * self.nrows + self.ylabel = 'Range [km]' + self.showprofile = False + self.plots_adjust.update({'left': 0.08, 'right': 0.92, 'wspace': 0.5, 'hspace':0.4, 'top':0.95, 'bottom': 0.08}) + + def update(self, dataOut): + + data = {} + meta = {} + + spc = dataOut.data_spc + cspc = dataOut.data_cspc + meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1)) + meta['pairs'] = dataOut.pairsList + + tmp = [] + + for n, pair in enumerate(meta['pairs']): + out = cspc[n] / numpy.sqrt(spc[pair[0]] * spc[pair[1]]) + coh = numpy.abs(out) + phase = numpy.arctan2(out.imag, out.real) * 180 / numpy.pi + tmp.append(coh) + tmp.append(phase) + + data['cspc'] = numpy.array(tmp) + + return data, meta + + def plot(self): + + if self.xaxis == "frequency": + x = self.data.xrange[0] + self.xlabel = "Frequency (kHz)" + elif self.xaxis == "time": + x = self.data.xrange[1] + self.xlabel = "Time (ms)" else: - x = dataOut.getVelRange() - zdB = 10*numpy.log10(z[0,:,hei_index]) - xlabel = "Velocity (m/s)" - ylabel = "Power (dB)" - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - title = wintitle + " Range Cuts %s" %(thisDatetime.strftime("%d-%b-%Y")) - - if not self.isConfig: - - nplots = 1 - - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - show=show) - - if xmin == None: xmin = numpy.nanmin(x)*0.9 - if xmax == None: xmax = numpy.nanmax(x)*1.1 - if ymin == None: ymin = numpy.nanmin(zdB) - if ymax == None: ymax = numpy.nanmax(zdB) - - self.isConfig = True - - self.setWinTitle(title) - - title = "Spectra Cuts: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - axes = self.axesList[0] - - legendlabels = ["Range = %dKm" %y[i] for i in hei_index] - - axes.pmultilineyaxis( x, zdB, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, - ytick_visible=True, nxticks=5, - grid='x') - - self.draw() - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - return dataOut - -@MPDecorator -class Noise_(Figure): - - isConfig = None - __nsubplots = None - - PREFIX = 'noise' - - - def __init__(self): - Figure.__init__(self) - self.timerange = 24*60*60 - self.isConfig = False - self.__nsubplots = 1 - self.counter_imagwr = 0 - self.WIDTH = 800 - self.HEIGHT = 400 - self.WIDTHPROF = 120 - self.HEIGHTPROF = 0 - self.xdata = None - self.ydata = None - - self.PLOT_CODE = NOISE_CODE - - self.FTP_WEI = None - self.EXP_CODE = None - self.SUB_EXP_CODE = None - self.PLOT_POS = None - self.figfile = None - - self.xmin = None - self.xmax = None - - def getSubplots(self): - - ncol = 1 - nrow = 1 - - return nrow, ncol - - def openfile(self, filename): - dirname = os.path.dirname(filename) - - if not os.path.exists(dirname): - os.mkdir(dirname) - - f = open(filename,'w+') - f.write('\n\n') - f.write('JICAMARCA RADIO OBSERVATORY - Noise \n') - f.write('DD MM YYYY HH MM SS Channel0 Channel1 Channel2 Channel3\n\n' ) - f.close() - - def save_data(self, filename_phase, data, data_datetime): - - f=open(filename_phase,'a') - - timetuple_data = data_datetime.timetuple() - day = str(timetuple_data.tm_mday) - month = str(timetuple_data.tm_mon) - year = str(timetuple_data.tm_year) - hour = str(timetuple_data.tm_hour) - minute = str(timetuple_data.tm_min) - second = str(timetuple_data.tm_sec) - - data_msg = '' - for i in range(len(data)): - data_msg += str(data[i]) + ' ' - - f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' ' + data_msg + '\n') - f.close() - - - def setup(self, id, nplots, wintitle, showprofile=True, show=True): - - self.__showprofile = showprofile - self.nplots = nplots - - ncolspan = 7 - colspan = 6 - self.__nsubplots = 2 - - self.createFigure(id = id, - wintitle = wintitle, - widthplot = self.WIDTH+self.WIDTHPROF, - heightplot = self.HEIGHT+self.HEIGHTPROF, - show=show) - - nrow, ncol = self.getSubplots() - - self.addAxes(nrow, ncol*ncolspan, 0, 0, colspan, 1) - - - def run(self, dataOut, id, wintitle="", channelList=None, showprofile='True', - xmin=None, xmax=None, ymin=None, ymax=None, - timerange=None, - save=False, figpath='./', figfile=None, show=True, ftp=False, wr_period=1, - server=None, folder=None, username=None, password=None, - ftp_wei=0, exp_code=0, sub_exp_code=0, plot_pos=0): - - if dataOut.flagNoData: - return dataOut - - if not isTimeInHourRange(dataOut.datatime, xmin, xmax): - return - - if channelList == None: - channelIndexList = dataOut.channelIndexList - channelList = dataOut.channelList + x = self.data.xrange[2] + self.xlabel = "Velocity (m/s)" + + self.titles = [] + + y = self.data.yrange + self.y = y + + data = self.data[-1] + cspc = data['cspc'] + + for n in range(len(self.data.pairs)): + pair = self.data.pairs[n] + coh = cspc[n*2] + phase = cspc[n*2+1] + ax = self.axes[2 * n] + if ax.firsttime: + ax.plt = ax.pcolormesh(x, y, coh.T, + vmin=0, + vmax=1, + cmap=plt.get_cmap(self.colormap_coh) + ) + else: + ax.plt.set_array(coh.T.ravel()) + self.titles.append( + 'Coherence Ch{} * Ch{}'.format(pair[0], pair[1])) + + ax = self.axes[2 * n + 1] + if ax.firsttime: + ax.plt = ax.pcolormesh(x, y, phase.T, + vmin=-180, + vmax=180, + cmap=plt.get_cmap(self.colormap_phase) + ) + else: + ax.plt.set_array(phase.T.ravel()) + self.titles.append('Phase CH{} * CH{}'.format(pair[0], pair[1])) + + +class RTIPlot(Plot): + ''' + Plot for RTI data + ''' + + CODE = 'rti' + colormap = 'jet' + plot_type = 'pcolorbuffer' + + def setup(self): + self.xaxis = 'time' + self.ncols = 1 + self.nrows = len(self.data.channels) + self.nplots = len(self.data.channels) + self.ylabel = 'Range [km]' + self.xlabel = 'Time' + self.cb_label = 'dB' + self.plots_adjust.update({'hspace':0.8, 'left': 0.1, 'bottom': 0.08, 'right':0.95}) + self.titles = ['{} Channel {}'.format( + self.CODE.upper(), x) for x in range(self.nrows)] + + def update(self, dataOut): + + data = {} + meta = {} + data['rti'] = dataOut.getPower() + data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor) + + return data, meta + + def plot(self): + self.x = self.data.times + self.y = self.data.yrange + self.z = self.data[self.CODE] + self.z = numpy.ma.masked_invalid(self.z) + + if self.decimation is None: + x, y, z = self.fill_gaps(self.x, self.y, self.z) + else: + x, y, z = self.fill_gaps(*self.decimate()) + + for n, ax in enumerate(self.axes): + self.zmin = self.zmin if self.zmin else numpy.min(self.z) + self.zmax = self.zmax if self.zmax else numpy.max(self.z) + data = self.data[-1] + if ax.firsttime: + ax.plt = ax.pcolormesh(x, y, z[n].T, + vmin=self.zmin, + vmax=self.zmax, + cmap=plt.get_cmap(self.colormap) + ) + if self.showprofile: + ax.plot_profile = self.pf_axes[n].plot( + data['rti'][n], self.y)[0] + ax.plot_noise = self.pf_axes[n].plot(numpy.repeat(data['noise'][n], len(self.y)), self.y, + color="k", linestyle="dashed", lw=1)[0] + else: + ax.collections.remove(ax.collections[0]) + ax.plt = ax.pcolormesh(x, y, z[n].T, + vmin=self.zmin, + vmax=self.zmax, + cmap=plt.get_cmap(self.colormap) + ) + if self.showprofile: + ax.plot_profile.set_data(data['rti'][n], self.y) + ax.plot_noise.set_data(numpy.repeat( + data['noise'][n], len(self.y)), self.y) + + +class CoherencePlot(RTIPlot): + ''' + Plot for Coherence data + ''' + + CODE = 'coh' + + def setup(self): + self.xaxis = 'time' + self.ncols = 1 + self.nrows = len(self.data.pairs) + self.nplots = len(self.data.pairs) + self.ylabel = 'Range [km]' + self.xlabel = 'Time' + self.plots_adjust.update({'hspace':0.6, 'left': 0.1, 'bottom': 0.1,'right':0.95}) + if self.CODE == 'coh': + self.cb_label = '' + self.titles = [ + 'Coherence Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs] + else: + self.cb_label = 'Degrees' + self.titles = [ + 'Phase Map Ch{} * Ch{}'.format(x[0], x[1]) for x in self.data.pairs] + + def update(self, dataOut): + + data = {} + meta = {} + data['coh'] = dataOut.getCoherence() + meta['pairs'] = dataOut.pairsList + + return data, meta + +class PhasePlot(CoherencePlot): + ''' + Plot for Phase map data + ''' + + CODE = 'phase' + colormap = 'seismic' + + def update(self, dataOut): + + data = {} + meta = {} + data['phase'] = dataOut.getCoherence(phase=True) + meta['pairs'] = dataOut.pairsList + + return data, meta + +class NoisePlot(Plot): + ''' + Plot for noise + ''' + + CODE = 'noise' + plot_type = 'scatterbuffer' + + def setup(self): + self.xaxis = 'time' + self.ncols = 1 + self.nrows = 1 + self.nplots = 1 + self.ylabel = 'Intensity [dB]' + self.xlabel = 'Time' + self.titles = ['Noise'] + self.colorbar = False + self.plots_adjust.update({'right': 0.85 }) + + def update(self, dataOut): + + data = {} + meta = {} + data['noise'] = 10*numpy.log10(dataOut.getNoise()/dataOut.normFactor).reshape(dataOut.nChannels, 1) + meta['yrange'] = numpy.array([]) + + return data, meta + + def plot(self): + + x = self.data.times + xmin = self.data.min_time + xmax = xmin + self.xrange * 60 * 60 + Y = self.data['noise'] + + if self.axes[0].firsttime: + self.ymin = numpy.nanmin(Y) - 5 + self.ymax = numpy.nanmax(Y) + 5 + for ch in self.data.channels: + y = Y[ch] + self.axes[0].plot(x, y, lw=1, label='Ch{}'.format(ch)) + plt.legend(bbox_to_anchor=(1.18, 1.0)) else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) + for ch in self.data.channels: + y = Y[ch] + self.axes[0].lines[ch].set_data(x, y) - x = dataOut.getTimeRange() - #y = dataOut.getHeiRange() - factor = dataOut.normFactor - noise = dataOut.noise[channelIndexList]/factor - noisedB = 10*numpy.log10(noise) + +class PowerProfilePlot(Plot): - thisDatetime = dataOut.datatime + CODE = 'pow_profile' + plot_type = 'scatter' - title = wintitle + " Noise" # : %s" %(thisDatetime.strftime("%d-%b-%Y")) - xlabel = "" - ylabel = "Intensity (dB)" - update_figfile = False + def setup(self): - if not self.isConfig: + self.ncols = 1 + self.nrows = 1 + self.nplots = 1 + self.height = 4 + self.width = 3 + self.ylabel = 'Range [km]' + self.xlabel = 'Intensity [dB]' + self.titles = ['Power Profile'] + self.colorbar = False - nplots = 1 + def update(self, dataOut): - self.setup(id=id, - nplots=nplots, - wintitle=wintitle, - showprofile=showprofile, - show=show) + data = {} + meta = {} + data[self.CODE] = dataOut.getPower() - if timerange != None: - self.timerange = timerange + return data, meta - self.xmin, self.xmax = self.getTimeLim(x, xmin, xmax, timerange) + def plot(self): - if ymin == None: ymin = numpy.floor(numpy.nanmin(noisedB)) - 10.0 - if ymax == None: ymax = numpy.nanmax(noisedB) + 10.0 + y = self.data.yrange + self.y = y - self.FTP_WEI = ftp_wei - self.EXP_CODE = exp_code - self.SUB_EXP_CODE = sub_exp_code - self.PLOT_POS = plot_pos + x = self.data[-1][self.CODE] + + if self.xmin is None: self.xmin = numpy.nanmin(x)*0.9 + if self.xmax is None: self.xmax = numpy.nanmax(x)*1.1 + + if self.axes[0].firsttime: + for ch in self.data.channels: + self.axes[0].plot(x[ch], y, lw=1, label='Ch{}'.format(ch)) + plt.legend() + else: + for ch in self.data.channels: + self.axes[0].lines[ch].set_data(x[ch], y) - self.name = thisDatetime.strftime("%Y%m%d_%H%M%S") - self.isConfig = True - self.figfile = figfile - self.xdata = numpy.array([]) - self.ydata = numpy.array([]) +class SpectraCutPlot(Plot): - update_figfile = True + CODE = 'spc_cut' + plot_type = 'scatter' + buffering = False - #open file beacon phase - path = '%s%03d' %(self.PREFIX, self.id) - noise_file = os.path.join(path,'%s.txt'%self.name) - self.filename_noise = os.path.join(figpath,noise_file) + def setup(self): - self.setWinTitle(title) + self.nplots = len(self.data.channels) + self.ncols = int(numpy.sqrt(self.nplots) + 0.9) + self.nrows = int((1.0 * self.nplots / self.ncols) + 0.9) + self.width = 3.4 * self.ncols + 1.5 + self.height = 3 * self.nrows + self.ylabel = 'Power [dB]' + self.colorbar = False + self.plots_adjust.update({'left':0.1, 'hspace':0.3, 'right': 0.75, 'bottom':0.08}) - title = "Noise %s" %(thisDatetime.strftime("%Y/%m/%d %H:%M:%S")) + def update(self, dataOut): - legendlabels = ["channel %d"%(idchannel) for idchannel in channelList] - axes = self.axesList[0] + data = {} + meta = {} + spc = 10*numpy.log10(dataOut.data_spc/dataOut.normFactor) + data['spc'] = spc + meta['xrange'] = (dataOut.getFreqRange(1)/1000., dataOut.getAcfRange(1), dataOut.getVelRange(1)) - self.xdata = numpy.hstack((self.xdata, x[0:1])) + return data, meta - if len(self.ydata)==0: - self.ydata = noisedB.reshape(-1,1) + def plot(self): + if self.xaxis == "frequency": + x = self.data.xrange[0][1:] + self.xlabel = "Frequency (kHz)" + elif self.xaxis == "time": + x = self.data.xrange[1] + self.xlabel = "Time (ms)" else: - self.ydata = numpy.hstack((self.ydata, noisedB.reshape(-1,1))) - - - axes.pmultilineyaxis(x=self.xdata, y=self.ydata, - xmin=self.xmin, xmax=self.xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title, legendlabels=legendlabels, marker='x', markersize=8, linestyle="solid", - XAxisAsTime=True, grid='both' - ) - - self.draw() + x = self.data.xrange[2] + self.xlabel = "Velocity (m/s)" - if dataOut.ltctime >= self.xmax: - self.counter_imagwr = wr_period - self.isConfig = False - update_figfile = True + self.titles = [] - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime, - update_figfile=update_figfile) + y = self.data.yrange + z = self.data[-1]['spc'] - #store data beacon phase - if save: - self.save_data(self.filename_noise, noisedB, thisDatetime) + if self.height_index: + index = numpy.array(self.height_index) + else: + index = numpy.arange(0, len(y), int((len(y))/9)) + + for n, ax in enumerate(self.axes): + if ax.firsttime: + self.xmax = self.xmax if self.xmax else numpy.nanmax(x) + self.xmin = self.xmin if self.xmin else -self.xmax + self.ymin = self.ymin if self.ymin else numpy.nanmin(z) + self.ymax = self.ymax if self.ymax else numpy.nanmax(z) + ax.plt = ax.plot(x, z[n, :, index].T) + labels = ['Range = {:2.1f}km'.format(y[i]) for i in index] + self.figures[0].legend(ax.plt, labels, loc='center right') + else: + for i, line in enumerate(ax.plt): + line.set_data(x, z[n, :, index[i]]) + self.titles.append('CH {}'.format(n)) - return dataOut -@MPDecorator -class BeaconPhase_(Figure): +class BeaconPhase(Plot): __isConfig = None __nsubplots = None @@ -1365,7 +478,7 @@ class BeaconPhase_(Figure): PREFIX = 'beacon_phase' def __init__(self): - Figure.__init__(self) + Plot.__init__(self) self.timerange = 24*60*60 self.isConfig = False self.__nsubplots = 1 @@ -1436,6 +549,8 @@ class BeaconPhase_(Figure): f.write(day+' '+month+' '+year+' '+hour+' '+minute+' '+second+' '+str(data[0])+' '+str(data[1])+' '+str(data[2])+' '+str(data[3])+'\n') f.close() + def plot(self): + log.warning('TODO: Not yet implemented...') def run(self, dataOut, id, wintitle="", pairsList=None, showprofile='True', xmin=None, xmax=None, ymin=None, ymax=None, hmin=None, hmax=None, @@ -1480,8 +595,6 @@ class BeaconPhase_(Figure): hmax_index = hmax_list[-1]+1 x = dataOut.getTimeRange() - #y = dataOut.getHeiRange() - thisDatetime = dataOut.datatime diff --git a/schainpy/model/graphics/jroplot_voltage.py b/schainpy/model/graphics/jroplot_voltage.py index ae4a972..6faf42a 100644 --- a/schainpy/model/graphics/jroplot_voltage.py +++ b/schainpy/model/graphics/jroplot_voltage.py @@ -6,227 +6,297 @@ Created on Jul 9, 2014 import os import datetime import numpy -from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator #YONG -from schainpy.utils import log -from .figure import Figure - - -@MPDecorator -class Scope_(Figure): - - isConfig = None - - def __init__(self):#, **kwargs): #YONG - Figure.__init__(self)#, **kwargs) - self.isConfig = False - self.WIDTH = 300 - self.HEIGHT = 200 - self.counter_imagwr = 0 - - def getSubplots(self): - - nrow = self.nplots - ncol = 3 - return nrow, ncol - - def setup(self, id, nplots, wintitle, show): - - self.nplots = nplots - - self.createFigure(id=id, - wintitle=wintitle, - show=show) - - nrow,ncol = self.getSubplots() - colspan = 3 - rowspan = 1 - - for i in range(nplots): - self.addAxes(nrow, ncol, i, 0, colspan, rowspan) - - def plot_iq(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax): + +from schainpy.model.graphics.jroplot_base import Plot, plt + + +class ScopePlot(Plot): + + ''' + Plot for Scope + ''' + + CODE = 'scope' + plot_type = 'scatter' + + def setup(self): + + self.xaxis = 'Range (Km)' + self.ncols = 1 + self.nrows = 1 + self.nplots = 1 + self.ylabel = 'Intensity [dB]' + self.titles = ['Scope'] + self.colorbar = False + self.width = 6 + self.height = 4 + + def update(self, dataOut): + + data = {} + meta = { + 'nProfiles': dataOut.nProfiles, + 'flagDataAsBlock': dataOut.flagDataAsBlock, + 'profileIndex': dataOut.profileIndex, + } + if self.CODE == 'scope': + data[self.CODE] = dataOut.data + elif self.CODE == 'pp_power': + data[self.CODE] = dataOut.dataPP_POWER + elif self.CODE == 'pp_signal': + data[self.CODE] = dataOut.dataPP_POW + elif self.CODE == 'pp_velocity': + data[self.CODE] = dataOut.dataPP_DOP + elif self.CODE == 'pp_specwidth': + data[self.CODE] = dataOut.dataPP_WIDTH + + return data, meta + + def plot_iq(self, x, y, channelIndexList, thisDatetime, wintitle): + yreal = y[channelIndexList,:].real yimag = y[channelIndexList,:].imag - - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - xlabel = "Range (Km)" - ylabel = "Intensity - IQ" - - if not self.isConfig: - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle='', - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = min(numpy.nanmin(yreal),numpy.nanmin(yimag)) - if ymax == None: ymax = max(numpy.nanmax(yreal),numpy.nanmax(yimag)) - - self.isConfig = True - - self.setWinTitle(title) - - for i in range(len(self.axesList)): - title = "Channel %d" %(i) - axes = self.axesList[i] + title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y")) + self.xlabel = "Range (Km)" + self.ylabel = "Intensity - IQ" - axes.pline(x, yreal[i,:], - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title) + self.y = yreal + self.x = x - axes.addpline(x, yimag[i,:], idline=1, color="red", linestyle="solid", lw=2) - - def plot_power(self, x, y, id, channelIndexList, thisDatetime, wintitle, show, xmin, xmax, ymin, ymax): + self.titles[0] = title + + for i,ax in enumerate(self.axes): + title = "Channel %d" %(i) + if ax.firsttime: + self.xmin = min(x) + self.xmax = max(x) + ax.plt_r = ax.plot(x, yreal[i,:], color='b')[0] + ax.plt_i = ax.plot(x, yimag[i,:], color='r')[0] + else: + ax.plt_r.set_data(x, yreal[i,:]) + ax.plt_i.set_data(x, yimag[i,:]) + + def plot_power(self, x, y, channelIndexList, thisDatetime, wintitle): y = y[channelIndexList,:] * numpy.conjugate(y[channelIndexList,:]) yreal = y.real - - title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) - xlabel = "Range (Km)" - ylabel = "Intensity" - - if not self.isConfig: - nplots = len(channelIndexList) - - self.setup(id=id, - nplots=nplots, - wintitle='', - show=show) - - if xmin == None: xmin = numpy.nanmin(x) - if xmax == None: xmax = numpy.nanmax(x) - if ymin == None: ymin = numpy.nanmin(yreal) - if ymax == None: ymax = numpy.nanmax(yreal) - - self.isConfig = True - - self.setWinTitle(title) - - for i in range(len(self.axesList)): + yreal = 10*numpy.log10(yreal) + self.y = yreal + title = wintitle + " Power: %s" %(thisDatetime.strftime("%d-%b-%Y")) + self.xlabel = "Range (Km)" + self.ylabel = "Intensity [dB]" + + + self.titles[0] = title + + for i,ax in enumerate(self.axes): title = "Channel %d" %(i) - axes = self.axesList[i] ychannel = yreal[i,:] - axes.pline(x, ychannel, - xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, - xlabel=xlabel, ylabel=ylabel, title=title) - - - def run(self, dataOut, id, wintitle="", channelList=None, - xmin=None, xmax=None, ymin=None, ymax=None, save=False, - figpath='./', figfile=None, show=True, wr_period=1, - ftp=False, server=None, folder=None, username=None, password=None, type='power', **kwargs): - - """ - - Input: - dataOut : - id : - wintitle : - channelList : - xmin : None, - xmax : None, - ymin : None, - ymax : None, - """ - if dataOut.flagNoData: - return dataOut - - if channelList == None: - channelIndexList = dataOut.channelIndexList + + if ax.firsttime: + self.xmin = min(x) + self.xmax = max(x) + ax.plt_r = ax.plot(x, ychannel)[0] + else: + ax.plt_r.set_data(x, ychannel) + + def plot_weatherpower(self, x, y, channelIndexList, thisDatetime, wintitle): + + + y = y[channelIndexList,:] + yreal = y.real + yreal = 10*numpy.log10(yreal) + self.y = yreal + title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) + self.xlabel = "Range (Km)" + self.ylabel = "Intensity" + self.xmin = min(x) + self.xmax = max(x) + + self.titles[0] =title + for i,ax in enumerate(self.axes): + title = "Channel %d" %(i) + + ychannel = yreal[i,:] + + if ax.firsttime: + ax.plt_r = ax.plot(x, ychannel)[0] + else: + #pass + ax.plt_r.set_data(x, ychannel) + + def plot_weathervelocity(self, x, y, channelIndexList, thisDatetime, wintitle): + + x = x[channelIndexList,:] + yreal = y + self.y = yreal + title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) + self.xlabel = "Velocity (m/s)" + self.ylabel = "Range (Km)" + self.xmin = numpy.min(x) + self.xmax = numpy.max(x) + self.titles[0] =title + for i,ax in enumerate(self.axes): + title = "Channel %d" %(i) + xchannel = x[i,:] + if ax.firsttime: + ax.plt_r = ax.plot(xchannel, yreal)[0] + else: + #pass + ax.plt_r.set_data(xchannel, yreal) + + def plot_weatherspecwidth(self, x, y, channelIndexList, thisDatetime, wintitle): + + x = x[channelIndexList,:] + yreal = y + self.y = yreal + title = wintitle + " Scope: %s" %(thisDatetime.strftime("%d-%b-%Y %H:%M:%S")) + self.xlabel = "width " + self.ylabel = "Range (Km)" + self.xmin = numpy.min(x) + self.xmax = numpy.max(x) + self.titles[0] =title + for i,ax in enumerate(self.axes): + title = "Channel %d" %(i) + xchannel = x[i,:] + if ax.firsttime: + ax.plt_r = ax.plot(xchannel, yreal)[0] + else: + #pass + ax.plt_r.set_data(xchannel, yreal) + + def plot(self): + if self.channels: + channels = self.channels else: - channelIndexList = [] - for channel in channelList: - if channel not in dataOut.channelList: - raise ValueError("Channel %d is not in dataOut.channelList") - channelIndexList.append(dataOut.channelList.index(channel)) - - thisDatetime = datetime.datetime.utcfromtimestamp(dataOut.getTimeRange()[0]) - - if dataOut.flagDataAsBlock: - - for i in range(dataOut.nProfiles): - - wintitle1 = wintitle + " [Profile = %d] " %i - - if type == "power": - self.plot_power(dataOut.heightList, - dataOut.data[:,i,:], - id, - channelIndexList, - thisDatetime, - wintitle1, - show, - xmin, - xmax, - ymin, - ymax) - - if type == "iq": - self.plot_iq(dataOut.heightList, - dataOut.data[:,i,:], - id, - channelIndexList, - thisDatetime, - wintitle1, - show, - xmin, - xmax, - ymin, - ymax) - - self.draw() - - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") - figfile = self.getFilename(name = str_datetime) + "_" + str(i) - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - + channels = self.data.channels + + thisDatetime = datetime.datetime.utcfromtimestamp(self.data.times[-1]) + + scope = self.data[-1][self.CODE] + + if self.data.flagDataAsBlock: + + for i in range(self.data.nProfiles): + + wintitle1 = " [Profile = %d] " %i + if self.CODE =="scope": + if self.type == "power": + self.plot_power(self.data.yrange, + scope[:,i,:], + channels, + thisDatetime, + wintitle1 + ) + + if self.type == "iq": + self.plot_iq(self.data.yrange, + scope[:,i,:], + channels, + thisDatetime, + wintitle1 + ) + if self.CODE=="pp_power": + self.plot_weatherpower(self.data.yrange, + scope[:,i,:], + channels, + thisDatetime, + wintitle + ) + if self.CODE=="pp_signal": + self.plot_weatherpower(self.data.yrange, + scope[:,i,:], + channels, + thisDatetime, + wintitle + ) + if self.CODE=="pp_velocity": + self.plot_weathervelocity(scope[:,i,:], + self.data.yrange, + channels, + thisDatetime, + wintitle + ) + if self.CODE=="pp_spcwidth": + self.plot_weatherspecwidth(scope[:,i,:], + self.data.yrange, + channels, + thisDatetime, + wintitle + ) else: - wintitle += " [Profile = %d] " %dataOut.profileIndex - - if type == "power": - self.plot_power(dataOut.heightList, - dataOut.data, - id, - channelIndexList, + wintitle = " [Profile = %d] " %self.data.profileIndex + if self.CODE== "scope": + if self.type == "power": + self.plot_power(self.data.yrange, + scope, + channels, + thisDatetime, + wintitle + ) + + if self.type == "iq": + self.plot_iq(self.data.yrange, + scope, + channels, thisDatetime, - wintitle, - show, - xmin, - xmax, - ymin, - ymax) - - if type == "iq": - self.plot_iq(dataOut.heightList, - dataOut.data, - id, - channelIndexList, - thisDatetime, - wintitle, - show, - xmin, - xmax, - ymin, - ymax) - - self.draw() - - str_datetime = thisDatetime.strftime("%Y%m%d_%H%M%S") + "_" + str(dataOut.profileIndex) - figfile = self.getFilename(name = str_datetime) - - self.save(figpath=figpath, - figfile=figfile, - save=save, - ftp=ftp, - wr_period=wr_period, - thisDatetime=thisDatetime) - - return dataOut \ No newline at end of file + wintitle + ) + if self.CODE=="pp_power": + self.plot_weatherpower(self.data.yrange, + scope, + channels, + thisDatetime, + wintitle + ) + if self.CODE=="pp_signal": + self.plot_weatherpower(self.data.yrange, + scope, + channels, + thisDatetime, + wintitle + ) + if self.CODE=="pp_velocity": + self.plot_weathervelocity(scope, + self.data.yrange, + channels, + thisDatetime, + wintitle + ) + if self.CODE=="pp_specwidth": + self.plot_weatherspecwidth(scope, + self.data.yrange, + channels, + thisDatetime, + wintitle + ) + + +class PulsepairPowerPlot(ScopePlot): + ''' + Plot for P= S+N + ''' + + CODE = 'pp_power' + plot_type = 'scatter' + +class PulsepairVelocityPlot(ScopePlot): + ''' + Plot for VELOCITY + ''' + CODE = 'pp_velocity' + plot_type = 'scatter' + +class PulsepairSpecwidthPlot(ScopePlot): + ''' + Plot for WIDTH + ''' + CODE = 'pp_specwidth' + plot_type = 'scatter' + +class PulsepairSignalPlot(ScopePlot): + ''' + Plot for S + ''' + + CODE = 'pp_signal' + plot_type = 'scatter' diff --git a/schainpy/model/graphics/mpldriver.py b/schainpy/model/graphics/mpldriver.py deleted file mode 100644 index c195258..0000000 --- a/schainpy/model/graphics/mpldriver.py +++ /dev/null @@ -1,470 +0,0 @@ -import os -import sys -import datetime -import numpy -from .jroplot_base import matplotlib, make_axes_locatable, FuncFormatter, LinearLocator - -def createFigure(id, wintitle, width, height, facecolor="w", show=True, dpi=80): - - matplotlib.pyplot.ioff() - - fig = matplotlib.pyplot.figure(num=id, facecolor=facecolor, figsize=( - 1.0 * width / dpi, 1.0 * height / dpi)) - fig.canvas.manager.set_window_title(wintitle) -# fig.canvas.manager.resize(width, height) - matplotlib.pyplot.ion() - - if show: - matplotlib.pyplot.show() - - return fig - - -def closeFigure(show=False, fig=None): - - # matplotlib.pyplot.ioff() - # matplotlib.pyplot.pause(0) - - if show: - matplotlib.pyplot.show() - - if fig != None: - matplotlib.pyplot.close(fig) -# matplotlib.pyplot.pause(0) -# matplotlib.pyplot.ion() - - return - - matplotlib.pyplot.close("all") -# matplotlib.pyplot.pause(0) -# matplotlib.pyplot.ion() - - return - - -def saveFigure(fig, filename): - - # matplotlib.pyplot.ioff() - fig.savefig(filename, dpi=matplotlib.pyplot.gcf().dpi) -# matplotlib.pyplot.ion() - - -def clearFigure(fig): - - fig.clf() - - -def setWinTitle(fig, title): - - fig.canvas.manager.set_window_title(title) - - -def setTitle(fig, title): - - fig.suptitle(title) - - -def createAxes(fig, nrow, ncol, xpos, ypos, colspan, rowspan, polar=False): - - matplotlib.pyplot.ioff() - matplotlib.pyplot.figure(fig.number) - axes = matplotlib.pyplot.subplot2grid((nrow, ncol), - (xpos, ypos), - colspan=colspan, - rowspan=rowspan, - polar=polar) - - matplotlib.pyplot.ion() - return axes - - -def setAxesText(ax, text): - - ax.annotate(text, - xy=(.1, .99), - xycoords='figure fraction', - horizontalalignment='left', - verticalalignment='top', - fontsize=10) - - -def printLabels(ax, xlabel, ylabel, title): - - ax.set_xlabel(xlabel, size=11) - ax.set_ylabel(ylabel, size=11) - ax.set_title(title, size=8) - - -def createPline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', - ticksize=9, xtick_visible=True, ytick_visible=True, - nxticks=4, nyticks=10, - grid=None, color='blue'): - """ - - Input: - grid : None, 'both', 'x', 'y' - """ - - matplotlib.pyplot.ioff() - - ax.set_xlim([xmin, xmax]) - ax.set_ylim([ymin, ymax]) - - printLabels(ax, xlabel, ylabel, title) - - ###################################################### - if (xmax - xmin) <= 1: - xtickspos = numpy.linspace(xmin, xmax, nxticks) - xtickspos = numpy.array([float("%.1f" % i) for i in xtickspos]) - ax.set_xticks(xtickspos) - else: - xtickspos = numpy.arange(nxticks) * \ - int((xmax - xmin) / (nxticks)) + int(xmin) -# xtickspos = numpy.arange(nxticks)*float(xmax-xmin)/float(nxticks) + int(xmin) - ax.set_xticks(xtickspos) - - for tick in ax.get_xticklabels(): - tick.set_visible(xtick_visible) - - for tick in ax.xaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - ###################################################### - for tick in ax.get_yticklabels(): - tick.set_visible(ytick_visible) - - for tick in ax.yaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - ax.plot(x, y, color=color) - iplot = ax.lines[-1] - - ###################################################### - if '0.' in matplotlib.__version__[0:2]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - - if '1.0.' in matplotlib.__version__[0:4]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - - if grid != None: - ax.grid(b=True, which='major', axis=grid) - - matplotlib.pyplot.tight_layout() - - matplotlib.pyplot.ion() - - return iplot - - -def set_linedata(ax, x, y, idline): - - ax.lines[idline].set_data(x, y) - - -def pline(iplot, x, y, xlabel='', ylabel='', title=''): - - ax = iplot.axes - - printLabels(ax, xlabel, ylabel, title) - - set_linedata(ax, x, y, idline=0) - - -def addpline(ax, x, y, color, linestyle, lw): - - ax.plot(x, y, color=color, linestyle=linestyle, lw=lw) - - -def createPcolor(ax, x, y, z, xmin, xmax, ymin, ymax, zmin, zmax, - xlabel='', ylabel='', title='', ticksize=9, - colormap='jet', cblabel='', cbsize="5%", - XAxisAsTime=False): - - matplotlib.pyplot.ioff() - - divider = make_axes_locatable(ax) - ax_cb = divider.new_horizontal(size=cbsize, pad=0.05) - fig = ax.get_figure() - fig.add_axes(ax_cb) - - ax.set_xlim([xmin, xmax]) - ax.set_ylim([ymin, ymax]) - - printLabels(ax, xlabel, ylabel, title) - - z = numpy.ma.masked_invalid(z) - cmap = matplotlib.pyplot.get_cmap(colormap) - cmap.set_bad('white', 1.) - imesh = ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap) - cb = matplotlib.pyplot.colorbar(imesh, cax=ax_cb) - cb.set_label(cblabel) - -# for tl in ax_cb.get_yticklabels(): -# tl.set_visible(True) - - for tick in ax.yaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - for tick in ax.xaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - for tick in cb.ax.get_yticklabels(): - tick.set_fontsize(ticksize) - - ax_cb.yaxis.tick_right() - - if '0.' in matplotlib.__version__[0:2]: - print("The matplotlib version has to be updated to 1.1 or newer") - return imesh - - if '1.0.' in matplotlib.__version__[0:4]: - print("The matplotlib version has to be updated to 1.1 or newer") - return imesh - - matplotlib.pyplot.tight_layout() - - if XAxisAsTime: - - def func(x, pos): return ('%s') % ( - datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S")) - ax.xaxis.set_major_formatter(FuncFormatter(func)) - ax.xaxis.set_major_locator(LinearLocator(7)) - - matplotlib.pyplot.ion() - return imesh - - -def pcolor(imesh, z, xlabel='', ylabel='', title=''): - - z = z.T - ax = imesh.axes - printLabels(ax, xlabel, ylabel, title) - imesh.set_array(z.ravel()) - - -def addpcolor(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'): - - printLabels(ax, xlabel, ylabel, title) - - ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, - cmap=matplotlib.pyplot.get_cmap(colormap)) - - -def addpcolorbuffer(ax, x, y, z, zmin, zmax, xlabel='', ylabel='', title='', colormap='jet'): - - printLabels(ax, xlabel, ylabel, title) - - ax.collections.remove(ax.collections[0]) - - z = numpy.ma.masked_invalid(z) - - cmap = matplotlib.pyplot.get_cmap(colormap) - cmap.set_bad('white', 1.) - - ax.pcolormesh(x, y, z.T, vmin=zmin, vmax=zmax, cmap=cmap) - - -def createPmultiline(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None, - ticksize=9, xtick_visible=True, ytick_visible=True, - nxticks=4, nyticks=10, - grid=None): - """ - - Input: - grid : None, 'both', 'x', 'y' - """ - - matplotlib.pyplot.ioff() - - lines = ax.plot(x.T, y) - leg = ax.legend(lines, legendlabels, loc='upper right') - leg.get_frame().set_alpha(0.5) - ax.set_xlim([xmin, xmax]) - ax.set_ylim([ymin, ymax]) - printLabels(ax, xlabel, ylabel, title) - - xtickspos = numpy.arange(nxticks) * \ - int((xmax - xmin) / (nxticks)) + int(xmin) - ax.set_xticks(xtickspos) - - for tick in ax.get_xticklabels(): - tick.set_visible(xtick_visible) - - for tick in ax.xaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - for tick in ax.get_yticklabels(): - tick.set_visible(ytick_visible) - - for tick in ax.yaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - iplot = ax.lines[-1] - - if '0.' in matplotlib.__version__[0:2]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - - if '1.0.' in matplotlib.__version__[0:4]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - - if grid != None: - ax.grid(b=True, which='major', axis=grid) - - matplotlib.pyplot.tight_layout() - - matplotlib.pyplot.ion() - - return iplot - - -def pmultiline(iplot, x, y, xlabel='', ylabel='', title=''): - - ax = iplot.axes - - printLabels(ax, xlabel, ylabel, title) - - for i in range(len(ax.lines)): - line = ax.lines[i] - line.set_data(x[i, :], y) - - -def createPmultilineYAxis(ax, x, y, xmin, xmax, ymin, ymax, xlabel='', ylabel='', title='', legendlabels=None, - ticksize=9, xtick_visible=True, ytick_visible=True, - nxticks=4, nyticks=10, marker='.', markersize=10, linestyle="None", - grid=None, XAxisAsTime=False): - """ - - Input: - grid : None, 'both', 'x', 'y' - """ - - matplotlib.pyplot.ioff() - -# lines = ax.plot(x, y.T, marker=marker,markersize=markersize,linestyle=linestyle) - lines = ax.plot(x, y.T) -# leg = ax.legend(lines, legendlabels, loc=2, bbox_to_anchor=(1.01, 1.00), numpoints=1, handlelength=1.5, \ -# handletextpad=0.5, borderpad=0.5, labelspacing=0.5, borderaxespad=0.) - - leg = ax.legend(lines, legendlabels, - loc='upper right', bbox_to_anchor=(1.16, 1), borderaxespad=0) - - for label in leg.get_texts(): - label.set_fontsize(9) - - ax.set_xlim([xmin, xmax]) - ax.set_ylim([ymin, ymax]) - printLabels(ax, xlabel, ylabel, title) - -# xtickspos = numpy.arange(nxticks)*int((xmax-xmin)/(nxticks)) + int(xmin) -# ax.set_xticks(xtickspos) - - for tick in ax.get_xticklabels(): - tick.set_visible(xtick_visible) - - for tick in ax.xaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - for tick in ax.get_yticklabels(): - tick.set_visible(ytick_visible) - - for tick in ax.yaxis.get_major_ticks(): - tick.label.set_fontsize(ticksize) - - iplot = ax.lines[-1] - - if '0.' in matplotlib.__version__[0:2]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - - if '1.0.' in matplotlib.__version__[0:4]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - - if grid != None: - ax.grid(b=True, which='major', axis=grid) - - matplotlib.pyplot.tight_layout() - - if XAxisAsTime: - - def func(x, pos): return ('%s') % ( - datetime.datetime.utcfromtimestamp(x).strftime("%H:%M:%S")) - ax.xaxis.set_major_formatter(FuncFormatter(func)) - ax.xaxis.set_major_locator(LinearLocator(7)) - - matplotlib.pyplot.ion() - - return iplot - - -def pmultilineyaxis(iplot, x, y, xlabel='', ylabel='', title=''): - - ax = iplot.axes - printLabels(ax, xlabel, ylabel, title) - - for i in range(len(ax.lines)): - line = ax.lines[i] - line.set_data(x, y[i, :]) - - -def createPolar(ax, x, y, - xlabel='', ylabel='', title='', ticksize=9, - colormap='jet', cblabel='', cbsize="5%", - XAxisAsTime=False): - - matplotlib.pyplot.ioff() - - ax.plot(x, y, 'bo', markersize=5) -# ax.set_rmax(90) - ax.set_ylim(0, 90) - ax.set_yticks(numpy.arange(0, 90, 20)) -# ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center' ,size='11') -# ax.text(0, 50, ylabel, rotation='vertical', va ='center', ha = 'left' ,size='11') -# ax.text(100, 100, 'example', ha='left', va='center', rotation='vertical') - ax.yaxis.labelpad = 40 - printLabels(ax, xlabel, ylabel, title) - iplot = ax.lines[-1] - - if '0.' in matplotlib.__version__[0:2]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - - if '1.0.' in matplotlib.__version__[0:4]: - print("The matplotlib version has to be updated to 1.1 or newer") - return iplot - -# if grid != None: -# ax.grid(b=True, which='major', axis=grid) - - matplotlib.pyplot.tight_layout() - - matplotlib.pyplot.ion() - - return iplot - - -def polar(iplot, x, y, xlabel='', ylabel='', title=''): - - ax = iplot.axes - -# ax.text(0, -110, ylabel, rotation='vertical', va ='center', ha = 'center',size='11') - printLabels(ax, xlabel, ylabel, title) - - set_linedata(ax, x, y, idline=0) - - -def draw(fig): - - if type(fig) == 'int': - raise ValueError("Error drawing: Fig parameter should be a matplotlib figure object figure") - - fig.canvas.draw() - - -def pause(interval=0.000001): - - matplotlib.pyplot.pause(interval) \ No newline at end of file diff --git a/schainpy/model/io/__init__.py b/schainpy/model/io/__init__.py index 4bb334f..f6c6768 100644 --- a/schainpy/model/io/__init__.py +++ b/schainpy/model/io/__init__.py @@ -20,4 +20,5 @@ from .bltrIO_spectra import * from .jroIO_mira35c import * from .julIO_param import * -from .pxIO_param import * \ No newline at end of file +from .pxIO_param import * +from .jroIO_simulator import * \ No newline at end of file diff --git a/schainpy/model/io/bltrIO_param.py b/schainpy/model/io/bltrIO_param.py index ab3a29c..3adb361 100644 --- a/schainpy/model/io/bltrIO_param.py +++ b/schainpy/model/io/bltrIO_param.py @@ -16,7 +16,7 @@ import numpy import schainpy.admin from schainpy.model.proc.jroproc_base import ProcessingUnit, MPDecorator from schainpy.model.data.jrodata import Parameters -from schainpy.model.io.jroIO_base import JRODataReader, isNumber +from schainpy.model.io.jroIO_base import Reader from schainpy.utils import log FILE_HEADER_STRUCTURE = numpy.dtype([ @@ -84,8 +84,8 @@ DATA_STRUCTURE = numpy.dtype([ ('sea_algorithm', '0: - log.warning( - "Waiting %0.2f seconds for the next file, try %03d ..." % (self.delay, n+1), - self.name - ) - time.sleep(self.delay) - file_list = os.listdir(self.path) - file_list.sort() - if file_list: - if self.filename: - if file_list[-1] not in self.filename: - return file_list[-1] - else: - continue - return file_list[-1] - return 0 - - def search_files(self, path, startDate, endDate, ext): + dt = self.datatime + datetime.timedelta(1) + filename = '{}.{}{}'.format(self.siteFile, dt.strftime('%Y%m%d'), self.ext) + fullfilename = os.path.join(self.path, filename) + if os.path.exists(fullfilename): + return fullfilename, filename + return None, filename + + + def readFirstHeader(self): ''' - Searching for BLTR rawdata file in path - Creating a list of file to proces included in [startDate,endDate] - - Input: - path - Path to find BLTR rawdata files - startDate - Select file from this date - enDate - Select file until this date - ext - Extension of the file to read ''' - - log.success('Searching files in {} '.format(path), 'BLTRParamReader') - foldercounter = 0 - fileList0 = glob.glob1(path, "*%s" % ext) - fileList0.sort() - - for thisFile in fileList0: - year = thisFile[-14:-10] - if not isNumber(year): - continue - - month = thisFile[-10:-8] - if not isNumber(month): - continue - - day = thisFile[-8:-6] - if not isNumber(day): - continue - - year, month, day = int(year), int(month), int(day) - dateFile = datetime.date(year, month, day) - if (startDate > dateFile) or (endDate < dateFile): - continue - - yield thisFile - - return - - def setNextFile(self): - - if self.online: - filename = self.search_last_file() - if not filename: - self.flagNoMoreFiles = 1 - return 0 - else: - try: - filename = next(self.fileList) - except StopIteration: - self.flagNoMoreFiles = 1 - return 0 - - log.success('Opening {}'.format(filename), 'BLTRParamReader') - - dirname, name = os.path.split(filename) # 'peru2' ---> Piura - 'peru1' ---> Huancayo or Porcuya - self.siteFile = filename.split('.')[0] - if self.filename is not None: - self.fp.close() - self.filename = os.path.join(self.path, filename) - self.fp = open(self.filename, 'rb') + self.siteFile = self.filename.split('/')[-1].split('.')[0] self.header_file = numpy.fromfile(self.fp, FILE_HEADER_STRUCTURE, 1) self.nrecords = self.header_file['nrec'][0] - self.sizeOfFile = os.path.getsize(self.filename) self.counter_records = 0 self.flagIsNewFile = 0 self.fileIndex += 1 - return 1 - def readNextBlock(self): while True: @@ -242,7 +183,6 @@ class BLTRParamReader(JRODataReader, ProcessingUnit): self.flagIsNewFile = 1 if not self.setNextFile(): return 0 - try: pointer = self.fp.tell() self.readBlock() @@ -266,7 +206,6 @@ class BLTRParamReader(JRODataReader, ProcessingUnit): log.log('Reading Record No. {} -> {}'.format( self.counter_records, - # self.nrecords, self.datatime.ctime()), 'BLTRParamReader') return 1 @@ -365,17 +304,15 @@ class BLTRParamReader(JRODataReader, ProcessingUnit): Storing data from databuffer to dataOut object ''' - self.dataOut.data_SNR = self.snr + self.dataOut.data_snr = self.snr self.dataOut.height = self.height self.dataOut.data = self.buffer self.dataOut.utctimeInit = self.time self.dataOut.utctime = self.dataOut.utctimeInit self.dataOut.useLocalTime = False self.dataOut.paramInterval = 157 - self.dataOut.timezone = self.timezone self.dataOut.site = self.siteFile self.dataOut.nrecords = self.nrecords / self.nmodes - self.dataOut.sizeOfFile = self.sizeOfFile self.dataOut.lat = self.lat self.dataOut.lon = self.lon self.dataOut.channelList = list(range(self.nchannels)) @@ -395,13 +332,24 @@ class BLTRParamReader(JRODataReader, ProcessingUnit): ''' if self.flagNoMoreFiles: self.dataOut.flagNoData = True - raise schainpy.admin.SchainError('No More files to read') + return 0 if not self.readNextBlock(): self.dataOut.flagNoData = True - raise schainpy.admin.SchainError('Time for wait new file reach!!!') + return 0 self.set_output() return 1 - \ No newline at end of file + + def run(self, **kwargs): + ''' + ''' + + if not(self.isConfig): + self.setup(**kwargs) + self.isConfig = True + + self.getData() + + return \ No newline at end of file diff --git a/schainpy/model/io/bltrIO_spectra.py b/schainpy/model/io/bltrIO_spectra.py index b0eccef..f98874d 100644 --- a/schainpy/model/io/bltrIO_spectra.py +++ b/schainpy/model/io/bltrIO_spectra.py @@ -1,16 +1,8 @@ import os import sys import glob -import fnmatch -import datetime -import time -import re -import h5py import numpy -import pylab as plb -from scipy.optimize import curve_fit -from scipy import asarray as ar, exp SPEED_OF_LIGHT = 299792458 SPEED_OF_LIGHT = 3e8 @@ -19,9 +11,9 @@ from .utils import folder_in_range import schainpy.admin from schainpy.model.data.jrodata import Spectra -from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator +from schainpy.model.proc.jroproc_base import ProcessingUnit from schainpy.utils import log -from schainpy.model.io.jroIO_base import JRODataReader + def pol2cart(rho, phi): x = rho * numpy.cos(phi) @@ -247,7 +239,7 @@ class RecordHeaderBLTR(): return 1 -@MPDecorator + class BLTRSpectraReader (ProcessingUnit): def __init__(self): @@ -423,7 +415,6 @@ class BLTRSpectraReader (ProcessingUnit): copy = self.data_block.copy() spc = copy * numpy.conjugate(copy) self.data_spc = numpy.absolute(spc) # valor absoluto o magnitud - self.dataOut.data_spc = self.data_spc cspc = self.data_block.copy() self.data_cspc = self.data_block.copy() diff --git a/schainpy/model/io/jroIO_base.py b/schainpy/model/io/jroIO_base.py index a706c65..7d17366 100644 --- a/schainpy/model/io/jroIO_base.py +++ b/schainpy/model/io/jroIO_base.py @@ -14,6 +14,7 @@ import time import datetime import zmq +from schainpy.model.proc.jroproc_base import Operation, MPDecorator from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader from schainpy.model.data.jroheaderIO import get_dtype_index, get_numpy_dtype, get_procflag_dtype, get_dtype_width from schainpy.utils import log @@ -527,7 +528,7 @@ class Reader(object): if files: fo = files[-1] try: - dt = datetime.datetime.strptime(parse_format(fo, filefmt), filefmt).date() + dt = datetime.datetime.strptime(parse_format(fo, filefmt), filefmt).date() yield os.path.join(path, expLabel, fo) except Exception as e: pass @@ -591,25 +592,26 @@ class Reader(object): def setNextFile(self): """Set the next file to be readed open it and parse de file header""" - if self.fp != None: - self.fp.close() + while True: + if self.fp != None: + self.fp.close() - if self.online: - newFile = self.setNextFileOnline() - else: - newFile = self.setNextFileOffline() - - if not(newFile): if self.online: - raise schainpy.admin.SchainError('Time to wait for new files reach') + newFile = self.setNextFileOnline() else: - if self.fileIndex == -1: - raise schainpy.admin.SchainWarning('No files found in the given path') + newFile = self.setNextFileOffline() + + if not(newFile): + if self.online: + raise schainpy.admin.SchainError('Time to wait for new files reach') else: - raise schainpy.admin.SchainWarning('No more files to read') - - if not(self.verifyFile(self.filename)): - self.setNextFile() + if self.fileIndex == -1: + raise schainpy.admin.SchainWarning('No files found in the given path') + else: + raise schainpy.admin.SchainWarning('No more files to read') + + if self.verifyFile(self.filename): + break log.log('Opening file: %s' % self.filename, self.name) @@ -643,7 +645,7 @@ class Reader(object): nextFile = False continue - if fullfilename: + if fullfilename is not None: break self.nTries = 1 @@ -651,7 +653,8 @@ class Reader(object): if nFiles == (self.nFiles - 1): log.log('Trying with next day...', self.name) - nextDay = True + nextDay = True + self.nTries = 3 if fullfilename: self.fileSize = os.path.getsize(fullfilename) @@ -683,6 +686,15 @@ class Reader(object): return 1 + @staticmethod + def isDateTimeInRange(dt, startDate, endDate, startTime, endTime): + """Check if the given datetime is in range""" + + if startDate <= dt.date() <= endDate: + if startTime <= dt.time() <= endTime: + return True + return False + def verifyFile(self, filename): """Check for a valid file @@ -705,6 +717,35 @@ class Reader(object): pass + def waitDataBlock(self, pointer_location, blocksize=None): + """ + """ + + currentPointer = pointer_location + if blocksize is None: + neededSize = self.processingHeaderObj.blockSize # + self.basicHeaderSize + else: + neededSize = blocksize + + for nTries in range(self.nTries): + self.fp.close() + self.fp = open(self.filename, 'rb') + self.fp.seek(currentPointer) + + self.fileSize = os.path.getsize(self.filename) + currentSize = self.fileSize - currentPointer + + if (currentSize >= neededSize): + return 1 + + log.warning( + "Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries + 1), + self.name + ) + time.sleep(self.delay) + + return 0 + class JRODataReader(Reader): utc = 0 @@ -713,9 +754,9 @@ class JRODataReader(Reader): firstHeaderSize = 0 basicHeaderSize = 24 __isFirstTimeOnline = 1 - __printInfo = True filefmt = "*%Y%j***" folderfmt = "*%Y%j" + __attrs__ = ['path', 'startDate', 'endDate', 'startTime', 'endTime', 'online', 'delay', 'walk'] def getDtypeWidth(self): @@ -816,33 +857,6 @@ class JRODataReader(Reader): return 0 - def waitDataBlock(self, pointer_location, blocksize=None): - - currentPointer = pointer_location - if blocksize is None: - neededSize = self.processingHeaderObj.blockSize # + self.basicHeaderSize - else: - neededSize = blocksize - - for nTries in range(self.nTries): - self.fp.close() - self.fp = open(self.filename, 'rb') - self.fp.seek(currentPointer) - - self.fileSize = os.path.getsize(self.filename) - currentSize = self.fileSize - currentPointer - - if (currentSize >= neededSize): - return 1 - - log.warning( - "Waiting %0.2f seconds for the next block, try %03d ..." % (self.delay, nTries + 1), - self.name - ) - time.sleep(self.delay) - - return 0 - def __setNewBlock(self): if self.fp == None: @@ -887,13 +901,15 @@ class JRODataReader(Reader): def readNextBlock(self): while True: - self.__setNewBlock() + if not(self.__setNewBlock()): + continue if not(self.readBlock()): return 0 self.getBasicHeader() - if (self.dataOut.datatime < datetime.datetime.combine(self.startDate, self.startTime)) or (self.dataOut.datatime > datetime.datetime.combine(self.endDate, self.endTime)): + + if not self.isDateTimeInRange(self.dataOut.datatime, self.startDate, self.endDate, self.startTime, self.endTime): print("[Reading] Block No. %d/%d -> %s [Skipping]" % (self.nReadBlocks, self.processingHeaderObj.dataBlocksPerFile, self.dataOut.datatime.ctime())) @@ -941,59 +957,49 @@ class JRODataReader(Reader): # self.dataOut.channelIndexList = numpy.arange(self.systemHeaderObj.numChannels) self.getBlockDimension() - def verifyFile(self, filename, msgFlag=True): + def verifyFile(self, filename): - msg = None + flag = True try: fp = open(filename, 'rb') except IOError: - - if msgFlag: - print("[Reading] File %s can't be opened" % (filename)) - + log.error("File {} can't be opened".format(filename), self.name) return False - - currentPosition = fp.tell() - neededSize = self.processingHeaderObj.blockSize + self.firstHeaderSize - - if neededSize == 0: - basicHeaderObj = BasicHeader(LOCALTIME) - systemHeaderObj = SystemHeader() - radarControllerHeaderObj = RadarControllerHeader() - processingHeaderObj = ProcessingHeader() - - if not(basicHeaderObj.read(fp)): - fp.close() - return False - - if not(systemHeaderObj.read(fp)): - fp.close() - return False - - if not(radarControllerHeaderObj.read(fp)): - fp.close() - return False - - if not(processingHeaderObj.read(fp)): - fp.close() - return False - - neededSize = processingHeaderObj.blockSize + basicHeaderObj.size - else: - msg = "[Reading] Skipping the file %s due to it hasn't enough data" % filename + + if self.online and self.waitDataBlock(0): + pass + + basicHeaderObj = BasicHeader(LOCALTIME) + systemHeaderObj = SystemHeader() + radarControllerHeaderObj = RadarControllerHeader() + processingHeaderObj = ProcessingHeader() + + if not(basicHeaderObj.read(fp)): + flag = False + if not(systemHeaderObj.read(fp)): + flag = False + if not(radarControllerHeaderObj.read(fp)): + flag = False + if not(processingHeaderObj.read(fp)): + flag = False + if not self.online: + dt1 = basicHeaderObj.datatime + pos = self.fileSize-processingHeaderObj.blockSize-24 + if pos<0: + flag = False + log.error('Invalid size for file: {}'.format(self.filename), self.name) + else: + fp.seek(pos) + if not(basicHeaderObj.read(fp)): + flag = False + dt2 = basicHeaderObj.datatime + if not self.isDateTimeInRange(dt1, self.startDate, self.endDate, self.startTime, self.endTime) and not \ + self.isDateTimeInRange(dt2, self.startDate, self.endDate, self.startTime, self.endTime): + flag = False fp.close() - - fileSize = os.path.getsize(filename) - currentSize = fileSize - currentPosition - - if currentSize < neededSize: - if msgFlag and (msg != None): - print(msg) - return False - - return True + return flag def findDatafiles(self, path, startDate=None, endDate=None, expLabel='', ext='.r', walk=True, include_path=False): @@ -1175,9 +1181,7 @@ class JRODataReader(Reader): self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs - - # self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock*self.nTxs - + def getFirstHeader(self): raise NotImplementedError @@ -1206,26 +1210,6 @@ class JRODataReader(Reader): print("[Reading] Number of read blocks %04d" % self.nTotalBlocks) - def printNumberOfBlock(self): - 'SPAM!' - - # if self.flagIsNewBlock: - # print "[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks, - # self.processingHeaderObj.dataBlocksPerFile, - # self.dataOut.datatime.ctime()) - - def printInfo(self): - - if self.__printInfo == False: - return - - self.basicHeaderObj.printInfo() - self.systemHeaderObj.printInfo() - self.radarControllerHeaderObj.printInfo() - self.processingHeaderObj.printInfo() - - self.__printInfo = False - def run(self, **kwargs): """ @@ -1565,3 +1549,27 @@ class JRODataWriter(Reader): self.dataOut = dataOut self.putData() return self.dataOut + +@MPDecorator +class printInfo(Operation): + + def __init__(self): + + Operation.__init__(self) + self.__printInfo = True + + def run(self, dataOut, headers = ['systemHeaderObj', 'radarControllerHeaderObj', 'processingHeaderObj']): + if self.__printInfo == False: + return + + for header in headers: + if hasattr(dataOut, header): + obj = getattr(dataOut, header) + if hasattr(obj, 'printInfo'): + obj.printInfo() + else: + print(obj) + else: + log.warning('Header {} Not found in object'.format(header)) + + self.__printInfo = False diff --git a/schainpy/model/io/jroIO_digitalRF.py b/schainpy/model/io/jroIO_digitalRF.py index f0cf564..9d1ca09 100644 --- a/schainpy/model/io/jroIO_digitalRF.py +++ b/schainpy/model/io/jroIO_digitalRF.py @@ -1,4 +1,3 @@ - ''' Created on Jul 3, 2014 @@ -29,9 +28,9 @@ import pickle try: import digital_rf except: - print('You should install "digital_rf" module if you want to read Digital RF data') + pass + -@MPDecorator class DigitalRFReader(ProcessingUnit): ''' classdocs @@ -116,7 +115,7 @@ class DigitalRFReader(ProcessingUnit): self.dataOut.channelList = list(range(self.__num_subchannels)) - self.dataOut.blocksize = self.dataOut.getNChannels() * self.dataOut.getNHeights() + self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights # self.dataOut.channelIndexList = None @@ -633,7 +632,7 @@ class DigitalRFReader(ProcessingUnit): return - +@MPDecorator class DigitalRFWriter(Operation): ''' classdocs diff --git a/schainpy/model/io/jroIO_heispectra.py b/schainpy/model/io/jroIO_heispectra.py index 69b81a3..3832760 100644 --- a/schainpy/model/io/jroIO_heispectra.py +++ b/schainpy/model/io/jroIO_heispectra.py @@ -14,7 +14,7 @@ from time import sleep try: import pyfits except ImportError as e: - print("Fits data cannot be used. Install pyfits module") + pass from xml.etree.ElementTree import ElementTree @@ -120,6 +120,7 @@ class Metadata(object): parmConfObj.readXml(parmElement) self.parmConfObjList.append(parmConfObj) +@MPDecorator class FitsWriter(Operation): def __init__(self, **kwargs): Operation.__init__(self, **kwargs) @@ -283,7 +284,7 @@ class FitsWriter(Operation): self.isConfig = True self.putData() -@MPDecorator + class FitsReader(ProcessingUnit): # __TIMEZONE = time.timezone diff --git a/schainpy/model/io/jroIO_hf.py b/schainpy/model/io/jroIO_hf.py index 2a89ab1..03d2596 100644 --- a/schainpy/model/io/jroIO_hf.py +++ b/schainpy/model/io/jroIO_hf.py @@ -764,7 +764,7 @@ class HFReader(ProcessingUnit): self.dataOut.nCohInt = 1 - self.dataOut.blocksize = self.dataOut.getNChannels() * self.dataOut.getNHeights() + self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights self.dataOut.flagDecodeData = False #asumo que la data esta decodificada diff --git a/schainpy/model/io/jroIO_kamisr.py b/schainpy/model/io/jroIO_kamisr.py index d202d9a..23f1f40 100644 --- a/schainpy/model/io/jroIO_kamisr.py +++ b/schainpy/model/io/jroIO_kamisr.py @@ -510,7 +510,7 @@ class AMISRReader(ProcessingUnit): self.dataOut.channelList = self.__channelList - self.dataOut.blocksize = self.dataOut.getNChannels() * self.dataOut.getNHeights() + self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights # self.dataOut.channelIndexList = None diff --git a/schainpy/model/io/jroIO_madrigal.py b/schainpy/model/io/jroIO_madrigal.py index d99145c..485428c 100644 --- a/schainpy/model/io/jroIO_madrigal.py +++ b/schainpy/model/io/jroIO_madrigal.py @@ -23,9 +23,7 @@ from schainpy.utils import log try: import madrigal.cedar except: - log.warning( - 'You should install "madrigal library" module if you want to read/write Madrigal data' - ) + pass try: basestring @@ -80,7 +78,7 @@ def load_json(obj): return iterable -@MPDecorator + class MADReader(Reader, ProcessingUnit): def __init__(self): diff --git a/schainpy/model/io/jroIO_mira35c.py b/schainpy/model/io/jroIO_mira35c.py index 19acf20..ab348a6 100644 --- a/schainpy/model/io/jroIO_mira35c.py +++ b/schainpy/model/io/jroIO_mira35c.py @@ -699,7 +699,7 @@ class MIRA35CReader (ProcessingUnit, FileHeaderMIRA35c, SRVIHeader, RecordHeader self.dataOut.utctime = dwell self.dataOut.timeZone = 0 - self.dataOut.outputInterval = self.dataOut.getTimeInterval() + self.dataOut.outputInterval = self.dataOut.timeInterval self.dataOut.heightList = self.SPARrawGate1 * self.__deltaHeigth + \ numpy.array(list(range(self.Num_Hei))) * self.__deltaHeigth diff --git a/schainpy/model/io/jroIO_param.py b/schainpy/model/io/jroIO_param.py index 252a815..9c37353 100644 --- a/schainpy/model/io/jroIO_param.py +++ b/schainpy/model/io/jroIO_param.py @@ -1,992 +1,99 @@ -import numpy -import time import os -import h5py -import re +import time import datetime +import numpy +import h5py + import schainpy.admin from schainpy.model.data.jrodata import * from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator from schainpy.model.io.jroIO_base import * from schainpy.utils import log -@MPDecorator -class ParamReader(JRODataReader,ProcessingUnit): - ''' - Reads HDF5 format files - path - startDate - endDate - startTime - endTime - ''' - - ext = ".hdf5" - optchar = "D" - timezone = None - startTime = None - endTime = None - fileIndex = None - utcList = None #To select data in the utctime list - blockList = None #List to blocks to be read from the file - blocksPerFile = None #Number of blocks to be read - blockIndex = None - path = None - #List of Files - filenameList = None - datetimeList = None - #Hdf5 File - listMetaname = None - listMeta = None - listDataname = None - listData = None - listShapes = None - fp = None - #dataOut reconstruction - dataOut = None - - def __init__(self):#, **kwargs): - ProcessingUnit.__init__(self) #, **kwargs) - self.dataOut = Parameters() - return - - def setup(self, **kwargs): - - path = kwargs['path'] - startDate = kwargs['startDate'] - endDate = kwargs['endDate'] - startTime = kwargs['startTime'] - endTime = kwargs['endTime'] - walk = kwargs['walk'] - if 'ext' in kwargs: - ext = kwargs['ext'] - else: - ext = '.hdf5' - if 'timezone' in kwargs: - self.timezone = kwargs['timezone'] - else: - self.timezone = 'lt' - - print("[Reading] Searching files in offline mode ...") - pathList, filenameList = self.searchFilesOffLine(path, startDate=startDate, endDate=endDate, - startTime=startTime, endTime=endTime, - ext=ext, walk=walk) - - if not(filenameList): - print("There is no files into the folder: %s"%(path)) - sys.exit(-1) - - self.fileIndex = -1 - self.startTime = startTime - self.endTime = endTime - - self.__readMetadata() - - self.__setNextFileOffline() - - return - - def searchFilesOffLine(self, - path, - startDate=None, - endDate=None, - startTime=datetime.time(0,0,0), - endTime=datetime.time(23,59,59), - ext='.hdf5', - walk=True): - - expLabel = '' - self.filenameList = [] - self.datetimeList = [] - - pathList = [] - - JRODataObj = JRODataReader() - dateList, pathList = JRODataObj.findDatafiles(path, startDate, endDate, expLabel, ext, walk, include_path=True) - - if dateList == []: - print("[Reading] No *%s files in %s from %s to %s)"%(ext, path, - datetime.datetime.combine(startDate,startTime).ctime(), - datetime.datetime.combine(endDate,endTime).ctime())) - - return None, None - - if len(dateList) > 1: - print("[Reading] %d days were found in date range: %s - %s" %(len(dateList), startDate, endDate)) - else: - print("[Reading] data was found for the date %s" %(dateList[0])) - - filenameList = [] - datetimeList = [] - - #---------------------------------------------------------------------------------- - - for thisPath in pathList: - - fileList = glob.glob1(thisPath, "*%s" %ext) - fileList.sort() - - for file in fileList: - - filename = os.path.join(thisPath,file) - - if not isFileInDateRange(filename, startDate, endDate): - continue - - thisDatetime = self.__isFileInTimeRange(filename, startDate, endDate, startTime, endTime) - - if not(thisDatetime): - continue - - filenameList.append(filename) - datetimeList.append(thisDatetime) - - if not(filenameList): - print("[Reading] Any file was found int time range %s - %s" %(datetime.datetime.combine(startDate,startTime).ctime(), datetime.datetime.combine(endDate,endTime).ctime())) - return None, None - - print("[Reading] %d file(s) was(were) found in time range: %s - %s" %(len(filenameList), startTime, endTime)) - print() - - self.filenameList = filenameList - self.datetimeList = datetimeList - - return pathList, filenameList - - def __isFileInTimeRange(self,filename, startDate, endDate, startTime, endTime): - - """ - Retorna 1 si el archivo de datos se encuentra dentro del rango de horas especificado. - Inputs: - filename : nombre completo del archivo de datos en formato Jicamarca (.r) - startDate : fecha inicial del rango seleccionado en formato datetime.date - endDate : fecha final del rango seleccionado en formato datetime.date - startTime : tiempo inicial del rango seleccionado en formato datetime.time - endTime : tiempo final del rango seleccionado en formato datetime.time - - Return: - Boolean : Retorna True si el archivo de datos contiene datos en el rango de - fecha especificado, de lo contrario retorna False. - - Excepciones: - Si el archivo no existe o no puede ser abierto - Si la cabecera no puede ser leida. - - """ - - try: - fp = h5py.File(filename,'r') - grp1 = fp['Data'] - - except IOError: - traceback.print_exc() - raise IOError("The file %s can't be opened" %(filename)) - - #In case has utctime attribute - grp2 = grp1['utctime'] - # thisUtcTime = grp2.value[0] - 5*3600 #To convert to local time - thisUtcTime = grp2.value[0] - - fp.close() - - if self.timezone == 'lt': - thisUtcTime -= 5*3600 - - thisDatetime = datetime.datetime.fromtimestamp(thisUtcTime[0] + 5*3600) - thisDate = thisDatetime.date() - thisTime = thisDatetime.time() - - startUtcTime = (datetime.datetime.combine(thisDate,startTime)- datetime.datetime(1970, 1, 1)).total_seconds() - endUtcTime = (datetime.datetime.combine(thisDate,endTime)- datetime.datetime(1970, 1, 1)).total_seconds() - - #General case - # o>>>>>>>>>>>>>><<<<<<<<<<<<<= startTime: - thisUtcLog = numpy.logical_and(thisUtcTime > startUtcTime, thisUtcTime < endUtcTime) - if numpy.any(thisUtcLog): #If there is one block between the hours mentioned - return thisDatetime - return None - - #If endTime < startTime then endTime belongs to the next day - #<<<<<<<<<<>>>>>>>>>> - #-----------o----------------------------o----------- - # endTime startTime - - if (thisDate == startDate) and numpy.all(thisUtcTime < startUtcTime): - return None - - if (thisDate == endDate) and numpy.all(thisUtcTime > endUtcTime): - return None - - if numpy.all(thisUtcTime < startUtcTime) and numpy.all(thisUtcTime > endUtcTime): - return None - - return thisDatetime - - def __setNextFileOffline(self): - - self.fileIndex += 1 - idFile = self.fileIndex - - if not(idFile < len(self.filenameList)): - raise schainpy.admin.SchainError("No more Files") - return 0 - - filename = self.filenameList[idFile] - filePointer = h5py.File(filename,'r') - self.filename = filename - self.fp = filePointer - - print("Setting the file: %s"%self.filename) - - self.__setBlockList() - self.__readData() - self.blockIndex = 0 - return 1 - - def __setBlockList(self): - ''' - Selects the data within the times defined - - self.fp - self.startTime - self.endTime - - self.blockList - self.blocksPerFile - - ''' - fp = self.fp - startTime = self.startTime - endTime = self.endTime - - grp = fp['Data'] - thisUtcTime = grp['utctime'].value.astype(numpy.float)[0] - - #ERROOOOR - if self.timezone == 'lt': - thisUtcTime -= 5*3600 - - thisDatetime = datetime.datetime.fromtimestamp(thisUtcTime[0] + 5*3600) - - thisDate = thisDatetime.date() - thisTime = thisDatetime.time() - - startUtcTime = (datetime.datetime.combine(thisDate,startTime) - datetime.datetime(1970, 1, 1)).total_seconds() - endUtcTime = (datetime.datetime.combine(thisDate,endTime) - datetime.datetime(1970, 1, 1)).total_seconds() - - ind = numpy.where(numpy.logical_and(thisUtcTime >= startUtcTime, thisUtcTime < endUtcTime))[0] - - self.blockList = ind - self.blocksPerFile = len(ind) - - return - - def __readMetadata(self): - ''' - Reads Metadata - - self.pathMeta - self.listShapes - self.listMetaname - self.listMeta - - ''' - - filename = self.filenameList[0] - fp = h5py.File(filename,'r') - gp = fp['Metadata'] - - listMetaname = [] - listMetadata = [] - for item in list(gp.items()): - name = item[0] - - if name=='array dimensions': - table = gp[name][:] - listShapes = {} - for shapes in table: - listShapes[shapes[0]] = numpy.array([shapes[1],shapes[2],shapes[3],shapes[4],shapes[5]]) - else: - data = gp[name].value - listMetaname.append(name) - listMetadata.append(data) - - self.listShapes = listShapes - self.listMetaname = listMetaname - self.listMeta = listMetadata - - fp.close() - return - - def __readData(self): - grp = self.fp['Data'] - listdataname = [] - listdata = [] - - for item in list(grp.items()): - name = item[0] - listdataname.append(name) - - array = self.__setDataArray(grp[name],self.listShapes[name]) - listdata.append(array) - - self.listDataname = listdataname - self.listData = listdata - return - - def __setDataArray(self, dataset, shapes): - - nDims = shapes[0] - nDim2 = shapes[1] #Dimension 0 - nDim1 = shapes[2] #Dimension 1, number of Points or Parameters - nDim0 = shapes[3] #Dimension 2, number of samples or ranges - mode = shapes[4] #Mode of storing - blockList = self.blockList - blocksPerFile = self.blocksPerFile - - #Depending on what mode the data was stored - if mode == 0: #Divided in channels - arrayData = dataset.value.astype(numpy.float)[0][blockList] - if mode == 1: #Divided in parameter - strds = 'table' - nDatas = nDim1 - newShapes = (blocksPerFile,nDim2,nDim0) - elif mode==2: #Concatenated in a table - strds = 'table0' - arrayData = dataset[strds].value - #Selecting part of the dataset - utctime = arrayData[:,0] - u, indices = numpy.unique(utctime, return_index=True) - - if blockList.size != indices.size: - indMin = indices[blockList[0]] - if blockList[1] + 1 >= indices.size: - arrayData = arrayData[indMin:,:] - else: - indMax = indices[blockList[1] + 1] - arrayData = arrayData[indMin:indMax,:] - return arrayData - - # One dimension - if nDims == 0: - arrayData = dataset.value.astype(numpy.float)[0][blockList] - - # Two dimensions - elif nDims == 2: - arrayData = numpy.zeros((blocksPerFile,nDim1,nDim0)) - newShapes = (blocksPerFile,nDim0) - nDatas = nDim1 - - for i in range(nDatas): - data = dataset[strds + str(i)].value - arrayData[:,i,:] = data[blockList,:] - - # Three dimensions - else: - arrayData = numpy.zeros((blocksPerFile,nDim2,nDim1,nDim0)) - for i in range(nDatas): - - data = dataset[strds + str(i)].value - - for b in range(blockList.size): - arrayData[b,:,i,:] = data[:,:,blockList[b]] - - return arrayData - - def __setDataOut(self): - listMeta = self.listMeta - listMetaname = self.listMetaname - listDataname = self.listDataname - listData = self.listData - listShapes = self.listShapes - - blockIndex = self.blockIndex - # blockList = self.blockList - - for i in range(len(listMeta)): - setattr(self.dataOut,listMetaname[i],listMeta[i]) - - for j in range(len(listData)): - nShapes = listShapes[listDataname[j]][0] - mode = listShapes[listDataname[j]][4] - if nShapes == 1: - setattr(self.dataOut,listDataname[j],listData[j][blockIndex]) - elif nShapes > 1: - setattr(self.dataOut,listDataname[j],listData[j][blockIndex,:]) - elif mode==0: - setattr(self.dataOut,listDataname[j],listData[j][blockIndex]) - #Mode Meteors - elif mode ==2: - selectedData = self.__selectDataMode2(listData[j], blockIndex) - setattr(self.dataOut, listDataname[j], selectedData) - return - - def __selectDataMode2(self, data, blockIndex): - utctime = data[:,0] - aux, indices = numpy.unique(utctime, return_inverse=True) - selInd = numpy.where(indices == blockIndex)[0] - selData = data[selInd,:] - - return selData - - def getData(self): - - if self.blockIndex==self.blocksPerFile: - if not( self.__setNextFileOffline() ): - self.dataOut.flagNoData = True - return 0 - - self.__setDataOut() - self.dataOut.flagNoData = False - - self.blockIndex += 1 - - return - - def run(self, **kwargs): - - if not(self.isConfig): - self.setup(**kwargs) - self.isConfig = True - - self.getData() - - return - -@MPDecorator -class ParamWriter(Operation): - ''' - HDF5 Writer, stores parameters data in HDF5 format files - - path: path where the files will be stored - blocksPerFile: number of blocks that will be saved in per HDF5 format file - mode: selects the data stacking mode: '0' channels, '1' parameters, '3' table (for meteors) - metadataList: list of attributes that will be stored as metadata - dataList: list of attributes that will be stores as data - ''' - - ext = ".hdf5" - optchar = "D" - metaoptchar = "M" - metaFile = None - filename = None - path = None - setFile = None - fp = None - grp = None - ds = None - firsttime = True - #Configurations - blocksPerFile = None - blockIndex = None - dataOut = None - #Data Arrays - dataList = None - metadataList = None - dsList = None #List of dictionaries with dataset properties - tableDim = None - dtype = [('arrayName', 'S20'),('nDimensions', 'i'), ('dim2', 'i'), ('dim1', 'i'),('dim0', 'i'),('mode', 'b')] - currentDay = None - lastTime = None - setType = None - - def __init__(self): - - Operation.__init__(self) - return - - def setup(self, dataOut, path=None, blocksPerFile=10, metadataList=None, dataList=None, mode=None, setType=None): - self.path = path - self.blocksPerFile = blocksPerFile - self.metadataList = metadataList - self.dataList = dataList - self.dataOut = dataOut - self.mode = mode - if self.mode is not None: - self.mode = numpy.zeros(len(self.dataList)) + mode - else: - self.mode = numpy.ones(len(self.dataList)) - - self.setType = setType - - arrayDim = numpy.zeros((len(self.dataList),5)) - - #Table dimensions - dtype0 = self.dtype - tableList = [] - - #Dictionary and list of tables - dsList = [] - - for i in range(len(self.dataList)): - dsDict = {} - dataAux = getattr(self.dataOut, self.dataList[i]) - dsDict['variable'] = self.dataList[i] - #--------------------- Conditionals ------------------------ - #There is no data - - if dataAux is None: - - return 0 - - if isinstance(dataAux, (int, float, numpy.integer, numpy.float)): - dsDict['mode'] = 0 - dsDict['nDim'] = 0 - arrayDim[i,0] = 0 - dsList.append(dsDict) - - #Mode 2: meteors - elif self.mode[i] == 2: - dsDict['dsName'] = 'table0' - dsDict['mode'] = 2 # Mode meteors - dsDict['shape'] = dataAux.shape[-1] - dsDict['nDim'] = 0 - dsDict['dsNumber'] = 1 - arrayDim[i,3] = dataAux.shape[-1] - arrayDim[i,4] = self.mode[i] #Mode the data was stored - dsList.append(dsDict) - - #Mode 1 - else: - arrayDim0 = dataAux.shape #Data dimensions - arrayDim[i,0] = len(arrayDim0) #Number of array dimensions - arrayDim[i,4] = self.mode[i] #Mode the data was stored - strtable = 'table' - dsDict['mode'] = 1 # Mode parameters - - # Three-dimension arrays - if len(arrayDim0) == 3: - arrayDim[i,1:-1] = numpy.array(arrayDim0) - nTables = int(arrayDim[i,2]) - dsDict['dsNumber'] = nTables - dsDict['shape'] = arrayDim[i,2:4] - dsDict['nDim'] = 3 - - for j in range(nTables): - dsDict = dsDict.copy() - dsDict['dsName'] = strtable + str(j) - dsList.append(dsDict) - - # Two-dimension arrays - elif len(arrayDim0) == 2: - arrayDim[i,2:-1] = numpy.array(arrayDim0) - nTables = int(arrayDim[i,2]) - dsDict['dsNumber'] = nTables - dsDict['shape'] = arrayDim[i,3] - dsDict['nDim'] = 2 - - for j in range(nTables): - dsDict = dsDict.copy() - dsDict['dsName'] = strtable + str(j) - dsList.append(dsDict) - - # One-dimension arrays - elif len(arrayDim0) == 1: - arrayDim[i,3] = arrayDim0[0] - dsDict['shape'] = arrayDim0[0] - dsDict['dsNumber'] = 1 - dsDict['dsName'] = strtable + str(0) - dsDict['nDim'] = 1 - dsList.append(dsDict) - - table = numpy.array((self.dataList[i],) + tuple(arrayDim[i,:]),dtype = dtype0) - tableList.append(table) - - self.dsList = dsList - self.tableDim = numpy.array(tableList, dtype = dtype0) - self.blockIndex = 0 - timeTuple = time.localtime(dataOut.utctime) - self.currentDay = timeTuple.tm_yday - - def putMetadata(self): - - fp = self.createMetadataFile() - self.writeMetadata(fp) - fp.close() - return - - def createMetadataFile(self): - ext = self.ext - path = self.path - setFile = self.setFile - - timeTuple = time.localtime(self.dataOut.utctime) - - subfolder = '' - fullpath = os.path.join( path, subfolder ) - - if not( os.path.exists(fullpath) ): - os.mkdir(fullpath) - setFile = -1 #inicializo mi contador de seteo - - subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday) - fullpath = os.path.join( path, subfolder ) - - if not( os.path.exists(fullpath) ): - os.mkdir(fullpath) - setFile = -1 #inicializo mi contador de seteo - - else: - filesList = os.listdir( fullpath ) - filesList = sorted( filesList, key=str.lower ) - if len( filesList ) > 0: - filesList = [k for k in filesList if k.startswith(self.metaoptchar)] - filen = filesList[-1] - # el filename debera tener el siguiente formato - # 0 1234 567 89A BCDE (hex) - # x YYYY DDD SSS .ext - if isNumber( filen[8:11] ): - setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file - else: - setFile = -1 - else: - setFile = -1 #inicializo mi contador de seteo - - if self.setType is None: - setFile += 1 - file = '%s%4.4d%3.3d%03d%s' % (self.metaoptchar, - timeTuple.tm_year, - timeTuple.tm_yday, - setFile, - ext ) - else: - setFile = timeTuple.tm_hour*60+timeTuple.tm_min - file = '%s%4.4d%3.3d%04d%s' % (self.metaoptchar, - timeTuple.tm_year, - timeTuple.tm_yday, - setFile, - ext ) - - filename = os.path.join( path, subfolder, file ) - self.metaFile = file - #Setting HDF5 File - fp = h5py.File(filename,'w') - - return fp - - def writeMetadata(self, fp): - - grp = fp.create_group("Metadata") - grp.create_dataset('array dimensions', data = self.tableDim, dtype = self.dtype) - - for i in range(len(self.metadataList)): - grp.create_dataset(self.metadataList[i], data=getattr(self.dataOut, self.metadataList[i])) - return - - def timeFlag(self): - currentTime = self.dataOut.utctime - - if self.lastTime is None: - self.lastTime = currentTime - - #Day - timeTuple = time.localtime(currentTime) - dataDay = timeTuple.tm_yday - - #Time - timeDiff = currentTime - self.lastTime - - #Si el dia es diferente o si la diferencia entre un dato y otro supera la hora - if dataDay != self.currentDay: - self.currentDay = dataDay - return True - elif timeDiff > 3*60*60: - self.lastTime = currentTime - return True - else: - self.lastTime = currentTime - return False - - def setNextFile(self): - - ext = self.ext - path = self.path - setFile = self.setFile - mode = self.mode - - timeTuple = time.localtime(self.dataOut.utctime) - subfolder = 'd%4.4d%3.3d' % (timeTuple.tm_year,timeTuple.tm_yday) - - fullpath = os.path.join( path, subfolder ) - - if os.path.exists(fullpath): - filesList = os.listdir( fullpath ) - ##filesList = [k for k in filesList if 'M' in k] - if len( filesList ) > 0: - filesList = sorted( filesList, key=str.lower ) - filen = filesList[-1] - # el filename debera tener el siguiente formato - # 0 1234 567 89A BCDE (hex) - # x YYYY DDD SSS .ext - if isNumber( filen[8:11] ): - setFile = int( filen[8:11] ) #inicializo mi contador de seteo al seteo del ultimo file - else: - setFile = -1 - else: - setFile = -1 #inicializo mi contador de seteo - else: - os.makedirs(fullpath) - setFile = -1 #inicializo mi contador de seteo - - if self.setType is None: - setFile += 1 - file = '%s%4.4d%3.3d%03d%s' % (self.optchar, - timeTuple.tm_year, - timeTuple.tm_yday, - setFile, - ext ) - else: - setFile = timeTuple.tm_hour*60+timeTuple.tm_min - file = '%s%4.4d%3.3d%04d%s' % (self.optchar, - timeTuple.tm_year, - timeTuple.tm_yday, - setFile, - ext ) - - filename = os.path.join( path, subfolder, file ) - - #Setting HDF5 File - fp = h5py.File(filename,'w') - #write metadata - self.writeMetadata(fp) - #Write data - grp = fp.create_group("Data") - ds = [] - data = [] - dsList = self.dsList - i = 0 - while i < len(dsList): - dsInfo = dsList[i] - #One-dimension data - if dsInfo['mode'] == 0: - ds0 = grp.create_dataset(dsInfo['variable'], (1,1), maxshape=(1,self.blocksPerFile) , chunks = True, dtype=numpy.float64) - ds.append(ds0) - data.append([]) - i += 1 - continue - - elif dsInfo['mode'] == 2: - grp0 = grp.create_group(dsInfo['variable']) - ds0 = grp0.create_dataset(dsInfo['dsName'], (1,dsInfo['shape']), data = numpy.zeros((1,dsInfo['shape'])) , maxshape=(None,dsInfo['shape']), chunks=True) - ds.append(ds0) - data.append([]) - i += 1 - continue - - elif dsInfo['mode'] == 1: - grp0 = grp.create_group(dsInfo['variable']) - - for j in range(dsInfo['dsNumber']): - dsInfo = dsList[i] - tableName = dsInfo['dsName'] - - - if dsInfo['nDim'] == 3: - shape = dsInfo['shape'].astype(int) - ds0 = grp0.create_dataset(tableName, (shape[0],shape[1],1) , data = numpy.zeros((shape[0],shape[1],1)), maxshape = (None,shape[1],None), chunks=True) - else: - shape = int(dsInfo['shape']) - ds0 = grp0.create_dataset(tableName, (1,shape), data = numpy.zeros((1,shape)) , maxshape=(None,shape), chunks=True) - - ds.append(ds0) - data.append([]) - i += 1 - - fp.flush() - fp.close() - - log.log('creating file: {}'.format(filename), 'Writing') - self.filename = filename - self.ds = ds - self.data = data - self.firsttime = True - self.blockIndex = 0 - return - - def putData(self): - - if self.blockIndex == self.blocksPerFile or self.timeFlag(): - self.setNextFile() - - self.readBlock() - self.setBlock() #Prepare data to be written - self.writeBlock() #Write data - - return - - def readBlock(self): - - ''' - data Array configured - - - self.data - ''' - dsList = self.dsList - ds = self.ds - #Setting HDF5 File - fp = h5py.File(self.filename,'r+') - grp = fp["Data"] - ind = 0 - - while ind < len(dsList): - dsInfo = dsList[ind] - - if dsInfo['mode'] == 0: - ds0 = grp[dsInfo['variable']] - ds[ind] = ds0 - ind += 1 - else: - - grp0 = grp[dsInfo['variable']] - - for j in range(dsInfo['dsNumber']): - dsInfo = dsList[ind] - ds0 = grp0[dsInfo['dsName']] - ds[ind] = ds0 - ind += 1 - - self.fp = fp - self.grp = grp - self.ds = ds - - return - - def setBlock(self): - ''' - data Array configured - - - self.data - ''' - #Creating Arrays - dsList = self.dsList - data = self.data - ind = 0 - - while ind < len(dsList): - dsInfo = dsList[ind] - dataAux = getattr(self.dataOut, dsInfo['variable']) - - mode = dsInfo['mode'] - nDim = dsInfo['nDim'] - - if mode == 0 or mode == 2 or nDim == 1: - data[ind] = dataAux - ind += 1 - # elif nDim == 1: - # data[ind] = numpy.reshape(dataAux,(numpy.size(dataAux),1)) - # ind += 1 - elif nDim == 2: - for j in range(dsInfo['dsNumber']): - data[ind] = dataAux[j,:] - ind += 1 - elif nDim == 3: - for j in range(dsInfo['dsNumber']): - data[ind] = dataAux[:,j,:] - ind += 1 - - self.data = data - return - - def writeBlock(self): - ''' - Saves the block in the HDF5 file - ''' - dsList = self.dsList - - for i in range(len(self.ds)): - dsInfo = dsList[i] - nDim = dsInfo['nDim'] - mode = dsInfo['mode'] - - # First time - if self.firsttime: - if type(self.data[i]) == numpy.ndarray: - - if nDim == 3: - self.data[i] = self.data[i].reshape((self.data[i].shape[0],self.data[i].shape[1],1)) - self.ds[i].resize(self.data[i].shape) - if mode == 2: - self.ds[i].resize(self.data[i].shape) - self.ds[i][:] = self.data[i] - else: - - # From second time - # Meteors! - if mode == 2: - dataShape = self.data[i].shape - dsShape = self.ds[i].shape - self.ds[i].resize((self.ds[i].shape[0] + dataShape[0],self.ds[i].shape[1])) - self.ds[i][dsShape[0]:,:] = self.data[i] - # No dimension - elif mode == 0: - self.ds[i].resize((self.ds[i].shape[0], self.ds[i].shape[1] + 1)) - self.ds[i][0,-1] = self.data[i] - # One dimension - elif nDim == 1: - self.ds[i].resize((self.ds[i].shape[0] + 1, self.ds[i].shape[1])) - self.ds[i][-1,:] = self.data[i] - # Two dimension - elif nDim == 2: - self.ds[i].resize((self.ds[i].shape[0] + 1,self.ds[i].shape[1])) - self.ds[i][self.blockIndex,:] = self.data[i] - # Three dimensions - elif nDim == 3: - self.ds[i].resize((self.ds[i].shape[0],self.ds[i].shape[1],self.ds[i].shape[2]+1)) - self.ds[i][:,:,-1] = self.data[i] - - self.firsttime = False - self.blockIndex += 1 - - #Close to save changes - self.fp.flush() - self.fp.close() - return - - def run(self, dataOut, path, blocksPerFile=10, metadataList=None, dataList=None, mode=None, setType=None): - - self.dataOut = dataOut - if not(self.isConfig): - self.setup(dataOut, path=path, blocksPerFile=blocksPerFile, - metadataList=metadataList, dataList=dataList, mode=mode, - setType=setType) - - self.isConfig = True - self.setNextFile() - - self.putData() - return - - -@MPDecorator -class ParameterReader(Reader, ProcessingUnit): - ''' - Reads HDF5 format files - ''' +class HDFReader(Reader, ProcessingUnit): + """Processing unit to read HDF5 format files + + This unit reads HDF5 files created with `HDFWriter` operation contains + by default two groups Data and Metadata all variables would be saved as `dataOut` + attributes. + It is possible to read any HDF5 file by given the structure in the `description` + parameter, also you can add extra values to metadata with the parameter `extras`. + + Parameters: + ----------- + path : str + Path where files are located. + startDate : date + Start date of the files + endDate : list + End date of the files + startTime : time + Start time of the files + endTime : time + End time of the files + description : dict, optional + Dictionary with the description of the HDF5 file + extras : dict, optional + Dictionary with extra metadata to be be added to `dataOut` + + Examples + -------- + + desc = { + 'Data': { + 'data_output': ['u', 'v', 'w'], + 'utctime': 'timestamps', + } , + 'Metadata': { + 'heightList': 'heights' + } + } + + desc = { + 'Data': { + 'data_output': 'winds', + 'utctime': 'timestamps' + }, + 'Metadata': { + 'heightList': 'heights' + } + } + + extras = { + 'timeZone': 300 + } + + reader = project.addReadUnit( + name='HDFReader', + path='/path/to/files', + startDate='2019/01/01', + endDate='2019/01/31', + startTime='00:00:00', + endTime='23:59:59', + # description=json.dumps(desc), + # extras=json.dumps(extras), + ) + + """ + + __attrs__ = ['path', 'startDate', 'endDate', 'startTime', 'endTime', 'description', 'extras'] def __init__(self): ProcessingUnit.__init__(self) self.dataOut = Parameters() self.ext = ".hdf5" self.optchar = "D" - self.timezone = "lt" - self.listMetaname = [] - self.listMeta = [] - self.listDataname = [] - self.listData = [] - self.listShapes = [] + self.meta = {} + self.data = {} self.open_file = h5py.File self.open_mode = 'r' - self.metadata = False + self.description = {} + self.extras = {} self.filefmt = "*%Y%j***" self.folderfmt = "*%Y%j" + self.utcoffset = 0 def setup(self, **kwargs): @@ -1001,7 +108,6 @@ class ParameterReader(Reader, ProcessingUnit): fullpath = self.searchFilesOnLine(self.path, self.startDate, self.endDate, self.expLabel, self.ext, self.walk, self.filefmt, self.folderfmt) - try: fullpath = next(fullpath) except: @@ -1039,6 +145,13 @@ class ParameterReader(Reader, ProcessingUnit): self.__readMetadata() self.__readData() self.__setBlockList() + + if 'type' in self.meta: + self.dataOut = eval(self.meta['type'])() + + for attr in self.meta: + setattr(self.dataOut, attr, self.meta[attr]) + self.blockIndex = 0 return @@ -1057,21 +170,15 @@ class ParameterReader(Reader, ProcessingUnit): startTime = self.startTime endTime = self.endTime - - index = self.listDataname.index('utctime') - thisUtcTime = self.listData[index] + thisUtcTime = self.data['utctime'] + self.utcoffset self.interval = numpy.min(thisUtcTime[1:] - thisUtcTime[:-1]) - - if self.timezone == 'lt': - thisUtcTime -= 5*3600 - - thisDatetime = datetime.datetime.fromtimestamp(thisUtcTime[0] + 5*3600) + thisDatetime = datetime.datetime.utcfromtimestamp(thisUtcTime[0]) thisDate = thisDatetime.date() thisTime = thisDatetime.time() - startUtcTime = (datetime.datetime.combine(thisDate,startTime) - datetime.datetime(1970, 1, 1)).total_seconds() - endUtcTime = (datetime.datetime.combine(thisDate,endTime) - datetime.datetime(1970, 1, 1)).total_seconds() + startUtcTime = (datetime.datetime.combine(thisDate, startTime) - datetime.datetime(1970, 1, 1)).total_seconds() + endUtcTime = (datetime.datetime.combine(thisDate, endTime) - datetime.datetime(1970, 1, 1)).total_seconds() ind = numpy.where(numpy.logical_and(thisUtcTime >= startUtcTime, thisUtcTime < endUtcTime))[0] @@ -1084,99 +191,80 @@ class ParameterReader(Reader, ProcessingUnit): Reads Metadata ''' - listMetaname = [] - listMetadata = [] - if 'Metadata' in self.fp: - gp = self.fp['Metadata'] - for item in list(gp.items()): - name = item[0] - - if name=='variables': - table = gp[name][:] - listShapes = {} - for shapes in table: - listShapes[shapes[0].decode()] = numpy.array([shapes[1]]) - else: - data = gp[name].value - listMetaname.append(name) - listMetadata.append(data) - elif self.metadata: - metadata = json.loads(self.metadata) - listShapes = {} - for tup in metadata: - name, values, dim = tup - if dim == -1: - listMetaname.append(name) - listMetadata.append(self.fp[values].value) - else: - listShapes[name] = numpy.array([dim]) + meta = {} + + if self.description: + for key, value in self.description['Metadata'].items(): + meta[key] = self.fp[value][()] else: - raise IOError('Missing Metadata group in file or metadata info') + grp = self.fp['Metadata'] + for name in grp: + meta[name] = grp[name][()] - self.listShapes = listShapes - self.listMetaname = listMetaname - self.listMeta = listMetadata + if self.extras: + for key, value in self.extras.items(): + meta[key] = value + self.meta = meta return def __readData(self): - listdataname = [] - listdata = [] - - if 'Data' in self.fp: + data = {} + + if self.description: + for key, value in self.description['Data'].items(): + if isinstance(value, str): + if isinstance(self.fp[value], h5py.Dataset): + data[key] = self.fp[value][()] + elif isinstance(self.fp[value], h5py.Group): + array = [] + for ch in self.fp[value]: + array.append(self.fp[value][ch][()]) + data[key] = numpy.array(array) + elif isinstance(value, list): + array = [] + for ch in value: + array.append(self.fp[ch][()]) + data[key] = numpy.array(array) + else: grp = self.fp['Data'] - for item in list(grp.items()): - name = item[0] - listdataname.append(name) - dim = self.listShapes[name][0] - if dim == 0: - array = grp[name].value - else: + for name in grp: + if isinstance(grp[name], h5py.Dataset): + array = grp[name][()] + elif isinstance(grp[name], h5py.Group): array = [] - for i in range(dim): - array.append(grp[name]['table{:02d}'.format(i)].value) + for ch in grp[name]: + array.append(grp[name][ch][()]) array = numpy.array(array) + else: + log.warning('Unknown type: {}'.format(name)) - listdata.append(array) - elif self.metadata: - metadata = json.loads(self.metadata) - for tup in metadata: - name, values, dim = tup - listdataname.append(name) - if dim == -1: - continue - elif dim == 0: - array = self.fp[values].value + if name in self.description: + key = self.description[name] else: - array = [] - for var in values: - array.append(self.fp[var].value) - array = numpy.array(array) - listdata.append(array) - else: - raise IOError('Missing Data group in file or metadata info') + key = name + data[key] = array - self.listDataname = listdataname - self.listData = listdata + self.data = data return def getData(self): - for i in range(len(self.listMeta)): - setattr(self.dataOut, self.listMetaname[i], self.listMeta[i]) - - for j in range(len(self.listData)): - dim = self.listShapes[self.listDataname[j]][0] - if dim == 0: - setattr(self.dataOut, self.listDataname[j], self.listData[j][self.blockIndex]) + for attr in self.data: + if self.data[attr].ndim == 1: + setattr(self.dataOut, attr, self.data[attr][self.blockIndex]) else: - setattr(self.dataOut, self.listDataname[j], self.listData[j][:,self.blockIndex]) + setattr(self.dataOut, attr, self.data[attr][:, self.blockIndex]) - self.dataOut.paramInterval = self.interval self.dataOut.flagNoData = False self.blockIndex += 1 + log.log("Block No. {}/{} -> {}".format( + self.blockIndex, + self.blocksPerFile, + self.dataOut.datatime.ctime()), self.name) + return def run(self, **kwargs): @@ -1193,28 +281,69 @@ class ParameterReader(Reader, ProcessingUnit): return @MPDecorator -class ParameterWriter(Operation): - ''' - HDF5 Writer, stores parameters data in HDF5 format files - - path: path where the files will be stored - blocksPerFile: number of blocks that will be saved in per HDF5 format file - mode: selects the data stacking mode: '0' channels, '1' parameters, '3' table (for meteors) - metadataList: list of attributes that will be stored as metadata - dataList: list of attributes that will be stores as data - ''' - +class HDFWriter(Operation): + """Operation to write HDF5 files. + + The HDF5 file contains by default two groups Data and Metadata where + you can save any `dataOut` attribute specified by `dataList` and `metadataList` + parameters, data attributes are normaly time dependent where the metadata + are not. + It is possible to customize the structure of the HDF5 file with the + optional description parameter see the examples. + + Parameters: + ----------- + path : str + Path where files will be saved. + blocksPerFile : int + Number of blocks per file + metadataList : list + List of the dataOut attributes that will be saved as metadata + dataList : int + List of the dataOut attributes that will be saved as data + setType : bool + If True the name of the files corresponds to the timestamp of the data + description : dict, optional + Dictionary with the desired description of the HDF5 file + + Examples + -------- + + desc = { + 'data_output': {'winds': ['z', 'w', 'v']}, + 'utctime': 'timestamps', + 'heightList': 'heights' + } + desc = { + 'data_output': ['z', 'w', 'v'], + 'utctime': 'timestamps', + 'heightList': 'heights' + } + desc = { + 'Data': { + 'data_output': 'winds', + 'utctime': 'timestamps' + }, + 'Metadata': { + 'heightList': 'heights' + } + } + + writer = proc_unit.addOperation(name='HDFWriter') + writer.addParameter(name='path', value='/path/to/file') + writer.addParameter(name='blocksPerFile', value='32') + writer.addParameter(name='metadataList', value='heightList,timeZone') + writer.addParameter(name='dataList',value='data_output,utctime') + # writer.addParameter(name='description',value=json.dumps(desc)) + + """ ext = ".hdf5" optchar = "D" - metaoptchar = "M" - metaFile = None filename = None path = None setFile = None fp = None - grp = None - ds = None firsttime = True #Configurations blocksPerFile = None @@ -1223,9 +352,6 @@ class ParameterWriter(Operation): #Data Arrays dataList = None metadataList = None - dsList = None #List of dictionaries with dataset properties - tableDim = None - dtype = [('name', 'S20'),('nDim', 'i')] currentDay = None lastTime = None @@ -1234,20 +360,28 @@ class ParameterWriter(Operation): Operation.__init__(self) return - def setup(self, path=None, blocksPerFile=10, metadataList=None, dataList=None, setType=None): + def setup(self, path=None, blocksPerFile=10, metadataList=None, dataList=None, setType=None, description=None): self.path = path self.blocksPerFile = blocksPerFile self.metadataList = metadataList - self.dataList = dataList + self.dataList = [s.strip() for s in dataList] self.setType = setType + self.description = description + + if self.metadataList is None: + self.metadataList = self.dataOut.metadata_list tableList = [] dsList = [] for i in range(len(self.dataList)): dsDict = {} - dataAux = getattr(self.dataOut, self.dataList[i]) - dsDict['variable'] = self.dataList[i] + if hasattr(self.dataOut, self.dataList[i]): + dataAux = getattr(self.dataOut, self.dataList[i]) + dsDict['variable'] = self.dataList[i] + else: + log.warning('Attribute {} not found in dataOut', self.name) + continue if dataAux is None: continue @@ -1257,12 +391,11 @@ class ParameterWriter(Operation): dsDict['nDim'] = len(dataAux.shape) dsDict['shape'] = dataAux.shape dsDict['dsNumber'] = dataAux.shape[0] + dsDict['dtype'] = dataAux.dtype dsList.append(dsDict) - tableList.append((self.dataList[i], dsDict['nDim'])) self.dsList = dsList - self.tableDim = numpy.array(tableList, dtype=self.dtype) self.currentDay = self.dataOut.datatime.date() def timeFlag(self): @@ -1288,13 +421,14 @@ class ParameterWriter(Operation): self.lastTime = currentTime return False - def run(self, dataOut, path, blocksPerFile=10, metadataList=None, dataList=None, setType=None): + def run(self, dataOut, path, blocksPerFile=10, metadataList=None, + dataList=[], setType=None, description={}): self.dataOut = dataOut if not(self.isConfig): self.setup(path=path, blocksPerFile=blocksPerFile, metadataList=metadataList, dataList=dataList, - setType=setType) + setType=setType, description=description) self.isConfig = True self.setNextFile() @@ -1355,41 +489,97 @@ class ParameterWriter(Operation): #Write data self.writeData(self.fp) + def getLabel(self, name, x=None): + + if x is None: + if 'Data' in self.description: + data = self.description['Data'] + if 'Metadata' in self.description: + data.update(self.description['Metadata']) + else: + data = self.description + if name in data: + if isinstance(data[name], str): + return data[name] + elif isinstance(data[name], list): + return None + elif isinstance(data[name], dict): + for key, value in data[name].items(): + return key + return name + else: + if 'Metadata' in self.description: + meta = self.description['Metadata'] + else: + meta = self.description + if name in meta: + if isinstance(meta[name], list): + return meta[name][x] + elif isinstance(meta[name], dict): + for key, value in meta[name].items(): + return value[x] + if 'cspc' in name: + return 'pair{:02d}'.format(x) + else: + return 'channel{:02d}'.format(x) + def writeMetadata(self, fp): - grp = fp.create_group("Metadata") - grp.create_dataset('variables', data=self.tableDim, dtype=self.dtype) + if self.description: + if 'Metadata' in self.description: + grp = fp.create_group('Metadata') + else: + grp = fp + else: + grp = fp.create_group('Metadata') for i in range(len(self.metadataList)): if not hasattr(self.dataOut, self.metadataList[i]): log.warning('Metadata: `{}` not found'.format(self.metadataList[i]), self.name) continue value = getattr(self.dataOut, self.metadataList[i]) - grp.create_dataset(self.metadataList[i], data=value) + if isinstance(value, bool): + if value is True: + value = 1 + else: + value = 0 + grp.create_dataset(self.getLabel(self.metadataList[i]), data=value) return def writeData(self, fp): - grp = fp.create_group("Data") + if self.description: + if 'Data' in self.description: + grp = fp.create_group('Data') + else: + grp = fp + else: + grp = fp.create_group('Data') + dtsets = [] data = [] for dsInfo in self.dsList: if dsInfo['nDim'] == 0: ds = grp.create_dataset( - dsInfo['variable'], + self.getLabel(dsInfo['variable']), (self.blocksPerFile, ), chunks=True, dtype=numpy.float64) dtsets.append(ds) data.append((dsInfo['variable'], -1)) else: - sgrp = grp.create_group(dsInfo['variable']) + label = self.getLabel(dsInfo['variable']) + if label is not None: + sgrp = grp.create_group(label) + else: + sgrp = grp for i in range(dsInfo['dsNumber']): ds = sgrp.create_dataset( - 'table{:02d}'.format(i), + self.getLabel(dsInfo['variable'], i), (self.blocksPerFile, ) + dsInfo['shape'][1:], - chunks=True) + chunks=True, + dtype=dsInfo['dtype']) dtsets.append(ds) data.append((dsInfo['variable'], i)) fp.flush() @@ -1427,8 +617,9 @@ class ParameterWriter(Operation): for ds in self.ds: ds.resize(self.blockIndex, axis=0) - self.fp.flush() - self.fp.close() + if self.fp: + self.fp.flush() + self.fp.close() def close(self): diff --git a/schainpy/model/io/jroIO_simulator.py b/schainpy/model/io/jroIO_simulator.py new file mode 100644 index 0000000..b84df46 --- /dev/null +++ b/schainpy/model/io/jroIO_simulator.py @@ -0,0 +1,519 @@ +import numpy,math,random,time +#---------------1 Heredamos JRODatareader +from schainpy.model.io.jroIO_base import * +#---------------2 Heredamos las propiedades de ProcessingUnit +from schainpy.model.proc.jroproc_base import ProcessingUnit,Operation,MPDecorator +#---------------3 Importaremos las clases BascicHeader, SystemHeader, RadarControlHeader, ProcessingHeader +from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader,SystemHeader,RadarControllerHeader, ProcessingHeader +#---------------4 Importaremos el objeto Voltge +from schainpy.model.data.jrodata import Voltage + +class SimulatorReader(JRODataReader, ProcessingUnit): + incIntFactor = 1 + nFFTPoints = 0 + FixPP_IncInt = 1 + FixRCP_IPP = 1000 + FixPP_CohInt = 1 + Tau_0 = 250 + AcqH0_0 = 70 + H0 = AcqH0_0 + AcqDH_0 = 1.25 + DH0 = AcqDH_0 + Bauds = 32 + BaudWidth = None + FixRCP_TXA = 40 + FixRCP_TXB = 70 + fAngle = 2.0*math.pi*(1/16) + DC_level = 500 + stdev = 8 + Num_Codes = 2 + #code0 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1]) + #code1 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0]) + #Dyn_snCode = numpy.array([Num_Codes,Bauds]) + Dyn_snCode = None + Samples = 200 + channels = 2 + pulses = None + Reference = None + pulse_size = None + prof_gen = None + Fdoppler = 100 + Hdoppler = 36 + Adoppler = 300 + frequency = 9345 + nTotalReadFiles = 1000 + + def __init__(self): + """ + Inicializador de la clases SimulatorReader para + generar datos de voltage simulados. + Input: + dataOut: Objeto de la clase Voltage. + Este Objeto sera utilizado apra almacenar + un perfil de datos cada vez qe se haga + un requerimiento (getData) + """ + ProcessingUnit.__init__(self) + print(" [ START ] init - Metodo Simulator Reader") + + self.isConfig = False + self.basicHeaderObj = BasicHeader(LOCALTIME) + self.systemHeaderObj = SystemHeader() + self.radarControllerHeaderObj = RadarControllerHeader() + self.processingHeaderObj = ProcessingHeader() + self.profileIndex = 2**32-1 + self.dataOut = Voltage() + #code0 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1]) + code0 = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1]) + #code1 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0]) + code1 = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1]) + #self.Dyn_snCode = numpy.array([code0,code1]) + self.Dyn_snCode = None + + def set_kwargs(self, **kwargs): + for key, value in kwargs.items(): + setattr(self, key, value) + + def __hasNotDataInBuffer(self): + + if self.profileIndex >= self.processingHeaderObj.profilesPerBlock* self.nTxs: + if self.nReadBlocks>0: + tmp = self.dataOut.utctime + tmp_utc = int(self.dataOut.utctime) + tmp_milisecond = int((tmp-tmp_utc)*1000) + self.basicHeaderObj.utc = tmp_utc + self.basicHeaderObj.miliSecond= tmp_milisecond + return 1 + return 0 + + def setNextFile(self): + """Set the next file to be readed open it and parse de file header""" + + if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile): + self.nReadFiles=self.nReadFiles+1 + if self.nReadFiles > self.nTotalReadFiles: + self.flagNoMoreFiles=1 + raise schainpy.admin.SchainWarning('No more files to read') + + print('------------------- [Opening file] ------------------------------',self.nReadFiles) + self.nReadBlocks = 0 + #if self.nReadBlocks==0: + # self.readFirstHeader() + + def __setNewBlock(self): + self.setNextFile() + if self.flagIsNewFile: + return 1 + + def readNextBlock(self): + while True: + self.__setNewBlock() + if not(self.readBlock()): + return 0 + self.getBasicHeader() + break + if self.verbose: + print("[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks, + self.processingHeaderObj.dataBlocksPerFile, + self.dataOut.datatime.ctime()) ) + return 1 + + def getFirstHeader(self): + self.getBasicHeader() + self.dataOut.processingHeaderObj = self.processingHeaderObj.copy() + self.dataOut.systemHeaderObj = self.systemHeaderObj.copy() + self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy() + self.dataOut.dtype = self.dtype + + self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock + self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights) * self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight + self.dataOut.channelList = list(range(self.systemHeaderObj.nChannels)) + self.dataOut.nCohInt = self.processingHeaderObj.nCohInt + # asumo q la data no esta decodificada + self.dataOut.flagDecodeData = self.processingHeaderObj.flag_decode + # asumo q la data no esta sin flip + self.dataOut.flagDeflipData = self.processingHeaderObj.flag_deflip + self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft + self.dataOut.frequency = self.frequency + + def getBasicHeader(self): + self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \ + 1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds + + self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock + self.dataOut.timeZone = self.basicHeaderObj.timeZone + self.dataOut.dstFlag = self.basicHeaderObj.dstFlag + self.dataOut.errorCount = self.basicHeaderObj.errorCount + self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime + self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs + + def readFirstHeader(self): + + datatype = int(numpy.log2((self.processingHeaderObj.processFlags & + PROCFLAG.DATATYPE_MASK)) - numpy.log2(PROCFLAG.DATATYPE_CHAR)) + if datatype == 0: + datatype_str = numpy.dtype([('real', ' self.incIntFactor): + self.incIntFactor = self.FixPP_IncInt/ self.incIntFactor + elif(self.FixPP_IncInt< self.incIntFactor): + print("False alert...") + + ProfilesperBlock = self.processingHeaderObj.profilesPerBlock + + self.timeperblock =int(((self.FixRCP_IPP + *ProfilesperBlock + *self.FixPP_CohInt + *self.incIntFactor) + /150.0) + *0.9 + +0.5) + # para cada canal + self.profiles = ProfilesperBlock*self.FixPP_CohInt + self.profiles = ProfilesperBlock + self.Reference = int((self.Tau_0-self.AcqH0_0)/(self.AcqDH_0)+0.5) + self.BaudWidth = int((self.FixRCP_TXA/self.AcqDH_0)/self.Bauds + 0.5 ) + + if (self.BaudWidth==0): + self.BaudWidth=1 + + def init_pulse(self,Num_Codes=Num_Codes,Bauds=Bauds,BaudWidth=BaudWidth,Dyn_snCode=Dyn_snCode): + + Num_Codes = Num_Codes + Bauds = Bauds + BaudWidth = BaudWidth + Dyn_snCode = Dyn_snCode + + if Dyn_snCode: + print("EXISTE") + else: + print("No existe") + + if Dyn_snCode: # if Bauds: + pulses = list(range(0,Num_Codes)) + num_codes = Num_Codes + for i in range(num_codes): + pulse_size = Bauds*BaudWidth + pulses[i] = numpy.zeros(pulse_size) + for j in range(Bauds): + for k in range(BaudWidth): + pulses[i][j*BaudWidth+k] = int(Dyn_snCode[i][j]*600) + else: + print("sin code") + pulses = list(range(1)) + if self.AcqDH_0>0.149: + pulse_size = int(self.FixRCP_TXB/0.15+0.5) + else: + pulse_size = int((self.FixRCP_TXB/self.AcqDH_0)+0.5) #0.0375 + pulses[0] = numpy.ones(pulse_size) + pulses = 600*pulses[0] + + return pulses,pulse_size + + def jro_GenerateBlockOfData(self,Samples=Samples,DC_level= DC_level,stdev=stdev, + Reference= Reference,pulses= pulses, + Num_Codes= Num_Codes,pulse_size=pulse_size, + prof_gen= prof_gen,H0 = H0,DH0=DH0, + Adoppler=Adoppler,Fdoppler= Fdoppler,Hdoppler=Hdoppler): + Samples = Samples + DC_level = DC_level + stdev = stdev + m_nR = Reference + pulses = pulses + num_codes = Num_Codes + ps = pulse_size + prof_gen = prof_gen + channels = self.channels + H0 = H0 + DH0 = DH0 + ippSec = self.radarControllerHeaderObj.ippSeconds + Fdoppler = self.Fdoppler + Hdoppler = self.Hdoppler + Adoppler = self.Adoppler + + self.datablock = numpy.zeros([channels,prof_gen,Samples],dtype= numpy.complex64) + for i in range(channels): + for k in range(prof_gen): + #-----------------------NOISE--------------- + Noise_r = numpy.random.normal(DC_level,stdev,Samples) + Noise_i = numpy.random.normal(DC_level,stdev,Samples) + Noise = numpy.zeros(Samples,dtype=complex) + Noise.real = Noise_r + Noise.imag = Noise_i + #-----------------------PULSOS-------------- + Pulso = numpy.zeros(pulse_size,dtype=complex) + Pulso.real = pulses[k%num_codes] + Pulso.imag = pulses[k%num_codes] + #--------------------- PULSES+NOISE---------- + InBuffer = numpy.zeros(Samples,dtype=complex) + InBuffer[m_nR:m_nR+ps] = Pulso + InBuffer = InBuffer+Noise + #--------------------- ANGLE ------------------------------- + InBuffer.real[m_nR:m_nR+ps] = InBuffer.real[m_nR:m_nR+ps]*(math.cos( self.fAngle)*5) + InBuffer.imag[m_nR:m_nR+ps] = InBuffer.imag[m_nR:m_nR+ps]*(math.sin( self.fAngle)*5) + InBuffer=InBuffer + self.datablock[i][k]= InBuffer + + #----------------DOPPLER SIGNAL............................................... + time_vec = numpy.linspace(0,(prof_gen-1)*ippSec,int(prof_gen))+self.nReadBlocks*ippSec*prof_gen+(self.nReadFiles-1)*ippSec*prof_gen + fd = Fdoppler #+(600.0/120)*self.nReadBlocks + d_signal = Adoppler*numpy.array(numpy.exp(1.0j*2.0*math.pi*fd*time_vec),dtype=numpy.complex64) + #-------------Senal con ancho espectral-------------------- + if prof_gen%2==0: + min = int(prof_gen/2.0-1.0) + max = int(prof_gen/2.0) + else: + min = int(prof_gen/2.0) + max = int(prof_gen/2.0) + specw_sig = numpy.linspace(-min,max,prof_gen) + w = 4 + A = 20 + specw_sig = specw_sig/w + specw_sig = numpy.sinc(specw_sig) + specw_sig = A*numpy.array(specw_sig,dtype=numpy.complex64) + #------------------ DATABLOCK + DOPPLER-------------------- + HD=int(Hdoppler/self.AcqDH_0) + for i in range(12): + self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ d_signal# RESULT + #------------------ DATABLOCK + DOPPLER*Sinc(x)-------------------- + HD=int(Hdoppler/self.AcqDH_0) + HD=int(HD/2) + for i in range(12): + self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ specw_sig*d_signal# RESULT + + def readBlock(self): + + self.jro_GenerateBlockOfData(Samples= self.samples,DC_level=self.DC_level, + stdev=self.stdev,Reference= self.Reference, + pulses = self.pulses,Num_Codes=self.Num_Codes, + pulse_size=self.pulse_size,prof_gen=self.profiles, + H0=self.H0,DH0=self.DH0) + + self.profileIndex = 0 + self.flagIsNewFile = 0 + self.flagIsNewBlock = 1 + self.nTotalBlocks += 1 + self.nReadBlocks += 1 + + return 1 + + + def getData(self): + if self.flagNoMoreFiles: + self.dataOut.flagNodata = True + return 0 + self.flagDiscontinuousBlock = 0 + self.flagIsNewBlock = 0 + if self.__hasNotDataInBuffer(): # aqui es verdad + if not(self.readNextBlock()): # return 1 y por eso el if not salta a getBasic Header + return 0 + self.getFirstHeader() # atributo + + if not self.getByBlock: + self.dataOut.flagDataAsBlock = False + self.dataOut.data = self.datablock[:, self.profileIndex, :] + self.dataOut.profileIndex = self.profileIndex + self.profileIndex += 1 + else: + pass + self.dataOut.flagNoData = False + self.getBasicHeader() + self.dataOut.realtime = self.online + return self.dataOut.data + + + def setup(self,frequency=49.92e6,incIntFactor= 1, nFFTPoints = 0, FixPP_IncInt=1,FixRCP_IPP=1000, + FixPP_CohInt= 1,Tau_0= 250,AcqH0_0 = 70 ,AcqDH_0=1.25, Bauds= 32, + FixRCP_TXA = 40, FixRCP_TXB = 50, fAngle = 2.0*math.pi*(1/16),DC_level= 50, + stdev= 8,Num_Codes = 1 , Dyn_snCode = None, samples=200, + channels=2,Fdoppler=20,Hdoppler=36,Adoppler=500, + profilesPerBlock=300,dataBlocksPerFile=120,nTotalReadFiles=10000, + **kwargs): + + self.set_kwargs(**kwargs) + self.nReadBlocks = 0 + self.nReadFiles = 1 + print('------------------- [Opening file: ] ------------------------------',self.nReadFiles) + + tmp = time.time() + tmp_utc = int(tmp) + tmp_milisecond = int((tmp-tmp_utc)*1000) + print(" SETUP -basicHeaderObj.utc",datetime.datetime.utcfromtimestamp(tmp)) + if Dyn_snCode is None: + Num_Codes=1 + Bauds =1 + + + + self.set_BH(utc= tmp_utc,miliSecond= tmp_milisecond,timeZone=300 ) + self.set_RCH( expType=0, nTx=150,ipp=FixRCP_IPP, txA=FixRCP_TXA, txB= FixRCP_TXB, + nWindows=1 , nHeights=samples, firstHeight=AcqH0_0, deltaHeight=AcqDH_0, + numTaus=1, line6Function=0, line5Function=0, fClock=None, + prePulseBefore=0, prePulseAfter=0, + codeType=0, nCode=Num_Codes, nBaud=32, code=Dyn_snCode, + flip1=0, flip2=0,Taus=Tau_0) + + self.set_PH(dtype=0, blockSize=0, profilesPerBlock=profilesPerBlock, + dataBlocksPerFile=dataBlocksPerFile, nWindows=1, processFlags=numpy.array([1024]), nCohInt=1, + nIncohInt=1, totalSpectra=0, nHeights=samples, firstHeight=AcqH0_0, + deltaHeight=AcqDH_0, samplesWin=samples, spectraComb=0, nCode=0, + code=0, nBaud=None, shif_fft=False, flag_dc=False, + flag_cspc=False, flag_decode=False, flag_deflip=False) + + self.set_SH(nSamples=samples, nProfiles=profilesPerBlock, nChannels=channels) + + self.readFirstHeader() + + self.frequency = frequency + self.incIntFactor = incIntFactor + self.nFFTPoints = nFFTPoints + self.FixPP_IncInt = FixPP_IncInt + self.FixRCP_IPP = FixRCP_IPP + self.FixPP_CohInt = FixPP_CohInt + self.Tau_0 = Tau_0 + self.AcqH0_0 = AcqH0_0 + self.H0 = AcqH0_0 + self.AcqDH_0 = AcqDH_0 + self.DH0 = AcqDH_0 + self.Bauds = Bauds + self.FixRCP_TXA = FixRCP_TXA + self.FixRCP_TXB = FixRCP_TXB + self.fAngle = fAngle + self.DC_level = DC_level + self.stdev = stdev + self.Num_Codes = Num_Codes + self.Dyn_snCode = Dyn_snCode + self.samples = samples + self.channels = channels + self.profiles = None + self.m_nReference = None + self.Baudwidth = None + self.Fdoppler = Fdoppler + self.Hdoppler = Hdoppler + self.Adoppler = Adoppler + self.nTotalReadFiles = int(nTotalReadFiles) + + print("IPP ", self.FixRCP_IPP) + print("Tau_0 ",self.Tau_0) + print("AcqH0_0",self.AcqH0_0) + print("samples,window ",self.samples) + print("AcqDH_0",AcqDH_0) + print("FixRCP_TXA",self.FixRCP_TXA) + print("FixRCP_TXB",self.FixRCP_TXB) + print("Dyn_snCode",Dyn_snCode) + print("Fdoppler", Fdoppler) + print("Hdoppler",Hdoppler) + print("Vdopplermax",Fdoppler*(3.0e8/self.frequency)/2.0) + print("nTotalReadFiles", nTotalReadFiles) + + self.init_acquisition() + self.pulses,self.pulse_size=self.init_pulse(Num_Codes=self.Num_Codes,Bauds=self.Bauds,BaudWidth=self.BaudWidth,Dyn_snCode=Dyn_snCode) + print(" [ END ] - SETUP metodo") + return + + def run(self,**kwargs): # metodo propio + if not(self.isConfig): + self.setup(**kwargs) + self.isConfig = True + self.getData() diff --git a/schainpy/model/io/jroIO_spectra.py b/schainpy/model/io/jroIO_spectra.py index b7683c7..589c9b6 100644 --- a/schainpy/model/io/jroIO_spectra.py +++ b/schainpy/model/io/jroIO_spectra.py @@ -11,7 +11,7 @@ from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, from schainpy.model.data.jrodata import Spectra from schainpy.utils import log -@MPDecorator + class SpectraReader(JRODataReader, ProcessingUnit): """ Esta clase permite leer datos de espectros desde archivos procesados (.pdata). La lectura @@ -358,7 +358,7 @@ class SpectraWriter(JRODataWriter, Operation): spc = numpy.transpose( self.data_spc, (0,2,1) ) if not self.processingHeaderObj.shif_fft: - spc = numpy.roll( spc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones + spc = numpy.roll( spc, int(self.processingHeaderObj.profilesPerBlock/2), axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones data = spc.reshape((-1)) data = data.astype(self.dtype[0]) data.tofile(self.fp) @@ -369,7 +369,7 @@ class SpectraWriter(JRODataWriter, Operation): data = numpy.zeros( numpy.shape(cspc), self.dtype ) #print 'data.shape', self.shape_cspc_Buffer if not self.processingHeaderObj.shif_fft: - cspc = numpy.roll( cspc, self.processingHeaderObj.profilesPerBlock/2, axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones + cspc = numpy.roll( cspc, int(self.processingHeaderObj.profilesPerBlock/2), axis=2 ) #desplaza a la derecha en el eje 2 determinadas posiciones data['real'] = cspc.real data['imag'] = cspc.imag data = data.reshape((-1)) diff --git a/schainpy/model/io/jroIO_usrp.py b/schainpy/model/io/jroIO_usrp.py index c58254f..1ac362b 100644 --- a/schainpy/model/io/jroIO_usrp.py +++ b/schainpy/model/io/jroIO_usrp.py @@ -14,12 +14,12 @@ except: from schainpy.model.data.jroheaderIO import RadarControllerHeader, SystemHeader from schainpy.model.data.jrodata import Voltage -from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation +from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator try: import digital_rf_hdf5 except: - print('You should install "digital_rf_hdf5" module if you want to read USRP data') + pass class USRPReader(ProcessingUnit): ''' @@ -58,7 +58,7 @@ class USRPReader(ProcessingUnit): nProfiles = 1.0/ippSeconds #Number of profiles in one second - self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ippKm=self.__ippKm, + self.dataOut.radarControllerHeaderObj = RadarControllerHeader(ipp=self.__ippKm, txA=0, txB=0, nWindows=1, @@ -90,7 +90,7 @@ class USRPReader(ProcessingUnit): self.dataOut.channelList = self.__channelList - self.dataOut.blocksize = self.dataOut.getNChannels() * self.dataOut.getNHeights() + self.dataOut.blocksize = self.dataOut.nChannels * self.dataOut.nHeights # self.dataOut.channelIndexList = None @@ -546,6 +546,8 @@ class USRPReader(ProcessingUnit): return + +@MPDecorator class USRPWriter(Operation): ''' classdocs diff --git a/schainpy/model/io/jroIO_voltage.py b/schainpy/model/io/jroIO_voltage.py index 86f857e..cb484db 100644 --- a/schainpy/model/io/jroIO_voltage.py +++ b/schainpy/model/io/jroIO_voltage.py @@ -10,12 +10,8 @@ from .jroIO_base import LOCALTIME, JRODataReader, JRODataWriter from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader, SystemHeader, RadarControllerHeader, ProcessingHeader from schainpy.model.data.jrodata import Voltage -import zmq -import tempfile -from io import StringIO -# from _sha import blocksize -@MPDecorator + class VoltageReader(JRODataReader, ProcessingUnit): """ Esta clase permite leer datos de voltage desde archivos en formato rawdata (.r). La lectura diff --git a/schainpy/model/io/julIO_param.py b/schainpy/model/io/julIO_param.py index 4e019ca..b0d5bba 100644 --- a/schainpy/model/io/julIO_param.py +++ b/schainpy/model/io/julIO_param.py @@ -313,7 +313,7 @@ class JULIAParamReader(JRODataReader, ProcessingUnit): Storing data from databuffer to dataOut object ''' - self.dataOut.data_SNR = self.buffer[4].reshape(1, -1) + self.dataOut.data_snr = self.buffer[4].reshape(1, -1) self.dataOut.heightList = self.heights self.dataOut.data_param = self.buffer[0:4,] self.dataOut.utctimeInit = self.time diff --git a/schainpy/model/io/pxIO_param.py b/schainpy/model/io/pxIO_param.py index c3e23c5..86d6755 100644 --- a/schainpy/model/io/pxIO_param.py +++ b/schainpy/model/io/pxIO_param.py @@ -23,9 +23,7 @@ from schainpy.utils import log try: from netCDF4 import Dataset except: - log.warning( - 'You should install "netCDF4" module if you want to read/write NCDF files' - ) + pass UT1970 = datetime.datetime(1970, 1, 1) - datetime.timedelta(seconds=time.timezone) diff --git a/schainpy/model/proc/bltrproc_parameters.py b/schainpy/model/proc/bltrproc_parameters.py index 30fcc63..925d791 100644 --- a/schainpy/model/proc/bltrproc_parameters.py +++ b/schainpy/model/proc/bltrproc_parameters.py @@ -5,17 +5,13 @@ Created on Oct 24, 2016 ''' import numpy -import copy import datetime import time -from time import gmtime -from numpy import transpose - -from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator +from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation from schainpy.model.data.jrodata import Parameters -@MPDecorator + class BLTRParametersProc(ProcessingUnit): ''' Processing unit for BLTR parameters data (winds) @@ -25,7 +21,7 @@ class BLTRParametersProc(ProcessingUnit): self.dataOut.nchannels - Number of channels self.dataOut.nranges - Number of ranges - self.dataOut.data_SNR - SNR array + self.dataOut.data_snr - SNR array self.dataOut.data_output - Zonal, Vertical and Meridional velocity array self.dataOut.height - Height array (km) self.dataOut.time - Time array (seconds) @@ -67,16 +63,18 @@ class BLTRParametersProc(ProcessingUnit): self.dataOut.data_param = self.dataOut.data[mode] self.dataOut.heightList = self.dataOut.height[0] - self.dataOut.data_SNR = self.dataOut.data_SNR[mode] + self.dataOut.data_snr = self.dataOut.data_snr[mode] + SNRavg = numpy.average(self.dataOut.data_snr, axis=0) + SNRavgdB = 10*numpy.log10(SNRavg) + self.dataOut.data_snr_avg_db = SNRavgdB.reshape(1, *SNRavgdB.shape) + # Censoring Data if snr_threshold is not None: - SNRavg = numpy.average(self.dataOut.data_SNR, axis=0) - SNRavgdB = 10*numpy.log10(SNRavg) for i in range(3): self.dataOut.data_param[i][SNRavgdB <= snr_threshold] = numpy.nan # TODO -@MPDecorator + class OutliersFilter(Operation): def __init__(self): diff --git a/schainpy/model/proc/jroproc_amisr.py b/schainpy/model/proc/jroproc_amisr.py index 223be95..93f3dd8 100644 --- a/schainpy/model/proc/jroproc_amisr.py +++ b/schainpy/model/proc/jroproc_amisr.py @@ -16,7 +16,7 @@ class AMISRProc(ProcessingUnit): self.dataOut.copy(self.dataIn) -class PrintInfo(Operation): +class PrintInfoAMISR(Operation): def __init__(self, **kwargs): Operation.__init__(self, **kwargs) self.__isPrinted = False diff --git a/schainpy/model/proc/jroproc_base.py b/schainpy/model/proc/jroproc_base.py index 9f914c4..a923b62 100644 --- a/schainpy/model/proc/jroproc_base.py +++ b/schainpy/model/proc/jroproc_base.py @@ -1,50 +1,25 @@ ''' -Updated for multiprocessing -Author : Sergio Cortez -Jan 2018 -Abstract: - Base class for processing units and operations. A decorator provides multiprocessing features and interconnect the processes created. - The argument (kwargs) sent from the controller is parsed and filtered via the decorator for each processing unit or operation instantiated. - The decorator handle also the methods inside the processing unit to be called from the main script (not as operations) (OPERATION -> type ='self'). - -Based on: - $Author: murco $ - $Id: jroproc_base.py 1 2012-11-12 18:56:07Z murco $ +Base clases to create Processing units and operations, the MPDecorator +must be used in plotting and writing operations to allow to run as an +external process. ''' -import os -import sys import inspect import zmq import time import pickle import traceback -try: - from queue import Queue -except: - from Queue import Queue from threading import Thread -from multiprocessing import Process - +from multiprocessing import Process, Queue from schainpy.utils import log class ProcessingUnit(object): + ''' + Base class to create Signal Chain Units + ''' - """ - Update - Jan 2018 - MULTIPROCESSING - All the "call" methods present in the previous base were removed. - The majority of operations are independant processes, thus - the decorator is in charge of communicate the operation processes - with the proccessing unit via IPC. - - The constructor does not receive any argument. The remaining methods - are related with the operations to execute. - - - """ proc_type = 'processing' - __attrs__ = [] def __init__(self): @@ -52,7 +27,10 @@ class ProcessingUnit(object): self.dataOut = None self.isConfig = False self.operations = [] - self.plots = [] + + def setInput(self, unit): + + self.dataIn = unit.dataOut def getAllowedArgs(self): if hasattr(self, '__attrs__'): @@ -61,27 +39,10 @@ class ProcessingUnit(object): return inspect.getargspec(self.run).args def addOperation(self, conf, operation): - """ - This method is used in the controller, and update the dictionary containing the operations to execute. The dict - posses the id of the operation process (IPC purposes) - - Agrega un objeto del tipo "Operation" (opObj) a la lista de objetos "self.objectList" y retorna el - identificador asociado a este objeto. - - Input: - - object : objeto de la clase "Operation" - - Return: - - objId : identificador del objeto, necesario para comunicar con master(procUnit) - """ - - self.operations.append( - (operation, conf.type, conf.id, conf.getKwargs())) + ''' + ''' - if 'plot' in self.name.lower(): - self.plots.append(operation.CODE) + self.operations.append((operation, conf.type, conf.getKwargs())) def getOperationObj(self, objId): @@ -90,17 +51,37 @@ class ProcessingUnit(object): return self.operations[objId] - def operation(self, **kwargs): - """ - Operacion directa sobre la data (dataOut.data). Es necesario actualizar los valores de los - atributos del objeto dataOut + def call(self, **kwargs): + ''' + ''' + + try: + if self.dataIn is not None and self.dataIn.flagNoData and not self.dataIn.error: + return self.dataIn.isReady() + elif self.dataIn is None or not self.dataIn.error: + self.run(**kwargs) + elif self.dataIn.error: + self.dataOut.error = self.dataIn.error + self.dataOut.flagNoData = True + except: + err = traceback.format_exc() + if 'SchainWarning' in err: + log.warning(err.split('SchainWarning:')[-1].split('\n')[0].strip(), self.name) + elif 'SchainError' in err: + log.error(err.split('SchainError:')[-1].split('\n')[0].strip(), self.name) + else: + log.error(err, self.name) + self.dataOut.error = True - Input: + for op, optype, opkwargs in self.operations: + if optype == 'other' and not self.dataOut.flagNoData: + self.dataOut = op.run(self.dataOut, **opkwargs) + elif optype == 'external' and not self.dataOut.flagNoData: + op.queue.put(self.dataOut) + elif optype == 'external' and self.dataOut.error: + op.queue.put(self.dataOut) - **kwargs : Diccionario de argumentos de la funcion a ejecutar - """ - - raise NotImplementedError + return 'Error' if self.dataOut.error else self.dataOut.isReady() def setup(self): @@ -117,22 +98,10 @@ class ProcessingUnit(object): class Operation(object): - """ - Update - Jan 2018 - MULTIPROCESSING - - Most of the methods remained the same. The decorator parse the arguments and executed the run() method for each process. - The constructor doe snot receive any argument, neither the baseclass. - - - Clase base para definir las operaciones adicionales que se pueden agregar a la clase ProcessingUnit - y necesiten acumular informacion previa de los datos a procesar. De preferencia usar un buffer de - acumulacion dentro de esta clase - - Ejemplo: Integraciones coherentes, necesita la informacion previa de los n perfiles anteriores (bufffer) + ''' + ''' - """ proc_type = 'operation' - __attrs__ = [] def __init__(self): @@ -180,58 +149,12 @@ class Operation(object): return -class InputQueue(Thread): - - ''' - Class to hold input data for Proccessing Units and external Operations, - ''' - - def __init__(self, project_id, inputId, lock=None): - - Thread.__init__(self) - self.queue = Queue() - self.project_id = project_id - self.inputId = inputId - self.lock = lock - self.islocked = False - self.size = 0 - - def run(self): - - c = zmq.Context() - self.receiver = c.socket(zmq.SUB) - self.receiver.connect( - 'ipc:///tmp/schain/{}_pub'.format(self.project_id)) - self.receiver.setsockopt(zmq.SUBSCRIBE, self.inputId.encode()) - - while True: - obj = self.receiver.recv_multipart()[1] - self.size += sys.getsizeof(obj) - self.queue.put(obj) - - def get(self): - - if not self.islocked and self.size/1000000 > 512: - self.lock.n.value += 1 - self.islocked = True - self.lock.clear() - elif self.islocked and self.size/1000000 <= 512: - self.islocked = False - self.lock.n.value -= 1 - if self.lock.n.value == 0: - self.lock.set() - - obj = self.queue.get() - self.size -= sys.getsizeof(obj) - return pickle.loads(obj) - def MPDecorator(BaseClass): """ Multiprocessing class decorator - This function add multiprocessing features to a BaseClass. Also, it handle - the communication beetween processes (readers, procUnits and operations). + This function add multiprocessing features to a BaseClass. """ class MPClass(BaseClass, Process): @@ -239,13 +162,11 @@ def MPDecorator(BaseClass): def __init__(self, *args, **kwargs): super(MPClass, self).__init__() Process.__init__(self) - self.operationKwargs = {} + self.args = args self.kwargs = kwargs - self.sender = None - self.receiver = None - self.i = 0 self.t = time.time() + self.op_type = 'external' self.name = BaseClass.__name__ self.__doc__ = BaseClass.__doc__ @@ -253,174 +174,30 @@ def MPDecorator(BaseClass): self.name = '{}{}'.format(self.CODE.upper(), 'Plot') self.start_time = time.time() - self.id = args[0] - self.inputId = args[1] - self.project_id = args[2] self.err_queue = args[3] - self.lock = args[4] - self.typeProc = args[5] - self.err_queue.put('#_start_#') - if self.inputId is not None: - self.queue = InputQueue(self.project_id, self.inputId, self.lock) - - def subscribe(self): - ''' - Start the zmq socket receiver and subcribe to input ID. - ''' - - self.queue.start() - - def listen(self): - ''' - This function waits for objects - ''' - - return self.queue.get() - - def set_publisher(self): - ''' - This function create a zmq socket for publishing objects. - ''' - - time.sleep(0.5) - - c = zmq.Context() - self.sender = c.socket(zmq.PUB) - self.sender.connect( - 'ipc:///tmp/schain/{}_sub'.format(self.project_id)) - - def publish(self, data, id): - ''' - This function publish an object, to an specific topic. - It blocks publishing when receiver queue is full to avoid data loss - ''' - - if self.inputId is None: - self.lock.wait() - self.sender.send_multipart([str(id).encode(), pickle.dumps(data)]) - def runReader(self): - ''' - Run fuction for read units - ''' - while True: - - try: - BaseClass.run(self, **self.kwargs) - except: - err = traceback.format_exc() - if 'No more files' in err: - log.warning('No more files to read', self.name) - else: - self.err_queue.put('{}|{}'.format(self.name, err)) - self.dataOut.error = True - - for op, optype, opId, kwargs in self.operations: - if optype == 'self' and not self.dataOut.flagNoData: - op(**kwargs) - elif optype == 'other' and not self.dataOut.flagNoData: - self.dataOut = op.run(self.dataOut, **self.kwargs) - elif optype == 'external': - self.publish(self.dataOut, opId) - - if self.dataOut.flagNoData and not self.dataOut.error: - continue - - self.publish(self.dataOut, self.id) - if self.dataOut.error: - break - - time.sleep(0.5) + self.queue = Queue(maxsize=1) + self.myrun = BaseClass.run - def runProc(self): - ''' - Run function for proccessing units - ''' - - while True: - self.dataIn = self.listen() - - if self.dataIn.flagNoData and self.dataIn.error is None: - continue - elif not self.dataIn.error: - try: - BaseClass.run(self, **self.kwargs) - except: - self.err_queue.put('{}|{}'.format(self.name, traceback.format_exc())) - self.dataOut.error = True - elif self.dataIn.error: - self.dataOut.error = self.dataIn.error - self.dataOut.flagNoData = True - - for op, optype, opId, kwargs in self.operations: - if optype == 'self' and not self.dataOut.flagNoData: - op(**kwargs) - elif optype == 'other' and not self.dataOut.flagNoData: - self.dataOut = op.run(self.dataOut, **kwargs) - elif optype == 'external' and not self.dataOut.flagNoData: - self.publish(self.dataOut, opId) - - self.publish(self.dataOut, self.id) - for op, optype, opId, kwargs in self.operations: - if optype == 'external' and self.dataOut.error: - self.publish(self.dataOut, opId) - - if self.dataOut.error: - break - - time.sleep(0.5) - - def runOp(self): - ''' - Run function for external operations (this operations just receive data - ex: plots, writers, publishers) - ''' + def run(self): while True: - dataOut = self.listen() + dataOut = self.queue.get() if not dataOut.error: try: BaseClass.run(self, dataOut, **self.kwargs) except: - self.err_queue.put('{}|{}'.format(self.name, traceback.format_exc())) - dataOut.error = True + err = traceback.format_exc() + log.error(err, self.name) else: break - def run(self): - if self.typeProc is "ProcUnit": - - if self.inputId is not None: - self.subscribe() - - self.set_publisher() - - if 'Reader' not in BaseClass.__name__: - self.runProc() - else: - self.runReader() - elif self.typeProc is "Operation": - - self.subscribe() - self.runOp() - - else: - raise ValueError("Unknown type") - self.close() def close(self): BaseClass.close(self) - self.err_queue.put('#_end_#') - - if self.sender: - self.sender.close() - - if self.receiver: - self.receiver.close() - log.success('Done...(Time:{:4.2f} secs)'.format(time.time()-self.start_time), self.name) return MPClass diff --git a/schainpy/model/proc/jroproc_correlation.py b/schainpy/model/proc/jroproc_correlation.py index f3b9ae0..76a92fe 100644 --- a/schainpy/model/proc/jroproc_correlation.py +++ b/schainpy/model/proc/jroproc_correlation.py @@ -1,7 +1,7 @@ import numpy from .jroproc_base import ProcessingUnit, Operation -from schainpy.model.data.jrodata import Correlation, hildebrand_sekhon +from schainpy.model.data.jrodata import Correlation class CorrelationProc(ProcessingUnit): diff --git a/schainpy/model/proc/jroproc_heispectra.py b/schainpy/model/proc/jroproc_heispectra.py index 1e3a11e..be414c1 100644 --- a/schainpy/model/proc/jroproc_heispectra.py +++ b/schainpy/model/proc/jroproc_heispectra.py @@ -5,7 +5,7 @@ from schainpy.model.data.jrodata import SpectraHeis from schainpy.utils import log -@MPDecorator + class SpectraHeisProc(ProcessingUnit): def __init__(self):#, **kwargs): @@ -136,11 +136,8 @@ class SpectraHeisProc(ProcessingUnit): for channelIndex in channelIndexList: if channelIndex not in self.dataOut.channelIndexList: - print(channelIndexList) raise ValueError("The value %d in channelIndexList is not valid" %channelIndex) -# nChannels = len(channelIndexList) - data_spc = self.dataOut.data_spc[channelIndexList,:] self.dataOut.data_spc = data_spc diff --git a/schainpy/model/proc/jroproc_parameters.py b/schainpy/model/proc/jroproc_parameters.py index 2505e3b..a179946 100755 --- a/schainpy/model/proc/jroproc_parameters.py +++ b/schainpy/model/proc/jroproc_parameters.py @@ -23,10 +23,10 @@ from numpy import NaN from scipy.optimize.optimize import OptimizeWarning warnings.filterwarnings('ignore') +import matplotlib.pyplot as plt SPEED_OF_LIGHT = 299792458 - '''solving pickling issue''' def _pickle_method(method): @@ -45,7 +45,7 @@ def _unpickle_method(func_name, obj, cls): break return func.__get__(obj, cls) -@MPDecorator + class ParametersProc(ProcessingUnit): METHODS = {} @@ -77,9 +77,9 @@ class ParametersProc(ProcessingUnit): self.dataOut.dtype = numpy.dtype([('real','0)) + j2index = numpy.squeeze(numpy.where(numpy.diff(junk)<0)) + if ((numpy.size(j1index)<=1) | (numpy.size(j2index)<=1)) : + continue + junk3 = numpy.squeeze(numpy.diff(j1index)) + junk4 = numpy.squeeze(numpy.diff(j2index)) + + valleyindex = j2index[numpy.where(junk4>1)] + peakindex = j1index[numpy.where(junk3>1)] + + isvalid = numpy.squeeze(numpy.where(numpy.abs(VelRange[gc_values[peakindex]]) <= 2.5*dv)) + if numpy.size(isvalid) == 0 : + continue + if numpy.size(isvalid) >1 : + vindex = numpy.argmax(self.spc[ich,gc_values[peakindex[isvalid]],ir]) + isvalid = isvalid[vindex] + + # clutter peak + gcpeak = peakindex[isvalid] + vl = numpy.where(valleyindex < gcpeak) + if numpy.size(vl) == 0: + continue + gcvl = valleyindex[vl[0][-1]] + vr = numpy.where(valleyindex > gcpeak) + if numpy.size(vr) == 0: + continue + gcvr = valleyindex[vr[0][0]] + + # Removing the clutter + interpindex = numpy.array([gc_values[gcvl], gc_values[gcvr]]) + gcindex = gc_values[gcvl+1:gcvr-1] + self.spc_out[ich,gcindex,ir] = numpy.interp(VelRange[gcindex],VelRange[interpindex],self.spc[ich,interpindex,ir]) + + dataOut.data_pre[0] = self.spc_out + #print ('Leaving RemoveWideGC ... ') + return dataOut - VelRange = dataOut.spc_range[2] - TimeRange = dataOut.spc_range[1] - FrecRange = dataOut.spc_range[0] - - Vmax= 2*numpy.max(dataOut.spc_range[2]) - Tmax= 2*numpy.max(dataOut.spc_range[1]) - Fmax= 2*numpy.max(dataOut.spc_range[0]) - - Breaker1R=VelRange[numpy.abs(VelRange-(-LimitN)).argmin()] - Breaker1R=numpy.where(VelRange == Breaker1R) - - Delta = self.Num_Bin/2 - Breaker1R[0] - - - '''Reacomodando SPCrange''' +class SpectralFilters(Operation): + ''' This class allows to replace the novalid values with noise for each channel + This applies to CLAIRE RADAR - VelRange=numpy.roll(VelRange,-(int(self.Num_Bin/2)) ,axis=0) + PositiveLimit : RightLimit of novalid data + NegativeLimit : LeftLimit of novalid data - VelRange[-(int(self.Num_Bin/2)):]+= Vmax + Input: - FrecRange=numpy.roll(FrecRange,-(int(self.Num_Bin/2)),axis=0) + self.dataOut.data_pre : SPC and CSPC + self.dataOut.spc_range : To select wind and rainfall velocities - FrecRange[-(int(self.Num_Bin/2)):]+= Fmax + Affected: - TimeRange=numpy.roll(TimeRange,-(int(self.Num_Bin/2)),axis=0) + self.dataOut.data_pre : It is used for the new SPC and CSPC ranges of wind - TimeRange[-(int(self.Num_Bin/2)):]+= Tmax + Written by D. Scipión 29.01.2021 + ''' + def __init__(self): + Operation.__init__(self) + self.i = 0 - ''' ------------------ ''' + def run(self, dataOut, ): - Breaker2R=VelRange[numpy.abs(VelRange-(LimitR)).argmin()] - Breaker2R=numpy.where(VelRange == Breaker2R) + self.spc = dataOut.data_pre[0].copy() + self.Num_Chn = self.spc.shape[0] + VelRange = dataOut.spc_range[2] + # novalid corresponds to data within the Negative and PositiveLimit - SPCroll = numpy.roll(self.spc,-(int(self.Num_Bin/2)) ,axis=1) - SPCcut = SPCroll.copy() + # Removing novalid data from the spectra for i in range(self.Num_Chn): - - SPCcut[i,0:int(Breaker2R[0]),:] = dataOut.noise[i] - SPCcut[i,-int(Delta):,:] = dataOut.noise[i] - - SPCcut[i]=SPCcut[i]- dataOut.noise[i] - SPCcut[ numpy.where( SPCcut<0 ) ] = 1e-20 - - SPCroll[i]=SPCroll[i]-dataOut.noise[i] - SPCroll[ numpy.where( SPCroll<0 ) ] = 1e-20 - - SPC_ch1 = SPCroll - - SPC_ch2 = SPCcut - - SPCparam = (SPC_ch1, SPC_ch2, self.spc) - dataOut.SPCparam = numpy.asarray(SPCparam) - - - dataOut.spcparam_range=numpy.zeros([self.Num_Chn,self.Num_Bin+1]) - - dataOut.spcparam_range[2]=VelRange - dataOut.spcparam_range[1]=TimeRange - dataOut.spcparam_range[0]=FrecRange + self.spc[i,novalid,:] = dataOut.noise[i] + dataOut.data_pre[0] = self.spc return dataOut class GaussianFit(Operation): @@ -307,135 +338,186 @@ class GaussianFit(Operation): self.i=0 - def run(self, dataOut, num_intg=7, pnoise=1., SNRlimit=-9): #num_intg: Incoherent integrations, pnoise: Noise, vel_arr: range of velocities, similar to the ftt points + # def run(self, dataOut, num_intg=7, pnoise=1., SNRlimit=-9): #num_intg: Incoherent integrations, pnoise: Noise, vel_arr: range of velocities, similar to the ftt points + def run(self, dataOut, SNRdBlimit=-9, method='generalized'): """This routine will find a couple of generalized Gaussians to a power spectrum + methods: generalized, squared input: spc output: - Amplitude0,shift0,width0,p0,Amplitude1,shift1,width1,p1,noise + noise, amplitude0,shift0,width0,p0,Amplitude1,shift1,width1,p1 """ - + print ('Entering ',method,' double Gaussian fit') self.spc = dataOut.data_pre[0].copy() self.Num_Hei = self.spc.shape[2] self.Num_Bin = self.spc.shape[1] self.Num_Chn = self.spc.shape[0] - Vrange = dataOut.abscissaList - - GauSPC = numpy.empty([self.Num_Chn,self.Num_Bin,self.Num_Hei]) - SPC_ch1 = numpy.empty([self.Num_Bin,self.Num_Hei]) - SPC_ch2 = numpy.empty([self.Num_Bin,self.Num_Hei]) - SPC_ch1[:] = numpy.NaN - SPC_ch2[:] = numpy.NaN - start_time = time.time() - noise_ = dataOut.spc_noise[0].copy() - - pool = Pool(processes=self.Num_Chn) - args = [(Vrange, Ch, pnoise, noise_, num_intg, SNRlimit) for Ch in range(self.Num_Chn)] + args = [(dataOut.spc_range[2], ich, dataOut.spc_noise[ich], dataOut.nIncohInt, SNRdBlimit) for ich in range(self.Num_Chn)] objs = [self for __ in range(self.Num_Chn)] attrs = list(zip(objs, args)) - gauSPC = pool.map(target, attrs) - dataOut.SPCparam = numpy.asarray(SPCparam) - - ''' Parameters: - 1. Amplitude - 2. Shift - 3. Width - 4. Power - ''' + DGauFitParam = pool.map(target, attrs) + # Parameters: + # 0. Noise, 1. Amplitude, 2. Shift, 3. Width 4. Power + dataOut.DGauFitParams = numpy.asarray(DGauFitParam) + + # Double Gaussian Curves + gau0 = numpy.zeros([self.Num_Chn,self.Num_Bin,self.Num_Hei]) + gau0[:] = numpy.NaN + gau1 = numpy.zeros([self.Num_Chn,self.Num_Bin,self.Num_Hei]) + gau1[:] = numpy.NaN + x_mtr = numpy.transpose(numpy.tile(dataOut.getVelRange(1)[:-1], (self.Num_Hei,1))) + for iCh in range(self.Num_Chn): + N0 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][0,:,0]] * self.Num_Bin)) + N1 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][0,:,1]] * self.Num_Bin)) + A0 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][1,:,0]] * self.Num_Bin)) + A1 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][1,:,1]] * self.Num_Bin)) + v0 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][2,:,0]] * self.Num_Bin)) + v1 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][2,:,1]] * self.Num_Bin)) + s0 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][3,:,0]] * self.Num_Bin)) + s1 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][3,:,1]] * self.Num_Bin)) + if method == 'genealized': + p0 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][4,:,0]] * self.Num_Bin)) + p1 = numpy.transpose(numpy.transpose([dataOut.DGauFitParams[iCh][4,:,1]] * self.Num_Bin)) + elif method == 'squared': + p0 = 2. + p1 = 2. + gau0[iCh] = A0*numpy.exp(-0.5*numpy.abs((x_mtr-v0)/s0)**p0)+N0 + gau1[iCh] = A1*numpy.exp(-0.5*numpy.abs((x_mtr-v1)/s1)**p1)+N1 + dataOut.GaussFit0 = gau0 + dataOut.GaussFit1 = gau1 + + print('Leaving ',method ,' double Gaussian fit') + return dataOut def FitGau(self, X): - - Vrange, ch, pnoise, noise_, num_intg, SNRlimit = X - - SPCparam = [] - SPC_ch1 = numpy.empty([self.Num_Bin,self.Num_Hei]) - SPC_ch2 = numpy.empty([self.Num_Bin,self.Num_Hei]) - SPC_ch1[:] = 0#numpy.NaN - SPC_ch2[:] = 0#numpy.NaN - - - + # print('Entering FitGau') + # Assigning the variables + Vrange, ch, wnoise, num_intg, SNRlimit = X + # Noise Limits + noisebl = wnoise * 0.9 + noisebh = wnoise * 1.1 + # Radar Velocity + Va = max(Vrange) + deltav = Vrange[1] - Vrange[0] + x = numpy.arange(self.Num_Bin) + + # print ('stop 0') + + # 5 parameters, 2 Gaussians + DGauFitParam = numpy.zeros([5, self.Num_Hei,2]) + DGauFitParam[:] = numpy.NaN + + # SPCparam = [] + # SPC_ch1 = numpy.zeros([self.Num_Bin,self.Num_Hei]) + # SPC_ch2 = numpy.zeros([self.Num_Bin,self.Num_Hei]) + # SPC_ch1[:] = 0 #numpy.NaN + # SPC_ch2[:] = 0 #numpy.NaN + # print ('stop 1') for ht in range(self.Num_Hei): - - + # print (ht) + # print ('stop 2') + # Spectra at each range spc = numpy.asarray(self.spc)[ch,:,ht] + snr = ( spc.mean() - wnoise ) / wnoise + snrdB = 10.*numpy.log10(snr) + #print ('stop 3') + if snrdB < SNRlimit : + # snr = numpy.NaN + # SPC_ch1[:,ht] = 0#numpy.NaN + # SPC_ch1[:,ht] = 0#numpy.NaN + # SPCparam = (SPC_ch1,SPC_ch2) + # print ('SNR less than SNRth') + continue + # wnoise = hildebrand_sekhon(spc,num_intg) + # print ('stop 2.01') ############################################# # normalizing spc and noise # This part differs from gg1 - spc_norm_max = max(spc) + # spc_norm_max = max(spc) #commented by D. Scipión 19.03.2021 #spc = spc / spc_norm_max - pnoise = pnoise #/ spc_norm_max + # pnoise = pnoise #/ spc_norm_max #commented by D. Scipión 19.03.2021 ############################################# + # print ('stop 2.1') fatspectra=1.0 + # noise per channel.... we might want to use the noise at each range - wnoise = noise_ #/ spc_norm_max + # wnoise = noise_ #/ spc_norm_max #commented by D. Scipión 19.03.2021 #wnoise,stdv,i_max,index =enoise(spc,num_intg) #noise estimate using Hildebrand Sekhon, only wnoise is used #if wnoise>1.1*pnoise: # to be tested later # wnoise=pnoise - noisebl=wnoise*0.9; - noisebh=wnoise*1.1 - spc=spc-wnoise + # noisebl = wnoise*0.9 + # noisebh = wnoise*1.1 + spc = spc - wnoise # signal - minx=numpy.argmin(spc) + # print ('stop 2.2') + minx = numpy.argmin(spc) #spcs=spc.copy() - spcs=numpy.roll(spc,-minx) - cum=numpy.cumsum(spcs) - tot_noise=wnoise * self.Num_Bin #64; - - snr = sum(spcs)/tot_noise - snrdB=10.*numpy.log10(snr) - - if snrdB < SNRlimit : - snr = numpy.NaN - SPC_ch1[:,ht] = 0#numpy.NaN - SPC_ch1[:,ht] = 0#numpy.NaN - SPCparam = (SPC_ch1,SPC_ch2) - continue + spcs = numpy.roll(spc,-minx) + cum = numpy.cumsum(spcs) + # tot_noise = wnoise * self.Num_Bin #64; + + # print ('stop 2.3') + # snr = sum(spcs) / tot_noise + # snrdB = 10.*numpy.log10(snr) + #print ('stop 3') + # if snrdB < SNRlimit : + # snr = numpy.NaN + # SPC_ch1[:,ht] = 0#numpy.NaN + # SPC_ch1[:,ht] = 0#numpy.NaN + # SPCparam = (SPC_ch1,SPC_ch2) + # print ('SNR less than SNRth') + # continue #if snrdB<-18 or numpy.isnan(snrdB) or num_intg<4: # return [None,]*4,[None,]*4,None,snrdB,None,None,[None,]*5,[None,]*9,None - - cummax=max(cum); - epsi=0.08*fatspectra # cumsum to narrow down the energy region - cumlo=cummax*epsi; - cumhi=cummax*(1-epsi) - powerindex=numpy.array(numpy.where(numpy.logical_and(cum>cumlo, cumcumlo, cum-12: # when SNR is strong pick the peak with least shift (LOS velocity) error if oneG: - choice=0 + choice = 0 else: - w1=lsq2[0][1]; w2=lsq2[0][5] - a1=lsq2[0][2]; a2=lsq2[0][6] - p1=lsq2[0][3]; p2=lsq2[0][7] - s1=(2**(1+1./p1))*scipy.special.gamma(1./p1)/p1; - s2=(2**(1+1./p2))*scipy.special.gamma(1./p2)/p2; - gp1=a1*w1*s1; gp2=a2*w2*s2 # power content of each ggaussian with proper p scaling + w1 = lsq2[0][1]; w2 = lsq2[0][5] + a1 = lsq2[0][2]; a2 = lsq2[0][6] + p1 = lsq2[0][3]; p2 = lsq2[0][7] + s1 = (2**(1+1./p1))*scipy.special.gamma(1./p1)/p1 + s2 = (2**(1+1./p2))*scipy.special.gamma(1./p2)/p2 + gp1 = a1*w1*s1; gp2 = a2*w2*s2 # power content of each ggaussian with proper p scaling if gp1>gp2: if a1>0.7*a2: - choice=1 + choice = 1 else: - choice=2 + choice = 2 elif gp2>gp1: if a2>0.7*a1: - choice=2 + choice = 2 else: - choice=1 + choice = 1 else: - choice=numpy.argmax([a1,a2])+1 + choice = numpy.argmax([a1,a2])+1 #else: #choice=argmin([std2a,std2b])+1 else: # with low SNR go to the most energetic peak - choice=numpy.argmax([lsq1[0][2]*lsq1[0][1],lsq2[0][2]*lsq2[0][1],lsq2[0][6]*lsq2[0][5]]) - - - shift0=lsq2[0][0]; - vel0=Vrange[0] + shift0*(Vrange[1]-Vrange[0]) - shift1=lsq2[0][4]; - vel1=Vrange[0] + shift1*(Vrange[1]-Vrange[0]) - - max_vel = 1.0 - + choice = numpy.argmax([lsq1[0][2]*lsq1[0][1],lsq2[0][2]*lsq2[0][1],lsq2[0][6]*lsq2[0][5]]) + + # print ('stop 14') + shift0 = lsq2[0][0] + vel0 = Vrange[0] + shift0 * deltav + shift1 = lsq2[0][4] + # vel1=Vrange[0] + shift1 * deltav + + # max_vel = 1.0 + # Va = max(Vrange) + # deltav = Vrange[1]-Vrange[0] + # print ('stop 15') #first peak will be 0, second peak will be 1 - if vel0 > -1.0 and vel0 < max_vel : #first peak is in the correct range - shift0=lsq2[0][0] - width0=lsq2[0][1] - Amplitude0=lsq2[0][2] - p0=lsq2[0][3] - - shift1=lsq2[0][4] - width1=lsq2[0][5] - Amplitude1=lsq2[0][6] - p1=lsq2[0][7] - noise=lsq2[0][8] + # if vel0 > -1.0 and vel0 < max_vel : #first peak is in the correct range # Commented by D.Scipión 19.03.2021 + if vel0 > -Va and vel0 < Va : #first peak is in the correct range + shift0 = lsq2[0][0] + width0 = lsq2[0][1] + Amplitude0 = lsq2[0][2] + p0 = lsq2[0][3] + + shift1 = lsq2[0][4] + width1 = lsq2[0][5] + Amplitude1 = lsq2[0][6] + p1 = lsq2[0][7] + noise = lsq2[0][8] else: - shift1=lsq2[0][0] - width1=lsq2[0][1] - Amplitude1=lsq2[0][2] - p1=lsq2[0][3] + shift1 = lsq2[0][0] + width1 = lsq2[0][1] + Amplitude1 = lsq2[0][2] + p1 = lsq2[0][3] - shift0=lsq2[0][4] - width0=lsq2[0][5] - Amplitude0=lsq2[0][6] - p0=lsq2[0][7] - noise=lsq2[0][8] + shift0 = lsq2[0][4] + width0 = lsq2[0][5] + Amplitude0 = lsq2[0][6] + p0 = lsq2[0][7] + noise = lsq2[0][8] if Amplitude0<0.05: # in case the peak is noise - shift0,width0,Amplitude0,p0 = [0,0,0,0]#4*[numpy.NaN] + shift0,width0,Amplitude0,p0 = 4*[numpy.NaN] if Amplitude1<0.05: - shift1,width1,Amplitude1,p1 = [0,0,0,0]#4*[numpy.NaN] - - - SPC_ch1[:,ht] = noise + Amplitude0*numpy.exp(-0.5*(abs(x-shift0))/width0)**p0 - SPC_ch2[:,ht] = noise + Amplitude1*numpy.exp(-0.5*(abs(x-shift1))/width1)**p1 - SPCparam = (SPC_ch1,SPC_ch2) - - - return GauSPC + shift1,width1,Amplitude1,p1 = 4*[numpy.NaN] + + # print ('stop 16 ') + # SPC_ch1[:,ht] = noise + Amplitude0*numpy.exp(-0.5*(abs(x-shift0)/width0)**p0) + # SPC_ch2[:,ht] = noise + Amplitude1*numpy.exp(-0.5*(abs(x-shift1)/width1)**p1) + # SPCparam = (SPC_ch1,SPC_ch2) + + DGauFitParam[0,ht,0] = noise + DGauFitParam[0,ht,1] = noise + DGauFitParam[1,ht,0] = Amplitude0 + DGauFitParam[1,ht,1] = Amplitude1 + DGauFitParam[2,ht,0] = Vrange[0] + shift0 * deltav + DGauFitParam[2,ht,1] = Vrange[0] + shift1 * deltav + DGauFitParam[3,ht,0] = width0 * deltav + DGauFitParam[3,ht,1] = width1 * deltav + DGauFitParam[4,ht,0] = p0 + DGauFitParam[4,ht,1] = p1 + + # print (DGauFitParam.shape) + # print ('Leaving FitGau') + return DGauFitParam + # return SPCparam + # return GauSPC def y_model1(self,x,state): - shift0,width0,amplitude0,power0,noise=state - model0=amplitude0*numpy.exp(-0.5*abs((x-shift0)/width0)**power0) - - model0u=amplitude0*numpy.exp(-0.5*abs((x-shift0- self.Num_Bin )/width0)**power0) - - model0d=amplitude0*numpy.exp(-0.5*abs((x-shift0+ self.Num_Bin )/width0)**power0) - return model0+model0u+model0d+noise + shift0, width0, amplitude0, power0, noise = state + model0 = amplitude0*numpy.exp(-0.5*abs((x - shift0)/width0)**power0) + model0u = amplitude0*numpy.exp(-0.5*abs((x - shift0 - self.Num_Bin)/width0)**power0) + model0d = amplitude0*numpy.exp(-0.5*abs((x - shift0 + self.Num_Bin)/width0)**power0) + return model0 + model0u + model0d + noise def y_model2(self,x,state): #Equation for two generalized Gaussians with Nyquist - shift0,width0,amplitude0,power0,shift1,width1,amplitude1,power1,noise=state - model0=amplitude0*numpy.exp(-0.5*abs((x-shift0)/width0)**power0) - - model0u=amplitude0*numpy.exp(-0.5*abs((x-shift0- self.Num_Bin )/width0)**power0) - - model0d=amplitude0*numpy.exp(-0.5*abs((x-shift0+ self.Num_Bin )/width0)**power0) - model1=amplitude1*numpy.exp(-0.5*abs((x-shift1)/width1)**power1) - - model1u=amplitude1*numpy.exp(-0.5*abs((x-shift1- self.Num_Bin )/width1)**power1) + shift0, width0, amplitude0, power0, shift1, width1, amplitude1, power1, noise = state + model0 = amplitude0*numpy.exp(-0.5*abs((x-shift0)/width0)**power0) + model0u = amplitude0*numpy.exp(-0.5*abs((x - shift0 - self.Num_Bin)/width0)**power0) + model0d = amplitude0*numpy.exp(-0.5*abs((x - shift0 + self.Num_Bin)/width0)**power0) - model1d=amplitude1*numpy.exp(-0.5*abs((x-shift1+ self.Num_Bin )/width1)**power1) - return model0+model0u+model0d+model1+model1u+model1d+noise + model1 = amplitude1*numpy.exp(-0.5*abs((x - shift1)/width1)**power1) + model1u = amplitude1*numpy.exp(-0.5*abs((x - shift1 - self.Num_Bin)/width1)**power1) + model1d = amplitude1*numpy.exp(-0.5*abs((x - shift1 + self.Num_Bin)/width1)**power1) + return model0 + model0u + model0d + model1 + model1u + model1d + noise def misfit1(self,state,y_data,x,num_intg): # This function compares how close real data is with the model data, the close it is, the better it is. @@ -600,31 +697,10 @@ class PrecipitationProc(Operation): Operation.__init__(self) self.i=0 - - def gaus(self,xSamples,Amp,Mu,Sigma): - return ( Amp / ((2*numpy.pi)**0.5 * Sigma) ) * numpy.exp( -( xSamples - Mu )**2 / ( 2 * (Sigma**2) )) - - - - def Moments(self, ySamples, xSamples): - Pot = numpy.nansum( ySamples ) # Potencia, momento 0 - yNorm = ySamples / Pot - - Vr = numpy.nansum( yNorm * xSamples ) # Velocidad radial, mu, corrimiento doppler, primer momento - Sigma2 = abs(numpy.nansum( yNorm * ( xSamples - Vr )**2 )) # Segundo Momento - Desv = Sigma2**0.5 # Desv. Estandar, Ancho espectral - - return numpy.array([Pot, Vr, Desv]) - def run(self, dataOut, radar=None, Pt=5000, Gt=295.1209, Gr=70.7945, Lambda=0.6741, aL=2.5118, - tauW=4e-06, ThetaT=0.1656317, ThetaR=0.36774087, Km = 0.93, Altitude=3350): - - - Velrange = dataOut.spcparam_range[2] - FrecRange = dataOut.spcparam_range[0] + tauW=4e-06, ThetaT=0.1656317, ThetaR=0.36774087, Km2 = 0.93, Altitude=3350,SNRdBlimit=-30): - dV= Velrange[1]-Velrange[0] - dF= FrecRange[1]-FrecRange[0] + # print ('Entering PrecepitationProc ... ') if radar == "MIRA35C" : @@ -636,18 +712,17 @@ class PrecipitationProc(Operation): else: - self.spc = dataOut.SPCparam[1].copy() #dataOut.data_pre[0].copy() # - - """NOTA SE DEBE REMOVER EL RANGO DEL PULSO TX""" + self.spc = dataOut.data_pre[0].copy() + #NOTA SE DEBE REMOVER EL RANGO DEL PULSO TX self.spc[:,:,0:7]= numpy.NaN - """##########################################""" - self.Num_Hei = self.spc.shape[2] self.Num_Bin = self.spc.shape[1] self.Num_Chn = self.spc.shape[0] + VelRange = dataOut.spc_range[2] + ''' Se obtiene la constante del RADAR ''' self.Pt = Pt @@ -658,102 +733,71 @@ class PrecipitationProc(Operation): self.tauW = tauW self.ThetaT = ThetaT self.ThetaR = ThetaR + self.GSys = 10**(36.63/10) # Ganancia de los LNA 36.63 dB + self.lt = 10**(1.67/10) # Perdida en cables Tx 1.67 dB + self.lr = 10**(5.73/10) # Perdida en cables Rx 5.73 dB Numerator = ( (4*numpy.pi)**3 * aL**2 * 16 * numpy.log(2) ) Denominator = ( Pt * Gt * Gr * Lambda**2 * SPEED_OF_LIGHT * tauW * numpy.pi * ThetaT * ThetaR) RadarConstant = 10e-26 * Numerator / Denominator # - - ''' ============================= ''' - - self.spc[0] = (self.spc[0]-dataOut.noise[0]) - self.spc[1] = (self.spc[1]-dataOut.noise[1]) - self.spc[2] = (self.spc[2]-dataOut.noise[2]) - - self.spc[ numpy.where(self.spc < 0)] = 0 - - SPCmean = (numpy.mean(self.spc,0) - numpy.mean(dataOut.noise)) - SPCmean[ numpy.where(SPCmean < 0)] = 0 - - ETAn = numpy.zeros([self.Num_Bin,self.Num_Hei]) - ETAv = numpy.zeros([self.Num_Bin,self.Num_Hei]) - ETAd = numpy.zeros([self.Num_Bin,self.Num_Hei]) - - Pr = SPCmean[:,:] - - VelMeteoro = numpy.mean(SPCmean,axis=0) - - D_range = numpy.zeros([self.Num_Bin,self.Num_Hei]) - SIGMA = numpy.zeros([self.Num_Bin,self.Num_Hei]) - N_dist = numpy.zeros([self.Num_Bin,self.Num_Hei]) - V_mean = numpy.zeros(self.Num_Hei) - del_V = numpy.zeros(self.Num_Hei) - Z = numpy.zeros(self.Num_Hei) - Ze = numpy.zeros(self.Num_Hei) - RR = numpy.zeros(self.Num_Hei) - - Range = dataOut.heightList*1000. - - for R in range(self.Num_Hei): - - h = Range[R] + Altitude #Range from ground to radar pulse altitude - del_V[R] = 1 + 3.68 * 10**-5 * h + 1.71 * 10**-9 * h**2 #Density change correction for velocity - - D_range[:,R] = numpy.log( (9.65 - (Velrange[0:self.Num_Bin] / del_V[R])) / 10.3 ) / -0.6 #Diameter range [m]x10**-3 - - '''NOTA: ETA(n) dn = ETA(f) df - - dn = 1 Diferencial de muestreo - df = ETA(n) / ETA(f) - - ''' - - ETAn[:,R] = RadarConstant * Pr[:,R] * (Range[R] )**2 #Reflectivity (ETA) - - ETAv[:,R]=ETAn[:,R]/dV - - ETAd[:,R]=ETAv[:,R]*6.18*exp(-0.6*D_range[:,R]) - - SIGMA[:,R] = Km * (D_range[:,R] * 1e-3 )**6 * numpy.pi**5 / Lambda**4 #Equivalent Section of drops (sigma) - - N_dist[:,R] = ETAn[:,R] / SIGMA[:,R] - - DMoments = self.Moments(Pr[:,R], Velrange[0:self.Num_Bin]) - - try: - popt01,pcov = curve_fit(self.gaus, Velrange[0:self.Num_Bin] , Pr[:,R] , p0=DMoments) - except: - popt01=numpy.zeros(3) - popt01[1]= DMoments[1] - - if popt01[1]<0 or popt01[1]>20: - popt01[1]=numpy.NaN - - - V_mean[R]=popt01[1] - - Z[R] = numpy.nansum( N_dist[:,R] * (D_range[:,R])**6 )#*10**-18 - - RR[R] = 0.0006*numpy.pi * numpy.nansum( D_range[:,R]**3 * N_dist[:,R] * Velrange[0:self.Num_Bin] ) #Rainfall rate - - Ze[R] = (numpy.nansum( ETAn[:,R]) * Lambda**4) / ( 10**-18*numpy.pi**5 * Km) - - - - RR2 = (Z/200)**(1/1.6) - dBRR = 10*numpy.log10(RR) - dBRR2 = 10*numpy.log10(RR2) - - dBZe = 10*numpy.log10(Ze) - dBZ = 10*numpy.log10(Z) + ExpConstant = 10**(40/10) #Constante Experimental + + SignalPower = numpy.zeros([self.Num_Chn,self.Num_Bin,self.Num_Hei]) + for i in range(self.Num_Chn): + SignalPower[i,:,:] = self.spc[i,:,:] - dataOut.noise[i] + SignalPower[numpy.where(SignalPower < 0)] = 1e-20 + + SPCmean = numpy.mean(SignalPower, 0) + Pr = SPCmean[:,:]/dataOut.normFactor + + # Declaring auxiliary variables + Range = dataOut.heightList*1000. #Range in m + # replicate the heightlist to obtain a matrix [Num_Bin,Num_Hei] + rMtrx = numpy.transpose(numpy.transpose([dataOut.heightList*1000.] * self.Num_Bin)) + zMtrx = rMtrx+Altitude + # replicate the VelRange to obtain a matrix [Num_Bin,Num_Hei] + VelMtrx = numpy.transpose(numpy.tile(VelRange[:-1], (self.Num_Hei,1))) + + # height dependence to air density Foote and Du Toit (1969) + delv_z = 1 + 3.68e-5 * zMtrx + 1.71e-9 * zMtrx**2 + VMtrx = VelMtrx / delv_z #Normalized velocity + VMtrx[numpy.where(VMtrx> 9.6)] = numpy.NaN + # Diameter is related to the fall speed of falling drops + D_Vz = -1.667 * numpy.log( 0.9369 - 0.097087 * VMtrx ) # D in [mm] + # Only valid for D>= 0.16 mm + D_Vz[numpy.where(D_Vz < 0.16)] = numpy.NaN + + #Calculate Radar Reflectivity ETAn + ETAn = (RadarConstant *ExpConstant) * Pr * rMtrx**2 #Reflectivity (ETA) + ETAd = ETAn * 6.18 * exp( -0.6 * D_Vz ) * delv_z + # Radar Cross Section + sigmaD = Km2 * (D_Vz * 1e-3 )**6 * numpy.pi**5 / Lambda**4 + # Drop Size Distribution + DSD = ETAn / sigmaD + # Equivalente Reflectivy + Ze_eqn = numpy.nansum( DSD * D_Vz**6 ,axis=0) + Ze_org = numpy.nansum(ETAn * Lambda**4, axis=0) / (1e-18*numpy.pi**5 * Km2) # [mm^6 /m^3] + # RainFall Rate + RR = 0.0006*numpy.pi * numpy.nansum( D_Vz**3 * DSD * VelMtrx ,0) #mm/hr + + # Censoring the data + # Removing data with SNRth < 0dB se debe considerar el SNR por canal + SNRth = 10**(SNRdBlimit/10) #-30dB + novalid = numpy.where((dataOut.data_snr[0,:] 0.: - velocityX=numpy.append(velocityX, Vzon)#Vmag - - else: - velocityX=numpy.append(velocityX, numpy.NaN) - - if abs(Vmer)<100. and abs(Vmer) > 0.: - velocityY=numpy.append(velocityY, -Vmer)#Vang - - else: - velocityY=numpy.append(velocityY, numpy.NaN) - - if dbSNR[Height] > SNRlimit: - velocityV=numpy.append(velocityV, -Vver)#FirstMoment[Height]) - else: - velocityV=numpy.append(velocityV, numpy.NaN) - + if Height >= range_min and Height < range_max: + # error_code will be useful in future analysis + [Vzon,Vmer,Vver, error_code] = self.WindEstimation(spc[:,:,Height], cspc[:,:,Height], pairsList, + ChanDist, Height, dataOut.noise, dataOut.spc_range, dbSNR[Height], SNRdBlimit, NegativeLimit, PositiveLimit,dataOut.frequency) + if abs(Vzon) < 100. and abs(Vmer) < 100.: + velocityX[Height] = Vzon + velocityY[Height] = -Vmer + velocityZ[Height] = Vver - '''Nota: Cambiar el signo de numpy.array(velocityX) cuando se intente procesar datos de BLTR''' - data_output[0] = numpy.array(velocityX) #self.moving_average(numpy.array(velocityX) , N=1) - data_output[1] = numpy.array(velocityY) #self.moving_average(numpy.array(velocityY) , N=1) - data_output[2] = velocityV#FirstMoment - - xFrec=FrecRange[0:spc.shape[1]] - - dataOut.data_output=data_output + # Censoring data with SNR threshold + dbSNR [dbSNR < SNRdBlimit] = numpy.NaN + data_param[0] = velocityX + data_param[1] = velocityY + data_param[2] = velocityZ + data_param[3] = dbSNR + dataOut.data_param = data_param return dataOut - def moving_average(self,x, N=2): + """ convolution for smoothenig data. note that last N-1 values are convolution with zeroes """ return numpy.convolve(x, numpy.ones((N,))/N)[(N-1):] def gaus(self,xSamples,Amp,Mu,Sigma): - return ( Amp / ((2*numpy.pi)**0.5 * Sigma) ) * numpy.exp( -( xSamples - Mu )**2 / ( 2 * (Sigma**2) )) - - + return Amp * numpy.exp(-0.5*((xSamples - Mu)/Sigma)**2) def Moments(self, ySamples, xSamples): - Pot = numpy.nansum( ySamples ) # Potencia, momento 0 - yNorm = ySamples / Pot - Vr = numpy.nansum( yNorm * xSamples ) # Velocidad radial, mu, corrimiento doppler, primer momento - Sigma2 = abs(numpy.nansum( yNorm * ( xSamples - Vr )**2 )) # Segundo Momento - Desv = Sigma2**0.5 # Desv. Estandar, Ancho espectral - - return numpy.array([Pot, Vr, Desv]) - - def WindEstimation(self, spc, cspc, pairsList, ChanDist, Height, noise, AbbsisaRange, dbSNR, SNRlimit): + Power = numpy.nanmean(ySamples) # Power, 0th Moment + yNorm = ySamples / numpy.nansum(ySamples) + RadVel = numpy.nansum(xSamples * yNorm) # Radial Velocity, 1st Moment + Sigma2 = numpy.nansum(yNorm * (xSamples - RadVel)**2) # Spectral Width, 2nd Moment + StdDev = numpy.sqrt(numpy.abs(Sigma2)) # Desv. Estandar, Ancho espectral + return numpy.array([Power,RadVel,StdDev]) + + def StopWindEstimation(self, error_code): + Vzon = numpy.NaN + Vmer = numpy.NaN + Vver = numpy.NaN + return Vzon, Vmer, Vver, error_code + + def AntiAliasing(self, interval, maxstep): + """ + function to prevent errors from aliased values when computing phaseslope + """ + antialiased = numpy.zeros(len(interval)) + copyinterval = interval.copy() + + antialiased[0] = copyinterval[0] + + for i in range(1,len(antialiased)): + step = interval[i] - interval[i-1] + if step > maxstep: + copyinterval -= 2*numpy.pi + antialiased[i] = copyinterval[i] + elif step < maxstep*(-1): + copyinterval += 2*numpy.pi + antialiased[i] = copyinterval[i] + else: + antialiased[i] = copyinterval[i].copy() + return antialiased + def WindEstimation(self, spc, cspc, pairsList, ChanDist, Height, noise, AbbsisaRange, dbSNR, SNRlimit, NegativeLimit, PositiveLimit, radfreq): + """ + Function that Calculates Zonal, Meridional and Vertical wind velocities. + Initial Version by E. Bocanegra updated by J. Zibell until Nov. 2019. + + Input: + spc, cspc : self spectra and cross spectra data. In Briggs notation something like S_i*(S_i)_conj, (S_j)_conj respectively. + pairsList : Pairlist of channels + ChanDist : array of xi_ij and eta_ij + Height : height at which data is processed + noise : noise in [channels] format for specific height + Abbsisarange : range of the frequencies or velocities + dbSNR, SNRlimit : signal to noise ratio in db, lower limit + + Output: + Vzon, Vmer, Vver : wind velocities + error_code : int that states where code is terminated + + 0 : no error detected + 1 : Gaussian of mean spc exceeds widthlimit + 2 : no Gaussian of mean spc found + 3 : SNR to low or velocity to high -> prec. e.g. + 4 : at least one Gaussian of cspc exceeds widthlimit + 5 : zero out of three cspc Gaussian fits converged + 6 : phase slope fit could not be found + 7 : arrays used to fit phase have different length + 8 : frequency range is either too short (len <= 5) or very long (> 30% of cspc) - ySamples=numpy.ones([spc.shape[0],spc.shape[1]]) - phase=numpy.ones([spc.shape[0],spc.shape[1]]) - CSPCSamples=numpy.ones([spc.shape[0],spc.shape[1]],dtype=numpy.complex_) - coherence=numpy.ones([spc.shape[0],spc.shape[1]]) - PhaseSlope=numpy.zeros(spc.shape[0]) - PhaseInter=numpy.ones(spc.shape[0]) - xFrec=AbbsisaRange[0][0:spc.shape[1]] - xVel =AbbsisaRange[2][0:spc.shape[1]] - Vv=numpy.empty(spc.shape[2])*0 - SPCav = numpy.average(spc, axis=0)-numpy.average(noise) #spc[0]-noise[0]# + """ - SPCmoments = self.Moments(SPCav[:,Height], xVel ) - CSPCmoments = [] - cspcNoise = numpy.empty(3) + error_code = 0 + + nChan = spc.shape[0] + nProf = spc.shape[1] + nPair = cspc.shape[0] + + SPC_Samples = numpy.zeros([nChan, nProf]) # for normalized spc values for one height + CSPC_Samples = numpy.zeros([nPair, nProf], dtype=numpy.complex_) # for normalized cspc values + phase = numpy.zeros([nPair, nProf]) # phase between channels + PhaseSlope = numpy.zeros(nPair) # slope of the phases, channelwise + PhaseInter = numpy.zeros(nPair) # intercept to the slope of the phases, channelwise + xFrec = AbbsisaRange[0][:-1] # frequency range + xVel = AbbsisaRange[2][:-1] # velocity range + xSamples = xFrec # the frequency range is taken + delta_x = xSamples[1] - xSamples[0] # delta_f or delta_x + + # only consider velocities with in NegativeLimit and PositiveLimit + if (NegativeLimit is None): + NegativeLimit = numpy.min(xVel) + if (PositiveLimit is None): + PositiveLimit = numpy.max(xVel) + xvalid = numpy.where((xVel > NegativeLimit) & (xVel < PositiveLimit)) + xSamples_zoom = xSamples[xvalid] '''Getting Eij and Nij''' - - Xi01=ChanDist[0][0] - Eta01=ChanDist[0][1] - - Xi02=ChanDist[1][0] - Eta02=ChanDist[1][1] - - Xi12=ChanDist[2][0] - Eta12=ChanDist[2][1] - - z = spc.copy() - z = numpy.where(numpy.isfinite(z), z, numpy.NAN) - - for i in range(spc.shape[0]): - - '''****** Line of Data SPC ******''' - zline=z[i,:,Height].copy() - noise[i] # Se resta ruido - - '''****** SPC is normalized ******''' - SmoothSPC =self.moving_average(zline.copy(),N=1) # Se suaviza el ruido - FactNorm = SmoothSPC/numpy.nansum(SmoothSPC) # SPC Normalizado y suavizado - - xSamples = xFrec # Se toma el rango de frecuncias - ySamples[i] = FactNorm # Se toman los valores de SPC normalizado - - for i in range(spc.shape[0]): - - '''****** Line of Data CSPC ******''' - cspcLine = ( cspc[i,:,Height].copy())# - noise[i] ) # no! Se resta el ruido - SmoothCSPC =self.moving_average(cspcLine,N=1) # Se suaviza el ruido - cspcNorm = SmoothCSPC/numpy.nansum(SmoothCSPC) # CSPC normalizado y suavizado - - '''****** CSPC is normalized with respect to Briggs and Vincent ******''' - chan_index0 = pairsList[i][0] - chan_index1 = pairsList[i][1] - - CSPCFactor= numpy.abs(numpy.nansum(ySamples[chan_index0]))**2 * numpy.abs(numpy.nansum(ySamples[chan_index1]))**2 - CSPCNorm = cspcNorm / numpy.sqrt(CSPCFactor) - - CSPCSamples[i] = CSPCNorm - - coherence[i] = numpy.abs(CSPCSamples[i]) / numpy.sqrt(CSPCFactor) - - #coherence[i]= self.moving_average(coherence[i],N=1) - - phase[i] = self.moving_average( numpy.arctan2(CSPCSamples[i].imag, CSPCSamples[i].real),N=1)#*180/numpy.pi - - CSPCmoments = numpy.vstack([self.Moments(numpy.abs(CSPCSamples[0]), xSamples), - self.Moments(numpy.abs(CSPCSamples[1]), xSamples), - self.Moments(numpy.abs(CSPCSamples[2]), xSamples)]) - - - popt=[1e-10,0,1e-10] - popt01, popt02, popt12 = [1e-10,1e-10,1e-10], [1e-10,1e-10,1e-10] ,[1e-10,1e-10,1e-10] - FitGauss01, FitGauss02, FitGauss12 = numpy.empty(len(xSamples))*0, numpy.empty(len(xSamples))*0, numpy.empty(len(xSamples))*0 - - CSPCMask01 = numpy.abs(CSPCSamples[0]) - CSPCMask02 = numpy.abs(CSPCSamples[1]) - CSPCMask12 = numpy.abs(CSPCSamples[2]) - - mask01 = ~numpy.isnan(CSPCMask01) - mask02 = ~numpy.isnan(CSPCMask02) - mask12 = ~numpy.isnan(CSPCMask12) - - #mask = ~numpy.isnan(CSPCMask01) - CSPCMask01 = CSPCMask01[mask01] - CSPCMask02 = CSPCMask02[mask02] - CSPCMask12 = CSPCMask12[mask12] - #CSPCMask01 = numpy.ma.masked_invalid(CSPCMask01) - - - - '''***Fit Gauss CSPC01***''' - if dbSNR > SNRlimit and numpy.abs(SPCmoments[1])<3 : - try: - popt01,pcov = curve_fit(self.gaus,xSamples[mask01],numpy.abs(CSPCMask01),p0=CSPCmoments[0]) - popt02,pcov = curve_fit(self.gaus,xSamples[mask02],numpy.abs(CSPCMask02),p0=CSPCmoments[1]) - popt12,pcov = curve_fit(self.gaus,xSamples[mask12],numpy.abs(CSPCMask12),p0=CSPCmoments[2]) - FitGauss01 = self.gaus(xSamples,*popt01) - FitGauss02 = self.gaus(xSamples,*popt02) - FitGauss12 = self.gaus(xSamples,*popt12) - except: - FitGauss01=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[0])) - FitGauss02=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[1])) - FitGauss12=numpy.ones(len(xSamples))*numpy.mean(numpy.abs(CSPCSamples[2])) - - - CSPCopt = numpy.vstack([popt01,popt02,popt12]) - - '''****** Getting fij width ******''' - - yMean = numpy.average(ySamples, axis=0) # ySamples[0] - - '''******* Getting fitting Gaussian *******''' - meanGauss = sum(xSamples*yMean) / len(xSamples) # Mu, velocidad radial (frecuencia) - sigma2 = sum(yMean*(xSamples-meanGauss)**2) / len(xSamples) # Varianza, Ancho espectral (frecuencia) - - yMoments = self.Moments(yMean, xSamples) - - if dbSNR > SNRlimit and numpy.abs(SPCmoments[1])<3: # and abs(meanGauss/sigma2) > 0.00001: + Xi01, Xi02, Xi12 = ChanDist[:,0] + Eta01, Eta02, Eta12 = ChanDist[:,1] + + # spwd limit - updated by D. Scipión 30.03.2021 + widthlimit = 10 + '''************************* SPC is normalized ********************************''' + spc_norm = spc.copy() + # For each channel + for i in range(nChan): + spc_sub = spc_norm[i,:] - noise[i] # only the signal power + SPC_Samples[i] = spc_sub / (numpy.nansum(spc_sub) * delta_x) + + '''********************** FITTING MEAN SPC GAUSSIAN **********************''' + + """ the gaussian of the mean: first subtract noise, then normalize. this is legal because + you only fit the curve and don't need the absolute value of height for calculation, + only for estimation of width. for normalization of cross spectra, you need initial, + unnormalized self-spectra With noise. + + Technically, you don't even need to normalize the self-spectra, as you only need the + width of the peak. However, it was left this way. Note that the normalization has a flaw: + due to subtraction of the noise, some values are below zero. Raw "spc" values should be + >= 0, as it is the modulus squared of the signals (complex * it's conjugate) + """ + # initial conditions + popt = [1e-10,0,1e-10] + # Spectra average + SPCMean = numpy.average(SPC_Samples,0) + # Moments in frequency + SPCMoments = self.Moments(SPCMean[xvalid], xSamples_zoom) + + # Gauss Fit SPC in frequency domain + if dbSNR > SNRlimit: # only if SNR > SNRth try: - popt,pcov = curve_fit(self.gaus,xSamples,yMean,p0=yMoments) - FitGauss=self.gaus(xSamples,*popt) - + popt,pcov = curve_fit(self.gaus,xSamples_zoom,SPCMean[xvalid],p0=SPCMoments) + if popt[2] <= 0 or popt[2] > widthlimit: # CONDITION + return self.StopWindEstimation(error_code = 1) + FitGauss = self.gaus(xSamples_zoom,*popt) except :#RuntimeError: - FitGauss=numpy.ones(len(xSamples))*numpy.mean(yMean) - - + return self.StopWindEstimation(error_code = 2) else: - FitGauss=numpy.ones(len(xSamples))*numpy.mean(yMean) + return self.StopWindEstimation(error_code = 3) + '''***************************** CSPC Normalization ************************* + The Spc spectra are used to normalize the crossspectra. Peaks from precipitation + influence the norm which is not desired. First, a range is identified where the + wind peak is estimated -> sum_wind is sum of those frequencies. Next, the area + around it gets cut off and values replaced by mean determined by the boundary + data -> sum_noise (spc is not normalized here, thats why the noise is important) + The sums are then added and multiplied by range/datapoints, because you need + an integral and not a sum for normalization. - '''****** Getting Fij ******''' - Fijcspc = CSPCopt[:,2]/2*3 + A norm is found according to Briggs 92. + ''' + # for each pair + for i in range(nPair): + cspc_norm = cspc[i,:].copy() + chan_index0 = pairsList[i][0] + chan_index1 = pairsList[i][1] + CSPC_Samples[i] = cspc_norm / (numpy.sqrt(numpy.nansum(spc_norm[chan_index0])*numpy.nansum(spc_norm[chan_index1])) * delta_x) + phase[i] = numpy.arctan2(CSPC_Samples[i].imag, CSPC_Samples[i].real) + CSPCmoments = numpy.vstack([self.Moments(numpy.abs(CSPC_Samples[0,xvalid]), xSamples_zoom), + self.Moments(numpy.abs(CSPC_Samples[1,xvalid]), xSamples_zoom), + self.Moments(numpy.abs(CSPC_Samples[2,xvalid]), xSamples_zoom)]) - GaussCenter = popt[1] #xFrec[GCpos] - #Punto en Eje X de la Gaussiana donde se encuentra el centro - ClosestCenter = xSamples[numpy.abs(xSamples-GaussCenter).argmin()] - PointGauCenter = numpy.where(xSamples==ClosestCenter)[0][0] + popt01, popt02, popt12 = [1e-10,0,1e-10], [1e-10,0,1e-10] ,[1e-10,0,1e-10] + FitGauss01, FitGauss02, FitGauss12 = numpy.zeros(len(xSamples)), numpy.zeros(len(xSamples)), numpy.zeros(len(xSamples)) - #Punto e^-1 hubicado en la Gaussiana - PeMinus1 = numpy.max(FitGauss)* numpy.exp(-1) - FijClosest = FitGauss[numpy.abs(FitGauss-PeMinus1).argmin()] # El punto mas cercano a "Peminus1" dentro de "FitGauss" + '''*******************************FIT GAUSS CSPC************************************''' + try: + popt01,pcov = curve_fit(self.gaus,xSamples_zoom,numpy.abs(CSPC_Samples[0][xvalid]),p0=CSPCmoments[0]) + if popt01[2] > widthlimit: # CONDITION + return self.StopWindEstimation(error_code = 4) + popt02,pcov = curve_fit(self.gaus,xSamples_zoom,numpy.abs(CSPC_Samples[1][xvalid]),p0=CSPCmoments[1]) + if popt02[2] > widthlimit: # CONDITION + return self.StopWindEstimation(error_code = 4) + popt12,pcov = curve_fit(self.gaus,xSamples_zoom,numpy.abs(CSPC_Samples[2][xvalid]),p0=CSPCmoments[2]) + if popt12[2] > widthlimit: # CONDITION + return self.StopWindEstimation(error_code = 4) + + FitGauss01 = self.gaus(xSamples_zoom, *popt01) + FitGauss02 = self.gaus(xSamples_zoom, *popt02) + FitGauss12 = self.gaus(xSamples_zoom, *popt12) + except: + return self.StopWindEstimation(error_code = 5) + + + '''************* Getting Fij ***************''' + # x-axis point of the gaussian where the center is located from GaussFit of spectra + GaussCenter = popt[1] + ClosestCenter = xSamples_zoom[numpy.abs(xSamples_zoom-GaussCenter).argmin()] + PointGauCenter = numpy.where(xSamples_zoom==ClosestCenter)[0][0] + + # Point where e^-1 is located in the gaussian + PeMinus1 = numpy.max(FitGauss) * numpy.exp(-1) + FijClosest = FitGauss[numpy.abs(FitGauss-PeMinus1).argmin()] # The closest point to"Peminus1" in "FitGauss" PointFij = numpy.where(FitGauss==FijClosest)[0][0] + Fij = numpy.abs(xSamples_zoom[PointFij] - xSamples_zoom[PointGauCenter]) - if xSamples[PointFij] > xSamples[PointGauCenter]: - Fij = xSamples[PointFij] - xSamples[PointGauCenter] - - else: - Fij = xSamples[PointGauCenter] - xSamples[PointFij] - - - '''****** Taking frequency ranges from SPCs ******''' - - - #GaussCenter = popt[1] #Primer momento 01 - GauWidth = popt[2] *3/2 #Ancho de banda de Gau01 + '''********** Taking frequency ranges from mean SPCs **********''' + GauWidth = popt[2] * 3/2 # Bandwidth of Gau01 Range = numpy.empty(2) Range[0] = GaussCenter - GauWidth Range[1] = GaussCenter + GauWidth - #Punto en Eje X de la Gaussiana donde se encuentra ancho de banda (min:max) - ClosRangeMin = xSamples[numpy.abs(xSamples-Range[0]).argmin()] - ClosRangeMax = xSamples[numpy.abs(xSamples-Range[1]).argmin()] - - PointRangeMin = numpy.where(xSamples==ClosRangeMin)[0][0] - PointRangeMax = numpy.where(xSamples==ClosRangeMax)[0][0] - - Range=numpy.array([ PointRangeMin, PointRangeMax ]) - - FrecRange = xFrec[ Range[0] : Range[1] ] - VelRange = xVel[ Range[0] : Range[1] ] - - - '''****** Getting SCPC Slope ******''' - - for i in range(spc.shape[0]): - - if len(FrecRange)>5 and len(FrecRange) 5: + PhaseRange = phase[i, xvalid[0][Range[0]:Range[1]]].copy() mask = ~numpy.isnan(FrecRange) & ~numpy.isnan(PhaseRange) - if len(FrecRange) == len(PhaseRange): try: - slope, intercept, r_value, p_value, std_err = stats.linregress(FrecRange[mask], PhaseRange[mask]) - PhaseSlope[i]=slope - PhaseInter[i]=intercept + slope, intercept, _, _, _ = stats.linregress(FrecRange[mask], self.AntiAliasing(PhaseRange[mask], 4.5)) + PhaseSlope[i] = slope + PhaseInter[i] = intercept except: - PhaseSlope[i]=0 - PhaseInter[i]=0 + return self.StopWindEstimation(error_code = 6) else: - PhaseSlope[i]=0 - PhaseInter[i]=0 + return self.StopWindEstimation(error_code = 7) else: - PhaseSlope[i]=0 - PhaseInter[i]=0 - + return self.StopWindEstimation(error_code = 8) - '''Getting constant C''' - cC=(Fij*numpy.pi)**2 + '''*** Constants A-H correspond to the convention as in Briggs and Vincent 1992 ***''' - '''****** Getting constants F and G ******''' - MijEijNij=numpy.array([[Xi02,Eta02], [Xi12,Eta12]]) - MijResult0=(-PhaseSlope[1]*cC) / (2*numpy.pi) - MijResult1=(-PhaseSlope[2]*cC) / (2*numpy.pi) - MijResults=numpy.array([MijResult0,MijResult1]) - (cF,cG) = numpy.linalg.solve(MijEijNij, MijResults) + '''Getting constant C''' + cC=(Fij*numpy.pi)**2 - '''****** Getting constants A, B and H ******''' - W01=numpy.nanmax( FitGauss01 ) #numpy.abs(CSPCSamples[0])) - W02=numpy.nanmax( FitGauss02 ) #numpy.abs(CSPCSamples[1])) - W12=numpy.nanmax( FitGauss12 ) #numpy.abs(CSPCSamples[2])) + '''****** Getting constants F and G ******''' + MijEijNij = numpy.array([[Xi02,Eta02], [Xi12,Eta12]]) + # MijEijNij = numpy.array([[Xi01,Eta01], [Xi02,Eta02], [Xi12,Eta12]]) + # MijResult0 = (-PhaseSlope[0] * cC) / (2*numpy.pi) + MijResult1 = (-PhaseSlope[1] * cC) / (2*numpy.pi) + MijResult2 = (-PhaseSlope[2] * cC) / (2*numpy.pi) + # MijResults = numpy.array([MijResult0, MijResult1, MijResult2]) + MijResults = numpy.array([MijResult1, MijResult2]) + (cF,cG) = numpy.linalg.solve(MijEijNij, MijResults) - WijResult0=((cF*Xi01+cG*Eta01)**2)/cC - numpy.log(W01 / numpy.sqrt(numpy.pi/cC)) - WijResult1=((cF*Xi02+cG*Eta02)**2)/cC - numpy.log(W02 / numpy.sqrt(numpy.pi/cC)) - WijResult2=((cF*Xi12+cG*Eta12)**2)/cC - numpy.log(W12 / numpy.sqrt(numpy.pi/cC)) + '''****** Getting constants A, B and H ******''' + W01 = numpy.nanmax( FitGauss01 ) + W02 = numpy.nanmax( FitGauss02 ) + W12 = numpy.nanmax( FitGauss12 ) - WijResults=numpy.array([WijResult0, WijResult1, WijResult2]) + WijResult01 = ((cF * Xi01 + cG * Eta01)**2)/cC - numpy.log(W01 / numpy.sqrt(numpy.pi / cC)) + WijResult02 = ((cF * Xi02 + cG * Eta02)**2)/cC - numpy.log(W02 / numpy.sqrt(numpy.pi / cC)) + WijResult12 = ((cF * Xi12 + cG * Eta12)**2)/cC - numpy.log(W12 / numpy.sqrt(numpy.pi / cC)) + WijResults = numpy.array([WijResult01, WijResult02, WijResult12]) - WijEijNij=numpy.array([ [Xi01**2, Eta01**2, 2*Xi01*Eta01] , [Xi02**2, Eta02**2, 2*Xi02*Eta02] , [Xi12**2, Eta12**2, 2*Xi12*Eta12] ]) - (cA,cB,cH) = numpy.linalg.solve(WijEijNij, WijResults) + WijEijNij = numpy.array([ [Xi01**2, Eta01**2, 2*Xi01*Eta01] , [Xi02**2, Eta02**2, 2*Xi02*Eta02] , [Xi12**2, Eta12**2, 2*Xi12*Eta12] ]) + (cA,cB,cH) = numpy.linalg.solve(WijEijNij, WijResults) - VxVy=numpy.array([[cA,cH],[cH,cB]]) - VxVyResults=numpy.array([-cF,-cG]) - (Vx,Vy) = numpy.linalg.solve(VxVy, VxVyResults) - - Vzon = Vy - Vmer = Vx - Vmag=numpy.sqrt(Vzon**2+Vmer**2) - Vang=numpy.arctan2(Vmer,Vzon) - if numpy.abs( popt[1] ) < 3.5 and len(FrecRange)>4: - Vver=popt[1] - else: - Vver=numpy.NaN - FitGaussCSPC = numpy.array([FitGauss01,FitGauss02,FitGauss12]) + VxVy = numpy.array([[cA,cH],[cH,cB]]) + VxVyResults = numpy.array([-cF,-cG]) + (Vmer,Vzon) = numpy.linalg.solve(VxVy, VxVyResults) + Vver = -SPCMoments[1]*SPEED_OF_LIGHT/(2*radfreq) + error_code = 0 - - return Vzon, Vmer, Vver, GaussCenter, PhaseSlope, FitGaussCSPC + return Vzon, Vmer, Vver, error_code class SpectralMoments(Operation): @@ -1198,13 +1220,12 @@ class SpectralMoments(Operation): Affected: self.dataOut.moments : Parameters per channel - self.dataOut.data_SNR : SNR per channel + self.dataOut.data_snr : SNR per channel ''' def run(self, dataOut): - #dataOut.data_pre = dataOut.data_pre[0] data = dataOut.data_pre[0] absc = dataOut.abscissaList[:-1] noise = dataOut.noise @@ -1215,10 +1236,11 @@ class SpectralMoments(Operation): data_param[ind,:,:] = self.__calculateMoments( data[ind,:,:] , absc , noise[ind] ) dataOut.moments = data_param[:,1:,:] - dataOut.data_SNR = data_param[:,0] - dataOut.data_POW = data_param[:,1] - dataOut.data_DOP = data_param[:,2] - dataOut.data_WIDTH = data_param[:,3] + dataOut.data_snr = data_param[:,0] + dataOut.data_pow = data_param[:,1] + dataOut.data_dop = data_param[:,2] + dataOut.data_width = data_param[:,3] + return dataOut def __calculateMoments(self, oldspec, oldfreq, n0, @@ -1245,25 +1267,27 @@ class SpectralMoments(Operation): vec_w = numpy.zeros(oldspec.shape[1]) vec_snr = numpy.zeros(oldspec.shape[1]) - oldspec = numpy.ma.masked_invalid(oldspec) + # oldspec = numpy.ma.masked_invalid(oldspec) for ind in range(oldspec.shape[1]): spec = oldspec[:,ind] aux = spec*fwindow max_spec = aux.max() - m = list(aux).index(max_spec) + m = aux.tolist().index(max_spec) - #Smooth - if (smooth == 0): spec2 = spec - else: spec2 = scipy.ndimage.filters.uniform_filter1d(spec,size=smooth) + # Smooth + if (smooth == 0): + spec2 = spec + else: + spec2 = scipy.ndimage.filters.uniform_filter1d(spec,size=smooth) - # Calculo de Momentos - bb = spec2[list(range(m,spec2.size))] + # Moments Estimation + bb = spec2[numpy.arange(m,spec2.size)] bb = (bb m): ss1 = m + if (ss1 > m): + ss1 = m - valid = numpy.asarray(list(range(int(m + bb0 - ss1 + 1)))) + ss1 - power = ((spec2[valid] - n0)*fwindow[valid]).sum() - fd = ((spec2[valid]- n0)*freq[valid]*fwindow[valid]).sum()/power - w = math.sqrt(((spec2[valid] - n0)*fwindow[valid]*(freq[valid]- fd)**2).sum()/power) - snr = (spec2.mean()-n0)/n0 + valid = numpy.arange(int(m + bb0 - ss1 + 1)) + ss1 + signal_power = ((spec2[valid] - n0) * fwindow[valid]).mean() # D. Scipión added with correct definition + total_power = (spec2[valid] * fwindow[valid]).mean() # D. Scipión added with correct definition + power = ((spec2[valid] - n0) * fwindow[valid]).sum() + fd = ((spec2[valid]- n0)*freq[valid] * fwindow[valid]).sum() / power + w = numpy.sqrt(((spec2[valid] - n0)*fwindow[valid]*(freq[valid]- fd)**2).sum() / power) + snr = (spec2.mean()-n0)/n0 if (snr < 1.e-20) : snr = 1.e-20 - vec_power[ind] = power + # vec_power[ind] = power #D. Scipión replaced with the line below + vec_power[ind] = total_power vec_fd[ind] = fd vec_w[ind] = w vec_snr[ind] = snr - moments = numpy.vstack((vec_snr, vec_power, vec_fd, vec_w)) - return moments + return numpy.vstack((vec_snr, vec_power, vec_fd, vec_w)) #------------------ Get SA Parameters -------------------------- @@ -1337,7 +1366,7 @@ class SALags(Operation): self.dataOut.abscissaList self.dataOut.noise self.dataOut.normFactor - self.dataOut.data_SNR + self.dataOut.data_snr self.dataOut.groupList self.dataOut.nChannels @@ -1356,7 +1385,7 @@ class SALags(Operation): nHeights = dataOut.nHeights absc = dataOut.abscissaList noise = dataOut.noise - SNR = dataOut.data_SNR + SNR = dataOut.data_snr nChannels = dataOut.nChannels # pairsList = dataOut.groupList # pairsAutoCorr, pairsCrossCorr = self.__getPairsAutoCorr(pairsList, nChannels) @@ -1471,7 +1500,7 @@ class SpectralFitting(Operation): listChannels = groupArray.reshape((groupArray.size)) listChannels.sort() noise = self.dataIn.getNoise() - self.dataOut.data_SNR = self.__getSNR(self.dataIn.data_spc[listChannels,:,:], noise[listChannels]) + self.dataOut.data_snr = self.__getSNR(self.dataIn.data_spc[listChannels,:,:], noise[listChannels]) for i in range(nGroups): coord = groupArray[i,:] @@ -2124,7 +2153,7 @@ class WindProfiler(Operation): absc = dataOut.abscissaList[:-1] # noise = dataOut.noise heightList = dataOut.heightList - SNR = dataOut.data_SNR + SNR = dataOut.data_snr if technique == 'DBS': @@ -2132,7 +2161,7 @@ class WindProfiler(Operation): kwargs['heightList'] = heightList kwargs['SNR'] = SNR - dataOut.data_output, dataOut.heightList, dataOut.data_SNR = self.techniqueDBS(kwargs) #DBS Function + dataOut.data_output, dataOut.heightList, dataOut.data_snr = self.techniqueDBS(kwargs) #DBS Function dataOut.utctimeInit = dataOut.utctime dataOut.outputInterval = dataOut.paramInterval @@ -2326,7 +2355,7 @@ class EWDriftsEstimation(Operation): def run(self, dataOut, zenith, zenithCorrection): heiRang = dataOut.heightList velRadial = dataOut.data_param[:,3,:] - SNR = dataOut.data_SNR + SNR = dataOut.data_snr zenith = numpy.array(zenith) zenith -= zenithCorrection @@ -2347,7 +2376,7 @@ class EWDriftsEstimation(Operation): dataOut.heightList = heiRang1 dataOut.data_output = winds - dataOut.data_SNR = SNR1 + dataOut.data_snr = SNR1 dataOut.utctimeInit = dataOut.utctime dataOut.outputInterval = dataOut.timeInterval @@ -2628,7 +2657,7 @@ class SMDetection(Operation): channelPositions = [(4.5,2), (2,4.5), (2,2), (2,0), (0,2)] #Estrella meteorOps = SMOperations() pairslist0, distances = meteorOps.getPhasePairs(channelPositions) - heiRang = dataOut.getHeiRange() + heiRang = dataOut.heightList #Get Beacon signal - No Beacon signal anymore # newheis = numpy.where(self.dataOut.heightList>self.dataOut.radarControllerHeaderObj.Taus[tauindex]) # @@ -2690,7 +2719,7 @@ class SMDetection(Operation): #************** REMOVE MULTIPLE DETECTIONS (3.5) *************************** #Parameters - heiRange = dataOut.getHeiRange() + heiRange = dataOut.heightList rangeInterval = heiRange[1] - heiRange[0] rangeLimit = multDet_rangeLimit/rangeInterval timeLimit = multDet_timeLimit/dataOut.timeInterval diff --git a/schainpy/model/proc/jroproc_spectra.py b/schainpy/model/proc/jroproc_spectra.py index 9b21136..192cafa 100644 --- a/schainpy/model/proc/jroproc_spectra.py +++ b/schainpy/model/proc/jroproc_spectra.py @@ -1,3 +1,14 @@ +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""Spectra processing Unit and operations + +Here you will find the processing unit `SpectraProc` and several operations +to work with Spectra data type +""" + +import time import itertools import numpy @@ -7,9 +18,8 @@ from schainpy.model.data.jrodata import Spectra from schainpy.model.data.jrodata import hildebrand_sekhon from schainpy.utils import log -@MPDecorator -class SpectraProc(ProcessingUnit): +class SpectraProc(ProcessingUnit): def __init__(self): @@ -38,31 +48,19 @@ class SpectraProc(ProcessingUnit): self.dataOut.channelList = self.dataIn.channelList self.dataOut.heightList = self.dataIn.heightList self.dataOut.dtype = numpy.dtype([('real', ' maxHei): - raise ValueError("Error selecting heights: Height range (%d,%d) is not valid" % (minHei, maxHei)) - - if (minHei < self.dataOut.heightList[0]): - minHei = self.dataOut.heightList[0] - - if (maxHei > self.dataOut.heightList[-1]): - maxHei = self.dataOut.heightList[-1] - - minIndex = 0 - maxIndex = 0 - heights = self.dataOut.heightList - - inda = numpy.where(heights >= minHei) - indb = numpy.where(heights <= maxHei) - - try: - minIndex = inda[0][0] - except: - minIndex = 0 - - try: - maxIndex = indb[0][-1] - except: - maxIndex = len(heights) - - self.selectHeightsByIndex(minIndex, maxIndex) - - - return 1 - def getBeaconSignal(self, tauindex=0, channelindex=0, hei_ref=None): newheis = numpy.where( self.dataOut.heightList > self.dataOut.radarControllerHeaderObj.Taus[tauindex]) @@ -466,54 +325,100 @@ class SpectraProc(ProcessingUnit): return 1 + def getNoise(self, minHei=None, maxHei=None, minVel=None, maxVel=None): + # validacion de rango + if minHei == None: + minHei = self.dataOut.heightList[0] + if maxHei == None: + maxHei = self.dataOut.heightList[-1] - def selectHeightsByIndex(self, minIndex, maxIndex): - """ - Selecciona un bloque de datos en base a un grupo indices de alturas segun el rango - minIndex <= index <= maxIndex + if (minHei < self.dataOut.heightList[0]) or (minHei > maxHei): + print('minHei: %.2f is out of the heights range' % (minHei)) + print('minHei is setting to %.2f' % (self.dataOut.heightList[0])) + minHei = self.dataOut.heightList[0] - Input: - minIndex : valor de indice minimo de altura a considerar - maxIndex : valor de indice maximo de altura a considerar + if (maxHei > self.dataOut.heightList[-1]) or (maxHei < minHei): + print('maxHei: %.2f is out of the heights range' % (maxHei)) + print('maxHei is setting to %.2f' % (self.dataOut.heightList[-1])) + maxHei = self.dataOut.heightList[-1] - Affected: - self.dataOut.data_spc - self.dataOut.data_cspc - self.dataOut.data_dc - self.dataOut.heightList + # validacion de velocidades + velrange = self.dataOut.getVelRange(1) - Return: - 1 si el metodo se ejecuto con exito caso contrario devuelve 0 - """ + if minVel == None: + minVel = velrange[0] + + if maxVel == None: + maxVel = velrange[-1] + + if (minVel < velrange[0]) or (minVel > maxVel): + print('minVel: %.2f is out of the velocity range' % (minVel)) + print('minVel is setting to %.2f' % (velrange[0])) + minVel = velrange[0] + + if (maxVel > velrange[-1]) or (maxVel < minVel): + print('maxVel: %.2f is out of the velocity range' % (maxVel)) + print('maxVel is setting to %.2f' % (velrange[-1])) + maxVel = velrange[-1] + + # seleccion de indices para rango + minIndex = 0 + maxIndex = 0 + heights = self.dataOut.heightList + + inda = numpy.where(heights >= minHei) + indb = numpy.where(heights <= maxHei) + + try: + minIndex = inda[0][0] + except: + minIndex = 0 + + try: + maxIndex = indb[0][-1] + except: + maxIndex = len(heights) if (minIndex < 0) or (minIndex > maxIndex): - raise ValueError("Error selecting heights: Index range (%d,%d) is not valid" % ( + raise ValueError("some value in (%d,%d) is not valid" % ( minIndex, maxIndex)) if (maxIndex >= self.dataOut.nHeights): maxIndex = self.dataOut.nHeights - 1 - # Spectra - data_spc = self.dataOut.data_spc[:, :, minIndex:maxIndex + 1] + # seleccion de indices para velocidades + indminvel = numpy.where(velrange >= minVel) + indmaxvel = numpy.where(velrange <= maxVel) + try: + minIndexVel = indminvel[0][0] + except: + minIndexVel = 0 - data_cspc = None - if self.dataOut.data_cspc is not None: - data_cspc = self.dataOut.data_cspc[:, :, minIndex:maxIndex + 1] + try: + maxIndexVel = indmaxvel[0][-1] + except: + maxIndexVel = len(velrange) - data_dc = None - if self.dataOut.data_dc is not None: - data_dc = self.dataOut.data_dc[:, minIndex:maxIndex + 1] + # seleccion del espectro + data_spc = self.dataOut.data_spc[:, + minIndexVel:maxIndexVel + 1, minIndex:maxIndex + 1] + # estimacion de ruido + noise = numpy.zeros(self.dataOut.nChannels) - self.dataOut.data_spc = data_spc - self.dataOut.data_cspc = data_cspc - self.dataOut.data_dc = data_dc + for channel in range(self.dataOut.nChannels): + daux = data_spc[channel, :, :] + sortdata = numpy.sort(daux, axis=None) + noise[channel] = hildebrand_sekhon(sortdata, self.dataOut.nIncohInt) - self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex + 1] + self.dataOut.noise_estimation = noise.copy() return 1 - def removeDC(self, mode=2): +class removeDC(Operation): + + def run(self, dataOut, mode=2): + self.dataOut = dataOut jspectra = self.dataOut.data_spc jcspectra = self.dataOut.data_cspc @@ -571,7 +476,9 @@ class SpectraProc(ProcessingUnit): self.dataOut.data_spc = jspectra self.dataOut.data_cspc = jcspectra - return 1 + return self.dataOut + +class removeInterference(Operation): def removeInterference2(self): @@ -594,11 +501,9 @@ class SpectraProc(ProcessingUnit): if len(InterferenceRange) maxHei): - print('minHei: %.2f is out of the heights range' % (minHei)) - print('minHei is setting to %.2f' % (self.dataOut.heightList[0])) - minHei = self.dataOut.heightList[0] - - if (maxHei > self.dataOut.heightList[-1]) or (maxHei < minHei): - print('maxHei: %.2f is out of the heights range' % (maxHei)) - print('maxHei is setting to %.2f' % (self.dataOut.heightList[-1])) - maxHei = self.dataOut.heightList[-1] - - # validacion de velocidades - velrange = self.dataOut.getVelRange(1) - - if minVel == None: - minVel = velrange[0] - - if maxVel == None: - maxVel = velrange[-1] - - if (minVel < velrange[0]) or (minVel > maxVel): - print('minVel: %.2f is out of the velocity range' % (minVel)) - print('minVel is setting to %.2f' % (velrange[0])) - minVel = velrange[0] - - if (maxVel > velrange[-1]) or (maxVel < minVel): - print('maxVel: %.2f is out of the velocity range' % (maxVel)) - print('maxVel is setting to %.2f' % (velrange[-1])) - maxVel = velrange[-1] + def run(self, dataOut, interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None, mode=1): - # seleccion de indices para rango - minIndex = 0 - maxIndex = 0 - heights = self.dataOut.heightList - - inda = numpy.where(heights >= minHei) - indb = numpy.where(heights <= maxHei) - - try: - minIndex = inda[0][0] - except: - minIndex = 0 - - try: - maxIndex = indb[0][-1] - except: - maxIndex = len(heights) + self.dataOut = dataOut - if (minIndex < 0) or (minIndex > maxIndex): - raise ValueError("some value in (%d,%d) is not valid" % ( - minIndex, maxIndex)) - - if (maxIndex >= self.dataOut.nHeights): - maxIndex = self.dataOut.nHeights - 1 - - # seleccion de indices para velocidades - indminvel = numpy.where(velrange >= minVel) - indmaxvel = numpy.where(velrange <= maxVel) - try: - minIndexVel = indminvel[0][0] - except: - minIndexVel = 0 - - try: - maxIndexVel = indmaxvel[0][-1] - except: - maxIndexVel = len(velrange) - - # seleccion del espectro - data_spc = self.dataOut.data_spc[:, - minIndexVel:maxIndexVel + 1, minIndex:maxIndex + 1] - # estimacion de ruido - noise = numpy.zeros(self.dataOut.nChannels) - - for channel in range(self.dataOut.nChannels): - daux = data_spc[channel, :, :] - noise[channel] = hildebrand_sekhon(daux, self.dataOut.nIncohInt) - - self.dataOut.noise_estimation = noise.copy() + if mode == 1: + self.removeInterference(interf = 2,hei_interf = None, nhei_interf = None, offhei_interf = None) + elif mode == 2: + self.removeInterference2() - return 1 + return self.dataOut class IncohInt(Operation): @@ -1031,7 +851,7 @@ class IncohInt(Operation): def run(self, dataOut, n=None, timeInterval=None, overlapping=False): if n == 1: - return + return dataOut dataOut.flagNoData = True @@ -1054,3 +874,25 @@ class IncohInt(Operation): dataOut.flagNoData = False return dataOut + +class dopplerFlip(Operation): + + def run(self, dataOut): + # arreglo 1: (num_chan, num_profiles, num_heights) + self.dataOut = dataOut + # JULIA-oblicua, indice 2 + # arreglo 2: (num_profiles, num_heights) + jspectra = self.dataOut.data_spc[2] + jspectra_tmp = numpy.zeros(jspectra.shape) + num_profiles = jspectra.shape[0] + freq_dc = int(num_profiles / 2) + # Flip con for + for j in range(num_profiles): + jspectra_tmp[num_profiles-j-1]= jspectra[j] + # Intercambio perfil de DC con perfil inmediato anterior + jspectra_tmp[freq_dc-1]= jspectra[freq_dc-1] + jspectra_tmp[freq_dc]= jspectra[freq_dc] + # canal modificado es re-escrito en el arreglo de canales + self.dataOut.data_spc[2] = jspectra_tmp + + return self.dataOut diff --git a/schainpy/model/proc/jroproc_voltage.py b/schainpy/model/proc/jroproc_voltage.py index b7d0734..8723805 100644 --- a/schainpy/model/proc/jroproc_voltage.py +++ b/schainpy/model/proc/jroproc_voltage.py @@ -1,13 +1,13 @@ import sys -import numpy +import numpy,math from scipy import interpolate from schainpy.model.proc.jroproc_base import ProcessingUnit, Operation, MPDecorator -from schainpy.model.data.jrodata import Voltage +from schainpy.model.data.jrodata import Voltage,hildebrand_sekhon from schainpy.utils import log from time import time -@MPDecorator + class VoltageProc(ProcessingUnit): def __init__(self): @@ -26,8 +26,6 @@ class VoltageProc(ProcessingUnit): if self.dataIn.type == 'Voltage': self.dataOut.copy(self.dataIn) - # self.dataOut.copy(self.dataIn) - def __updateObjFromAmisrInput(self): self.dataOut.timeZone = self.dataIn.timeZone @@ -53,32 +51,22 @@ class VoltageProc(ProcessingUnit): self.dataOut.beam.codeList = self.dataIn.beam.codeList self.dataOut.beam.azimuthList = self.dataIn.beam.azimuthList self.dataOut.beam.zenithList = self.dataIn.beam.zenithList - # - # pass# - # - # def init(self): - # - # - # if self.dataIn.type == 'AMISR': - # self.__updateObjFromAmisrInput() - # - # if self.dataIn.type == 'Voltage': - # self.dataOut.copy(self.dataIn) - # # No necesita copiar en cada init() los atributos de dataIn - # # la copia deberia hacerse por cada nuevo bloque de datos - - def selectChannels(self, channelList): - channelIndexList = [] +class selectChannels(Operation): + + def run(self, dataOut, channelList): + + channelIndexList = [] + self.dataOut = dataOut for channel in channelList: if channel not in self.dataOut.channelList: raise ValueError("Channel %d is not in %s" %(channel, str(self.dataOut.channelList))) index = self.dataOut.channelList.index(channel) channelIndexList.append(index) - self.selectChannelsByIndex(channelIndexList) + return self.dataOut def selectChannelsByIndex(self, channelIndexList): """ @@ -101,24 +89,64 @@ class VoltageProc(ProcessingUnit): for channelIndex in channelIndexList: if channelIndex not in self.dataOut.channelIndexList: - print(channelIndexList) raise ValueError("The value %d in channelIndexList is not valid" %channelIndex) - if self.dataOut.flagDataAsBlock: - """ - Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] - """ - data = self.dataOut.data[channelIndexList,:,:] - else: - data = self.dataOut.data[channelIndexList,:] + if self.dataOut.type == 'Voltage': + if self.dataOut.flagDataAsBlock: + """ + Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] + """ + data = self.dataOut.data[channelIndexList,:,:] + else: + data = self.dataOut.data[channelIndexList,:] + + self.dataOut.data = data + # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList] + self.dataOut.channelList = range(len(channelIndexList)) - self.dataOut.data = data - # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList] - self.dataOut.channelList = range(len(channelIndexList)) + elif self.dataOut.type == 'Spectra': + data_spc = self.dataOut.data_spc[channelIndexList, :] + data_dc = self.dataOut.data_dc[channelIndexList, :] + + self.dataOut.data_spc = data_spc + self.dataOut.data_dc = data_dc + + # self.dataOut.channelList = [self.dataOut.channelList[i] for i in channelIndexList] + self.dataOut.channelList = range(len(channelIndexList)) + self.__selectPairsByChannel(channelIndexList) return 1 - def selectHeights(self, minHei=None, maxHei=None): + def __selectPairsByChannel(self, channelList=None): + + if channelList == None: + return + + pairsIndexListSelected = [] + for pairIndex in self.dataOut.pairsIndexList: + # First pair + if self.dataOut.pairsList[pairIndex][0] not in channelList: + continue + # Second pair + if self.dataOut.pairsList[pairIndex][1] not in channelList: + continue + + pairsIndexListSelected.append(pairIndex) + + if not pairsIndexListSelected: + self.dataOut.data_cspc = None + self.dataOut.pairsList = [] + return + + self.dataOut.data_cspc = self.dataOut.data_cspc[pairsIndexListSelected] + self.dataOut.pairsList = [self.dataOut.pairsList[i] + for i in pairsIndexListSelected] + + return + +class selectHeights(Operation): + + def run(self, dataOut, minHei=None, maxHei=None, minIndex=None, maxIndex=None): """ Selecciona un bloque de datos en base a un grupo de valores de alturas segun el rango minHei <= height <= maxHei @@ -134,39 +162,36 @@ class VoltageProc(ProcessingUnit): 1 si el metodo se ejecuto con exito caso contrario devuelve 0 """ - if minHei == None: - minHei = self.dataOut.heightList[0] + self.dataOut = dataOut - if maxHei == None: - maxHei = self.dataOut.heightList[-1] + if minHei and maxHei: - if (minHei < self.dataOut.heightList[0]): - minHei = self.dataOut.heightList[0] + if (minHei < self.dataOut.heightList[0]): + minHei = self.dataOut.heightList[0] - if (maxHei > self.dataOut.heightList[-1]): - maxHei = self.dataOut.heightList[-1] + if (maxHei > self.dataOut.heightList[-1]): + maxHei = self.dataOut.heightList[-1] - minIndex = 0 - maxIndex = 0 - heights = self.dataOut.heightList + minIndex = 0 + maxIndex = 0 + heights = self.dataOut.heightList - inda = numpy.where(heights >= minHei) - indb = numpy.where(heights <= maxHei) + inda = numpy.where(heights >= minHei) + indb = numpy.where(heights <= maxHei) - try: - minIndex = inda[0][0] - except: - minIndex = 0 + try: + minIndex = inda[0][0] + except: + minIndex = 0 - try: - maxIndex = indb[0][-1] - except: - maxIndex = len(heights) + try: + maxIndex = indb[0][-1] + except: + maxIndex = len(heights) self.selectHeightsByIndex(minIndex, maxIndex) - return 1 - + return self.dataOut def selectHeightsByIndex(self, minIndex, maxIndex): """ @@ -185,81 +210,118 @@ class VoltageProc(ProcessingUnit): 1 si el metodo se ejecuto con exito caso contrario devuelve 0 """ - if (minIndex < 0) or (minIndex > maxIndex): - raise ValueError("Height index range (%d,%d) is not valid" % (minIndex, maxIndex)) + if self.dataOut.type == 'Voltage': + if (minIndex < 0) or (minIndex > maxIndex): + raise ValueError("Height index range (%d,%d) is not valid" % (minIndex, maxIndex)) - if (maxIndex >= self.dataOut.nHeights): - maxIndex = self.dataOut.nHeights + if (maxIndex >= self.dataOut.nHeights): + maxIndex = self.dataOut.nHeights - #voltage - if self.dataOut.flagDataAsBlock: - """ - Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] - """ - data = self.dataOut.data[:,:, minIndex:maxIndex] - else: - data = self.dataOut.data[:, minIndex:maxIndex] + #voltage + if self.dataOut.flagDataAsBlock: + """ + Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] + """ + data = self.dataOut.data[:,:, minIndex:maxIndex] + else: + data = self.dataOut.data[:, minIndex:maxIndex] + + # firstHeight = self.dataOut.heightList[minIndex] + + self.dataOut.data = data + self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex] + + if self.dataOut.nHeights <= 1: + raise ValueError("selectHeights: Too few heights. Current number of heights is %d" %(self.dataOut.nHeights)) + elif self.dataOut.type == 'Spectra': + if (minIndex < 0) or (minIndex > maxIndex): + raise ValueError("Error selecting heights: Index range (%d,%d) is not valid" % ( + minIndex, maxIndex)) + + if (maxIndex >= self.dataOut.nHeights): + maxIndex = self.dataOut.nHeights - 1 - # firstHeight = self.dataOut.heightList[minIndex] + # Spectra + data_spc = self.dataOut.data_spc[:, :, minIndex:maxIndex + 1] - self.dataOut.data = data - self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex] + data_cspc = None + if self.dataOut.data_cspc is not None: + data_cspc = self.dataOut.data_cspc[:, :, minIndex:maxIndex + 1] - if self.dataOut.nHeights <= 1: - raise ValueError("selectHeights: Too few heights. Current number of heights is %d" %(self.dataOut.nHeights)) + data_dc = None + if self.dataOut.data_dc is not None: + data_dc = self.dataOut.data_dc[:, minIndex:maxIndex + 1] + + self.dataOut.data_spc = data_spc + self.dataOut.data_cspc = data_cspc + self.dataOut.data_dc = data_dc + + self.dataOut.heightList = self.dataOut.heightList[minIndex:maxIndex + 1] return 1 - def filterByHeights(self, window): +class filterByHeights(Operation): - deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0] + def run(self, dataOut, window): + + deltaHeight = dataOut.heightList[1] - dataOut.heightList[0] if window == None: - window = (self.dataOut.radarControllerHeaderObj.txA/self.dataOut.radarControllerHeaderObj.nBaud) / deltaHeight + window = (dataOut.radarControllerHeaderObj.txA/dataOut.radarControllerHeaderObj.nBaud) / deltaHeight newdelta = deltaHeight * window - r = self.dataOut.nHeights % window - newheights = (self.dataOut.nHeights-r)/window + r = dataOut.nHeights % window + newheights = (dataOut.nHeights-r)/window if newheights <= 1: - raise ValueError("filterByHeights: Too few heights. Current number of heights is %d and window is %d" %(self.dataOut.nHeights, window)) + raise ValueError("filterByHeights: Too few heights. Current number of heights is %d and window is %d" %(dataOut.nHeights, window)) - if self.dataOut.flagDataAsBlock: + if dataOut.flagDataAsBlock: """ Si la data es obtenida por bloques, dimension = [nChannels, nProfiles, nHeis] """ - buffer = self.dataOut.data[:, :, 0:int(self.dataOut.nHeights-r)] - buffer = buffer.reshape(self.dataOut.nChannels, self.dataOut.nProfiles, int(self.dataOut.nHeights/window), window) + buffer = dataOut.data[:, :, 0:int(dataOut.nHeights-r)] + buffer = buffer.reshape(dataOut.nChannels, dataOut.nProfiles, int(dataOut.nHeights/window), window) buffer = numpy.sum(buffer,3) else: - buffer = self.dataOut.data[:,0:int(self.dataOut.nHeights-r)] - buffer = buffer.reshape(self.dataOut.nChannels,int(self.dataOut.nHeights/window),int(window)) + buffer = dataOut.data[:,0:int(dataOut.nHeights-r)] + buffer = buffer.reshape(dataOut.nChannels,int(dataOut.nHeights/window),int(window)) buffer = numpy.sum(buffer,2) - self.dataOut.data = buffer - self.dataOut.heightList = self.dataOut.heightList[0] + numpy.arange( newheights )*newdelta - self.dataOut.windowOfFilter = window + dataOut.data = buffer + dataOut.heightList = dataOut.heightList[0] + numpy.arange( newheights )*newdelta + dataOut.windowOfFilter = window + + return dataOut - def setH0(self, h0, deltaHeight = None): + +class setH0(Operation): + + def run(self, dataOut, h0, deltaHeight = None): if not deltaHeight: - deltaHeight = self.dataOut.heightList[1] - self.dataOut.heightList[0] + deltaHeight = dataOut.heightList[1] - dataOut.heightList[0] - nHeights = self.dataOut.nHeights + nHeights = dataOut.nHeights newHeiRange = h0 + numpy.arange(nHeights)*deltaHeight - self.dataOut.heightList = newHeiRange + dataOut.heightList = newHeiRange + + return dataOut + + +class deFlip(Operation): - def deFlip(self, channelList = []): + def run(self, dataOut, channelList = []): - data = self.dataOut.data.copy() + data = dataOut.data.copy() - if self.dataOut.flagDataAsBlock: + if dataOut.flagDataAsBlock: flip = self.flip - profileList = list(range(self.dataOut.nProfiles)) + profileList = list(range(dataOut.nProfiles)) if not channelList: for thisProfile in profileList: @@ -267,7 +329,7 @@ class VoltageProc(ProcessingUnit): flip *= -1.0 else: for thisChannel in channelList: - if thisChannel not in self.dataOut.channelList: + if thisChannel not in dataOut.channelList: continue for thisProfile in profileList: @@ -281,41 +343,76 @@ class VoltageProc(ProcessingUnit): data[:,:] = data[:,:]*self.flip else: for thisChannel in channelList: - if thisChannel not in self.dataOut.channelList: + if thisChannel not in dataOut.channelList: continue data[thisChannel,:] = data[thisChannel,:]*self.flip self.flip *= -1. - self.dataOut.data = data + dataOut.data = data + + return dataOut - def setRadarFrequency(self, frequency=None): - if frequency != None: - self.dataOut.frequency = frequency +class setAttribute(Operation): + ''' + Set an arbitrary attribute(s) to dataOut + ''' - return 1 + def __init__(self): + + Operation.__init__(self) + self._ready = False + + def run(self, dataOut, **kwargs): + + for key, value in kwargs.items(): + setattr(dataOut, key, value) + + return dataOut + + +@MPDecorator +class printAttribute(Operation): + ''' + Print an arbitrary attribute of dataOut + ''' - def interpolateHeights(self, topLim, botLim): + def __init__(self): + + Operation.__init__(self) + + def run(self, dataOut, attributes): + + if isinstance(attributes, str): + attributes = [attributes] + for attr in attributes: + if hasattr(dataOut, attr): + log.log(getattr(dataOut, attr), attr) + + +class interpolateHeights(Operation): + + def run(self, dataOut, topLim, botLim): #69 al 72 para julia #82-84 para meteoros - if len(numpy.shape(self.dataOut.data))==2: - sampInterp = (self.dataOut.data[:,botLim-1] + self.dataOut.data[:,topLim+1])/2 + if len(numpy.shape(dataOut.data))==2: + sampInterp = (dataOut.data[:,botLim-1] + dataOut.data[:,topLim+1])/2 sampInterp = numpy.transpose(numpy.tile(sampInterp,(topLim-botLim + 1,1))) - #self.dataOut.data[:,botLim:limSup+1] = sampInterp - self.dataOut.data[:,botLim:topLim+1] = sampInterp + #dataOut.data[:,botLim:limSup+1] = sampInterp + dataOut.data[:,botLim:topLim+1] = sampInterp else: - nHeights = self.dataOut.data.shape[2] + nHeights = dataOut.data.shape[2] x = numpy.hstack((numpy.arange(botLim),numpy.arange(topLim+1,nHeights))) - y = self.dataOut.data[:,:,list(range(botLim))+list(range(topLim+1,nHeights))] + y = dataOut.data[:,:,list(range(botLim))+list(range(topLim+1,nHeights))] f = interpolate.interp1d(x, y, axis = 2) xnew = numpy.arange(botLim,topLim+1) ynew = f(xnew) + dataOut.data[:,:,botLim:topLim+1] = ynew - self.dataOut.data[:,:,botLim:topLim+1] = ynew + return dataOut - # import collections class CohInt(Operation): @@ -336,8 +433,6 @@ class CohInt(Operation): Operation.__init__(self, **kwargs) - # self.isConfig = False - def setup(self, n=None, timeInterval=None, stride=None, overlapping=False, byblock=False): """ Set the parameters of the integration class. @@ -571,7 +666,9 @@ class CohInt(Operation): if self.__dataReady: dataOut.data = avgdata - dataOut.nCohInt *= self.n + if not dataOut.flagCohInt: + dataOut.nCohInt *= self.n + dataOut.flagCohInt = True dataOut.utctime = avgdatatime # print avgdata, avgdatatime # raise @@ -620,7 +717,7 @@ class Decoder(Operation): #Frequency __codeBuffer = numpy.zeros((self.nCode, self.__nHeis), dtype=numpy.complex) - + __codeBuffer[:,0:self.nBaud] = self.code self.fft_code = numpy.conj(numpy.fft.fft(__codeBuffer, axis=1)) @@ -978,8 +1075,6 @@ class ProfileSelector(Operation): raise ValueError("ProfileSelector needs profileList, profileRangeList or rangeList parameter") - #return False - return dataOut class Reshaper(Operation): @@ -1190,6 +1285,208 @@ class CombineProfiles(Operation): dataOut.ippSeconds *= n return dataOut + +class PulsePairVoltage(Operation): + ''' + Function PulsePair(Signal Power, Velocity) + The real component of Lag[0] provides Intensity Information + The imag component of Lag[1] Phase provides Velocity Information + + Configuration Parameters: + nPRF = Number of Several PRF + theta = Degree Azimuth angel Boundaries + + Input: + self.dataOut + lag[N] + Affected: + self.dataOut.spc + ''' + isConfig = False + __profIndex = 0 + __initime = None + __lastdatatime = None + __buffer = None + noise = None + __dataReady = False + n = None + __nch = 0 + __nHeis = 0 + removeDC = False + ipp = None + lambda_ = 0 + + def __init__(self,**kwargs): + Operation.__init__(self,**kwargs) + + def setup(self, dataOut, n = None, removeDC=False): + ''' + n= Numero de PRF's de entrada + ''' + self.__initime = None + self.__lastdatatime = 0 + self.__dataReady = False + self.__buffer = 0 + self.__profIndex = 0 + self.noise = None + self.__nch = dataOut.nChannels + self.__nHeis = dataOut.nHeights + self.removeDC = removeDC + self.lambda_ = 3.0e8/(9345.0e6) + self.ippSec = dataOut.ippSeconds + self.nCohInt = dataOut.nCohInt + print("IPPseconds",dataOut.ippSeconds) + + print("ELVALOR DE n es:", n) + if n == None: + raise ValueError("n should be specified.") + + if n != None: + if n<2: + raise ValueError("n should be greater than 2") + + self.n = n + self.__nProf = n + + self.__buffer = numpy.zeros((dataOut.nChannels, + n, + dataOut.nHeights), + dtype='complex') + + def putData(self,data): + ''' + Add a profile to he __buffer and increase in one the __profiel Index + ''' + self.__buffer[:,self.__profIndex,:]= data + self.__profIndex += 1 + return + + def pushData(self,dataOut): + ''' + Return the PULSEPAIR and the profiles used in the operation + Affected : self.__profileIndex + ''' + #----------------- Remove DC----------------------------------- + if self.removeDC==True: + mean = numpy.mean(self.__buffer,1) + tmp = mean.reshape(self.__nch,1,self.__nHeis) + dc= numpy.tile(tmp,[1,self.__nProf,1]) + self.__buffer = self.__buffer - dc + #------------------Calculo de Potencia ------------------------ + pair0 = self.__buffer*numpy.conj(self.__buffer) + pair0 = pair0.real + lag_0 = numpy.sum(pair0,1) + #------------------Calculo de Ruido x canal-------------------- + self.noise = numpy.zeros(self.__nch) + for i in range(self.__nch): + daux = numpy.sort(pair0[i,:,:],axis= None) + self.noise[i]=hildebrand_sekhon( daux ,self.nCohInt) + + self.noise = self.noise.reshape(self.__nch,1) + self.noise = numpy.tile(self.noise,[1,self.__nHeis]) + noise_buffer = self.noise.reshape(self.__nch,1,self.__nHeis) + noise_buffer = numpy.tile(noise_buffer,[1,self.__nProf,1]) + #------------------ Potencia recibida= P , Potencia senal = S , Ruido= N-- + #------------------ P= S+N ,P=lag_0/N --------------------------------- + #-------------------- Power -------------------------------------------------- + data_power = lag_0/(self.n*self.nCohInt) + #------------------ Senal --------------------------------------------------- + data_intensity = pair0 - noise_buffer + data_intensity = numpy.sum(data_intensity,axis=1)*(self.n*self.nCohInt)#*self.nCohInt) + #data_intensity = (lag_0-self.noise*self.n)*(self.n*self.nCohInt) + for i in range(self.__nch): + for j in range(self.__nHeis): + if data_intensity[i][j] < 0: + data_intensity[i][j] = numpy.min(numpy.absolute(data_intensity[i][j])) + + #----------------- Calculo de Frecuencia y Velocidad doppler-------- + pair1 = self.__buffer[:,:-1,:]*numpy.conjugate(self.__buffer[:,1:,:]) + lag_1 = numpy.sum(pair1,1) + data_freq = (-1/(2.0*math.pi*self.ippSec*self.nCohInt))*numpy.angle(lag_1) + data_velocity = (self.lambda_/2.0)*data_freq + + #---------------- Potencia promedio estimada de la Senal----------- + lag_0 = lag_0/self.n + S = lag_0-self.noise + + #---------------- Frecuencia Doppler promedio --------------------- + lag_1 = lag_1/(self.n-1) + R1 = numpy.abs(lag_1) + + #---------------- Calculo del SNR---------------------------------- + data_snrPP = S/self.noise + for i in range(self.__nch): + for j in range(self.__nHeis): + if data_snrPP[i][j] < 1.e-20: + data_snrPP[i][j] = 1.e-20 + + #----------------- Calculo del ancho espectral ---------------------- + L = S/R1 + L = numpy.where(L<0,1,L) + L = numpy.log(L) + tmp = numpy.sqrt(numpy.absolute(L)) + data_specwidth = (self.lambda_/(2*math.sqrt(2)*math.pi*self.ippSec*self.nCohInt))*tmp*numpy.sign(L) + n = self.__profIndex + + self.__buffer = numpy.zeros((self.__nch, self.__nProf,self.__nHeis), dtype='complex') + self.__profIndex = 0 + return data_power,data_intensity,data_velocity,data_snrPP,data_specwidth,n + + + def pulsePairbyProfiles(self,dataOut): + + self.__dataReady = False + data_power = None + data_intensity = None + data_velocity = None + data_specwidth = None + data_snrPP = None + self.putData(data=dataOut.data) + if self.__profIndex == self.n: + data_power,data_intensity, data_velocity,data_snrPP,data_specwidth, n = self.pushData(dataOut=dataOut) + self.__dataReady = True + + return data_power, data_intensity, data_velocity, data_snrPP, data_specwidth + + + def pulsePairOp(self, dataOut, datatime= None): + + if self.__initime == None: + self.__initime = datatime + data_power, data_intensity, data_velocity, data_snrPP, data_specwidth = self.pulsePairbyProfiles(dataOut) + self.__lastdatatime = datatime + + if data_power is None: + return None, None, None,None,None,None + + avgdatatime = self.__initime + deltatime = datatime - self.__lastdatatime + self.__initime = datatime + + return data_power, data_intensity, data_velocity, data_snrPP, data_specwidth, avgdatatime + + def run(self, dataOut,n = None,removeDC= False, overlapping= False,**kwargs): + + if not self.isConfig: + self.setup(dataOut = dataOut, n = n , removeDC=removeDC , **kwargs) + self.isConfig = True + data_power, data_intensity, data_velocity,data_snrPP,data_specwidth, avgdatatime = self.pulsePairOp(dataOut, dataOut.utctime) + dataOut.flagNoData = True + + if self.__dataReady: + dataOut.nCohInt *= self.n + dataOut.dataPP_POW = data_intensity # S + dataOut.dataPP_POWER = data_power # P + dataOut.dataPP_DOP = data_velocity + dataOut.dataPP_SNR = data_snrPP + dataOut.dataPP_WIDTH = data_specwidth + dataOut.PRFbyAngle = self.n #numero de PRF*cada angulo rotado que equivale a un tiempo. + dataOut.utctime = avgdatatime + dataOut.flagNoData = False + return dataOut + + + # import collections # from scipy.stats import mode # diff --git a/schainpy/model/serializer/__init__.py b/schainpy/model/serializer/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/schainpy/model/serializer/__init__.py +++ /dev/null diff --git a/schainpy/model/serializer/data.py b/schainpy/model/serializer/data.py deleted file mode 100644 index 4c025ee..0000000 --- a/schainpy/model/serializer/data.py +++ /dev/null @@ -1,114 +0,0 @@ -''' -Created on Jul 15, 2014 - -@author: Miguel Urco -''' -from .serializer import DynamicSerializer - -DEFAULT_SERIALIZER = None #'cPickle', 'msgpack', "yaml" - -from schainpy.model.data.jrodata import * - -CLASSNAME_KEY = 'classname__' - -def isObject(myObj): - - return hasattr(myObj,'__dict__') - -def isDictFormat(thisValue): - - if type(thisValue) != type({}): - return False - - if CLASSNAME_KEY not in list(thisValue.keys()): - return False - - return True - -def obj2Dict(myObj, keyList=[]): - - if not keyList: - keyList = list(myObj.__dict__.keys()) - - myDict = {} - - myDict[CLASSNAME_KEY] = myObj.__class__.__name__ - - for thisKey, thisValue in list(myObj.__dict__.items()): - - if thisKey not in keyList: - continue - - if not isObject(thisValue): - myDict[thisKey] = thisValue - continue - - ## If this value is another class instance - myDict[thisKey] = obj2Dict(thisValue) - - return myDict - -def dict2Obj(myDict): - ''' - ''' - - if CLASSNAME_KEY not in list(myDict.keys()): - return None - - className = eval(myDict[CLASSNAME_KEY]) - - myObj = className() - - for thisKey, thisValue in list(myDict.items()): - - if thisKey == CLASSNAME_KEY: - continue - - if not isDictFormat(thisValue): - setattr(myObj, thisKey, thisValue) - continue - - myNewObj = dict2Obj(thisValue) - setattr(myObj, thisKey, myNewObj) - - return myObj - -def dict2Serial(myDict, serializer=DEFAULT_SERIALIZER): - - SERIALIZER = DynamicSerializer(serializer) - - mySerial = SERIALIZER.dumps(myDict) - - return mySerial - -def serial2Dict(mySerial, serializer=DEFAULT_SERIALIZER): - - SERIALIZER = DynamicSerializer(serializer) - - myDict = SERIALIZER.loads(mySerial) - - return myDict - -def obj2Serial(myObj, serializer=DEFAULT_SERIALIZER, **kwargs): - - SERIALIZER = DynamicSerializer(serializer) - - myDict = obj2Dict(myObj, **kwargs) - mySerial = dict2Serial(myDict, serializer) - - return mySerial - -def serial2Obj(mySerial, metadataDict = {}, serializer=DEFAULT_SERIALIZER): - - SERIALIZER = DynamicSerializer(serializer) - - myDataDict = serial2Dict(mySerial, serializer) - - if not metadataDict: - myObj = dict2Obj(myDataDict) - return myObj - - metadataDict.update(myDataDict) - myObj = dict2Obj(metadataDict) - - return myObj \ No newline at end of file diff --git a/schainpy/model/serializer/serializer.py b/schainpy/model/serializer/serializer.py deleted file mode 100644 index c5e0ffe..0000000 --- a/schainpy/model/serializer/serializer.py +++ /dev/null @@ -1,108 +0,0 @@ -''' -Created on Jul 17, 2014 - -@author: roj-idl71 -''' - -DEFAULT_SERIALIZER = None - -try: - import pickle - DEFAULT_SERIALIZER = 'cPickle' -except: - pass - -try: - import msgpack_numpy - DEFAULT_SERIALIZER = 'msgpack' -except: - pass - -# import jsonpickle -# import yaml - -class Serializer(object): - - def __init__(self): - - self.serializer = None - - def dumps(self, obj, **kwargs): - - return self.serializer.dumps(obj, **kwargs) - - def loads(self, obj, **kwargs): - return self.serializer.loads(obj, **kwargs) - -class cPickleSerializer(Serializer): - - def __init__(self): - self.serializer = cPickle - - def dumps(self, obj, **kwargs): - return self.serializer.dumps(obj, 2) - - def loads(self, obj, **kwargs): - return self.serializer.loads(obj) - -class msgpackSerializer(Serializer): - - def __init__(self): - - self.serializer = msgpack_numpy - - def dumps(self, obj, **kwargs): - return self.serializer.packb(obj) - - def loads(self, obj, **kwargs): - return self.serializer.unpackb(obj) - -# class jsonpickleSerializer(Serializer): -# -# def __init__(self): -# -# self.serializer = jsonpickle -# -# def dumps(self, obj, **kwargs): -# return self.serializer.encode(obj, **kwargs) -# -# def loads(self, obj, **kwargs): -# return self.serializer.decode(obj, **kwargs) -# -# class yamlSerializer(Serializer): -# -# def __init__(self): -# -# self.serializer = yaml -# -# def dumps(self, obj, **kwargs): -# return self.serializer.dump(obj, **kwargs) -# -# def loads(self, obj, **kwargs): -# return self.serializer.load(obj, **kwargs) - -class DynamicSerializer(Serializer): - - def __init__(self, module = None): - - if not DEFAULT_SERIALIZER: - raise ImportError("Install a python serializer like cPickle or msgpack") - - if not module: - module == DEFAULT_SERIALIZER - - if module == 'cPickle': - self.serializer = cPickleSerializer() -# -# if module == 'jsonpickle': -# self.serializer = jsonpickleSerializer() -# -# if module == 'yaml': -# self.serializer = yamlSerializer() - - if module == 'msgpack': - self.serializer = msgpackSerializer() - - -if __name__ == '__main__': - pass \ No newline at end of file diff --git a/schainpy/model/serializer/test/DynamicObject.py b/schainpy/model/serializer/test/DynamicObject.py deleted file mode 100644 index 39e4100..0000000 --- a/schainpy/model/serializer/test/DynamicObject.py +++ /dev/null @@ -1,815 +0,0 @@ -''' -The DynamicObject module supports dynamic loading of YAML -defined objects into Python class objects. Object can -be sub-classed to allow direct binding of methods having -matching signatures. - -$Id$ -''' - -import urllib.request, urllib.parse, urllib.error -import os -import re -import yaml # YAML Ain't Markup Language -import numpy as np -import copy -import inspect -import PrecisionTime -import time -import sys -import datetime -import collections - -# Replacement Loader for PyYAML to keep dictionaries in-order: -import OrderedYAML -#OrderedYAML.collections - -class Object(object): - """ Loads a YAML defined python class dynamically using the supplied URI, - which may be a file, directory, web hyper-link, or hyper-linked directory. """ - - # Dictionary containing all known Object class names and corresponding class objects - dynamicClasses = collections.OrderedDict() - - def __init__(self, object_uri=None, revision=None, recursive=False): - if isinstance(object_uri, file): - # URI is a yaml file - read it. - self.yaml = file.read() - elif object_uri == None: - self.yaml = None - elif isinstance(object_uri, str): - if object_uri.endswith('.yml'): - # URI is a web hyper-linked yaml file - read it. - self.yaml = urllib.request.urlopen(object_uri).read() - else: - # URI is a (hyper-linked?) directory - try reading it. - #print "URI is a directory." - try: - self.files = self.__parseLink(object_uri, recursive) - except IOError: - # URI is a local directory - get a list of YAML files in it - self.files = self.__getYamlFiles(object_uri, recursive) - - # For each YAML file found, create a new DynamicObject of it: - self.yaml = [] - for fn in self.files: - self.yaml.append(Object(fn)) - else: - print("Invalid URI supplied: %s"%(object_uri,)) - - def __parseLink(self, object_uri, recursive): - """ Returns a listing of all YAML files located in the - hyper-link directory given by page. """ - page = urllib.request.urlopen(object_uri).read() - #print "URI is a URL directory: %s"%(object_uri,) - pattern = re.compile(r'
') - - # List of files contained in the directory at the given URL, ignoring - # any "?" / GET query-string locations given: - files = [x[9:-2] for x in pattern.findall(page) if not x[9:-2].startswith('?')] - #print files - - yamlFiles = [] - dirs = [] - for fn in files: - if not fn.startswith('/'): # Ignore absolute paths... - path = os.path.join(object_uri, fn) - #print path - - # Keep list of YAML files found... - if fn.endswith('.yml'): - yamlFiles.append(path) - - # Keep list of directories found... - elif recursive and fn.endswith('/'): - dirs.append(path) - - if recursive: - #print dirs - for path in dirs: - yamlFiles += self.__parseLink(path,recursive) - - return yamlFiles - - def __getYamlFiles(self, local_dir, recursive): - """ Returns a listing of all YAML files located in the given - directory, recursing if requested. """ - yamlFiles = [] - dirs = [] - for fn in os.listdir(local_dir): - path = os.path.join(local_dir, fn) - - # List of YAML files found... - if fn.endswith('.yml'): - yamlFiles.append(path) - - # List of directories found... - elif recursive and os.path.isdir(path): - dirs.append(path) - - # Recurse if desired: - if recursive: - for path in dirs: - yamlFiles += self.__getYamlFiles(path,recursive) - - return yamlFiles - - def equals(self, obj, compare_time_created=True): - """ Returns True iff self has identical attributes - (numerically) to obj (no extras) """ - - if not isinstance(obj, Object): return False - - self_keys = list(self.__dict__.keys()) - obj_keys = list(obj.__dict__.keys()) - if not self_keys == obj_keys: - return False - for key in self_keys: - obj_keys.remove(key) - - self_value, obj_value = self.__dict__[key], obj.__dict__[key] - if isinstance(self_value, Object): - if not self_value.equals(obj_value, compare_time_created): - return False - elif isinstance(self_value, np.ndarray): - m1 = list(map(repr,self_value.flat)) - m2 = list(map(repr,obj_value.flat)) - ret = m1 == m2 - if not ret: - return False - else: - if not self_value == obj_value: - # Return False iff the different times are important - return key == '__time_created' and not compare_time_created - - return obj_keys == [] # no more keys --> the objects are identical - - def sizeof(self): - """ Recursively computes the size in bytes of the given Dynamic Object """ - sz = 0 - values = list(self.__dict__.values()) - for val in values: - if isinstance(val, Object): sz += val.sizeof() - elif isinstance(val, np.ndarray): sz += val.nbytes - elif hasattr(val, 'dtype') and hasattr(val.dtype, 'itemsize'): sz += val.dtype.itemsize - else: sz += sys.getsizeof(val) - return sz - - # Automatic methods for accessing meta-data - getters = ['__object_name', '__revision_number', '__revision_id', '__revision_source', '__revision_tag', '__time_created'] - def getObjectName(self): return self.__class__.meta_attributes['__object_name'] - def getRevisionNumber(self): return self.__class__.meta_attributes['__revision_number'] - def getRevisionId(self): return self.__class__.meta_attributes['__revision_id'] - def getRevisionSource(self): return self.__class__.meta_attributes['__revision_source'] - def getRevisionTag(self): return self.__class__.meta_attributes['__revision_tag'] - def getTimeCreated(self): return getattr(self, "__time_created") - - """ - __getters = [('ObjectName', getObjectName), ('RevisionNumber', getRevisionNumber), - ('RevisionId', getRevisionId), ('RevisionSource', getRevisionSource), - ('RevisionTag', getRevisionTag)] - def __repr__(self): - meta_atts = repr([(x[0], x[1](self)) for x in Object.__getters]) - atts = repr(self.__dict__) - return "Object(%s, %s)"%(atts, meta_atts) - """ - - -class SignatureException(Exception): - """ Exception thrown when a data or method signature is unknown or invalid - for a particular Object. """ - def __init__(self, value): self.value = value - def __str__(self): return repr(self.value) - -class _IDLTag(object): - """ IDLTag (aka Interface Definition Language Tag) is an abstract helper class - used by the Factory to define built-in tags used - specifically for our IDL """ - def __init__(self, yamlString): - self.yamlString = yamlString - def __repr__(self): - return self.yamlString - -class _Reference(_IDLTag): - """ Helper class for Factory: Objects can be composed - of other objects, requiring a Reference to the other object. """ - def __repr__(self): - return "Ref(%s)"%(self.yamlString,) - -class _Method(_IDLTag): - """ Helper class for Factory: Objects have methods - associated with them - this tag tells the Factory that a method - signature follows (in dict format) """ - def __repr__(self): - return "Method(%r)"%(self.yamlString,) - -class Binary(Object): - def __init__(self, binary_type, value=None): - self.binary_type = binary_type - self.value = value - -import Lookup - -class BuiltinDtype(_IDLTag): - """ Helper class for Factory: Object parameters each - have a certain data type (either dtype.xxxx for numpy compatible data - types, or one of the generic python data types (i.e. int, bool, str...) - - __addYamlConstructor in Factory registers all of the tags - listed as keys in the dtypes dictionary.""" - - def __init__(self, yamlString, tag=None): - self.tag = tag[1:] - super(BuiltinDtype, self).__init__(yamlString) - #print self.tag - try: self.dtype = Lookup.numpy_dtypes[self.tag] - except KeyError: self.dtype = Lookup.builtin_objects[self.tag] - - def __repr__(self): - return "_BuiltinType(%s,%s)"%(self.yamlString, self.tag) - -# Register hexadecimal representation of numpy dtypes in YAML - -class _Parameter: - """ Helper class for Factory: Contains the name, default - value, and length (if an array) of an object initialization parameter. """ - - def __init__(self, name, hasDefault=False, default=None, length=None, classType=None): - self.name = name - self.hasDefault = hasDefault - self.default = default - self.length = length - if isinstance(classType, None.__class__) and not isinstance(default, None.__class__): - self.classType = default.__class__ - else: - self.classType = classType - -class _UnresolvedType: - """ Used to indicate a data type which has not yet been parsed (i.e. for - recursive data-types. """ - - def __init__(self, yamlObject): - # Either the name of the class we couldn't resolve, or a dictionary - # containing the name and a default value - self.yamlObject = yamlObject - -class UnresolvedTypeException(Exception): - """ Raised when a !ref tag is used, but the reference cannot be resolved """ - pass - -def get_class(kls): - """ Returns a pointer to the class instance with the name kls - Function acquired from http://stackoverflow.com/questions/452969/ """ - parts = kls.split('.') - module = ".".join(parts[:-1]) - m = __import__( module ) - for comp in parts[1:]: - m = getattr(m, comp) - return m - -# Aliased constructor & representer adders for easily swapping between Ordered and non-Ordered: -def add_constructor(tag, constructor): - #yaml.add_constructor(tag, constructor) - OrderedYAML.Loader.add_constructor(tag, constructor) -def add_representer(cls, representer): - #yaml.add_representer(cls, representer) - OrderedYAML.Dumper.add_representer(cls, representer) - -# Implicit constructor for _Reference objects using the !ref tag: -def __ref_constructor(loader, node): - if isinstance(node, yaml.nodes.MappingNode): - return _Reference(loader.construct_mapping(node)) - else: - return _Reference(loader.construct_scalar(node)) -add_constructor('!ref', __ref_constructor) - -# Method constructor using !method tag: -def __method_constructor(loader, node): - if isinstance(node, yaml.nodes.MappingNode): - return _Method(loader.construct_mapping(node)) - else: - return _Method(loader.construct_scalar(node)) -add_constructor('!method', __method_constructor) - -# Generic constructor for any _BuiltinDtype -def __dtype_constructor(loader, node): - if isinstance(node, yaml.nodes.SequenceNode): - ret = BuiltinDtype(loader.construct_sequence(node), tag=node.tag) - elif isinstance(node, yaml.nodes.MappingNode): - ret = BuiltinDtype(loader.construct_mapping(node), tag=node.tag) - else: - ret = BuiltinDtype(loader.construct_scalar(node), tag=node.tag) - return ret - -# Register YAML constructors for each builtin type: -for dtype in list(Lookup.numpy_dtypes.keys()) + list(Lookup.builtin_objects.keys()): - add_constructor('!%s'%(dtype,), __dtype_constructor) - -class FactoryLoader(OrderedYAML.Loader): - """ A YAML Loader specifically designed to load YAML object definitions - (as opposed to actual instances of the objects) """ - - def construct_yaml_timestamp(self, node): - """ Make empty timestamps (None/null) acceptable, otherwise parse the timestamp """ - if node.value == '': - name = 'YAML_DEFN_LOADED_INCORRECTLY' # in case we forget to fix the name... - return _Parameter(name, hasDefault=False, classType=datetime.datetime) - else: - return yaml.constructor.SafeConstructor.construct_yaml_timestamp(self, node) - -# Override default timestamp constructor: -FactoryLoader.add_constructor( - 'tag:yaml.org,2002:timestamp', - FactoryLoader.construct_yaml_timestamp -) - -import DynamicYAML -class Factory: - """ Load a YAML defined python class and create a class with initialization - provided by this factory. This is intended as an abstract class to be sub-classed - to enable complex initialization on object instantiation. - - Factory subclasses should override __buildClass().""" - - def __init__(self, dynamic_object=None, yaml=None, typeCheck='strong', parse=True, revision_dict=None): - if revision_dict != None: self.revision_dict = revision_dict # Remember for when we build each individual class - else: - self.revision_dict = {\ - "__revision_number": 0, - "__revision_id": 'unknown', - "__revision_source": 'unknown', - "__revision_tag": 'unknown'} - if parse: - if dynamic_object: - self.parse(dynamic_object, typeCheck=typeCheck) - else: - dyno = Object() - dyno.yaml = yaml - self.parse(dyno, typeCheck=typeCheck) - - def parse(self, dynamic_object, typeCheck='strong'): - """ - Initializer for a Factory, converting the given dynamic_object - containing a (text) YAML object definition into the corresponding class-type - with initializer. - - typeCheck parameter can be one of 'strong' or 'cast': - 'strong': Class initializer should raise a TypeError when given - anything but the correct type - 'cast': Class initializer should attempt to cast any input to the correct type - """ - - # Remember what kind of type-checking to do: - if typeCheck not in ['strong', 'cast']: - raise Exception('Incorrect input for typeCheck: %s\nExpected "strong" or "cast"'%(typeCheck)) - self.typeCheck = typeCheck - - # Get a list of the objects to build: - if isinstance(dynamic_object.yaml, list): - objects = dynamic_object.yaml - else: - objects = [dynamic_object] - - # Generate a dictionary of classes from the DynamicObjects given: - self.classes = dict() - for obj in objects: - - # This loader breaks nothing anymore #everything currently - loader = FactoryLoader(obj.yaml) - #loader = yaml.Loader(obj.yaml) - - # Dictionary with method and data signatures for the current object: - objDefn = [] - while loader.check_data(): - objDefn.append(loader.get_data()) - loader.dispose() - - # Parse the dictionary into a class definition: - objClass = self.__buildClass(objDefn) - self.classes.update(objClass) - - def parseMethodSignature(self, sigName, methDict): - """ Returns the python method corresponding to the given signature - (given signature should be in the loaded YAML dict format. - - Override this method for recognizing complex method signatures. """ - - raise SignatureException("Object abstract base class doesn't support any method signatures.") - - def parseDataSignature(self, sigName, sig): - """ Returns the Parameter object corresponding to the given signature. - - This method should be overridden for recognizing complex data signatures - (don't forget to call super(sig) for built-in data types though!) """ - - # Is the object an array with explicit default elements?: - if isinstance(sig.yamlString, list): - #length = len(sig.yamlString) - if 'dtype' in sig.tag: - default = np.array(sig.yamlString, dtype=sig.dtype) - elif 'binary' == sig.tag: - default = Binary(sig.yamlString["type"]) - else: - default = sig.yamlString - return _Parameter(sigName, True, default, length=None) - - # Is the object an array with length and default value given?: - if isinstance(sig.yamlString, dict) and "len" in list(sig.yamlString.keys()): - length = sig.yamlString["len"] - - # Shape is given as something like [[],[]], not [2,2] - convert - if isinstance(length, list): - - def get_shape(lst): - """ Gets the shape of a list recursively filled with empty lists """ - if lst == []: return [0] - return [len(lst)] + get_shape(lst[0]) - - if len(length) > 0: - if isinstance(length[0], list): - length = get_shape(length) - else: - pass - else: - length = [0] # convert [] to [0] (numpy interprets [] as [1] for shapes) - - - if 'complex' in sig.tag: - imag = sig.yamlString["default"]["imag"] - real = sig.yamlString["default"]["real"] - default = sig.dtype(real) + sig.dtype(imag*1j) - elif 'binary' == sig.tag: - default = Binary(sig.yamlString["type"]) - else: - default = sig.dtype(sig.yamlString["default"]) - - return _Parameter(sigName, True, default, length) - - # The object is singular, with a given value: - if 'complex' in sig.tag: - imag = sig.yamlString["imag"] - real = sig.yamlString["real"] - default = sig.dtype(real) + sig.dtype(imag*1j) - return _Parameter(sigName, True, default) - elif 'binary' == sig.tag: - default = Binary(sig.yamlString["type"]) - return _Parameter(sigName, False, default, classType=Binary) - elif 'timestamp' in sig.tag: - if isinstance(sig.yamlString, dict): - if sig.tag in ['timestamp_picosecond', 'timestamp_ps']: - try: s = sig.yamlString['second'] - except KeyError: s = sig.yamlString['s'] - try: ps = sig.yamlString['picosecond'] - except KeyError: ps = sig.yamlString['ps'] - return _Parameter(sigName, True, PrecisionTime.psTime(s, ps)) - elif sig.tag in ['timestamp_nanosecond', 'timestamp_ns']: - try: s = sig.yamlString['second'] - except KeyError: s = sig.yamlString['s'] - try: ns = sig.yamlString['nanosecond'] - except KeyError: ns = sig.yamlString['ns'] - return _Parameter(sigName, True, PrecisionTime.nsTime(s, ns)) - else: - if sig.tag in ['timestamp_picosecond', 'timestamp_ps']: - return _Parameter(sigName, False, classType=PrecisionTime.psTime) - elif sig.tag in ['timestamp_nanosecond', 'timestamp_ns']: - return _Parameter(sigName, False, classType=PrecisionTime.nsTime) - else: - default = sig.dtype(sig.yamlString) - return _Parameter(sigName, True, default) # not binary - - - - def __parsePythonType(self, sigName, sig): - """ Returns a _Parameter object, similar to parseDataSignature, but - for a basic python type. """ - - if isinstance(sig, collections.OrderedDict): - default = dict(sig) # Type-check user-defined !!maps as dicts, not OrderedDicts. - else: - default = sig # The signature sig is the default value itself - return _Parameter(sigName, True, default) - - def __parseReferenceSignature(self, sigName, ref_object, objClasses): - """ Takes a reference object ref_object to be named sigName, and - produces a _Parameter object with default value of None. """ - - # List of names of classes we've created so far: - #print [x for x in objClasses] - names = list(objClasses.keys()) - - if ref_object.yamlString in names: - defaultType = objClasses[ref_object.yamlString] - return _Parameter(sigName, classType=defaultType) - else: - try: - # Try to find the class type in globals: - className = objClasses[str(ref_object.yamlString)] - defaultType = get_class(className) - except (ValueError, KeyError): - defaultType = _UnresolvedType(ref_object.yamlString) - #raise NameError("Invalid reference to module %s"%(className,)) - - return _Parameter(sigName, classType=defaultType) - - def __buildInitializer(self, className, classData): - """ Constructs the initializer for an object which expects parameters - listed in classData as input upon initialization. """ - - # Type of type-checking to use: - strong = (self.typeCheck == 'strong') - #cast = (self.typeCheck == 'cast') - - def typeCheck(param, arg): - """ - Checks to see if the type of arg matches that of the corresponding param, - casting arg to the correct type if desired. - """ - if isinstance(arg, param.classType): return arg - if isinstance(arg, np.ndarray) and arg.dtype.type == param.classType: - if not param.hasDefault: return arg - if param.default.shape == (): return arg - if param.default.shape[-1] == 0: return arg - if arg.shape == param.default.shape: return arg - if isinstance(arg, None.__class__): return arg - if strong: - raise TypeError("Incorrect input type on strong type-checking."+\ - " Expected %s - got %s"%(param.classType,arg.__class__)) - else: - # If the parameter corresponding to the given argument has a non-NoneType default - # value, then attempt to cast the argument into the correct parameter type - if param.hasDefault and param.default != None: - if isinstance(param.default, np.ndarray): - return np.array(arg, dtype=param.default.dtype) - else: - return param.default.__class__(arg) - else: - return param.classType(arg) - - """ - attributes = {"__object_name": className, - "__revision_number": self.svn_revision_number, - "__revision_id": 'unknown', - "__revision_source": 'unknown', - "__revision_tag": 'unknown'} - """ - attributes = {} # Create new attributes dict for this particular class object - attributes.update(self.revision_dict) # Revision info now passed into the factory - attributes['__object_name'] = className - - def init(_self, *args, **kwargs): - """ Dynamically generated initializer. """ - - # meta-data goes in the class, not the objects (commented the following out): - """ - # Initialize automatic class data - for attr,value in attributes.items(): - try: - value = kwargs[attr] # Are we given a value to over-ride with? - del kwargs[attr] # Ignore the meta attribute later - except KeyError: - pass - setattr(_self, attr, value) - """ - - # Set default values first (assume no parameters): - for param in classData: - if param.length: - if isinstance(param.length, int): param.length = [param.length] - default = np.empty(param.length, dtype=param.classType) - if param.hasDefault: - # Initialize array with default array value given: - flatIter = default.flat - for i in range(len(flatIter)): - flatIter[i] = copy.deepcopy(param.default) - else: - # Initialize to None if no default given: - default.fill(None) - else: - default = param.default - setattr(_self, param.name, copy.deepcopy(default)) - - # Set attributes given by standard args: - for i in range(len(args)): - arg = typeCheck(classData[i], args[i]) - setattr(_self, classData[i].name, arg) - - # Set named attributes (given by dictionary kwargs): - for key,value in list(kwargs.items()): - - try: keyIndex = [param.name for param in classData].index(key) - except ValueError: - raise TypeError("'%s' is an invalid keyword argument"%(key,)) - arg = typeCheck(classData[keyIndex],value) - #setattr(_self, key, value) - setattr(_self, key, arg) - - - # Object instantiation / creation time (if not already present): - if '__time_created' not in kwargs: - setattr(_self, "__time_created", np.float64(time.time())) - - return init, attributes - - def __findClass(self, className, localClasses): - """ Looks for the given className first in the given dictionary of localClasses - then in the global definitions, returning the corresponding class object. Raises - a KeyError if the class cannot be found. """ - - # If class definition was in the YAML file, extend that one: - if className in list(localClasses.keys()): - return localClasses[className] - - # Else try finding the class definition in our global scope: - try: classObj = get_class(className) - except KeyError: - raise KeyError("Class '%s' not found in given YAML scope or global scope."%(className,)) - return classObj - - def __buildClass(self, objDefn): - """ Takes an object definition list / dictionary objDefn (loaded from a YAML - object definition file) and creates a class, dynamically binding - method and data signatures to the new class. - - This method only performs a basic binding of method and data signatures to - the new class. Object(s) having more complex initialization requirements - should be given their own Factory subclass, overriding this - and other methods.""" - - # objDefn is a list of dictionaries found in the YAML file - build each one... - objClasses = dict() - objClassesRev = dict() - - # A list of all _Parameter objects created, used to resolve recursive - # or "tangled" data structures - allClassData = [] - - for document in objDefn: - # Each document can contain multiple objects - build each one. - # (NOTE: objects can cross reference each other in the same document - # need to resolve Reference objects as last step) - for objClassName in list(document.keys()): - - # The dictionary containing method & data signatures: - objDict = document[objClassName] - - # Extract data / attribute definitions (signatures) from the YAML dictionary - # as well as method signatures and which classes this class extends: - classData = [] - classMethods = dict() - classBases = [Object] - - # List structured documents result in a list of dicts each with one key: - if isinstance(objDict, list): keys = [list(param.keys())[0] for param in objDict] - # Otherwise the parameter names are just the keys of the dict - else: keys = list(objDict.keys()) # if key not found, raises AttributeError - - for sigName in keys: - #print sigName - sig = objDict[sigName] - #for f in _BuiltinDtype.python_dtypes: print f.__class__ - if sigName == '__extends': - if isinstance(sig, str): - sig = [sig] - if isinstance(sig, list): - for className in sig: - newBase = self.__findClass(className, objClasses) - - # Remove Object extension if newBase extends it already: - if Object in classBases and Object in inspect.getmro(newBase): - classBases.remove(Object) - classBases += [newBase] - else: - raise TypeError("Incorrect format for extending classes - %s"%(sig,)) - elif isinstance(sig, BuiltinDtype): - classData.append(self.parseDataSignature(sigName, sig)) - elif isinstance(sig, Lookup.python_dtypes): - classData.append(self.__parsePythonType(sigName, sig)) - elif isinstance(sig, _Reference): - classData.append(self.__parseReferenceSignature(sigName, sig, objClasses)) - elif isinstance(sig, _Method): - classMethods[sigName] = self.parseMethodSignature(sigName, sig.yamlString) - elif isinstance(sig, (PrecisionTime.nsTime, PrecisionTime.psTime)): - classData.append(_Parameter(sigName, True, sig)) - elif isinstance(sig, _Parameter): # sig is already a parameter (we skipped a step) - sig.name = sigName # we didn't know the name during load time - fill that in now - classData.append(sig) - else: - msg = "Factory abstract base class doesn't " +\ - "support the following signature: %r \"%s\""%(sig.__class__,str(sig)) - print(sig.__class__) - raise SignatureException(msg) - - # Built-in attribute for all Dynamic Objects: - classData.append(_Parameter('__time_created', classType=np.float64)) - - # Turn the object data / attributes into a usable __init__ method: - classMethods["__init__"], meta_attributes = self.__buildInitializer(objClassName, classData) - - # Keep a record of the _Parameters created for later type resolution - allClassData.extend(classData) - - """ - __automaticMethods = { - "getObjectName": lambda _self: getattr(_self, '__object_name'), - "getRevisionNumber": lambda _self: getattr(_self, '__revision_number'), - "getRevisionId": lambda _self: getattr(_self, '__revision_id'), - "getRevisionSource": lambda _self: getattr(_self, '__revision_source'), - "getRevisionTag": lambda _self: getattr(_self, '__revision_tag') - } - classMethods.update(__automaticMethods) - """ - - # Put the method signatures into a namespace for the new class, - # then dynamically build the class from this namespace. - classNamespace = classMethods - classNamespace["meta_attributes"] = meta_attributes - cls = type(str(objClassName), tuple(classBases), classNamespace) - objClasses[objClassName] = cls - objClassesRev['%s.%s'%(objClassName,cls.meta_attributes["__revision_number"])] = cls - - # Create and register a constructor (loading) and representer (dumping) for the new class cls - def construct_dynamic_object(loader, node): - kwargs = loader.construct_mapping(node) - # Remove revision control from loaded objects (info is in the class object!) - for arg in list(kwargs.keys()): - if arg in getattr(Object, 'getters') and arg != '__time_created': - del kwargs[arg] - return cls(**kwargs) - revision = cls.meta_attributes["__revision_number"] - DynamicYAML.Loader.add_constructor('!%s.%s'%(str(objClassName),revision), construct_dynamic_object) - - represent_dynamic_object = DynamicYAML.Dumper.represent_dynamic_object - DynamicYAML.Dumper.add_representer(cls, represent_dynamic_object) - - def findClass(className): - """ Search for the most recently added class object with given className """ - try: - return objClasses[className] # Look for reference to object in same YAML defn file: - except KeyError: - # Now look for reference to class object loaded from any YAML defn file, loading the - # most recent version / revision (number) of the definition - for dynClass in list(Object.dynamicClasses.keys())[::-1]: - if dynClass.startswith(className): - return Object.dynamicClasses[dynClass] - - # Still unresolved - raise exception: - allDynamicClasses = repr(list(objClasses.keys()) + list(Object.dynamicClasses.keys())) - raise UnresolvedTypeException("Cannot resolve type '%s': Name not found in %s"%(className,allDynamicClasses)) - - - def resolve(param): - - # Reference is just a string - that's the class name: - if isinstance(param.classType.yamlObject, str): - className = str(param.classType.yamlObject) - param.classType = findClass(className) - return - - # Reference is a dict containing class name and / or default values: - if not isinstance(param.classType.yamlObject, dict): - raise UnresolvedTypeException("Cannot resolve reference of type '%s'"%(param.classType.yamlObject.__class__,)) - - # Definitely a dict: - refDict = param.classType.yamlObject - - # Determine the name of the class being referenced - try: - className = refDict["type"] - except KeyError: - raise KeyError("No 'type' key in reference dictionary for parameter '%s'"%(param.name,)) - - # Determine the class object corresponding to the class name - param.classType = findClass(className) - - try: - defaultParams = refDict["default"] - except KeyError: - defaultParams = None - - if defaultParams != None: - for sub_param in defaultParams: - if isinstance(sub_param.classType, _UnresolvedType): - resolve(sub_param) - param.default = param.classType( **defaultParams ) # Create the default object - param.hasDefault = True - else: - param.hasDefault = False # for good measure - - # Is it an object array?: - if "len" in list(refDict.keys()): - param.length = refDict["len"] - - # Resolve any unresolved data-types: - for param in allClassData: - if isinstance(param.classType, _UnresolvedType): - resolve(param) - - Object.dynamicClasses.update(objClassesRev) - return objClasses - -def load_defn(yaml): - """ Shortcut for producing a single DynamicObject class object from - the provided yaml definition in string format """ - return list(Factory(yaml=yaml).classes.values())[0] - - diff --git a/schainpy/model/serializer/test/DynamicSerializer.py b/schainpy/model/serializer/test/DynamicSerializer.py deleted file mode 100644 index 00e4c7b..0000000 --- a/schainpy/model/serializer/test/DynamicSerializer.py +++ /dev/null @@ -1,69 +0,0 @@ -# -# rps 6/9/2014 -# mit haystack obs -# -# wrapper for Karl's code - -import DynamicObject # used for serial/deserial of complex python objects -import Serializer # used for serial/deserial of complex python - -# -class DynamicSerializer: - # - #------------------------------------------------------ - # - def __init__(self,which='yaml'): - # - # choices are: yaml, msgpack, hdf5, json - # - self.err_f = False - self.whichList = ['yaml', 'msgpack', 'hdf5', 'json'] # from Serialzer.py - self.err_f,self.serializer = self.initSerializer(which) - # - #------------------------------------------------------ - # - def initSerializer(self,which): - # - # calls REU student code that works but hasn't been walked-through - # it's a dynamic serializer not strictly a yaml serializer - # - err_f = False - match_f = False - serializer = None - ii = 0 - while ii < len(self.whichList): - if (self.whichList[ii] == which): - match_f = True - break - ii = ii + 1 - # end while - if not match_f: - err_f = True - else: - serializer = which - serializer = Serializer.serializers[serializer]() - - return err_f,serializer - # end initSerializer - # - # -------------------------------------------------- - # - def loads(self,element): # borrows name from json module (json - to - python) - retval = self.serializer.fromSerial(element) # de-serialize - return retval - # end loads - # - # -------------------------------------------------- - # - def dumps(self,element): # borrows name from json module (python - to - json) - retval = self.serializer.toSerial(element) # serialize - return retval - # end dumps - # - # -------------------------------------------------- - # -# end class DynamicSerializer - -if __name__ == "__main__": - DynamicSerializer() - print("DynamicSerializer ran") \ No newline at end of file diff --git a/schainpy/model/serializer/test/DynamicYAML.py b/schainpy/model/serializer/test/DynamicYAML.py deleted file mode 100644 index 508ef55..0000000 --- a/schainpy/model/serializer/test/DynamicYAML.py +++ /dev/null @@ -1,220 +0,0 @@ -''' -Module containing YAML Loader and Dumper for DynamicObjects -as well as built-in data types (numpy, PrecisionTime, datetime, Binary, ...) - -$Id$ -''' - -import yaml -import OrderedYAML -import DynamicObject -import binascii -import numpy as np -import PrecisionTime -import Lookup -import pysvn - -def load_defn(source, rev='head', repo=""): - """ Import YAML definition(s) from given 'source' SVN location - with specific revision number 'rev'. Returns a dict of the object - names -> class object instances. - - NOTE: Object defns with same name & revision number will conflict / - cause issues (regardless of svn location). """ - client = pysvn.Client() - - if rev == 'head': - #yaml = client.cat(source) - rev = client.info(repo).revision.number - - if source.startswith('http'): - yaml = client.cat("%s?p=%d"%(source, rev)) - else: - pysvn_rev = pysvn.Revision(pysvn.opt_revision_kind.number, rev) - yaml = client.cat(source, pysvn_rev) - - revision_dict = {\ - "__revision_number": rev, - "__revision_id": 'unknown', - "__revision_source": source, - "__revision_tag": 'unknown'} - - return DynamicObject.Factory(yaml=yaml, revision_dict=revision_dict).classes - -class Loader(OrderedYAML.Loader): - - def __init__(self, stream): - OrderedYAML.Loader.__init__(self, stream) - - def construct_object(self, node, deep=False): - """ Unresolved tags on mapping nodes come from un-imported YAML definitions - import it """ - resolved = node.tag in self.yaml_constructors - resolved = resolved or any([node.tag.startswith(x) for x in self.yaml_multi_constructors]) - if isinstance(node, yaml.nodes.MappingNode) and not resolved: - data = self.construct_mapping(self, node) - self.constructed_objects[node] = data - del self.recursive_objects[node] - if '__revision_source' in data: - # TODO: Handle password authentication - client = pysvn.Client() - source = data['__revision_source'] - if source.startswith('http'): - rev = data['__revision_number'] - defn = client.cat("%s?p=%d"%(source, rev)) - else: - rev = pysvn.Revision(pysvn.opt_revision_kind.number, data['__revision_number']) - defn = client.cat(source, revision=rev) - DynamicObject.Factory(yaml=defn) # Register the object - - constructor = self.yaml_constructors["%s.%s"%(data['__revision_name'], data['__revision_number'])] - return constructor(node) - else: - raise Exception("Cannot load object with tag '%s' - cannot find YAML object definition (no __revision_source included)") - else: - return yaml.Loader.construct_object(self, node, deep=deep) - -class Dumper(OrderedYAML.Dumper): - - def __init__(self, stream, *args, **kwargs): - OrderedYAML.Dumper.__init__(self, stream, *args, **kwargs) - - def represent_dynamic_object(self, obj): - """ - Override the !!python/object:__main__.xxx syntax with - !ObjectName.zzz where zzz is the revision number of the Object obj - """ - - state = {} - state.update(list(obj.__dict__.items())) - state.update(list(obj.__class__.meta_attributes.items())) - name = obj.getObjectName() # obj.__class__.__name__ - revision = obj.getRevisionNumber() - return self.represent_mapping('!%s.%s' % (name, revision), state) - -# Dtypes to be stored as hex in YAML streams / strings -hex_dtypes = ['float', 'complex', 'half', 'single', 'double'] - -# Register hex constructors for the numpy / built-in dtypes: -dtypes = Lookup.numpy_dtypes - -# Inverse lookup for accessing tags given a class instance: -cls_dtypes = dict([(v,k) for (k,v) in list(dtypes.items())]) - -# Representer for numpy arrays: -def ndarray_representer(dumper, obj): - #if isinstance(obj, np.ndarray): - tag = 'dtype.'+obj.dtype.type.__name__ - hexlify = any([x in tag for x in hex_dtypes]) - np_ary = obj - #hex_ary = np.empty(np_ary.shape, dtype=yaml.nodes.ScalarNode) - np_flat, hex_flat = np_ary.flat, [] #hex_ary.flat - hex_flat.append(dumper.represent_sequence('tag:yaml.org,2002:seq', list(np_ary.shape), flow_style=True)) - if hexlify: - lst = [] - for i in range(len(np_flat)): - value = '%s'%(np_flat[i],) - node = dumper.represent_scalar('tag:yaml.org,2002:str', value, style='') - lst.append(node) - hex_flat.append(yaml.nodes.SequenceNode('tag:yaml.org,2002:seq', lst, flow_style=True)) - lst = [] - for i in range(len(np_flat)): - if hexlify: value = '%s'%(binascii.hexlify(np_flat[i]),) - else: value = '%s'%(np_flat[i],) - node = dumper.represent_scalar('tag:yaml.org,2002:str', value, style='') - if hexlify: lst.append(node) - else: hex_flat.append(node) - if hexlify: hex_flat.append(yaml.nodes.SequenceNode('tag:yaml.org,2002:seq', lst, flow_style=True)) - return yaml.nodes.SequenceNode('!%s'%(tag,), hex_flat, flow_style=True) -Dumper.add_representer(np.ndarray, ndarray_representer) - -# Constructor for ndarrays with arbitrary (specified) dtype: -def ndarray_constructor(loader, node, dtype, hexlify=False): - shape = loader.construct_sequence(node.value.pop(0)) - np_ary = np.empty(shape, dtype=dtype) - np_flat = np_ary.flat # Flat iterator - if hexlify: - node.value[1].tag = node.tag - node = node.value[1] # only look at hexlified values - for i in range(len(node.value)): - # Over-ride the 'tag:yaml.org,2002:str' tag with correct data type - node.value[i].tag = node.tag - value = loader.construct_object(node.value[i]) - #if hexlify: - # value = binascii.unhexlify(value) - # value = np.frombuffer(value, dtype=dtype) - np_flat[i] = value - return np_ary - -class __dtype_con: - - def __init__(self, tag): - # Whether or not to convert to hex: - hexlify = any([x in tag for x in hex_dtypes]) - dtype = dtypes[tag] - - # Mutable list containing constructor & representer info - self.fncn_attributes = [tag, hexlify, dtype] - - def dtype_constructor(loader, node): - tag, hexlify, dtype = self.fncn_attributes - if isinstance(node, yaml.nodes.SequenceNode): - return ndarray_constructor(loader, node, dtype, hexlify=hexlify) - else: # isinstance(node, yaml.nodes.ScalarNode): - value = loader.construct_scalar(node) - dtype = dtypes[node.tag[1:]] - if hexlify: - value = binascii.unhexlify(value) - value = np.frombuffer(value, dtype=dtype)[0] - else: - value = dtype(value) - return value - - def dtype_representer(dumper, obj): - tag, hexlify, dtype = self.fncn_attributes - if isinstance(obj, float): obj = np.float64(obj) - if hexlify: value = '%s'%(binascii.hexlify(obj),) - else: value = '%s'%(obj,) - try: tag = '!%s'%(cls_dtypes[obj.__class__]) # 'dtype.'+obj.__class__.__name__ # bullshit... - except KeyError: tag = '' - node = dumper.represent_scalar(tag, value, style='') - return node - - self.dtype_constructor = dtype_constructor - self.dtype_representer = dtype_representer - -keys = [x for x in list(dtypes.keys()) if x != 'dtype.int' and x != 'dtype.bool'] -print(keys) - -n = len(keys) -print(n) -i=0 - -for tag in keys: - dtype = __dtype_con(tag) - dtype_constructor = dtype.dtype_constructor - dtype_representer = dtype.dtype_representer - Loader.add_constructor('!%s'%(tag,), dtype_constructor) - Dumper.add_representer(dtypes[tag], dtype_representer) - -# Precision time constructors & representers: -def ns_rep(dumper, obj): - state = {'second': obj.__dict__['second'], 'nanosecond': obj.__dict__['nanosecond']} - return dumper.represent_mapping('!timestamp_ns', state) -def ps_rep(dumper, obj): - state = {'second': obj.__dict__['second'], 'picosecond': obj.__dict__['picosecond']} - return dumper.represent_mapping('!timestamp_ps', state) -def ns_con(loader, node): return PrecisionTime.nsTime(**loader.construct_mapping(node)) -def ps_con(loader, node): return PrecisionTime.psTime(**loader.construct_mapping(node)) - -Dumper.add_representer(PrecisionTime.nsTime, ns_rep) -Dumper.add_representer(PrecisionTime.psTime, ps_rep) -Loader.add_constructor('!timestamp_ns', ns_con) -Loader.add_constructor('!timestamp_nanosecond', ns_con) -Loader.add_constructor('!timestamp_ps', ps_con) -Loader.add_constructor('!timestamp_picosecond', ps_con) - -# Binary object constructor & representer: -def bin_rep(dumper, obj): return dumper.represent_mapping('!binary', obj.__dict__) -def bin_con(loader, node): return DynamicObject.Binary(**loader.construct_mapping(node)) -Dumper.add_representer(DynamicObject.Binary, bin_rep) -Loader.add_constructor('!binary', bin_con) diff --git a/schainpy/model/serializer/test/Lookup.py b/schainpy/model/serializer/test/Lookup.py deleted file mode 100644 index 9a5040e..0000000 --- a/schainpy/model/serializer/test/Lookup.py +++ /dev/null @@ -1,61 +0,0 @@ -''' -Helper module for DynamicObject module - contains dictionaries -of data types built-in to our YAML IDL, converting backing and forth between -strings / YAML tags and python class instances. - -$Id$ -''' - -import datetime -import numpy as np -import PrecisionTime -import DynamicObject -Binary = DynamicObject.Binary -import platform -import collections - -# Implicit Types: -python_dtypes = tuple([bool,int,int,float,str,datetime.datetime,list, - set,dict,tuple,str]) - -# Numpy Data-types: -numpy_dtypes = {'dtype.bool': bool, 'dtype.int': np.int, 'dtype.int8': np.int8, - 'dtype.int16': np.int16, 'dtype.int32': np.int32, 'dtype.int64': np.int64, - 'dtype.uint8': np.uint8, 'dtype.uint16': np.uint16, 'dtype.uint32': np.uint32, - 'dtype.uint64': np.uint64, 'dtype.float': np.float, 'dtype.float16': np.float16, - 'dtype.float32': np.float32, 'dtype.float64': np.float64, 'dtype.complex': np.complex, - 'dtype.complex64': np.complex64, 'dtype.complex128': np.complex128, - 'dtype.byte': np.byte, 'dtype.short': np.short, 'dtype.intc': np.intc, - 'dtype.longlong': np.longlong, 'dtype.intp': np.intp, 'dtype.ubyte': np.ubyte, - 'dtype.ushort': np.ushort, 'dtype.uintc': np.uintc, 'dtype.uint': np.uint, - 'dtype.uintc': np.uintc, 'dtype.uint': np.uint, 'dtype.ulonglong': np.ulonglong, - 'dtype.uintp': np.uintp, 'dtype.half': np.half, 'dtype.single': np.single, - 'dtype.double': np.double, 'dtype.longfloat': np.longfloat, - 'dtype.csingle': np.csingle, 'dtype.clongfloat': np.clongfloat, 'dtype.long': np.long} - -if platform.architecture()[0] != '32bit': # 64bit - certain numpy types exist - numpy_dtypes.update({'dtype.float128': np.float128, 'dtype.complex256': np.complex256}) - bit32 = False -else: - bit32 = True -#else: # 32 bit - fix 32 bit integer issue. -# np.int32 = np.int -# bit32 = True - -# Built-in objects: -builtin_objects = {'binary': Binary, 'nsTime': PrecisionTime.nsTime, 'psTime': PrecisionTime.psTime, - 'timestamp_ns': PrecisionTime.nsTime, 'timestamp_ps': PrecisionTime.psTime, - 'timestamp_nanosecond': PrecisionTime.nsTime, 'timestamp_picosecond': PrecisionTime.psTime, - 'datetime': datetime.datetime, 'Binary': Binary} - -builtin_objects_simple = {'nsTime': PrecisionTime.nsTime, 'psTime': PrecisionTime.psTime, - 'binary': Binary, 'datetime': datetime.datetime, - 'Binary': Binary} - -# Inverse lookup for accessing tags given a class instance: -cls_dtypes = dict([(v,k) for (k,v) in list(numpy_dtypes.items())]) -obj_dtypes = dict([(v,k) for (k,v) in list(builtin_objects_simple.items())]) - -# Pointer to the list of all Object classes created, as located in the Object module / class: -dynamicClasses = DynamicObject.Object.dynamicClasses - diff --git a/schainpy/model/serializer/test/OrderedYAML.py b/schainpy/model/serializer/test/OrderedYAML.py deleted file mode 100644 index 711fd4f..0000000 --- a/schainpy/model/serializer/test/OrderedYAML.py +++ /dev/null @@ -1,89 +0,0 @@ -''' -A YAML Loader and Dumper which provide ordered dictionaries in place -of dictionaries (to keep the order of attributes as -found in the original YAML object file). - -This module is modified from a submission on pyyaml.org: -http://pyyaml.org/attachment/ticket/161/use_ordered_dict.py - -$Id$ -''' - -import yaml -import collections - -class Loader(yaml.loader.Loader): - """ YAML Loader producing OrderedDicts in place of dicts """ - - def __init__(self, stream): - yaml.loader.Loader.__init__(self, stream) - - def construct_ordered_mapping(self, node, deep=False): - """ Replacement mapping constructor producing an OrderedDict """ - if not isinstance(node, yaml.MappingNode): - raise yaml.constructor.ConstructorError(None, None, - "expected a mapping node, but found %s" % node.id, - node.start_mark) - mapping = collections.OrderedDict() - for key_node, value_node in node.value: - key = self.construct_object(key_node, deep=deep) - if not isinstance(key, collections.Hashable): - raise yaml.constructor.ConstructorError("while constructing a mapping", node.start_mark, - "found unhashable key", key_node.start_mark) - value = self.construct_object(value_node, deep=deep) - mapping[key] = value - return mapping - # yaml.constructor.BaseConstructor.construct_mapping = construct_ordered_mapping - - def construct_mapping(self, node, deep=False): - return self.construct_ordered_mapping(node, deep=deep) - - def construct_yaml_map_with_ordered_dict(self, node): - data = collections.OrderedDict() - yield data - value = self.construct_mapping(node) - data.update(value) - -class Dumper(yaml.dumper.Dumper): - """ YAML Dumper producing documents from OrderedDicts """ - - def __init__(self, stream, *args, **kwargs): - yaml.dumper.Dumper.__init__(self, stream, *args, **kwargs) - - def represent_ordered_mapping(self, tag, mapping, flow_style=None): - """ Replacement mapping representer for OrderedDicts """ - value = [] - node = yaml.MappingNode(tag, value, flow_style=flow_style) - if self.alias_key is not None: - self.represented_objects[self.alias_key] = node - best_style = True - if hasattr(mapping, 'items'): - mapping = list(mapping.items()) - for item_key, item_value in mapping: - node_key = self.represent_data(item_key) - node_value = self.represent_data(item_value) - if not (isinstance(node_key, yaml.ScalarNode) and not node_key.style): - best_style = False - if not (isinstance(node_value, yaml.ScalarNode) and not node_value.style): - best_style = False - value.append((node_key, node_value)) - if flow_style is None: - if self.default_flow_style is not None: - node.flow_style = self.default_flow_style - else: - node.flow_style = best_style - return node - # yaml.representer.BaseRepresenter.represent_mapping = represent_ordered_mapping - - def represent_mapping(self, tag, mapping, flow_style=None): - return self.represent_ordered_mapping(tag, mapping, flow_style=flow_style) - -# Loader.add_constructor( -# u'tag:yaml.org,2002:map', -# Loader.construct_yaml_map_with_ordered_dict -# ) -# -# Dumper.add_representer( -# collections.OrderedDict, -# yaml.representer.SafeRepresenter.represent_dict -# ) diff --git a/schainpy/model/serializer/test/PrecisionTime.py b/schainpy/model/serializer/test/PrecisionTime.py deleted file mode 100644 index 7db41e5..0000000 --- a/schainpy/model/serializer/test/PrecisionTime.py +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/local/midas/bin/python - -"""PrecisionTime.py is a collection of python classes to manipulate times with high -precision using integer logic. - -Written by "Bill Rideout":mailto:wrideout@haystack.mit.edu May 24, 2007 - -$Id$ -""" -import types - -class nsTime: - """nsTime is a class to handle times given as UT second (integer) and nanosecond (integer) - - If nanosecond > 1E9, seconds will be added to second - """ - - def __init__(self, second, nanosecond): - self.second = int(second) - if self.second < 0: - raise ValueError('seconds must be greater than 0, not %i' % (self.second)) - nanosecond = int(nanosecond) - if nanosecond < 0: - raise ValueError('nanoseconds must be greater 0, not %i' % (nanosecond)) - addSec = nanosecond / 1000000000 - if addSec > 0: - self.second += addSec - self.nanosecond = nanosecond % 1000000000 - self.totalNS = int(self.nanosecond) + int(self.second) * 1000000000 - - - def __add__(self, other): - """__add__ another nsTime to this one and return a new one as result - """ - nsResult = self.nanosecond + other.nanosecond - addSec = int(nsResult / 1000000000) - newSec = self.second + other.second + addSec - newNS = nsResult % 1000000000 - return(nsTime(newSec, newNS)) - - - def increase(self, other): - """increase adds other to self, changing self (rather than creating a new object) - """ - nsResult = self.nanosecond + other.nanosecond - addSec = int(nsResult / 1000000000) - self.second = self.second + other.second + addSec - self.nanosecond = nsResult % 1000000000 - self.totalNS = int(self.nanosecond) + int(self.second) * 1000000000 - - - def __sub__(self, other): - """__sub__ another nsTime from this one and return a new one as result - """ - nsResult = self.nanosecond - other.nanosecond - if nsResult < 0: - addSec = 1 - nsResult += 1000000000 - else: - addSec = 0 - newSec = (self.second - other.second) - addSec - return(nsTime(newSec, nsResult)) - - - def multiply(self, factor): - """multiply this nsTime times an integer - """ - if type(factor) not in (int, int): - raise ValueError('Illegal type %s passed into nsTime.multiply' % (str(type(factor)))) - newTotalNS = self.totalNS * factor - newSeconds = int(newTotalNS / 1000000000) - newNanoseconds = int(newTotalNS - (newSeconds * 1000000000)) - return(nsTime(newSeconds, newNanoseconds)) - - - def integerDivision(self, other): - """integerDivision returns the total number of other nsTimes that fit in self - """ - return(int(self.totalNS / other.totalNS)) - - def getUnixTime(self): - """ getUnixTime() returns a Unix style time as a float. """ - return(float(self.second) + float(self.nanosecond)/1.0e9) - - def __mod__(self, other): - """__mod__ implements self % other. - """ - if type(other) in (int, int): - return self.totalNS % other - else: - return self.totalNS % other.totalNS - - def __eq__(self, other): - """ equality of two nsTime objects """ - if not (hasattr(other, 'second') and hasattr(other, 'nanosecond')): return False - return self.__cmp__(other) == 0 - - def __cmp__(self, other): - """compare two nsTime objects - """ - result = cmp(self.second, other.second) - if result != 0: - return(result) - - return(cmp(self.nanosecond, other.nanosecond)) - - - def __str__(self): - return '%d.%09d' % (self.second, self.nanosecond) - - -class psTime: - """psTime is a class to handle times given as UT second (integer) and picosecond (integer) - - If picosecond > 1E12, seconds will be added to second - """ - - def __init__(self, second, picosecond): - self.second = int(second) - if self.second < 0: - raise ValueError('seconds must be greater than 0, not %i' % (self.second)) - picosecond = int(picosecond) - if picosecond < 0: - raise ValueError('picoseconds must be greater 0, not %i' % (picosecond)) - addSec = picosecond / 1000000000000 - if addSec > 0: - self.second += addSec - self.picosecond = picosecond % 1000000000000 - self.totalPS = int(self.picosecond) + int(self.second) * 1000000000000 - - - def __add__(self, other): - """__add__ another psTime to this one and return a new one as result - """ - psResult = self.picosecond + other.picosecond - addSec = int(psResult / 1000000000000) - newSec = self.second + other.second + addSec - newPS = psResult % 1000000000000 - return(psTime(newSec, newPS)) - - - def increase(self, other): - """increase adds other to self, changing self (rather than creating a new object) - """ - psResult = self.picosecond + other.picosecond - addSec = int(psResult / 1000000000000) - self.second = self.second + other.second + addSec - self.picosecond = psResult % 1000000000000 - self.totalPS = int(self.picosecond) + int(self.second) * 1000000000000 - - - def __sub__(self, other): - """__sub__ another psTime from this one and return a new one as result - """ - psResult = self.picosecond - other.picosecond - if psResult < 0: - addSec = 1 - psResult += 1000000000000 - else: - addSec = 0 - newSec = (self.second - other.second) - addSec - return(psTime(newSec, psResult)) - - - def multiply(self, factor): - """multiply this psTime times an integer - """ - if type(factor) not in (int, int): - raise ValueError('Illegal type %s passed into psTime.multiply' % (str(type(factor)))) - newTotalPS = self.totalPS * factor - newSeconds = int(newTotalPS / 1000000000000) - newPicoseconds = int(newTotalPS - (newSeconds * 1000000000000)) - return(psTime(newSeconds, newPicoseconds)) - - - def integerDivision(self, other): - """integerDivision returns the total number of other psTimes that fit in self - """ - return(int(self.totalPS / other.totalPS)) - - def getUnixTime(self): - """ getUnixTime() returns a Unix style time as a float. """ - return(float(self.second) + float(self.picosecond)/1.0e12) - - def __mod__(self, other): - """__mod__ implements self % other. - """ - if type(other) in (int, int): - return self.totalPS % other - else: - return self.totalPS % other.totalPS - - def __eq__(self, other): - """ equality of two psTime objects """ - if not (hasattr(other, 'second') and hasattr(other, 'picosecond')): return False - return self.__cmp__(other) == 0 - - def __cmp__(self, other): - """compare two psTime objects - """ - result = cmp(self.second, other.second) - if result != 0: - return(result) - - return(cmp(self.picosecond, other.picosecond)) - - - def __str__(self): - return '%d.%12d' % (self.second, self.picosecond) - diff --git a/schainpy/model/serializer/test/Serializer.py b/schainpy/model/serializer/test/Serializer.py deleted file mode 100644 index 53fee8f..0000000 --- a/schainpy/model/serializer/test/Serializer.py +++ /dev/null @@ -1,372 +0,0 @@ -''' -Module containing classes with serialization and de-serialization services. - -$Id$ -''' - -import Lookup -import numpy as np -import zlib -import binascii -import yaml -import DynamicObject -import DynamicYAML -import PrecisionTime -import datetime -import re -import os -#import json -import jsonpickle -import jpickle -import h5py -import msgpack - -class CompressionException(Exception): pass - -class Serializer: - """ Base class for pickle-like serialization - of DynamicObjects (with compression available) """ - - def __init__(self): - pass - - def dump(self, obj, file_name, compression=None): - """ Dumps obj to file_name, serializing the obj with toSerial() """ - string = self.dumps(obj, compression) - open(file_name, 'w').write(string) - - def dumps(self, obj, compression=None): - """ Returns serialized string representing obj, using toSerial() to serialize """ - if compression == 'gzip': - return zlib.compress(self.toSerial(obj)) - elif compression in [None, '']: - return self.toSerial(obj) - else: - raise CompressionException("Invalid decompression type '%r'"%(compression,)) - - def load(self, file_name, compression=None): - """ Returns the Object located in file_name, using fromSerial() to deserialize """ - string = open(file_name, 'r').read() - return self.loads(string, compression) - - def loads(self, string, compression=None): - """ Returns the Object serialized as the given string """ - if compression == 'gzip': - return self.fromSerial(zlib.decompress(string)) - elif compression in [None, '']: - return self.fromSerial(string) - else: - raise CompressionException("Invalid compression type '%r'"%(compression,)) - - def fromSerial(self, string): - """ Deserializes the given string """ - return string - - def toSerial(self, obj): - """ Serializes the given object """ - return repr(obj) - -class YAMLSerializer(Serializer): - """ Serializes a Object to/from YAML format """ - - def __init__(self): - Serializer.__init__(self) - - def fromSerial(self, string): - loader = DynamicYAML.Loader - return yaml.load(string, Loader=loader) - - def toSerial(self, obj): - dumper = DynamicYAML.Dumper - return yaml.dump(obj, Dumper=dumper) - -# Regular expression taken from yaml.constructor.py -timestamp_regexp_str = str(\ - r'^(?P[0-9][0-9][0-9][0-9])' - r'-(?P[0-9][0-9]?)' - r'-(?P[0-9][0-9]?)' - r'(?:(?:[Tt]|[ \t]+)' - r'(?P[0-9][0-9]?)' - r':(?P[0-9][0-9])' - r':(?P[0-9][0-9])' - r'(?:\.(?P[0-9]*))?' - r'(?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?)' - r'(?::(?P[0-9][0-9]))?))?)?$') -timestamp_regexp = re.compile(timestamp_regexp_str, re.X) - -def construct_timestamp(value): - """ Taken & modified from yaml.constructor.py """ - - match = timestamp_regexp.match(value) - #print "&%s&"%(value,) - #print timestamp_regexp_str - values = match.groupdict() - year = int(values['year']) - month = int(values['month']) - day = int(values['day']) - if not values['hour']: - return datetime.date(year, month, day) - hour = int(values['hour']) - minute = int(values['minute']) - second = int(values['second']) - fraction = 0 - if values['fraction']: - fraction = values['fraction'][:6] - while len(fraction) < 6: - fraction += '0' - fraction = int(fraction) - delta = None - if values['tz_sign']: - tz_hour = int(values['tz_hour']) - tz_minute = int(values['tz_minute'] or 0) - delta = datetime.timedelta(hours=tz_hour, minutes=tz_minute) - if values['tz_sign'] == '-': - delta = -delta - data = datetime.datetime(year, month, day, hour, minute, second, fraction) - if delta: - data -= delta - return data - -class MessagePackSerializer(Serializer): - """ Serializes a Object to/from MessagePack format """ - - def __fromSerial(self, msg_dict): - if not isinstance(msg_dict, (dict, list, tuple)): - return msg_dict # msg_dict is a value - return it - if isinstance(msg_dict, dict) and '__meta_attributes' in msg_dict: - meta_attr = msg_dict['__meta_attributes'] - msg_dict.pop('__meta_attributes') - if 'type' in meta_attr: - if meta_attr['type'] == 'datetime': - return construct_timestamp(str(msg_dict['ts'])) - elif meta_attr['type'] == 'nsTime': - msg_dict.pop('totalNS') - elif meta_attr['type'] == 'psTime': - msg_dict.pop('totalPS') - try: dtype = Lookup.cls_dtypes[meta_attr['type']] - except KeyError: dtype = Lookup.builtin_objects[meta_attr['type']] - return dtype(**msg_dict) - else: - for key in list(msg_dict.keys()): - msg_dict[key] = self.__fromSerial(msg_dict[key]) - cls = Lookup.dynamicClasses['%s.%s'%(meta_attr['__object_name'],meta_attr['__revision_number'])] - return cls(**msg_dict) - elif msg_dict == (): - return [] - elif isinstance(msg_dict[0], str) and msg_dict[1] in Lookup.numpy_dtypes and\ - isinstance(msg_dict, tuple) and len(msg_dict) == 2: - value = binascii.unhexlify(msg_dict[0]) - return np.frombuffer(value, dtype=Lookup.numpy_dtypes[msg_dict[1]])[0] - - tup = isinstance(msg_dict, tuple) - if tup and len(msg_dict) > 1 and msg_dict[0] in list(Lookup.numpy_dtypes.keys()): - msg_flat = list(msg_dict) - dtypeName = msg_flat.pop(0) - dtype = Lookup.numpy_dtypes[dtypeName] - shape = msg_flat.pop(0) - obj = np.empty(shape, dtype=dtype) - np_flat = obj.flat - for i in range(len(np_flat)): - if isinstance(msg_flat[i], float): - value = msg_flat[i] - else: - value = self.__fromSerial((msg_flat[i], dtypeName)) - np_flat[i] = value - return obj - else: - return msg_dict - - def fromSerial(self, string): - msg_dict = msgpack.unpackb(string) - return self.__fromSerial(msg_dict) - - def __toSerial(self, obj): - - if isinstance(obj, (PrecisionTime.nsTime, PrecisionTime.psTime, DynamicObject.Binary, datetime.datetime)): - msg_dict = {} - if isinstance(obj, datetime.datetime): - msg_dict['ts'] = obj.isoformat(' ') - else: - msg_dict.update(obj.__dict__) - msg_dict['__meta_attributes'] = {'type': obj.__class__.__name__} - return msg_dict - elif isinstance(obj, DynamicObject.Object): - msg_dict = {} - for key, value in list(obj.__dict__.items()): - msg_dict[key] = self.__toSerial(value) - - msg_dict['__meta_attributes'] = obj.__class__.meta_attributes - return msg_dict - elif isinstance(obj, np.ndarray): - np_flat = obj.flat - msg_flat = [] - msg_flat.append(Lookup.cls_dtypes[obj.dtype.type]) # dtype is first element - msg_flat.append(obj.shape) # shape of array is second element - for i in range(len(np_flat)): - toSer = self.__toSerial(np_flat[i]) - if isinstance(toSer, tuple): - msg_flat.append(toSer[0]) - else: - msg_flat.append(toSer) - return list(msg_flat) - - is_builtin = obj.__class__ in list(Lookup.numpy_dtypes.values()) - #is_python = isinstance(obj, Lookup.python_dtypes) - if is_builtin: # and not is_python: - try: - #print obj.__class__ - msg_dict = (binascii.hexlify(obj), Lookup.cls_dtypes[obj.__class__]) - return msg_dict - except TypeError: # numpy dtype is a built-in python type... force the hexlify: - if not Lookup.bit32: - if obj.__class__ == int: return (binascii.hexlify(np.int64(obj)), 'dtype.int64') - elif obj.__class__ == float: return (binascii.hexlify(np.float64(obj)), 'dtype.float64') - else: - #print np.int32(obj).__class__, obj.__class__ - if obj.__class__ == int: return (binascii.hexlify(np.int32(obj)), 'dtype.int32') - elif obj.__class__ == float: return (binascii.hexlify(np.float32(obj)), 'dtype.float32') - raise - else: - return obj - - def toSerial(self, obj): - #if Lookup.bit32 and np.int32 != np.int: np.int32 = np.int - toSer = self.__toSerial(obj) - #print toSer - value = msgpack.packb(toSer) - return value - -class HDF5Serializer(Serializer): - """ Serializes a Object to/from HDF5 format """ - - tmp_num = 0 - - def __fromSerial(self, grp): - - if isinstance(grp, h5py.Dataset): - return grp.value - - elif isinstance(grp, h5py.Group) and '__type' in list(grp.keys()): - typ = grp['__type'].value - if typ == 'datetime': - return construct_timestamp(str(grp['ts'].value)) - elif typ == '_null': - return None - elif typ == 'tuple': - return tuple(grp['tuple']) - elif typ == 'empty_list': - return [] - try: cls = Lookup.builtin_objects_simple[typ] - except KeyError: cls = Lookup.dynamicClasses[typ] - args = [] - for key in list(grp.keys()): - fromSer = self.__fromSerial(grp[key]) - args.append((key, fromSer)) - kwargs = dict(args) - kwargs.pop('__type') - return cls(**kwargs) - #else: - # return grp.value - - - def fromSerial(self, string): - HDF5Serializer.tmp_num += 1 - fn = 'tmp%d.hdf5'%(HDF5Serializer.tmp_num-1,) - fp = open(fn, 'wb') - fp.write(string) - fp.flush(), fp.close() - - root = h5py.File(fn, driver='core') - try: - fromSer = self.__fromSerial(root['dataset']) - except: - root.flush(), root.close() - os.remove(fn) - raise - - root.flush(), root.close() - os.remove(fn) - - return fromSer - - def __toSerial(self, obj, grp, name): - - if isinstance(obj, datetime.datetime): - sub_grp = grp.create_group(name) - sub_grp['__type'] = 'datetime' - sub_grp['ts'] = obj.isoformat(' ') - - elif isinstance(obj, tuple(Lookup.builtin_objects_simple.values())): - sub_grp = grp.create_group(name) - sub_grp['__type'] = Lookup.obj_dtypes[obj.__class__] - for key, value in list(obj.__dict__.items()): - if value != None and key not in ['totalNS', 'totalPS']: - sub_grp[key] = value - - elif obj == None: - sub_grp = grp.create_group(name) - sub_grp['__type'] = '_null' - - elif isinstance(obj, DynamicObject.Object): - # Create the new group and assign unique identifier for this type of DynamicObject - sub_grp = grp.create_group(name) - tag = '%s.%s'%(obj.getObjectName(), obj.getRevisionNumber()) - sub_grp['__type'] = tag - # Put all of the DynamicObject's attributes into the new h5py group - for key, value in list(obj.__dict__.items()): - self.__toSerial(value, sub_grp, key) - - elif isinstance(obj, tuple): - sub_grp = grp.create_group(name) - sub_grp['__type'] = 'tuple' - sub_grp['tuple'] = obj - - elif isinstance(obj, list) and len(obj) == 0: - sub_grp = grp.create_group(name) - sub_grp['__type'] = 'empty_list' - - else: - grp[name] = obj - - def toSerial(self, obj): - HDF5Serializer.tmp_num += 1 - fn = 'tmp%d.hdf5'%(HDF5Serializer.tmp_num,) - root = h5py.File(fn, driver='core') - try: - self.__toSerial(obj, root, 'dataset') - except: - root.flush(), root.close() - os.remove(fn) - raise - root.flush(), root.close() - - fp = open(fn, 'rb') - msg = fp.read() - fp.close() - os.remove(fn) - - return msg - -# Alias for the standard json serializer: -class jsonSerializer(Serializer): - def fromSerial(self, string): - #return json.loads(string) - return jsonpickle.decode(string) - def toSerial(self, string): - #return json.dumps(string) - return jsonpickle.encode(string, max_depth=500) - -# Dict mapping from .serializer type to corresponding class object: -serializers = {'yaml': YAMLSerializer, - 'msgpack': MessagePackSerializer, - 'hdf5': HDF5Serializer, - 'json': jsonSerializer} - -instances = {'yaml': YAMLSerializer(), - 'msgpack': MessagePackSerializer(), - 'hdf5': HDF5Serializer(), - 'json': jsonSerializer()} - -serial_types = dict([(v,u) for u,v in list(serializers.items())]) - -compression_types = ['gzip', ''] diff --git a/schainpy/model/serializer/test/__init__.py b/schainpy/model/serializer/test/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/schainpy/model/serializer/test/__init__.py +++ /dev/null diff --git a/schainpy/model/serializer/test/serialtest.py b/schainpy/model/serializer/test/serialtest.py deleted file mode 100644 index 577c4bd..0000000 --- a/schainpy/model/serializer/test/serialtest.py +++ /dev/null @@ -1,186 +0,0 @@ - -# -# when Serializer is imported alone, fault indicates this package is -# dependent on lookup, but don't import Lookup, instead: -# -import DynamicObject # dependent on pysvn -import Serializer # dependent on Dynamic Object - -import msgpack -import redis - -import numpy as np - -class NamedObject(): - - #--------------------------------------------- - @staticmethod - def indexListMatch(list_of_lists, name, value, name2=None, value2=None, unique_f=False): - # - # for each list's attribute compare with value - # if match, return True plus list - # else return False plus empty list - # - # search needs to be named part of class for object else . is unrecognized - # - # unique_f finds non-uniqueness - - - index = [] # return empty indices - list_data = [] # return empty list - ii = 0 - for theList in list_of_lists: - - cmd0 = "theList.%s == value" % (name) - cmd1 = "isInlist(theList.%s,value)" % name - # if name is valid then - # match name against value - # match name (as list) against value - if (eval(cmd0) or eval(cmd1)): - if (name2 != None): - cmd2 = "theList.%s == value2" % name2 - cmd3 = "isInlist(theList.%s,value2)" % name2 - if (eval(cmd2) or eval(cmd3)): - if (unique_f): - index = index + [ii] - list_data = list_data + [theList] # save list of lists if non-unique - # don't exit on match, may be non-unique - else: - list_data = theList # save the list - index = [ii] - break - else: - if (unique_f): - index = index + [ii] - list_data = list_data + [theList] # list of lists if non-unique - else: - list_data = theList - index = [ii] - break # exit on match - #endif - ii = ii + 1 - #end for - - return index, list_data # return indices of matches and list (or list of lists) - - #end indexListMatch - - #--------------------------------------------- - @staticmethod - def namedListMatch(list_of_lists, name, value, name2=None, value2=None, unique_f=None): - # - # for each list's attribute compare with value - # if match, return True plus list - # else return False plus empty list - # - # search needs to be named part of class for object else . is unrecognized - # - # unique_f finds non-uniqueness ('None' is same as False) - - match_f = False - list_data = [] # initialize - - for theList in list_of_lists: - - cmd0 = "theList.%s == value" % (name) - cmd1 = "isInlist(theList.%s,value)" % name - # if name is valid then - # match name against value - # match name (as list) against value - if (eval(cmd0) or eval(cmd1)): - if (name2 != None): - cmd2 = "theList.%s == value2" % name2 - cmd3 = "isInlist(theList.%s,value2)" % name2 - if (eval(cmd2) or eval(cmd3)): - match_f = True - if (unique_f): - list_data = list_data + [theList] # save list of lists if non-unique - # don't exit on match, may be non-unique - else: - list_data = theList # save the list - break - else: - match_f = True - if (unique_f): - list_data = list_data + [theList] # list of lists if non-unique - else: - list_data = theList - break # exit on match - #endif - #end for - - return match_f, list_data # return match, and list (or list of lists) - - #end namedListMatch - - #--------------------------------------------- - @staticmethod - def combineLists(object): - # - # used for dumping elements in list of lists for debugging - # - ret_list =[] - ii = 0 - while ii < len(object): - ret_list = ret_list + [object[ii].list] # not a real list, so can't use built-in list iterator - ii = ii + 1 - return ret_list - - # end combineLists - - - -class StateListObject(NamedObject): - def __init__(self, concurrent=None, hierarchical=None, history=None, state=None): - self.concurrent = concurrent - self.hierarchical = hierarchical - self.history = history - self.state = state - self.list = [self.concurrent, self.hierarchical, self.history, self.state ] -#end class StateListObject - -source_object = "my test string" - -serializer = "yaml" -# -# python versioning issue (ver 2.7 -> else path) -# -if isinstance(serializer,Serializer.Serializer): - serial_type = Serializer.serial_types[serializer] -else: - serial_type = serializer - serializer = Serializer.serializers[serializer]() - - - -datastr = serializer.toSerial(source_object) - -dest_object = serializer.fromSerial(datastr) - -print("dest_object=",dest_object) - -myObject = StateListObject(hierarchical="yes",state=np.array([1,2,3.0])) - -datastr = serializer.toSerial(myObject) - -packed = msgpack.packb(datastr) - -try: - r= redis.StrictRedis(host='localhost',port=6379,db=0) -except Exception as eobj: - print("is the redis server running?",eobj) -else: - - r.set('baz',packed) # converts to string - x = r.get('baz') - -unpacked = msgpack.unpackb(x) - -dest_object = serializer.fromSerial(unpacked) - -print("val1=",dest_object.hierarchical) -val2 = dest_object.state -print("val2=",val2) -# can numpy array be used as array? -print(val2.shape) - diff --git a/schainpy/model/serializer/test/test _serializer_speed.py b/schainpy/model/serializer/test/test _serializer_speed.py deleted file mode 100644 index 5b891d3..0000000 --- a/schainpy/model/serializer/test/test _serializer_speed.py +++ /dev/null @@ -1,175 +0,0 @@ -''' -Created on Jul 16, 2014 - -@author: roj-idl71 -''' -""" -Dependencies: - - pip install tabulate simplejson python-cjson ujson yajl msgpack-python - -""" - -from timeit import timeit -from tabulate import tabulate - -setup = '''d = { - 'words': """ - Lorem ipsum dolor sit amet, consectetur adipiscing - elit. Mauris adipiscing adipiscing placerat. - Vestibulum augue augue, - pellentesque quis sollicitudin id, adipiscing. - """, - 'boolean' : False, - 'list': range(10), - 'dict': dict((str(i),'a') for i in xrange(10)), - 'int': 100, - 'float': 100.123456, -}''' - -setup = '''import numpy; -import datetime; -d = { - 'words': """ - Lorem ipsum dolor sit amet, consectetur adipiscing - elit. Mauris adipiscing adipiscing placerat. - Vestibulum augue augue, - pellentesque quis sollicitudin id, adipiscing. - """, - 'boolean' : False, - 'list': range(10), - 'dict': dict((str(i),'a') for i in xrange(10)), - 'int': 100, - 'float': 100.123456, - 'datetime' : datetime.datetime(2001,1,1,10,10,10) -}''' - - -setup_pickle = '%s ; import pickle ; src = pickle.dumps(d)' % setup -setup_pickle2 = '%s ; import pickle ; src = pickle.dumps(d, 2)' % setup -setup_cpickle = '%s ; import cPickle ; src = cPickle.dumps(d)' % setup -setup_cpickle2 = '%s ; import cPickle ; src = cPickle.dumps(d, 2)' % setup -setup_json = '%s ; import json; src = json.dumps(d)' % setup -setup_ujson = '%s ; import ujson; src = ujson.encode(d)' % setup -setup_cjson = '%s ; import cjson; src = cjson.encode(d)' % setup -setup_simplejson = '%s ; import simplejson; src = simplejson.dump(d)' % setup -setup_jsonpickle = '%s ; import jsonpickle; src = jsonpickle.encode(d)' % setup -setup_yaml = '%s ; import yaml; src = yaml.dump(d)' % setup -setup_msgpack = '%s ; import msgpack; src = msgpack.dumps(d)' % setup -setup_msgpack_np = '%s; import msgpack_numpy as msgpack; src = msgpack.dumps(d)' % setup - -tests = [ - # (title, setup, enc_test, dec_test, result) - ('cPickle (binary)', 'import cPickle; %s' % setup_cpickle2, 'cPickle.dumps(d, 2)', 'r = cPickle.loads(src)', 'print r'), - ('cPickle (ascii)', 'import cPickle; %s' % setup_cpickle, 'cPickle.dumps(d, 0)', 'r = cPickle.loads(src)', 'print r'), - ('pickle (binary)', 'import pickle; %s' % setup_pickle2, 'pickle.dumps(d, 2)', 'r = pickle.loads(src)', 'print r'), - ('pickle (ascii)', 'import pickle; %s' % setup_pickle, 'pickle.dumps(d, 0)', 'r = pickle.loads(src)', 'print r'), - ('jsonpickle', 'import jsonpickle; %s' % setup_jsonpickle, 'jsonpickle.encode(d)', 'r = jsonpickle.decode(src)', 'print r'), -# ('msgpack-numpy-python', '%s' % setup_msgpack_np, 'msgpack.dumps(d)', 'r = msgpack.loads(src)', 'print r'), - ('ujson', 'import ujson; %s' % setup_ujson, 'ujson.encode(d)', 'r = ujson.decode(src)', 'print r'), -# ('msgpack-python', 'import msgpack; %s' % setup_msgpack, 'msgpack.dumps(d)', 'r = msgpack.loads(src)', 'print r'), -# ('json', 'import json; %s' % setup_json, 'json.dumps(d)', 'r = json.loads(src)', 'print r'), -# ('python-cjson-1.0.5', 'import cjson; %s' % setup_cjson, 'cjson.encode(d)', 'r = cjson.decode(src)', 'print r'), -# ('simplejson-3.3.1', 'import simplejson; %s' % setup_json, 'simplejson.dumps(d)', 'r = simplejson.loads(src)', 'print r'), - ('yaml', 'import yaml; %s' % setup_yaml, 'yaml.dump(d)', 'r = yaml.load(src)', 'print r'), -] - -loops = 1 -enc_table = [] -dec_table = [] - -print "Running tests (%d loops each)" % loops - -for title, mod, enc, dec, msg in tests: - print title - - ### Getting the package size - exec mod - size = len("".join(src)) - - print " [Encode]", enc - result = timeit(enc, mod, number=loops) - enc_table.append([title, result, size]) - - print " [Decode]", dec - result = timeit(dec, mod, number=loops) - dec_table.append([title, result]) - - print " Result" - result = timeit(msg, mod+';'+dec, number=1) - -enc_table.sort(key=lambda x: x[1]) -enc_table.insert(0, ['Package', 'Seconds', 'Size']) - -dec_table.sort(key=lambda x: x[1]) -dec_table.insert(0, ['Package', 'Seconds']) - -print "\nEncoding Test (%d loops)" % loops -print tabulate(enc_table, headers="firstrow") - -print "\nDecoding Test (%d loops)" % loops -print tabulate(dec_table, headers="firstrow") - -""" -OUTPUT: - -Running tests (15000 loops each) -pickle (ascii) - [Encode] pickle.dumps(d, 0) - [Decode] pickle.loads(src) -pickle (binary) - [Encode] pickle.dumps(d, 2) - [Decode] pickle.loads(src) -cPickle (ascii) - [Encode] cPickle.dumps(d, 0) - [Decode] cPickle.loads(src) -cPickle (binary) - [Encode] cPickle.dumps(d, 2) - [Decode] cPickle.loads(src) -json - [Encode] json.dumps(d) - [Decode] json.loads(src) -simplejson-3.3.1 - [Encode] simplejson.dumps(d) - [Decode] simplejson.loads(src) -python-cjson-1.0.5 - [Encode] cjson.encode(d) - [Decode] cjson.decode(src) -ujson-1.33 - [Encode] ujson.dumps(d) - [Decode] ujson.loads(src) -yajl 0.3.5 - [Encode] yajl.dumps(d) - [Decode] yajl.loads(src) -msgpack-python-0.3.0 - [Encode] msgpack.dumps(d) - [Decode] msgpack.loads(src) - -Encoding Test (15000 loops) -Package Seconds --------------------- --------- -ujson-1.33 0.232215 -msgpack-python-0.3.0 0.241945 -cPickle (binary) 0.305273 -yajl 0.3.5 0.634148 -python-cjson-1.0.5 0.680604 -json 0.780438 -simplejson-3.3.1 1.04763 -cPickle (ascii) 1.62062 -pickle (ascii) 14.0497 -pickle (binary) 15.4712 - -Decoding Test (15000 loops) -Package Seconds --------------------- --------- -msgpack-python-0.3.0 0.240885 -cPickle (binary) 0.393152 -ujson-1.33 0.396875 -python-cjson-1.0.5 0.694321 -yajl 0.3.5 0.748369 -simplejson-3.3.1 0.780531 -cPickle (ascii) 1.38561 -json 1.65921 -pickle (binary) 5.20554 -pickle (ascii) 17.8767 -""" \ No newline at end of file diff --git a/schainpy/model/utils/jroutils_ftp.py b/schainpy/model/utils/jroutils_ftp.py index dceb206..49d1e54 100644 --- a/schainpy/model/utils/jroutils_ftp.py +++ b/schainpy/model/utils/jroutils_ftp.py @@ -9,7 +9,7 @@ try: import paramiko import scp except: - print("You should install paramiko and scp libraries \nif you want to use SSH protocol to upload files to the server") + pass import time diff --git a/schainpy/model/utils/jroutils_publish.py b/schainpy/model/utils/jroutils_publish.py index 44a52a5..6c22052 100644 --- a/schainpy/model/utils/jroutils_publish.py +++ b/schainpy/model/utils/jroutils_publish.py @@ -1,6 +1,9 @@ -''' -@author: Juan C. Espinoza -''' +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""Utilities for publish/send data, files & plots over different protocols +""" import os import glob @@ -18,8 +21,6 @@ from schainpy.model.proc.jroproc_base import Operation, ProcessingUnit, MPDecora from schainpy.model.data.jrodata import JROData from schainpy.utils import log -MAXNUMX = 500 -MAXNUMY = 500 PLOT_CODES = { 'rti': 0, # Range time intensity (RTI). @@ -52,11 +53,6 @@ def get_plot_code(s): else: return 24 -def decimate(z, MAXNUMY): - dy = int(len(z[0])/MAXNUMY) + 1 - - return z[::, ::dy] - class PublishData(Operation): ''' @@ -150,11 +146,46 @@ class ReceiverData(ProcessingUnit): @MPDecorator class SendToFTP(Operation): - - ''' - Operation to send data over FTP. - patternX = 'local, remote, ext, period, exp_code, sub_exp_code' - ''' + """Operation for send files over FTP + + This operation is used to send files over FTP, you can send different files + from different folders by adding as many `pattern` as you wish. + + Parameters: + ----------- + server : str + FTP server address. + username : str + FTP username + password : str + FTP password + timeout : int + timeout to restart the connection + patternX : list + detail of files to be send must have the following order: local, remote + ext, period, exp_code, sub_exp_code + + Example: + -------- + + ftp = proc_unit.addOperation(name='SendToFTP', optype='external') + ftp.addParameter(name='server', value='jro-app.igp.gob.pe') + ftp.addParameter(name='username', value='wmaster') + ftp.addParameter(name='password', value='mst2010vhf') + ftp.addParameter( + name='pattern1', + value='/local/path/rti,/remote/path,png,300,11,0' + ) + ftp.addParameter( + name='pattern2', + value='/local/path/spc,/remote/path,png,300,11,0' + ) + ftp.addParameter( + name='pattern3', + value='/local/path/param,/remote/path,hdf5,300,,' + ) + + """ __attrs__ = ['server', 'username', 'password', 'timeout', 'patternX'] @@ -164,6 +195,7 @@ class SendToFTP(Operation): Operation.__init__(self) self.ftp = None self.ready = False + self.current_time = time.time() def setup(self, server, username, password, timeout, **kwargs): ''' @@ -179,7 +211,7 @@ class SendToFTP(Operation): for arg, value in kwargs.items(): if 'pattern' in arg: self.patterns.append(value) - self.times.append(time.time()) + self.times.append(0) self.latest.append('') def connect(self): @@ -188,7 +220,7 @@ class SendToFTP(Operation): log.log('Connecting to ftp://{}'.format(self.server), self.name) try: - self.ftp = ftplib.FTP(self.server, timeout=self.timeout) + self.ftp = ftplib.FTP(self.server, timeout=1) except ftplib.all_errors: log.error('Server connection fail: {}'.format(self.server), self.name) if self.ftp is not None: @@ -214,6 +246,11 @@ class SendToFTP(Operation): def check(self): try: + if not self.ready: + if time.time()-self.current_time < self.timeout: + return + else: + self.current_time = time.time() self.ftp.voidcmd("NOOP") except: log.warning('Connection lost... trying to reconnect', self.name) @@ -224,7 +261,7 @@ class SendToFTP(Operation): def find_files(self, path, ext): - files = glob.glob1(path, '*{}'.format(ext)) + files = glob.glob1(path.strip(), '*{}'.format(ext.strip())) files.sort() if files: return files[-1] @@ -256,18 +293,12 @@ class SendToFTP(Operation): self.ftp.storbinary(command, fp, blocksize=1024) except Exception as e: log.error('{}'.format(e), self.name) - if self.ftp is not None: - self.ftp.close() - self.ftp = None return 0 try: self.ftp.sendcmd('SITE CHMOD 755 {}'.format(dst)) except Exception as e: log.error('{}'.format(e), self.name) - if self.ftp is not None: - self.ftp.close() - self.ftp = None return 0 fp.close() @@ -278,32 +309,32 @@ class SendToFTP(Operation): for x, pattern in enumerate(self.patterns): local, remote, ext, period, exp_code, sub_exp_code = pattern - if time.time()-self.times[x] >= int(period): - srcname = self.find_files(local, ext) - src = os.path.join(local, srcname) - if os.path.getmtime(src) < time.time() - 30*60: - log.warning('Skipping old file {}'.format(srcname)) - continue - - if srcname is None or srcname == self.latest[x]: - log.warning('File alreday uploaded {}'.format(srcname)) - continue - - if 'png' in ext: - dstname = self.getftpname(srcname, int(exp_code), int(sub_exp_code)) - else: - dstname = srcname - dst = os.path.join(remote, dstname) + if (self.dataOut.utctime - self.times[x]) < int(period): + continue - if self.upload(src, dst): - self.times[x] = time.time() - self.latest[x] = srcname - else: - self.ready = False - break + srcname = self.find_files(local, ext) + + if srcname is None: + continue + + if srcname == self.latest[x]: + log.warning('File alreday uploaded {}'.format(srcname)) + continue + + if exp_code.strip(): + dstname = self.getftpname(srcname, int(exp_code), int(sub_exp_code)) + else: + dstname = srcname - def run(self, dataOut, server, username, password, timeout=10, **kwargs): + src = os.path.join(local, srcname) + dst = os.path.join(remote.strip(), dstname) + + if self.upload(src, dst): + self.times[x] = self.dataOut.utctime + self.latest[x] = srcname + + def run(self, dataOut, server, username, password, timeout=60, **kwargs): if not self.isConfig: self.setup( @@ -314,10 +345,11 @@ class SendToFTP(Operation): **kwargs ) self.isConfig = True - if not self.ready: self.connect() - if self.ftp is not None: - self.check() + + self.dataOut = dataOut + self.check() + if self.ready: self.send_files() def close(self): diff --git a/schainpy/scripts/OnlineAmisrSim.sh b/schainpy/scripts/OnlineAmisrSim.sh new file mode 100755 index 0000000..e96ccc5 --- /dev/null +++ b/schainpy/scripts/OnlineAmisrSim.sh @@ -0,0 +1,25 @@ +#!/bin/bash +#source ~/virtuals/virtual_schain3x/bin/activate +echo "Amisr EEJ Online simulation" + +PATH_IN=/home/soporte/dataAMISR/20191216.001/ +PATH_OUT=/home/soporte/dataAMISR_test/20191216.001/ +count=0 +for f in $PATH_IN* +do + if [ ${f: -3} == ".h5" ] + then + echo "coping $f" + cp ${f} $PATH_OUT + sleep 5m #it takes about 5 minutes to generate new data in AMISR radar + fi + ((count=count+1)) + + if [ $count -eq 21 ] #only transfer 20 files + then + echo " finish simulation" + break + fi +done + + diff --git a/schainpy/scripts/OnlineAmisrSim2.sh b/schainpy/scripts/OnlineAmisrSim2.sh new file mode 100755 index 0000000..8805273 --- /dev/null +++ b/schainpy/scripts/OnlineAmisrSim2.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +echo "Amisr ESF Online simulation" + +PATH_IN=/home/soporte/dataAMISR/20191217.003/ +PATH_OUT=/home/soporte/dataAMISR_test/20191217.003/ +count=0 +for f in $PATH_IN* +do + if [ ${f: -3} == ".h5" ] + then + echo "coping $f" + cp ${f} $PATH_OUT + sleep 5m #it takes about 5 minutes to generate new data in AMISR radar + fi + ((count=count+1)) + + if [ $count -eq 21 ] #only transfer 20 files + then + echo " finish simulation" + break + fi +done + + diff --git a/schainpy/scripts/amisr_eej_proc_offline_v3.py b/schainpy/scripts/amisr_eej_proc_offline_v3.py new file mode 100644 index 0000000..152cf9a --- /dev/null +++ b/schainpy/scripts/amisr_eej_proc_offline_v3.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +def main(): + + + desc = "AMISR EEJ Experiment" + filename = "amisr_reader.xml" + xmin = '07' + xmax = '18' #-> el plot genera +1 en la hora, es decir aparece 18 como máximo + ymin = '0' + ymax = '300' + dbmin = '45' #'60'#'55' #'40' #noise esf eej + dbmax = '65' #'70' #'55' + showSPC = '0' #view plot Spectra + showRTI = '0' #view plot RTI + showNOISE = '0' #view plot NOISE + localtime='0' #para ajustar el horario en las gráficas '0' para dejar en utc + code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' + nCode = '1' + nBaud = '28' + nosamp = '1' # oversample for EEJ + today = time.strftime("%Y/%m/%d") + #startDate=today + #endDate=today + startDate='2019/12/16' + endDate='2019/12/16' + #inPath= '/home/soporte/dataAMISR_test/' + inPath= '/home/soporte/dataAMISR/' + #inPath = '/mnt/data_amisr' + outPath = '/home/soporte/Data/EEJ' + + ##....................................................................................... + ##....................................................................................... + + #l = startDate.split('/') #adding day of the year to outPath + l = startDate.split('/') + datelist = datetime.date(int(l[0]),int(l[1]),int(l[2])) + DOY = datelist.timetuple().tm_yday + outPath= outPath+"/EEJ"+l[0]+str(DOY) + if os.path.exists(outPath): + print("outPath", outPath) + else : + os.mkdir(outPath) + print("Creating...", outPath) + + ##....................................................................................... + ##....................................................................................... + controllerObj = Project() + controllerObj.setup(id = '11', name='eej_proc', description=desc) + ##....................................................................................... + ##....................................................................................... + readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=inPath, + startDate=startDate,#startDate, #'2014/10/07', + endDate=endDate, #endDate '2014/10/07', + startTime='07:01:30',#'07:00:00', + endTime='19:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='ut', + online=0) + + #AMISR Processing Unit + ##....................................................................................... + ##....................................................................................... + procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + opObj10 = procUnitConfObj0.addOperation(name='setRadarFrequency') + opObj10.addParameter(name='frequency', value='445e6', format='float') + + + opObj01 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + opObj01.addParameter(name='code', value=code, format='floatlist') + opObj01.addParameter(name='nCode', value=nCode, format='int') + opObj01.addParameter(name='nBaud', value=nBaud, format='int') + opObj01.addParameter(name='osamp', value=nosamp, format='int') + + + opObj02 = procUnitConfObj0.addOperation(name='CohInt', optype='other') + opObj02.addParameter(name='n', value='2', format='int') + + + + ##....................................................................................... + ##....................................................................................... + + procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) + procUnitConfObj1.addParameter(name='nFFTPoints', value='16', format='int') + + + opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') + opObj11.addParameter(name='n', value='150', format='int') #300? + + ## Remove DC signal + opObj11 = procUnitConfObj1.addOperation(name='removeDC') + ##....................................................................................... + ##....................................................................................... + + opObj13 = procUnitConfObj1.addOperation(name='getNoise' , optype ='self') + opObj13.addParameter(name='minHei', value='100', format='float') + opObj13.addParameter(name='maxHei', value='280', format='float') + + + # + opObj12 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external') + opObj12.addParameter(name='id', value='21', format='int') + opObj12.addParameter(name= 'xaxis', value='velocity') + opObj12.addParameter(name='ymax', value=ymax, format='int') + opObj12.addParameter(name='showprofile', value='1', format='int') + opObj12.addParameter(name='wintitle', value='AMISR Beam 0', format='str') + opObj12.addParameter(name='zmin', value=dbmin, format='int') + opObj12.addParameter(name='zmax', value=dbmax, format='int') + opObj12.addParameter(name='save', value=outPath+'/plots', format='str') + opObj12.addParameter(name='colormap', value='jet', format='str') + opObj12.addParameter(name='localtime', value=localtime,format='int') + opObj12.addParameter(name='show', value = showSPC, format='int') + + + ##Generate *.pdata from AMISR data + ##....................................................................................... + ##....................................................................................... + opObj13 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='external') + opObj13.addParameter(name='path', value=outPath) + opObj13.addParameter(name='blocksPerFile', value='10', format='int') + + + opObj14 = procUnitConfObj1.addOperation(name='NoisePlot', optype='external') + opObj14.addParameter(name='id', value='3', format='int') + opObj14.addParameter(name='wintitle', value='title0', format='str') + opObj14.addParameter(name='showprofile', value='0', format='int') + opObj14.addParameter(name='xmin', value=xmin, format='int') + opObj14.addParameter(name='xmax', value=xmax, format='int') + opObj14.addParameter(name='ymin', value=dbmin, format='int') + opObj14.addParameter(name='ymax', value=dbmax, format='int') + opObj14.addParameter(name='save', value=outPath, format='str') + opObj14.addParameter(name='localtime', value=localtime,format='int') + opObj14.addParameter(name='show', value = showNOISE, format='int') + + + opObj15 = procUnitConfObj1.addOperation(name='RTIPlot', optype='external') + opObj15.addParameter(name='id', value='2', format='int') + opObj15.addParameter(name='localtime', value=localtime,format='int') + opObj15.addParameter(name='wintitle', value='RTI', format='str') + opObj15.addParameter(name='xmin', value=xmin, format='int') + opObj15.addParameter(name='xmax', value=xmax, format='int') #max value =23 + opObj15.addParameter(name='ymin', value=ymin, format='int') + opObj15.addParameter(name='zmin', value=dbmin, format='int') + opObj15.addParameter(name='zmax', value=dbmax, format='int') + opObj15.addParameter(name='showprofile', value='0', format='int') + opObj15.addParameter(name='save', value=outPath+'/plots', format='str') + opObj15.addParameter(name='colormap', value='jet', format='str') + opObj15.addParameter(name='show', value = showRTI, format='int') + + + + ##....................................................................................... + ##....................................................................................... + + procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) + opObj16 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other') + + + #Using ParamWriter:::: + ##....................................................................................... + ##....................................................................................... + opObj17 = procUnitConfObj2.addOperation(name='ParamWriter', optype='external') + opObj17.addParameter(name='path', value=outPath) + opObj17.addParameter(name='blocksPerFile', value='10', format='int') + opObj17.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') + opObj17.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list') + opObj17.addParameter(name='mode',value='1',format='int') #'0' channels, '1' parameters, '3' table (for meteors) + ##opObj17.addParameter(name='setType', value ='anything', format='str')#no usar + + + ##....................................................................................... + ##....................................................................................... + #print("Escribiendo el archivo XML",controllerObj.writeXml(path +'/'+filename)) + + controllerObj.start() + + #print("Leyendo el archivo XML",controllerObj.readXml(path +'/'+filename)) + + ##....................................................................................... + ##....................................................................................... + +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/amisr_eej_proc_online_v3.py b/schainpy/scripts/amisr_eej_proc_online_v3.py new file mode 100644 index 0000000..064011b --- /dev/null +++ b/schainpy/scripts/amisr_eej_proc_online_v3.py @@ -0,0 +1,202 @@ +#!/usr/bin/env python +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +def main(): + + + desc = "AMISR EEJ Experiment" + filename = "amisr_reader.xml" + xmin = '07' + xmax = '18' #-> el plot genera +1 en la hora, es decir aparece 18 como máximo + ymin = '0' + ymax = '300' + dbmin = '45' #'60'#'55' #'40' #noise esf eej + dbmax = '65' #'70' #'55' + showSPC = '1' #view plot Spectra + showRTI = '1' #view plot RTI + showNOISE = '1' #view plot NOISE + localtime='0' #para ajustar el horario en las gráficas '0' para dejar en utc + code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' + nCode = '1' + nBaud = '28' + nosamp = '1' # oversample for EEJ + str0 = datetime.date.today() + today = str0.strftime("%Y/%m/%d") + startDate=today + endDate=today + #startDate='2019/12/16' + #endDate='2019/12/16' + #inPath= '/home/soporte/dataAMISR_testONLINE/' + #inPath= '/home/soporte/dataAMISR/' + inPath = '/mnt/data_amisr' + outPath = '/home/soporte/Data/EEJ' + + ##....................................................................................... + ##....................................................................................... + + l = startDate.split('/') #adding day of the year to outPath + datelist = datetime.date(int(l[0]),int(l[1]),int(l[2])) + DOY = datelist.timetuple().tm_yday + outPath= outPath+"/EEJ"+l[0]+str(DOY) + if os.path.exists(outPath): + print("outPath", outPath) + else : + os.mkdir(outPath) + print("Creating...", outPath) + ##....................................................................................... + ##....................................................................................... + controllerObj = Project() + controllerObj.setup(id = '10', name='eej_proc', description=desc) + ##....................................................................................... + ##....................................................................................... + readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=inPath, + startDate=startDate, + endDate=endDate, + startTime='07:01:30',#'07:00:00', + endTime='18:55:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='ut', + online=1) + + #AMISR Processing Unit + ##....................................................................................... + ##....................................................................................... + procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + opObj10 = procUnitConfObj0.addOperation(name='setRadarFrequency') + opObj10.addParameter(name='frequency', value='445e6', format='float') + + + opObj01 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + opObj01.addParameter(name='code', value=code, format='floatlist') + opObj01.addParameter(name='nCode', value=nCode, format='int') + opObj01.addParameter(name='nBaud', value=nBaud, format='int') + opObj01.addParameter(name='osamp', value=nosamp, format='int') + + + # opObj02 = procUnitConfObj0.addOperation(name='CohInt', optype='other') + # opObj02.addParameter(name='n', value='5', format='int') + + + + ##....................................................................................... + ##....................................................................................... + + procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) + procUnitConfObj1.addParameter(name='nFFTPoints', value='16', format='int') + + + opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') + opObj11.addParameter(name='n', value='150', format='int') #300 normal value + + # ## Remove DC signal + # opObj11 = procUnitConfObj1.addOperation(name='removeDC') + ##....................................................................................... + ##....................................................................................... + + opObj13 = procUnitConfObj1.addOperation(name='getNoise' , optype ='self') + opObj13.addParameter(name='minHei', value='100', format='float') + opObj13.addParameter(name='maxHei', value='280', format='float') + + # + opObj12 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external') + opObj12.addParameter(name='id', value='21', format='int') + opObj12.addParameter(name= 'xaxis', value='velocity') + opObj12.addParameter(name='ymax', value=ymax, format='int') + opObj12.addParameter(name='showprofile', value='1', format='int') + opObj12.addParameter(name='wintitle', value='AMISR Beam 0', format='str') + opObj12.addParameter(name='zmin', value=dbmin, format='int') + opObj12.addParameter(name='zmax', value=dbmax, format='int') + opObj12.addParameter(name='save', value=outPath+'/plots', format='str') + opObj12.addParameter(name='colormap', value='jet', format='str') + opObj12.addParameter(name='localtime', value=localtime,format='int') + opObj12.addParameter(name='show', value = showSPC, format='int') + + + + + + + ##Generate *.pdata from AMISR data + ##....................................................................................... + ##....................................................................................... + # opObj13 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='external') + # opObj13.addParameter(name='path', value=outPath) + # opObj13.addParameter(name='blocksPerFile', value='10', format='int') + + + # opObj14 = procUnitConfObj1.addOperation(name='NoisePlot', optype='external') + # opObj14.addParameter(name='id', value='3', format='int') + # opObj14.addParameter(name='wintitle', value='title0', format='str') + # opObj14.addParameter(name='showprofile', value='0', format='int') + # opObj14.addParameter(name='xmin', value=xmin, format='int') + # opObj14.addParameter(name='xmax', value=xmax, format='int') + # opObj14.addParameter(name='ymin', value=dbmin, format='int') + # opObj14.addParameter(name='ymax', value=dbmax, format='int') + # opObj14.addParameter(name='save', value=outPath+'/plots', format='str') + # opObj14.addParameter(name='localtime', value=localtime,format='int') + # opObj14.addParameter(name='show', value = showNOISE, format='int') + + + opObj15 = procUnitConfObj1.addOperation(name='RTIPlot', optype='external') + opObj15.addParameter(name='id', value='2', format='int') + opObj15.addParameter(name='localtime', value=localtime,format='int') + opObj15.addParameter(name='wintitle', value='RTI', format='str') + opObj15.addParameter(name='xmin', value=xmin, format='int') + opObj15.addParameter(name='xmax', value=xmax, format='int') #max value =23 + opObj15.addParameter(name='ymin', value=ymin, format='int') + opObj15.addParameter(name='zmin', value=dbmin, format='int') + opObj15.addParameter(name='zmax', value=dbmax, format='int') + opObj15.addParameter(name='showprofile', value='1', format='int') + opObj15.addParameter(name='save', value=outPath+'/plots', format='str') + opObj15.addParameter(name='colormap', value='jet', format='str') + opObj15.addParameter(name='show', value = showRTI, format='int') + + + + ##....................................................................................... + ##....................................................................................... + # + # procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) + # opObj16 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other') + # + # + # #Using ParamWriter:::: + # ##....................................................................................... + # ##....................................................................................... + # opObj17 = procUnitConfObj2.addOperation(name='ParamWriter', optype='external') + # opObj17.addParameter(name='path', value=outPath) + # opObj17.addParameter(name='blocksPerFile', value='10', format='int') + # opObj17.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') + # opObj17.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list') + # opObj17.addParameter(name='mode',value='1',format='int') #'0' channels, '1' parameters, '3' table (for meteors) + # ##opObj17.addParameter(name='setType', value ='anything', format='str') + # + + ##....................................................................................... + ##....................................................................................... + #print("Escribiendo el archivo XML",controllerObj.writeXml(path +'/'+filename)) + + controllerObj.start() + + #print("Leyendo el archivo XML",controllerObj.readXml(path +'/'+filename)) + + ##....................................................................................... + ##....................................................................................... + +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/amisr_esf_proc_offline_v3.py b/schainpy/scripts/amisr_esf_proc_offline_v3.py new file mode 100644 index 0000000..a34f32a --- /dev/null +++ b/schainpy/scripts/amisr_esf_proc_offline_v3.py @@ -0,0 +1,230 @@ +#!/usr/bin/env python +import os, sys +import time +import datetime + +''' + ESF 10 BEAM OFFLINE +''' +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + + +def main(): + desc = "AMISR ESF 10 Beam Experiment" + + filename = "amisr_esf_reader.xml" + + + + #path = os.path.join(os.environ['HOME'],'amisr') + inPath = '/mnt/data_amisr' + inPath= '/home/soporte/dataAMISR/' + #path= '/home/soporte/dataAMISR_test/' + outPath = '/home/soporte/Data/ESF' + remotefolder = "/home/wmaster/graficos" + xmin = '19' + xmax = '07' + xrange = (int(xmax)+24)-int(xmin) + dbmin = '60' #'60'#'55' #'40' #noise esf eej + dbmax = '75' #'70' #'55' + showSPC = '0' #view plot Spectra + showRTI = '0' #view plot RTI + showNOISE = '0' #view plot NOISE + # # code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' + # # code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' + code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' + nCode = '1' + nBaud = '28' + nosamp = '2' # oversample + localtime='0' #para ajustar el horario en las gráficas '0' para dejar en utc + + str0 = datetime.date.today() + str1 = str0 + datetime.timedelta(days=1) + str2 = str0 - datetime.timedelta(days=1) + today = str0.strftime("%Y/%m/%d") + tomorrow = str1.strftime("%Y/%m/%d") + yesterday = str2.strftime("%Y/%m/%d") + + startDate=yesterday + endDate=today + + ##....................................................................................... + ##....................................................................................... + l = startDate.split('/') #adding day of the year to outPath + datelist = datetime.date(int(l[0]),int(l[1]),int(l[2])) + DOY = datelist.timetuple().tm_yday + outPath= outPath+"/ESF"+l[0]+str(DOY) + if os.path.exists(outPath): + print("outPath", outPath) + else : + os.mkdir(outPath) + print("Creating...", outPath) + ##....................................................................................... + ##....................................................................................... + + controllerObj = Project() + controllerObj.setup(id = '191', name='esf_proc', description=desc) + ##....................................................................................... + ##....................................................................................... + + readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=inPath, + startDate='2019/12/17',#startDate,#'2016/07/12', + endDate='2019/12/18',#endDate,#'2016/07/13', + startTime='19:01:30',#'07:00:00', + endTime='07:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='ut', + online=0) + + #AMISR Processing Unit + ##....................................................................................... + ##....................................................................................... + + #Voltage Processing Unit + procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') + #opObj10.addParameter(name='frequency', value='445e6', format='int') #changed on Dec 3, 15:40h + + + #Noise--> no code + + opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') + opObj11.addParameter(name='code', value=code, format='floatlist') + opObj11.addParameter(name='nCode', value=nCode, format='int') + opObj11.addParameter(name='nBaud', value=nBaud, format='int') + opObj11.addParameter(name='osamp', value=nosamp, format='int') + + + # opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') + # opObj12.addParameter(name='minHei', value='50', format='float') + # opObj12.addParameter(name='maxHei', value='150', format='float') + + # #Coherent Integration + # opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') + # opObj11.addParameter(name='n', value='2', format='int') + + ##....................................................................................... + ##....................................................................................... + + #Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints + procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) + procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') + # + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') + # opObj11.addParameter(name='n', value='60', format='int') + # opObj11.addParameter(name='timeInterval', value='30', format='int') + # + # + # # # #RemoveDc + # #opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + # + # ##Noise Estimation + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise', optype='self') + # opObj11.addParameter(name='minHei', value='100', format='int') + # opObj11.addParameter(name='maxHei', value='280', format='int') + # #opObj11.addParameter(name='minHei', value='15', format='int') + # #opObj11.addParameter(name='maxHei', value='20', format='int') + + #--- + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') + # opObj11.addParameter(name='channelList', value='7,8,9', format='intlist') + + ##....................................................................................... + ##....................................................................................... + + #SpectraPlot + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='external') + opObj11.addParameter(name='id', value='1', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='1', format='int') + #opObj11.addParameter(name='zmin', value='38', format='int') + opObj11.addParameter(name='zmin', value=dbmin, format='int') + opObj11.addParameter(name='zmax', value=dbmax, format='int') + opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + opObj11.addParameter(name='ftp', value='1', format='int') + # opObj11.addParameter(name='wr_period', value='2', format='int') + # opObj11.addParameter(name='exp_code', value='21', format='int') + # opObj11.addParameter(name='sub_exp_code', value='4', format='int') + # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # opObj11.addParameter(name='plot_pos', value='0', format='int') + opObj11.addParameter(name='localtime', value=localtime,format='int') + opObj11.addParameter(name='show', value = showSPC, format='int') + + #RTIPlot + #title0 = 'RTI AMISR Beam 0' + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='external') + opObj11.addParameter(name='id', value='2', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='0', format='int') + opObj11.addParameter(name='xmin', value=xmin, format='int') + opObj11.addParameter(name='xrange', value=xrange, format='int') + opObj11.addParameter(name='zmin', value=dbmin, format='int') + opObj11.addParameter(name='zmax', value=dbmax, format='int') + opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + opObj11.addParameter(name='ftp', value='1', format='int') + opObj11.addParameter(name='wr_period', value='2', format='int') + # opObj11.addParameter(name='exp_code', value='21', format='int') + # opObj11.addParameter(name='sub_exp_code', value='4', format='int') + # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # opObj11.addParameter(name='plot_pos', value='0', format='int') + opObj11.addParameter(name='localtime', value=localtime,format='int') + opObj11.addParameter(name='show', value = showRTI, format='int') + + + # # # + # #Noise + #title0 = 'RTI AMISR Beam 0' + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='NoisePlot', optype='external') + opObj11.addParameter(name='id', value='3', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='0', format='int') + opObj11.addParameter(name='xmin', value=xmin, format='int') + opObj11.addParameter(name='xrange', value=xrange,format='int') + #opObj11.addParameter(name='ymin', value=dbmin, format='int') + #opObj11.addParameter(name='ymax', value=dbmax, format='int') + opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + opObj11.addParameter(name='show', value = showNOISE, format='int') + opObj11.addParameter(name='localtime', value=localtime,format='int') + + #Generate *.pdata from AMISR data + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='external') + opObj11.addParameter(name='path', value=outPath) + opObj11.addParameter(name='blocksPerFile', value='10', format='int') + + ##....................................................................................... + ##....................................................................................... + + #generate moments + # procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) + # opObj20 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other') + # + # opObj12 = procUnitConfObj2.addOperation(name='ParamWriter', optype='external') + # opObj12.addParameter(name='path', value=outPath) + # opObj12.addParameter(name='blocksPerFile', value='10', format='int') + # opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') + # opObj12.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list') + # opObj12.addParameter(name='mode',value='1',format='int') + # + + #---- + + + # print "Escribiendo el archivo XML" + # controllerObj.writeXml(filename) + controllerObj.start() + # print "Leyendo el archivo XML" + # controllerObj.readXml(filename) + +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/amisr_esf_proc_online_v3.py b/schainpy/scripts/amisr_esf_proc_online_v3.py new file mode 100644 index 0000000..6bf33fe --- /dev/null +++ b/schainpy/scripts/amisr_esf_proc_online_v3.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python +import os, sys +import time +import datetime + +''' + ESF 10 BEAM ONLINE +''' +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + + +def main(): + desc = "AMISR ESF 10 Beam Experiment" + + filename = "amisr_esf_reader.xml" + + + + #path = os.path.join(os.environ['HOME'],'amisr') + inPath = '/mnt/data_amisr' + #path= '/home/soporte/dataAMISR/' + #inPath= '/home/soporte/dataAMISR_test/' + outPath = '/home/soporte/Data/ESF' + remotefolder = "/home/wmaster/graficos" + xmin = '16' + xmax = '07' + xrange = (int(xmax)+24)-int(xmin) + dbmin = '60' #'60'#'55' #'40' #noise esf eej + dbmax = '75' #'70' #'55' + showSPC = '1' #view plot Spectra + showRTI = '1' #view plot RTI + showNOISE = '0' #view plot NOISE + # # code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' + # # code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' + code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' + nCode = '1' + nBaud = '28' + nosamp = '2' # oversample + localtime='0' #para ajustar el horario en las gráficas '0' para dejar en utc + + dty = datetime.date.today() #ONLINE + str1 = dty + datetime.timedelta(days=1) + str2 = dty - datetime.timedelta(days=1) + today = dty.strftime("%Y/%m/%d") + tomorrow = str1.strftime("%Y/%m/%d") + yesterday = str2.strftime("%Y/%m/%d") + startDate=today + endDate=tomorrow + #startDate='2019/12/17' + #endDate='2019/12/18' + ##....................................................................................... + ##....................................................................................... + l = startDate.split('/') #adding day of the year to outPath + datelist = datetime.date(int(l[0]),int(l[1]),int(l[2])) + DOY = datelist.timetuple().tm_yday + outPath= outPath+"/ESF"+l[0]+str(DOY) + if os.path.exists(outPath): + print("outPath", outPath) + else : + os.mkdir(outPath) + print("Creating...", outPath) + ##....................................................................................... + ##....................................................................................... + + controllerObj = Project() + controllerObj.setup(id = '191', name='esf_proc', description=desc) + ##....................................................................................... + ##....................................................................................... + + readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=inPath, + startDate=startDate,#'2016/07/12', + endDate=endDate,#'2016/07/13', + startTime='19:01:30',#'07:00:00', + endTime='07:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + + #AMISR Processing Unit + ##....................................................................................... + ##....................................................................................... + + #Voltage Processing Unit + procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') + #opObj10.addParameter(name='frequency', value='445e6', format='int') #changed on Dec 3, 15:40h + + + #Noise--> no code + + opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') + opObj11.addParameter(name='code', value=code, format='floatlist') + opObj11.addParameter(name='nCode', value=nCode, format='int') + opObj11.addParameter(name='nBaud', value=nBaud, format='int') + opObj11.addParameter(name='osamp', value=nosamp, format='int') + + + # opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') + # opObj12.addParameter(name='minHei', value='50', format='float') + # opObj12.addParameter(name='maxHei', value='150', format='float') + + # #Coherent Integration + # opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') + # opObj11.addParameter(name='n', value='2', format='int') + + ##....................................................................................... + ##....................................................................................... + + #Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints + procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) + procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') + # + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') + opObj11.addParameter(name='n', value='60', format='int') + #opObj11.addParameter(name='timeInterval', value='30', format='int') + + + # # #RemoveDc + #opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + + ##Noise Estimation + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise', optype='self') + opObj11.addParameter(name='minHei', value='100', format='int') + opObj11.addParameter(name='maxHei', value='280', format='int') + #opObj11.addParameter(name='minHei', value='15', format='int') + #opObj11.addParameter(name='maxHei', value='20', format='int') + + #--- + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') + # opObj11.addParameter(name='channelList', value='7,8,9', format='intlist') + + ##....................................................................................... + ##....................................................................................... + + #SpectraPlot + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='external') + opObj11.addParameter(name='id', value='1', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='1', format='int') + #opObj11.addParameter(name='zmin', value='38', format='int') + opObj11.addParameter(name='zmin', value=dbmin, format='int') + opObj11.addParameter(name='zmax', value=dbmax, format='int') + opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + # opObj11.addParameter(name='ftp', value='1', format='int') + # opObj11.addParameter(name='wr_period', value='2', format='int') + # opObj11.addParameter(name='exp_code', value='21', format='int') + # opObj11.addParameter(name='sub_exp_code', value='4', format='int') + # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # opObj11.addParameter(name='plot_pos', value='0', format='int') + opObj11.addParameter(name='localtime', value=localtime,format='int') + opObj11.addParameter(name='show', value = showSPC, format='int') + opObj11.addParameter(name='colormap', value='jet', format='str') + + + #RTIPlot + #title0 = 'RTI AMISR Beam 0' + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='external') + opObj11.addParameter(name='id', value='2', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='0', format='int') + opObj11.addParameter(name='xmin', value=xmin, format='int') + opObj11.addParameter(name='xrange', value=xrange,format='int') + opObj11.addParameter(name='zmin', value=dbmin, format='int') + opObj11.addParameter(name='zmax', value=dbmax, format='int') + opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + #opObj11.addParameter(name='ftp', value='1', format='int') + #opObj11.addParameter(name='wr_period', value='2', format='int') + # opObj11.addParameter(name='exp_code', value='21', format='int') + # opObj11.addParameter(name='sub_exp_code', value='4', format='int') + # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # opObj11.addParameter(name='plot_pos', value='0', format='int') + opObj11.addParameter(name='localtime', value=localtime,format='int') + opObj11.addParameter(name='show', value = showRTI, format='int') + opObj11.addParameter(name='colormap', value='jet', format='str') + + # # # + # #Noise + #title0 = 'RTI AMISR Beam 0' + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='NoisePlot', optype='external') + # opObj11.addParameter(name='id', value='3', format='int') + # opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + # opObj11.addParameter(name='showprofile', value='0', format='int') + # opObj11.addParameter(name='xmin', value=xmin, format='int') + # opObj11.addParameter(name='xmin', value=xmin, format='int') + # opObj11.addParameter(name='xrange', value='16',format='int') + # #opObj11.addParameter(name='ymin', value=dbmin, format='int') + # #opObj11.addParameter(name='ymax', value=dbmax, format='int') + # opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + # opObj11.addParameter(name='show', value = showNOISE, format='int') + # opObj11.addParameter(name='localtime', value=localtime,format='int') + # + # #Generate *.pdata from AMISR data + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='external') + # opObj11.addParameter(name='path', value=outPath, format='str') + # opObj11.addParameter(name='blocksPerFile', value='10', format='int') + # + # ##....................................................................................... + # ##....................................................................................... + # + # #generate moments + # procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) + # opObj20 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other') + # + # opObj12 = procUnitConfObj2.addOperation(name='ParamWriter', optype='external') + # opObj12.addParameter(name='path', value=outPath) + # opObj12.addParameter(name='blocksPerFile', value='10', format='int') + # opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') + # opObj12.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list') + # opObj12.addParameter(name='mode',value='1',format='int') + # + + #---- + + + # print "Escribiendo el archivo XML" + # controllerObj.writeXml(filename) + controllerObj.start() + # print "Leyendo el archivo XML" + # controllerObj.readXml(filename) + +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/amisr_experimetsSchain.zip b/schainpy/scripts/amisr_experimetsSchain.zip new file mode 100644 index 0000000000000000000000000000000000000000..db5b2e463c21f04e8bbb690f6643487598d74c33 GIT binary patch literal 9454 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 no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='300', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +# #procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(4,4)', \ +# # format='pairsList') +# +# # procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0)', \ +# # format='pairsList') +# # +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') +# # +# #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# # +# # #RTIPlot +# # #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') + +# # # +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# # opObj11.addParameter(name='wintitle', value=title0, format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=pdatapath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=procpath) +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm diff --git a/schainpy/scripts/joab.xml b/schainpy/scripts/joab.xml new file mode 100644 index 0000000..c46eb27 --- /dev/null +++ b/schainpy/scripts/joab.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/schainpy/scripts/pedestal_client.py b/schainpy/scripts/pedestal_client.py new file mode 100644 index 0000000..ec88d9e --- /dev/null +++ b/schainpy/scripts/pedestal_client.py @@ -0,0 +1,87 @@ +import numpy +import sys +import zmq +import time +import h5py +import os + +path="/home/alex/Downloads/pedestal" +ext=".hdf5" + +port ="5556" +if len(sys.argv)>1: + port = sys.argv[1] + int(port) + +if len(sys.argv)>2: + port1 = sys.argv[2] + int(port1) + +#Socket to talk to server +context = zmq.Context() +socket = context.socket(zmq.SUB) + +print("Collecting updates from weather server...") +socket.connect("tcp://localhost:%s"%port) + +if len(sys.argv)>2: + socket.connect("tcp://localhost:%s"%port1) + +#Subscribe to zipcode, default is NYC,10001 +topicfilter = "10001" +socket.setsockopt_string(zmq.SUBSCRIBE,topicfilter) +#Process 5 updates +total_value=0 +count= -1 +azi= [] +elev=[] +time0=[] +#for update_nbr in range(250): +while(True): + string= socket.recv() + topic,ang_elev,ang_elev_dec,ang_azi,ang_azi_dec,seconds,seconds_dec= string.split() + ang_azi =float(ang_azi)+1e-3*float(ang_azi_dec) + ang_elev =float(ang_elev)+1e-3*float(ang_elev_dec) + seconds =float(seconds) +1e-6*float(seconds_dec) + azi.append(ang_azi) + elev.append(ang_elev) + time0.append(seconds) + count +=1 + if count == 100: + timetuple=time.localtime() + epoc = time.mktime(timetuple) + #print(epoc) + fullpath = path + ("/" if path[-1]!="/" else "") + + if not os.path.exists(fullpath): + os.mkdir(fullpath) + + azi_array = numpy.array(azi) + elev_array = numpy.array(elev) + time0_array= numpy.array(time0) + pedestal_array=numpy.array([azi,elev,time0]) + count=0 + azi= [] + elev=[] + time0=[] + #print(pedestal_array[0]) + #print(pedestal_array[1]) + + meta='PE' + filex="%s%4.4d%3.3d%10.4d%s"%(meta,timetuple.tm_year,timetuple.tm_yday,epoc,ext) + filename = os.path.join(fullpath,filex) + fp = h5py.File(filename,'w') + #print("Escribiendo HDF5...",epoc) + #·················· Data·....······································ + grp = fp.create_group("Data") + dset = grp.create_dataset("azimuth" , data=pedestal_array[0]) + dset = grp.create_dataset("elevacion", data=pedestal_array[1]) + dset = grp.create_dataset("utc" , data=pedestal_array[2]) + #·················· Metadata······································· + grp = fp.create_group("Metadata") + dset = grp.create_dataset("utctimeInit", data=pedestal_array[2][0]) + timeInterval = pedestal_array[2][1]-pedestal_array[2][0] + dset = grp.create_dataset("timeInterval", data=timeInterval) + fp.close() + +#print ("Average messagedata value for topic '%s' was %dF" % ( topicfilter,total_value / update_nbr)) diff --git a/schainpy/scripts/pedestal_server.py b/schainpy/scripts/pedestal_server.py new file mode 100644 index 0000000..446a76a --- /dev/null +++ b/schainpy/scripts/pedestal_server.py @@ -0,0 +1,48 @@ +########################################################################### +############################### SERVIDOR################################### +######################### SIMULADOR DE PEDESTAL############################ +########################################################################### +import time +import math +import numpy +import struct +from time import sleep +import zmq +import pickle +port="5556" +context = zmq.Context() +socket = context.socket(zmq.PUB) +socket.bind("tcp://*:%s"%port) +###### PARAMETROS DE ENTRADA################################ +print("PEDESTAL RESOLUCION 0.01") +print("MAXIMA VELOCIDAD DEL PEDESTAL") +ang_elev = 4.12 +ang_azi = 30 +velocidad= input ("Ingresa velocidad:") +velocidad= float(velocidad) +print (velocidad) +############################################################ +sleep(3) +print("Start program") +t1 = time.time() +count=0 +while(True): + tmp_vuelta = int(360/velocidad) + t1=t1+tmp_vuelta*count + count= count+1 + muestras_seg = 100 + t2 = time.time() + for i in range(tmp_vuelta): + for j in range(muestras_seg): + tmp_variable = (i+j/100.0) + ang_azi = (tmp_variable)*float(velocidad) + seconds = t1+ tmp_variable + topic=10001 + print ("Azim°: ","%.4f"%ang_azi,"Time:" ,"%.5f"%seconds) + seconds_dec=(seconds-int(seconds))*1e6 + ang_azi_dec= (ang_azi-int(ang_azi))*1e3 + ang_elev_dec=(ang_elev-int(ang_elev))*1e3 + sleep(0.0088) + socket.send_string("%d %d %d %d %d %d %d"%(topic,ang_elev,ang_elev_dec,ang_azi,ang_azi_dec,seconds,seconds_dec)) + t3 = time.time() + print ("Total time for 1 vuelta in Seconds",t3-t2) diff --git a/schainpy/gui/figures/__init__.py b/schainpy/scripts/restore.spst similarity index 100% rename from schainpy/gui/figures/__init__.py rename to schainpy/scripts/restore.spst diff --git a/schainpy/scripts/scripts_v/.svn/all-wcprops b/schainpy/scripts/scripts_v/.svn/all-wcprops new file mode 100644 index 0000000..0cbdfed --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/all-wcprops @@ -0,0 +1,275 @@ +K 25 +svn:wc:ra_dav:version-url +V 75 +/svn/jro_soft/schain/!svn/ver/1045/trunk/schainroot/source/schainpy/scripts +END +amisr_windEstimation.py +K 25 +svn:wc:ra_dav:version-url +V 99 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/amisr_windEstimation.py +END +Meteor_JASMET30Mhz_Beacon.py +K 25 +svn:wc:ra_dav:version-url +V 104 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/Meteor_JASMET30Mhz_Beacon.py +END +Meteor_JASMET50Mhz_Beacon.py +K 25 +svn:wc:ra_dav:version-url +V 104 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/Meteor_JASMET50Mhz_Beacon.py +END +amisr_esf_proc_online.py +K 25 +svn:wc:ra_dav:version-url +V 100 +/svn/jro_soft/schain/!svn/ver/1206/trunk/schainroot/source/schainpy/scripts/amisr_esf_proc_online.py +END +amisr_winds_proc_offline.py +K 25 +svn:wc:ra_dav:version-url +V 103 +/svn/jro_soft/schain/!svn/ver/1115/trunk/schainroot/source/schainpy/scripts/amisr_winds_proc_offline.py +END +plot_mst.py +K 25 +svn:wc:ra_dav:version-url +V 87 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/plot_mst.py +END +EWDrifts_estimation02.py +K 25 +svn:wc:ra_dav:version-url +V 100 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/EWDrifts_estimation02.py +END +Meteor_JASMET30MHz.py +K 25 +svn:wc:ra_dav:version-url +V 97 +/svn/jro_soft/schain/!svn/ver/1044/trunk/schainroot/source/schainpy/scripts/Meteor_JASMET30MHz.py +END +150km_january_3.py +K 25 +svn:wc:ra_dav:version-url +V 94 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/150km_january_3.py +END +Meteor_JASMET_PreProc.py +K 25 +svn:wc:ra_dav:version-url +V 100 +/svn/jro_soft/schain/!svn/ver/1044/trunk/schainroot/source/schainpy/scripts/Meteor_JASMET_PreProc.py +END +plot_eej.py +K 25 +svn:wc:ra_dav:version-url +V 87 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/plot_eej.py +END +150km_january_1.py +K 25 +svn:wc:ra_dav:version-url +V 94 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/150km_january_1.py +END +test_isr_blocks.py +K 25 +svn:wc:ra_dav:version-url +V 94 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/test_isr_blocks.py +END +plot_isr.py +K 25 +svn:wc:ra_dav:version-url +V 87 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/plot_isr.py +END +test_eej_blocks.py +K 25 +svn:wc:ra_dav:version-url +V 94 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/test_eej_blocks.py +END +amisr_EEJ.py +K 25 +svn:wc:ra_dav:version-url +V 88 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/amisr_EEJ.py +END +amisr_reader_exp.py +K 25 +svn:wc:ra_dav:version-url +V 95 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/amisr_reader_exp.py +END +test_mst_blocks.py +K 25 +svn:wc:ra_dav:version-url +V 94 +/svn/jro_soft/schain/!svn/ver/1040/trunk/schainroot/source/schainpy/scripts/test_mst_blocks.py +END +amisr_esf_proc_offline.py +K 25 +svn:wc:ra_dav:version-url +V 101 +/svn/jro_soft/schain/!svn/ver/1205/trunk/schainroot/source/schainpy/scripts/amisr_esf_proc_offline.py +END +mst_isr_eej_blocks.py +K 25 +svn:wc:ra_dav:version-url +V 97 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/mst_isr_eej_blocks.py +END +150km_January_shortPulse.py +K 25 +svn:wc:ra_dav:version-url +V 103 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/150km_January_shortPulse.py +END +150km_jicamarca.xml +K 25 +svn:wc:ra_dav:version-url +V 95 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/150km_jicamarca.xml +END +sousy.py +K 25 +svn:wc:ra_dav:version-url +V 84 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/sousy.py +END +hf_write_pdata.py +K 25 +svn:wc:ra_dav:version-url +V 93 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/hf_write_pdata.py +END +150km_January_longPulse.py +K 25 +svn:wc:ra_dav:version-url +V 102 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/150km_January_longPulse.py +END +jacktotalrunner.py +K 25 +svn:wc:ra_dav:version-url +V 94 +/svn/jro_soft/schain/!svn/ver/1032/trunk/schainroot/source/schainpy/scripts/jacktotalrunner.py +END +hf_test.py +K 25 +svn:wc:ra_dav:version-url +V 86 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/hf_test.py +END +amisr_eej_proc_offline.py +K 25 +svn:wc:ra_dav:version-url +V 101 +/svn/jro_soft/schain/!svn/ver/1204/trunk/schainroot/source/schainpy/scripts/amisr_eej_proc_offline.py +END +mst_isr_eej_processing.py +K 25 +svn:wc:ra_dav:version-url +V 101 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/mst_isr_eej_processing.py +END +__init__.py +K 25 +svn:wc:ra_dav:version-url +V 87 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/__init__.py +END +amisr_spreadF.py +K 25 +svn:wc:ra_dav:version-url +V 92 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/amisr_spreadF.py +END +EWDrifts_estimation01.py +K 25 +svn:wc:ra_dav:version-url +V 100 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/EWDrifts_estimation01.py +END +WindProfiler_DBS01.py +K 25 +svn:wc:ra_dav:version-url +V 97 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/WindProfiler_DBS01.py +END +amisr_reader.py +K 25 +svn:wc:ra_dav:version-url +V 91 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/amisr_reader.py +END +amisr_winds_proc_online.py +K 25 +svn:wc:ra_dav:version-url +V 102 +/svn/jro_soft/schain/!svn/ver/1115/trunk/schainroot/source/schainpy/scripts/amisr_winds_proc_online.py +END +amisr_reader_exp_ex2.py +K 25 +svn:wc:ra_dav:version-url +V 99 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/amisr_reader_exp_ex2.py +END +amisr_eej_proc_online.py +K 25 +svn:wc:ra_dav:version-url +V 100 +/svn/jro_soft/schain/!svn/ver/1203/trunk/schainroot/source/schainpy/scripts/amisr_eej_proc_online.py +END +beacon_phase.py +K 25 +svn:wc:ra_dav:version-url +V 91 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/beacon_phase.py +END +testRawData.py +K 25 +svn:wc:ra_dav:version-url +V 90 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/testRawData.py +END +jasmet30_16april.py +K 25 +svn:wc:ra_dav:version-url +V 95 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/jasmet30_16april.py +END +hf_plot_pdata.py +K 25 +svn:wc:ra_dav:version-url +V 92 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/hf_plot_pdata.py +END +jasmet50_16april.py +K 25 +svn:wc:ra_dav:version-url +V 95 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/jasmet50_16april.py +END +WindProfiler_SA01.py +K 25 +svn:wc:ra_dav:version-url +V 96 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/WindProfiler_SA01.py +END +Meteor_JASMET50MHz_Winds.py +K 25 +svn:wc:ra_dav:version-url +V 103 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/Meteor_JASMET50MHz_Winds.py +END +amisr_proc.py +K 25 +svn:wc:ra_dav:version-url +V 89 +/svn/jro_soft/schain/!svn/ver/1014/trunk/schainroot/source/schainpy/scripts/amisr_proc.py +END diff --git a/schainpy/scripts/scripts_v/.svn/dir-prop-base b/schainpy/scripts/scripts_v/.svn/dir-prop-base new file mode 100644 index 0000000..3342c5d --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/dir-prop-base @@ -0,0 +1,16 @@ +K 10 +svn:ignore +V 158 +ewdrifts.xml +output_sinGraphs.pstats +output_tmp.pstats +output.png +output.pstats +output0.png +output2.pstats +output3.png +output3.pstats +schain.xml +test8chan.py + +END diff --git a/schainpy/scripts/scripts_v/.svn/entries b/schainpy/scripts/scripts_v/.svn/entries new file mode 100644 index 0000000..463e5b3 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/entries @@ -0,0 +1,1558 @@ +10 + +dir +1047 +http://jro-dev.igp.gob.pe/svn/jro_soft/schain/trunk/schainroot/source/schainpy/scripts +http://jro-dev.igp.gob.pe/svn/jro_soft/schain + + + +2015-08-06T17:51:12.741208Z +1045 +joscanoa +has-props + +svn:special svn:externals svn:needs-lock + + + + + + + + + + + +ea082a80-fb9f-4feb-b8d7-17586309b78c + +150km_January_longPulse.py +file + + + + +2015-08-19T22:00:56.000000Z +395fc9ce3defafddacdf509f2f4556c6 +2015-06-04T23:19:33.989293Z +1003 +avaldez + + + + + + + + + + + + + + + + + + + + + +7868 + +150km_January_shortPulse.py +file + + + + +2015-08-19T22:00:56.000000Z +440444c0146e4298556f3d56f3568b1d +2015-06-04T23:19:42.100708Z +1004 +avaldez + + + + + + + + + + + + + + + + + + + + + +7474 + +150km_january_1.py +file + + + + +2015-08-19T22:00:56.000000Z +86a9fcd86f96d0db78e6141088d9fc7b +2015-01-12T15:49:08.326511Z +911 +murco + + + + + + + + + + + + + + + + + + + + + +4945 + +150km_january_3.py +file + + + + +2015-08-19T22:00:56.000000Z +92f48cdeb6ce34d984c5eb68691d4f67 +2015-05-04T14:59:38.187771Z +967 +murco + + + + + + + + + + + + + + + + + + + + + +5960 + +150km_jicamarca.xml +file + + + + +2015-08-19T22:00:56.000000Z +92f2164728c8f8a6958e634a6447d6f2 +2015-05-04T14:59:38.187771Z +967 +murco + + + + + + + + + + + + + + + + + + + + + +3795 + +EWDrifts_estimation01.py +file + + + + +2015-08-19T22:00:56.000000Z +a010bf08aa81509ec10268c73dfdf4cb +2014-11-27T09:30:54.575113Z +902 +joscanoa + + + + + + + + + + + + + + + + + + + + + +6835 + +EWDrifts_estimation02.py +file + + + + +2015-08-19T22:00:56.000000Z +d1d854d0706a550d5fb51ff0edf5760c +2014-11-27T09:30:54.575113Z +902 +joscanoa + + + + + + + + + + + + + + + + + + + + + +2788 + +Meteor_JASMET30MHz.py +file + + + + +2015-08-19T22:00:56.000000Z +5b6d5ea9603d6d02248bae6dacbb5fd9 +2015-08-06T17:47:33.905218Z +1044 +joscanoa + + + + + + + + + + + + + + + + + + + + + +10553 + +Meteor_JASMET30Mhz_Beacon.py +file + + + + +2015-08-19T22:00:56.000000Z +1398471f68e8000c19302db7792c0804 +2014-10-21T10:34:03.775723Z +875 +joscanoa + + + + + + + + + + + + + + + + + + + + + +3248 + +Meteor_JASMET50MHz_Winds.py +file + + + + +2015-08-19T22:00:56.000000Z +9fbfbd3af506d9971ea2cdfefdd5f1d3 +2014-10-21T10:34:03.775723Z +875 +joscanoa + + + + + + + + + + + + + + + + + + + + + +5611 + +Meteor_JASMET50Mhz_Beacon.py +file + + + + +2015-08-19T22:00:56.000000Z +da232f7e1903bc9d040cab31c7b285ba +2014-10-21T10:34:03.775723Z +875 +joscanoa + + + + + + + + + + + + + + + + + + + + + +3075 + +Meteor_JASMET_PreProc.py +file + + + + +2015-08-19T22:00:56.000000Z +6d568acf3503e664c520f631a4f669a3 +2015-08-06T17:47:33.905218Z +1044 +joscanoa + + + + + + + + + + + + + + + + + + + + + +1824 + +WindProfiler_DBS01.py +file + + + + +2015-08-19T22:00:56.000000Z +d57b434eff1c1a1a4f5f45cdeb8fdcb7 +2014-11-27T09:30:54.575113Z +902 +joscanoa + + + + + + + + + + + + + + + + + + + + + +8130 + +WindProfiler_SA01.py +file + + + + +2015-08-19T22:00:56.000000Z +3de1185977c63ceac6087aebeac03682 +2014-11-27T09:30:54.575113Z +902 +joscanoa + + + + + + + + + + + + + + + + + + + + + +6689 + +__init__.py +file + + + + +2015-08-19T22:00:56.000000Z +2c125383ea262e4c2d0f2adc87c6292c +2015-06-03T15:32:50.999038Z +996 +murco + + + + + + + + + + + + + + + + + + + + + +51 + +amisr_EEJ.py +file + + + + +2015-08-19T22:00:56.000000Z +7a79d0041d085bfb94795b50139bf357 +2014-12-01T10:10:51.712101Z +904 +joscanoa + + + + + + + + + + + + + + + + + + + + + +5116 + +amisr_eej_proc_offline.py +file +1204 + + + +2015-12-03T21:27:28.000000Z +3b434f6180a550b107f12b66b38ae1f0 +2015-12-15T16:42:28.403966Z +1204 +kkuyeng + + + + + + + + + + + + + + + + + + + + + +8590 + +amisr_eej_proc_online.py +file +1203 + + + +2015-12-15T14:49:24.000000Z +07770d4cb153daf0bea9d8911e18a15d +2015-12-15T16:41:25.330699Z +1203 +kkuyeng + + + + + + + + + + + + + + + + + + + + + +9424 + +amisr_esf_proc_offline.py +file +1205 + + + +2015-12-03T21:27:47.000000Z +111d5469de0a9d87bf15cc6eae803259 +2015-12-15T16:42:43.453045Z +1205 +kkuyeng + + + + + + + + + + + + + + + + + + + + + +8612 + +amisr_esf_proc_online.py +file +1206 + + + +2015-12-03T21:27:38.000000Z +0da07e8a9f0e523ca06bbcc4c841f4de +2015-12-15T16:42:56.099535Z +1206 +kkuyeng + + + + + + + + + + + + + + + + + + + + + +10091 + +amisr_proc.py +file + + + + +2015-08-19T22:00:56.000000Z +ff8508355cfff72608373443eb72881b +2014-10-20T19:02:16.227014Z +874 +dsuarez + + + + + + + + + + + + + + + + + + + + + +3702 + +amisr_reader.py +file + + + + +2015-08-19T22:00:56.000000Z +96933f3e344677f28c5c66d4c3f2f0b9 +2014-09-24T12:02:49.355338Z +861 +dsuarez + + + + + + + + + + + + + + + + + + + + + +1233 + +amisr_reader_exp.py +file + + + + +2015-08-19T22:00:56.000000Z +a9a02749d1055155f7c53294cc7f0e53 +2014-08-26T19:04:23.002737Z +840 +dsuarez + + + + + + + + + + + + + + + + + + + + + +1681 + +amisr_reader_exp_ex2.py +file + + + + +2015-08-19T22:00:56.000000Z +12ec9bf6c53bba757b3ca43abff78539 +2014-09-11T13:13:30.068275Z +848 +dsuarez + + + + + + + + + + + + + + + + + + + + + +19325 + +amisr_spreadF.py +file + + + + +2015-08-19T22:00:56.000000Z +8a042f6495c86427a1afca4769f9df55 +2014-12-01T10:10:51.712101Z +904 +joscanoa + + + + + + + + + + + + + + + + + + + + + +4913 + +amisr_windEstimation.py +file + + + + +2015-08-19T22:00:56.000000Z +8f1ef0baad13373c0b2d3afa16c6daf8 +2014-10-22T14:43:41.347288Z +882 +joscanoa + + + + + + + + + + + + + + + + + + + + + +6743 + +amisr_winds_proc_offline.py +file +1115 + + + +2015-11-12T15:12:10.000000Z +cd64883a993633f3e52863f810757c49 +2015-11-26T20:42:43.496114Z +1115 +kkuyeng + + + + + + + + + + + + + + + + + + + + + +10189 + +amisr_winds_proc_online.py +file +1115 + + + +2015-11-09T19:55:14.000000Z +aa4423eea5e0bc1d91bbf7a1803a90d6 +2015-11-26T20:42:43.496114Z +1115 +kkuyeng + + + + + + + + + + + + + + + + + + + + + +7426 + +beacon_phase.py +file + + + + +2015-08-19T22:00:56.000000Z +758f737670e5975c3af7695a766e1adc +2014-06-18T19:12:03.857985Z +792 +dsuarez + + + + + + + + + + + + + + + + + + + + + +2349 + +hf_plot_pdata.py +file + + + + +2015-08-19T22:00:56.000000Z +a9a74ea6bf5a6edc602a86c803a5827d +2015-03-18T14:22:24.517070Z +951 +avaldez + + + + + + + + + + + + + + + + + + + + + +9827 + +hf_test.py +file + + + + +2015-08-19T22:00:56.000000Z +e40d6032f318641f42d056a3f5f49cbd +2015-03-18T14:23:21.411737Z +952 +avaldez + + + + + + + + + + + + + + + + + + + + + +11441 + +hf_write_pdata.py +file + + + + +2015-08-19T22:00:56.000000Z +6421fbfd59187bf6620934274fd05f32 +2015-03-18T14:17:11.745988Z +950 +avaldez + + + + + + + + + + + + + + + + + + + + + +11800 + +jacktotalrunner.py +file + + + + +2015-08-19T22:00:56.000000Z +9cb28bd216659a6b11e75162a92c1807 +2015-07-01T19:19:45.148360Z +1032 +avaldez + + + + + + + + + + + + + + + + + + + + + +5811 + +jasmet30_16april.py +file + + + + +2015-08-19T22:00:56.000000Z +1cdbf19310fc8c7f802cd825bdf550a8 +2014-04-16T14:19:29.302979Z +766 +dsuarez + + + + + + + + + + + + + + + + + + + + + +3009 + +jasmet50_16april.py +file + + + + +2015-08-19T22:00:56.000000Z +b4359fd270df5b5a8ecfc6edeb5f21ba +2014-04-16T14:19:29.302979Z +766 +dsuarez + + + + + + + + + + + + + + + + + + + + + +3147 + +mst_isr_eej_blocks.py +file + + + + +2015-08-19T22:00:56.000000Z +bf10d1c0f3e57165ec123d482d0229b8 +2014-12-16T14:43:31.823208Z +906 +dsuarez + + + + + + + + + + + + + + + + + + + + + +12481 + +mst_isr_eej_processing.py +file + + + + +2015-08-19T22:00:56.000000Z +fab23ab6d30a635967d6e32e8bd33526 +2014-06-19T13:30:25.014925Z +794 +dsuarez + + + + + + + + + + + + + + + + + + + + + +14027 + +plot_eej.py +file + + + + +2015-08-19T22:00:56.000000Z +bf39e579fd3778f2aa0fbdbaf2648565 +2014-05-14T17:28:55.220752Z +777 +dsuarez + + + + + + + + + + + + + + + + + + + + + +4280 + +plot_isr.py +file + + + + +2015-08-19T22:00:56.000000Z +d35a515fe173584a65741f208f23036d +2014-05-14T17:28:55.220752Z +777 +dsuarez + + + + + + + + + + + + + + + + + + + + + +3646 + +plot_mst.py +file + + + + +2015-08-19T22:00:56.000000Z +ee07ba76ff153273cb252e4422f6c8c2 +2014-05-14T17:28:55.220752Z +777 +dsuarez + + + + + + + + + + + + + + + + + + + + + +4043 + +sousy.py +file + + + + +2015-08-19T22:00:56.000000Z +29d5e86c6fd485e109705c614e940d54 +2014-09-11T13:17:37.402870Z +849 +dsuarez + + + + + + + + + + + + + + + + + + + + + +4407 + +testRawData.py +file + + + + +2015-08-19T22:00:56.000000Z +61f240f9a7c844f4d837dc0dafe2786e +2015-06-03T15:32:50.999038Z +996 +murco + + + + + + + + + + + + + + + + + + + + + +4933 + +test_eej_blocks.py +file + + + + +2015-08-19T22:00:56.000000Z +9a5e1f72b8531eadb6186f5ad43dce08 +2014-12-18T17:13:31.562115Z +908 +dsuarez + + + + + + + + + + + + + + + + + + + + + +5183 + +test_isr_blocks.py +file + + + + +2015-08-19T22:00:56.000000Z +7ad8ffb600b04b51e240868e7234e3f5 +2014-12-18T17:13:31.562115Z +908 +dsuarez + + + + + + + + + + + + + + + + + + + + + +5397 + +test_mst_blocks.py +file + + + + +2015-08-19T22:00:56.000000Z +89c02b680f90590ba8ab4602108a0959 +2015-07-06T21:21:22.068132Z +1040 +murco + + + + + + + + + + + + + + + + + + + + + +5986 + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/150km_January_longPulse.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/150km_January_longPulse.py.svn-base new file mode 100644 index 0000000..9a27226 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/150km_January_longPulse.py.svn-base @@ -0,0 +1,185 @@ +import os, sys +import numpy +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.append(path) + +from schainpy.controller import Project + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#path = '/home/operaciones/150km_jicamarca_january/RAW_EXP/2015_ISR' +path = '/media/DATOS/2015_ISR' +#path = '/media/New Volume2/DATA/RAW_EXP/2015_ISR' + +figpath = '/home/operaciones/Pictures/150km_jicamarca_january' + +remotefolder = "/home/wmaster/graficos" + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/13', + endDate='2015/01/30', + startTime='07:55:00', + endTime='23:59:59', + online=0, + delay=10, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +a=[] +for i in range(85): + if i>20: + a.append(i) +for i in range(170): + if i>105: + a.append(i) +for i in range(255): + if i>190: + a.append(i) +for i in range(340): + if 339>i>275: + a.append(i) + if i==339: + a.append(i) + +b= str(a) +profileIndex = b[1:][:-1] + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +#profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19' +opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') + + +# opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value='21,84', format='intlist') + + +binary28="1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1" + + +CODEB=numpy.array([1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1]) +x= numpy.array([ CODEB,CODEB,-CODEB,-CODEB]) +code= ",".join(map(str,x.flatten())) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='intlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='deFlip') +opObj11.addParameter(name='channelList', value='1,3,5,7', format='intlist') + +# opObj10 = procUnitConfObj0.addOperation(name='selectHeights') +# opObj10.addParameter(name='minHei', value='50', format='float') +# opObj10.addParameter(name='maxHei', value='150', format='float') + +# opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='4', format='float') + + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='zmin', value='40', format='int') +# opObj11.addParameter(name='zmax', value='90', format='int') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='64', format='int') + +#procUnitConfObj1.addParameter(name='pairsList', value='(3,7),(2,6)', format='pairsList') +procUnitConfObj1.addParameter(name='pairsList', value='(1,0),(3,2),(5,4),(7,6)', format='pairsList') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='60', format='float') + +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2001', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca', format='str') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# # opObj11.addParameter(name='zmin', value='0', format='int') +# # opObj11.addParameter(name='zmax', value='60', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2005', format='int') +opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_LongPulse', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + + + + + +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='Coherence', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') + +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + + + + + + + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3002', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_LongPulse', format='str') +# # opObj11.addParameter(name='xmin', value='20.5', format='float') +# # opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='80', format='int') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/150km_January_shortPulse.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/150km_January_shortPulse.py.svn-base new file mode 100644 index 0000000..f82449e --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/150km_January_shortPulse.py.svn-base @@ -0,0 +1,152 @@ +import os, sys +import numpy +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.append(path) + +from schainpy.controller import Project + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#path = '/home/operaciones/150km_jicamarca_january/RAW_EXP/2015_ISR' +path = '/media/DATOS/2015_ISR' +#path = '/media/New Volume2/DATA/RAW_EXP/2015_ISR' + +figpath = '/home/operaciones/Pictures/150km_jicamarca_january' + +remotefolder = "/home/wmaster/graficos" + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/14', + endDate='2015/01/30', + startTime='07:40:00', + endTime='23:59:59', + online=0, + delay=10, + walk=1, + nTxs=4) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='rangeList', value='(1,80),(341,420),(681,760),(1021,1100)', format='multiList') + +# opObj11 = procUnitConfObj0.addOperation(name='filterByHeights') +# opObj11.addParameter(name='window', value='1', format='int') +# opObj11.addParameter(name='axis', value='2', format='int') + +cod7barker="1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1" +# 1,1,1,-1,-1,1,-1 +#-1,-1,-1,1,1,-1,1 +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=cod7barker, format='floatlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='7', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='deFlip') +opObj11.addParameter(name='channelList', value='1,3,5,7', format='intlist') + +# cod7barker="1,1,1,-1,-1,1,-1" +# opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value=cod7barker, format='intlist') +# opObj11.addParameter(name='nCode', value='1', format='int') +# opObj11.addParameter(name='nBaud', value='7', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='zmin', value='40', format='int') +# opObj11.addParameter(name='zmax', value='90', format='int') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='80', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='80', format='int') +#procUnitConfObj1.addParameter(name='pairsList', value='(3,7),(2,6)', format='pairsList') +procUnitConfObj1.addParameter(name='pairsList', value='(1,0),(3,2),(5,4),(7,6)', format='pairsList') + +# +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='60', format='float') +# +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2004', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2006', format='int') +opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_ShortPulse', format='str') +opObj11.addParameter(name='coherence_cmap', value='jet', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +# opObj11.addParameter(name='ymin', value='0', format='int') +# opObj11.addParameter(name='ymax', value='105', format='int') +opObj11.addParameter(name='zmin', value='15', format='int') +opObj11.addParameter(name='zmax', value='45', format='int') +opObj11.addParameter(name='exp_code', value='14', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + +# +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='Coherence', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='14', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3005', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# # opObj11.addParameter(name='xmin', value='20.5', format='float') +# # opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/150km_january_1.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/150km_january_1.py.svn-base new file mode 100644 index 0000000..99680bf --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/150km_january_1.py.svn-base @@ -0,0 +1,119 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/home/operaciones/150km_jicamarca_january/RAW_EXP/2015_ISR' + +figpath = '/home/operaciones/Pictures/150km_jicamarca_january' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/13', + endDate='2015/01/30', + startTime='07:55:00', + endTime='23:59:59', + online=1, + delay=10, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='21,84', format='intlist') + + +binary28="1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1" + +#cod7barker="1,1,1,-1,-1,1,-1" +#cod7barkerneg="-1,-1,-1,1,1,-1,1" +CODEB=numpy.array([1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1]) +x= numpy.array([ CODEB,CODEB,-CODEB,-CODEB]) +code= ",".join(map(str,x.flatten())) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='intlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='4', format='float') + + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') + + + +# opObj11.addParameter(name='zmin', value='40', format='int') +# opObj11.addParameter(name='zmax', value='90', format='int') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='64', format='int') + +#procUnitConfObj1.addParameter(name='pairsList', value='(0,1),(2,3),(4,5),(6,7)', format='pairsList') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='10', format='float') + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2001', format='int') +opObj11.addParameter(name='wintitle', value='150km_Jicamarca', format='str') +#opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# opObj11.addParameter(name='zmin', value='0', format='int') +# opObj11.addParameter(name='zmax', value='60', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') + + + +# opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2005', format='int') +# opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_ShortPulse', format='str') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +# +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='3002', format='int') +opObj11.addParameter(name='wintitle', value='150km_Jicamarca', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +#opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +#opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/150km_january_3.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/150km_january_3.py.svn-base new file mode 100644 index 0000000..fe56f3e --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/150km_january_3.py.svn-base @@ -0,0 +1,128 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = './' + +figpath = '/Users/miguel/tmp' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/14', + endDate='2015/01/14', + startTime='08:30:00', + endTime='09:30:59', + online=1, + delay=10, + walk=1, + nTxs = 4) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='rangeList', value='(1,80),(341,420),(681,760),(1021,1100)', format='multiList') + + +cod7barker="1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1" + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=cod7barker, format='floatlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='7', format='int') +# +opObj11 = procUnitConfObj0.addOperation(name='deFlip') +opObj11.addParameter(name='channelList', value='1,3,5,7', format='intlist') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='80', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='80', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(1,0),(3,2),(5,4),(7,6)', format='pairsList') +# +# # +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='60', format='float') +# +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2004', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +# +opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2006', format='int') +opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_ShortPulse', format='str') +opObj11.addParameter(name='ymin', value='0', format='int') +opObj11.addParameter(name='ymax', value='105', format='int') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='zmin', value='15', format='int') +opObj11.addParameter(name='zmax', value='45', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') +# +# +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='Coherence', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='xmin', value='8.5', format='float') +opObj11.addParameter(name='xmax', value='9.5', format='float') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='save', value=1, format='bool') +opObj11.addParameter(name='pairsList', value='(1,0),(3,2)', format='pairsList') + +# opObj11.addParameter(name='wr_period', value='2', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='103', format='int') +# opObj11.addParameter(name='wintitle', value='Coherence', format='str') +# opObj11.addParameter(name='phase_cmap', value='jet', format='str') +# opObj11.addParameter(name='xmin', value='8.5', format='float') +# opObj11.addParameter(name='xmax', value='9.5', format='float') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='save', value=1, format='bool') +# opObj11.addParameter(name='pairsList', value='(5,4),(7,6)', format='pairsList') + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3005', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# # opObj11.addParameter(name='xmin', value='20.5', format='float') +# # opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +#opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +#opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/150km_jicamarca.xml.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/150km_jicamarca.xml.svn-base new file mode 100644 index 0000000..cceca18 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/150km_jicamarca.xml.svn-base @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/EWDrifts_estimation01.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/EWDrifts_estimation01.py.svn-base new file mode 100644 index 0000000..dbb9449 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/EWDrifts_estimation01.py.svn-base @@ -0,0 +1,140 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +path = '/host/Jicamarca/EW_Drifts/d2012248' +pathFigure = '/home/propietario/workspace/Graficos/drifts' + + +path = "/home/soporte/Data/drifts" +pathFigure = '/home/soporte/workspace/Graficos/drifts/prueba' +pathFile = '/home/soporte/Data/drifts/HDF5' + +xmin = 0 +xmax = 24 +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2012/09/06', + endDate='2012/09/06', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='0,127', format='intlist') + +opObj11 = procUnitConfObj0.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='3', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value='1,-1', format='floatlist') +# opObj11.addParameter(name='nCode', value='2', format='int') +# opObj11.addParameter(name='nBaud', value='1', format='int') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='128', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='128', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,1),(2,3)', format='pairsList')#,(2,3) + +opObj11 = procUnitConfObj1.addOperation(name='selectHeights') +# # opObj11.addParameter(name='minHei', value='320.0', format='float') +# # opObj11.addParameter(name='maxHei', value='350.0', format='float') +opObj11.addParameter(name='minHei', value='200.0', format='float') +opObj11.addParameter(name='maxHei', value='600.0', format='float') + +opObj11 = procUnitConfObj1.addOperation(name='selectChannels') +opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='300.0', format='float') + +opObj13 = procUnitConfObj1.addOperation(name='removeDC') + +# opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj14.addParameter(name='id', value='1', format='int') +# # opObj14.addParameter(name='wintitle', value='Con interf', format='str') +# opObj14.addParameter(name='save', value='1', format='bool') +# opObj14.addParameter(name='figpath', value=pathFigure, format='str') +# # opObj14.addParameter(name='zmin', value='5', format='int') +# opObj14.addParameter(name='zmax', value='30', format='int') +# +# opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj12.addParameter(name='id', value='2', format='int') +# opObj12.addParameter(name='wintitle', value='RTI Plot', format='str') +# opObj12.addParameter(name='save', value='1', format='bool') +# opObj12.addParameter(name='figpath', value = pathFigure, format='str') +# opObj12.addParameter(name='xmin', value=xmin, format='float') +# opObj12.addParameter(name='xmax', value=xmax, format='float') +# # opObj12.addParameter(name='zmin', value='5', format='int') +# opObj12.addParameter(name='zmax', value='30', format='int') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='SpectralFitting') +opObj20.addParameter(name='path', value='/home/soporte/workspace/RemoteSystemsTempFiles', format='str') +opObj20.addParameter(name='file', value='modelSpectralFitting', format='str') +opObj20.addParameter(name='groupList', value='(0,1),(2,3)',format='multiList') + +opObj11 = procUnitConfObj2.addOperation(name='SpectralFittingPlot', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='DopplerPlot', format='str') +opObj11.addParameter(name='cutHeight', value='350', format='int') +opObj11.addParameter(name='fit', value='1', format='int')#1--True/include fit +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = pathFigure, format='str') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathFile) +opObj12.addParameter(name='blocksPerFile', value='3', format='int') + +opObj11 = procUnitConfObj2.addOperation(name='EWDriftsEstimation', optype='other') +opObj11.addParameter(name='zenith', value='-3.80208,3.10658', format='floatlist') +opObj11.addParameter(name='zenithCorrection', value='0.183201', format='float') + +opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') +opObj23.addParameter(name='zminZonal', value='-150', format='int') +opObj23.addParameter(name='zmaxZonal', value='150', format='int') +opObj23.addParameter(name='zminVertical', value='-30', format='float') +opObj23.addParameter(name='zmaxVertical', value='30', format='float') +opObj23.addParameter(name='SNR_1', value='1', format='bool') +opObj23.addParameter(name='SNRmax', value='5', format='int') +# opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/EWDrifts_estimation02.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/EWDrifts_estimation02.py.svn-base new file mode 100644 index 0000000..8980f9d --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/EWDrifts_estimation02.py.svn-base @@ -0,0 +1,65 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +path = "/home/soporte/Data/drifts/HDF5" +pathFigure = '/home/soporte/workspace/Graficos/drifts/prueba' +pathFile = '/home/soporte/Data/drifts/HDF5' + +xmin = 0 +xmax = 24 +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='HDF5Reader', + path=path, + startDate='2012/09/06', + endDate='2012/09/06', + startTime='00:00:00', + endTime='23:59:59', + timezone='lt', + walk=1) + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=readUnitConfObj.getId()) +#-------------------------------------------------------------------------------------------------- + +opObj11 = procUnitConfObj0.addOperation(name='EWDriftsEstimation', optype='other') +opObj11.addParameter(name='zenith', value='-3.80208,3.10658', format='floatlist') +opObj11.addParameter(name='zenithCorrection', value='0.183201', format='float') + +opObj23 = procUnitConfObj0.addOperation(name='EWDriftsPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') +opObj23.addParameter(name='zminZonal', value='-150', format='int') +opObj23.addParameter(name='zmaxZonal', value='150', format='int') +opObj23.addParameter(name='zminVertical', value='-30', format='float') +opObj23.addParameter(name='zmaxVertical', value='30', format='float') +opObj23.addParameter(name='SNR_1', value='1', format='bool') +opObj23.addParameter(name='SNRmax', value='5', format='int') +# opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET30MHz.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET30MHz.py.svn-base new file mode 100644 index 0000000..86d00ce --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET30MHz.py.svn-base @@ -0,0 +1,188 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "JASMET Experiment Test" +filename = "JASMETtest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +#2014051 20 Feb 2014 +# path = '/home/soporte/Data/JASMET/JASMET_30/2014106' +# pathFigure = '/home/soporte/workspace/Graficos/JASMET/prueba1' + +remotefolder = "/home/wmaster/graficos" +path = '/media/joscanoa/84A65E64A65E5730/soporte/Data/JASMET/JASMET_30/' + +pathfile1 = os.path.join(os.environ['HOME'],'Pictures/JASMET30/meteor') +pathfile2 = os.path.join(os.environ['HOME'],'Pictures/JASMET30/wind') +pathfile3 = os.path.join(os.environ['HOME'],'Pictures/JASMET30/phase') + +pathfig = os.path.join(os.environ['HOME'],'Pictures/JASMET30/graph') + +startTime = '00:00:00' +endTime = '23:59:59' +xmin ='17.0' +xmax = '34.0' + +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/04/15', + endDate='2014/04/16', + startTime=startTime, + endTime=endTime, + online=0, + delay=5, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj00 = procUnitConfObj0.addOperation(name='selectChannels') +opObj00.addParameter(name='channelList', value='0, 1, 2, 3, 4', format='intlist') + +opObj01 = procUnitConfObj0.addOperation(name='setRadarFrequency') +# opObj01.addParameter(name='frequency', value='30.e6', format='float') +opObj01.addParameter(name='frequency', value='50.e6', format='float') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nSeconds', value='100', format='int') + +opObj10 = procUnitConfObj1.addOperation(name='MeteorDetection') +# opObj10.addParameter(name='predefinedPhaseShifts', value='-89.5, 41.5, 0.0, -138.0, -85.5', format='floatlist') +opObj10.addParameter(name='predefinedPhaseShifts', value='0, 0, 0, 0, 0', format='floatlist') +opObj10.addParameter(name='cohDetection', value='0', format='bool') +opObj10.addParameter(name='noise_multiple', value='4', format='int') +opObj10.addParameter(name='SNRThresh', value='5', format='float') +opObj10.addParameter(name='phaseThresh', value='20', format='float') +opObj10.addParameter(name='azimuth', value='45', format='float') +opObj10.addParameter(name='hmin', value='68', format='float') +opObj10.addParameter(name='hmax', value='112', format='float') +opObj10.addParameter(name='saveAll', value='1', format='bool') + +opObj12 = procUnitConfObj1.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathfile1) +opObj12.addParameter(name='blocksPerFile', value='1000', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList,paramInterval',format='list') +opObj12.addParameter(name='dataList',value='data_param',format='list') +opObj12.addParameter(name='mode',value='0',format='int') +#Tiene que ser de 3 dimensiones, append en lugar de aumentar una dimension + +opObj13 = procUnitConfObj1.addOperation(name='SkyMapPlot', optype='other') +opObj13.addParameter(name='id', value='1', format='int') +opObj13.addParameter(name='wintitle', value='Sky Map', format='str') +opObj13.addParameter(name='save', value='1', format='bool') +opObj13.addParameter(name='figpath', value=pathfig, format='str') +opObj13.addParameter(name='ftp', value='1', format='int') +opObj13.addParameter(name='exp_code', value='15', format='int') +opObj13.addParameter(name='sub_exp_code', value='1', format='int') + + +#-------------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='Meteors', format='str') +opObj22.addParameter(name='nHours', value='0.25', format='float') +opObj22.addParameter(name='SNRThresh', value='12.0', format='float') + +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='2', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathfig, format='str') +opObj23.addParameter(name='zmin', value='-120', format='int') +opObj23.addParameter(name='zmax', value='120', format='int') +# opObj12.addParameter(name='zmin_ver', value='-0.8', format='float') +# opObj12.addParameter(name='zmax_ver', value='0.8', format='float') +# opObj23.addParameter(name='SNRmin', value='-10', format='int') +# opObj23.addParameter(name='SNRmax', value='60', format='int') +# opObj23.addParameter(name='SNRthresh', value='0', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +opObj23.addParameter(name='ftp', value='1', format='int') +opObj23.addParameter(name='exp_code', value='15', format='int') +opObj23.addParameter(name='sub_exp_code', value='1', format='int') + +opObj24 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj24.addParameter(name='path', value=pathfile2) +opObj24.addParameter(name='blocksPerFile', value='1000', format='int') +opObj24.addParameter(name='metadataList',value='type,inputUnit,outputInterval',format='list') +opObj24.addParameter(name='dataList',value='data_output,utctime',format='list') + +#-------------------------------------------------------------------------------------------------- +procUnitConfObj3 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) + + +opObj31 = procUnitConfObj3.addOperation(name='PhaseCalibration', optype='other') +opObj31.addParameter(name='nHours', value='0.25', format='float') +opObj31.addParameter(name='distances', value='-15, -15, 12, 12', format='intlist') +# opObj31.addParameter(name='distances', value='-25, -25, 20, 20', format='intlist') +opObj31.addParameter(name='pairs', value='(0,3),(1,2)', format='pairslist') +opObj31.addParameter(name='hmin', value='68', format='float') +opObj31.addParameter(name='hmax', value='112', format='float') + +opObj32 = procUnitConfObj3.addOperation(name='PhasePlot', optype='other') +opObj32.addParameter(name='id', value='201', format='int') +opObj32.addParameter(name='wintitle', value='PhaseCalibration', format='str') +# opObj32.addParameter(name='timerange', value='300', format='int') +opObj32.addParameter(name='xmin', value=xmin, format='float') +opObj32.addParameter(name='xmax', value=xmax, format='float') +# opObj32.addParameter(name='xmin', value='19', format='float') +# opObj32.addParameter(name='xmax', value='20', format='float') +opObj32.addParameter(name='ymin', value='-180', format='float') +opObj32.addParameter(name='ymax', value='180', format='float') +opObj32.addParameter(name='figpath', value=pathfig, format='str') +opObj32.addParameter(name='ftp', value='1', format='int') +opObj32.addParameter(name='exp_code', value='15', format='int') +opObj32.addParameter(name='sub_exp_code', value='1', format='int') + +opObj33 = procUnitConfObj3.addOperation(name='HDF5Writer', optype='other') +opObj33.addParameter(name='path', value=pathfile3) +opObj33.addParameter(name='blocksPerFile', value='1000', format='int') +opObj33.addParameter(name='metadataList',value='type,inputUnit,outputInterval',format='list') +opObj33.addParameter(name='dataList',value='data_output,utctime',format='list') +# opObj25.addParameter(name='mode',value='1,0,0',format='intlist') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj4 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj4.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj4.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj4.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj4.addParameter(name='localfolder', value=pathfig, format='str') +procUnitConfObj4.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj4.addParameter(name='ext', value='.png', format='str') +procUnitConfObj4.addParameter(name='period', value=20, format='int') +procUnitConfObj4.addParameter(name='protocol', value='ftp', format='str') + +#-------------------------------------------------------------------------------------------------- + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET30Mhz_Beacon.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET30Mhz_Beacon.py.svn-base new file mode 100644 index 0000000..a56aa48 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET30Mhz_Beacon.py.svn-base @@ -0,0 +1,81 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' +pathFigure = '/home/jasmet/jasmet30_phase' +path = '/home/soporte/Data/JASMET/JASMET_30/2014106' +pathFigure = '/home/soporte/workspace/Graficos/JASMET/prueba1' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/04/15', + endDate='2014/04/15', + startTime='20:00:00', + endTime='23:59:59', + online=0, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + + +# opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +# +# +# opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +# opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril') +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='timerange', value='300', format='int') +opObj11.addParameter(name='xmin', value='20', format='float') +opObj11.addParameter(name='xmax', value='22', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value=pathFigure, format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET50MHz_Winds.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET50MHz_Winds.py.svn-base new file mode 100644 index 0000000..6dc9ffc --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET50MHz_Winds.py.svn-base @@ -0,0 +1,105 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "JASMET Experiment Test" +filename = "JASMETtest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +#2014051 20 Feb 2014 +path = '/home/soporte/Data/JASMET/JASMET_50/2014106' +pathFigure = '/home/soporte/workspace/Graficos/JASMET' + +startTime = '00:00:00' +endTime = '23:59:59' +xmin ='19.0' +xmax = '33.0' + + +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/15', + endDate='2014/04/16', + startTime=startTime, + endTime=endTime, + online=0, + delay=5, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj00 = procUnitConfObj0.addOperation(name='selectChannels') +opObj00.addParameter(name='channelList', value='0, 1, 2, 3, 4', format='intlist') + +opObj01 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj01.addParameter(name='frequency', value='50.e6', format='float') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='Parameters', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nSeconds', value='100', format='int') + +opObj10 = procUnitConfObj1.addOperation(name='DetectMeteors') +opObj10.addParameter(name='predefinedPhaseShifts', value='-17.0, -139.0, 0.0, 48.0, -130.0', format='floatlist') +opObj10.addParameter(name='cohDetection', value='0', format='bool') +opObj10.addParameter(name='noise_multiple', value='4', format='int') +opObj10.addParameter(name='SNRThresh', value='5', format='float') +opObj10.addParameter(name='phaseThresh', value='20', format='float') +opObj10.addParameter(name='azimuth', value='45', format='float') +opObj10.addParameter(name='hmin', value='68', format='float') +opObj10.addParameter(name='hmax', value='112', format='float') +opObj10.addParameter(name='savefile', value='1', format='bool') +opObj10.addParameter(name='filename', value=filehdf5, format='str') + +opObj13 = procUnitConfObj1.addOperation(name='SkyMapPlot', optype='other') +opObj13.addParameter(name='id', value='1', format='int') +opObj13.addParameter(name='wintitle', value='Sky Map', format='str') +opObj13.addParameter(name='save', value='1', format='bool') +opObj13.addParameter(name='figpath', value=pathFigure, format='str') + +opObj11 = procUnitConfObj1.addOperation(name='WindProfiler', optype='other') +opObj11.addParameter(name='technique', value='Meteors', format='str') +opObj11.addParameter(name='nHours', value='1.0', format='float') + +opObj12 = procUnitConfObj1.addOperation(name='WindProfilerPlot', optype='other') +opObj12.addParameter(name='id', value='2', format='int') +opObj12.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') +opObj12.addParameter(name='zmin', value='-120', format='int') +opObj12.addParameter(name='zmax', value='120', format='int') +# opObj12.addParameter(name='zmin_ver', value='-0.8', format='float') +# opObj12.addParameter(name='zmax_ver', value='0.8', format='float') +# opObj23.addParameter(name='SNRmin', value='-10', format='int') +# opObj23.addParameter(name='SNRmax', value='60', format='int') +# opObj23.addParameter(name='SNRthresh', value='0', format='float') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') + +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET50Mhz_Beacon.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET50Mhz_Beacon.py.svn-base new file mode 100644 index 0000000..b2b59ac --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET50Mhz_Beacon.py.svn-base @@ -0,0 +1,78 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/15', + endDate='2014/04/15', + startTime='17:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/media/datos/jasmet50_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='timerange', value='300', format='int') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value='/media/datos/jasmet50_phase', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET_PreProc.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET_PreProc.py.svn-base new file mode 100644 index 0000000..4b5d668 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/Meteor_JASMET_PreProc.py.svn-base @@ -0,0 +1,56 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/16', + endDate='2014/04/16', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/WindProfiler_DBS01.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/WindProfiler_DBS01.py.svn-base new file mode 100644 index 0000000..fcd3b44 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/WindProfiler_DBS01.py.svn-base @@ -0,0 +1,169 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +#2014050 19 Feb 2014 +# path = '/home/soporte/Documents/MST_Data/DBS/d2014050' +# pathFigure = '/home/soporte/workspace/Graficos/DBS/d2014050p/' +# xmin = '15.5' +# xmax = '23.99999999' +# startTime = '17:25:00' +# filehdf5 = "DBS_2014050.hdf5" + +#2014051 20 Feb 2014 +path = '/home/soporte/Data/MST/DBS/d2014051' +pathFigure = '/home/soporte/workspace/Graficos/DBS/prueba1/' +xmin = '0' +xmax = '7.5' +startTime = '00:00:00' +filehdf5 = "DBS_2014051.hdf5" + + + +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/01/31', + endDate='2014/03/31', + startTime=startTime, + endTime='23:59:59', + online=0, + delay=5, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='256', format='int') +# opObj11.addParameter(name='n', value='16', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='selectHeightsByIndex') +opObj11.addParameter(name='minIndex', value='10', format='float') +opObj11.addParameter(name='maxIndex', value='60', format='float') + +#--------------------------------------------------------------------------------------------------- + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='64', format='int') +# procUnitConfObj1.addParameter(name='ippFactor', value='2', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(0,1),(2,1)', format='pairsList') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='5', format='int') + +opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj14.addParameter(name='id', value='1', format='int') +opObj14.addParameter(name='wintitle', value='Con interf', format='str') +opObj14.addParameter(name='save', value='1', format='bool') +opObj14.addParameter(name='figpath', value=pathFigure, format='str') +opObj14.addParameter(name='zmin', value='5', format='int') +opObj14.addParameter(name='zmax', value='90', format='int') + +opObj12 = procUnitConfObj1.addOperation(name='removeInterference') +opObj13 = procUnitConfObj1.addOperation(name='removeDC') +opObj13.addParameter(name='mode', value='1', format='int') + +opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj12.addParameter(name='id', value='2', format='int') +opObj12.addParameter(name='wintitle', value='RTI Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') +opObj12.addParameter(name='zmin', value='5', format='int') +opObj12.addParameter(name='zmax', value='90', format='int') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +opObj21.addParameter(name='id', value='3', format='int') +opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=pathFigure, format='str') +opObj21.addParameter(name='zmin', value='5', format='int') +opObj21.addParameter(name='zmax', value='90', format='int') + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='5', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot', format='str') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=pathFigure, format='str') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='60', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=xmin, format='float') +opObj21.addParameter(name='xmax', value=xmax, format='float') + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='6', format='int') +opObj21.addParameter(name='wintitle', value='Spectral width Plot', format='str') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=pathFigure, format='str') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='60', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=xmin, format='float') +opObj21.addParameter(name='xmax', value=xmax, format='float') +opObj21.addParameter(name='zmin', value=0, format='float') +opObj21.addParameter(name='paramIndex', value=2, format='int') +opObj21.addParameter(name='onlyPositive', value=1, format='bool') + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='DBS', format='str') +opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +opObj22.addParameter(name='correctFactor', value='-1', format='float') +opObj22.addParameter(name='dirCosx', value='0.041016, 0, -0.054688', format='floatlist') +opObj22.addParameter(name='dirCosy', value='-0.041016, 0.025391, -0.023438', format='floatlist') +# opObj22.addParameter(name='horizontalOnly', value='1', format='bool') +# opObj22.addParameter(name='channelList', value='1,2', format='intlist') + +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') +opObj23.addParameter(name='zmin', value='-10', format='int') +opObj23.addParameter(name='zmax', value='10', format='int') +opObj23.addParameter(name='zmin_ver', value='-80', format='float') +opObj23.addParameter(name='zmax_ver', value='80', format='float') +opObj23.addParameter(name='SNRmin', value='-10', format='int') +opObj23.addParameter(name='SNRmax', value='60', format='int') +opObj23.addParameter(name='SNRthresh', value='0', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') + +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/WindProfiler_SA01.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/WindProfiler_SA01.py.svn-base new file mode 100644 index 0000000..8d0a8c6 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/WindProfiler_SA01.py.svn-base @@ -0,0 +1,139 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "SA Experiment Test" +filename = "SA2014050.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#Experimentos + +#2014050 19 Feb 2014 +path = '/home/soporte/Data/MST/SA/d2014050' +pathFigure = '/home/soporte/workspace/Graficos/SA/prueba1/' +xmin = '15.5' +xmax = '24' +startTime = '15:30:00' +filehdf5 = "SA_2014050.hdf5" + +#2014051 20 Feb 2014 +# path = '/home/soporte/Data/MST/SA/d2014051' +# pathFigure = '/home/soporte/workspace/Graficos/SA/new/' +# xmin = '0.0' +# xmax = '8.0' +# startTime = '00:00:00' +# filehdf5 = "SA_2014051.hdf5" + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/01/01', + endDate='2014/03/31', + startTime=startTime, + endTime='23:59:59', + online=0, + delay=5, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='600', format='int') +# opObj11.addParameter(name='n', value='10', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='selectHeightsByIndex') +opObj11.addParameter(name='minIndex', value='10', format='float') +opObj11.addParameter(name='maxIndex', value='60', format='float') +#--------------------------------------------------------------------------------------------------- +procUnitConfObj1 = controllerObj.addProcUnit(datatype='CorrelationProc', inputId=procUnitConfObj0.getId()) +# procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(1,0),(2,3)', format='pairsList') +procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(0,3),(0,2),(1,3),(1,2),(0,1),(2,3)', format='pairsList') +procUnitConfObj1.addParameter(name='fullT', value='1', format='bool') +procUnitConfObj1.addParameter(name='removeDC', value='1', format='bool') +#procUnitConfObj1.addParameter(name='lagT', value='0,1,2,3', format='intlist') + +opObj12 = procUnitConfObj1.addOperation(name='CorrelationPlot', optype='other') +opObj12.addParameter(name='id', value='1', format='int') +opObj12.addParameter(name='wintitle', value='CrossCorrelation Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='zmin', value='0', format='int') +opObj12.addParameter(name='zmax', value='1', format='int') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') + +opObj12 = procUnitConfObj1.addOperation(name='removeNoise') +opObj12.addParameter(name='mode', value='2', format='int') +opObj12 = procUnitConfObj1.addOperation(name='calculateNormFactor') + +opObj12 = procUnitConfObj1.addOperation(name='CorrelationPlot', optype='other') +opObj12.addParameter(name='id', value='2', format='int') +opObj12.addParameter(name='wintitle', value='CrossCorrelation Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='zmin', value='0', format='int') +opObj12.addParameter(name='zmax', value='1', format='int') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') + +#--------------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetLags') + +opObj21 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj21.addParameter(name='technique', value='SA', format='str') +# opObj21.addParameter(name='correctFactor', value='-1', format='float') +opObj21.addParameter(name='positionX', value='36,0,36,0', format='floatlist') +opObj21.addParameter(name='positionY', value='36,0,0,36', format='floatlist') +opObj21.addParameter(name='azimuth', value='51.06', format='float') +opObj21.addParameter(name='crosspairsList', value='(0,3),(0,2),(1,3),(1,2),(0,1),(2,3)', format='pairsList')#COrregir +# +opObj22 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj22.addParameter(name='id', value='4', format='int') +opObj22.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj22.addParameter(name='save', value='1', format='bool') +opObj22.addParameter(name='figpath', value = pathFigure, format='str') +opObj22.addParameter(name='zmin', value='-15', format='int') +opObj22.addParameter(name='zmax', value='15', format='int') +opObj22.addParameter(name='zmin_ver', value='-80', format='float') +opObj22.addParameter(name='zmax_ver', value='80', format='float') +opObj22.addParameter(name='SNRmin', value='-20', format='int') +opObj22.addParameter(name='SNRmax', value='40', format='int') +opObj22.addParameter(name='SNRthresh', value='-3.5', format='float') +opObj22.addParameter(name='xmin', value=xmin, format='float') +opObj22.addParameter(name='xmax', value=xmax, format='float') +# #----------------------------------------------------------------------------------- +# +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +# procUnitConfObj2.addParameter(name='nFFTPoints', value='128', format='int') +# procUnitConfObj2.addParameter(name='nProfiles', value='128', format='int') +# procUnitConfObj2.addParameter(name='pairsList', value='(0,0),(0,1),(2,1)', format='pairsList') +# +# opObj22 = procUnitConfObj2.addOperation(name='SpectraPlot', optype='other') +# opObj22.addParameter(name='id', value='5', format='int') +# opObj22.addParameter(name='wintitle', value='Spectra Plot', format='str') +# opObj22.addParameter(name='save', value='1', format='bool') +# opObj22.addParameter(name='figpath', value = pathFigure, format='str') + +#----------------------------------------------------------------------------------- + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/__init__.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/__init__.py.svn-base new file mode 100644 index 0000000..8feaeca --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/__init__.py.svn-base @@ -0,0 +1,5 @@ +''' +Created on Jul 2, 2014 + +@author: roj-idl71 +''' diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_EEJ.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_EEJ.py.svn-base new file mode 100644 index 0000000..76880db --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_EEJ.py.svn-base @@ -0,0 +1,123 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/eej') + +xmin = '7' +xmax = '15' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/07', + endDate='2014/10/07', + startTime='07:00:00', + endTime='15:00:00', + walk=0, + timezone='lt', + all=0, + online=0) + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value='1', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +#opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +#opObj11.addParameter(name='timeInterval', value='10', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=64, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +# opObj11.addParameter(name='n', value='90', format='int') +opObj11.addParameter(name='timeInterval', value='30', format='float') + +#RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmax', value='68', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmax', value='68', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + + +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_eej_proc_offline.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_eej_proc_offline.py.svn-base new file mode 100644 index 0000000..19a263a --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_eej_proc_offline.py.svn-base @@ -0,0 +1,194 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/EEJ' + +xmin = '07' +xmax = '18' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' +show = '0' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + startTime='07:01:30',#'07:00:00', + endTime='18:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h +#opObj10.addParameter(name='frequency', value='435e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='150', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +# #procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(4,4)', \ +# # format='pairsList') +# +# # procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0)', \ +# # format='pairsList') +# # +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') +# # +# #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# # +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') +opObj11.addParameter(name='show', value = show, format='bool') + +# # # +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') +opObj11.addParameter(name='show', value = show, format='bool') + + + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=figpath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=figpath+'/param') +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_eej_proc_online.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_eej_proc_online.py.svn-base new file mode 100644 index 0000000..1c3a1de --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_eej_proc_online.py.svn-base @@ -0,0 +1,205 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/EEJ' +remotefolder = "/home/wmaster/graficos" + +xmin = '07' +xmax = '18' +ymin ='30' +ymax ='300' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + startTime='07:01:30',#'07:00:00', + endTime='17:55:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h +#opObj10.addParameter(name='frequency', value='440e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='150', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +#procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_esf_proc_offline.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_esf_proc_offline.py.svn-base new file mode 100644 index 0000000..853579c --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_esf_proc_offline.py.svn-base @@ -0,0 +1,197 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +xmin = '18' +xmax = '31' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '0' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +str2 = str - datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") +yesterday = str2.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=yesterday, #'2014/10/07', + endDate=today, #'2014/10/07', + startTime='18:01:30',#'07:00:00', + endTime='07:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #chaned on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='435e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='650', format='float') +opObj11.addParameter(name='maxHei', value='800', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +# #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') +opObj11.addParameter(name='show', value = show, format='bool') +# # # +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') +opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=figpath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + +#generate moments +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=figpath+'/param') +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_esf_proc_online.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_esf_proc_online.py.svn-base new file mode 100644 index 0000000..fb5cf01 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_esf_proc_online.py.svn-base @@ -0,0 +1,220 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +xmin = '18' +xmax = '31' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=tomorrow, #'2014/10/07', + startTime='18:01:30',#'07:00:00', + endTime='07:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='435e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='4', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='4', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +#procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# #generate moments +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_proc.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_proc.py.svn-base new file mode 100644 index 0000000..5839c7a --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_proc.py.svn-base @@ -0,0 +1,92 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'Development/amisr/data') +path = '/media/administrator/KINGSTON/amisr' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr') + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/21', + endDate='2014/10/21', + startTime='00:00:00', + endTime='23:59:59', + walk=1, + timezone='lt') + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + + +#Beam Selector +#opObj11 = procUnitAMISRBeam0.addOperation(name='BeamSelector', optype='other') +#opObj11.addParameter(name='beam', value='0', format='int') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +#Coherent Integration +opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='8', format='int') +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=32, format='int') +#RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') + +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +#opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +#opObj11.addParameter(name='id', value='200', format='int') +#opObj11.addParameter(name='wintitle', value=title0, format='str') +#opObj11.addParameter(name='showprofile', value='0', format='int') +##Setting RTI time using xmin,xmax +#opObj11.addParameter(name='xmin', value='15', format='int') +#opObj11.addParameter(name='xmax', value='23', format='int') +#Setting dB range with zmin, zmax +#opObj11.addParameter(name='zmin', value='45', format='int') +#opObj11.addParameter(name='zmax', value='70', format='int') +#Save RTI +#figfile0 = 'amisr_rti_beam0.png' +#opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='figfile', value=figfile0, format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader.py.svn-base new file mode 100644 index 0000000..3a547ba --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader.py.svn-base @@ -0,0 +1,39 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = os.path.join(os.environ['HOME'],'Documents/amisr') #'/home/signalchain/Documents/amisr' + +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr') + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/08/18', + endDate='2014/08/18', + startTime='00:00:00', + endTime='23:59:59', + walk=1) + +procUnitAMISR = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISR.addOperation(name='PrintInfo', optype='other') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader_exp.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader_exp.py.svn-base new file mode 100644 index 0000000..02b3033 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader_exp.py.svn-base @@ -0,0 +1,47 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment Test" +filename = "amisr.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/home/administrator/Documents/amisr' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISR', + path=path, + startDate='2014/08/18', + endDate='2014/08/18', + startTime='00:00:00', + endTime='23:59:59', + walk=1) + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='AMISR', format='str') +opObj11.addParameter(name='type', value='iq', format='str') + +opObj11 = procUnitConfObjBeam1.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='0,81', format='intlist') + +opObj11 = procUnitConfObj0.addOperation(name='PowerProfile', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Power Profile', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader_exp_ex2.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader_exp_ex2.py.svn-base new file mode 100644 index 0000000..666fd0a --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_reader_exp_ex2.py.svn-base @@ -0,0 +1,404 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment Test" +filename = "amisr.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/home/administrator/Documents/amisr_bug' +path = '/media/administrator/New Volume/amisr' +#path = '/media/administrator/Toshiba/data' +figpath = '/home/administrator/Pictures/amisr' + +figfile0 = 'amisr_rti_beam0.png' +figfile1 = 'amisr_rti_beam1.png' +figfile2 = 'amisr_rti_beam2.png' +figfile3 = 'amisr_rti_beam3.png' +figfile4 = 'amisr_rti_beam4.png' +figfile5 = 'amisr_rti_beam5.png' +figfile6 = 'amisr_rti_beam6.png' + +title0 = 'RTI AMISR Beam 0' +title1 = 'RTI AMISR Beam 1' +title2 = 'RTI AMISR Beam 2' +title3 = 'RTI AMISR Beam 3' +title4 = 'RTI AMISR Beam 4' +title5 = 'RTI AMISR Beam 5' +title6 = 'RTI AMISR Beam 6' + +profileStrSelBeam0 = '0,101' +profileStrSelBeam1 = '614,741' +profileStrSelBeam2 = '358,485' +profileStrSelBeam3 = '742,869' +profileStrSelBeam4 = '230,357' +profileStrSelBeam5 = '486,613' +profileStrSelBeam6 = '102,229' + +nProfiles = '32' +nFFTPoints = '32' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISR', + path=path, + startDate='2014/08/18', + endDate='2014/08/18', + startTime='00:00:00', + endTime='23:59:59', + walk=1) + + + +# procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# opObj11 = procUnitConfObjBeam0.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value=profileStrSelBeam0, format='intlist') + +# procUnitConfObjBeam1 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam2 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam3 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam4 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam5 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam6 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +# procUnitAMISR = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +# opObj11 = procUnitAMISR.addOperation(name='BeamSelector', optype='other') +# opObj11.addParameter(name='beam', value='1', format='int') +# +# procUnitConfObjBeam1 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam0.getId()) +# +# opObj11 = procUnitConfObjBeam1.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='128', format='int') +# +# +# procUnitConfObjSpectraBeam1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam1.getId()) +# procUnitConfObjSpectraBeam1.addParameter(name='nFFTPoints', value='32', format='int') +# procUnitConfObjSpectraBeam1.addParameter(name='nProfiles', value='32', format='int') +# +# opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='450', format='float') +# +# opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='100', format='int') +# opObj11.addParameter(name='wintitle', value='SpectraPlot', format='str') + + + + + + + +# ############################# Beam0 ############################# +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) + +#opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + + +opObj11 = procUnitAMISRBeam0.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='0', format='int') + +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam0.getId()) + +opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') + + + + +# procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# opObj11 = procUnitConfObjBeam0.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value=profileStrSelBeam0, format='intlist') +# +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='102', format='int') +# +# procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam0.getId()) +# procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value='32', format='int') +# procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value='32', format='int') +# +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='450', format='float') +# +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='100', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# #opObj11.addParameter(name='timerange', value='7200', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile0, format='str') +# +# +# +# +# +# # + +# ############################# Beam1 ############################# +procUnitAMISRBeam1 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) + +#opObj11 = procUnitAMISRBeam1.addOperation(name='PrintInfo', optype='other') + + +opObj11 = procUnitAMISRBeam1.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='1', format='int') + +procUnitConfObjBeam1 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam1.getId()) + +opObj11 = procUnitConfObjBeam1.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + +procUnitConfObjSpectraBeam1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam1.getId()) +procUnitConfObjSpectraBeam1.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam1.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 1', format='str') + +# +# opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='201', format='int') +# opObj11.addParameter(name='wintitle', value=title1, format='str') +# #opObj11.addParameter(name='timerange', value='36000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile1, format='str') +# # +# # +# # +# # +# # +# ############################## Beam2 ############################# +procUnitAMISRBeam2 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam2.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='2', format='int') + +procUnitConfObjBeam2 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam2.getId()) + +opObj11 = procUnitConfObjBeam2.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam2 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam2.getId()) +procUnitConfObjSpectraBeam2.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam2.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam2.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam2.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 2', format='str') + +# +# opObj11 = procUnitConfObjSpectraBeam2.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='202', format='int') +# opObj11.addParameter(name='wintitle', value=title2, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile2, format='str') +# +# +# +# +# +# +# ############################## Beam3 ############################# +procUnitAMISRBeam3 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam3.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='3', format='int') + +procUnitConfObjBeam3 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam3.getId()) + +opObj11 = procUnitConfObjBeam3.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam3 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam3.getId()) +procUnitConfObjSpectraBeam3.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam3.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam3.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam3.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='103', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 3', format='str') + +# +# opObj11 = procUnitConfObjSpectraBeam3.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='203', format='int') +# opObj11.addParameter(name='wintitle', value=title3, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile3, format='str') +# # # +# # # +# # # +# # # +# # # +# # # +# ############################## Beam4 ############################# +procUnitAMISRBeam4 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam4.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='4', format='int') + +procUnitConfObjBeam4 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam4.getId()) + +opObj11 = procUnitConfObjBeam4.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam4 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam4.getId()) +procUnitConfObjSpectraBeam4.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam4.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam4.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam4.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='104', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 4', format='str') + +# opObj11 = procUnitConfObjSpectraBeam4.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='204', format='int') +# opObj11.addParameter(name='wintitle', value=title4, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile4, format='str') +# # # # +# # # # +# # # # +# # # # +# # # # +# ############################## Beam5 ############################# +procUnitAMISRBeam5 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam5.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='5', format='int') + +procUnitConfObjBeam5 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam5.getId()) + +opObj11 = procUnitConfObjBeam5.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + +procUnitConfObjSpectraBeam5 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam5.getId()) +procUnitConfObjSpectraBeam5.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam5.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam5.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam5.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='105', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 5', format='str') + +# opObj11 = procUnitConfObjSpectraBeam5.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='205', format='int') +# opObj11.addParameter(name='wintitle', value=title5, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile5, format='str') +# # # +# # # # +# # # # +# # # # +# # # # +# ############################## Beam6 ############################# +procUnitAMISRBeam6 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam6.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='6', format='int') + +procUnitConfObjBeam6 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam6.getId()) + +opObj11 = procUnitConfObjBeam6.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam6 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam6.getId()) +procUnitConfObjSpectraBeam6.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam6.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam6.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam6.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='106', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 6', format='str') +# +# opObj11 = procUnitConfObjSpectraBeam6.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='206', format='int') +# opObj11.addParameter(name='wintitle', value=title6, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile6, format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_spreadF.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_spreadF.py.svn-base new file mode 100644 index 0000000..56a6712 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_spreadF.py.svn-base @@ -0,0 +1,119 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/spreadF/filt2') + +xmin = '18' +xmax = '31' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/06', + endDate='2014/10/07', + startTime='18:00:00', + endTime='07:00:00', + walk=0, + timezone='lt', + all=0, + online=0) + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +opObj11 = procUnitConfObjBeam0.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='2', format='int') + +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value='1', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') +# opObj12.addParameter(name='maxHei', value='10', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='timeInterval', value='30', format='int') +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=64, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='30', format='float') +# opObj11.addParameter(name='n', value='64', format='int') + +#RemoveDc +#opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='200', format='float') +opObj11.addParameter(name='maxHei', value='700', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value='54', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value='54', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + + +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_windEstimation.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_windEstimation.py.svn-base new file mode 100644 index 0000000..ee0e461 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_windEstimation.py.svn-base @@ -0,0 +1,147 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'Development/amisr/data') +path = '/home/soporte/Data/AMISR' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr') + +pathFigure = '/home/operaciones/Documents/AMISR_windprofiler/20141023' +xmin = '8.0' +xmax = '12.0' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/23', + endDate='2014/10/23', + startTime='00:00:00', + endTime='23:59:59', + walk=1, + timezone='lt') + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + + +#Beam Selector +#opObj11 = procUnitAMISRBeam0.addOperation(name='BeamSelector', optype='other') +#opObj11.addParameter(name='beam', value='0', format='int') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') +#Coherent Integration +opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='8', format='int') +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=32, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='16', format='int') + +#RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = pathFigure, format='str') +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='200', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') + +# Save RTI +# figfile0 = 'amisr_rti_beam0.png' +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile0, format='str') + +#----------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0 .getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +opObj21.addParameter(name='id', value='3', format='int') +opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=pathFigure, format='str') +opObj21.addParameter(name='zmin', value='30', format='int') +opObj21.addParameter(name='zmax', value='80', format='int') + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='DBS', format='str') +opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +opObj22.addParameter(name='correctFactor', value='-1', format='float') +opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +opObj22.addParameter(name='elevation', value='74.53,75.90.0,75.60,75.60', format='floatlist') +# opObj22.addParameter(name='horizontalOnly', value='1', format='bool') +# opObj22.addParameter(name='channelList', value='1,2', format='intlist') + +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') +opObj23.addParameter(name='zmin', value='-20', format='int') +opObj23.addParameter(name='zmax', value='20', format='int') +opObj23.addParameter(name='zmin_ver', value='-100', format='float') +opObj23.addParameter(name='zmax_ver', value='100', format='float') +opObj23.addParameter(name='SNRmin', value='-20', format='int') +opObj23.addParameter(name='SNRmax', value='30', format='int') +opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_winds_proc_offline.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_winds_proc_offline.py.svn-base new file mode 100644 index 0000000..9f55242 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_winds_proc_offline.py.svn-base @@ -0,0 +1,222 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +# path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +# path = '/mnt/data_amisr' +# path = '/media/soporte/E9F4-F053/AMISR/Data/winds' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/winds' +remotefolder = "/home/wmaster/graficos" +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/winds/plots' + +xmin = '08' +xmax = '18' +dbmin = '50' #'60'#'55' #'40' #noise esf eej +dbmax = '80' #'70' #'55' + +ippFactor = '5' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2015/11/12', #'2014/10/07', + endDate='2015/11/12', #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') + + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='ippFactor', value=ippFactor, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='64', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='9', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +# +# +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +#For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + +# opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +# opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.6', format='floatlist') + +#Parameters Process +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='DBS', format='str') +opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +opObj22.addParameter(name='correctFactor', value='-1', format='float') +opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.60', format='floatlist') + +#WindProfilerPlot +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = figpath, format='str') +opObj23.addParameter(name='zmin', value='-20', format='int') +opObj23.addParameter(name='zmax', value='20', format='int') +opObj23.addParameter(name='zmin_ver', value='-100', format='float') +opObj23.addParameter(name='zmax_ver', value='100', format='float') +opObj23.addParameter(name='SNRmin', value='-20', format='int') +opObj23.addParameter(name='SNRmax', value='30', format='int') +opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +opObj23.addParameter(name='ftp', value='1', format='int') +opObj23.addParameter(name='wr_period', value='2', format='int') +opObj23.addParameter(name='exp_code', value='21', format='int') +opObj23.addParameter(name='sub_exp_code', value='3', format='int') +opObj23.addParameter(name='ftp_wei', value='0', format='int') +opObj23.addParameter(name='plot_pos', value='0', format='int') + +#--------------------------------------------------------------------------------------------- + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/amisr_winds_proc_online.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/amisr_winds_proc_online.py.svn-base new file mode 100644 index 0000000..4a67b51 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/amisr_winds_proc_online.py.svn-base @@ -0,0 +1,176 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +# path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +# path = '/mnt/data_amisr' +# path = '/media/soporte/E9F4-F053/AMISR/Data/winds' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +figpath = '/home/soporte/Data/winds/plots' +remotefolder = "/home/wmaster/graficos" + +xmin = '08' +xmax = '18' +dbmin = '50' #'60'#'55' #'40' #noise esf eej +dbmax = '80' #'70' #'55' + +#to consider that each real IPP is actually original_IPP * nchannels +ippFactor = '5' + +# code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +# nCode = '1' +# nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/10/28', #'2014/10/07', + endDate='2014/10/28', #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') + + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='ippFactor', value=ippFactor, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='16', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='9', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +# +# +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/beacon_phase.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/beacon_phase.py.svn-base new file mode 100644 index 0000000..9f9d784 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/beacon_phase.py.svn-base @@ -0,0 +1,56 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "jasmet20140415.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50/d2014104' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2013/08/21', + endDate='2013/08/21', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(0,5),(1,5),(2,5),(3,5),(4,5)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='timerange', value='300', format='int') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value='/home/dsuarez/Pictures/beacon_abril', format='str') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/hf_plot_pdata.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/hf_plot_pdata.py.svn-base new file mode 100644 index 0000000..b61e3a4 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/hf_plot_pdata.py.svn-base @@ -0,0 +1,197 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "HF_EXAMPLE" +filename = "hf_test.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#path='/media/APOLLO/HF_rawdata/d2015026/0/cspec' +#path='/media/APOLLO/HF_rawdata/cspec' +#path='/media/APOLLO/bistatico' +#path='/home/alex/Downloads/pdata_hf/sousy' +path='/home/alex/Downloads/pdata_hf' +#path='/media/APOLLO/bistatico' + + + +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f0" #f0=2.72e6 +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f1" #f0=3.64e6 +#path='/media/APOLLO/HF_rawdata/test' +#figpath='/home/alex/Pictures/hf2_16/last_data' +figpath='/home/alex/Pictures/pdata_plot' +pathFigure='/home/alex/Pictures/hf2_16/last_data' +#path='/home/alex/Downloads/ICA_LAST_TEST' + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2015/01/12', + endDate='2015/05/13', + startTime='00:00:00', + endTime='23:59:59', + online=0, + #set=1426485881, + delay=10, + walk=1 + #timezone=-5*3600 + ) + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1000', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='zmin', value='-120', format='float') +opObj11.addParameter(name='zmax', value='-70', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile_spectra_name, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='exp_code', value='20', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# # figfile_power_name="jro_power_image"+freq2+date+ext_img +# # print figfile_power_name +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2000', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='zmin', value='-110', format='float') +opObj11.addParameter(name='zmax', value='-50', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='figfile', value=figfile_power_name, format='str') +#opObj11.addParameter(name='wr_period', value='5', format='int') + +# +# opObj11 = procUnitConfObj1.addOperation(name='PowerProfile', optype='other') +# opObj11.addParameter(name='id', value='2004', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# #opObj11.addParameter(name='channelList', value='0', format='intlist') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# #opObj11.addParameter(name='xmin', value='10', format='int') +# #opObj11.addParameter(name='xmax', value='40', format='int') +# +# # figfile_phase_name="jro_phase_image"+freq1+date+ext_img +# # print figfile_phase_name +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='3000', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='1', format='int') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value=figpath, format='str') + # opObj11.addParameter(name='figfile', value=figfile_phase_name, format='str') + # opObj11.addParameter(name='wr_period', value='5', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='6005', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# opObj11.addParameter(name='zmin', value='-110', format='float') +# opObj11.addParameter(name='zmax', value='-50', format='float') +# #opObj11.addParameter(name='xmin', value='0', format='float') +# #opObj11.addParameter(name='xmax', value='24', format='float') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# +# +# +# xmin = 0 +# xmax = 24 +# +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +# opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +# opObj21.addParameter(name='id', value='3', format='int') +# opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +# opObj21.addParameter(name='save', value='1', format='bool') +# opObj21.addParameter(name='figpath', value=pathFigure, format='str') +# opObj21.addParameter(name='zmin', value='5', format='int') +# opObj21.addParameter(name='zmax', value='90', format='int') +# +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='4000', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot0', format='str') +opObj21.addParameter(name='channelList', value='0', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') +#opObj21.addParameter(name='parameterIndex', value=, format='int') + +# +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='5000', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot1', format='str') +opObj21.addParameter(name='channelList', value='1', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-20', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') + +# +# +# opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +# opObj23.addParameter(name='id', value='4', format='int') +# opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +# opObj23.addParameter(name='save', value='1', format='bool') +# opObj23.addParameter(name='figpath', value = pathFigure, format='str') +# opObj23.addParameter(name='zminZonal', value='-150', format='int') +# opObj23.addParameter(name='zmaxZonal', value='150', format='int') +# opObj23.addParameter(name='zminVertical', value='-30', format='float') +# opObj23.addParameter(name='zmaxVertical', value='30', format='float') +# opObj23.addParameter(name='SNR_1', value='1', format='bool') +# opObj23.addParameter(name='SNRmax', value='5', format='int') +# # opObj23.addParameter(name='SNRthresh', value='-50', format='float') +# opObj23.addParameter(name='xmin', value=xmin, format='float') +# opObj23.addParameter(name='xmax', value=xmax, format='float') +# +# +# # opObj11 = procUnitConf.Obj1.addOperation(name='SendByFTP', optype='other') +# # opObj11.addParameter(name='ext', value='*.jpeg', format='str') +# # opObj11.addParameter(name='localfolder', value='/home/alex/Pictures/ftp', format='str') +# # opObj11.addParameter(name='remotefolder', value='/home/wmaster/web2/data/JRO/HFT/2015/03/11/figures/', format='str') +# # opObj11.addParameter(name='server', value='181.177.232.125', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/hf_test.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/hf_test.py.svn-base new file mode 100644 index 0000000..0aff4c7 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/hf_test.py.svn-base @@ -0,0 +1,236 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +#--------------------------------------- +freq1="_2.72MHz_" +freq2="_3.64MHz_" + +date="2015-03-12_N" +ext_img=".jpeg" + + +#--------------------------------------- + + + +desc = "HF_EXAMPLE" +filename = "hf_test.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#-----------------------PATH------------------------------# +#path='/media/APOLLO/HF_rawdata/d2015026/0/cspec' +#path='/media/APOLLO/HF_rawdata/cspec' +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f0" #f0=2.72e6 +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f1" #f0=3.64e6 +#path='/media/APOLLO/HF_rawdata/test' +path='/media/APOLLO/HF_rawdata/HFT_miercoles/sp01_f0' +#---------------------------------------------------------# + +#---------------------PATH-FIGURE------------------------# +#figpath='/home/alex/Pictures/hf2_16/last_data' +figpath='/home/alex/Pictures/ftp' +pathFigure='/home/alex/Pictures/hf2_16/last_data' +#path='/home/alex/Downloads/ICA_LAST_TEST' +#---------------------------------------------------------# +readUnitConfObj = controllerObj.addReadUnit(datatype='HFReader', + path=path, + startDate='2013/01/1', + endDate='2015/05/13', + startTime='00:00:00', + endTime='23:59:59', + online=0, + #set=1426485881, + delay=10, + walk=1, + timezone=-5*3600) + + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +# opObj12 = procUnitConfObj0.addOperation(name='selectChannels',optype='self') +# opObj12.addParameter(name='channelList', value='0', format='intList') + +opObj12 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj12.addParameter(name='frequency', value='3.64e6', format='float') + +opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj12.addParameter(name='n', value='4', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='ymin', value='-1e-8', format='float') +# opObj11.addParameter(name='ymax', value='1e-8', format='float') +# # +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='25', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='25', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,1)', format='pairsList') + + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='6', format='float') + +#opObj11 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='other') +#opObj11.addParameter(name='path', value='/home/alex/Downloads/pdata_hf') +#opObj11.addParameter(name='blocksPerFile', value='1', format='int') +# +# +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2001', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='zmin', value='-120', format='float') +opObj11.addParameter(name='zmax', value='-70', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile_spectra_name, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='exp_code', value='20', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + +# figfile_power_name="jro_power_image"+freq2+date+ext_img +# print figfile_power_name +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='3002', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='zmin', value='-110', format='float') +opObj11.addParameter(name='zmax', value='-50', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='figfile', value=figfile_power_name, format='str') +#opObj11.addParameter(name='wr_period', value='5', format='int') + + +#opObj11 = procUnitConfObj1.addOperation(name='PowerProfile', optype='other') +#opObj11.addParameter(name='id', value='2004', format='int') +#opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +#opObj11.addParameter(name='save', value='1', format='bool') +#opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='xmin', value='10', format='int') +#opObj11.addParameter(name='xmax', value='40', format='int') + +# figfile_phase_name="jro_phase_image"+freq1+date+ext_img +# print figfile_phase_name +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='1', format='int') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value=figpath, format='str') + # opObj11.addParameter(name='figfile', value=figfile_phase_name, format='str') + # opObj11.addParameter(name='wr_period', value='5', format='int') + +#opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +#opObj11.addParameter(name='id', value='6005', format='int') +#opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +#opObj11.addParameter(name='zmin', value='-110', format='float') +#opObj11.addParameter(name='zmax', value='-50', format='float') +#opObj11.addParameter(name='xmin', value='0', format='float') +#opObj11.addParameter(name='xmax', value='24', format='float') +#opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +#opObj11.addParameter(name='save', value='1', format='bool') +#opObj11.addParameter(name='figpath', value=figpath, format='str') + + + +#xmin = 0 +#xmax = 24 + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +#opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +#opObj21.addParameter(name='id', value='3', format='int') +#opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +#opObj21.addParameter(name='save', value='1', format='bool') +#opObj21.addParameter(name='figpath', value=pathFigure, format='str') +#opObj21.addParameter(name='zmin', value='5', format='int') +#opObj21.addParameter(name='zmax', value='90', format='int') + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='1', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot0', format='str') +opObj21.addParameter(name='channelList', value='0', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') +#opObj21.addParameter(name='parameterIndex', value=, format='int') + + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='2', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot1', format='str') +opObj21.addParameter(name='channelList', value='1', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-20', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') + + +# +# opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +# opObj23.addParameter(name='id', value='4', format='int') +# opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +# opObj23.addParameter(name='save', value='1', format='bool') +# opObj23.addParameter(name='figpath', value = pathFigure, format='str') +# opObj23.addParameter(name='zminZonal', value='-150', format='int') +# opObj23.addParameter(name='zmaxZonal', value='150', format='int') +# opObj23.addParameter(name='zminVertical', value='-30', format='float') +# opObj23.addParameter(name='zmaxVertical', value='30', format='float') +# opObj23.addParameter(name='SNR_1', value='1', format='bool') +# opObj23.addParameter(name='SNRmax', value='5', format='int') +# # opObj23.addParameter(name='SNRthresh', value='-50', format='float') +# opObj23.addParameter(name='xmin', value=xmin, format='float') +# opObj23.addParameter(name='xmax', value=xmax, format='float') + + +#opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +#opObj11.addParameter(name='ext', value='*.jpeg', format='str') +#opObj11.addParameter(name='localfolder', value='/home/alex/Pictures/ftp', format='str') +#opObj11.addParameter(name='remotefolder', value='/home/wmaster/web2/data/JRO/HFT/2015/03/11/figures/', format='str') +#opObj11.addParameter(name='server', value='181.177.232.125', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/hf_write_pdata.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/hf_write_pdata.py.svn-base new file mode 100644 index 0000000..ea7631b --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/hf_write_pdata.py.svn-base @@ -0,0 +1,237 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +#--------------------------------------- +freq1="_2.72MHz_" +freq2="_3.64MHz_" + +date="2015-03-12_N" +ext_img=".jpeg" + + +#--------------------------------------- + + + +desc = "HF_EXAMPLE" +filename = "hf_test.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#-----------------------PATH------------------------------# +#path='/media/APOLLO/HF_rawdata/d2015026/0/cspec' +#path='/media/APOLLO/HF_rawdata/cspec' +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f0" #f0=2.72e6 +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f1" #f0=3.64e6 +#path='/media/APOLLO/HF_rawdata/test' +path='/media/APOLLO/HF_rawdata/HFT_miercoles/sp01_f0' +#---------------------------------------------------------# + +#---------------------PATH-FIGURE------------------------# +#figpath='/home/alex/Pictures/hf2_16/last_data' +figpath='/home/alex/Pictures/ftp' +pathFigure='/home/alex/Pictures/hf2_16/last_data' +#path='/home/alex/Downloads/ICA_LAST_TEST' +#---------------------------------------------------------# +readUnitConfObj = controllerObj.addReadUnit(datatype='HFReader', + path=path, + startDate='2013/01/1', + endDate='2015/05/13', + startTime='00:00:00', + endTime='23:59:59', + online=0, + #set=850, + delay=10, + walk=1, + timezone=-5*3600) + + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +# opObj12 = procUnitConfObj0.addOperation(name='selectChannels',optype='self') +# opObj12.addParameter(name='channelList', value='0', format='intList') + +opObj12 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj12.addParameter(name='frequency', value='3.64e6', format='float') + +opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj12.addParameter(name='n', value='4', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='ymin', value='-1e-8', format='float') +# opObj11.addParameter(name='ymax', value='1e-8', format='float') +# # +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='25', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='25', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,1)', format='pairsList') + + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='6', format='float') + +opObj11 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value='/home/alex/Downloads/pdata_hf') +opObj11.addParameter(name='blocksPerFile', value='1', format='int') +# +# +# # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# # opObj11.addParameter(name='id', value='2001', format='int') +# # opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str') +# # #opObj11.addParameter(name='channelList', value='0', format='intlist') +# # opObj11.addParameter(name='zmin', value='-120', format='float') +# # opObj11.addParameter(name='zmax', value='-70', format='float') +# # opObj11.addParameter(name='save', value='1', format='int') +# # opObj11.addParameter(name='figpath', value=figpath, format='str') +# # # opObj11.addParameter(name='figfile', value=figfile_spectra_name, format='str') +# # # opObj11.addParameter(name='wr_period', value='5', format='int') +# # #opObj11.addParameter(name='ftp_wei', value='0', format='int') +# # #opObj11.addParameter(name='exp_code', value='20', format='int') +# # #opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # #opObj11.addParameter(name='plot_pos', value='0', format='int') +# # +# # figfile_power_name="jro_power_image"+freq2+date+ext_img +# # print figfile_power_name +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3002', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='channelList', value='0', format='intlist') +# opObj11.addParameter(name='xmin', value='0', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='-110', format='float') +# opObj11.addParameter(name='zmax', value='-50', format='float') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# #opObj11.addParameter(name='figfile', value=figfile_power_name, format='str') +# #opObj11.addParameter(name='wr_period', value='5', format='int') +# +# +# #opObj11 = procUnitConfObj1.addOperation(name='PowerProfile', optype='other') +# #opObj11.addParameter(name='id', value='2004', format='int') +# #opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# ##opObj11.addParameter(name='channelList', value='0', format='intlist') +# #opObj11.addParameter(name='save', value='1', format='bool') +# #opObj11.addParameter(name='figpath', value=figpath, format='str') +# ##opObj11.addParameter(name='xmin', value='10', format='int') +# ##opObj11.addParameter(name='xmax', value='40', format='int') +# +# # figfile_phase_name="jro_phase_image"+freq1+date+ext_img +# # print figfile_phase_name +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# opObj11.addParameter(name='showprofile', value='1', format='int') +# opObj11.addParameter(name='xmin', value='0', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# #opObj11.addParameter(name='channelList', value='0', format='intlist') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# # # opObj11.addParameter(name='figfile', value=figfile_phase_name, format='str') +# # # opObj11.addParameter(name='wr_period', value='5', format='int') +# +# # opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +# # opObj11.addParameter(name='id', value='6005', format='int') +# # opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# # opObj11.addParameter(name='zmin', value='-110', format='float') +# # opObj11.addParameter(name='zmax', value='-50', format='float') +# # #opObj11.addParameter(name='xmin', value='0', format='float') +# # #opObj11.addParameter(name='xmax', value='24', format='float') +# # #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# # opObj11.addParameter(name='save', value='1', format='bool') +# # opObj11.addParameter(name='figpath', value=figpath, format='str') +# +# +# +# # xmin = 0 +# # xmax = 24 +# #------------------------------------------------------------------ +# # +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# # opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +# # opObj21.addParameter(name='id', value='3', format='int') +# # opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +# # opObj21.addParameter(name='save', value='1', format='bool') +# # opObj21.addParameter(name='figpath', value=pathFigure, format='str') +# #opObj21.addParameter(name='zmin', value='5', format='int') +# #opObj21.addParameter(name='zmax', value='90', format='int') +# +# opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +# opObj21.addParameter(name='id', value='1', format='int') +# opObj21.addParameter(name='wintitle', value='Radial Velocity Plot0', format='str') +# opObj21.addParameter(name='channelList', value='0', format='intlist') +# opObj21.addParameter(name='save', value='1', format='bool') +# opObj21.addParameter(name='figpath', value=figpath, format='str') +# opObj21.addParameter(name='SNR', value='1', format='bool') +# opObj21.addParameter(name='SNRmin', value='-10', format='int') +# opObj21.addParameter(name='SNRmax', value='50', format='int') +# opObj21.addParameter(name='SNRthresh', value='0', format='float') +# opObj21.addParameter(name='xmin', value=0, format='float') +# opObj21.addParameter(name='xmax', value=24, format='float') +# #opObj21.addParameter(name='parameterIndex', value=, format='int') +# +# +# opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +# opObj21.addParameter(name='id', value='2', format='int') +# opObj21.addParameter(name='wintitle', value='Radial Velocity Plot1', format='str') +# opObj21.addParameter(name='channelList', value='1', format='intlist') +# opObj21.addParameter(name='save', value='1', format='bool') +# opObj21.addParameter(name='figpath', value=figpath, format='str') +# opObj21.addParameter(name='SNR', value='1', format='bool') +# opObj21.addParameter(name='SNRmin', value='-20', format='int') +# opObj21.addParameter(name='SNRmax', value='50', format='int') +# opObj21.addParameter(name='SNRthresh', value='0', format='float') +# opObj21.addParameter(name='xmin', value=0, format='float') +# opObj21.addParameter(name='xmax', value=24, format='float') +# +# +# +# # opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +# # opObj23.addParameter(name='id', value='4', format='int') +# # opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +# # opObj23.addParameter(name='save', value='1', format='bool') +# # opObj23.addParameter(name='figpath', value = pathFigure, format='str') +# # opObj23.addParameter(name='zminZonal', value='-150', format='int') +# # opObj23.addParameter(name='zmaxZonal', value='150', format='int') +# # opObj23.addParameter(name='zminVertical', value='-30', format='float') +# # opObj23.addParameter(name='zmaxVertical', value='30', format='float') +# # opObj23.addParameter(name='SNR_1', value='1', format='bool') +# # opObj23.addParameter(name='SNRmax', value='5', format='int') +# # # opObj23.addParameter(name='SNRthresh', value='-50', format='float') +# # opObj23.addParameter(name='xmin', value=xmin, format='float') +# # opObj23.addParameter(name='xmax', value=xmax, format='float') +# +# +# opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +# opObj11.addParameter(name='ext', value='*.jpeg', format='str') +# opObj11.addParameter(name='localfolder', value='/home/alex/Pictures/ftp', format='str') +# opObj11.addParameter(name='remotefolder', value='/home/wmaster/web2/data/JRO/HFT/2015/03/11/figures/', format='str') +# opObj11.addParameter(name='server', value='181.177.232.125', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/jacktotalrunner.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/jacktotalrunner.py.svn-base new file mode 100644 index 0000000..8dd6afa --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/jacktotalrunner.py.svn-base @@ -0,0 +1,143 @@ +import os, sys +from pytz import timezone +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) + +print path +sys.path.insert(0, path) # Para usar las librerias del eclipse. + +from schainpy.controller import Project + +# from __main__ import time +#path = os.path.split(os.getcwd())[0] +#sys.path.append(path) +# import scipy.io as sio +# import pprint +# import numpy +# import time +# import os +# import h5py +# import re +# import tables +# +# from model.data.jrodata import * +# from model.proc.jroproc_base import ProcessingUnit, Operation +# from model.io.jroIO_base import * + + +# controllerObj = Project() + +# controllerObj.setup(id = '191', name='test01', description=desc) + + +#from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#path = 'F:\CIRI Data\processed' +#path='/media/4B514E8903EBC487/CIRI Data/processed' +#path='/home/ciri/ciri_online' +#offline program +#path='/home/ciri/.gvfs/SFTP for radar on 192.168.1.161/media/dataswap/huancayo/20150701/processed' +#online program +path='/home/ciri/.gvfs/SFTP for radar on 192.168.1.161/media/dataswap/huancayo/processed' +#pathFigure = 'C:\Users\jdk5273\Documents\LiClipseWorkspace' +pathFigure='/home/ciri/Pictures/ciri' +xmin = '0' +xmax = '24' +startTime = '00:00:00' +remotefolder = "/home/wmaster/graficos" + +readUnitConfObj = controllerObj.addReadUnit(datatype='matoffReader', + path=path, + startDate='2015/05/30', + endDate='2015/05/30', + startTime=startTime, + endTime='23:59:59', + online=1, + delay=5, + walk=0) + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) + +# opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj14.addParameter(name='id', value='1', format='int') +# opObj14.addParameter(name='wintitle', value='Con interf', format='str') +# opObj14.addParameter(name='save', value='0', format='bool') +# opObj14.addParameter(name='figpath', value=pathFigure, format='str') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') + +opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj14.addParameter(name='id', value='2', format='int') +opObj14.addParameter(name='wintitle', value='Con interf', format='str') +opObj14.addParameter(name='save', value='1', format='bool') +opObj14.addParameter(name='figpath', value=pathFigure, format='str') +opObj14.addParameter(name='zmin', value='-30', format='int') +opObj14.addParameter(name='zmax', value='0', format='int') +opObj14.addParameter(name='exp_code', value='29', format='int') +opObj14.addParameter(name='wr_period', value='1', format='int') +opObj14.addParameter(name='save', value='1', format='int') + +opObj14.addParameter(name='ftp', value='1', format='int') + +opObj14 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj14.addParameter(name='id', value='4', format='int') +opObj14.addParameter(name='wintitle', value='Con interf', format='str') +opObj14.addParameter(name='phase_cmap', value='jet', format='str') +opObj14.addParameter(name='save', value='1', format='bool') +opObj14.addParameter(name='figpath', value=pathFigure, format='str') +opObj14.addParameter(name='zmin', value='-30', format='int') +opObj14.addParameter(name='zmax', value='0', format='int') +opObj14.addParameter(name='exp_code', value='29', format='int') +opObj14.addParameter(name='wr_period', value='1', format='int') +opObj14.addParameter(name='save', value='1', format='int') + +opObj14.addParameter(name='ftp', value='1', format='int') + +opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj12.addParameter(name='id', value='3', format='int') +opObj12.addParameter(name='wintitle', value='RTI Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') +opObj12.addParameter(name='zmin', value='-30', format='int') +opObj12.addParameter(name='zmax', value='0', format='int') +opObj12.addParameter(name='exp_code', value='29', format='int') +opObj12.addParameter(name='wr_period', value='1', format='int') +opObj12.addParameter(name='save', value='1', format='int') + +opObj12.addParameter(name='ftp', value='1', format='int') + +# +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=5, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + + +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + + diff --git a/schainpy/scripts/scripts_v/.svn/text-base/jasmet30_16april.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/jasmet30_16april.py.svn-base new file mode 100644 index 0000000..9ea3acd --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/jasmet30_16april.py.svn-base @@ -0,0 +1,77 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/16', + endDate='2014/04/16', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value='/home/jasmet/jasmet30_phase', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/jasmet50_16april.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/jasmet50_16april.py.svn-base new file mode 100644 index 0000000..92d85c4 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/jasmet50_16april.py.svn-base @@ -0,0 +1,79 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/16', + endDate='2014/04/16', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj11.addParameter(name='frequency', value='30.15e6', format='float') + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/media/datos/jasmet50_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value='/media/datos/jasmet50_phase', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/mst_isr_eej_blocks.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/mst_isr_eej_blocks.py.svn-base new file mode 100644 index 0000000..f495ad9 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/mst_isr_eej_blocks.py.svn-base @@ -0,0 +1,225 @@ +import os, sys +#import timeit + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "MST-ISR-EEJ Experiment Test" +filename = "mst_isr_eej_blocks.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/Volumes/HD-PXU2/mst_isr_eej' + +figpath = '/Users/dsuarez/Pictures/mst_isr_eej/' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/05/01', + endDate='2014/05/30', + startTime='00:00:00', + endTime='23:59:59', + online=0, + delay=10, + walk=0, + getblock=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +# ################ EEJ #################################### +procUnitConfObjEEJ = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjEEJ.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +opObj11 = procUnitConfObjEEJ.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value='1,-1', format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +opObj11.addParameter(name='nBaud', value='1', format='int') +opObj11.addParameter(name='mode', value='3', format='int') +opObj11.addParameter(name='times', value='32', format='int') + +# opObj11 = procUnitConfObjEEJ.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +procUnitConfObjEEJSpecta = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjEEJ.getId()) +procUnitConfObjEEJSpecta.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjEEJSpecta.addParameter(name='nProfiles', value='64', format='int') + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='timeInterval', value='10', format='float') +opObj11.addParameter(name='n', value='36', format='float') + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='60', format='int')# opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SendByFTP', optype='other') +# opObj11.addParameter(name='ext', value='*.png', format='str') +# opObj11.addParameter(name='localfolder', value=figpath, format='str') +# opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='period', value='5', format='int') + + +################ MST #################################### +procUnitConfObjMST = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjMST.addOperation(name='ProfileSelector', optype='other') +profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119' +#profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19' +opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +opObj11 = procUnitConfObjMST.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='mode',value='3',format='int') +opObj11.addParameter(name='times',value='10',format='int') + +opObj11 = procUnitConfObjMST.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='20', format='int') +opObj11.addParameter(name='byblock', value='1', format='bool') + +procUnitConfObjMSTSpectra = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjMST.getId()) +procUnitConfObjMSTSpectra.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjMSTSpectra.addParameter(name='nProfiles', value='64', format='int') + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='float') + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='200', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +# # opObj11.addParameter(name='zmin', value='35', format='int') +# # opObj11.addParameter(name='zmax', value='60', format='int') +# # opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# # opObj11.addParameter(name='ftp', value='1', format='int') +# # opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# # opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # opObj11.addParameter(name='plot_pos', value='0', format='int') +# # +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +# # opObj11.addParameter(name='xmin', value='0', format='int') +# # opObj11.addParameter(name='xmax', value='24', format='int') +# # opObj11.addParameter(name='zmin', value='35', format='int') +# # opObj11.addParameter(name='zmax', value='60', format='int') +# # opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# # opObj11.addParameter(name='ftp', value='1', format='int') +# # opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# # opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # opObj11.addParameter(name='plot_pos', value='0', format='int') + +# ################ ISR #################################### +procUnitConfObjISR = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjISR.addOperation(name='ProfileSelector', optype='other') +# profileIndex = '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' +# opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +opObj11.addParameter(name='profileRangeList', value='20,99', format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +# opObj11 = procUnitConfObjISR.addOperation(name='ProfileConcat', optype='other') +# opObj11.addParameter(name='m', value='5', format='int') + +opObj11 = procUnitConfObjISR.addOperation(name='Reshaper', optype='other') #Esta Operacion opera sobre bloques y reemplaza el ProfileConcat que opera sobre perfiles +opObj11.addParameter(name='shape', value='4,16,6750', format='intlist') # shape = (nchannels, nprofiles, nhieghts) + +opObj11 = procUnitConfObjISR.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='20', format='int') +opObj11.addParameter(name='axis', value='2', format='int') + +barker3x1 = '1,1,-1,-1,-1,1' +#barker3x5 = '1,1,1,1,1, 1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1' + +opObj11 = procUnitConfObjISR.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=barker3x1, format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +#opObj11.addParameter(name='nBaud', value='15', format='int') +opObj11.addParameter(name='nBaud', value='3', format='int') +opObj11.addParameter(name='mode', value='3', format='int') +opObj11.addParameter(name='times', value='8', format='int') +opObj11.addParameter(name='osamp', value='5', format='int') + + +procUnitConfObjISRSpectra = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjISR.getId()) +procUnitConfObjISRSpectra.addParameter(name='nFFTPoints', value='16', format='int') +procUnitConfObjISRSpectra.addParameter(name='nProfiles', value='16', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='36', format='float') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='300', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() +#print fib(5) \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/mst_isr_eej_processing.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/mst_isr_eej_processing.py.svn-base new file mode 100644 index 0000000..af0fb15 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/mst_isr_eej_processing.py.svn-base @@ -0,0 +1,271 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts Experiment Test" +filename = "mst_isr_eej.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path='/remote/ewdrifts/RAW_EXP/EW_DRIFT_FARADAY/EW_Drift' + +path1 = '/media/New Volume/DATA/MST_ISR' + +path2 = '/media/DATA/DATA/RAW_EXP/MST-EEJ' + +path = path1 + ',' + path2 + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/MST_ISR_EEJ' +gpath = '/media/datos/pictures/mstisr_mayo2014' + +path = '/Volumes/New Volume/mst_isr_eej' +gpath = '/Users/dsuarez/Pictures/poster' + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/05/15', + endDate='2014/05/15', + startTime='08:00:00', + endTime='16:00:00', + delay=3, + set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################################################### +################ MST #################################### +######################################################### + +# procUnitConfObjMST = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# +# opObj11 = procUnitConfObjMST.addOperation(name='ProfileSelector', optype='other') +# profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119' +# +# opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +# +# opObj11 = procUnitConfObjMST.addOperation(name='Decoder', optype='other') +# +# opObj11 = procUnitConfObjMST.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='20', format='int') +# +# procUnitConfObjMSTSpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjMST.getId()) +# procUnitConfObjMSTSpectra.addParameter(name='nFFTPoints', value='64', format='int') +# procUnitConfObjMSTSpectra.addParameter(name='nProfiles', value='64', format='int') +# +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='IncohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='float') + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value='/media/datos/mst2014') +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') + + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='1000', format='int') +# opObj11.addParameter(name='wintitle', value='MST', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='ymin', value='120', format='int') +# opObj11.addParameter(name='ymax', value='190', format='int') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='50', format='int') + + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='101', format='int') +# opObj11.addParameter(name='wintitle', value='MST', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='channelList', value='3', format='intlist') +# #opObj11.addParameter(name='timerange', value='300', format='float') +# opObj11.addParameter(name='xmin', value='8', format='float') +# opObj11.addParameter(name='xmax', value='16', format='float') +# opObj11.addParameter(name='ymin', value='120', format='float') +# opObj11.addParameter(name='ymax', value='190', format='float') +# opObj11.addParameter(name='zmin', value='20', format='float') +# opObj11.addParameter(name='zmax', value='45', format='float') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figfile', value='rti_mst.pdf', format='str') +# opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/poster', format='str') + + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1001', format='int') +# opObj11.addParameter(name='wintitle', value='MST', format='str') +# opObj11.addParameter(name='ymin', value='120', format='int') +# opObj11.addParameter(name='ymax', value='190', format='int') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') + +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=gpath, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='exp_code', value='19', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + +######################################################## +############### ISR #################################### +######################################################## + +procUnitConfObjISR = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjISR.addOperation(name='ProfileSelector', optype='other') + +profileIndex = '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' + +opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') + +opObj11 = procUnitConfObjISR.addOperation(name='ProfileConcat', optype='other') +opObj11.addParameter(name='m', value='5', format='int') + +opObj11 = procUnitConfObjISR.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='20', format='int') + +barker3x1 = '1,1,-1,-1,-1,1' +barker3x5 = '1,1,1,1,1, 1,1,1,1,1,-1,-1,-1,-1,-1,' + \ + '-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1' + + +opObj11 = procUnitConfObjISR.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=barker3x5, format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +opObj11.addParameter(name='nBaud', value='15', format='int') + + +procUnitConfObjISRSpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjISR.getId()) +procUnitConfObjISRSpectra.addParameter(name='nFFTPoints', value='16', format='int') +procUnitConfObjISRSpectra.addParameter(name='nProfiles', value='16', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='36', format='float') + +# opObj11 = procUnitConfObjISRSpectra.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value='/media/datos/isr2014') +# opObj11.addParameter(name='blocksPerFile', value='120', format='int') + + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='channelList', value='3', format='intlist') +#opObj11.addParameter(name='timerange', value='300', format='float') +opObj11.addParameter(name='xmin', value='8', format='float') +opObj11.addParameter(name='xmax', value='16', format='float') +# opObj11.addParameter(name='ymin', value='120', format='float') +# opObj11.addParameter(name='ymax', value='190', format='float') +opObj11.addParameter(name='zmin', value='20', format='float') +opObj11.addParameter(name='zmax', value='55', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figfile', value='rti_mst_isr.pdf', format='str') +opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/poster', format='str') + + +# opObj11 = procUnitConfObjISRSpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='2000', format='int') +# opObj11.addParameter(name='wintitle', value='ISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='zmin', value='30', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# +# opObj11 = procUnitConfObjISRSpectra.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2001', format='int') +# opObj11.addParameter(name='wintitle', value='ISR', format='str') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='60', format='int') +# +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=gpath, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='exp_code', value='20', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# +# ######################################################### +# ################ EEJ #################################### +# ######################################################### +# ######################################################### +# +# procUnitConfObjEEJ = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# +# opObj11 = procUnitConfObjEEJ.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') +# +# opObj11 = procUnitConfObjEEJ.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value='1,-1', format='floatlist') +# opObj11.addParameter(name='nCode', value='2', format='int') +# opObj11.addParameter(name='nBaud', value='1', format='int') +# +# procUnitConfObjEEJSpecta = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjEEJ.getId()) +# procUnitConfObjEEJSpecta.addParameter(name='nFFTPoints', value='64', format='int') +# procUnitConfObjEEJSpecta.addParameter(name='nProfiles', value='64', format='int') +# +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='IncohInt', optype='other') +# opObj11.addParameter(name='n', value='36', format='float') +# +# # opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SpectraWriter', optype='other') +# # opObj11.addParameter(name='path', value='/media/datos/eej2014') +# # opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# +# +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3000', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='50', format='int') +# +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='50', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=gpath, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/.svn/text-base/plot_eej.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/plot_eej.py.svn-base new file mode 100644 index 0000000..47ae5b5 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/plot_eej.py.svn-base @@ -0,0 +1,91 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts+Imaging+Faraday Experiments" +filename = "eej_plots.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = '/media/DATA/eej2014' +figpath = '/home/operaciones/Pictures/eej_mayo2014' + +readUnitConfObj = controllerObj.addReadUnit(datatype='Spectra', + path=path, + startDate='2014/01/08', + endDate='2014/01/08', + startTime='10:00:00', + endTime='14:59:59', + delay=10, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +opObj11.addParameter(name='zmin', value='15', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='wr_period', value='3', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +# +# +# +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='105', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='timerange', value='300', format='int') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='30', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value='/home/operaciones/Pictures/eej_mayo2014', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/plot_isr.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/plot_isr.py.svn-base new file mode 100644 index 0000000..bba05f9 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/plot_isr.py.svn-base @@ -0,0 +1,79 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts+Imaging+Faraday Experiments" +filename = "isr_plots.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = '/media/DATA/isr2014' +figpath = '/home/operaciones/Pictures/isr_mayo2014' +readUnitConfObj = controllerObj.addReadUnit(datatype='Spectra', + path=path, + startDate='2014/01/08', + endDate='2014/01/08', + startTime='10:00:00', + endTime='14:59:59', + delay=40, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='200', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='wr_period', value='3', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/plot_mst.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/plot_mst.py.svn-base new file mode 100644 index 0000000..72ab023 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/plot_mst.py.svn-base @@ -0,0 +1,88 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts+Imaging+Faraday Experiments" +filename = "mst_plots.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = '/media/DATA/isr2014' +figpath = '/home/operaciones/Pictures/isr_mayo2014' +readUnitConfObj = controllerObj.addReadUnit(datatype='Spectra', + path=path, + startDate='2014/01/08', + endDate='2014/01/08', + startTime='10:00:00', + endTime='14:59:59', + delay=20, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObjMSTSpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId()) + + + + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='215', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +opObj11.addParameter(name='ymin', value='120', format='int') +opObj11.addParameter(name='ymax', value='190', format='int') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value='/home/dsuarez/Pictures/mst_mayo2014', format='str') +opObj11.addParameter(name='wr_period', value='1', format='int') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='ymin', value='120', format='int') +opObj11.addParameter(name='ymax', value='190', format='int') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value='/home/dsuarez/Pictures/mst_mayo2014', format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/sousy.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/sousy.py.svn-base new file mode 100644 index 0000000..829b456 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/sousy.py.svn-base @@ -0,0 +1,103 @@ + + + + + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Sousy_test" +filename = "sousy_processing.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='Test_sousy', description=desc) + +#path = '/media/data/data/vientos/57.2063km/echoes/NCO_Woodman' +#path2= '/media/' +#path2='/media/New Volume/LowTroposphere' +#path1='/media/New Volume/LT_shortpulse' +#path = path1 + ',' + path2 +path='G:\\LowTroposphere' + +path = '/media/signalchain/FVillanuevaR/LowTroposphere' +wr_path = '/media/signalchain/datos/sousy' +figures_path = '/home/signalchain/Pictures/sousy' + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/07/08', + endDate='2014/07/08', + startTime='10:00:00', + endTime='17:59:59', + delay=0, + set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +######################################################### +################ SOUSY################################### +######################################################### +# +procUnitConfObjSousy = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# +# codigo64='1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0,'+\ +# '1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1' +opObj11 = procUnitConfObjSousy.addOperation(name='setRadarFrequency') +opObj11.addParameter(name='frequency', value='53.5e6', format='float') + + + +opObj11 = procUnitConfObjSousy.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='2', format='int') + +codigo='1,-1' +opObj11 = procUnitConfObjSousy.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=codigo, format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +opObj11.addParameter(name='nBaud', value='1', format='int') + +opObj11 = procUnitConfObjSousy.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2048', format='int') + +procUnitConfObjSousySpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjSousy.getId()) +procUnitConfObjSousySpectra.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjSousySpectra.addParameter(name='nProfiles', value='64', format='int') + +opObj13 = procUnitConfObjSousySpectra.addOperation(name='removeDC') +opObj13.addParameter(name='mode', value='2', format='int') + +opObj11 = procUnitConfObjSousySpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='1', format='float') +# +# opObj11 = procUnitConfObjSousySpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='101', format='int') +# opObj11.addParameter(name='wintitle', value='Sousy_RTIPlot', format='str') +# opObj11.addParameter(name='zmin', value='30', format='int') +# opObj11.addParameter(name='zmax', value='100', format='int') +# opObj11.addParameter(name='ymin', value='0', format='int') +# opObj11.addParameter(name='ymax', value='10', format='int') +# opObj11.addParameter(name='xmin', value='10', format='float') +# opObj11.addParameter(name='xmax', value='18', format='float') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# #opObj11.addParameter(name='figfile', value='rti0_sousy.png', format='str') +# opObj11.addParameter(name='figpath', value=figures_path, format='str') + +opObj11 = procUnitConfObjSousySpectra.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=wr_path) +opObj11.addParameter(name='blocksPerFile', value='100', format='int') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/testRawData.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/testRawData.py.svn-base new file mode 100644 index 0000000..2a2280a --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/testRawData.py.svn-base @@ -0,0 +1,108 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +if __name__ == '__main__': + + desc = "Segundo Test" + filename = "schain.xml" + + controllerObj = Project() + + controllerObj.setup(id = '191', name='test01', description=desc) + + readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path='/Volumes/SOUSY/', + startDate='2014/10/28', + endDate='2014/10/28', + startTime='15:40:00', + endTime='16:20:00', + online=0, + walk=1) + + opObj00 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', + inputId=readUnitConfObj.getId()) + +# opObj10 = procUnitConfObj0.addOperation(name='Synchronize', optype='external') + + opObj10 = procUnitConfObj0.addOperation(name='selectHeights') + opObj10.addParameter(name='minHei', value='0', format='float') + opObj10.addParameter(name='maxHei', value='8', format='float') + + opObj10 = procUnitConfObj0.addOperation(name='filterByHeights') + opObj10.addParameter(name='window', value='2', format='float') + + opObj10 = procUnitConfObj0.addOperation(name='Decoder', optype='external') + opObj10.addParameter(name='code', value='1,-1', format='intlist') + opObj10.addParameter(name='nCode', value='2', format='float') + opObj10.addParameter(name='nBaud', value='1', format='float') + + + opObj10 = procUnitConfObj0.addOperation(name='CohInt', optype='external') + opObj10.addParameter(name='n', value='1296', format='float') + + procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', + inputId=procUnitConfObj0.getId()) + + #Creating a processing object with its parameters + #schainpy.model.proc.jroproc_spectra.SpectraProc.run() + #If you need to add more parameters can use the "addParameter method" + procUnitConfObj1.addParameter(name='nFFTPoints', value='128', format='int') + + opObj10 = procUnitConfObj1.addOperation(name='IncohInt', optype='external') + opObj10.addParameter(name='n', value='2', format='float') + + #Using internal methods + #schainpy.model.proc.jroproc_spectra.SpectraProc.selectChannels() +# opObj10 = procUnitConfObj1.addOperation(name='selectChannels') +# opObj10.addParameter(name='channelList', value='0,1', format='intlist') + + #Using internal methods + #schainpy.model.proc.jroproc_spectra.SpectraProc.selectHeights() +# opObj10 = procUnitConfObj1.addOperation(name='selectHeights') +# opObj10.addParameter(name='minHei', value='90', format='float') +# opObj10.addParameter(name='maxHei', value='180', format='float') + + #Using external methods (new modules) +# #schainpy.model.proc.jroproc_spectra.IncohInt.setup() +# opObj12 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +# opObj12.addParameter(name='n', value='1', format='int') + + #Using external methods (new modules) + #schainpy.model.graphics.jroplot_spectra.SpectraPlot.setup() + opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external') + opObj11.addParameter(name='id', value='11', format='int') + opObj11.addParameter(name='wintitle', value='SpectraPlot', format='str') + opObj11.addParameter(name='zmin', value='-60', format='int') + opObj11.addParameter(name='zmax', value='10', format='int') + opObj11.addParameter(name='save', value='1', format='int') + + #Using external methods (new modules) + #schainpy.model.graphics.jroplot_spectra.RTIPlot.setup() + opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') + opObj11.addParameter(name='id', value='30', format='int') + opObj11.addParameter(name='wintitle', value='RTI', format='str') + opObj11.addParameter(name='zmin', value='-60', format='int') + opObj11.addParameter(name='zmax', value='-10', format='int') + opObj11.addParameter(name='showprofile', value='1', format='int') +# opObj11.addParameter(name='timerange', value=str(5*60*60*60), format='int') + opObj11.addParameter(name='xmin', value='14', format='float') + opObj11.addParameter(name='xmax', value='23.9', format='float') + opObj11.addParameter(name='save', value='1', format='int') + + print "Escribiendo el archivo XML" + + controllerObj.writeXml(filename) + + print "Leyendo el archivo XML" + controllerObj.readXml(filename) + #controllerObj.printattr() + + controllerObj.createObjects() + controllerObj.connectObjects() + controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/test_eej_blocks.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/test_eej_blocks.py.svn-base new file mode 100644 index 0000000..9a86f82 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/test_eej_blocks.py.svn-base @@ -0,0 +1,111 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * +dt1 = datetime.datetime.now() +desc = "MST-ISR-EEJ Experiment Test" +filename = "eej_blocks.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/media/signalchain/HD-PXU2/mst_isr_eej' + +figpath = '/home/signalchain/Pictures/mst_isr_eej/eej' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/05/01', + endDate='2014/05/30', + startTime='00:00:00', + endTime='23:59:59', + online=1, + delay=10, + walk=0, + getblock=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +# ################ EEJ #################################### +procUnitConfObjEEJ = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjEEJ.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +opObj11 = procUnitConfObjEEJ.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value='1,-1', format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +opObj11.addParameter(name='nBaud', value='1', format='int') +opObj11.addParameter(name='mode', value='3', format='int') +opObj11.addParameter(name='times', value='32', format='int') + +# opObj11 = procUnitConfObjEEJ.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +procUnitConfObjEEJSpecta = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjEEJ.getId()) +procUnitConfObjEEJSpecta.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjEEJSpecta.addParameter(name='nProfiles', value='64', format='int') + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='timeInterval', value='10', format='float') +opObj11.addParameter(name='n', value='36', format='float') + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='60', format='int')# opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SendByFTP', optype='other') +opObj11.addParameter(name='ext', value='*.png', format='str') +opObj11.addParameter(name='localfolder', value=figpath, format='str') +opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='period', value='5', format='int') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() +#print fib(5) + +dt2 = datetime.datetime.now() +print "=======================" +print dt2-dt1 +print "=======================" \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/.svn/text-base/test_isr_blocks.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/test_isr_blocks.py.svn-base new file mode 100644 index 0000000..e341ba5 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/test_isr_blocks.py.svn-base @@ -0,0 +1,115 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * +dt1 = datetime.datetime.now() +desc = "MST-ISR-EEJ Experiment Test" +filename = "isr_blocks.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/media/signalchain/HD-PXU2/mst_isr_eej' + +figpath = '/home/signalchain/Pictures/mst_isr_eej/isr' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/05/01', + endDate='2014/05/30', + startTime='00:00:00', + endTime='23:59:59', + online=1, + delay=10, + walk=0, + getblock=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObjISR = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjISR.addOperation(name='ProfileSelector', optype='other') +# profileIndex = '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' +# opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +opObj11.addParameter(name='profileRangeList', value='20,99', format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +# opObj11 = procUnitConfObjISR.addOperation(name='ProfileConcat', optype='other') +# opObj11.addParameter(name='m', value='5', format='int') + +opObj11 = procUnitConfObjISR.addOperation(name='Reshaper', optype='other') #Esta Operacion opera sobre bloques y reemplaza el ProfileConcat que opera sobre perfiles +opObj11.addParameter(name='shape', value='4,16,6750', format='intlist') # shape = (nchannels, nprofiles, nhieghts) + +opObj11 = procUnitConfObjISR.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='20', format='int') +opObj11.addParameter(name='axis', value='2', format='int') + +barker3x1 = '1,1,-1,-1,-1,1' +#barker3x5 = '1,1,1,1,1, 1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1' + +opObj11 = procUnitConfObjISR.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=barker3x1, format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +#opObj11.addParameter(name='nBaud', value='15', format='int') +opObj11.addParameter(name='nBaud', value='3', format='int') +opObj11.addParameter(name='mode', value='3', format='int') +opObj11.addParameter(name='times', value='8', format='int') +opObj11.addParameter(name='osamp', value='5', format='int') + + +procUnitConfObjISRSpectra = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjISR.getId()) +procUnitConfObjISRSpectra.addParameter(name='nFFTPoints', value='16', format='int') +procUnitConfObjISRSpectra.addParameter(name='nProfiles', value='16', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='36', format='float') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='300', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') + + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='SendByFTP', optype='other') +opObj11.addParameter(name='ext', value='*.png', format='str') +opObj11.addParameter(name='localfolder', value=figpath, format='str') +opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='period', value='5', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() +#print fib(5) + +dt2 = datetime.datetime.now() +print "=======================" +print dt2-dt1 +print "=======================" diff --git a/schainpy/scripts/scripts_v/.svn/text-base/test_mst_blocks.py.svn-base b/schainpy/scripts/scripts_v/.svn/text-base/test_mst_blocks.py.svn-base new file mode 100644 index 0000000..4801eb6 --- /dev/null +++ b/schainpy/scripts/scripts_v/.svn/text-base/test_mst_blocks.py.svn-base @@ -0,0 +1,119 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "MST-ISR-EEJ Experiment Test" +filename = "mst_blocks.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#path = '/home/operaciones/mst_data/MST_ISR_EEJ/' +path ='/home/operaciones/mst_data' + +figpath = '/home/operaciones/Pictures/mst_isr_eej/mst' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/05/01', + endDate='2014/05/30', + startTime='00:00:00', + endTime='23:59:59', + online=1, + delay=10, + walk=1, + getblock=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObjMST = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjMST.addOperation(name='ProfileSelector', optype='other') +profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119' +#profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19' +opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +opObj11 = procUnitConfObjMST.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='mode',value='3',format='int') +opObj11.addParameter(name='times',value='10',format='int') + +opObj11 = procUnitConfObjMST.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='20', format='int') +opObj11.addParameter(name='byblock', value='1', format='bool') + +procUnitConfObjMSTSpectra = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjMST.getId()) +procUnitConfObjMSTSpectra.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjMSTSpectra.addParameter(name='nProfiles', value='64', format='int') + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='float') + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='401', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='40', format='int') +# # opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# # opObj11.addParameter(name='ftp', value='1', format='int') +# # opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# # opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # opObj11.addParameter(name='plot_pos', value='0', format='int') +# # +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='402', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='40', format='int') +# # opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='2', format='int') +# # opObj11.addParameter(name='ftp', value='1', format='int') +# # opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# # opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # opObj11.addParameter(name='plot_pos', value='0', format='int') + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SendByFTP', optype='other') +opObj11.addParameter(name='ext', value='*.png', format='str') +opObj11.addParameter(name='localfolder', value=figpath, format='str') +opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='server', value='10.10.120.125', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='period', value='2', format='int') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() +#print fib(5) diff --git a/schainpy/scripts/scripts_v/150km_January_longPulse.py b/schainpy/scripts/scripts_v/150km_January_longPulse.py new file mode 100644 index 0000000..9a27226 --- /dev/null +++ b/schainpy/scripts/scripts_v/150km_January_longPulse.py @@ -0,0 +1,185 @@ +import os, sys +import numpy +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.append(path) + +from schainpy.controller import Project + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#path = '/home/operaciones/150km_jicamarca_january/RAW_EXP/2015_ISR' +path = '/media/DATOS/2015_ISR' +#path = '/media/New Volume2/DATA/RAW_EXP/2015_ISR' + +figpath = '/home/operaciones/Pictures/150km_jicamarca_january' + +remotefolder = "/home/wmaster/graficos" + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/13', + endDate='2015/01/30', + startTime='07:55:00', + endTime='23:59:59', + online=0, + delay=10, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +a=[] +for i in range(85): + if i>20: + a.append(i) +for i in range(170): + if i>105: + a.append(i) +for i in range(255): + if i>190: + a.append(i) +for i in range(340): + if 339>i>275: + a.append(i) + if i==339: + a.append(i) + +b= str(a) +profileIndex = b[1:][:-1] + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +#profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19' +opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') + + +# opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value='21,84', format='intlist') + + +binary28="1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1" + + +CODEB=numpy.array([1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1]) +x= numpy.array([ CODEB,CODEB,-CODEB,-CODEB]) +code= ",".join(map(str,x.flatten())) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='intlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='deFlip') +opObj11.addParameter(name='channelList', value='1,3,5,7', format='intlist') + +# opObj10 = procUnitConfObj0.addOperation(name='selectHeights') +# opObj10.addParameter(name='minHei', value='50', format='float') +# opObj10.addParameter(name='maxHei', value='150', format='float') + +# opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='4', format='float') + + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='zmin', value='40', format='int') +# opObj11.addParameter(name='zmax', value='90', format='int') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='64', format='int') + +#procUnitConfObj1.addParameter(name='pairsList', value='(3,7),(2,6)', format='pairsList') +procUnitConfObj1.addParameter(name='pairsList', value='(1,0),(3,2),(5,4),(7,6)', format='pairsList') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='60', format='float') + +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2001', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca', format='str') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# # opObj11.addParameter(name='zmin', value='0', format='int') +# # opObj11.addParameter(name='zmax', value='60', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2005', format='int') +opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_LongPulse', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + + + + + +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='Coherence', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') + +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + + + + + + + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3002', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_LongPulse', format='str') +# # opObj11.addParameter(name='xmin', value='20.5', format='float') +# # opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='80', format='int') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/150km_January_shortPulse.py b/schainpy/scripts/scripts_v/150km_January_shortPulse.py new file mode 100644 index 0000000..f82449e --- /dev/null +++ b/schainpy/scripts/scripts_v/150km_January_shortPulse.py @@ -0,0 +1,152 @@ +import os, sys +import numpy +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.append(path) + +from schainpy.controller import Project + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#path = '/home/operaciones/150km_jicamarca_january/RAW_EXP/2015_ISR' +path = '/media/DATOS/2015_ISR' +#path = '/media/New Volume2/DATA/RAW_EXP/2015_ISR' + +figpath = '/home/operaciones/Pictures/150km_jicamarca_january' + +remotefolder = "/home/wmaster/graficos" + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/14', + endDate='2015/01/30', + startTime='07:40:00', + endTime='23:59:59', + online=0, + delay=10, + walk=1, + nTxs=4) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='rangeList', value='(1,80),(341,420),(681,760),(1021,1100)', format='multiList') + +# opObj11 = procUnitConfObj0.addOperation(name='filterByHeights') +# opObj11.addParameter(name='window', value='1', format='int') +# opObj11.addParameter(name='axis', value='2', format='int') + +cod7barker="1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1" +# 1,1,1,-1,-1,1,-1 +#-1,-1,-1,1,1,-1,1 +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=cod7barker, format='floatlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='7', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='deFlip') +opObj11.addParameter(name='channelList', value='1,3,5,7', format='intlist') + +# cod7barker="1,1,1,-1,-1,1,-1" +# opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value=cod7barker, format='intlist') +# opObj11.addParameter(name='nCode', value='1', format='int') +# opObj11.addParameter(name='nBaud', value='7', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='zmin', value='40', format='int') +# opObj11.addParameter(name='zmax', value='90', format='int') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='80', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='80', format='int') +#procUnitConfObj1.addParameter(name='pairsList', value='(3,7),(2,6)', format='pairsList') +procUnitConfObj1.addParameter(name='pairsList', value='(1,0),(3,2),(5,4),(7,6)', format='pairsList') + +# +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='60', format='float') +# +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2004', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2006', format='int') +opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_ShortPulse', format='str') +opObj11.addParameter(name='coherence_cmap', value='jet', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +# opObj11.addParameter(name='ymin', value='0', format='int') +# opObj11.addParameter(name='ymax', value='105', format='int') +opObj11.addParameter(name='zmin', value='15', format='int') +opObj11.addParameter(name='zmax', value='45', format='int') +opObj11.addParameter(name='exp_code', value='14', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + +# +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='Coherence', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='14', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath) +opObj11.addParameter(name='ftp', value='1', format='int') + + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3005', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# # opObj11.addParameter(name='xmin', value='20.5', format='float') +# # opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/150km_january_1.py b/schainpy/scripts/scripts_v/150km_january_1.py new file mode 100644 index 0000000..99680bf --- /dev/null +++ b/schainpy/scripts/scripts_v/150km_january_1.py @@ -0,0 +1,119 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/home/operaciones/150km_jicamarca_january/RAW_EXP/2015_ISR' + +figpath = '/home/operaciones/Pictures/150km_jicamarca_january' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/13', + endDate='2015/01/30', + startTime='07:55:00', + endTime='23:59:59', + online=1, + delay=10, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='21,84', format='intlist') + + +binary28="1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1" + +#cod7barker="1,1,1,-1,-1,1,-1" +#cod7barkerneg="-1,-1,-1,1,1,-1,1" +CODEB=numpy.array([1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1]) +x= numpy.array([ CODEB,CODEB,-CODEB,-CODEB]) +code= ",".join(map(str,x.flatten())) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='intlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='4', format='float') + + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') + + + +# opObj11.addParameter(name='zmin', value='40', format='int') +# opObj11.addParameter(name='zmax', value='90', format='int') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='64', format='int') + +#procUnitConfObj1.addParameter(name='pairsList', value='(0,1),(2,3),(4,5),(6,7)', format='pairsList') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='10', format='float') + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2001', format='int') +opObj11.addParameter(name='wintitle', value='150km_Jicamarca', format='str') +#opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# opObj11.addParameter(name='zmin', value='0', format='int') +# opObj11.addParameter(name='zmax', value='60', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') + + + +# opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2005', format='int') +# opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_ShortPulse', format='str') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +# +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='3002', format='int') +opObj11.addParameter(name='wintitle', value='150km_Jicamarca', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +#opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +#opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/150km_january_3.py b/schainpy/scripts/scripts_v/150km_january_3.py new file mode 100644 index 0000000..fe56f3e --- /dev/null +++ b/schainpy/scripts/scripts_v/150km_january_3.py @@ -0,0 +1,128 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "150 km Jicamarca January 2015" +filename = "150km_jicamarca.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = './' + +figpath = '/Users/miguel/tmp' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2015/01/14', + endDate='2015/01/14', + startTime='08:30:00', + endTime='09:30:59', + online=1, + delay=10, + walk=1, + nTxs = 4) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='rangeList', value='(1,80),(341,420),(681,760),(1021,1100)', format='multiList') + + +cod7barker="1,1,1,-1,-1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,1,-1,1,-1,-1,-1,1,1,-1,1" + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=cod7barker, format='floatlist') +opObj11.addParameter(name='nCode', value='4', format='int') +opObj11.addParameter(name='nBaud', value='7', format='int') +# +opObj11 = procUnitConfObj0.addOperation(name='deFlip') +opObj11.addParameter(name='channelList', value='1,3,5,7', format='intlist') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='80', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='80', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(1,0),(3,2),(5,4),(7,6)', format='pairsList') +# +# # +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='60', format='float') +# +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2004', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# #opObj11.addParameter(name='channelList', value='0,1,2,3,45', format='intlist') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +# +opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2006', format='int') +opObj11.addParameter(name='wintitle', value='CrossSpectraPlot_ShortPulse', format='str') +opObj11.addParameter(name='ymin', value='0', format='int') +opObj11.addParameter(name='ymax', value='105', format='int') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='zmin', value='15', format='int') +opObj11.addParameter(name='zmax', value='45', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='exp_code', value='13', format='int') +# +# +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='Coherence', format='str') +opObj11.addParameter(name='phase_cmap', value='jet', format='str') +opObj11.addParameter(name='xmin', value='8.5', format='float') +opObj11.addParameter(name='xmax', value='9.5', format='float') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='save', value=1, format='bool') +opObj11.addParameter(name='pairsList', value='(1,0),(3,2)', format='pairsList') + +# opObj11.addParameter(name='wr_period', value='2', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='103', format='int') +# opObj11.addParameter(name='wintitle', value='Coherence', format='str') +# opObj11.addParameter(name='phase_cmap', value='jet', format='str') +# opObj11.addParameter(name='xmin', value='8.5', format='float') +# opObj11.addParameter(name='xmax', value='9.5', format='float') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='save', value=1, format='bool') +# opObj11.addParameter(name='pairsList', value='(5,4),(7,6)', format='pairsList') + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3005', format='int') +# opObj11.addParameter(name='wintitle', value='150km_Jicamarca_ShortPulse', format='str') +# # opObj11.addParameter(name='xmin', value='20.5', format='float') +# # opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') +#opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +#opObj11.addParameter(name='channelList', value='0,1,2,3,4,5,6,7', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/150km_jicamarca.xml b/schainpy/scripts/scripts_v/150km_jicamarca.xml new file mode 100644 index 0000000..cceca18 --- /dev/null +++ b/schainpy/scripts/scripts_v/150km_jicamarca.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/2017_09_amisr_winds_proc_offline.py b/schainpy/scripts/scripts_v/2017_09_amisr_winds_proc_offline.py new file mode 100644 index 0000000..12ef3e8 --- /dev/null +++ b/schainpy/scripts/scripts_v/2017_09_amisr_winds_proc_offline.py @@ -0,0 +1,228 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +# path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +# path = '/mnt/data_amisr' +# path = '/media/soporte/E9F4-F053/AMISR/Data/winds' +path = '/mnt/data_amisr' +path = '/media/soporte/DATA/AMISR/WINDS' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/winds' +figpath = '/home/soporte/Data/winds/newproc' +remotefolder = "/home/wmaster/graficos" +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/winds/plots' + +xmin = '00' +xmax = '24' +dbmin = '50' #'60'#'55' #'40' #noise esf eej +dbmax = '80' #'70' #'55' + +ippFactor = '5' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2015/11/09',#'2015/11/12', #'2014/10/07', + endDate='2015/11/09',#'2015/11/12' #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='8', format='int') + + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') + + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='ippFactor', value=ippFactor, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='64', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='9', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='channelList', value='2', format='intlist') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='channelList', value='2', format='intlist') +# +# +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +#For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + +# opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +# opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.6', format='floatlist') + +# #Parameters Process +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +# opObj22.addParameter(name='technique', value='DBS', format='str') +# opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +# opObj22.addParameter(name='correctFactor', value='-1', format='float') +# opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +# opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.60', format='floatlist') +# +# #WindProfilerPlot +# opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +# opObj23.addParameter(name='id', value='4', format='int') +# opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +# opObj23.addParameter(name='save', value='1', format='bool') +# opObj23.addParameter(name='figpath', value = figpath, format='str') +# opObj23.addParameter(name='zmin', value='-20', format='int') +# opObj23.addParameter(name='zmax', value='20', format='int') +# opObj23.addParameter(name='zmin_ver', value='-100', format='float') +# opObj23.addParameter(name='zmax_ver', value='100', format='float') +# opObj23.addParameter(name='SNRmin', value='-20', format='int') +# opObj23.addParameter(name='SNRmax', value='30', format='int') +# opObj23.addParameter(name='SNRthresh', value='-50', format='float') +# opObj23.addParameter(name='xmin', value=xmin, format='float') +# opObj23.addParameter(name='xmax', value=xmax, format='float') +# opObj23.addParameter(name='ftp', value='1', format='int') +# opObj23.addParameter(name='wr_period', value='2', format='int') +# opObj23.addParameter(name='exp_code', value='21', format='int') +# opObj23.addParameter(name='sub_exp_code', value='3', format='int') +# opObj23.addParameter(name='ftp_wei', value='0', format='int') +# opObj23.addParameter(name='plot_pos', value='0', format='int') +# +# #--------------------------------------------------------------------------------------------- +# +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/EWDrifts_estimation01.py b/schainpy/scripts/scripts_v/EWDrifts_estimation01.py new file mode 100644 index 0000000..dbb9449 --- /dev/null +++ b/schainpy/scripts/scripts_v/EWDrifts_estimation01.py @@ -0,0 +1,140 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +path = '/host/Jicamarca/EW_Drifts/d2012248' +pathFigure = '/home/propietario/workspace/Graficos/drifts' + + +path = "/home/soporte/Data/drifts" +pathFigure = '/home/soporte/workspace/Graficos/drifts/prueba' +pathFile = '/home/soporte/Data/drifts/HDF5' + +xmin = 0 +xmax = 24 +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2012/09/06', + endDate='2012/09/06', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='0,127', format='intlist') + +opObj11 = procUnitConfObj0.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='3', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value='1,-1', format='floatlist') +# opObj11.addParameter(name='nCode', value='2', format='int') +# opObj11.addParameter(name='nBaud', value='1', format='int') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='128', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='128', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,1),(2,3)', format='pairsList')#,(2,3) + +opObj11 = procUnitConfObj1.addOperation(name='selectHeights') +# # opObj11.addParameter(name='minHei', value='320.0', format='float') +# # opObj11.addParameter(name='maxHei', value='350.0', format='float') +opObj11.addParameter(name='minHei', value='200.0', format='float') +opObj11.addParameter(name='maxHei', value='600.0', format='float') + +opObj11 = procUnitConfObj1.addOperation(name='selectChannels') +opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='300.0', format='float') + +opObj13 = procUnitConfObj1.addOperation(name='removeDC') + +# opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj14.addParameter(name='id', value='1', format='int') +# # opObj14.addParameter(name='wintitle', value='Con interf', format='str') +# opObj14.addParameter(name='save', value='1', format='bool') +# opObj14.addParameter(name='figpath', value=pathFigure, format='str') +# # opObj14.addParameter(name='zmin', value='5', format='int') +# opObj14.addParameter(name='zmax', value='30', format='int') +# +# opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj12.addParameter(name='id', value='2', format='int') +# opObj12.addParameter(name='wintitle', value='RTI Plot', format='str') +# opObj12.addParameter(name='save', value='1', format='bool') +# opObj12.addParameter(name='figpath', value = pathFigure, format='str') +# opObj12.addParameter(name='xmin', value=xmin, format='float') +# opObj12.addParameter(name='xmax', value=xmax, format='float') +# # opObj12.addParameter(name='zmin', value='5', format='int') +# opObj12.addParameter(name='zmax', value='30', format='int') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='SpectralFitting') +opObj20.addParameter(name='path', value='/home/soporte/workspace/RemoteSystemsTempFiles', format='str') +opObj20.addParameter(name='file', value='modelSpectralFitting', format='str') +opObj20.addParameter(name='groupList', value='(0,1),(2,3)',format='multiList') + +opObj11 = procUnitConfObj2.addOperation(name='SpectralFittingPlot', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='DopplerPlot', format='str') +opObj11.addParameter(name='cutHeight', value='350', format='int') +opObj11.addParameter(name='fit', value='1', format='int')#1--True/include fit +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = pathFigure, format='str') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathFile) +opObj12.addParameter(name='blocksPerFile', value='3', format='int') + +opObj11 = procUnitConfObj2.addOperation(name='EWDriftsEstimation', optype='other') +opObj11.addParameter(name='zenith', value='-3.80208,3.10658', format='floatlist') +opObj11.addParameter(name='zenithCorrection', value='0.183201', format='float') + +opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') +opObj23.addParameter(name='zminZonal', value='-150', format='int') +opObj23.addParameter(name='zmaxZonal', value='150', format='int') +opObj23.addParameter(name='zminVertical', value='-30', format='float') +opObj23.addParameter(name='zmaxVertical', value='30', format='float') +opObj23.addParameter(name='SNR_1', value='1', format='bool') +opObj23.addParameter(name='SNRmax', value='5', format='int') +# opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/EWDrifts_estimation02.py b/schainpy/scripts/scripts_v/EWDrifts_estimation02.py new file mode 100644 index 0000000..8980f9d --- /dev/null +++ b/schainpy/scripts/scripts_v/EWDrifts_estimation02.py @@ -0,0 +1,65 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +path = "/home/soporte/Data/drifts/HDF5" +pathFigure = '/home/soporte/workspace/Graficos/drifts/prueba' +pathFile = '/home/soporte/Data/drifts/HDF5' + +xmin = 0 +xmax = 24 +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='HDF5Reader', + path=path, + startDate='2012/09/06', + endDate='2012/09/06', + startTime='00:00:00', + endTime='23:59:59', + timezone='lt', + walk=1) + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=readUnitConfObj.getId()) +#-------------------------------------------------------------------------------------------------- + +opObj11 = procUnitConfObj0.addOperation(name='EWDriftsEstimation', optype='other') +opObj11.addParameter(name='zenith', value='-3.80208,3.10658', format='floatlist') +opObj11.addParameter(name='zenithCorrection', value='0.183201', format='float') + +opObj23 = procUnitConfObj0.addOperation(name='EWDriftsPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') +opObj23.addParameter(name='zminZonal', value='-150', format='int') +opObj23.addParameter(name='zmaxZonal', value='150', format='int') +opObj23.addParameter(name='zminVertical', value='-30', format='float') +opObj23.addParameter(name='zmaxVertical', value='30', format='float') +opObj23.addParameter(name='SNR_1', value='1', format='bool') +opObj23.addParameter(name='SNRmax', value='5', format='int') +# opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/Meteor_JASMET30MHz.py b/schainpy/scripts/scripts_v/Meteor_JASMET30MHz.py new file mode 100644 index 0000000..86d00ce --- /dev/null +++ b/schainpy/scripts/scripts_v/Meteor_JASMET30MHz.py @@ -0,0 +1,188 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "JASMET Experiment Test" +filename = "JASMETtest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +#2014051 20 Feb 2014 +# path = '/home/soporte/Data/JASMET/JASMET_30/2014106' +# pathFigure = '/home/soporte/workspace/Graficos/JASMET/prueba1' + +remotefolder = "/home/wmaster/graficos" +path = '/media/joscanoa/84A65E64A65E5730/soporte/Data/JASMET/JASMET_30/' + +pathfile1 = os.path.join(os.environ['HOME'],'Pictures/JASMET30/meteor') +pathfile2 = os.path.join(os.environ['HOME'],'Pictures/JASMET30/wind') +pathfile3 = os.path.join(os.environ['HOME'],'Pictures/JASMET30/phase') + +pathfig = os.path.join(os.environ['HOME'],'Pictures/JASMET30/graph') + +startTime = '00:00:00' +endTime = '23:59:59' +xmin ='17.0' +xmax = '34.0' + +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/04/15', + endDate='2014/04/16', + startTime=startTime, + endTime=endTime, + online=0, + delay=5, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj00 = procUnitConfObj0.addOperation(name='selectChannels') +opObj00.addParameter(name='channelList', value='0, 1, 2, 3, 4', format='intlist') + +opObj01 = procUnitConfObj0.addOperation(name='setRadarFrequency') +# opObj01.addParameter(name='frequency', value='30.e6', format='float') +opObj01.addParameter(name='frequency', value='50.e6', format='float') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nSeconds', value='100', format='int') + +opObj10 = procUnitConfObj1.addOperation(name='MeteorDetection') +# opObj10.addParameter(name='predefinedPhaseShifts', value='-89.5, 41.5, 0.0, -138.0, -85.5', format='floatlist') +opObj10.addParameter(name='predefinedPhaseShifts', value='0, 0, 0, 0, 0', format='floatlist') +opObj10.addParameter(name='cohDetection', value='0', format='bool') +opObj10.addParameter(name='noise_multiple', value='4', format='int') +opObj10.addParameter(name='SNRThresh', value='5', format='float') +opObj10.addParameter(name='phaseThresh', value='20', format='float') +opObj10.addParameter(name='azimuth', value='45', format='float') +opObj10.addParameter(name='hmin', value='68', format='float') +opObj10.addParameter(name='hmax', value='112', format='float') +opObj10.addParameter(name='saveAll', value='1', format='bool') + +opObj12 = procUnitConfObj1.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathfile1) +opObj12.addParameter(name='blocksPerFile', value='1000', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList,paramInterval',format='list') +opObj12.addParameter(name='dataList',value='data_param',format='list') +opObj12.addParameter(name='mode',value='0',format='int') +#Tiene que ser de 3 dimensiones, append en lugar de aumentar una dimension + +opObj13 = procUnitConfObj1.addOperation(name='SkyMapPlot', optype='other') +opObj13.addParameter(name='id', value='1', format='int') +opObj13.addParameter(name='wintitle', value='Sky Map', format='str') +opObj13.addParameter(name='save', value='1', format='bool') +opObj13.addParameter(name='figpath', value=pathfig, format='str') +opObj13.addParameter(name='ftp', value='1', format='int') +opObj13.addParameter(name='exp_code', value='15', format='int') +opObj13.addParameter(name='sub_exp_code', value='1', format='int') + + +#-------------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='Meteors', format='str') +opObj22.addParameter(name='nHours', value='0.25', format='float') +opObj22.addParameter(name='SNRThresh', value='12.0', format='float') + +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='2', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathfig, format='str') +opObj23.addParameter(name='zmin', value='-120', format='int') +opObj23.addParameter(name='zmax', value='120', format='int') +# opObj12.addParameter(name='zmin_ver', value='-0.8', format='float') +# opObj12.addParameter(name='zmax_ver', value='0.8', format='float') +# opObj23.addParameter(name='SNRmin', value='-10', format='int') +# opObj23.addParameter(name='SNRmax', value='60', format='int') +# opObj23.addParameter(name='SNRthresh', value='0', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +opObj23.addParameter(name='ftp', value='1', format='int') +opObj23.addParameter(name='exp_code', value='15', format='int') +opObj23.addParameter(name='sub_exp_code', value='1', format='int') + +opObj24 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj24.addParameter(name='path', value=pathfile2) +opObj24.addParameter(name='blocksPerFile', value='1000', format='int') +opObj24.addParameter(name='metadataList',value='type,inputUnit,outputInterval',format='list') +opObj24.addParameter(name='dataList',value='data_output,utctime',format='list') + +#-------------------------------------------------------------------------------------------------- +procUnitConfObj3 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) + + +opObj31 = procUnitConfObj3.addOperation(name='PhaseCalibration', optype='other') +opObj31.addParameter(name='nHours', value='0.25', format='float') +opObj31.addParameter(name='distances', value='-15, -15, 12, 12', format='intlist') +# opObj31.addParameter(name='distances', value='-25, -25, 20, 20', format='intlist') +opObj31.addParameter(name='pairs', value='(0,3),(1,2)', format='pairslist') +opObj31.addParameter(name='hmin', value='68', format='float') +opObj31.addParameter(name='hmax', value='112', format='float') + +opObj32 = procUnitConfObj3.addOperation(name='PhasePlot', optype='other') +opObj32.addParameter(name='id', value='201', format='int') +opObj32.addParameter(name='wintitle', value='PhaseCalibration', format='str') +# opObj32.addParameter(name='timerange', value='300', format='int') +opObj32.addParameter(name='xmin', value=xmin, format='float') +opObj32.addParameter(name='xmax', value=xmax, format='float') +# opObj32.addParameter(name='xmin', value='19', format='float') +# opObj32.addParameter(name='xmax', value='20', format='float') +opObj32.addParameter(name='ymin', value='-180', format='float') +opObj32.addParameter(name='ymax', value='180', format='float') +opObj32.addParameter(name='figpath', value=pathfig, format='str') +opObj32.addParameter(name='ftp', value='1', format='int') +opObj32.addParameter(name='exp_code', value='15', format='int') +opObj32.addParameter(name='sub_exp_code', value='1', format='int') + +opObj33 = procUnitConfObj3.addOperation(name='HDF5Writer', optype='other') +opObj33.addParameter(name='path', value=pathfile3) +opObj33.addParameter(name='blocksPerFile', value='1000', format='int') +opObj33.addParameter(name='metadataList',value='type,inputUnit,outputInterval',format='list') +opObj33.addParameter(name='dataList',value='data_output,utctime',format='list') +# opObj25.addParameter(name='mode',value='1,0,0',format='intlist') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj4 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj4.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj4.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj4.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj4.addParameter(name='localfolder', value=pathfig, format='str') +procUnitConfObj4.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj4.addParameter(name='ext', value='.png', format='str') +procUnitConfObj4.addParameter(name='period', value=20, format='int') +procUnitConfObj4.addParameter(name='protocol', value='ftp', format='str') + +#-------------------------------------------------------------------------------------------------- + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/Meteor_JASMET30Mhz_Beacon.py b/schainpy/scripts/scripts_v/Meteor_JASMET30Mhz_Beacon.py new file mode 100644 index 0000000..a56aa48 --- /dev/null +++ b/schainpy/scripts/scripts_v/Meteor_JASMET30Mhz_Beacon.py @@ -0,0 +1,81 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' +pathFigure = '/home/jasmet/jasmet30_phase' +path = '/home/soporte/Data/JASMET/JASMET_30/2014106' +pathFigure = '/home/soporte/workspace/Graficos/JASMET/prueba1' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/04/15', + endDate='2014/04/15', + startTime='20:00:00', + endTime='23:59:59', + online=0, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + + +# opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +# +# +# opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +# opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril') +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='timerange', value='300', format='int') +opObj11.addParameter(name='xmin', value='20', format='float') +opObj11.addParameter(name='xmax', value='22', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value=pathFigure, format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/Meteor_JASMET50MHz_Winds.py b/schainpy/scripts/scripts_v/Meteor_JASMET50MHz_Winds.py new file mode 100644 index 0000000..6dc9ffc --- /dev/null +++ b/schainpy/scripts/scripts_v/Meteor_JASMET50MHz_Winds.py @@ -0,0 +1,105 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "JASMET Experiment Test" +filename = "JASMETtest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +#2014051 20 Feb 2014 +path = '/home/soporte/Data/JASMET/JASMET_50/2014106' +pathFigure = '/home/soporte/workspace/Graficos/JASMET' + +startTime = '00:00:00' +endTime = '23:59:59' +xmin ='19.0' +xmax = '33.0' + + +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/15', + endDate='2014/04/16', + startTime=startTime, + endTime=endTime, + online=0, + delay=5, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj00 = procUnitConfObj0.addOperation(name='selectChannels') +opObj00.addParameter(name='channelList', value='0, 1, 2, 3, 4', format='intlist') + +opObj01 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj01.addParameter(name='frequency', value='50.e6', format='float') + +#opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='Parameters', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nSeconds', value='100', format='int') + +opObj10 = procUnitConfObj1.addOperation(name='DetectMeteors') +opObj10.addParameter(name='predefinedPhaseShifts', value='-17.0, -139.0, 0.0, 48.0, -130.0', format='floatlist') +opObj10.addParameter(name='cohDetection', value='0', format='bool') +opObj10.addParameter(name='noise_multiple', value='4', format='int') +opObj10.addParameter(name='SNRThresh', value='5', format='float') +opObj10.addParameter(name='phaseThresh', value='20', format='float') +opObj10.addParameter(name='azimuth', value='45', format='float') +opObj10.addParameter(name='hmin', value='68', format='float') +opObj10.addParameter(name='hmax', value='112', format='float') +opObj10.addParameter(name='savefile', value='1', format='bool') +opObj10.addParameter(name='filename', value=filehdf5, format='str') + +opObj13 = procUnitConfObj1.addOperation(name='SkyMapPlot', optype='other') +opObj13.addParameter(name='id', value='1', format='int') +opObj13.addParameter(name='wintitle', value='Sky Map', format='str') +opObj13.addParameter(name='save', value='1', format='bool') +opObj13.addParameter(name='figpath', value=pathFigure, format='str') + +opObj11 = procUnitConfObj1.addOperation(name='WindProfiler', optype='other') +opObj11.addParameter(name='technique', value='Meteors', format='str') +opObj11.addParameter(name='nHours', value='1.0', format='float') + +opObj12 = procUnitConfObj1.addOperation(name='WindProfilerPlot', optype='other') +opObj12.addParameter(name='id', value='2', format='int') +opObj12.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') +opObj12.addParameter(name='zmin', value='-120', format='int') +opObj12.addParameter(name='zmax', value='120', format='int') +# opObj12.addParameter(name='zmin_ver', value='-0.8', format='float') +# opObj12.addParameter(name='zmax_ver', value='0.8', format='float') +# opObj23.addParameter(name='SNRmin', value='-10', format='int') +# opObj23.addParameter(name='SNRmax', value='60', format='int') +# opObj23.addParameter(name='SNRthresh', value='0', format='float') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') + +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/Meteor_JASMET50Mhz_Beacon.py b/schainpy/scripts/scripts_v/Meteor_JASMET50Mhz_Beacon.py new file mode 100644 index 0000000..b2b59ac --- /dev/null +++ b/schainpy/scripts/scripts_v/Meteor_JASMET50Mhz_Beacon.py @@ -0,0 +1,78 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/15', + endDate='2014/04/15', + startTime='17:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/media/datos/jasmet50_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='timerange', value='300', format='int') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value='/media/datos/jasmet50_phase', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/Meteor_JASMET_PreProc.py b/schainpy/scripts/scripts_v/Meteor_JASMET_PreProc.py new file mode 100644 index 0000000..4b5d668 --- /dev/null +++ b/schainpy/scripts/scripts_v/Meteor_JASMET_PreProc.py @@ -0,0 +1,56 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +path = os.path.split(path)[0] + +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/16', + endDate='2014/04/16', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/WindProfiler_DBS01.py b/schainpy/scripts/scripts_v/WindProfiler_DBS01.py new file mode 100644 index 0000000..fcd3b44 --- /dev/null +++ b/schainpy/scripts/scripts_v/WindProfiler_DBS01.py @@ -0,0 +1,169 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#Experimentos + +#2014050 19 Feb 2014 +# path = '/home/soporte/Documents/MST_Data/DBS/d2014050' +# pathFigure = '/home/soporte/workspace/Graficos/DBS/d2014050p/' +# xmin = '15.5' +# xmax = '23.99999999' +# startTime = '17:25:00' +# filehdf5 = "DBS_2014050.hdf5" + +#2014051 20 Feb 2014 +path = '/home/soporte/Data/MST/DBS/d2014051' +pathFigure = '/home/soporte/workspace/Graficos/DBS/prueba1/' +xmin = '0' +xmax = '7.5' +startTime = '00:00:00' +filehdf5 = "DBS_2014051.hdf5" + + + +#------------------------------------------------------------------------------------------------ +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/01/31', + endDate='2014/03/31', + startTime=startTime, + endTime='23:59:59', + online=0, + delay=5, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='256', format='int') +# opObj11.addParameter(name='n', value='16', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='selectHeightsByIndex') +opObj11.addParameter(name='minIndex', value='10', format='float') +opObj11.addParameter(name='maxIndex', value='60', format='float') + +#--------------------------------------------------------------------------------------------------- + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='64', format='int') +# procUnitConfObj1.addParameter(name='ippFactor', value='2', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(0,1),(2,1)', format='pairsList') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='5', format='int') + +opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj14.addParameter(name='id', value='1', format='int') +opObj14.addParameter(name='wintitle', value='Con interf', format='str') +opObj14.addParameter(name='save', value='1', format='bool') +opObj14.addParameter(name='figpath', value=pathFigure, format='str') +opObj14.addParameter(name='zmin', value='5', format='int') +opObj14.addParameter(name='zmax', value='90', format='int') + +opObj12 = procUnitConfObj1.addOperation(name='removeInterference') +opObj13 = procUnitConfObj1.addOperation(name='removeDC') +opObj13.addParameter(name='mode', value='1', format='int') + +opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj12.addParameter(name='id', value='2', format='int') +opObj12.addParameter(name='wintitle', value='RTI Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') +opObj12.addParameter(name='zmin', value='5', format='int') +opObj12.addParameter(name='zmax', value='90', format='int') + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +opObj21.addParameter(name='id', value='3', format='int') +opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=pathFigure, format='str') +opObj21.addParameter(name='zmin', value='5', format='int') +opObj21.addParameter(name='zmax', value='90', format='int') + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='5', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot', format='str') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=pathFigure, format='str') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='60', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=xmin, format='float') +opObj21.addParameter(name='xmax', value=xmax, format='float') + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='6', format='int') +opObj21.addParameter(name='wintitle', value='Spectral width Plot', format='str') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=pathFigure, format='str') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='60', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=xmin, format='float') +opObj21.addParameter(name='xmax', value=xmax, format='float') +opObj21.addParameter(name='zmin', value=0, format='float') +opObj21.addParameter(name='paramIndex', value=2, format='int') +opObj21.addParameter(name='onlyPositive', value=1, format='bool') + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='DBS', format='str') +opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +opObj22.addParameter(name='correctFactor', value='-1', format='float') +opObj22.addParameter(name='dirCosx', value='0.041016, 0, -0.054688', format='floatlist') +opObj22.addParameter(name='dirCosy', value='-0.041016, 0.025391, -0.023438', format='floatlist') +# opObj22.addParameter(name='horizontalOnly', value='1', format='bool') +# opObj22.addParameter(name='channelList', value='1,2', format='intlist') + +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = pathFigure, format='str') +opObj23.addParameter(name='zmin', value='-10', format='int') +opObj23.addParameter(name='zmax', value='10', format='int') +opObj23.addParameter(name='zmin_ver', value='-80', format='float') +opObj23.addParameter(name='zmax_ver', value='80', format='float') +opObj23.addParameter(name='SNRmin', value='-10', format='int') +opObj23.addParameter(name='SNRmax', value='60', format='int') +opObj23.addParameter(name='SNRthresh', value='0', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') + +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/WindProfiler_SA01.py b/schainpy/scripts/scripts_v/WindProfiler_SA01.py new file mode 100644 index 0000000..8d0a8c6 --- /dev/null +++ b/schainpy/scripts/scripts_v/WindProfiler_SA01.py @@ -0,0 +1,139 @@ +# DIAS 19 Y 20 FEB 2014 +# Comprobacion de Resultados DBS con SA + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "SA Experiment Test" +filename = "SA2014050.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#Experimentos + +#2014050 19 Feb 2014 +path = '/home/soporte/Data/MST/SA/d2014050' +pathFigure = '/home/soporte/workspace/Graficos/SA/prueba1/' +xmin = '15.5' +xmax = '24' +startTime = '15:30:00' +filehdf5 = "SA_2014050.hdf5" + +#2014051 20 Feb 2014 +# path = '/home/soporte/Data/MST/SA/d2014051' +# pathFigure = '/home/soporte/workspace/Graficos/SA/new/' +# xmin = '0.0' +# xmax = '8.0' +# startTime = '00:00:00' +# filehdf5 = "SA_2014051.hdf5" + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/01/01', + endDate='2014/03/31', + startTime=startTime, + endTime='23:59:59', + online=0, + delay=5, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + + +#-------------------------------------------------------------------------------------------------- + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='600', format='int') +# opObj11.addParameter(name='n', value='10', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='selectHeightsByIndex') +opObj11.addParameter(name='minIndex', value='10', format='float') +opObj11.addParameter(name='maxIndex', value='60', format='float') +#--------------------------------------------------------------------------------------------------- +procUnitConfObj1 = controllerObj.addProcUnit(datatype='CorrelationProc', inputId=procUnitConfObj0.getId()) +# procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(1,0),(2,3)', format='pairsList') +procUnitConfObj1.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(0,3),(0,2),(1,3),(1,2),(0,1),(2,3)', format='pairsList') +procUnitConfObj1.addParameter(name='fullT', value='1', format='bool') +procUnitConfObj1.addParameter(name='removeDC', value='1', format='bool') +#procUnitConfObj1.addParameter(name='lagT', value='0,1,2,3', format='intlist') + +opObj12 = procUnitConfObj1.addOperation(name='CorrelationPlot', optype='other') +opObj12.addParameter(name='id', value='1', format='int') +opObj12.addParameter(name='wintitle', value='CrossCorrelation Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='zmin', value='0', format='int') +opObj12.addParameter(name='zmax', value='1', format='int') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') + +opObj12 = procUnitConfObj1.addOperation(name='removeNoise') +opObj12.addParameter(name='mode', value='2', format='int') +opObj12 = procUnitConfObj1.addOperation(name='calculateNormFactor') + +opObj12 = procUnitConfObj1.addOperation(name='CorrelationPlot', optype='other') +opObj12.addParameter(name='id', value='2', format='int') +opObj12.addParameter(name='wintitle', value='CrossCorrelation Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='zmin', value='0', format='int') +opObj12.addParameter(name='zmax', value='1', format='int') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') + +#--------------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetLags') + +opObj21 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj21.addParameter(name='technique', value='SA', format='str') +# opObj21.addParameter(name='correctFactor', value='-1', format='float') +opObj21.addParameter(name='positionX', value='36,0,36,0', format='floatlist') +opObj21.addParameter(name='positionY', value='36,0,0,36', format='floatlist') +opObj21.addParameter(name='azimuth', value='51.06', format='float') +opObj21.addParameter(name='crosspairsList', value='(0,3),(0,2),(1,3),(1,2),(0,1),(2,3)', format='pairsList')#COrregir +# +opObj22 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj22.addParameter(name='id', value='4', format='int') +opObj22.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj22.addParameter(name='save', value='1', format='bool') +opObj22.addParameter(name='figpath', value = pathFigure, format='str') +opObj22.addParameter(name='zmin', value='-15', format='int') +opObj22.addParameter(name='zmax', value='15', format='int') +opObj22.addParameter(name='zmin_ver', value='-80', format='float') +opObj22.addParameter(name='zmax_ver', value='80', format='float') +opObj22.addParameter(name='SNRmin', value='-20', format='int') +opObj22.addParameter(name='SNRmax', value='40', format='int') +opObj22.addParameter(name='SNRthresh', value='-3.5', format='float') +opObj22.addParameter(name='xmin', value=xmin, format='float') +opObj22.addParameter(name='xmax', value=xmax, format='float') +# #----------------------------------------------------------------------------------- +# +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +# procUnitConfObj2.addParameter(name='nFFTPoints', value='128', format='int') +# procUnitConfObj2.addParameter(name='nProfiles', value='128', format='int') +# procUnitConfObj2.addParameter(name='pairsList', value='(0,0),(0,1),(2,1)', format='pairsList') +# +# opObj22 = procUnitConfObj2.addOperation(name='SpectraPlot', optype='other') +# opObj22.addParameter(name='id', value='5', format='int') +# opObj22.addParameter(name='wintitle', value='Spectra Plot', format='str') +# opObj22.addParameter(name='save', value='1', format='bool') +# opObj22.addParameter(name='figpath', value = pathFigure, format='str') + +#----------------------------------------------------------------------------------- + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/__init__.py b/schainpy/scripts/scripts_v/__init__.py new file mode 100644 index 0000000..8feaeca --- /dev/null +++ b/schainpy/scripts/scripts_v/__init__.py @@ -0,0 +1,5 @@ +''' +Created on Jul 2, 2014 + +@author: roj-idl71 +''' diff --git a/schainpy/scripts/scripts_v/amisr_EEJ.py b/schainpy/scripts/scripts_v/amisr_EEJ.py new file mode 100644 index 0000000..3358429 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_EEJ.py @@ -0,0 +1,127 @@ +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/noise/eej') + +xmin = '8' +xmax = '10' +dbmin = '60'#'55' #'40' #noise esf eej +dbmax = '70'#'70' #'55' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2015/09/03',#'2015/08/14', #'2014/10/07', + endDate='2015/09/03',#'2015/08/14', #'2014/10/07', + startTime='08:00:00',#'07:00:00', + endTime='10:00:00',#'15:00:00', + walk=0, + timezone='lt', + all=0, + online=0) + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value='1', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +#opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +#opObj11.addParameter(name='timeInterval', value='10', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=16, format='int') + +#opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +# opObj11.addParameter(name='n', value='90', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +#RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + + +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_Ivan_proc_online.py b/schainpy/scripts/scripts_v/amisr_Ivan_proc_online.py new file mode 100644 index 0000000..7dec629 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_Ivan_proc_online.py @@ -0,0 +1,225 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/Pruebas' +remotefolder = "/home/wmaster/graficos" + +xmin = '07' +xmax = '18' +#xmin = '00' +#xmax = '33' +ymin ='30' +ymax ='300' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '60' #'70' #'55' + +dbmin = '60' +dbmax = '80' +show = '1' + +code = '1,1,-1' +nCode = '1' +nBaud = '3' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + #startDate='2015/12/16', + #endDate='2015/12/17', + startTime='07:01:30',#'07:00:00', + endTime='17:55:00',#'15:00:00', + #startTime='00:00:30',#'07:00:00', + #endTime='23:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=10, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value='32', format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='50', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# #procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# #procUnitConfObj2.addParameter(name='server', value='181.177.232.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='0', format='int') +# #procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_Jenipher_proc_online.py b/schainpy/scripts/scripts_v/amisr_Jenipher_proc_online.py new file mode 100644 index 0000000..3b43ea4 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_Jenipher_proc_online.py @@ -0,0 +1,224 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/Pruebas' +remotefolder = "/home/wmaster/graficos" + +xmin = '07' +xmax = '18' +#xmin = '00' +#xmax = '33' +ymin ='30' +ymax ='300' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +dbmin = '65' +dbmax = '95' +show = '1' + +code = '1,1,1,1,1,-1,-1,1,1,-1,1,-1,1' +nCode = '1' +nBaud = '13' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + #startDate='2015/12/16', + #endDate='2015/12/17', + startTime='07:01:30',#'07:00:00', + endTime='17:55:00',#'15:00:00', + #startTime='00:00:30',#'07:00:00', + #endTime='23:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='440e6', format='float') #changed on Dic 3, 15:40h + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value='50', format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='50', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# #procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# #procUnitConfObj2.addParameter(name='server', value='181.177.232.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='0', format='int') +# #procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_claire_eej_proc_online.py b/schainpy/scripts/scripts_v/amisr_claire_eej_proc_online.py new file mode 100644 index 0000000..1f87a6a --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_claire_eej_proc_online.py @@ -0,0 +1,146 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/EEJclaire' +remotefolder = "/home/wmaster/graficos" + +xmin = '07' +xmax = '18' +#xmin = '00' +#xmax = '33' +ymin ='0' +ymax ='180' +dbmin = '10'#'45' #'60'#'55' #'40' #noise esf eej +dbmax = '30'#'65' #'70' #'55' + +show = '1' + + +code = '1' +nCode = '1' +nBaud = '1' +nosamp = '10' # oversample + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + #startDate='2015/12/16', + #endDate='2015/12/17', + startTime='07:01:30',#'07:00:00', + endTime='17:55:00',#'15:00:00', + #startTime='00:00:30',#'07:00:00', + #endTime='23:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='150', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISRclaire', format='str') +# opObj11.addParameter(name='ymin', value=ymin, format='int') +# opObj11.addParameter(name='ymax', value=ymax, format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISRclaire', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=ymin, format='int') +# opObj11.addParameter(name='ymax', value=ymax, format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') + + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_clairenoise.py b/schainpy/scripts/scripts_v/amisr_clairenoise.py new file mode 100644 index 0000000..10feee2 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_clairenoise.py @@ -0,0 +1,207 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/uhf/DATA/RUIDO_UHF_100KHZ/NOCHE' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/UHF' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +#xmin = '00' +#xmax = '33' +ymin ='0' +ymax ='187.5' + +dbmin = '20' +dbmax = '30' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + #startDate='2015/12/16', + #endDate='2015/12/17', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + #startTime='00:00:30',#'07:00:00', + #endTime='23:59:59',#'15:00:00', + walk=1, + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h + + +opObj12 = procUnitConfObjBeam0.addOperation(name='CohInt',optype='external') +opObj12.addParameter(name='n', value='4', format='float') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value='1024', format='int') + + + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='50', format='float') +opObj11.addParameter(name='maxHei', value='180', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Spectra Noise Claire', format='str') +#opObj11.addParameter(name='ymin', value=ymin, format='int') +#opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='RTI Noise Claire', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +#opObj11.addParameter(name='ymin', value=ymin, format='int') +#opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +#procUnitConfObj2.addParameter(name='server', value='181.177.232.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +#procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' delay = 5 +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='Noise Claire', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_clairenoise_off.py b/schainpy/scripts/scripts_v/amisr_clairenoise_off.py new file mode 100644 index 0000000..ab0b029 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_clairenoise_off.py @@ -0,0 +1,207 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/uhf/DATA/RUIDO_UHF_100KHZ/NOCHE' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/UHF' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +#xmin = '00' +#xmax = '33' +ymin ='0' +ymax ='187.5' + +dbmin = '20' +dbmax = '30' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + #startDate=today, #'2014/10/07', + #endDate=today, #'2014/10/07', + startDate='2017/06/12', + endDate='2017/06/12', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + #startTime='00:00:30',#'07:00:00', + #endTime='23:59:59',#'15:00:00', + walk=1, + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h + + +opObj12 = procUnitConfObjBeam0.addOperation(name='CohInt',optype='external') +opObj12.addParameter(name='n', value='4', format='float') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=1024, format='int') + + + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='50', format='float') +opObj11.addParameter(name='maxHei', value='180', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Spectra Noise Claire', format='str') +#opObj11.addParameter(name='ymin', value=ymin, format='int') +#opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='RTI Noise Claire', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +#opObj11.addParameter(name='ymin', value=ymin, format='int') +#opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +#procUnitConfObj2.addParameter(name='server', value='181.177.232.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +#procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='Noise Claire', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_eej_proc.py b/schainpy/scripts/scripts_v/amisr_eej_proc.py new file mode 100644 index 0000000..0f48998 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_eej_proc.py @@ -0,0 +1,183 @@ + + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +# path = os.path.split(os.getcwd())[0] +# path = os.path.split(path)[0] +# +# sys.path.append(path) + + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +figpath = '/home/soporte/Data/EEJ' + +xmin = '00' +xmax = '24' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + startTime='07:01:30',#'07:00:00', + endTime='17:55:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='150', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +# #procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(4,4)', \ +# # format='pairsList') +# +# # procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0)', \ +# # format='pairsList') +# # +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +# #Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +# #opObj11.addParameter(name='minHei', value='15', format='float') +# #opObj11.addParameter(name='maxHei', value='20', format='float') +# # +# #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# # +# # # #RTIPlot +# # # #title0 = 'RTI AMISR Beam 0' +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +# # opObj11.addParameter(name='id', value='2', format='int') +# # # opObj11.addParameter(name='wintitle', value=title0, format='str') +# # opObj11.addParameter(name='showprofile', value='0', format='int') +# # opObj11.addParameter(name='xmin', value=xmin, format='float') +# # opObj11.addParameter(name='xmax', value=xmax, format='float') +# # opObj11.addParameter(name='zmin', value=dbmin, format='int') +# # opObj11.addParameter(name='zmax', value=dbmax, format='int') +# # opObj11.addParameter(name='save', value='1', format='bool') +# # opObj11.addParameter(name='figpath', value = figpath, format='str') +# # # +# # # +# # #Noise +# #title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# # opObj11.addParameter(name='wintitle', value=title0, format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#For saving Pdata (doesn't work with amisr data yet!) +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=figpath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_eej_proc_offline.py b/schainpy/scripts/scripts_v/amisr_eej_proc_offline.py new file mode 100755 index 0000000..1576aac --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_eej_proc_offline.py @@ -0,0 +1,193 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +# path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +# path = '/mnt/data_amisr' +path = '/home/soporte/dataAMISR/20191216.001' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/EEJ' + +xmin = '07' +xmax = '18' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' +show = '0' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2019/12/16', #'2019/12/16', + endDate='2019/12/16', #'2014/10/07', + startTime='07:01:30',#'07:00:00', + endTime='18:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='150', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +# #procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(4,4)', \ +# # format='pairsList') +# +# # procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0)', \ +# # format='pairsList') +# # +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') +# # +# #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# # +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') +opObj11.addParameter(name='show', value = show, format='bool') + +# # # +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') +opObj11.addParameter(name='show', value = show, format='bool') + + + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=figpath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- +##################### +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/param') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm diff --git a/schainpy/scripts/scripts_v/amisr_eej_proc_offline_pdata_moments.py b/schainpy/scripts/scripts_v/amisr_eej_proc_offline_pdata_moments.py new file mode 100644 index 0000000..b3c542e --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_eej_proc_offline_pdata_moments.py @@ -0,0 +1,217 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/EEJ' + + + + +dpath= '/media/soporte/DATA/AMISR/JULIA/proc/EEJ' + + + +#path='/media/soporte/New Volume1/AMISR/JULIA/EEJ' +#path = '/media/soporte/DATA/AMISR/JULIA/EEJ' +#path = '/media/soporte/data/AMISR/EEJ' +#path = '/mnt/data_amisr/EEJ' + + +#path = '/media/soporte/data/AMS/EEJ' (2017/03/14) + +path = '/mnt/data_hddamisr/EEJ' +path = '/mnt/data_amisr/EEJ' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/EEJ' +pdatapath = '/media/soporte/DATA/AMISR/JULIA/pdata/EEJ' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/EEJ' + +xmin = '07' +xmax = '18' +ymin = '0' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' +show = '0' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2017/05/22',#'2016/04/09', #'2014/10/07', + endDate='2017/05/27',#'2016/04/15', #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='300', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +# #procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(4,4)', \ +# # format='pairsList') +# +# # procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0)', \ +# # format='pairsList') +# # +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') +# # +# #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# # +# # #RTIPlot +# # #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') + +# # # +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# # opObj11.addParameter(name='wintitle', value=title0, format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=pdatapath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=procpath) +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_eej_proc_online.py b/schainpy/scripts/scripts_v/amisr_eej_proc_online.py new file mode 100644 index 0000000..b54d08b --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_eej_proc_online.py @@ -0,0 +1,224 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/EEJ' +remotefolder = "/home/wmaster/graficos" + +xmin = '07' +xmax = '18' +#xmin = '00' +#xmax = '33' +ymin ='30' +ymax ='300' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +dbmin = '45' +dbmax = '65' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=today, #'2014/10/07', + #startDate='2015/12/16', + #endDate='2015/12/17', + startTime='07:01:30',#'07:00:00', + endTime='17:55:00',#'15:00:00', + #startTime='00:00:30',#'07:00:00', + #endTime='23:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h +opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='150', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +#procUnitConfObj2.addParameter(name='server', value='181.177.232.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +#procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_eej_proc_plot.py b/schainpy/scripts/scripts_v/amisr_eej_proc_plot.py new file mode 100755 index 0000000..c1a9e22 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_eej_proc_plot.py @@ -0,0 +1,187 @@ +# /usr/bin/python +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc_plot', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/noise_Pall' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +figpath = '/home/soporte/Data/EEJ' +remotefolder = "/home/wmaster/graficos" + +path = figpath +pathfile1 = figpath +xmin = '07' +xmax = '18' +ymin ='30' +ymax ='300' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +today = time.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate=today, + endDate=today, + startTime='07:00:00', + endTime='18:00:00', + delay=150, + set=0, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObj1.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') + + + +#Spectra Plot +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1002', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') + +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='exp_code', value='31', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#RTI plot +opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj12.addParameter(name='id', value='2015', format='int') +opObj12.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') +opObj12.addParameter(name='zmin', value=dbmin, format='int') +opObj12.addParameter(name='zmax', value=dbmax, format='int') +opObj12.addParameter(name='ymin', value=ymin, format='int') +opObj12.addParameter(name='ymax', value=ymax, format='int') + #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +opObj12.addParameter(name='showprofile', value='0', format='int') +opObj12.addParameter(name='save', value='1', format='int') +opObj12.addParameter(name='figpath', value=figpath+'/plots', format='str') + +opObj12.addParameter(name='ftp', value='1', format='int') +opObj12.addParameter(name='wr_period', value='2', format='int') +opObj12.addParameter(name='exp_code', value='21', format='int') +opObj12.addParameter(name='sub_exp_code', value='3', format='int') +# opObj12.addParameter(name='exp_code', value='31', format='int') +# opObj12.addParameter(name='sub_exp_code', value='0', format='int') +opObj12.addParameter(name='ftp_wei', value='0', format='int') +opObj12.addParameter(name='plot_pos', value='0', format='int') + + + + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +#procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='Imaging', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='figpath', value='/home/signalchain/Pictures/imaging', format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathfile1+'/plots') +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + +#opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +#opObj11.addParameter(name='ext', value='*.png', format='str') +#opObj11.addParameter(name='localfolder', value='/media/DATA/imaging', format='str') +#opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='server', value='10.10.120.125', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='period', value='5', format='int') + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_eej_proc_plot.py~ b/schainpy/scripts/scripts_v/amisr_eej_proc_plot.py~ new file mode 100755 index 0000000..c68a9a4 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_eej_proc_plot.py~ @@ -0,0 +1,147 @@ +#!/usr/bin/python +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/noise_Pall' +#path = '/media/soporte/AMISR_104' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +path = figpath +pathfile1 = figpath +xmin = '07' +xmax = '18' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2015/08/16', + endDate='2015/08/16', + startTime='00:00:00', + endTime='23:59:59', + delay=0, + set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObj1.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1002', format='int') +opObj11.addParameter(name='wintitle', value='Noise AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +#opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') +#opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp', value='1', format='int') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='2015', format='int') +# opObj11.addParameter(name='wintitle', value='Noise AMISR', format='str') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# #opObj11.addParameter(name='exp_code', value='13', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') +# #opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp', value='1', format='int') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + +#Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='Imaging', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='figpath', value='/home/signalchain/Pictures/imaging', format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathfile1+'/plots') +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + +#opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +#opObj11.addParameter(name='ext', value='*.png', format='str') +#opObj11.addParameter(name='localfolder', value='/media/DATA/imaging', format='str') +#opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='server', value='10.10.120.125', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='period', value='5', format='int') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(path +'/'+filename) +print "Leyendo el archivo XML" +controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_eej_proc_plot_offline.py b/schainpy/scripts/scripts_v/amisr_eej_proc_plot_offline.py new file mode 100644 index 0000000..315f8fa --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_eej_proc_plot_offline.py @@ -0,0 +1,197 @@ +# /usr/bin/python +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc_plot', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/noise_Pall' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +remotefolder = "/home/wmaster/graficos" + +path = '/media/soporte/DATA/AMISR/JULIA/pdata/EEJ/' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/EEJ' + + + +# path = figpath +# pathfile1 = figpath +xmin = '07' +xmax = '18' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' +ymin = '0' +# ymax = '300' +show = '1' + +today = time.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2017/02/23',#'2016/04/01', + endDate='2017/03/04',#2017/03/14 '2016/04/30', + startTime='07:00:00', + endTime='17:59:59', + delay=0, + set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObj1.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj10 = procUnitConfObj1.addOperation(name='selectChannelsByIndex') +# opObj10.addParameter(name='channelIndexList', value='2', format='intlist') + + +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') + + + +#Spectra Plot +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2015', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# # opObj11.addParameter(name='ymin', value=ymin, format='int') +# # opObj11.addParameter(name='ymax', value=ymax, format='int') +# opObj11.addParameter(name='save', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') + +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# # opObj11.addParameter(name='exp_code', value='31', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#RTI plot +opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj12.addParameter(name='id', value='2015', format='int') +opObj12.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') +opObj12.addParameter(name='ymin', value=ymin, format='float') +# opObj12.addParameter(name='ymax', value=ymax, format='float') +opObj12.addParameter(name='zmin', value=dbmin, format='int') +opObj12.addParameter(name='zmax', value=dbmax, format='int') + #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +opObj12.addParameter(name='showprofile', value='0', format='int') +opObj12.addParameter(name='save', value='1', format='int') +opObj12.addParameter(name='figpath', value=figpath, format='str') +opObj12.addParameter(name='show', value = show, format='bool') + +# opObj12.addParameter(name='ftp', value='1', format='int') +# opObj12.addParameter(name='wr_period', value='2', format='int') +# opObj12.addParameter(name='exp_code', value='21', format='int') +# opObj12.addParameter(name='sub_exp_code', value='3', format='int') +# # opObj12.addParameter(name='exp_code', value='31', format='int') +# # opObj12.addParameter(name='sub_exp_code', value='0', format='int') +# opObj12.addParameter(name='ftp_wei', value='0', format='int') +# opObj12.addParameter(name='plot_pos', value='0', format='int') + + + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# #procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='Imaging', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='figpath', value='/home/signalchain/Pictures/imaging', format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') +# +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=pathfile1+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + +#opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +#opObj11.addParameter(name='ext', value='*.png', format='str') +#opObj11.addParameter(name='localfolder', value='/media/DATA/imaging', format='str') +#opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='server', value='10.10.120.125', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='period', value='5', format='int') + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_esf6beam_proc_online.py b/schainpy/scripts/scripts_v/amisr_esf6beam_proc_online.py new file mode 100644 index 0000000..e023cbf --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf6beam_proc_online.py @@ -0,0 +1,220 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF6beams' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/02/03',#today, #'2014/10/07', + endDate='2016/02/06', #tomorrow, #'2014/10/07', + startTime='00:00:30',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='4', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='4', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +#procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# #generate moments +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esfEWDrift_proc_plot_offline.py b/schainpy/scripts/scripts_v/amisr_esfEWDrift_proc_plot_offline.py new file mode 100644 index 0000000..bf6cbf9 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esfEWDrift_proc_plot_offline.py @@ -0,0 +1,179 @@ +# /usr/bin/python +import os, sys +import time, datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc_plot', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/ESF' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +figpath = '/home/soporte/Data/ESF' +figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' + +remotefolder = "/home/wmaster/graficos" + +path = figpath +pathfile1 = figpath +xmin = '18' +xmax = '31' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +path = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF10beams/' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF10beams' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF10beams' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2017/05/26', + endDate='2017/05/27', + startTime='18:01:00', + endTime='06:59:00', + delay=0, + #set=0, + online=0, + walk=1 + ) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObj1.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='650', format='float') +opObj11.addParameter(name='maxHei', value='800', format='float') + + +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1002', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') +# +# +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# # opObj11.addParameter(name='exp_code', value='31', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#RTI Plot +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2016', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') + +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# # opObj11.addParameter(name='exp_code', value='31', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#Noise +# #title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='Imaging', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='figpath', value='/home/signalchain/Pictures/imaging', format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') +# +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# # +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=procpath) +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(path +'/'+filename) +print "Leyendo el archivo XML" +controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_allday_offline.py b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_allday_offline.py new file mode 100644 index 0000000..ccdbcf2 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_allday_offline.py @@ -0,0 +1,234 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF/EWDrift' +remotefolder = "/home/wmaster/graficos" + +xmin = '16' +xmax = '33' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2017/08/02', #'2014/10/07', + endDate='2017/08/03', + startTime='16:00:00',#'07:00:00', + endTime='08:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') +# opObj11.addParameter(name='channelList', value='0,2,4,6,8', format='intlist') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='ymin', value='0', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='ymin', value='0', format='int') + +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# # #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# #procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='300', format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# #generate moments +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_allday_online.py b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_allday_online.py new file mode 100644 index 0000000..1641534 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_allday_online.py @@ -0,0 +1,234 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +xmin = '16' +xmax = '33' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2017/08/02', #'2014/10/07', + endDate='2017/08/03', + startTime='16:00:00',#'07:00:00', + endTime='09:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') +opObj11.addParameter(name='channelList', value='0,2,4,6,8', format='intlist') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='ymin', value='0', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='ymin', value='0', format='int') + +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# #generate moments +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_offline.py b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_offline.py new file mode 100644 index 0000000..fd44ca4 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_offline.py @@ -0,0 +1,233 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +xmin = '18' +xmax = '32' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +str2 = str - datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") +yesterday = str2.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=yesterday,#'2016/07/12', + endDate=yesterday,#'2016/07/13', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') +opObj11.addParameter(name='channelList', value='0,2,4,6,8', format='intlist') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +#procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# #generate moments +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_offline_pdata_moments.py b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_offline_pdata_moments.py new file mode 100644 index 0000000..e47bbcf --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_offline_pdata_moments.py @@ -0,0 +1,258 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +path='/media/soporte/data_karim/AMISR/JULIA/ESF10beams' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF10beams' +pdatapath = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF10beams' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF10beams' + + +path='/media/soporte/Seagate Backup Plus Drive/AMISR/JULIA/' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF10beams' +pdatapath = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF10beams' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF10beams' + + +#path='/mnt/data_amisr/' +#path = '/media/soporte/New Volume/AMISR/JULIA/ESF10Beams/' +#path = '/media/soporte/data/AMISR/ESFDrift/' +#path = '/mnt/data_amisr/ESF10beams/' + +#path = '/media/soporte/data/AMS/ESF10beams/' (2017/03/14 - 2017/03/15) + +path = '/mnt/data_hddamisr/ESF10Beams' +path='/mnt/data_amisr/ESF10beams' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF10beams' +pdatapath = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF10beams' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF10beams' + +xmin = '18' +xmax = '31' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +str2 = str - datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") +yesterday = str2.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2017/05/26', + endDate='2017/05/27', + startTime='18:01:00',#'07:00:00', + endTime='06:59:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') +# opObj11.addParameter(name='channelList', value='0,2,4,6,8', format='intlist') + +#SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# # opObj11.addParameter(name='exp_code', value='21', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# # opObj11.addParameter(name='ftp_wei', value='0', format='int') +# # opObj11.addParameter(name='plot_pos', value='0', format='int') +# opObj11.addParameter(name='exp_code', value='1', format='int') +# opObj11.addParameter(name='sub_exp_code', value='1', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# # #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# #procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='300', format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=pdatapath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + +# #generate moments +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=procpath) +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_online.py b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_online.py new file mode 100644 index 0000000..352c377 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esfEwDrift_proc_online.py @@ -0,0 +1,232 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=tomorrow, + startTime='18:01:00',#'07:00:00', + endTime='06:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') +opObj11.addParameter(name='channelList', value='0,2,4,6,8', format='intlist') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +#procUnitConfObj2.addParameter(name='server', value='181.177.232.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# #generate moments +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esf_proc.py b/schainpy/scripts/scripts_v/amisr_esf_proc.py new file mode 100644 index 0000000..6fbe0ea --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf_proc.py @@ -0,0 +1,180 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +figpath = '/home/soporte/Data/ESF' + +xmin = '00' +xmax = '24' +dbmin = '50' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=tomorrow, #'2014/10/07', + startTime='18:01:30',#'07:00:00', + endTime='06:55:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +# #procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(4,4)', \ +# # format='pairsList') +# +# # procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0)', \ +# # format='pairsList') +# # +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +# #Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +# #opObj11.addParameter(name='minHei', value='15', format='float') +# #opObj11.addParameter(name='maxHei', value='20', format='float') +# # +# #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# # +# # # #RTIPlot +# # # #title0 = 'RTI AMISR Beam 0' +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +# # opObj11.addParameter(name='id', value='2', format='int') +# # # opObj11.addParameter(name='wintitle', value=title0, format='str') +# # opObj11.addParameter(name='showprofile', value='0', format='int') +# # opObj11.addParameter(name='xmin', value=xmin, format='float') +# # opObj11.addParameter(name='xmax', value=xmax, format='float') +# # opObj11.addParameter(name='zmin', value=dbmin, format='int') +# # opObj11.addParameter(name='zmax', value=dbmax, format='int') +# # opObj11.addParameter(name='save', value='1', format='bool') +# # opObj11.addParameter(name='figpath', value = figpath, format='str') +# # # +# # # +# # #Noise +# #title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# # opObj11.addParameter(name='wintitle', value=title0, format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#For saving Pdata (doesn't work with amisr data yet!) +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=figpath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esf_proc_offline.py b/schainpy/scripts/scripts_v/amisr_esf_proc_offline.py new file mode 100644 index 0000000..4dc09c2 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf_proc_offline.py @@ -0,0 +1,217 @@ +import os, sys +import time +#import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +def main(): + desc = "AMISR Experiment" + + filename = "amisr_reader.xml" + + controllerObj = Project() + + controllerObj.setup(id = '10', name='esf_proc', description=desc) + + + #path = os.path.join(os.environ['HOME'],'amisr') + # path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' + # path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' + # path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' + #path = '/mnt/data_amisr' + + #path = '/media/soporte/AMISR_104' + #figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') + #figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' + figpath = '/home/soporte/Data/ESF' + remotefolder = "/home/wmaster/graficos" + + xmin = '18' + xmax = '31' + dbmin = '60' #'60'#'55' #'40' #noise esf eej + dbmax = '75' #'70' #'55' + show = '1' + + code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' + nCode = '1' + nBaud = '28' + nosamp = '2' # oversample + + # str = datetime.date.today() + # str1 = str + datetime.timedelta(days=1) + # str2 = str - datetime.timedelta(days=1) + # today = str.strftime("%Y/%m/%d") + # tomorrow = str1.strftime("%Y/%m/%d") + # yesterday = str2.strftime("%Y/%m/%d") + path1= '/home/soporte/dataAMISR_test/' + path2='/home/soporte/Documentos/AMISR_datos_ejemplo/ESF/d2016014/' + + readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path1, + startDate="2019/12/15",#yesterday, #'2014/10/07', + endDate="2019/12/17", #'2014/10/07', + startTime='18:00:00',#'07:00:00', + endTime='07:00:00',#'15:00:00', + walk=1, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + + #AMISR Processing Unit + + #Voltage Processing Unit + procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') + #chaned on Dec 3, 15:40h + #opObj10.addParameter(name='frequency', value='430e6', format='float') + + # opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') + # opObj12.addParameter(name='minHei', value='0', format='float') + + # code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' + # code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' + #Noise--> no code + + opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='external') + opObj11.addParameter(name='code', value=code, format='floatlist') + opObj11.addParameter(name='nCode', value=nCode, format='int') + opObj11.addParameter(name='nBaud', value=nBaud, format='int') + opObj11.addParameter(name='osamp', value=nosamp, format='int') + + + # opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') + # opObj12.addParameter(name='minHei', value='50', format='float') + # opObj12.addParameter(name='maxHei', value='150', format='float') + #Coherent Integration + # opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') + # opObj11.addParameter(name='n', value='2', format='int') + + # opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') + # opObj11.addParameter(name='id', value='121', format='int') + + #Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints + procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) + procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') + procUnitConfObjSpectraBeam0.addParameter(name='frequency', value='445e6', format='float') + procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value='128', format='int') + procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0, 1), (2, 3)', format='pairslist') + # + #####opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') + #####opObj11.addParameter(name='n', value='60', format='int') + # #opObj11.addParameter(name='timeInterval', value='30', format='float') + + + # # #RemoveDc + # # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + + # #Noise Estimation + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise', optype='other') + # opObj11.addParameter(name='minHei', value='650', format='float') + # opObj11.addParameter(name='maxHei', value='800', format='float') + # #opObj11.addParameter(name='minHei', value='15', format='float') + # #opObj11.addParameter(name='maxHei', value='20', format='float') + + # #SpectraPlot + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='external') + opObj11.addParameter(name='id', value='1', format='int') + opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') + #opObj11.addParameter(name='zmin', value='38', format='int') + opObj11.addParameter(name='zmin', value=dbmin, format='int') + opObj11.addParameter(name='zmax', value=dbmax, format='int') + opObj11.addParameter(name='save', value='1', format='bool') + opObj11.addParameter(name='figpath', value = figpath, format='str') + + + #RTIPlot + #title0 = 'RTI AMISR Beam 0' + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='external') + # opObj11.addParameter(name='id', value='2', format='int') + # opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + # opObj11.addParameter(name='showprofile', value='1', format='int') + # opObj11.addParameter(name='xmin', value=xmin, format='float') + # opObj11.addParameter(name='xmax', value=xmax, format='float') + # opObj11.addParameter(name='zmin', value=dbmin, format='int') + # opObj11.addParameter(name='zmax', value=dbmax, format='int') + # opObj11.addParameter(name='save', value='1', format='bool') + # opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + # opObj11.addParameter(name='show', value = show, format='bool') + + op7 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='external') + op7.addParameter(name='id', value='20', format='int') + op7.addParameter(name='wintitle', value='RTI', format='str') + op7.addParameter(name='xmin', value='0', format='float') + op7.addParameter(name='xmax', value='24', format='float') + op7.addParameter(name='zmin', value='12', format='int') + op7.addParameter(name='zmax', value='32', format='int') + op7.addParameter(name='showprofile', value='1', format='int') + op7.addParameter(name='show', value = show, format='bool') + op7.addParameter(name='timerange', value=str(24*60*60), format='int') + op7.addParameter(name='save', value='1', format='bool') + op7.addParameter(name='figpath', value = figpath+'/plots', format='str') + + #op7.addParameter(name='timerange', value=str(24*60*60), format='int') + # # + # # + # #Noise + #title0 = 'RTI AMISR Beam 0' + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='external') + opObj11.addParameter(name='id', value='3', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='0', format='int') + opObj11.addParameter(name='xmin', value=xmin, format='float') + opObj11.addParameter(name='xmax', value=xmax, format='float') + opObj11.addParameter(name='ymin', value=dbmin, format='int') + opObj11.addParameter(name='ymax', value=dbmax, format='int') + opObj11.addParameter(name='save', value='1', format='bool') + opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + opObj11.addParameter(name='show', value = show, format='bool') + + + #Generate *.pdata from AMISR data + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='external') + opObj11.addParameter(name='path', value=figpath) + opObj11.addParameter(name='blocksPerFile', value='10', format='int') + opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + #generate moments + # procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) + # opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + # + # opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') + # opObj12.addParameter(name='path', value=figpath+'/param') + # opObj12.addParameter(name='blocksPerFile', value='10', format='int') + # opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') + # opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') + # opObj12.addParameter(name='mode',value='1',format='int') + + + # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') + # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') + # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') + # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') + # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') + # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') + # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') + # procUnitConfObj2.addParameter(name='period', value=5, format='int') + # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + #----------------------------------------------------------------------------------------------- + + controllerObj.start() + # print ("Escribiendo el archivo XML") + # controllerObj.writeXml(filename) + # print ("Leyendo el archivo XML") + # controllerObj.readXml(filename) + + +#21 3 pm +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/scripts_v/amisr_esf_proc_offline_pdata_moments.py b/schainpy/scripts/scripts_v/amisr_esf_proc_offline_pdata_moments.py new file mode 100644 index 0000000..2eb7fa0 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf_proc_offline_pdata_moments.py @@ -0,0 +1,226 @@ + +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +path = '/media/soporte/New Volume/AMISR/JULIA/ESF' +figpath = '/media/soporte/New Volume/AMISR/JULIA/plots/ESF' +pdatapath = '/media/soporte/New Volume/AMISR/JULIA/pdata/ESF' +procpath = '/media/soporte/New Volume/AMISR/JULIA/param/ESF' + + +path='/media/soporte/New Volume/AMISR/JULIA/ESF' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF' +pdatapath = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF' + +path='/media/soporte/DATA/AMISR/JULIA/ESF' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF' +pdatapath = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF' + +path='/media/soporte/data_karim/AMISR/JULIA/ESF' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF' +pdatapath = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF' + +xmin = '18' +xmax = '31' +# xmin = '0' +# xmax = '24' +ymin ='0' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '0' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +str2 = str - datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") +yesterday = str2.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/06/27',#yesterday, #'2014/10/07', + endDate='2016/07/31',#today, #'2014/10/07', + startTime='18:00:00',#'07:00:00', + endTime='06:59:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #chaned on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='435e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeInterference') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int')# time interval 1 min +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +# #Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='650', format='float') +# opObj11.addParameter(name='maxHei', value='800', format='float') +# #opObj11.addParameter(name='minHei', value='15', format='float') +# #opObj11.addParameter(name='maxHei', value='20', format='float') +# +# # #SpectraPlot +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1', format='int') +# opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +# #opObj11.addParameter(name='zmin', value='38', format='int') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='ymin', value=ymin, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# +# +# # #RTIPlot +# # #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +# # # +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=pdatapath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') +opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + +# #generate moments +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=procpath) +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esf_proc_online.py b/schainpy/scripts/scripts_v/amisr_esf_proc_online.py new file mode 100644 index 0000000..255f331 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf_proc_online.py @@ -0,0 +1,228 @@ +import os, sys +import time +import datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +xmin = '18' +xmax = '31' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' +show = '1' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' +nosamp = '2' # oversample + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=today, #'2014/10/07', + endDate=tomorrow, #'2014/10/07', + startTime='18:01:30',#'07:00:00', + endTime='07:00:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code + +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value=nCode, format='int') +opObj11.addParameter(name='nBaud', value=nBaud, format='int') +opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +# # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='0', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') +opObj11.addParameter(name='exp_code', value='1', format='int') +opObj11.addParameter(name='sub_exp_code', value='1', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +# #send to server +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +#procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value='300', format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + +# # # +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +#Generate *.pdata from AMISR data +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# #generate moments +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_esf_proc_plot.py b/schainpy/scripts/scripts_v/amisr_esf_proc_plot.py new file mode 100755 index 0000000..294c9e2 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf_proc_plot.py @@ -0,0 +1,157 @@ +# /usr/bin/python +import os, sys +import time, datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc_plot', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/ESF' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +figpath = '/home/soporte/Data/ESF' +remotefolder = "/home/wmaster/graficos" + +path = figpath +pathfile1 = figpath +xmin = '18' +xmax = '31' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +str2 = str - datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") +yesterday = str2.strftime("%Y/%m/%d") + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate=today, + endDate=tomorrow, + startTime='18:00:00', + endTime='07:00:00', + delay=150, + #set=0, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObj1.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='650', format='float') +opObj11.addParameter(name='maxHei', value='800', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1002', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') + + +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='exp_code', value='31', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + + +#RTI Plot +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2015', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') + +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# opObj11.addParameter(name='exp_code', value='31', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + + + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathfile1+'/plots') +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(path +'/'+filename) +print "Leyendo el archivo XML" +controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_esf_proc_plot.py.save b/schainpy/scripts/scripts_v/amisr_esf_proc_plot.py.save new file mode 100755 index 0000000..8d7b94b --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf_proc_plot.py.save @@ -0,0 +1,148 @@ +# /usr/bin/python +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc_plot', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/ESF' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +figpath = '/home/soporte/Data/ESF' +path = figpath +pathfile1 = figpath +xmin = '18' +xmax = '25' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2015/10/05', + endDate='2015/10/06', + startTime='18:00:00', + endTime='07:00:00', + delay=60, + set=0, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObj1.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1002', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +#opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') +#opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp', value='1', format='int') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2015', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +#opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +opObj11.addParameter(name='showprofile', value='0', format='int') + #opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') + #opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +#Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='Imaging', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='figpath', value='/home/signalchain/Pictures/imaging', format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +opObj12.addParameter(name='path', value=pathfile1+'/plots') +opObj12.addParameter(name='blocksPerFile', value='10', format='int') +opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +opObj12.addParameter(name='mode',value='1',format='int') + +#opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +#opObj11.addParameter(name='ext', value='*.png', format='str') +#opObj11.addParameter(name='localfolder', value='/media/DATA/imaging', format='str') +#opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='server', value='10.10.120.125', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='period', value='5', format='int') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(path +'/'+filename) +print "Leyendo el archivo XML" +controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_esf_proc_plot_offline.py b/schainpy/scripts/scripts_v/amisr_esf_proc_plot_offline.py new file mode 100644 index 0000000..d2f7907 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_esf_proc_plot_offline.py @@ -0,0 +1,178 @@ +# /usr/bin/python +import os, sys +import time, datetime + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='esf_proc_plot', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/ESF' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +figpath = '/home/soporte/Data/ESF' +figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' + +remotefolder = "/home/wmaster/graficos" + +path = figpath +pathfile1 = figpath +xmin = '18' +xmax = '31' +dbmin = '60' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' + +str = datetime.date.today() +str1 = str + datetime.timedelta(days=1) +today = str.strftime("%Y/%m/%d") +tomorrow = str1.strftime("%Y/%m/%d") + +path = '/media/soporte/DATA/AMISR/JULIA/pdata/ESF/' +figpath = '/media/soporte/DATA/AMISR/JULIA/plot/ESF' +procpath = '/media/soporte/DATA/AMISR/JULIA/param/ESF' + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2016/06/01', + endDate='2016/06/30', + startTime='18:00:00', + endTime='07:00:00', + delay=0, + #set=0, + online=0, + walk=1 + ) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObj1.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='650', format='float') +opObj11.addParameter(name='maxHei', value='800', format='float') + + +# opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1002', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') +# +# +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# # opObj11.addParameter(name='exp_code', value='31', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#RTI Plot +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2016', format='int') +opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') + +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='4', format='int') +# # opObj11.addParameter(name='exp_code', value='31', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath+'/plots', format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=60, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + +#Noise +# #title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath+'/plots', format='str') + + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='Imaging', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='figpath', value='/home/signalchain/Pictures/imaging', format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') +# +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# # +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=procpath) +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(path +'/'+filename) +print "Leyendo el archivo XML" +controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_gyro_proc_offline.py b/schainpy/scripts/scripts_v/amisr_gyro_proc_offline.py new file mode 100644 index 0000000..79d644f --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_gyro_proc_offline.py @@ -0,0 +1,217 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='gyro_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/Gyro/NoTx' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +#xmin = '00' +#xmax = '33' +ymin ='0' +ymax ='1500' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +dbmin = '55' +dbmax = '75' +show = '0' + +# #code = '1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1' +# code = '1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1' +# nCode = '1' +# nBaud = '26' +# nosamp = '3' # oversample + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/01/19', + endDate='2016/01/19', + #startDate='2015/12/16', + #endDate='2015/12/17', +# startTime='07:01:30',#'07:00:00', +# endTime='17:55:00',#'15:00:00', + startTime='00:00:30',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +#opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dic 3, 15:40h +opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value=code, format='floatlist') +# opObj11.addParameter(name='nCode', value=nCode, format='int') +# opObj11.addParameter(name='nBaud', value=nBaud, format='int') +# opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='600', format='int') +opObj11.addParameter(name='timeInterval', value='60', format='float') + + + +# #Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +# #opObj11.addParameter(name='minHei', value='15', format='float') +# #opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='show',value=show,format='bool') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# #procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='300', format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_gyro_proc_offline.py.save b/schainpy/scripts/scripts_v/amisr_gyro_proc_offline.py.save new file mode 100644 index 0000000..77e9670 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_gyro_proc_offline.py.save @@ -0,0 +1,216 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='gyro_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/Gyro/january12/Coded' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +#xmin = '00' +#xmax = '33' +ymin ='0' +ymax ='1500' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +dbmin = '55' +dbmax = '75' +show = '0' + +# #code = '1,1,1,1,1,-1,-1,1,1,-1,1,-1,1,-1,-1,-1,-1,-1,1,1,-1,-1,1,-1,1,-1' +# code = '1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1' +# nCode = '1' +# nBaud = '26' +# nosamp = '3' # oversample + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/01/19', + endDate='2016/01/19', + #startDate='2015/12/16', + #endDate='2015/12/17', +# startTime='07:01:30',#'07:00:00', +# endTime='17:55:00',#'15:00:00', + startTime='00:00:30',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='4e6', format='float') #changed on Dic 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value=code, format='floatlist') +# opObj11.addParameter(name='nCode', value=nCode, format='int') +# opObj11.addParameter(name='nBaud', value=nBaud, format='int') +# opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='600', format='int') +opObj11.addParameter(name='timeInterval', value='60', format='float') + + + +# #Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +# #opObj11.addParameter(name='minHei', value='15', format='float') +# #opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='wr_period', value='2', format='int') +# opObj11.addParameter(name='exp_code', value='21', format='int') +# opObj11.addParameter(name='sub_exp_code', value='3', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# #procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='300', format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_gyro_proc_online.py b/schainpy/scripts/scripts_v/amisr_gyro_proc_online.py new file mode 100644 index 0000000..7d8b605 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_gyro_proc_online.py @@ -0,0 +1,223 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='gyro_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/Gyro' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +#xmin = '00' +#xmax = '33' +ymin ='0' +ymax ='2500' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +dbmin = '55' +dbmax = '70' +show = '1' + + +#code = '1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1' #code used on 11 January 2016 + +# code = '1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1' #GyroCoded +# nCode = '1' +# nBaud = '26' +# nosamp = '3' # oversample + +# code = '-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1' +# nCode = '1' +# nBaud = '26' +# nosamp = '3' # oversample + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/01/19', + endDate='2016/01/19', #'2014/10/07', + #startDate='2015/12/16', + #endDate='2015/12/17', +# startTime='07:01:30',#'07:00:00', +# endTime='17:55:00',#'15:00:00', + startTime='00:40:30',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='430e6', format='float') #changed on Dic 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value=code, format='floatlist') +# opObj11.addParameter(name='nCode', value=nCode, format='int') +# opObj11.addParameter(name='nBaud', value=nBaud, format='int') +# opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='600', format='int') +opObj11.addParameter(name='timeInterval', value='60', format='float') + + + +# #Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +# #opObj11.addParameter(name='minHei', value='15', format='float') +# #opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# #procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='300', format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_noise.py b/schainpy/scripts/scripts_v/amisr_noise.py new file mode 100644 index 0000000..ea4923c --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_noise.py @@ -0,0 +1,152 @@ +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/winds' +#path = '/media/soporte/AMISR_104' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/noise/winds') + +xmin = '09' +xmax = '18' +dbmin = '55' #'60'#'55' #'40' #noise esf eej +dbmax = '75' #'70' #'55' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/28', #'2014/10/07', + endDate='2014/10/28', #'2014/10/07', + startTime='09:00:00',#'07:00:00', + endTime='18:00:00',#'15:00:00', + walk=0, + timezone='lt', + all=0, + online=0) + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code +#code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +#opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +#opObj11.addParameter(name='code', value=code, format='floatlist') +#opObj11.addParameter(name='nCode', value='1', format='int') +#opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +#opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +#opObj11.addParameter(name='timeInterval', value='10', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=16, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +# opObj11.addParameter(name='n', value='90', format='int') +opObj11.addParameter(name='timeInterval', value='30', format='float') + +#RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +opObj11.addParameter(name='minHei', value='15', format='float') +opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#For saving Pdata (doesn't work with amisr data yet!) +#opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +#opObj11.addParameter(name='path', value=figpath) +#opObj11.addParameter(name='blocksPerFile', value='10', format='int') + + + +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_noise2.py b/schainpy/scripts/scripts_v/amisr_noise2.py new file mode 100644 index 0000000..83477a4 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_noise2.py @@ -0,0 +1,146 @@ +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +#path = '/media/soporte/AMISR_104' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/eej') + +xmin = '07' +xmax = '18' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2015/08/16', #'2014/10/07', + endDate='2015/08/16', #'2014/10/07', + startTime='07:00:00',#'07:00:00', + endTime='18:00:00',#'15:00:00', + walk=0, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value='1', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='150', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') +# +# #RemoveDc +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') +# +# #SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +# +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +# +# +#Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#For saving Pdata (doesn't work with amisr data yet!) +#opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +#opObj11.addParameter(name='path', value=figpath) +#opObj11.addParameter(name='blocksPerFile', value='10', format='int') + + + +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_noise_proc.py b/schainpy/scripts/scripts_v/amisr_noise_proc.py new file mode 100644 index 0000000..8dbe421 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_noise_proc.py @@ -0,0 +1,163 @@ +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/noise_Pall' +path = '/mnt/data_amisr' +#path = '/home/soporte/Data' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc') +figpath = '/home/soporte/Data/noise/raw_offline' + +xmin = '00' +xmax = '24' +dbmin = '30' #'60'#'55' #'40' #noise esf eej +dbmax = '60' #'70' #'55' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2015/10/01', #'2014/10/07', + endDate='2015/12/31', #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + +# code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +#Noise--> no code +# code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +# opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value=code, format='floatlist') +# opObj11.addParameter(name='nCode', value='1', format='int') +# opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='50', format='float') +# opObj12.addParameter(name='maxHei', value='150', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='121', format='int') + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='30', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + +#procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0),(1,1),(2,2),(3,3),(4,4)', \ + # format='pairsList') + +# procUnitConfObjSpectraBeam0.addParameter(name='pairsList', value='(0,0)', \ +# format='pairsList') +# +# #RemoveDc +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') +# +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +#opObj11.addParameter(name='zmin', value='38', format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +# +# # #RTIPlot +# # #title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='2', format='int') +# # opObj11.addParameter(name='wintitle', value=title0, format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# # +# # +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#For saving Pdata (doesn't work with amisr data yet!) +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=figpath) +opObj11.addParameter(name='blocksPerFile', value='10', format='int') + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_noise_proc_plot.py b/schainpy/scripts/scripts_v/amisr_noise_proc_plot.py new file mode 100644 index 0000000..c780796 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_noise_proc_plot.py @@ -0,0 +1,135 @@ +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/noise_Pall' +#path = '/media/soporte/AMISR_104' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc') +figpath = '/home/soporte/Data/noise' +path = figpath +xmin = '00' +xmax = '24' +dbmin = '30' #'60'#'55' #'40' #noise esf eej +dbmax = '60' #'70' #'55' + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2015/09/01', + endDate='2015/10/30', + startTime='00:00:00', + endTime='23:59:59', + delay=0, + set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################## IMAGING ############################################# + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) + +#Noise Estimation +opObj11 = procUnitConfObj1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='280', format='float') +#opObj11.addParameter(name='minHei', value='15', format='float') +#opObj11.addParameter(name='maxHei', value='20', format='float') + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1002', format='int') +opObj11.addParameter(name='wintitle', value='Noise AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +#opObj11.addParameter(name='exp_code', value='13', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath+'/offline', format='str') +#opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp', value='1', format='int') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='2015', format='int') +# opObj11.addParameter(name='wintitle', value='Noise AMISR', format='str') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='zmin', value=dbmin, format='int') +# opObj11.addParameter(name='zmax', value=dbmax, format='int') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# #opObj11.addParameter(name='exp_code', value='13', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=figpath+'/plots', format='str') +# #opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp', value='1', format='int') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + +#Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObj1.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath+'/offline', format='str') + + +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='Imaging', format='str') +# opObj11.addParameter(name='xmin', value='20.5', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='figpath', value='/home/signalchain/Pictures/imaging', format='str') +# opObj11.addParameter(name='exp_code', value='13', format='int') + +#opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +#opObj11.addParameter(name='ext', value='*.png', format='str') +#opObj11.addParameter(name='localfolder', value='/media/DATA/imaging', format='str') +#opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +#opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +#opObj11.addParameter(name='server', value='10.10.120.125', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') +#opObj11.addParameter(name='period', value='5', format='int') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + diff --git a/schainpy/scripts/scripts_v/amisr_proc.py b/schainpy/scripts/scripts_v/amisr_proc.py new file mode 100644 index 0000000..5839c7a --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_proc.py @@ -0,0 +1,92 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'Development/amisr/data') +path = '/media/administrator/KINGSTON/amisr' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr') + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/21', + endDate='2014/10/21', + startTime='00:00:00', + endTime='23:59:59', + walk=1, + timezone='lt') + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + + +#Beam Selector +#opObj11 = procUnitAMISRBeam0.addOperation(name='BeamSelector', optype='other') +#opObj11.addParameter(name='beam', value='0', format='int') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +#Coherent Integration +opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='8', format='int') +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=32, format='int') +#RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') + +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +#opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +#opObj11.addParameter(name='id', value='200', format='int') +#opObj11.addParameter(name='wintitle', value=title0, format='str') +#opObj11.addParameter(name='showprofile', value='0', format='int') +##Setting RTI time using xmin,xmax +#opObj11.addParameter(name='xmin', value='15', format='int') +#opObj11.addParameter(name='xmax', value='23', format='int') +#Setting dB range with zmin, zmax +#opObj11.addParameter(name='zmin', value='45', format='int') +#opObj11.addParameter(name='zmax', value='70', format='int') +#Save RTI +#figfile0 = 'amisr_rti_beam0.png' +#opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='figfile', value=figfile0, format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/amisr_reader.py b/schainpy/scripts/scripts_v/amisr_reader.py new file mode 100644 index 0000000..3a547ba --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_reader.py @@ -0,0 +1,39 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = os.path.join(os.environ['HOME'],'Documents/amisr') #'/home/signalchain/Documents/amisr' + +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr') + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/08/18', + endDate='2014/08/18', + startTime='00:00:00', + endTime='23:59:59', + walk=1) + +procUnitAMISR = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISR.addOperation(name='PrintInfo', optype='other') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/amisr_reader.xml b/schainpy/scripts/scripts_v/amisr_reader.xml new file mode 100644 index 0000000..d7e08c3 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_reader.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/amisr_reader_exp.py b/schainpy/scripts/scripts_v/amisr_reader_exp.py new file mode 100644 index 0000000..02b3033 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_reader_exp.py @@ -0,0 +1,47 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment Test" +filename = "amisr.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/home/administrator/Documents/amisr' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISR', + path=path, + startDate='2014/08/18', + endDate='2014/08/18', + startTime='00:00:00', + endTime='23:59:59', + walk=1) + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='AMISR', format='str') +opObj11.addParameter(name='type', value='iq', format='str') + +opObj11 = procUnitConfObjBeam1.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='0,81', format='intlist') + +opObj11 = procUnitConfObj0.addOperation(name='PowerProfile', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Power Profile', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/amisr_reader_exp_ex2.py b/schainpy/scripts/scripts_v/amisr_reader_exp_ex2.py new file mode 100644 index 0000000..666fd0a --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_reader_exp_ex2.py @@ -0,0 +1,404 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment Test" +filename = "amisr.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/home/administrator/Documents/amisr_bug' +path = '/media/administrator/New Volume/amisr' +#path = '/media/administrator/Toshiba/data' +figpath = '/home/administrator/Pictures/amisr' + +figfile0 = 'amisr_rti_beam0.png' +figfile1 = 'amisr_rti_beam1.png' +figfile2 = 'amisr_rti_beam2.png' +figfile3 = 'amisr_rti_beam3.png' +figfile4 = 'amisr_rti_beam4.png' +figfile5 = 'amisr_rti_beam5.png' +figfile6 = 'amisr_rti_beam6.png' + +title0 = 'RTI AMISR Beam 0' +title1 = 'RTI AMISR Beam 1' +title2 = 'RTI AMISR Beam 2' +title3 = 'RTI AMISR Beam 3' +title4 = 'RTI AMISR Beam 4' +title5 = 'RTI AMISR Beam 5' +title6 = 'RTI AMISR Beam 6' + +profileStrSelBeam0 = '0,101' +profileStrSelBeam1 = '614,741' +profileStrSelBeam2 = '358,485' +profileStrSelBeam3 = '742,869' +profileStrSelBeam4 = '230,357' +profileStrSelBeam5 = '486,613' +profileStrSelBeam6 = '102,229' + +nProfiles = '32' +nFFTPoints = '32' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISR', + path=path, + startDate='2014/08/18', + endDate='2014/08/18', + startTime='00:00:00', + endTime='23:59:59', + walk=1) + + + +# procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# opObj11 = procUnitConfObjBeam0.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value=profileStrSelBeam0, format='intlist') + +# procUnitConfObjBeam1 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam2 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam3 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam4 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam5 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# procUnitConfObjBeam6 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +# procUnitAMISR = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +# opObj11 = procUnitAMISR.addOperation(name='BeamSelector', optype='other') +# opObj11.addParameter(name='beam', value='1', format='int') +# +# procUnitConfObjBeam1 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam0.getId()) +# +# opObj11 = procUnitConfObjBeam1.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='128', format='int') +# +# +# procUnitConfObjSpectraBeam1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam1.getId()) +# procUnitConfObjSpectraBeam1.addParameter(name='nFFTPoints', value='32', format='int') +# procUnitConfObjSpectraBeam1.addParameter(name='nProfiles', value='32', format='int') +# +# opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='450', format='float') +# +# opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='100', format='int') +# opObj11.addParameter(name='wintitle', value='SpectraPlot', format='str') + + + + + + + +# ############################# Beam0 ############################# +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) + +#opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + + +opObj11 = procUnitAMISRBeam0.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='0', format='int') + +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam0.getId()) + +opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') + + + + +# procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# opObj11 = procUnitConfObjBeam0.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value=profileStrSelBeam0, format='intlist') +# +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='102', format='int') +# +# procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam0.getId()) +# procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value='32', format='int') +# procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value='32', format='int') +# +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='450', format='float') +# +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='100', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# #opObj11.addParameter(name='timerange', value='7200', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile0, format='str') +# +# +# +# +# +# # + +# ############################# Beam1 ############################# +procUnitAMISRBeam1 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) + +#opObj11 = procUnitAMISRBeam1.addOperation(name='PrintInfo', optype='other') + + +opObj11 = procUnitAMISRBeam1.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='1', format='int') + +procUnitConfObjBeam1 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam1.getId()) + +opObj11 = procUnitConfObjBeam1.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + +procUnitConfObjSpectraBeam1 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam1.getId()) +procUnitConfObjSpectraBeam1.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam1.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 1', format='str') + +# +# opObj11 = procUnitConfObjSpectraBeam1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='201', format='int') +# opObj11.addParameter(name='wintitle', value=title1, format='str') +# #opObj11.addParameter(name='timerange', value='36000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile1, format='str') +# # +# # +# # +# # +# # +# ############################## Beam2 ############################# +procUnitAMISRBeam2 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam2.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='2', format='int') + +procUnitConfObjBeam2 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam2.getId()) + +opObj11 = procUnitConfObjBeam2.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam2 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam2.getId()) +procUnitConfObjSpectraBeam2.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam2.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam2.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam2.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='102', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 2', format='str') + +# +# opObj11 = procUnitConfObjSpectraBeam2.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='202', format='int') +# opObj11.addParameter(name='wintitle', value=title2, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile2, format='str') +# +# +# +# +# +# +# ############################## Beam3 ############################# +procUnitAMISRBeam3 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam3.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='3', format='int') + +procUnitConfObjBeam3 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam3.getId()) + +opObj11 = procUnitConfObjBeam3.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam3 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam3.getId()) +procUnitConfObjSpectraBeam3.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam3.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam3.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam3.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='103', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 3', format='str') + +# +# opObj11 = procUnitConfObjSpectraBeam3.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='203', format='int') +# opObj11.addParameter(name='wintitle', value=title3, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile3, format='str') +# # # +# # # +# # # +# # # +# # # +# # # +# ############################## Beam4 ############################# +procUnitAMISRBeam4 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam4.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='4', format='int') + +procUnitConfObjBeam4 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam4.getId()) + +opObj11 = procUnitConfObjBeam4.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam4 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam4.getId()) +procUnitConfObjSpectraBeam4.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam4.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam4.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam4.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='104', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 4', format='str') + +# opObj11 = procUnitConfObjSpectraBeam4.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='204', format='int') +# opObj11.addParameter(name='wintitle', value=title4, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile4, format='str') +# # # # +# # # # +# # # # +# # # # +# # # # +# ############################## Beam5 ############################# +procUnitAMISRBeam5 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam5.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='5', format='int') + +procUnitConfObjBeam5 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam5.getId()) + +opObj11 = procUnitConfObjBeam5.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + +procUnitConfObjSpectraBeam5 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam5.getId()) +procUnitConfObjSpectraBeam5.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam5.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam5.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam5.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='105', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 5', format='str') + +# opObj11 = procUnitConfObjSpectraBeam5.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='205', format='int') +# opObj11.addParameter(name='wintitle', value=title5, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile5, format='str') +# # # +# # # # +# # # # +# # # # +# # # # +# ############################## Beam6 ############################# +procUnitAMISRBeam6 = controllerObj.addProcUnit(datatype='AMISR', inputId=readUnitConfObj.getId()) +opObj11 = procUnitAMISRBeam6.addOperation(name='BeamSelector', optype='other') +opObj11.addParameter(name='beam', value='6', format='int') + +procUnitConfObjBeam6 = controllerObj.addProcUnit(datatype='Voltage', inputId=procUnitAMISRBeam6.getId()) + +opObj11 = procUnitConfObjBeam6.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='128', format='int') + + +procUnitConfObjSpectraBeam6 = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjBeam6.getId()) +procUnitConfObjSpectraBeam6.addParameter(name='nFFTPoints', value=nFFTPoints, format='int') +procUnitConfObjSpectraBeam6.addParameter(name='nProfiles', value=nProfiles, format='int') + +opObj11 = procUnitConfObjSpectraBeam6.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='100', format='float') +opObj11.addParameter(name='maxHei', value='450', format='float') + +opObj11 = procUnitConfObjSpectraBeam6.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='106', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 6', format='str') +# +# opObj11 = procUnitConfObjSpectraBeam6.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='206', format='int') +# opObj11.addParameter(name='wintitle', value=title6, format='str') +# #opObj11.addParameter(name='timerange', value='18000', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='18', format='int') +# opObj11.addParameter(name='zmin', value='45', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile6, format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/amisr_spreadF.py b/schainpy/scripts/scripts_v/amisr_spreadF.py new file mode 100644 index 0000000..56a6712 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_spreadF.py @@ -0,0 +1,119 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/spreadF/filt2') + +xmin = '18' +xmax = '31' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/06', + endDate='2014/10/07', + startTime='18:00:00', + endTime='07:00:00', + walk=0, + timezone='lt', + all=0, + online=0) + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +opObj11 = procUnitConfObjBeam0.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='2', format='int') + +# code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=code, format='floatlist') +opObj11.addParameter(name='nCode', value='1', format='int') +opObj11.addParameter(name='nBaud', value='28', format='int') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') +# opObj12.addParameter(name='maxHei', value='10', format='float') +#Coherent Integration +# opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='timeInterval', value='30', format='int') +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=64, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='timeInterval', value='30', format='float') +# opObj11.addParameter(name='n', value='64', format='int') + +#RemoveDc +#opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='200', format='float') +opObj11.addParameter(name='maxHei', value='700', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value='54', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value='54', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + + +#----------------------------------------------------------------------------------------------- + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_valley_proc_online.py b/schainpy/scripts/scripts_v/amisr_valley_proc_online.py new file mode 100644 index 0000000..3aa9439 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_valley_proc_online.py @@ -0,0 +1,224 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='gyro_proc', description=desc) + + +path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +path = '/mnt/data_amisr' +path = '/media/soporte/OPERACIONES-USUARIOS/AMISR_Valley' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/EEJ' +figpath = '/home/soporte/Data/Valley' +remotefolder = "/home/wmaster/graficos" + +xmin = '00' +xmax = '24' +#xmin = '00' +#xmax = '33' +ymin ='0' +ymax ='800' #'750' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' + +dbmin = '40' +dbmax = '55' +show = '1' + + +#code = '1,1,-1,-1,1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,1,1,1,1,1,1,-1,-1,1' #code used on 11 January 2016 + +# code = '1,-1,1,-1,1,1,-1,-1,1,1,1,1,1,-1,1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1' #GyroCoded +# nCode = '1' +# nBaud = '26' +# nosamp = '3' # oversample + +# code = '-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1' +# nCode = '1' +# nBaud = '26' +# nosamp = '3' # oversample + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/01/14', + endDate='2016/01/14', #'2014/10/07', + #startDate='2015/12/16', + #endDate='2015/12/17', +# startTime='07:01:30',#'07:00:00', +# endTime='17:55:00',#'15:00:00', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=0) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='430e6', format='float') #changed on Dic 3, 15:40h +#opObj10.addParameter(name='frequency', value='430e6', format='float') + +# opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +# opObj12.addParameter(name='minHei', value='0', format='float') + + +# opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value=code, format='floatlist') +# opObj11.addParameter(name='nCode', value=nCode, format='int') +# opObj11.addParameter(name='nBaud', value=nBaud, format='int') +# opObj11.addParameter(name='osamp', value=nosamp, format='int') + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value='89', format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='600', format='int') +opObj11.addParameter(name='timeInterval', value='60', format='float') + + + +# #Noise Estimation +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +# opObj11.addParameter(name='minHei', value='100', format='float') +# opObj11.addParameter(name='maxHei', value='280', format='float') +# #opObj11.addParameter(name='minHei', value='15', format='float') +# #opObj11.addParameter(name='maxHei', value='20', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Valley AMISR', format='str') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='GyroLP AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=ymin, format='int') +opObj11.addParameter(name='ymax', value=ymax, format='int') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='show', value = show, format='bool') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# # #send to server +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# #procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='server', value='10.10.120.125', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value='300', format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ssh', format='str') + + +# #Noise +#title0 = 'RTI AMISR Beam 0' +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ AMISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='ymin', value=dbmin, format='int') +# opObj11.addParameter(name='ymax', value=dbmax, format='int') +# opObj11.addParameter(name='save', value='0', format='bool') +# opObj11.addParameter(name='figpath', value = figpath, format='str') +# opObj11.addParameter(name='show', value = show, format='bool') + + +# #For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved +# +# +# # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# # procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# # procUnitConfObj2.addParameter(name='period', value=5, format='int') +# # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +# #----------------------------------------------------------------------------------------------- +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# opObj12 = procUnitConfObj2.addOperation(name='HDF5Writer', optype='other') +# opObj12.addParameter(name='path', value=figpath+'/plots') +# opObj12.addParameter(name='blocksPerFile', value='10', format='int') +# opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') +# opObj12.addParameter(name='dataList',value='data_param,data_SNR,utctime',format='list') +# opObj12.addParameter(name='mode',value='1',format='int') + + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_windEstimation.py b/schainpy/scripts/scripts_v/amisr_windEstimation.py new file mode 100644 index 0000000..38103bf --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_windEstimation.py @@ -0,0 +1,155 @@ +import os, sys + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = os.path.join(os.environ['HOME'],'Development/amisr/data') +path = '/home/soporte/Data/AMISR' +path = '/media/soporte/E9F4-F053/AMISR/Data/' +figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/winds') + +pathFigure = figpath #'/home/operaciones/Documents/AMISR_windprofiler/20141023' +xmin = '8.0' +xmax = '12.0' + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2014/10/23', + endDate='2014/10/23', + startTime='00:00:00', + endTime='23:59:59', + walk=1, + timezone='lt') + +#AMISR Processing Unit +procUnitAMISRBeam0 = controllerObj.addProcUnit(datatype='AMISRProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitAMISRBeam0.addOperation(name='PrintInfo', optype='other') + +#Reshaper +opObj11 = procUnitAMISRBeam0.addOperation(name='ProfileToChannels', optype='other') + + +#Beam Selector +#opObj11 = procUnitAMISRBeam0.addOperation(name='BeamSelector', optype='other') +#opObj11.addParameter(name='beam', value='0', format='int') + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=procUnitAMISRBeam0.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') +#Coherent Integration +#opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') +#opObj11.addParameter(name='n', value='8', format='int') +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='nProfiles', value=32, format='int') + +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='16', format='int') + +#RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='20', format='float') + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='AMISR Beam 0', format='str') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = pathFigure, format='str') +#RTIPlot +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='200', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='80', format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = pathFigure, format='str') +#opObj23.addParameter(name='save', value='1', format='bool') +#opObj23.addParameter(name='figpath', value = pathFigure, format='str') + +# Save RTI +# figfile0 = 'amisr_rti_beam0.png' +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile0, format='str') + +#----------------------------------------------------------------------------------------------- +#Parameters Process +#procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0 .getId()) +#opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +#opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +#opObj21.addParameter(name='id', value='3', format='int') +#opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +#opObj21.addParameter(name='save', value='1', format='bool') +#opObj21.addParameter(name='figpath', value=pathFigure, format='str') +#opObj21.addParameter(name='zmin', value='30', format='int') +#opObj21.addParameter(name='zmax', value='80', format='int') + +#opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +#opObj22.addParameter(name='technique', value='DBS', format='str') +#opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +#opObj22.addParameter(name='correctFactor', value='-1', format='float') +#opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +##opObj22.addParameter(name='elevation', value='74.53,75.90.0,75.60,75.60', format='floatlist') +#opObj22.addParameter(name='elevation', value='74.53,75.90,75.60,75.60', format='floatlist') +## opObj22.addParameter(name='horizontalOnly', value='1', format='bool') +## opObj22.addParameter(name='channelList', value='1,2', format='intlist') + +#WindProfilerPlot +#opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +#opObj23.addParameter(name='id', value='4', format='int') +#opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +#opObj23.addParameter(name='save', value='1', format='bool') +#opObj23.addParameter(name='figpath', value = pathFigure, format='str') +#opObj23.addParameter(name='zmin', value='-20', format='int') +#opObj23.addParameter(name='zmax', value='20', format='int') +#opObj23.addParameter(name='zmin_ver', value='-100', format='float') +#opObj23.addParameter(name='zmax_ver', value='100', format='float') +#opObj23.addParameter(name='SNRmin', value='-20', format='int') +#opObj23.addParameter(name='SNRmax', value='30', format='int') +#opObj23.addParameter(name='SNRthresh', value='-50', format='float') +#opObj23.addParameter(name='xmin', value=xmin, format='float') +#opObj23.addParameter(name='xmax', value=xmax, format='float') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_winds_proc_offline.py b/schainpy/scripts/scripts_v/amisr_winds_proc_offline.py new file mode 100644 index 0000000..9f55242 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_winds_proc_offline.py @@ -0,0 +1,222 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +# path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +# path = '/mnt/data_amisr' +# path = '/media/soporte/E9F4-F053/AMISR/Data/winds' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/winds' +remotefolder = "/home/wmaster/graficos" +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/winds/plots' + +xmin = '08' +xmax = '18' +dbmin = '50' #'60'#'55' #'40' #noise esf eej +dbmax = '80' #'70' #'55' + +ippFactor = '5' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2015/11/12', #'2014/10/07', + endDate='2015/11/12', #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') + + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='ippFactor', value=ippFactor, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='64', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='9', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +# +# +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +#For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + +# opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +# opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.6', format='floatlist') + +#Parameters Process +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='DBS', format='str') +opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +opObj22.addParameter(name='correctFactor', value='-1', format='float') +opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.60', format='floatlist') + +#WindProfilerPlot +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = figpath, format='str') +opObj23.addParameter(name='zmin', value='-20', format='int') +opObj23.addParameter(name='zmax', value='20', format='int') +opObj23.addParameter(name='zmin_ver', value='-100', format='float') +opObj23.addParameter(name='zmax_ver', value='100', format='float') +opObj23.addParameter(name='SNRmin', value='-20', format='int') +opObj23.addParameter(name='SNRmax', value='30', format='int') +opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +opObj23.addParameter(name='ftp', value='1', format='int') +opObj23.addParameter(name='wr_period', value='2', format='int') +opObj23.addParameter(name='exp_code', value='21', format='int') +opObj23.addParameter(name='sub_exp_code', value='3', format='int') +opObj23.addParameter(name='ftp_wei', value='0', format='int') +opObj23.addParameter(name='plot_pos', value='0', format='int') + +#--------------------------------------------------------------------------------------------- + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_winds_proc_offline.py~ b/schainpy/scripts/scripts_v/amisr_winds_proc_offline.py~ new file mode 100644 index 0000000..9e04bdf --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_winds_proc_offline.py~ @@ -0,0 +1,222 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +# path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +# path = '/mnt/data_amisr' +# path = '/media/soporte/E9F4-F053/AMISR/Data/winds' +path = '/mnt/data_amisr' + +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' +figpath = '/home/soporte/Data/winds' +remotefolder = "/home/wmaster/graficos" +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +#figpath = '/media/soporte/E9F4-F053/AMISR/Data/winds/plots' + +xmin = '08' +xmax = '18' +dbmin = '50' #'60'#'55' #'40' #noise esf eej +dbmax = '80' #'70' #'55' + +ippFactor = '5' + +code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +nCode = '1' +nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2015/11/10', #'2014/10/07', + endDate='2015/11/10', #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') + + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='ippFactor', value=ippFactor, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='64', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='9', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +# +# +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +#For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + +# opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +# opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.6', format='floatlist') + +#Parameters Process +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +opObj22 = procUnitConfObj2.addOperation(name='WindProfiler', optype='other') +opObj22.addParameter(name='technique', value='DBS', format='str') +opObj22.addParameter(name='correctAzimuth', value='51.06', format='float') +opObj22.addParameter(name='correctFactor', value='-1', format='float') +opObj22.addParameter(name='azimuth', value='0,-90,0,90,180', format='floatlist') +opObj22.addParameter(name='elevation', value='75.6,75.6,90,75.60,75.60', format='floatlist') + +#WindProfilerPlot +opObj23 = procUnitConfObj2.addOperation(name='WindProfilerPlot', optype='other') +opObj23.addParameter(name='id', value='4', format='int') +opObj23.addParameter(name='wintitle', value='Wind Profiler', format='str') +opObj23.addParameter(name='save', value='1', format='bool') +opObj23.addParameter(name='figpath', value = figpath, format='str') +opObj23.addParameter(name='zmin', value='-20', format='int') +opObj23.addParameter(name='zmax', value='20', format='int') +opObj23.addParameter(name='zmin_ver', value='-100', format='float') +opObj23.addParameter(name='zmax_ver', value='100', format='float') +opObj23.addParameter(name='SNRmin', value='-20', format='int') +opObj23.addParameter(name='SNRmax', value='30', format='int') +opObj23.addParameter(name='SNRthresh', value='-50', format='float') +opObj23.addParameter(name='xmin', value=xmin, format='float') +opObj23.addParameter(name='xmax', value=xmax, format='float') +opObj23.addParameter(name='ftp', value='1', format='int') +opObj23.addParameter(name='wr_period', value='2', format='int') +opObj23.addParameter(name='exp_code', value='21', format='int') +opObj23.addParameter(name='sub_exp_code', value='3', format='int') +opObj23.addParameter(name='ftp_wei', value='0', format='int') +opObj23.addParameter(name='plot_pos', value='0', format='int') + +#--------------------------------------------------------------------------------------------- + +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=figpath, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=60, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/amisr_winds_proc_online.py b/schainpy/scripts/scripts_v/amisr_winds_proc_online.py new file mode 100644 index 0000000..4a67b51 --- /dev/null +++ b/schainpy/scripts/scripts_v/amisr_winds_proc_online.py @@ -0,0 +1,176 @@ +#! /usr/bin/python +#! /usr/bin/env python + +import os, sys +import time + +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "AMISR Experiment" + +filename = "amisr_reader.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='eej_proc', description=desc) + + +# path = os.path.join(os.environ['HOME'],'amisr') +# path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' +# path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' +# path = '/media/soporte/E9F4-F053/AMISR/Data/EEJ' +# path = '/mnt/data_amisr' +# path = '/media/soporte/E9F4-F053/AMISR/Data/winds' +path = '/mnt/data_amisr' +#path = '/media/soporte/AMISR_104' +#figpath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/eej') +figpath = '/home/soporte/Data/winds/plots' +remotefolder = "/home/wmaster/graficos" + +xmin = '08' +xmax = '18' +dbmin = '50' #'60'#'55' #'40' #noise esf eej +dbmax = '80' #'70' #'55' + +#to consider that each real IPP is actually original_IPP * nchannels +ippFactor = '5' + +# code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' +# nCode = '1' +# nBaud = '28' + + +today = time.strftime("%Y/%m/%d") + + +readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate='2016/10/28', #'2014/10/07', + endDate='2014/10/28', #'2014/10/07', + startTime='00:00:00',#'07:00:00', + endTime='23:59:59',#'15:00:00', + walk=0, +# code = code, +# nCode = nCode, +# nBaud = nBaud, + timezone='lt', + online=1) + +#AMISR Processing Unit + +#Voltage Processing Unit +procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') +opObj10.addParameter(name='frequency', value='445e6', format='float') + + + +opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') +opObj12.addParameter(name='minHei', value='0', format='float') +opObj12.addParameter(name='maxHei', value='10', format='float') + + + +#Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints +procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) +procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=32, format='int') +procUnitConfObjSpectraBeam0.addParameter(name='ippFactor', value=ippFactor, format='int') +# +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='16', format='int') +#opObj11.addParameter(name='timeInterval', value='30', format='float') + + +# # #RemoveDc +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') +# +#Noise Estimation +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise') +opObj11.addParameter(name='minHei', value='5', format='float') +opObj11.addParameter(name='maxHei', value='9', format='float') + + +#SpectraPlot +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# #RTIPlot +# #title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2', format='int') +opObj11.addParameter(name='wintitle', value='Winds AMISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='zmin', value=dbmin, format='int') +opObj11.addParameter(name='zmax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='wr_period', value='2', format='int') +opObj11.addParameter(name='exp_code', value='21', format='int') +opObj11.addParameter(name='sub_exp_code', value='3', format='int') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +# +# +# #Noise +#title0 = 'RTI AMISR Beam 0' +opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='Noise', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value=title0, format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value=xmin, format='float') +opObj11.addParameter(name='xmax', value=xmax, format='float') +opObj11.addParameter(name='ymin', value=dbmin, format='int') +opObj11.addParameter(name='ymax', value=dbmax, format='int') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value = figpath, format='str') + + +#For saving Pdata (doesn't work with amisr data yet!) +# opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value=figpath) +# opObj11.addParameter(name='blocksPerFile', value='100', format='int') +# opObj11.addParameter(name='datatype', value="4", format="int") #size of data to be saved + + +# procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +# procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +# procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +# procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +# procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +# procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +# procUnitConfObj2.addParameter(name='period', value=5, format='int') +# procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') +#----------------------------------------------------------------------------------------------- + + +# print "Escribiendo el archivo XML" +# controllerObj.writeXml(path +'/'+filename) +# print "Leyendo el archivo XML" +# controllerObj.readXml(path +'/'+filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + +#21 3 pm + + diff --git a/schainpy/scripts/scripts_v/beacon_phase.py b/schainpy/scripts/scripts_v/beacon_phase.py new file mode 100644 index 0000000..9f9d784 --- /dev/null +++ b/schainpy/scripts/scripts_v/beacon_phase.py @@ -0,0 +1,56 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "jasmet20140415.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50/d2014104' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2013/08/21', + endDate='2013/08/21', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=0) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(0,5),(1,5),(2,5),(3,5),(4,5)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='timerange', value='300', format='int') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value='/home/dsuarez/Pictures/beacon_abril', format='str') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/hf_plot_pdata.py b/schainpy/scripts/scripts_v/hf_plot_pdata.py new file mode 100644 index 0000000..b61e3a4 --- /dev/null +++ b/schainpy/scripts/scripts_v/hf_plot_pdata.py @@ -0,0 +1,197 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "HF_EXAMPLE" +filename = "hf_test.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#path='/media/APOLLO/HF_rawdata/d2015026/0/cspec' +#path='/media/APOLLO/HF_rawdata/cspec' +#path='/media/APOLLO/bistatico' +#path='/home/alex/Downloads/pdata_hf/sousy' +path='/home/alex/Downloads/pdata_hf' +#path='/media/APOLLO/bistatico' + + + +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f0" #f0=2.72e6 +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f1" #f0=3.64e6 +#path='/media/APOLLO/HF_rawdata/test' +#figpath='/home/alex/Pictures/hf2_16/last_data' +figpath='/home/alex/Pictures/pdata_plot' +pathFigure='/home/alex/Pictures/hf2_16/last_data' +#path='/home/alex/Downloads/ICA_LAST_TEST' + +readUnitConfObj = controllerObj.addReadUnit(datatype='SpectraReader', + path=path, + startDate='2015/01/12', + endDate='2015/05/13', + startTime='00:00:00', + endTime='23:59:59', + online=0, + #set=1426485881, + delay=10, + walk=1 + #timezone=-5*3600 + ) + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='1000', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='zmin', value='-120', format='float') +opObj11.addParameter(name='zmax', value='-70', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile_spectra_name, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='exp_code', value='20', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +# # figfile_power_name="jro_power_image"+freq2+date+ext_img +# # print figfile_power_name +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='2000', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='zmin', value='-110', format='float') +opObj11.addParameter(name='zmax', value='-50', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='figfile', value=figfile_power_name, format='str') +#opObj11.addParameter(name='wr_period', value='5', format='int') + +# +# opObj11 = procUnitConfObj1.addOperation(name='PowerProfile', optype='other') +# opObj11.addParameter(name='id', value='2004', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# #opObj11.addParameter(name='channelList', value='0', format='intlist') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# #opObj11.addParameter(name='xmin', value='10', format='int') +# #opObj11.addParameter(name='xmax', value='40', format='int') +# +# # figfile_phase_name="jro_phase_image"+freq1+date+ext_img +# # print figfile_phase_name +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='3000', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='1', format='int') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value=figpath, format='str') + # opObj11.addParameter(name='figfile', value=figfile_phase_name, format='str') + # opObj11.addParameter(name='wr_period', value='5', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='6005', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# opObj11.addParameter(name='zmin', value='-110', format='float') +# opObj11.addParameter(name='zmax', value='-50', format='float') +# #opObj11.addParameter(name='xmin', value='0', format='float') +# #opObj11.addParameter(name='xmax', value='24', format='float') +# #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# +# +# +# xmin = 0 +# xmax = 24 +# +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +# opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +# opObj21.addParameter(name='id', value='3', format='int') +# opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +# opObj21.addParameter(name='save', value='1', format='bool') +# opObj21.addParameter(name='figpath', value=pathFigure, format='str') +# opObj21.addParameter(name='zmin', value='5', format='int') +# opObj21.addParameter(name='zmax', value='90', format='int') +# +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='4000', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot0', format='str') +opObj21.addParameter(name='channelList', value='0', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') +#opObj21.addParameter(name='parameterIndex', value=, format='int') + +# +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='5000', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot1', format='str') +opObj21.addParameter(name='channelList', value='1', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-20', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') + +# +# +# opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +# opObj23.addParameter(name='id', value='4', format='int') +# opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +# opObj23.addParameter(name='save', value='1', format='bool') +# opObj23.addParameter(name='figpath', value = pathFigure, format='str') +# opObj23.addParameter(name='zminZonal', value='-150', format='int') +# opObj23.addParameter(name='zmaxZonal', value='150', format='int') +# opObj23.addParameter(name='zminVertical', value='-30', format='float') +# opObj23.addParameter(name='zmaxVertical', value='30', format='float') +# opObj23.addParameter(name='SNR_1', value='1', format='bool') +# opObj23.addParameter(name='SNRmax', value='5', format='int') +# # opObj23.addParameter(name='SNRthresh', value='-50', format='float') +# opObj23.addParameter(name='xmin', value=xmin, format='float') +# opObj23.addParameter(name='xmax', value=xmax, format='float') +# +# +# # opObj11 = procUnitConf.Obj1.addOperation(name='SendByFTP', optype='other') +# # opObj11.addParameter(name='ext', value='*.jpeg', format='str') +# # opObj11.addParameter(name='localfolder', value='/home/alex/Pictures/ftp', format='str') +# # opObj11.addParameter(name='remotefolder', value='/home/wmaster/web2/data/JRO/HFT/2015/03/11/figures/', format='str') +# # opObj11.addParameter(name='server', value='181.177.232.125', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/hf_test.py b/schainpy/scripts/scripts_v/hf_test.py new file mode 100644 index 0000000..0aff4c7 --- /dev/null +++ b/schainpy/scripts/scripts_v/hf_test.py @@ -0,0 +1,236 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +#--------------------------------------- +freq1="_2.72MHz_" +freq2="_3.64MHz_" + +date="2015-03-12_N" +ext_img=".jpeg" + + +#--------------------------------------- + + + +desc = "HF_EXAMPLE" +filename = "hf_test.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#-----------------------PATH------------------------------# +#path='/media/APOLLO/HF_rawdata/d2015026/0/cspec' +#path='/media/APOLLO/HF_rawdata/cspec' +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f0" #f0=2.72e6 +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f1" #f0=3.64e6 +#path='/media/APOLLO/HF_rawdata/test' +path='/media/APOLLO/HF_rawdata/HFT_miercoles/sp01_f0' +#---------------------------------------------------------# + +#---------------------PATH-FIGURE------------------------# +#figpath='/home/alex/Pictures/hf2_16/last_data' +figpath='/home/alex/Pictures/ftp' +pathFigure='/home/alex/Pictures/hf2_16/last_data' +#path='/home/alex/Downloads/ICA_LAST_TEST' +#---------------------------------------------------------# +readUnitConfObj = controllerObj.addReadUnit(datatype='HFReader', + path=path, + startDate='2013/01/1', + endDate='2015/05/13', + startTime='00:00:00', + endTime='23:59:59', + online=0, + #set=1426485881, + delay=10, + walk=1, + timezone=-5*3600) + + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +# opObj12 = procUnitConfObj0.addOperation(name='selectChannels',optype='self') +# opObj12.addParameter(name='channelList', value='0', format='intList') + +opObj12 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj12.addParameter(name='frequency', value='3.64e6', format='float') + +opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj12.addParameter(name='n', value='4', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='ymin', value='-1e-8', format='float') +# opObj11.addParameter(name='ymax', value='1e-8', format='float') +# # +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='25', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='25', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,1)', format='pairsList') + + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='6', format='float') + +#opObj11 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='other') +#opObj11.addParameter(name='path', value='/home/alex/Downloads/pdata_hf') +#opObj11.addParameter(name='blocksPerFile', value='1', format='int') +# +# +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='2001', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='zmin', value='-120', format='float') +opObj11.addParameter(name='zmax', value='-70', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +# opObj11.addParameter(name='figfile', value=figfile_spectra_name, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +#opObj11.addParameter(name='ftp_wei', value='0', format='int') +#opObj11.addParameter(name='exp_code', value='20', format='int') +#opObj11.addParameter(name='sub_exp_code', value='0', format='int') +#opObj11.addParameter(name='plot_pos', value='0', format='int') + +# figfile_power_name="jro_power_image"+freq2+date+ext_img +# print figfile_power_name +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='3002', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='zmin', value='-110', format='float') +opObj11.addParameter(name='zmax', value='-50', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='figfile', value=figfile_power_name, format='str') +#opObj11.addParameter(name='wr_period', value='5', format='int') + + +#opObj11 = procUnitConfObj1.addOperation(name='PowerProfile', optype='other') +#opObj11.addParameter(name='id', value='2004', format='int') +#opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +#opObj11.addParameter(name='save', value='1', format='bool') +#opObj11.addParameter(name='figpath', value=figpath, format='str') +#opObj11.addParameter(name='xmin', value='10', format='int') +#opObj11.addParameter(name='xmax', value='40', format='int') + +# figfile_phase_name="jro_phase_image"+freq1+date+ext_img +# print figfile_phase_name +opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +opObj11.addParameter(name='id', value='3', format='int') +opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +opObj11.addParameter(name='showprofile', value='1', format='int') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +#opObj11.addParameter(name='channelList', value='0', format='intlist') +opObj11.addParameter(name='save', value='1', format='bool') +opObj11.addParameter(name='figpath', value=figpath, format='str') + # opObj11.addParameter(name='figfile', value=figfile_phase_name, format='str') + # opObj11.addParameter(name='wr_period', value='5', format='int') + +#opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +#opObj11.addParameter(name='id', value='6005', format='int') +#opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +#opObj11.addParameter(name='zmin', value='-110', format='float') +#opObj11.addParameter(name='zmax', value='-50', format='float') +#opObj11.addParameter(name='xmin', value='0', format='float') +#opObj11.addParameter(name='xmax', value='24', format='float') +#opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +#opObj11.addParameter(name='save', value='1', format='bool') +#opObj11.addParameter(name='figpath', value=figpath, format='str') + + + +#xmin = 0 +#xmax = 24 + +procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +opObj20 = procUnitConfObj2.addOperation(name='GetMoments') + +#opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +#opObj21.addParameter(name='id', value='3', format='int') +#opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +#opObj21.addParameter(name='save', value='1', format='bool') +#opObj21.addParameter(name='figpath', value=pathFigure, format='str') +#opObj21.addParameter(name='zmin', value='5', format='int') +#opObj21.addParameter(name='zmax', value='90', format='int') + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='1', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot0', format='str') +opObj21.addParameter(name='channelList', value='0', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-10', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') +#opObj21.addParameter(name='parameterIndex', value=, format='int') + + +opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +opObj21.addParameter(name='id', value='2', format='int') +opObj21.addParameter(name='wintitle', value='Radial Velocity Plot1', format='str') +opObj21.addParameter(name='channelList', value='1', format='intlist') +opObj21.addParameter(name='save', value='1', format='bool') +opObj21.addParameter(name='figpath', value=figpath, format='str') +opObj21.addParameter(name='SNR', value='1', format='bool') +opObj21.addParameter(name='SNRmin', value='-20', format='int') +opObj21.addParameter(name='SNRmax', value='50', format='int') +opObj21.addParameter(name='SNRthresh', value='0', format='float') +opObj21.addParameter(name='xmin', value=0, format='float') +opObj21.addParameter(name='xmax', value=24, format='float') + + +# +# opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +# opObj23.addParameter(name='id', value='4', format='int') +# opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +# opObj23.addParameter(name='save', value='1', format='bool') +# opObj23.addParameter(name='figpath', value = pathFigure, format='str') +# opObj23.addParameter(name='zminZonal', value='-150', format='int') +# opObj23.addParameter(name='zmaxZonal', value='150', format='int') +# opObj23.addParameter(name='zminVertical', value='-30', format='float') +# opObj23.addParameter(name='zmaxVertical', value='30', format='float') +# opObj23.addParameter(name='SNR_1', value='1', format='bool') +# opObj23.addParameter(name='SNRmax', value='5', format='int') +# # opObj23.addParameter(name='SNRthresh', value='-50', format='float') +# opObj23.addParameter(name='xmin', value=xmin, format='float') +# opObj23.addParameter(name='xmax', value=xmax, format='float') + + +#opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +#opObj11.addParameter(name='ext', value='*.jpeg', format='str') +#opObj11.addParameter(name='localfolder', value='/home/alex/Pictures/ftp', format='str') +#opObj11.addParameter(name='remotefolder', value='/home/wmaster/web2/data/JRO/HFT/2015/03/11/figures/', format='str') +#opObj11.addParameter(name='server', value='181.177.232.125', format='str') +#opObj11.addParameter(name='username', value='wmaster', format='str') +#opObj11.addParameter(name='password', value='mst2010vhf', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/hf_write_pdata.py b/schainpy/scripts/scripts_v/hf_write_pdata.py new file mode 100644 index 0000000..ea7631b --- /dev/null +++ b/schainpy/scripts/scripts_v/hf_write_pdata.py @@ -0,0 +1,237 @@ +import os, sys +#import timeit +import datetime + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +#--------------------------------------- +freq1="_2.72MHz_" +freq2="_3.64MHz_" + +date="2015-03-12_N" +ext_img=".jpeg" + + +#--------------------------------------- + + + +desc = "HF_EXAMPLE" +filename = "hf_test.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +#-----------------------PATH------------------------------# +#path='/media/APOLLO/HF_rawdata/d2015026/0/cspec' +#path='/media/APOLLO/HF_rawdata/cspec' +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f0" #f0=2.72e6 +#path="/media/APOLLO/HF_rawdata/d2015059/sp01_f1" #f0=3.64e6 +#path='/media/APOLLO/HF_rawdata/test' +path='/media/APOLLO/HF_rawdata/HFT_miercoles/sp01_f0' +#---------------------------------------------------------# + +#---------------------PATH-FIGURE------------------------# +#figpath='/home/alex/Pictures/hf2_16/last_data' +figpath='/home/alex/Pictures/ftp' +pathFigure='/home/alex/Pictures/hf2_16/last_data' +#path='/home/alex/Downloads/ICA_LAST_TEST' +#---------------------------------------------------------# +readUnitConfObj = controllerObj.addReadUnit(datatype='HFReader', + path=path, + startDate='2013/01/1', + endDate='2015/05/13', + startTime='00:00:00', + endTime='23:59:59', + online=0, + #set=850, + delay=10, + walk=1, + timezone=-5*3600) + + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +# opObj12 = procUnitConfObj0.addOperation(name='selectChannels',optype='self') +# opObj12.addParameter(name='channelList', value='0', format='intList') + +opObj12 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj12.addParameter(name='frequency', value='3.64e6', format='float') + +opObj12 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj12.addParameter(name='n', value='4', format='int') + +# opObj11 = procUnitConfObj0.addOperation(name='Scope', optype='other') +# opObj11.addParameter(name='id', value='10', format='int') +# opObj11.addParameter(name='wintitle', value='Voltage', format='str') +# opObj11.addParameter(name='ymin', value='-1e-8', format='float') +# opObj11.addParameter(name='ymax', value='1e-8', format='float') +# # +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) +procUnitConfObj1.addParameter(name='nFFTPoints', value='25', format='int') +procUnitConfObj1.addParameter(name='nProfiles', value='25', format='int') +procUnitConfObj1.addParameter(name='pairsList', value='(0,1)', format='pairsList') + + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='6', format='float') + +opObj11 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value='/home/alex/Downloads/pdata_hf') +opObj11.addParameter(name='blocksPerFile', value='1', format='int') +# +# +# # opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# # opObj11.addParameter(name='id', value='2001', format='int') +# # opObj11.addParameter(name='wintitle', value='HF_Jicamarca_Spc', format='str') +# # #opObj11.addParameter(name='channelList', value='0', format='intlist') +# # opObj11.addParameter(name='zmin', value='-120', format='float') +# # opObj11.addParameter(name='zmax', value='-70', format='float') +# # opObj11.addParameter(name='save', value='1', format='int') +# # opObj11.addParameter(name='figpath', value=figpath, format='str') +# # # opObj11.addParameter(name='figfile', value=figfile_spectra_name, format='str') +# # # opObj11.addParameter(name='wr_period', value='5', format='int') +# # #opObj11.addParameter(name='ftp_wei', value='0', format='int') +# # #opObj11.addParameter(name='exp_code', value='20', format='int') +# # #opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # #opObj11.addParameter(name='plot_pos', value='0', format='int') +# # +# # figfile_power_name="jro_power_image"+freq2+date+ext_img +# # print figfile_power_name +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3002', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='channelList', value='0', format='intlist') +# opObj11.addParameter(name='xmin', value='0', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# opObj11.addParameter(name='zmin', value='-110', format='float') +# opObj11.addParameter(name='zmax', value='-50', format='float') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# #opObj11.addParameter(name='figfile', value=figfile_power_name, format='str') +# #opObj11.addParameter(name='wr_period', value='5', format='int') +# +# +# #opObj11 = procUnitConfObj1.addOperation(name='PowerProfile', optype='other') +# #opObj11.addParameter(name='id', value='2004', format='int') +# #opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# ##opObj11.addParameter(name='channelList', value='0', format='intlist') +# #opObj11.addParameter(name='save', value='1', format='bool') +# #opObj11.addParameter(name='figpath', value=figpath, format='str') +# ##opObj11.addParameter(name='xmin', value='10', format='int') +# ##opObj11.addParameter(name='xmax', value='40', format='int') +# +# # figfile_phase_name="jro_phase_image"+freq1+date+ext_img +# # print figfile_phase_name +# opObj11 = procUnitConfObj1.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# opObj11.addParameter(name='showprofile', value='1', format='int') +# opObj11.addParameter(name='xmin', value='0', format='float') +# opObj11.addParameter(name='xmax', value='24', format='float') +# #opObj11.addParameter(name='channelList', value='0', format='intlist') +# opObj11.addParameter(name='save', value='1', format='bool') +# opObj11.addParameter(name='figpath', value=figpath, format='str') +# # # opObj11.addParameter(name='figfile', value=figfile_phase_name, format='str') +# # # opObj11.addParameter(name='wr_period', value='5', format='int') +# +# # opObj11 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +# # opObj11.addParameter(name='id', value='6005', format='int') +# # opObj11.addParameter(name='wintitle', value='HF_Jicamarca', format='str') +# # opObj11.addParameter(name='zmin', value='-110', format='float') +# # opObj11.addParameter(name='zmax', value='-50', format='float') +# # #opObj11.addParameter(name='xmin', value='0', format='float') +# # #opObj11.addParameter(name='xmax', value='24', format='float') +# # #opObj11.addParameter(name='channelList', value='0,1,2,3', format='intlist') +# # opObj11.addParameter(name='save', value='1', format='bool') +# # opObj11.addParameter(name='figpath', value=figpath, format='str') +# +# +# +# # xmin = 0 +# # xmax = 24 +# #------------------------------------------------------------------ +# # +# procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) +# opObj20 = procUnitConfObj2.addOperation(name='GetMoments') +# +# # opObj21 = procUnitConfObj2.addOperation(name='MomentsPlot', optype='other') +# # opObj21.addParameter(name='id', value='3', format='int') +# # opObj21.addParameter(name='wintitle', value='Moments Plot', format='str') +# # opObj21.addParameter(name='save', value='1', format='bool') +# # opObj21.addParameter(name='figpath', value=pathFigure, format='str') +# #opObj21.addParameter(name='zmin', value='5', format='int') +# #opObj21.addParameter(name='zmax', value='90', format='int') +# +# opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +# opObj21.addParameter(name='id', value='1', format='int') +# opObj21.addParameter(name='wintitle', value='Radial Velocity Plot0', format='str') +# opObj21.addParameter(name='channelList', value='0', format='intlist') +# opObj21.addParameter(name='save', value='1', format='bool') +# opObj21.addParameter(name='figpath', value=figpath, format='str') +# opObj21.addParameter(name='SNR', value='1', format='bool') +# opObj21.addParameter(name='SNRmin', value='-10', format='int') +# opObj21.addParameter(name='SNRmax', value='50', format='int') +# opObj21.addParameter(name='SNRthresh', value='0', format='float') +# opObj21.addParameter(name='xmin', value=0, format='float') +# opObj21.addParameter(name='xmax', value=24, format='float') +# #opObj21.addParameter(name='parameterIndex', value=, format='int') +# +# +# opObj21 = procUnitConfObj2.addOperation(name='ParametersPlot', optype='other') +# opObj21.addParameter(name='id', value='2', format='int') +# opObj21.addParameter(name='wintitle', value='Radial Velocity Plot1', format='str') +# opObj21.addParameter(name='channelList', value='1', format='intlist') +# opObj21.addParameter(name='save', value='1', format='bool') +# opObj21.addParameter(name='figpath', value=figpath, format='str') +# opObj21.addParameter(name='SNR', value='1', format='bool') +# opObj21.addParameter(name='SNRmin', value='-20', format='int') +# opObj21.addParameter(name='SNRmax', value='50', format='int') +# opObj21.addParameter(name='SNRthresh', value='0', format='float') +# opObj21.addParameter(name='xmin', value=0, format='float') +# opObj21.addParameter(name='xmax', value=24, format='float') +# +# +# +# # opObj23 = procUnitConfObj2.addOperation(name='EWDriftsPlot', optype='other') +# # opObj23.addParameter(name='id', value='4', format='int') +# # opObj23.addParameter(name='wintitle', value='EW Drifts', format='str') +# # opObj23.addParameter(name='save', value='1', format='bool') +# # opObj23.addParameter(name='figpath', value = pathFigure, format='str') +# # opObj23.addParameter(name='zminZonal', value='-150', format='int') +# # opObj23.addParameter(name='zmaxZonal', value='150', format='int') +# # opObj23.addParameter(name='zminVertical', value='-30', format='float') +# # opObj23.addParameter(name='zmaxVertical', value='30', format='float') +# # opObj23.addParameter(name='SNR_1', value='1', format='bool') +# # opObj23.addParameter(name='SNRmax', value='5', format='int') +# # # opObj23.addParameter(name='SNRthresh', value='-50', format='float') +# # opObj23.addParameter(name='xmin', value=xmin, format='float') +# # opObj23.addParameter(name='xmax', value=xmax, format='float') +# +# +# opObj11 = procUnitConfObj1.addOperation(name='SendByFTP', optype='other') +# opObj11.addParameter(name='ext', value='*.jpeg', format='str') +# opObj11.addParameter(name='localfolder', value='/home/alex/Pictures/ftp', format='str') +# opObj11.addParameter(name='remotefolder', value='/home/wmaster/web2/data/JRO/HFT/2015/03/11/figures/', format='str') +# opObj11.addParameter(name='server', value='181.177.232.125', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/jacktotalrunner.py b/schainpy/scripts/scripts_v/jacktotalrunner.py new file mode 100644 index 0000000..8dd6afa --- /dev/null +++ b/schainpy/scripts/scripts_v/jacktotalrunner.py @@ -0,0 +1,143 @@ +import os, sys +from pytz import timezone +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) + +print path +sys.path.insert(0, path) # Para usar las librerias del eclipse. + +from schainpy.controller import Project + +# from __main__ import time +#path = os.path.split(os.getcwd())[0] +#sys.path.append(path) +# import scipy.io as sio +# import pprint +# import numpy +# import time +# import os +# import h5py +# import re +# import tables +# +# from model.data.jrodata import * +# from model.proc.jroproc_base import ProcessingUnit, Operation +# from model.io.jroIO_base import * + + +# controllerObj = Project() + +# controllerObj.setup(id = '191', name='test01', description=desc) + + +#from controller import * + +desc = "DBS Experiment Test" +filename = "DBStest.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +#path = 'F:\CIRI Data\processed' +#path='/media/4B514E8903EBC487/CIRI Data/processed' +#path='/home/ciri/ciri_online' +#offline program +#path='/home/ciri/.gvfs/SFTP for radar on 192.168.1.161/media/dataswap/huancayo/20150701/processed' +#online program +path='/home/ciri/.gvfs/SFTP for radar on 192.168.1.161/media/dataswap/huancayo/processed' +#pathFigure = 'C:\Users\jdk5273\Documents\LiClipseWorkspace' +pathFigure='/home/ciri/Pictures/ciri' +xmin = '0' +xmax = '24' +startTime = '00:00:00' +remotefolder = "/home/wmaster/graficos" + +readUnitConfObj = controllerObj.addReadUnit(datatype='matoffReader', + path=path, + startDate='2015/05/30', + endDate='2015/05/30', + startTime=startTime, + endTime='23:59:59', + online=1, + delay=5, + walk=0) + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=readUnitConfObj.getId()) + +# opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +# opObj14.addParameter(name='id', value='1', format='int') +# opObj14.addParameter(name='wintitle', value='Con interf', format='str') +# opObj14.addParameter(name='save', value='0', format='bool') +# opObj14.addParameter(name='figpath', value=pathFigure, format='str') + +opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='60', format='int') + +opObj14 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj14.addParameter(name='id', value='2', format='int') +opObj14.addParameter(name='wintitle', value='Con interf', format='str') +opObj14.addParameter(name='save', value='1', format='bool') +opObj14.addParameter(name='figpath', value=pathFigure, format='str') +opObj14.addParameter(name='zmin', value='-30', format='int') +opObj14.addParameter(name='zmax', value='0', format='int') +opObj14.addParameter(name='exp_code', value='29', format='int') +opObj14.addParameter(name='wr_period', value='1', format='int') +opObj14.addParameter(name='save', value='1', format='int') + +opObj14.addParameter(name='ftp', value='1', format='int') + +opObj14 = procUnitConfObj1.addOperation(name='CrossSpectraPlot', optype='other') +opObj14.addParameter(name='id', value='4', format='int') +opObj14.addParameter(name='wintitle', value='Con interf', format='str') +opObj14.addParameter(name='phase_cmap', value='jet', format='str') +opObj14.addParameter(name='save', value='1', format='bool') +opObj14.addParameter(name='figpath', value=pathFigure, format='str') +opObj14.addParameter(name='zmin', value='-30', format='int') +opObj14.addParameter(name='zmax', value='0', format='int') +opObj14.addParameter(name='exp_code', value='29', format='int') +opObj14.addParameter(name='wr_period', value='1', format='int') +opObj14.addParameter(name='save', value='1', format='int') + +opObj14.addParameter(name='ftp', value='1', format='int') + +opObj12 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj12.addParameter(name='id', value='3', format='int') +opObj12.addParameter(name='wintitle', value='RTI Plot', format='str') +opObj12.addParameter(name='save', value='1', format='bool') +opObj12.addParameter(name='figpath', value = pathFigure, format='str') +opObj12.addParameter(name='xmin', value=xmin, format='float') +opObj12.addParameter(name='xmax', value=xmax, format='float') +opObj12.addParameter(name='zmin', value='-30', format='int') +opObj12.addParameter(name='zmax', value='0', format='int') +opObj12.addParameter(name='exp_code', value='29', format='int') +opObj12.addParameter(name='wr_period', value='1', format='int') +opObj12.addParameter(name='save', value='1', format='int') + +opObj12.addParameter(name='ftp', value='1', format='int') + +# +procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer') +procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') +procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') +procUnitConfObj2.addParameter(name='localfolder', value=pathFigure, format='str') +procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') +procUnitConfObj2.addParameter(name='ext', value='.png', format='str') +procUnitConfObj2.addParameter(name='period', value=5, format='int') +procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + + + + +#-------------------------------------------------------------------------------------------------- +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() + + diff --git a/schainpy/scripts/scripts_v/jasmet30_16april.py b/schainpy/scripts/scripts_v/jasmet30_16april.py new file mode 100644 index 0000000..9ea3acd --- /dev/null +++ b/schainpy/scripts/scripts_v/jasmet30_16april.py @@ -0,0 +1,77 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/16', + endDate='2014/04/16', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/home/jasmet/jasmet30_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value='/home/jasmet/jasmet30_phase', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/jasmet50_16april.py b/schainpy/scripts/scripts_v/jasmet50_16april.py new file mode 100644 index 0000000..92d85c4 --- /dev/null +++ b/schainpy/scripts/scripts_v/jasmet50_16april.py @@ -0,0 +1,79 @@ +""" +Se debe verficar que el disco de datos se encuentra montado en el sistema +""" +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Meteor Experiment Test" +filename = "meteor20130812.xml" + +controllerObj = Project() +controllerObj.setup(id = '191', name='meteor_test01', description=desc) + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/Jasmet50' + + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/04/16', + endDate='2014/04/16', + startTime='00:00:00', + endTime='23:59:59', + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj0 = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj0.addOperation(name='setRadarFrequency') +opObj11.addParameter(name='frequency', value='30.15e6', format='float') + +opObj11 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + + +opObj11 = procUnitConfObj0.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='int') + +opObj11 = procUnitConfObj0.addOperation(name='VoltageWriter', optype='other') +opObj11.addParameter(name='path', value='/media/datos/jasmet50_abril') +opObj11.addParameter(name='blocksPerFile', value='100', format='int') +opObj11.addParameter(name='profilesPerBlock', value='200', format='int') + + +""" +########################################### BEACON ########################################## +""" + +procUnitConfObjBeacon = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObj0.getId()) +procUnitConfObjBeacon.addParameter(name='nProfiles', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='nFFTPoints', value='200', format='int') +procUnitConfObjBeacon.addParameter(name='pairsList', value='(2,0),(2,1),(2,3),(2,4)', format='pairsList') + +opObj11 = procUnitConfObjBeacon.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='4', format='int') + +opObj11 = procUnitConfObjBeacon.addOperation(name='getBeaconSignal') + +opObj11 = procUnitConfObjBeacon.addOperation(name='BeaconPhase', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='Beacon Phase', format='str') +opObj11.addParameter(name='xmin', value='0', format='float') +opObj11.addParameter(name='xmax', value='24', format='float') +opObj11.addParameter(name='ymin', value='-180', format='float') +opObj11.addParameter(name='ymax', value='180', format='float') +opObj11.addParameter(name='figpath', value='/media/datos/jasmet50_phase', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/mst_isr_eej_blocks.py b/schainpy/scripts/scripts_v/mst_isr_eej_blocks.py new file mode 100644 index 0000000..f495ad9 --- /dev/null +++ b/schainpy/scripts/scripts_v/mst_isr_eej_blocks.py @@ -0,0 +1,225 @@ +import os, sys +#import timeit + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "MST-ISR-EEJ Experiment Test" +filename = "mst_isr_eej_blocks.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path = '/Volumes/HD-PXU2/mst_isr_eej' + +figpath = '/Users/dsuarez/Pictures/mst_isr_eej/' + +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate='2014/05/01', + endDate='2014/05/30', + startTime='00:00:00', + endTime='23:59:59', + online=0, + delay=10, + walk=0, + getblock=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +# ################ EEJ #################################### +procUnitConfObjEEJ = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjEEJ.addOperation(name='ProfileSelector', optype='other') +opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +opObj11 = procUnitConfObjEEJ.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value='1,-1', format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +opObj11.addParameter(name='nBaud', value='1', format='int') +opObj11.addParameter(name='mode', value='3', format='int') +opObj11.addParameter(name='times', value='32', format='int') + +# opObj11 = procUnitConfObjEEJ.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='int') + +procUnitConfObjEEJSpecta = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjEEJ.getId()) +procUnitConfObjEEJSpecta.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjEEJSpecta.addParameter(name='nProfiles', value='64', format='int') + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='timeInterval', value='10', format='float') +opObj11.addParameter(name='n', value='36', format='float') + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='60', format='int')# opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + +opObj11 = procUnitConfObjEEJSpecta.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SendByFTP', optype='other') +# opObj11.addParameter(name='ext', value='*.png', format='str') +# opObj11.addParameter(name='localfolder', value=figpath, format='str') +# opObj11.addParameter(name='remotefolder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='period', value='5', format='int') + + +################ MST #################################### +procUnitConfObjMST = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjMST.addOperation(name='ProfileSelector', optype='other') +profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119' +#profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19' +opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +opObj11 = procUnitConfObjMST.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='mode',value='3',format='int') +opObj11.addParameter(name='times',value='10',format='int') + +opObj11 = procUnitConfObjMST.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='20', format='int') +opObj11.addParameter(name='byblock', value='1', format='bool') + +procUnitConfObjMSTSpectra = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjMST.getId()) +procUnitConfObjMSTSpectra.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjMSTSpectra.addParameter(name='nProfiles', value='64', format='int') + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='2', format='float') + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='200', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +# # opObj11.addParameter(name='zmin', value='35', format='int') +# # opObj11.addParameter(name='zmax', value='60', format='int') +# # opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# # opObj11.addParameter(name='ftp', value='1', format='int') +# # opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# # opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # opObj11.addParameter(name='plot_pos', value='0', format='int') +# # +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +# # opObj11.addParameter(name='xmin', value='0', format='int') +# # opObj11.addParameter(name='xmax', value='24', format='int') +# # opObj11.addParameter(name='zmin', value='35', format='int') +# # opObj11.addParameter(name='zmax', value='60', format='int') +# # opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +# # opObj11.addParameter(name='ftp', value='1', format='int') +# # opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# # opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# # opObj11.addParameter(name='username', value='wmaster', format='str') +# # opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# # opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +# # opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# # opObj11.addParameter(name='plot_pos', value='0', format='int') + +# ################ ISR #################################### +procUnitConfObjISR = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjISR.addOperation(name='ProfileSelector', optype='other') +# profileIndex = '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' +# opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +opObj11.addParameter(name='profileRangeList', value='20,99', format='intlist') +opObj11.addParameter(name='byblock', value='1', format='bool') + +# opObj11 = procUnitConfObjISR.addOperation(name='ProfileConcat', optype='other') +# opObj11.addParameter(name='m', value='5', format='int') + +opObj11 = procUnitConfObjISR.addOperation(name='Reshaper', optype='other') #Esta Operacion opera sobre bloques y reemplaza el ProfileConcat que opera sobre perfiles +opObj11.addParameter(name='shape', value='4,16,6750', format='intlist') # shape = (nchannels, nprofiles, nhieghts) + +opObj11 = procUnitConfObjISR.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='20', format='int') +opObj11.addParameter(name='axis', value='2', format='int') + +barker3x1 = '1,1,-1,-1,-1,1' +#barker3x5 = '1,1,1,1,1, 1,1,1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1' + +opObj11 = procUnitConfObjISR.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=barker3x1, format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +#opObj11.addParameter(name='nBaud', value='15', format='int') +opObj11.addParameter(name='nBaud', value='3', format='int') +opObj11.addParameter(name='mode', value='3', format='int') +opObj11.addParameter(name='times', value='8', format='int') +opObj11.addParameter(name='osamp', value='5', format='int') + + +procUnitConfObjISRSpectra = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjISR.getId()) +procUnitConfObjISRSpectra.addParameter(name='nFFTPoints', value='16', format='int') +procUnitConfObjISRSpectra.addParameter(name='nProfiles', value='16', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='36', format='float') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='300', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() + +#timeit.timeit('controllerObj.run()', number=2) + +controllerObj.run() +#print fib(5) \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/mst_isr_eej_processing.py b/schainpy/scripts/scripts_v/mst_isr_eej_processing.py new file mode 100644 index 0000000..af0fb15 --- /dev/null +++ b/schainpy/scripts/scripts_v/mst_isr_eej_processing.py @@ -0,0 +1,271 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts Experiment Test" +filename = "mst_isr_eej.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + +path='/remote/ewdrifts/RAW_EXP/EW_DRIFT_FARADAY/EW_Drift' + +path1 = '/media/New Volume/DATA/MST_ISR' + +path2 = '/media/DATA/DATA/RAW_EXP/MST-EEJ' + +path = path1 + ',' + path2 + +path = '/home/dsuarez/.gvfs/data on 10.10.20.13/MST_ISR_EEJ' +gpath = '/media/datos/pictures/mstisr_mayo2014' + +path = '/Volumes/New Volume/mst_isr_eej' +gpath = '/Users/dsuarez/Pictures/poster' + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/05/15', + endDate='2014/05/15', + startTime='08:00:00', + endTime='16:00:00', + delay=3, + set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +######################################################### +################ MST #################################### +######################################################### + +# procUnitConfObjMST = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# +# opObj11 = procUnitConfObjMST.addOperation(name='ProfileSelector', optype='other') +# profileIndex = '0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119' +# +# opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') +# +# opObj11 = procUnitConfObjMST.addOperation(name='Decoder', optype='other') +# +# opObj11 = procUnitConfObjMST.addOperation(name='CohInt', optype='other') +# opObj11.addParameter(name='n', value='20', format='int') +# +# procUnitConfObjMSTSpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjMST.getId()) +# procUnitConfObjMSTSpectra.addParameter(name='nFFTPoints', value='64', format='int') +# procUnitConfObjMSTSpectra.addParameter(name='nProfiles', value='64', format='int') +# +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='IncohInt', optype='other') +# opObj11.addParameter(name='n', value='2', format='float') + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value='/media/datos/mst2014') +# opObj11.addParameter(name='blocksPerFile', value='10', format='int') + + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='1000', format='int') +# opObj11.addParameter(name='wintitle', value='MST', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='ymin', value='120', format='int') +# opObj11.addParameter(name='ymax', value='190', format='int') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='50', format='int') + + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='101', format='int') +# opObj11.addParameter(name='wintitle', value='MST', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='channelList', value='3', format='intlist') +# #opObj11.addParameter(name='timerange', value='300', format='float') +# opObj11.addParameter(name='xmin', value='8', format='float') +# opObj11.addParameter(name='xmax', value='16', format='float') +# opObj11.addParameter(name='ymin', value='120', format='float') +# opObj11.addParameter(name='ymax', value='190', format='float') +# opObj11.addParameter(name='zmin', value='20', format='float') +# opObj11.addParameter(name='zmax', value='45', format='float') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figfile', value='rti_mst.pdf', format='str') +# opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/poster', format='str') + + +# opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='1001', format='int') +# opObj11.addParameter(name='wintitle', value='MST', format='str') +# opObj11.addParameter(name='ymin', value='120', format='int') +# opObj11.addParameter(name='ymax', value='190', format='int') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='45', format='int') + +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=gpath, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='exp_code', value='19', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + +######################################################## +############### ISR #################################### +######################################################## + +procUnitConfObjISR = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObjISR.addOperation(name='ProfileSelector', optype='other') + +profileIndex = '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' + +opObj11.addParameter(name='profileList', value=profileIndex, format='intlist') + +opObj11 = procUnitConfObjISR.addOperation(name='ProfileConcat', optype='other') +opObj11.addParameter(name='m', value='5', format='int') + +opObj11 = procUnitConfObjISR.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='20', format='int') + +barker3x1 = '1,1,-1,-1,-1,1' +barker3x5 = '1,1,1,1,1, 1,1,1,1,1,-1,-1,-1,-1,-1,' + \ + '-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1,1,1,1' + + +opObj11 = procUnitConfObjISR.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=barker3x5, format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +opObj11.addParameter(name='nBaud', value='15', format='int') + + +procUnitConfObjISRSpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjISR.getId()) +procUnitConfObjISRSpectra.addParameter(name='nFFTPoints', value='16', format='int') +procUnitConfObjISRSpectra.addParameter(name='nProfiles', value='16', format='int') + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='36', format='float') + +# opObj11 = procUnitConfObjISRSpectra.addOperation(name='SpectraWriter', optype='other') +# opObj11.addParameter(name='path', value='/media/datos/isr2014') +# opObj11.addParameter(name='blocksPerFile', value='120', format='int') + + +opObj11 = procUnitConfObjISRSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='channelList', value='3', format='intlist') +#opObj11.addParameter(name='timerange', value='300', format='float') +opObj11.addParameter(name='xmin', value='8', format='float') +opObj11.addParameter(name='xmax', value='16', format='float') +# opObj11.addParameter(name='ymin', value='120', format='float') +# opObj11.addParameter(name='ymax', value='190', format='float') +opObj11.addParameter(name='zmin', value='20', format='float') +opObj11.addParameter(name='zmax', value='55', format='float') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figfile', value='rti_mst_isr.pdf', format='str') +opObj11.addParameter(name='figpath', value='/Users/dsuarez/Pictures/poster', format='str') + + +# opObj11 = procUnitConfObjISRSpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='2000', format='int') +# opObj11.addParameter(name='wintitle', value='ISR', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='zmin', value='30', format='int') +# opObj11.addParameter(name='zmax', value='70', format='int') +# +# opObj11 = procUnitConfObjISRSpectra.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='2001', format='int') +# opObj11.addParameter(name='wintitle', value='ISR', format='str') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='60', format='int') +# +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=gpath, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='exp_code', value='20', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + +# +# ######################################################### +# ################ EEJ #################################### +# ######################################################### +# ######################################################### +# +# procUnitConfObjEEJ = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# +# opObj11 = procUnitConfObjEEJ.addOperation(name='ProfileSelector', optype='other') +# opObj11.addParameter(name='profileRangeList', value='120,183', format='intlist') +# +# opObj11 = procUnitConfObjEEJ.addOperation(name='Decoder', optype='other') +# opObj11.addParameter(name='code', value='1,-1', format='floatlist') +# opObj11.addParameter(name='nCode', value='2', format='int') +# opObj11.addParameter(name='nBaud', value='1', format='int') +# +# procUnitConfObjEEJSpecta = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjEEJ.getId()) +# procUnitConfObjEEJSpecta.addParameter(name='nFFTPoints', value='64', format='int') +# procUnitConfObjEEJSpecta.addParameter(name='nProfiles', value='64', format='int') +# +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='IncohInt', optype='other') +# opObj11.addParameter(name='n', value='36', format='float') +# +# # opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SpectraWriter', optype='other') +# # opObj11.addParameter(name='path', value='/media/datos/eej2014') +# # opObj11.addParameter(name='blocksPerFile', value='10', format='int') +# +# +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='3000', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='xmin', value='0', format='int') +# opObj11.addParameter(name='xmax', value='24', format='int') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='50', format='int') +# +# opObj11 = procUnitConfObjEEJSpecta.addOperation(name='SpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='3001', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='zmin', value='20', format='int') +# opObj11.addParameter(name='zmax', value='50', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value=gpath, format='str') +# opObj11.addParameter(name='wr_period', value='5', format='int') +# opObj11.addParameter(name='ftp', value='1', format='int') +# opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +# opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +# opObj11.addParameter(name='username', value='wmaster', format='str') +# opObj11.addParameter(name='password', value='mst2010vhf', format='str') +# opObj11.addParameter(name='ftp_wei', value='0', format='int') +# opObj11.addParameter(name='exp_code', value='22', format='int') +# opObj11.addParameter(name='sub_exp_code', value='0', format='int') +# opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() diff --git a/schainpy/scripts/scripts_v/plot_eej.py b/schainpy/scripts/scripts_v/plot_eej.py new file mode 100644 index 0000000..47ae5b5 --- /dev/null +++ b/schainpy/scripts/scripts_v/plot_eej.py @@ -0,0 +1,91 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts+Imaging+Faraday Experiments" +filename = "eej_plots.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = '/media/DATA/eej2014' +figpath = '/home/operaciones/Pictures/eej_mayo2014' + +readUnitConfObj = controllerObj.addReadUnit(datatype='Spectra', + path=path, + startDate='2014/01/08', + endDate='2014/01/08', + startTime='10:00:00', + endTime='14:59:59', + delay=10, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='100', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +opObj11.addParameter(name='zmin', value='15', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='wr_period', value='3', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') +# +# +# +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='101', format='int') +opObj11.addParameter(name='wintitle', value='EEJ', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='22', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + +# opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='105', format='int') +# opObj11.addParameter(name='wintitle', value='EEJ', format='str') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='timerange', value='300', format='int') +# opObj11.addParameter(name='zmin', value='15', format='int') +# opObj11.addParameter(name='zmax', value='30', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# opObj11.addParameter(name='figpath', value='/home/operaciones/Pictures/eej_mayo2014', format='str') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/plot_isr.py b/schainpy/scripts/scripts_v/plot_isr.py new file mode 100644 index 0000000..bba05f9 --- /dev/null +++ b/schainpy/scripts/scripts_v/plot_isr.py @@ -0,0 +1,79 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts+Imaging+Faraday Experiments" +filename = "isr_plots.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = '/media/DATA/isr2014' +figpath = '/home/operaciones/Pictures/isr_mayo2014' +readUnitConfObj = controllerObj.addReadUnit(datatype='Spectra', + path=path, + startDate='2014/01/08', + endDate='2014/01/08', + startTime='10:00:00', + endTime='14:59:59', + delay=40, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObj1 = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId()) + +opObj11 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='200', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='wr_period', value='3', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +opObj11 = procUnitConfObj1.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='201', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='zmin', value='30', format='int') +opObj11.addParameter(name='zmax', value='70', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value=figpath, format='str') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='20', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/plot_mst.py b/schainpy/scripts/scripts_v/plot_mst.py new file mode 100644 index 0000000..72ab023 --- /dev/null +++ b/schainpy/scripts/scripts_v/plot_mst.py @@ -0,0 +1,88 @@ +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "EWDrifts+Imaging+Faraday Experiments" +filename = "mst_plots.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='test01', description=desc) + + +path = '/media/DATA/isr2014' +figpath = '/home/operaciones/Pictures/isr_mayo2014' +readUnitConfObj = controllerObj.addReadUnit(datatype='Spectra', + path=path, + startDate='2014/01/08', + endDate='2014/01/08', + startTime='10:00:00', + endTime='14:59:59', + delay=20, + online=1, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') + +procUnitConfObjMSTSpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=readUnitConfObj.getId()) + + + + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='SpectraPlot', optype='other') +opObj11.addParameter(name='id', value='215', format='int') +opObj11.addParameter(name='wintitle', value='MST', format='str') +opObj11.addParameter(name='ymin', value='120', format='int') +opObj11.addParameter(name='ymax', value='190', format='int') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value='/home/dsuarez/Pictures/mst_mayo2014', format='str') +opObj11.addParameter(name='wr_period', value='1', format='int') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + +opObj11 = procUnitConfObjMSTSpectra.addOperation(name='RTIPlot', optype='other') +opObj11.addParameter(name='id', value='301', format='int') +opObj11.addParameter(name='wintitle', value='ISR', format='str') +opObj11.addParameter(name='showprofile', value='0', format='int') +opObj11.addParameter(name='xmin', value='0', format='int') +opObj11.addParameter(name='xmax', value='24', format='int') +opObj11.addParameter(name='ymin', value='120', format='int') +opObj11.addParameter(name='ymax', value='190', format='int') +opObj11.addParameter(name='zmin', value='20', format='int') +opObj11.addParameter(name='zmax', value='50', format='int') +opObj11.addParameter(name='save', value='1', format='int') +opObj11.addParameter(name='figpath', value='/home/dsuarez/Pictures/mst_mayo2014', format='str') +opObj11.addParameter(name='wr_period', value='5', format='int') +opObj11.addParameter(name='ftp', value='1', format='int') +opObj11.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') +opObj11.addParameter(name='folder', value='/home/wmaster/graficos', format='str') +opObj11.addParameter(name='username', value='wmaster', format='str') +opObj11.addParameter(name='password', value='mst2010vhf', format='str') +opObj11.addParameter(name='ftp_wei', value='0', format='int') +opObj11.addParameter(name='exp_code', value='19', format='int') +opObj11.addParameter(name='sub_exp_code', value='0', format='int') +opObj11.addParameter(name='plot_pos', value='0', format='int') + + + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/sousy.py b/schainpy/scripts/scripts_v/sousy.py new file mode 100644 index 0000000..829b456 --- /dev/null +++ b/schainpy/scripts/scripts_v/sousy.py @@ -0,0 +1,103 @@ + + + + + +import os, sys + +path = os.path.split(os.getcwd())[0] +sys.path.append(path) + +from controller import * + +desc = "Sousy_test" +filename = "sousy_processing.xml" + +controllerObj = Project() + +controllerObj.setup(id = '191', name='Test_sousy', description=desc) + +#path = '/media/data/data/vientos/57.2063km/echoes/NCO_Woodman' +#path2= '/media/' +#path2='/media/New Volume/LowTroposphere' +#path1='/media/New Volume/LT_shortpulse' +#path = path1 + ',' + path2 +path='G:\\LowTroposphere' + +path = '/media/signalchain/FVillanuevaR/LowTroposphere' +wr_path = '/media/signalchain/datos/sousy' +figures_path = '/home/signalchain/Pictures/sousy' + +readUnitConfObj = controllerObj.addReadUnit(datatype='Voltage', + path=path, + startDate='2014/07/08', + endDate='2014/07/08', + startTime='10:00:00', + endTime='17:59:59', + delay=0, + set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +######################################################### +################ SOUSY################################### +######################################################### +# +procUnitConfObjSousy = controllerObj.addProcUnit(datatype='Voltage', inputId=readUnitConfObj.getId()) +# +# codigo64='1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0,'+\ +# '1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1' +opObj11 = procUnitConfObjSousy.addOperation(name='setRadarFrequency') +opObj11.addParameter(name='frequency', value='53.5e6', format='float') + + + +opObj11 = procUnitConfObjSousy.addOperation(name='filterByHeights') +opObj11.addParameter(name='window', value='2', format='int') + +codigo='1,-1' +opObj11 = procUnitConfObjSousy.addOperation(name='Decoder', optype='other') +opObj11.addParameter(name='code', value=codigo, format='floatlist') +opObj11.addParameter(name='nCode', value='2', format='int') +opObj11.addParameter(name='nBaud', value='1', format='int') + +opObj11 = procUnitConfObjSousy.addOperation(name='CohInt', optype='other') +opObj11.addParameter(name='n', value='2048', format='int') + +procUnitConfObjSousySpectra = controllerObj.addProcUnit(datatype='Spectra', inputId=procUnitConfObjSousy.getId()) +procUnitConfObjSousySpectra.addParameter(name='nFFTPoints', value='64', format='int') +procUnitConfObjSousySpectra.addParameter(name='nProfiles', value='64', format='int') + +opObj13 = procUnitConfObjSousySpectra.addOperation(name='removeDC') +opObj13.addParameter(name='mode', value='2', format='int') + +opObj11 = procUnitConfObjSousySpectra.addOperation(name='IncohInt', optype='other') +opObj11.addParameter(name='n', value='1', format='float') +# +# opObj11 = procUnitConfObjSousySpectra.addOperation(name='RTIPlot', optype='other') +# opObj11.addParameter(name='id', value='101', format='int') +# opObj11.addParameter(name='wintitle', value='Sousy_RTIPlot', format='str') +# opObj11.addParameter(name='zmin', value='30', format='int') +# opObj11.addParameter(name='zmax', value='100', format='int') +# opObj11.addParameter(name='ymin', value='0', format='int') +# opObj11.addParameter(name='ymax', value='10', format='int') +# opObj11.addParameter(name='xmin', value='10', format='float') +# opObj11.addParameter(name='xmax', value='18', format='float') +# opObj11.addParameter(name='showprofile', value='0', format='int') +# opObj11.addParameter(name='save', value='1', format='int') +# #opObj11.addParameter(name='figfile', value='rti0_sousy.png', format='str') +# opObj11.addParameter(name='figpath', value=figures_path, format='str') + +opObj11 = procUnitConfObjSousySpectra.addOperation(name='SpectraWriter', optype='other') +opObj11.addParameter(name='path', value=wr_path) +opObj11.addParameter(name='blocksPerFile', value='100', format='int') + +print "Escribiendo el archivo XML" +controllerObj.writeXml(filename) +print "Leyendo el archivo XML" +controllerObj.readXml(filename) + +controllerObj.createObjects() +controllerObj.connectObjects() +controllerObj.run() \ No newline at end of file diff --git a/schainpy/scripts/scripts_v/test.cprof b/schainpy/scripts/scripts_v/test.cprof new file mode 100644 index 0000000000000000000000000000000000000000..1df8675772b04b9aa7c82dacc280dc4dfdd6cbfc GIT binary patch literal 1241748 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%0Dp|9UF+=ql;T}r_GGTcb9=GhfJ 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 Sb`&RdKh4VBQ2n_bj)zu8{EWNcqD6-f)r}e{_6N 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 el plot genera +1 en la hora, es decir aparece 18 como máximo + ymin = '0' + ymax = '300' + dbmin = '45' #'60'#'55' #'40' #noise esf eej + dbmax = '65' #'70' #'55' + showSPC = '1' #view plot Spectra + showRTI = '1' #view plot RTI + showNOISE = '0' #view plot NOISE + localtime='1' #para ajustar el horario en las gráficas '0' para dejar en utc + + code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' + nCode = '1' + nBaud = '28' + + nosamp = '1' # oversample for EEJ + + str0 = datetime.date.today() + str1 = str0 + datetime.timedelta(days=1) + str2 = str0 - datetime.timedelta(days=1) + today = str0.strftime("%Y/%m/%d") + tomorrow = str1.strftime("%Y/%m/%d") + yesterday = str2.strftime("%Y/%m/%d") + + #print(today,yesterday,tomorrow) + #path= '/home/soporte/dataAMISR_test/' + path= '/home/soporte/dataAMISR/' + #path= '/home/soporte/dataAMISR/' + #path='/home/soporte/Documentos/' # + + readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate="2019/12/16",#yesterday, #'2014/10/07', + endDate="2019/12/16", #'2014/10/07', + startTime='08:00:00',#'07:00:00', + endTime='08:58:00',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + + #AMISR Processing Unit + procUnitConfObj0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + + opObj10 = procUnitConfObj0.addOperation(name='setRadarFrequency') + opObj10.addParameter(name='frequency', value='445e6', format='float') + + + opObj01 = procUnitConfObj0.addOperation(name='Decoder', optype='other') + opObj01.addParameter(name='code', value=code, format='floatlist') + opObj01.addParameter(name='nCode', value=nCode, format='int') + opObj01.addParameter(name='nBaud', value=nBaud, format='int') + opObj01.addParameter(name='osamp', value=nosamp, format='int') + + + # opObj02 = procUnitConfObj0.addOperation(name='CohInt', optype='other') + # opObj02.addParameter(name='n', value='5', format='int') + + + + + procUnitConfObj1 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObj0.getId()) + procUnitConfObj1.addParameter(name='nFFTPoints', value='16', format='int') + #procUnitConfObj1.addParameter(name='frequency', value='445e6', format='float') #no lo acepta + + + opObj11 = procUnitConfObj1.addOperation(name='IncohInt', optype='other') + opObj11.addParameter(name='n', value='150', format='int') #300 normal value + + opObj11 = procUnitConfObj1.addOperation(name='removeDC') + + + # # + # opObj12 = procUnitConfObj1.addOperation(name='SpectraPlot', optype='external') + # opObj12.addParameter(name='id', value='21', format='int') + # opObj12.addParameter(name='xaxis', value='velocity') + # opObj12.addParameter(name='ymax', value=ymax, format='int') + # opObj12.addParameter(name='showprofile', value='1', format='int') + # opObj12.addParameter(name='wintitle', value='AMISR Beam 0', format='str') + # opObj12.addParameter(name='zmin', value=dbmin, format='int') + # opObj12.addParameter(name='zmax', value=dbmax, format='int') + # opObj12.addParameter(name='save', value=figpath, format='str') + # opObj12.addParameter(name='colormap', value='jet', format='str') + # opObj12.addParameter(name='localtime', value=localtime,format='int') + # opObj12.addParameter(name='show', value = showSPC, format='int') + # + opObj13 = procUnitConfObj1.addOperation(name='getNoise' , optype ='self') + opObj13.addParameter(name='minHei', value='100', format='float') + opObj13.addParameter(name='maxHei', value='280', format='float') + # + # + # + # + # ##Generate *.pdata from AMISR data + # opObj13 = procUnitConfObj1.addOperation(name='SpectraWriter', optype='external') + # opObj13.addParameter(name='path', value=figpath+'SpectraPlot') + # opObj13.addParameter(name='blocksPerFile', value='10', format='int') + # # opObj11.addParameter(name='datatype', value="4", format="int") #no incluir,x revisar + + # opObj31 = procUnitConfObj1.addOperation(name='selectChannels') + # opObj31.addParameter(name='channelList', value='6,7,8,9', format='intlist') + # + opObj15 = procUnitConfObj1.addOperation(name='RTIPlot', optype='external') + opObj15.addParameter(name='id', value='2', format='int') + opObj15.addParameter(name='localtime', value=localtime,format='int') + opObj15.addParameter(name='wintitle', value='RTI', format='str') + #opObj15.addParameter(name='xmin', value=xmin, format='int') + opObj15.addParameter(name='xmax', value=xmax, format='int') #max value =23 + opObj15.addParameter(name='ymin', value=ymin, format='int') + #opObj15.addParameter(name='ymax', value=ymax, format='int') + opObj15.addParameter(name='zmin', value=dbmin, format='int') + opObj15.addParameter(name='zmax', value=dbmax, format='int') + opObj15.addParameter(name='showprofile', value='1', format='int') + opObj15.addParameter(name='show', value = showRTI, format='int') # + #opObj15.addParameter(name='timerange', value=str(24*60*60), format='int')#conflicto datetime + opObj15.addParameter(name='save', value=figpath+'/plots', format='str') + #opObj15.addParameter(name='figpath', value = figpath+'/plots', format='str')#no es necesario + opObj15.addParameter(name='colormap', value='jet', format='str') + opObj15.addParameter(name='channels', value='2,4', format='intlist') + + # opObj14 = procUnitConfObj1.addOperation(name='NoisePlot', optype='external') + # opObj14.addParameter(name='id', value='3', format='int') + # opObj14.addParameter(name='wintitle', value='title0', format='str') + # opObj14.addParameter(name='showprofile', value='0', format='int') + # opObj14.addParameter(name='xmin', value=xmin, format='int') + # opObj14.addParameter(name='xmax', value=xmax, format='int') + # opObj14.addParameter(name='ymin', value=dbmin, format='int') + # opObj14.addParameter(name='ymax', value=dbmax, format='int') + # opObj14.addParameter(name='save', value=figpath+'/plots', format='str') + # opObj14.addParameter(name='localtime', value=localtime,format='int') + # opObj14.addParameter(name='show', value = showNOISE, format='int') + # # + + # opObj18 = procUnitConfObj1.addOperation(name='PublishData', optype='other') + # opObj18.addParameter(name='zeromq', value=1, format='int') + # opObj18.addParameter(name='server', value='tcp://0.0.0.0:8020/', format='str') + # opObj18.addParameter(name='delay', value=0, format='int') + # # + + # patternX = 'local, remote, ext, period, exp_code, sub_exp_code' + # + # opObj18 = procUnitConfObj1.addOperation(name='SendToFTP', optype='external') + # opObj18.addParameter(name='server', value='localhost', format='str') + # opObj18.addParameter(name='username', value='soporte', format='str') + # opObj18.addParameter(name='password', value='soporte', format='str') + # opObj18.addParameter(name='timeout', value=5, format='int') + # + # #opObj18.addParameter(name='patternx', value=patternX, format='str') + # opObj18.addParameter(name='patternlocalfolder', value=figpath, format='str') + # opObj18.addParameter(name='patternremotefolder', value=remotefolder, format='str') + # opObj18.addParameter(name='patternext', value='.png', format='str') + # opObj18.addParameter(name='patternperiod', value=1, format='int') + # opObj18.addParameter(name='patternprotocol', value='ftp', format='str') + # opObj18.addParameter(name='patternsub_ext', value='amisr', format='str') + + # remotefolder = '/Data/myServer/' + # opObj18 = controllerObj.addProcUnit(name='SendToServer', inputId=procUnitConfObj1.getId()) + # opObj18.addParameter(name='server', value='localhost', format='str') + # opObj18.addParameter(name='username', value='soporte', format='str') + # opObj18.addParameter(name='password', value='soporte', format='str') + # opObj18.addParameter(name='localfolder', value=figpath, format='str') + # opObj18.addParameter(name='remotefolder', value=remotefolder, format='str') + # opObj18.addParameter(name='ext', value='.png', format='str') + # opObj18.addParameter(name='period', value=5, format='int') + # opObj18.addParameter(name='protocol', value='ftp', format='str') + # #----------------------------------------------------------------------------------------------- + ##################### + + + # + # procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObj1.getId()) + # opObj16 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other') + # + # + # #Using ParamWriter:::: + # opObj17 = procUnitConfObj2.addOperation(name='ParamWriter', optype='external') + # opObj17.addParameter(name='path', value=figpath+'/param') + # opObj17.addParameter(name='blocksPerFile', value='10', format='int') + # opObj17.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') + # opObj17.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list') + # opObj17.addParameter(name='mode',value='1',format='int') #'0' channels, '1' parameters, '3' table (for meteors) + # + # + + + #print("Escribiendo el archivo XML",controllerObj.writeXml(path +'/'+filename)) + + controllerObj.start() + + #print("Leyendo el archivo XML",controllerObj.readXml(path +'/'+filename)) + +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/test2.py b/schainpy/scripts/test2.py new file mode 100644 index 0000000..e52832f --- /dev/null +++ b/schainpy/scripts/test2.py @@ -0,0 +1,300 @@ + +import os, sys +import time +import datetime + +''' + ESF 10 BEAM +''' +path = os.path.dirname(os.getcwd()) +path = os.path.dirname(path) +sys.path.insert(0, path) + +from schainpy.controller import Project + + +def main(): + desc = "AMISR Experiment" + + filename = "amisr_reader.xml" + + controllerObj = Project() + + controllerObj.setup(id = '191', name='amisr_esf_proc', description=desc) + + + #path = os.path.join(os.environ['HOME'],'amisr') + # path = '/media/signalchain/HD-PXU2/AMISR_JULIA_MODE' + # path = '/media/soporte/E9F4-F053/AMISR/Data/NoiseTest/EEJ' + # path = '/media/soporte/E9F4-F053/AMISR/Data/ESF' + #path = '/mnt/data_amisr' + #path= '/home/soporte/dataAMISR/' + path= '/home/soporte/dataAMISR/' + #path='/home/soporte/Documentos/' # + #path = '/media/soporte/AMISR_104' + #outPath = os.path.join(os.environ['HOME'],'Pictures/amisr/test/proc/esf') + #outPath = '/media/soporte/E9F4-F053/AMISR/Data/JULIA/ESF' + outPath = '/home/soporte/Data/ESF' + remotefolder = "/home/wmaster/graficos" + + xmin = '17' + xmax = '32' + dbmin = '60' #'60'#'55' #'40' #noise esf eej + dbmax = '75' #'70' #'55' + show = '1' + # # code = '1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' + # # code = '1,1,0,1,1,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,0,0,0' + code = '1,-1,-1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,1,-1,1,1,-1,1' + nCode = '1' + nBaud = '28' + nosamp = '2' # oversample + localtime='1' #para ajustar el horario en las gráficas '0' para dejar en utc + + startDate='2020/03/05' + endDate='2020/03/06' + + # str = datetime.date.today() #ONLINE + # str1 = str + datetime.timedelta(days=1) + # str2 = str - datetime.timedelta(days=1) + #today = str.strftime("%Y/%m/%d") + #tomorrow = str1.strftime("%Y/%m/%d") + #yesterday = str2.strftime("%Y/%m/%d") + + l = startDate.split('/') #adding day of the year to outPath + datelist = datetime.date(int(l[0]),int(l[1]),int(l[2])) + DOY = datelist.timetuple().tm_yday + outPath= outPath+"/ESF"+l[0]+str(DOY) + if os.path.exists(outPath): + print("outPath", outPath) + else : + os.mkdir(outPath) + print("Creating...", outPath) + + + readUnitConfObj = controllerObj.addReadUnit(datatype='AMISRReader', + path=path, + startDate=startDate,#'2016/07/12', + endDate=endDate,#'2016/07/13', + startTime='23:35:00',#'07:00:00', + endTime='06:13:59',#'15:00:00', + walk=0, + code = code, + nCode = nCode, + nBaud = nBaud, + timezone='lt', + online=0) + + #AMISR Processing Unit + + #Voltage Processing Unit + procUnitConfObjBeam0 = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + opObj10 = procUnitConfObjBeam0.addOperation(name='setRadarFrequency') + #opObj10.addParameter(name='frequency', value='445e6', format='float') #changed on Dec 3, 15:40h + #opObj10.addParameter(name='frequency', value='430e6', format='float') + + # opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') + # opObj12.addParameter(name='minHei', value='0', format='float') + + + #Noise--> no code + + opObj11 = procUnitConfObjBeam0.addOperation(name='Decoder', optype='other') + opObj11.addParameter(name='code', value=code, format='floatlist') + opObj11.addParameter(name='nCode', value=nCode, format='int') + opObj11.addParameter(name='nBaud', value=nBaud, format='int') + opObj11.addParameter(name='osamp', value=nosamp, format='int') + + + # opObj12 = procUnitConfObjBeam0.addOperation(name='selectHeights') + # opObj12.addParameter(name='minHei', value='50', format='float') + # opObj12.addParameter(name='maxHei', value='200', format='float') + + #Coherent Integration + # opObj11 = procUnitConfObjBeam0.addOperation(name='CohInt', optype='other') + # opObj11.addParameter(name='n', value='2', format='int') + + #it doesn't work scope with Voltage() data + # opObj11 = procUnitConfObjBeam0.addOperation(name='ScopePlot', optype='external') + # opObj11.addParameter(name='id', value='121', format='int') + + #Spectra Unit Processing, getting spectras with nProfiles and nFFTPoints + procUnitConfObjSpectraBeam0 = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjBeam0.getId()) + procUnitConfObjSpectraBeam0.addParameter(name='nFFTPoints', value=16, format='int') + # + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='IncohInt', optype='other') + opObj11.addParameter(name='n', value='150', format='int')#60 + opObj11.addParameter(name='timeInterval', value='30', format='int') + + + # # #RemoveDc + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='removeDC') + + ##Noise Estimation + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='getNoise', optype='self') + # opObj11.addParameter(name='minHei', value='100', format='int') + # opObj11.addParameter(name='maxHei', value='280', format='int') + #opObj11.addParameter(name='minHei', value='15', format='int') + #opObj11.addParameter(name='maxHei', value='20', format='int') + + #--- + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='selectChannels') + opObj11.addParameter(name='channelList', value='6,7,8,9', format='intlist') + + #SpectraPlot + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraPlot', optype='external') + opObj11.addParameter(name='id', value='1', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='1', format='int') + #opObj11.addParameter(name='zmin', value='38', format='int') + opObj11.addParameter(name='zmin', value=dbmin, format='int') + opObj11.addParameter(name='zmax', value=dbmax, format='int') + opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + opObj11.addParameter(name='ftp', value='1', format='int') + opObj11.addParameter(name='wr_period', value='2', format='int') + opObj11.addParameter(name='exp_code', value='21', format='int') + # opObj11.addParameter(name='sub_exp_code', value='4', format='int') + # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # opObj11.addParameter(name='plot_pos', value='0', format='int') + opObj11.addParameter(name='exp_code', value='1', format='int') + opObj11.addParameter(name='sub_exp_code', value='1', format='int') + opObj11.addParameter(name='ftp_wei', value='0', format='int') + opObj11.addParameter(name='plot_pos', value='0', format='int') + #opObj11.addParameter(name='localtime', value=localtime,format='int') + + xrange = int(xmax)-int(xmin) + print(xrange) + #RTIPlot + #title0 = 'RTI AMISR Beam 0' + opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot', optype='external') + opObj11.addParameter(name='id', value='2', format='int') + opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + opObj11.addParameter(name='showprofile', value='0', format='int') + opObj11.addParameter(name='xmin', value=xmin, format='int') + opObj11.addParameter(name='xrange', value=xrange, format='int') + opObj11.addParameter(name='zmin', value=dbmin, format='int') + + opObj11.addParameter(name='zmax', value=dbmax, format='int') + opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + opObj11.addParameter(name='ftp', value='1', format='int') + opObj11.addParameter(name='wr_period', value='2', format='int') + # opObj11.addParameter(name='exp_code', value='21', format='int') + # opObj11.addParameter(name='sub_exp_code', value='4', format='int') + # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # opObj11.addParameter(name='plot_pos', value='0', format='int') + opObj11.addParameter(name='exp_code', value='1', format='int') + opObj11.addParameter(name='sub_exp_code', value='1', format='int') + opObj11.addParameter(name='ftp_wei', value='0', format='int') + opObj11.addParameter(name='plot_pos', value='0', format='int') + #opObj11.addParameter(name='localtime', value=localtime,format='int') + opObj11.addParameter(name='channelList', value='0,1,2,3',format='intlist') + opObj11.addParameter(name='colormap', value='jet', format='str') + #opObj11.addParameter(name='plot_server', value='tcp://0.0.0.0:8080', format='str') + #opObj11.addParameter(name='plot_server', value='localhost', format='str') + + + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='RTIPlot_', optype='external') + # opObj11.addParameter(name='id', value='3', format='int') + # opObj11.addParameter(name='wintitle', value='ESF AMISR otros canales', format='str') + # opObj11.addParameter(name='showprofile', value='1', format='int') + # opObj11.addParameter(name='xmin', value=xmin, format='int') + # opObj11.addParameter(name='xmax', value=xmax, format='int') + # opObj11.addParameter(name='zmin', value=dbmin, format='int') + # + # opObj11.addParameter(name='zmax', value=dbmax, format='int') + # opObj11.addParameter(name='save', value='1', format='int') + # opObj11.addParameter(name='ftp', value='1', format='int') + # opObj11.addParameter(name='wr_period', value='2', format='int') + # opObj11.addParameter(name='figpath', value=outPath+'/plots2', format='str') + # # opObj11.addParameter(name='exp_code', value='21', format='int') + # # opObj11.addParameter(name='sub_exp_code', value='4', format='int') + # # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # # opObj11.addParameter(name='plot_pos', value='0', format='int') + # opObj11.addParameter(name='exp_code', value='1', format='int') + # opObj11.addParameter(name='sub_exp_code', value='1', format='int') + # opObj11.addParameter(name='ftp_wei', value='0', format='int') + # opObj11.addParameter(name='plot_pos', value='0', format='int') + # #opObj11.addParameter(name='localtime', value=localtime,format='int') + # #opObj11.addParameter(name='channelList', value='8,9',format='intlist') + # #opObj15.addParameter(name='colormap', value='jet', format='str') + + + + # # # + # #Noise + #title0 = 'RTI AMISR Beam 0' + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='NoisePlot', optype='external') + # opObj11.addParameter(name='id', value='3', format='int') + # opObj11.addParameter(name='wintitle', value='ESF AMISR', format='str') + # opObj11.addParameter(name='showprofile', value='0', format='int') + # opObj11.addParameter(name='xmin', value=xmin, format='int') + # #opObj11.addParameter(name='xmax', value=xmax, format='int') + # #opObj11.addParameter(name='ymin', value=dbmin, format='int') + # #opObj11.addParameter(name='ymax', value=dbmax, format='int') + # opObj11.addParameter(name='save', value=outPath+'/plots', format='str') + # #opObj11.addParameter(name='show', value = show, format='bool') + # opObj11.addParameter(name='localtime', value=localtime,format='int') + # + # #Generate *.pdata from AMISR data + # opObj11 = procUnitConfObjSpectraBeam0.addOperation(name='SpectraWriter', optype='external') + # opObj11.addParameter(name='path', value=outPath, format='str') + # opObj11.addParameter(name='blocksPerFile', value='10', format='int') + # + # + # #generate moments + # procUnitConfObj2 = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjSpectraBeam0.getId()) + # opObj20 = procUnitConfObj2.addOperation(name='SpectralMoments', optype='other') + # + # opObj12 = procUnitConfObj2.addOperation(name='ParamWriter', optype='external') + # opObj12.addParameter(name='path', value=outPath) + # opObj12.addParameter(name='blocksPerFile', value='10', format='int') + # opObj12.addParameter(name='metadataList',value='type,inputUnit,heightList',format='list') + # opObj12.addParameter(name='dataList',value='moments,data_SNR,utctime',format='list') + # opObj12.addParameter(name='mode',value='1',format='int') + pathF1 = outPath+'/plots/rti' + pathF2 = outPath+'/plots/spc' + ''' PaternX = local, remote, ext, period, exp_code, sub_exp_code + ''' + ftp = procUnitConfObjSpectraBeam0.addOperation(name='SendToFTP', optype='external') + ftp.addParameter(name='server', value='jro-app.igp.gob.pe') + ftp.addParameter(name='username', value='wmaster') + ftp.addParameter(name='password', value='mst2010vhf') + ftp.addParameter(name='pattern1', + value=pathF1+',/home/wmaster/graficos,png,100,17,2', + format='list') + ftp.addParameter(name='pattern2', + value=pathF2+',/home/wmaster/graficos,png,100,17,2', + format='list') + # ftp.addParameter(name='pattern3', + # value='/media/sf_E_DRIVE/plots/winds/wind,/home/wmaster/graficos,png,300,17,2', + # format='list') + # ftp.addParameter(name='pattern4', + # value='/media/sf_E_DRIVE/plots/winds/rain,/home/wmaster/graficos,png,300,17,2', + # format='list') + + # procUnitConfObj2 = controllerObj.addProcUnit(name='SendToServer', inputId=procUnitConfObjSpectraBeam0.getId()) + # procUnitConfObj2.addParameter(name='server', value='jro-app.igp.gob.pe', format='str') + # procUnitConfObj2.addParameter(name='username', value='wmaster', format='str') + # procUnitConfObj2.addParameter(name='password', value='mst2010vhf', format='str') + # procUnitConfObj2.addParameter(name='localfolder', value=outPath+'/plots', format='str') + # procUnitConfObj2.addParameter(name='remotefolder', value=remotefolder, format='str') + # procUnitConfObj2.addParameter(name='ext', value='.png', format='str') + # procUnitConfObj2.addParameter(name='period', value=5, format='int') + # procUnitConfObj2.addParameter(name='protocol', value='ftp', format='str') + #----------------------------------------------------------------------------------------------- + + #---- + + + # print "Escribiendo el archivo XML" + filename="/home/soporte/workspace/schain/schainpy/scripts/joab.xml" + controllerObj.writeXml(filename) + + controllerObj.start() + # print "Leyendo el archivo XML" + # controllerObj.readXml(filename) + +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/test_001.py b/schainpy/scripts/test_001.py new file mode 100644 index 0000000..a77c4dd --- /dev/null +++ b/schainpy/scripts/test_001.py @@ -0,0 +1,189 @@ +#!python +''' +''' + +import os, sys +import datetime +import time + +#path = os.path.dirname(os.getcwd()) +#path = os.path.dirname(path) +#sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "USRP_test" +filename = "USRP_processing.xml" +controllerObj = Project() +controllerObj.setup(id = '191', name='Test_USRP', description=desc) + +############## USED TO PLOT IQ VOLTAGE, POWER AND SPECTRA ############# + +####################################################################### +######PATH DE LECTURA, ESCRITURA, GRAFICOS Y ENVIO WEB################# +####################################################################### +#path = '/media/data/data/vientos/57.2063km/echoes/NCO_Woodman' + + +#path = '/home/soporte/data_hdf5' #### with clock 35.16 db noise +path = '/home/alex/Downloads' +figpath = '/home/alex/Downloads' +#figpath = '/home/soporte/data_hdf5_imag' +#remotefolder = "/home/wmaster/graficos" +####################################################################### +################# RANGO DE PLOTEO###################################### +####################################################################### +dBmin = '30' +dBmax = '60' +xmin = '0' +xmax ='24' +ymin = '0' +ymax = '600' +####################################################################### +########################FECHA########################################## +####################################################################### +str = datetime.date.today() +today = str.strftime("%Y/%m/%d") +str2 = str - datetime.timedelta(days=1) +yesterday = str2.strftime("%Y/%m/%d") +####################################################################### +######################## UNIDAD DE LECTURA############################# +####################################################################### +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate="2020/01/01", #"2020/01/01",#today, + endDate= "2020/12/01", #"2020/12/30",#today, + startTime='00:00:00', + endTime='23:59:59', + delay=0, + #set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') +#opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +####################################################################### +################ OPERACIONES DOMINIO DEL TIEMPO######################## +####################################################################### + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +# +# codigo64='1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0,'+\ +# '1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1' + +#opObj11 = procUnitConfObjA.addOperation(name='setRadarFrequency') +#opObj11.addParameter(name='frequency', value='30e6', format='float') + +#opObj10 = procUnitConfObjA.addOperation(name='Scope', optype='external') +#opObj10.addParameter(name='id', value='10', format='int') +##opObj10.addParameter(name='xmin', value='0', format='int') +##opObj10.addParameter(name='xmax', value='50', format='int') +#opObj10.addParameter(name='type', value='iq') +#opObj10.addParameter(name='ymin', value='-5000', format='int') +##opObj10.addParameter(name='ymax', value='8500', format='int') + +#opObj10 = procUnitConfObjA.addOperation(name='setH0') +#opObj10.addParameter(name='h0', value='-5000', format='float') + +#opObj11 = procUnitConfObjA.addOperation(name='filterByHeights') +#opObj11.addParameter(name='window', value='1', format='int') + +#codigo='1,1,-1,1,1,-1,1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,-1,-1,-1,1,1,1,1,-1,-1,-1' +#opObj11 = procUnitConfObjSousy.addOperation(name='Decoder', optype='other') +#opObj11.addParameter(name='code', value=codigo, format='floatlist') +#opObj11.addParameter(name='nCode', value='1', format='int') +#opObj11.addParameter(name='nBaud', value='28', format='int') + +#opObj11 = procUnitConfObjA.addOperation(name='CohInt', optype='other') +#opObj11.addParameter(name='n', value='100', format='int') + +####################################################################### +########## OPERACIONES DOMINIO DE LA FRECUENCIA######################## +####################################################################### +procUnitConfObjB = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjA.getId()) +procUnitConfObjB.addParameter(name='nFFTPoints', value='100', format='int') +procUnitConfObjB.addParameter(name='nProfiles', value='100', format='int') +#procUnitConfObjSousySpectra.addParameter(name='pairsList', value='(0,0),(1,1),(0,1)', format='pairsList') + +#opObj13 = procUnitConfObjSousySpectra.addOperation(name='removeDC') +#opObj13.addParameter(name='mode', value='2', format='int') + +#opObj11 = procUnitConfObjSousySpectra.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='60', format='float') +####################################################################### +########## PLOTEO DOMINIO DE LA FRECUENCIA############################# +####################################################################### +#SpectraPlot + +##opObj11 = procUnitConfObjB.addOperation(name='SpectraPlot', optype='external') +##opObj11.addParameter(name='id', value='1', format='int') +##opObj11.addParameter(name='wintitle', value='Spectra', format='str') +#opObj11.addParameter(name='xmin', value=-0.01, format='float') +#opObj11.addParameter(name='xmax', value=0.01, format='float') +#opObj11.addParameter(name='zmin', value=dBmin, format='int') +#opObj11.addParameter(name='zmax', value=dBmax, format='int') +#opObj11.addParameter(name='ymin', value=ymin, format='int') +#opObj11.addParameter(name='ymax', value=ymax, format='int') +##opObj11.addParameter(name='showprofile', value='1', format='int') +##opObj11.addParameter(name='save', value=figpath, format='str') +##opObj11.addParameter(name='save_period', value=10, format='int') + + +#RTIPLOT + +##opObj11 = procUnitConfObjB.addOperation(name='RTIPlot', optype='external') +##opObj11.addParameter(name='id', value='2', format='int') +##opObj11.addParameter(name='wintitle', value='RTIPlot', format='str') +#opObj11.addParameter(name='zmin', value=dBmin, format='int') +#opObj11.addParameter(name='zmax', value=dBmax, format='int') +#opObj11.addParameter(name='ymin', value=ymin, format='int') +#opObj11.addParameter(name='ymax', value=ymax, format='int') +##opObj11.addParameter(name='xmin', value=0, format='int') +##opObj11.addParameter(name='xmax', value=23, format='int') + +##opObj11.addParameter(name='showprofile', value='1', format='int') +##opObj11.addParameter(name='save', value=figpath, format='str') +##opObj11.addParameter(name='save_period', value=10, format='int') + + +# opObj11 = procUnitConfObjSousySpectra.addOperation(name='CrossSpectraPlot', optype='other') +# opObj11.addParameter(name='id', value='3', format='int') +# opObj11.addParameter(name='wintitle', value='CrossSpectraPlot', format='str') +# opObj11.addParameter(name='ymin', value=ymin, format='int') +# opObj11.addParameter(name='ymax', value=ymax, format='int') +# opObj11.addParameter(name='phase_cmap', value='jet', format='str') +# opObj11.addParameter(name='zmin', value=dBmin, format='int') +# opObj11.addParameter(name='zmax', value=dBmax, format='int') +# opObj11.addParameter(name='figpath', value=figures_path, format='str') +# opObj11.addParameter(name='save', value=0, format='bool') +# opObj11.addParameter(name='pairsList', value='(0,1)', format='pairsList') +# # +# opObj11 = procUnitConfObjSousySpectra.addOperation(name='CoherenceMap', optype='other') +# opObj11.addParameter(name='id', value='4', format='int') +# opObj11.addParameter(name='wintitle', value='Coherence', format='str') +# opObj11.addParameter(name='phase_cmap', value='jet', format='str') +# opObj11.addParameter(name='xmin', value=xmin, format='float') +# opObj11.addParameter(name='xmax', value=xmax, format='float') +# opObj11.addParameter(name='figpath', value=figures_path, format='str') +# opObj11.addParameter(name='save', value=0, format='bool') +# opObj11.addParameter(name='pairsList', value='(0,1)', format='pairsList') +# +####################################################################### +############### UNIDAD DE ESCRITURA ################################### +####################################################################### +#opObj11 = procUnitConfObjSousySpectra.addOperation(name='SpectraWriter', optype='other') +#opObj11.addParameter(name='path', value=wr_path) +#opObj11.addParameter(name='blocksPerFile', value='50', format='int') + +procUnitConfObjC = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjB.getId()) +procUnitConfObjC.addOperation(name='SpectralMoments') + +procUnitConfObjC.addOperation(name='SpectralMomentsPlot') + + +print ("Escribiendo el archivo XML") +print ("Leyendo el archivo XML") + + + +controllerObj.start() diff --git a/schainpy/scripts/test_002.py b/schainpy/scripts/test_002.py new file mode 100644 index 0000000..f3370d8 --- /dev/null +++ b/schainpy/scripts/test_002.py @@ -0,0 +1,87 @@ +#!python +''' +''' + +import os, sys +import datetime +import time + +#path = os.path.dirname(os.getcwd()) +#path = os.path.dirname(path) +#sys.path.insert(0, path) + +from schainpy.controller import Project + +desc = "USRP_test" +filename = "USRP_processing.xml" +controllerObj = Project() +controllerObj.setup(id = '191', name='Test_USRP', description=desc) + +############## USED TO PLOT IQ VOLTAGE, POWER AND SPECTRA ############# + +####################################################################### +######PATH DE LECTURA, ESCRITURA, GRAFICOS Y ENVIO WEB################# +####################################################################### +#path = '/media/data/data/vientos/57.2063km/echoes/NCO_Woodman' + + +#path = '/home/soporte/data_hdf5' #### with clock 35.16 db noise +path = '/home/alex/Downloads' +figpath = '/home/alex/Downloads' +pathfile = '/home/alex/Downloads/test_rawdata2' + +#figpath = '/home/soporte/data_hdf5_imag' +#remotefolder = "/home/wmaster/graficos" +####################################################################### +################# RANGO DE PLOTEO###################################### +####################################################################### +dBmin = '30' +dBmax = '60' +xmin = '0' +xmax ='24' +ymin = '0' +ymax = '600' +####################################################################### +########################FECHA########################################## +####################################################################### +str = datetime.date.today() +today = str.strftime("%Y/%m/%d") +str2 = str - datetime.timedelta(days=1) +yesterday = str2.strftime("%Y/%m/%d") +####################################################################### +######################## UNIDAD DE LECTURA############################# +####################################################################### +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate="2020/01/01", #"2020/01/01",#today, + endDate= "2020/12/01", #"2020/12/30",#today, + startTime='00:00:00', + endTime='23:59:59', + delay=0, + #set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') +#opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +####################################################################### +################ OPERACIONES DOMINIO DEL TIEMPO######################## +####################################################################### + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + + +opObj12 = procUnitConfObjA.addOperation(name='VoltageWriter', optype='other') +opObj12.addParameter(name='path', value=pathfile) +opObj12.addParameter(name='blocksPerFile', value='120', format='int') +opObj12.addParameter(name='profilesPerBlock', value='300', format='int') + + + + +print ("Escribiendo el archivo XML") +print ("Leyendo el archivo XML") + + + +controllerObj.start() diff --git a/schainpy/scripts/test_amisr_spectra.py b/schainpy/scripts/test_amisr_spectra.py new file mode 100644 index 0000000..1f9a7a3 --- /dev/null +++ b/schainpy/scripts/test_amisr_spectra.py @@ -0,0 +1,78 @@ +from schainpy.controller import Project + +path ='/home/soporte/Data/SpectraPlot' +xmin = '07' +xmax = '17' #-> el plot genera +1 en la hora, es decir aparece 18 como máximo +ymin = '0' +ymax = '300' +dbmin = '45' #'60'#'55' #'40' #noise esf eej +dbmax = '65' #'70' #'55' +showSPC = '1' #view plot Spectra +showRTI = '1' #view plot RTI +showNOISE = '0' #view plot NOISE +localtime='0' #para ajustar el horario en las gráficas '0' para dejar en utc +figpath = '/home/soporte/Data/EEJ' + +def main(): + controller = Project() + controller.setup(id = '100', + name='test', + description='Basic experiment') + read_unit = controller.addReadUnit(datatype='Spectra', + path=path, + startDate='2019/12/16', + endDate='2019/12/16', + startTime='00:00:00', + endTime='23:59:59', + online=0, + timezone='ut', + walk=1) + + proc_unit = controller.addProcUnit(datatype='Spectra', + inputId=read_unit.getId()) + + # op = proc_unit.addOperation(name='selectChannels') + # op.addParameter(name='channelList', value='0,1', format='intlist') + + op = proc_unit.addOperation(name='selectHeights') + op.addParameter(name='minHei', value='50', format='float') + op.addParameter(name='maxHei', value='300', format='float') + + #op = proc_unit.addOperation(name='removeDC') + + + spcPlot = proc_unit.addOperation(name='SpectraPlot', optype='external') + spcPlot.addParameter(name='id', value='21', format='int') + spcPlot.addParameter(name= 'xaxis', value='velocity') + spcPlot.addParameter(name='ymax', value=ymax, format='int') + spcPlot.addParameter(name='showprofile', value='1', format='int') + spcPlot.addParameter(name='wintitle', value='AMISR Beam 0', format='str') + spcPlot.addParameter(name='zmin', value=dbmin, format='int') + spcPlot.addParameter(name='zmax', value=dbmax, format='int') + spcPlot.addParameter(name='save', value=figpath, format='str') + spcPlot.addParameter(name='colormap', value='jet', format='str') + spcPlot.addParameter(name='localtime', value=localtime,format='int') + spcPlot.addParameter(name='show', value = showSPC, format='int') + + rtiPlot = proc_unit.addOperation(name='RTIPlot', optype='external') + rtiPlot.addParameter(name='id', value='2', format='int') + rtiPlot.addParameter(name='localtime', value=localtime,format='int') + rtiPlot.addParameter(name='wintitle', value='RTI', format='str') + #rtiPlot.addParameter(name='xmin', value=xmin, format='int') + rtiPlot.addParameter(name='xmax', value=xmax, format='int') #max value =23 + rtiPlot.addParameter(name='ymin', value=ymin, format='int') + rtiPlot.addParameter(name='zmin', value=dbmin, format='int') + rtiPlot.addParameter(name='zmax', value=dbmax, format='int') + rtiPlot.addParameter(name='showprofile', value='0', format='int') + rtiPlot.addParameter(name='show', value = showRTI, format='int') # + rtiPlot.addParameter(name='save', value=figpath+'/plots', format='str') + rtiPlot.addParameter(name='colormap', value='jet', format='str') + + + controller.start() + +if __name__ == '__main__': + import time + start_time = time.time() + main() + print("--- %s seconds ---" % (time.time() - start_time)) diff --git a/schainpy/scripts/test_sim0001.py b/schainpy/scripts/test_sim0001.py new file mode 100644 index 0000000..fe8e982 --- /dev/null +++ b/schainpy/scripts/test_sim0001.py @@ -0,0 +1,61 @@ +import os,sys +import datetime +import time +from schainpy.controller import Project +path = '/home/alex/Downloads/NEW_WR2' +figpath = path +desc = "Simulator Test" + +controllerObj = Project() + +controllerObj.setup(id='10',name='Test Simulator',description=desc) + +readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', + frequency=9.345e9, + FixRCP_IPP= 60, + Tau_0 = 30, + AcqH0_0=0, + samples=330, + AcqDH_0=0.15, + FixRCP_TXA=0.15, + FixRCP_TXB=0.15, + Fdoppler=200.0, + Hdoppler=36, + Adoppler=300, + delay=0, + online=0, + walk=0) + +#opObj11 = readUnitConfObj.addOperation(name='printInfo') + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +#opObj10 = procUnitConfObjA.addOperation(name='selectChannels') +#opObj10.addParameter(name='channelList', value=[0,1]) +#opObj10.addParameter(name='channelList', value='0',format='intlist') + +opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other') +opObj11.addParameter(name='n', value='32', format='int') +opObj11.addParameter(name='removeDC', value=1, format='int') +''' +type="power" +opObj10 = procUnitConfObjA.addOperation(name='ScopePlot', optype='external') +#opObj10.addParameter(name='id', value='12') +opObj10.addParameter(name='wintitle', value=type ) +opObj10.addParameter(name='type', value=type) +''' + +type="WeatherPower" +opObj10 = procUnitConfObjA.addOperation(name='PulsepairPowerPlot', optype='external') +#opObj10.addParameter(name='id', value='12') +opObj10.addParameter(name='wintitle', value=type ) + +''' +type="WeatherVeloity" + +opObj10 = procUnitConfObjA.addOperation(name='PulsepairVelocityPlot', optype='external') +#opObj10.addParameter(name='id', value='12') +opObj10.addParameter(name='wintitle', value=type ) +''' + +controllerObj.start() diff --git a/schainpy/scripts/test_sim00010.py b/schainpy/scripts/test_sim00010.py new file mode 100644 index 0000000..8710965 --- /dev/null +++ b/schainpy/scripts/test_sim00010.py @@ -0,0 +1,82 @@ +import os, sys +import datetime +import time +from schainpy.controller import Project + +desc = "USRP_test" +filename = "USRP_processing.xml" +controllerObj = Project() +controllerObj.setup(id = '191', name='Test_USRP', description=desc) + +############## USED TO PLOT IQ VOLTAGE, POWER AND SPECTRA ############# +######PATH DE LECTURA, ESCRITURA, GRAFICOS Y ENVIO WEB################# +path = '/home/alex/Downloads/test_rawdata' +figpath = '/home/alex/Downloads/hdf5_test' +######################## UNIDAD DE LECTURA############################# +''' +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate="2020/01/01", #"2020/01/01",#today, + endDate= "2020/12/01", #"2020/12/30",#today, + startTime='00:00:00', + endTime='23:59:59', + delay=0, + #set=0, + online=0, + walk=1) + +''' +readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', + frequency=9.345e9, + FixRCP_IPP= 60, + Tau_0 = 30, + AcqH0_0=0, + samples=330, + AcqDH_0=0.15, + FixRCP_TXA=0.15, + FixRCP_TXB=0.15, + Fdoppler=600.0, + Hdoppler=36, + Adoppler=300,#300 + delay=0, + online=0, + walk=0, + profilesPerBlock=625, + dataBlocksPerFile=100) + #nTotalReadFiles=2) + + +#opObj11 = readUnitConfObj.addOperation(name='printInfo') + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +procUnitConfObjB = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjA.getId()) +procUnitConfObjB.addParameter(name='nFFTPoints', value=625, format='int') +procUnitConfObjB.addParameter(name='nProfiles', value=625, format='int') + +opObj11 = procUnitConfObjB.addOperation(name='removeDC') +opObj11.addParameter(name='mode', value=2) +#opObj11 = procUnitConfObjB.addOperation(name='SpectraPlot') +#opObj11 = procUnitConfObjB.addOperation(name='PowerProfilePlot') + +procUnitConfObjC= controllerObj.addProcUnit(datatype='ParametersProc',inputId=procUnitConfObjB.getId()) +procUnitConfObjC.addOperation(name='SpectralMoments') +#opObj11 = procUnitConfObjC.addOperation(name='PowerPlot') + +''' +opObj11 = procUnitConfObjC.addOperation(name='SpectralMomentsPlot') +#opObj11.addParameter(name='xmin', value=14) +#opObj11.addParameter(name='xmax', value=15) +#opObj11.addParameter(name='save', value=figpath) +opObj11.addParameter(name='showprofile', value=1) +#opObj11.addParameter(name='save_period', value=10) +''' + +opObj10 = procUnitConfObjC.addOperation(name='ParameterWriter') +opObj10.addParameter(name='path',value=figpath) +#opObj10.addParameter(name='mode',value=0) +opObj10.addParameter(name='blocksPerFile',value='100',format='int') +opObj10.addParameter(name='metadataList',value='utctimeInit,timeInterval',format='list') +opObj10.addParameter(name='dataList',value='data_POW,data_DOP,data_WIDTH,data_SNR')#,format='list' + +controllerObj.start() diff --git a/schainpy/scripts/test_sim0002.py b/schainpy/scripts/test_sim0002.py new file mode 100644 index 0000000..7feeec7 --- /dev/null +++ b/schainpy/scripts/test_sim0002.py @@ -0,0 +1,56 @@ +import os,sys +import datetime +import time +from schainpy.controller import Project +path = '/home/alex/Downloads/NEW_WR2/spc16removeDC' +figpath = path +desc = "Simulator Test" + +controllerObj = Project() + +controllerObj.setup(id='10',name='Test Simulator',description=desc) + +readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', + frequency=9.345e9, + FixRCP_IPP= 60, + Tau_0 = 30, + AcqH0_0=0, + samples=330, + AcqDH_0=0.15, + FixRCP_TXA=0.15, + FixRCP_TXB=0.15, + Fdoppler=200.0, + Hdoppler=36, + Adoppler=300, + delay=0, + online=0, + walk=0, + nTotalReadFiles=4) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj10 = procUnitConfObjA.addOperation(name='selectChannels') +opObj10.addParameter(name='channelList', value=[0,1]) + +procUnitConfObjB = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjA.getId()) +procUnitConfObjB.addParameter(name='nFFTPoints', value=200, format='int') +procUnitConfObjB.addParameter(name='nProfiles', value=200, format='int') + +opObj11 = procUnitConfObjB.addOperation(name='removeDC') +opObj11.addParameter(name='mode', value=2) + +#opObj11 = procUnitConfObjB.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='20', format='int') + +procUnitConfObjC = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjB.getId()) +procUnitConfObjC.addOperation(name='SpectralMoments') + +opObj11 = procUnitConfObjC.addOperation(name='SpectralMomentsPlot') +opObj11.addParameter(name='xmax', value=6) +opObj11.addParameter(name='save', value=figpath) +opObj11.addParameter(name='showprofile', value=1) +opObj11.addParameter(name='save_period', value=10) + +controllerObj.start() diff --git a/schainpy/scripts/test_sim0003.py b/schainpy/scripts/test_sim0003.py new file mode 100644 index 0000000..8a43732 --- /dev/null +++ b/schainpy/scripts/test_sim0003.py @@ -0,0 +1,40 @@ +import os,sys +import datetime +import time +from schainpy.controller import Project +path = '/home/alex/Downloads/NEW_WR2/spc16removeDC' +figpath = path +desc = "Simulator Test" + +controllerObj = Project() + +controllerObj.setup(id='10',name='Test Simulator',description=desc) + +readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', + frequency=9.345e9, + FixRCP_IPP= 60, + Tau_0 = 30, + AcqH0_0=0, + samples=330, + AcqDH_0=0.15, + FixRCP_TXA=0.15, + FixRCP_TXB=0.15, + Fdoppler=200.0, + Hdoppler=36, + Adoppler=300, + delay=0, + online=0, + walk=0, + nTotalReadFiles=4) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj10 = procUnitConfObjA.addOperation(name='selectChannels') +opObj10.addParameter(name='channelList', value=[0]) + +opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other') +opObj11.addParameter(name='n', value='32', format='int')#10 +#opObj11.addParameter(name='removeDC', value=1, format='int') + +controllerObj.start() diff --git a/schainpy/scripts/test_sim0004.py b/schainpy/scripts/test_sim0004.py new file mode 100644 index 0000000..539feb9 --- /dev/null +++ b/schainpy/scripts/test_sim0004.py @@ -0,0 +1,39 @@ +import os,sys +import datetime +import time +from schainpy.controller import Project +path = '/home/alex/Downloads/NEW_WR2' +pathfile = '/home/alex/Downloads/test_rawdata' +figpath = path +desc = "Simulator Test" + +controllerObj = Project() + +controllerObj.setup(id='10',name='Test Simulator',description=desc) + +readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', + frequency=9.345e9, + FixRCP_IPP= 60, + Tau_0 = 30.0, + AcqH0_0=0, + samples=330, + AcqDH_0=0.15, + FixRCP_TXA=0.15, + FixRCP_TXB=0.15, + Fdoppler=200.0, + Hdoppler=36, + Adoppler=300, + delay=0, + online=0, + walk=0, + nTotalReadFiles=3) +#opObj11 = readUnitConfObj.addOperation(name='printInfo') +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +#opObj10 = procUnitConfObjA.addOperation(name='selectChannels') +#opObj10.addParameter(name='channelList', value=[0,1]) +#opObj10.addParameter(name='channelList', value='0',format='intlist') +opObj12 = procUnitConfObjA.addOperation(name='VoltageWriter', optype='other') +opObj12.addParameter(name='path', value=pathfile) +opObj12.addParameter(name='blocksPerFile', value='120', format='int') +opObj12.addParameter(name='profilesPerBlock', value='300', format='int') +controllerObj.start() diff --git a/schainpy/scripts/test_sim0005.py b/schainpy/scripts/test_sim0005.py new file mode 100644 index 0000000..fd917af --- /dev/null +++ b/schainpy/scripts/test_sim0005.py @@ -0,0 +1,72 @@ +import os, sys +import datetime +import time +from schainpy.controller import Project + +desc = "USRP_test" +filename = "USRP_processing.xml" +controllerObj = Project() +controllerObj.setup(id = '191', name='Test_USRP', description=desc) + +############## USED TO PLOT IQ VOLTAGE, POWER AND SPECTRA ############# +######PATH DE LECTURA, ESCRITURA, GRAFICOS Y ENVIO WEB################# +path = '/home/alex/Downloads/test_rawdata' +figpath = '/home/alex/Downloads' +################# RANGO DE PLOTEO###################################### +dBmin = '30' +dBmax = '60' +xmin = '0' +xmax ='24' +ymin = '0' +ymax = '600' +########################FECHA########################################## +str = datetime.date.today() +today = str.strftime("%Y/%m/%d") +str2 = str - datetime.timedelta(days=1) +yesterday = str2.strftime("%Y/%m/%d") +######################## UNIDAD DE LECTURA############################# +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate="2020/01/01", #"2020/01/01",#today, + endDate= "2020/12/01", #"2020/12/30",#today, + startTime='00:00:00', + endTime='23:59:59', + delay=0, + #set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') +#opObj11 = readUnitConfObj.addOperation(name='printNumberOfBlock') +####################################################################### +################ OPERACIONES DOMINIO DEL TIEMPO######################## +####################################################################### + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +''' +opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other') +opObj11.addParameter(name='n', value='256', format='int') +opObj11.addParameter(name='removeDC', value=1, format='int') +''' +''' +type="power" +opObj10 = procUnitConfObjA.addOperation(name='ScopePlot', optype='external') +#opObj10.addParameter(name='id', value='12') +opObj10.addParameter(name='wintitle', value=type ) +opObj10.addParameter(name='type', value=type) +106 32 +102 64 +99 128 +99 256s +''' +''' +type="WeatherPower" +opObj10 = procUnitConfObjA.addOperation(name='PulsepairPowerPlot', optype='external') +#opObj10.addParameter(name='id', value='12') +opObj10.addParameter(name='wintitle', value=type ) + +opObj11 = procUnitConfObjA.addOperation(name='PulsepairVelocityPlot', optype='other') +opObj11.addParameter(name='xmax', value=8) +''' + +controllerObj.start() diff --git a/schainpy/scripts/test_sim0006.py b/schainpy/scripts/test_sim0006.py new file mode 100644 index 0000000..1646f20 --- /dev/null +++ b/schainpy/scripts/test_sim0006.py @@ -0,0 +1,39 @@ +import os, sys +import datetime +import time +from schainpy.controller import Project + +desc = "USRP_test" +filename = "USRP_processing.xml" +controllerObj = Project() +controllerObj.setup(id = '191', name='Test_USRP', description=desc) + +############## USED TO PLOT IQ VOLTAGE, POWER AND SPECTRA ############# +######PATH DE LECTURA, ESCRITURA, GRAFICOS Y ENVIO WEB################# +path = '/home/alex/Downloads/test_rawdata' +figpath = '/home/alex/Downloads' +######################## UNIDAD DE LECTURA############################# +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate="2020/01/01", #"2020/01/01",#today, + endDate= "2020/12/01", #"2020/12/30",#today, + startTime='00:00:00', + endTime='23:59:59', + delay=0, + #set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +#opObj10 = procUnitConfObjA.addOperation(name='selectChannels') +#opObj10.addParameter(name='channelList', value=[0,1]) +#opObj10.addParameter(name='channelList', value='0',format='intlist') + +opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other') +opObj11.addParameter(name='n', value='16', format='int') +opObj11.addParameter(name='removeDC', value=1, format='int') + +controllerObj.start() diff --git a/schainpy/scripts/test_sim0007.py b/schainpy/scripts/test_sim0007.py new file mode 100644 index 0000000..92ee891 --- /dev/null +++ b/schainpy/scripts/test_sim0007.py @@ -0,0 +1,53 @@ +import os, sys +import datetime +import time +from schainpy.controller import Project + +desc = "USRP_test" +filename = "USRP_processing.xml" +controllerObj = Project() +controllerObj.setup(id = '191', name='Test_USRP', description=desc) + +############## USED TO PLOT IQ VOLTAGE, POWER AND SPECTRA ############# +######PATH DE LECTURA, ESCRITURA, GRAFICOS Y ENVIO WEB################# +path = '/home/alex/Downloads/test_rawdata' +figpath = '/home/alex/Downloads' +######################## UNIDAD DE LECTURA############################# +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate="2020/01/01", #"2020/01/01",#today, + endDate= "2020/12/01", #"2020/12/30",#today, + startTime='00:00:00', + endTime='23:59:59', + delay=0, + #set=0, + online=0, + walk=1) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +procUnitConfObjB = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjA.getId()) +procUnitConfObjB.addParameter(name='nFFTPoints', value=64, format='int') +procUnitConfObjB.addParameter(name='nProfiles', value=64, format='int') +''' +32 99.96 113.11 529.94s +64 97.3 122.96 326.26 +128 96.29 100.23 230 894 +256 98.65 102.83 182 640 +''' +opObj11 = procUnitConfObjB.addOperation(name='removeDC') +opObj11.addParameter(name='mode', value=2) + +#opObj11 = procUnitConfObjB.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='20', format='int') + +procUnitConfObjC = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjB.getId()) +procUnitConfObjC.addOperation(name='SpectralMoments') +opObj11 = procUnitConfObjC.addOperation(name='SpectralMomentsPlot') +#opObj11.addParameter(name='xmin', value=14) +opObj11.addParameter(name='xmax', value=6) +#opObj11.addParameter(name='save', value=figpath) +opObj11.addParameter(name='showprofile', value=1) +controllerObj.start() diff --git a/schainpy/scripts/test_sim0008.py b/schainpy/scripts/test_sim0008.py new file mode 100644 index 0000000..5d53ccd --- /dev/null +++ b/schainpy/scripts/test_sim0008.py @@ -0,0 +1,80 @@ +import os,sys +import datetime +import time +from schainpy.controller import Project +path = '/home/alex/Downloads/NEW_WR2/spc16removeDC' +figpath = path +desc = "Simulator Test" + +controllerObj = Project() + +controllerObj.setup(id='10',name='Test Simulator',description=desc) + +readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', + frequency=9.345e9, + FixRCP_IPP= 60, + Tau_0 = 30, + AcqH0_0=0, + samples=330, + AcqDH_0=0.15, + FixRCP_TXA=0.15, + FixRCP_TXB=0.15, + Fdoppler=600.0, + Hdoppler=36, + Adoppler=300, + delay=0, + online=0, + walk=0, + nTotalReadFiles=3) + +opObj11 = readUnitConfObj.addOperation(name='printInfo') + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) + +opObj10 = procUnitConfObjA.addOperation(name='selectChannels') +opObj10.addParameter(name='channelList', value=[0]) + +procUnitConfObjB = controllerObj.addProcUnit(datatype='SpectraProc', inputId=procUnitConfObjA.getId()) +procUnitConfObjB.addParameter(name='nFFTPoints', value=300, format='int') +procUnitConfObjB.addParameter(name='nProfiles', value=300, format='int') + +opObj11 = procUnitConfObjB.addOperation(name='removeDC') +opObj11.addParameter(name='mode', value=2) + +#opObj11 = procUnitConfObjB.addOperation(name='IncohInt', optype='other') +#opObj11.addParameter(name='n', value='10', format='int') + +#opObj11 = procUnitConfObjB.addOperation(name='SpectraPlot') +#opObj11 = procUnitConfObjB.addOperation(name='PowerProfilePlot') +#opObj11.addParameter(name='xmin', value=13) +#opObj11.addParameter(name='xmax', value=.4) +#opObj11 = procUnitConfObjB.addOperation(name='NoisePlot') +#opObj11.addParameter(name='xmin', value=13) +#opObj11.addParameter(name='xmax', value=14) + + +procUnitConfObjC = controllerObj.addProcUnit(datatype='ParametersProc', inputId=procUnitConfObjB.getId()) +procUnitConfObjC.addOperation(name='SpectralMoments') + +opObj11 = procUnitConfObjC.addOperation(name='SpectralMomentsPlot') +#opObj11.addParameter(name='xmin', value=14) +#opObj11.addParameter(name='xmax', value=15) +#opObj11.addParameter(name='save', value=figpath) +opObj11.addParameter(name='showprofile', value=1) +#opObj11.addParameter(name='save_period', value=10) +''' +opObj11 = procUnitConfObjC.addOperation(name='SnrPlot') +opObj11.addParameter(name='zmin', value=-10) +opObj11.addParameter(name='zmax', value=40) +#opObj11.addParameter(name='save', value=figpath) +#opObj11.addParameter(name='showprofile', value=1) +#opObj11.addParameter(name='save_period', value=10) +''' +opObj11 = procUnitConfObjC.addOperation(name='SpectralWidthPlot') +opObj11.addParameter(name='xmin', value=5) +opObj11.addParameter(name='xmax', value=6) +#opObj11.addParameter(name='save', value=figpath) +#opObj11.addParameter(name='showprofile', value=1) +#opObj11.addParameter(name='save_period', value=10) + +controllerObj.start() diff --git a/schainpy/scripts/test_sim0009.py b/schainpy/scripts/test_sim0009.py new file mode 100644 index 0000000..43d6640 --- /dev/null +++ b/schainpy/scripts/test_sim0009.py @@ -0,0 +1,73 @@ +import os,sys +import datetime +import time +from schainpy.controller import Project +path = '/home/alex/Downloads/NEW_WR2/spc16removeDC' +figpath = path +desc = "Simulator Test" + +controllerObj = Project() + +controllerObj.setup(id='10',name='Test Simulator',description=desc) + +readUnitConfObj = controllerObj.addReadUnit(datatype='SimulatorReader', + frequency=9.345e9, + FixRCP_IPP= 60, + Tau_0 = 30, + AcqH0_0=0, + samples=330, + AcqDH_0=0.15, + FixRCP_TXA=0.15, + FixRCP_TXB=0.15, + Fdoppler=600.0, + Hdoppler=36, + Adoppler=300,#300 + delay=0, + online=0, + walk=0, + profilesPerBlock=625, + dataBlocksPerFile=100)#,#nTotalReadFiles=2) +''' +readUnitConfObj = controllerObj.addReadUnit(datatype='VoltageReader', + path=path, + startDate="2020/01/01", #"2020/01/01",#today, + endDate= "2020/12/01", #"2020/12/30",#today, + startTime='00:00:00', + endTime='23:59:59', + delay=0, + #set=0, + online=0, + walk=1) +''' +opObj11 = readUnitConfObj.addOperation(name='printInfo') + +procUnitConfObjA = controllerObj.addProcUnit(datatype='VoltageProc', inputId=readUnitConfObj.getId()) +#opObj11 = procUnitConfObjA.addOperation(name='CohInt', optype='other') +#opObj11.addParameter(name='n', value='10', format='int') + +#opObj10 = procUnitConfObjA.addOperation(name='selectChannels') +#opObj10.addParameter(name='channelList', value=[0]) +opObj11 = procUnitConfObjA.addOperation(name='PulsePairVoltage', optype='other') +opObj11.addParameter(name='n', value='625', format='int')#10 +opObj11.addParameter(name='removeDC', value=1, format='int') + +#opObj11 = procUnitConfObjA.addOperation(name='PulsepairPowerPlot', optype='other') +#opObj11 = procUnitConfObjA.addOperation(name='PulsepairSignalPlot', optype='other') + + +#opObj11 = procUnitConfObjA.addOperation(name='PulsepairVelocityPlot', optype='other') +#opObj11.addParameter(name='xmax', value=8) + +#opObj11 = procUnitConfObjA.addOperation(name='PulsepairSpecwidthPlot', optype='other') + +procUnitConfObjB= controllerObj.addProcUnit(datatype='ParametersProc',inputId=procUnitConfObjA.getId()) + + +opObj10 = procUnitConfObjB.addOperation(name='ParameterWriter') +opObj10.addParameter(name='path',value=figpath) +#opObj10.addParameter(name='mode',value=0) +opObj10.addParameter(name='blocksPerFile',value='100',format='int') +opObj10.addParameter(name='metadataList',value='utctimeInit,timeInterval',format='list') +opObj10.addParameter(name='dataList',value='dataPP_POW,dataPP_DOP,dataPP_SNR,dataPP_WIDTH')#,format='list' + +controllerObj.start() diff --git a/schainpy/scripts/wr_integrador.py b/schainpy/scripts/wr_integrador.py new file mode 100644 index 0000000..d719cb3 --- /dev/null +++ b/schainpy/scripts/wr_integrador.py @@ -0,0 +1,162 @@ +import os,numpy,h5py +from shutil import copyfile + +def isNumber(str): + try: + float(str) + return True + except: + return False + +def getfirstFilefromPath(path,meta,ext): + validFilelist = [] + fileList = os.listdir(path) + if len(fileList)<1: + return None + # meta 1234 567 8-18 BCDE + # H,D,PE YYYY DDD EPOC .ext + + for thisFile in fileList: + if meta =="PE": + try: + number= int(thisFile[len(meta)+7:len(meta)+17]) + except: + print("There is a file or folder with different format") + if meta == "D": + try: + number= int(thisFile[8:11]) + except: + print("There is a file or folder with different format") + + if not isNumber(str=number): + continue + if (os.path.splitext(thisFile)[-1].lower() != ext.lower()): + continue + validFilelist.sort() + validFilelist.append(thisFile) + if len(validFilelist)>0: + validFilelist = sorted(validFilelist,key=str.lower) + return validFilelist + return None + +def gettimeutcfromDirFilename(path,file): + dir_file= path+"/"+file + fp = h5py.File(dir_file,'r') + epoc = fp['Metadata'].get('utctimeInit')[()] + fp.close() + return epoc + +def getDatavaluefromDirFilename(path,file,value): + dir_file= path+"/"+file + fp = h5py.File(dir_file,'r') + array = fp['Data'].get(value)[()] + fp.close() + return array + + +#·········· Velocidad de Pedestal················· +w = input ("Ingresa velocidad de Pedestal: ") +w = 4 +w = float(w) +#·········· Resolucion minimo en grados··········· +alfa = input ("Ingresa resolucion minima en grados: ") +alfa = 1 +alfa = float(alfa) +#·········· IPP del Experimento ·················· +IPP = input ("Ingresa el IPP del experimento: ") +IPP = 0.0004 +IPP = float(IPP) +#·········· MODE ·················· +mode = input ("Ingresa el MODO del experimento T or F: ") +mode = "T" +mode = str(mode) + +#·········· Tiempo en generar la resolucion min··· +#············ MCU ·· var_ang = w * (var_tiempo)··· +var_tiempo = alfa/w +#·········· Tiempo Equivalente en perfiles········ +#·········· var_tiempo = IPP * ( num_perfiles )· +num_perfiles = int(var_tiempo/IPP) + +#··········DATA PEDESTAL·························· +dir_pedestal = "/home/alex/Downloads/pedestal" +#·········· DATA ADQ······························ +if mode=="T": + dir_adq = "/home/alex/Downloads/hdf5_testPP/d2020194" # Time domain +else: + dir_adq = "/home/alex/Downloads/hdf5_test/d2020194" # Frequency domain + +print( "Velocidad angular :", w) +print( "Resolucion minima en grados :", alfa) +print( "Numero de perfiles equivalente:", num_perfiles) +print( "Mode :", mode) + +#············ First File············· +list_pedestal = getfirstFilefromPath(path=dir_pedestal,meta="PE",ext=".hdf5") +list_adq = getfirstFilefromPath(path=dir_adq ,meta="D",ext=".hdf5") + +#············ utc time ·············· +utc_pedestal= gettimeutcfromDirFilename(path=dir_pedestal,file=list_pedestal[0]) +utc_adq = gettimeutcfromDirFilename(path=dir_adq ,file=list_adq[0]) + +print("utc_pedestal :",utc_pedestal) +print("utc_adq :",utc_adq) +#·············Relacion: utc_adq (+/-) var_tiempo*nro_file= utc_pedestal +time_Interval_p = 0.01 +n_perfiles_p = 100 +if utc_adq>utc_pedestal: + nro_file = int((int(utc_adq) - int(utc_pedestal))/(time_Interval_p*n_perfiles_p)) + ff_pedestal = list_pedestal[nro_file] + utc_pedestal = gettimeutcfromDirFilename(path=dir_pedestal,file=ff_pedestal) + nro_key_p = int((utc_adq-utc_pedestal)/time_Interval_p) + if utc_adq >utc_pedestal: + ff_pedestal = ff_pedestal + else: + nro_file = nro_file-1 + ff_pedestal = list_pedestal[nro_file] + angulo = getDatavaluefromDirFilename(path=dir_pedestal,file=ff_pedestal,value="azimuth") + nro_key_p = int((utc_adq-utc_pedestal)/time_Interval_p) + print("nro_file :",nro_file) + print("name_file :",ff_pedestal) + print("utc_pedestal_file :",utc_pedestal) + print("nro_key_p :",nro_key_p) + print("utc_pedestal_init :",utc_pedestal+nro_key_p*time_Interval_p) + print("angulo_array :",angulo[nro_key_p]) +#4+25+25+25+21 +#while True: +list_pedestal = getfirstFilefromPath(path=dir_pedestal,meta="PE",ext=".hdf5") +list_adq = getfirstFilefromPath(path=dir_adq ,meta="D",ext=".hdf5") + +nro_file = nro_file #10 +nro_key_perfil = nro_key_p +blocksPerFile = 100 +wr_path = "/home/alex/Downloads/hdf5_wr/" +# Lectura de archivos de adquisicion para adicion de azimuth +for thisFile in range(len(list_adq)): + print("thisFileAdq",thisFile) + angulo_adq = numpy.zeros(blocksPerFile) + tmp = 0 + for j in range(blocksPerFile): + iterador = nro_key_perfil + 25*(j-tmp) + if iterador < n_perfiles_p: + nro_file = nro_file + else: + nro_file = nro_file+1 + tmp = j + iterador = nro_key_perfil + ff_pedestal = list_pedestal[nro_file] + angulo = getDatavaluefromDirFilename(path=dir_pedestal,file=ff_pedestal,value="azimuth") + angulo_adq[j]= angulo[iterador] + copyfile(dir_adq+"/"+list_adq[thisFile],wr_path+list_adq[thisFile]) + fp = h5py.File(wr_path+list_adq[thisFile],'a') + grp = fp.create_group("Pedestal") + dset = grp.create_dataset("azimuth" , data=angulo_adq) + fp.close() + print("Angulo",angulo_adq) + print("Angulo",len(angulo_adq)) + nro_key_perfil=iterador + 25 + if nro_key_perfil< n_perfiles_p: + nro_file = nro_file + else: + nro_file = nro_file+1 + nro_key_perfil= nro_key_p diff --git a/schainpy/speedTools.bash b/schainpy/speedTools.bash deleted file mode 100644 index 70024c9..0000000 --- a/schainpy/speedTools.bash +++ /dev/null @@ -1,11 +0,0 @@ -#Use this script in order to find the slowest module or function in your python code. -#Reference: http://lukauskas.co.uk/articles/2014/02/12/how-to-make-python-faster-without-trying-that-much/ - -#!/bin/sh - -script = "testRawData.py" -output = "profile.pdf" - -python -m cProfile -o profile.pstats $script - -gprof2dot -f pstats profile.pstats | dot -Tpdf -o $output \ No newline at end of file diff --git a/schainpy/zerorpc/MyClient01.py b/schainpy/zerorpc/MyClient01.py deleted file mode 100644 index 11bbfb5..0000000 --- a/schainpy/zerorpc/MyClient01.py +++ /dev/null @@ -1,147 +0,0 @@ -''' -Created on Jul 11, 2014 - -@author: roj-idl71 -''' -import time -from gevent import sleep - -import zerorpc -from schainpy.model import * -from schainpy.serializer.DataTranslate import serial2Obj, serial2Dict -# import schainpy.model.io.jroIO_usrp - -def createObjVolt(): - ''' - This function creates a processing object "VoltProc" with some operations. - such as: "CohInt", "Scope", etc - These class are found inside schainpy.model.proc and schainpy.model.graphics - ''' - procObj = VoltageProc() - - opObj = CohInt() - procObj.addOperation(opObj, 1) - - opObj = Scope() - procObj.addOperation(opObj, 2) - - return procObj - -def createObjSpec(): - ''' - This function creates a processing object "SpecProc" with some operation objects - such as: "IncohInt", "SpectraPlot", "RTIPlot", etc - These class are found inside schainpy.model.proc and schainpy.model.graphics - ''' - - procObj = SpectraProc() - - opObj = IncohInt() - procObj.addOperation(opObj, objId = 1) - - opObj = SpectraPlot() - procObj.addOperation(opObj, objId = 2) - - opObj = RTIPlot() - procObj.addOperation(opObj, objId = 3) - - opObj = SpectraPlot() - procObj.addOperation(opObj, objId = 4) - - opObj = RTIPlot() - procObj.addOperation(opObj, objId = 5) - - return procObj - -def processingSpec(procObj, dataInObj): - - procObj.setInput(dataInObj) - procObj.run(nFFTPoints = 16) - - procObj.call(opType = "external", - opId = 1, - n=1) - - procObj.call(opType = "external", - opId = 2, - id=191, - zmin=-100, - zmax=-40) - - procObj.call(opType = "external", - opId = 3, - id=192, - zmin=-100, - zmax=-40, - timerange=10*60) - -# procObj.call(opType = "self", -# opName = "selectChannels", -# channelList = [0,1]) -# -# procObj.call(opType = "self", -# opName = "selectHeights", -# minHei = 300, -# maxHei = 400) -# -# procObj.call(opType = "external", -# opId = 4, -# id=193, -# zmin=-100, -# zmax=-40) -# -# procObj.call(opType = "external", -# opId = 5, -# id=194, -# zmin=-100, -# zmax=-40, -# timerange=10*60) - -def printSpeed(deltaTime, mySerial): - - #################### - size = len(mySerial)/1024. - vel = 1.0*size / deltaTime - - print("Index [", replayerObj.getProfileIndex(), "]: ", end=' ') - print("Total time %5.2f ms, Data size %5.2f KB, Speed %5.2f MB/s" %(deltaTime, size, vel)) - #################### - -if __name__ == '__main__': - - procObj = createObjSpec() - - replayerObj = zerorpc.Client() - replayerObj.connect("tcp://127.0.0.1:4242") - - serializer = replayerObj.getSerializer() - - ini = time.time() - mySerialMetadata = replayerObj.getSerialMetaData() - deltaTime = (time.time() - ini)*1024 - - printSpeed(deltaTime, mySerialMetadata) - - myMetaDict = serial2Dict(mySerialMetadata, - serializer = serializer) -# print myMetaDict - while True: - ini = time.time() - mySerialData = replayerObj.getSerialData() - deltaTime = (time.time() - ini)*1024 - - if not mySerialData: - print("No more data") - break - -# myDataDict = SERIALIZER.loads(mySerialData) -# print myDataDict -# continue - - printSpeed(deltaTime, mySerialData) - - dataInObj = serial2Obj(mySerialData, - metadataDict=myMetaDict, - serializer = serializer) - processingSpec(procObj, dataInObj) - sleep(1e-1) \ No newline at end of file diff --git a/schainpy/zerorpc/MyClient02.py b/schainpy/zerorpc/MyClient02.py deleted file mode 100644 index 246fc39..0000000 --- a/schainpy/zerorpc/MyClient02.py +++ /dev/null @@ -1,13 +0,0 @@ -''' -Created on Jul 11, 2014 - -@author: roj-idl71 -''' - -import zerorpc - -if __name__ == '__main__': - c = zerorpc.Client() - c.connect("tcp://127.0.0.1:4242") - c.load("file2") # AAAHH! The previously loaded model gets overwritten here! - print(c.getModelName()) \ No newline at end of file diff --git a/schainpy/zerorpc/MyServer.py b/schainpy/zerorpc/MyServer.py deleted file mode 100644 index 8d40540..0000000 --- a/schainpy/zerorpc/MyServer.py +++ /dev/null @@ -1,33 +0,0 @@ -''' -Created on Jul 11, 2014 - -@author: roj-idl71 -''' -# import sys -import datetime -import zerorpc - -from schainpy.model.io.jrodataIO import USRPReaderAPI -# from schainpy.serializer.DataTranslate import serial2Obj - -if __name__ == '__main__': - - replayerObj = USRPReaderAPI(serializer='msgpack') - - replayerObj.setup(path='/Volumes/DATA/haystack/passive_radar/', - startDate=datetime.date(2000,1,1), - endDate=datetime.date(2015,1,1), - startTime=datetime.time(0,0,0), - endTime=datetime.time(23,59,59), - online=1, - nSamples=500, - channelList = [0,1,2,3,4,5,6,7]) - - replayerObj.start() - - print("Initializing 'zerorpc' server") - s = zerorpc.Server(replayerObj) - s.bind("tcp://0.0.0.0:4242") - s.run() - - print("End") \ No newline at end of file diff --git a/schainpy/zerorpc/__init__.py b/schainpy/zerorpc/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/schainpy/zerorpc/__init__.py +++ /dev/null diff --git a/schainpy/zerorpc/test/testServer.py b/schainpy/zerorpc/test/testServer.py deleted file mode 100644 index 29517ca..0000000 --- a/schainpy/zerorpc/test/testServer.py +++ /dev/null @@ -1,177 +0,0 @@ -''' -Created on Jul 15, 2014 - -@author: roj-idl71 -''' - -import sys -import yaml -import numpy -import jsonpickle - -# import schainpy.serializer.DynamicSerializer as DynamicSerializer - - - -def isNotClassVar(myObj): - - return not hasattr(myObj,'__dict__') - -def isDictFormat(thisValue): - - if type(thisValue) != type({}): - return False - - if '__name__' not in list(thisValue.keys()): - return False - - return True - -def obj2Dict(myObj): - - myDict = {} - - myDict['__name__'] = myObj.__class__.__name__ - - for thisKey, thisValue in list(myObj.__dict__.items()): - - if isNotClassVar(thisValue): - myDict[thisKey] = thisValue - continue - - ## If this value is another class instance - myNewDict = obj2Dict(thisValue) - myDict[thisKey] = myNewDict - - return myDict - -def dict2Obj(myDict): - ''' - ''' - - if '__name__' not in list(myDict.keys()): - return None - - className = eval(myDict['__name__']) - - myObj = className() - - for thisKey, thisValue in list(myDict.items()): - - if thisKey == '__name__': - continue - - if not isDictFormat(thisValue): - setattr(myObj, thisKey, thisValue) - continue - - myNewObj = dict2Obj(thisValue) - setattr(myObj, thisKey, myNewObj) - - return myObj - -class myTestClass3(object): - - def __init__(self): - ''' - ''' - self.y1 = 'y1' - self.y2 = 'y2' - -class myTestClass2(object): - - def __init__(self): - ''' - ''' - self.x1 = 'x1' - self.x2 = 'x2' - self.otherObj = myTestClass3() - - -class myTestClass(object): - - flagNoData = True - value1 = 1 - value2 = 2 - myObj = None - - def __init__(self): - - ''' - ''' - self.flagNoData = True - self.value1 = 1 - self.value2 = 2 - self.myObj = myTestClass2() - - def get_dtype(self): - - ''' - ''' - return self.value1 - - def set_dtype(self, value): - - ''' - ''' - - self.value1 = value - - dtype = property(get_dtype, set_dtype) - -def myMsgPackTest(): - - import msgpack - import msgpack_numpy as m - import numpy as np - - x = np.random.rand(5) - x_enc = m.encode(x) - x_rec = m.decode(x_enc) - - print(x_rec) -# -# x_enc = msgpack.packb(x, default=m.encoder) -# x_rec = msgpack.unpackb(x_enc, object_hook=m.decoder) - -if __name__ == '__main__': - - myMsgPackTest() - - sys.exit() - - serializerObj = DynamicSerializer.DynamicSerializer('json') - serializerObj = jsonpickle - - myTestObj = myTestClass() - - myTestObj.flagNoData = False - myTestObj.value1 = [1+3.4j,4,'5',] - myTestObj.value2 = {'x2': numpy.complex(1,2),'x1': 'x1'} -# myTestObj.myObj.x2 = numpy.arange(15, dtype=numpy.complex) - - myDict = obj2Dict(myTestObj) - - myNewObj = dict2Obj(myDict) - -# print myDict -# print myTestObj.__dict__ -# print myNewObj.__dict__ - -# sys.exit() - print(myDict) - - newSerial = serializerObj.encode(myDict) -# print newSerial - - newDict = serializerObj.decode(newSerial) - print(newDict) - - myNewObj = dict2Obj(newDict) - - print() - print() - print(50*'###') - print(myTestObj.__dict__) - print(myNewObj.__dict__) - \ No newline at end of file diff --git a/schainpy/zerorpc/test/testServer_Voltage.py b/schainpy/zerorpc/test/testServer_Voltage.py deleted file mode 100644 index 8b2daca..0000000 --- a/schainpy/zerorpc/test/testServer_Voltage.py +++ /dev/null @@ -1,46 +0,0 @@ -''' -Created on Jul 15, 2014 - -@author: roj-idl71 -''' - -import sys -import pickle - -from schainpy.model.data.jrodata import Voltage -# from schainpy.model.io.jrodataIO import USRPReaderMP -from schainpy.serializer.DynamicSerializer import DynamicSerializer -from schainpy.serializer.DataTranslate import obj2Dict, dict2Obj - - -if __name__ == "__main__": - - serializerObj = DynamicSerializer('yaml') - - myTestObj = Voltage() - - myDict = obj2Dict(myTestObj) - - myNewObj = dict2Obj(myDict) - -# print myDict -# print myTestObj.__dict__ -# print myNewObj.__dict__ -# -# print -# print '#############################' -# print -# newValue = serializerObj.dumps(myDict) -# print newValue -# -# newValue = serializerObj.loads(newValue) -# print newValue - - - print('###########CPICKLE##################') - print(myDict) - newSerialized = pickle.dumps(myDict, 2) -# print newValue - - newDict = pickle.loads(newSerialized) - print(newDict) \ No newline at end of file diff --git a/setup.py b/setup.py index 9516c75..5fa2a77 100644 --- a/setup.py +++ b/setup.py @@ -1,14 +1,21 @@ -''' -Created on Jul 16, 2014 +# Copyright (c) 2012-2020 Jicamarca Radio Observatory +# All rights reserved. +# +# Distributed under the terms of the BSD 3-clause license. +"""schainpy is an open source library to read, write and process radar data -@author: Miguel Urco -''' +Signal Chain is a radar data processing library wich includes modules to read, +and write different files formats, besides modules to process and visualize the +data. +""" import os from setuptools import setup, Extension from setuptools.command.build_ext import build_ext as _build_ext from schainpy import __version__ +DOCLINES = __doc__.split("\n") + class build_ext(_build_ext): def finalize_options(self): _build_ext.finalize_options(self) @@ -17,47 +24,64 @@ class build_ext(_build_ext): import numpy self.include_dirs.append(numpy.get_include()) -setup(name = "schainpy", - version = __version__, - description = "Python tools to read, write and process Jicamarca data", - author = "Miguel Urco", - author_email = "miguel.urco@jro.igp.gob.pe", - url = "http://jro.igp.gob.pe", - packages = {'schainpy', - 'schainpy.model', - 'schainpy.model.data', - 'schainpy.model.graphics', - 'schainpy.model.io', - 'schainpy.model.proc', - 'schainpy.model.serializer', - 'schainpy.model.utils', - 'schainpy.utils', - 'schainpy.gui', - 'schainpy.gui.figures', - 'schainpy.gui.viewcontroller', - 'schainpy.gui.viewer', - 'schainpy.gui.viewer.windows', - 'schainpy.cli'}, - ext_package = 'schainpy', - package_data = {'': ['schain.conf.template'], - 'schainpy.gui.figures': ['*.png', '*.jpg'], - 'schainpy.files': ['*.oga'] - }, - include_package_data = False, - scripts = ['schainpy/gui/schainGUI'], - entry_points = { - 'console_scripts': [ - 'schain = schainpy.cli.cli:main', - ], - }, - cmdclass = {'build_ext': build_ext}, - setup_requires = ["numpy >= 1.11.2"], - install_requires = [ - "scipy", - "h5py", - "matplotlib", - "pyzmq", - "fuzzywuzzy", - "click", - ], +setup( + name = "schainpy", + version = __version__, + description = DOCLINES[0], + long_description = "\n".join(DOCLINES[2:]), + url = "https://github.com/JRO-Peru/schainpy", + author = "Jicamarca Radio Observatory", + author_email = "jro-developers@jro.igp.gob.pe", + license="BSD-3-Clause", + classifiers=[ + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: BSD License", + "Operating System :: MacOS :: MacOS X", + "Operating System :: POSIX :: Linux", + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Topic :: Scientific/Engineering", + ], + packages = { + 'schainpy', + 'schainpy.model', + 'schainpy.model.data', + 'schainpy.model.graphics', + 'schainpy.model.io', + 'schainpy.model.proc', + 'schainpy.model.utils', + 'schainpy.utils', + 'schainpy.gui', + 'schainpy.cli', + }, + package_data = {'': ['schain.conf.template'], + 'schainpy.files': ['*.oga'] + }, + include_package_data = False, + scripts = ['schainpy/gui/schainGUI'], + entry_points = { + 'console_scripts': [ + 'schain = schainpy.cli.cli:main', + ], + }, + cmdclass = {'build_ext': build_ext}, + ext_modules=[ + Extension("schainpy.model.data._noise", ["schainc/_noise.c"]), + ], + setup_requires = ["numpy"], + install_requires = [ + "scipy", + "h5py", + "matplotlib", + "pyzmq", + "fuzzywuzzy", + "click", + ], )

WH*XKFNC9%8>6 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