Commit c901a8f6 authored by Carolina Jiménez Gómez's avatar Carolina Jiménez Gómez
Browse files

Agrega proyecto

parents
# Densitometría Cerebral
El problema está relacionado con pacientes que han sufrido traumatismo cerebral. Estos traumas son de mucha atención porque los pacientes se pueden sentir bien después del accidente y no mostrar síntomas postraumáticos, pero la presión intracraneal puede aumentar sin saberlo y causar la muerte. Otro problema sobre el que no hay mucha información, y es el tema central de esta investigación, está relacionado con una serie de casos en los que después de bajar la presión intracraneal gran cantidad de pacientes mueren también.
La hipótesis propuesta por los especialistas médicos está relacionada con cambios en la densidad del tejido cerebral después del trauma cerebral. Es decir, que de alguna manera la alta presión podría comprimir el tejido y así aumentar su densidad y simplemente cuando la presión vuelve a la normalidad el tejido no se recupera (Es la hipótesis que se desea confirmar con la herramienta de software).
La Tomografía Axial Computarizada permite medir esta densidad de los tejidos, pero los médicos solo ven la imagen y no pueden obtener valores cuantitativos que les permita comparar objetivamente.
La propuesta para nosotros entonces se divide en:
Desarrollar una herramienta que entregue un valor cuantitativo de la densidad (en unidades de radiodensidad u otras) de un pixel a partir de los datos entregados por el estándar DICOM sobre los parámetros de adquisición de la imagen médica.
Desarrollar una metodología que permita segmentar las imágenes de TAC en cerebro, hueso y posiblemente otras regiones. (Algoritmos de segmentación)
Cuantificar un valor promedio de la densidad en estas regiones segmentadas a partir de la intensidad de cada pixel de la imagen.
__________________________________________
## Herramientas Utilizadas
A continuación se explicarán las herramientas utilizadas en este proyecto y el proceso de instalación de cada una de ellas.
El proceso de instalación se mostrará para los usuarios de Ubuntu y Debian, para otras distribuciones de Linux el proceso es similar.
**Dependencias**
* Python 3.5
* Nibabel 1.0 - 1.4
* NumPy 1.3 - 1.7
* Matplotlib
* Node.js
* Nipype (FSL)
* BET
* Vtk-dicom-tools
* Node.js
* Npm
Antes de instalar las herramientas es necesario actualizar el sistema.
Para actualizar el sistema en Ubuntu y Debian:
```
sudo apt-get update
sudo apt-get upgrade
```
### [Python](https://www.python.org/)
Python es un lenguaje de programación interpretado, de tipado dinámico y multiplataforma. Soporta los paradigmas de programación orientado a objetos, funcional, imperativo. Es un lenguaje sencillo de utilizar y que trae con sigo muchas herramientas necesarias para el desarrollo de este proyecto, como librerías para el tratamiento de neuro-imágenes y en general de neurología, que serán descritas más adelante.
Para este proyecto se utiliza la versión 3.4 o 3.5, que viene con funciones mejoradas respecto a su versión anterior (2.7), pero no son compatibles.
Para instalar Python en Debian y Ubuntu:
```
sudo apt-get install python3.5
```
### [Pip](https://pip.pypa.io/en/stable/)
Es un sistema de gestor de paquetes que viene instalado con versiones de Python por encima de 2.7.9 o Python mayores a 3.4.
Pip es utilizado para instalar y administrar paquetes de software escritos en Python.
**Para instalarlo en Linux:**
1. Ingresar a la página https://pip.pypa.io/en/stable/installing/
2. Descargar el archivo _get-pip.py_ que se encuentra en la sección _Installing with get-pip.py_
3. Desde un terminal, nos movemos a la ruta donde quedó descargado el archivo
4. Se ejecuta el siguiente comando:
```
sudo python3 get-pip.py
```
**Para atualizarlo:**
```
pip install -U pip
```
Con esta herramienta procederemos a hacer la instalación de forma más sencilla y general para cualquier usuario de Linux.
### [Nipy](http://nipy.org/)
Es una [comunidad de práctica](https://es.wikipedia.org/wiki/Comunidades_de_pr%C3%A1ctica) dedicados al análisis de neuro-imágenes en python. Esta comunidad desarrolla diferentes proyectos como nipype, nibabel, Nilearn, sipy, entre otras muchas.
De los proyectos desarrollados por esta comunidad, utilizaremos nipype y nibabel.
**Dependencias:**
* Python 2.6 en adelante.
* NumPy 1.6 o en adelante.
* SciPy 0.9 o en adelante.
* Sympy 0.7.0 o en adelante.
* Nibabel 1.2.0 o en adelante.
**Para instalarlo en Linux:**
```
pip install nipy
```
### [Nipype](http://nipy.org/packages/nipype/index.html)
Nipype es una herramienta que proporciona una interfaz para el software de neuro-imágenes y facilita la interacción entre paquetes con el uso de workflow.
Existen diferentes interfaces en nipype: SPM, FSL, FreeSufer.
En este proyecto utilizaremos FSL, ya que provee la herramienta BET (Brain Extraction Tool), el cual se encargará de eliminar partes de la imagen que no corresponda a las del cerebro.
Otras funcionalidades que ofrece nipype son:
* Interactuar facilmente con otros paquetes de software.
* Combinar procesos de diferentes paquetes de software.
* Desarrollo rápido de nuevos workflows utilizando pasos de los viejos.
* Ejecución en paralelo de procesos.
Entre otros.
**Para instalarlo en Linux:**
```
sudo pip install nipype
```
La instalación en Debian y en Ubuntu se hace de una manera simple a través del repositorio [NeuroDebian](http://neuro.debian.net/).
Si se usa Ubuntu 15.10 se debe hacer lo siguiente desde la consola de comandos:
```
wget -O- http://neuro.debian.net/lists/wily.us-tn.full | sudo tee /etc/apt/sources.list.d/neurodebian.sources.list
sudo apt-key adv --recv-keys --keyserver hkp://pgp.mit.edu:80 0xA5D32F012649A5A9
wget -O- http://neuro.debian.net/lists/wily.us-tn.full | sudo tee /etc/apt/sources.list.d/neurodebian.sources.list
sudo apt-key adv --recv-keys --keyserver hkp://pgp.mit.edu:80 0xA5D32F012649A5A9
```
Una vez esto se ha realizado se puede proceder a actualizar la lista de paquetes usando:
```
sudo apt-get update
```
Ejecutar el siguiente comando para terminar la instalación del paquete:
```
sudo apt-get install python-nipype
```
También puede visitar el [repositorio de nipype](https://github.com/nipy/nipype/tree/f9c98baa0a968451f4f8c78a74249c41e61d1966) e instalarlo desde allí.
### [FSL](http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/BET)
**Brain Extraction Tool (BET)** es una herramienta que trae la interfaz **FSL** de nipype, para la extracción de todo lo que no sea tejido cerebral de las imágenes. También permite estimar las superficies internas y externas de hueso, siempre que se tengan imágenes T1 y T2 de buena calidad.
Es utilizada en este proyecto para el análisis de las imágenes con la información únicamente del cerebro.
Se debe instalar la interfaz [FSL](http://nipy.org/nipype/interfaces/generated/nipype.interfaces.fsl.preprocess.html) que contiene a BET.
**Para instalarlo en Ubuntu:**
```
sudo aptitude install fsl-complete
```
Una vez instalado, ejecutar el siguiente comando:
```
export FSLDIR=/usr/share/fsl/5.0
. $FSLDIR/etc/fslconf/fsl.sh
export PATH=$FSLDIR/bin:$PATH
```
**Para instalarlo en Debian:**
1. Se debe ingresar a la página:
http://neuro.debian.net/install_pkg.html?p=fsl-complete+
2. Se selecciona el sistema operativo que se está usando y el servidor más cercano.
3. Se selecciona la opción “all software”
4. Se ejecutan los comandos que se especifican en la página.
5. Finalmente, se vuelve a actualizar el sistema:
```
sudo apt-get install update
```
Para asegurarnos de la correcta instalación y configuración, escribir los siguientes comandos:
```
whereis fsl
```
Debe mostrar donde se encuentren los archivos que han sido instalados. Si este no es el caso, se debe volver a intentar la instalación desde un principio.
```
echo $FSLDIR
```
Esto debe mostrar el nombre del directorio donde se instaló FSL. Si no lo hace, se debe configurar manualmente su shell para que encuentre los paquetes instalados. Esto depende de cuál sea la shell que esté utilizando. Para esto, siga los pasos que aparecen en la documentación [FSLInstalation](http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation/ShellSetup) .
De nuevo, cuando haga la configuración manual, vuelva a escribir el comando anterior.
Por último, ejecute el comando:
```
flirt -version
```
Debe mostrar algo como esto:
```
FLIRT version 6.0
```
Si todos los pasos anteriormente descritos funcionaron, significa que FSL está correctamente instalado y ya puede comenzar a utilizar sus módulos.
Para más información acerca de la instalación, visite la documentación de la [página oficial de FSL](http://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation).
### [Nibabel](http://nipy.org/nibabel/)
Es una librería de python que permite la lectura/escritura de diferentes formatos de neuro-imágenes, tales como GIFTI, NIfTI1, NIfTI2, MINC1, MINC2, MGH y ECAT.
Además, el formato NIfTI está pensado para ser el nuevo estándar de formatos para imágenes médicas, y puede ser utilizada con las interfaces que provee nipype (FSL, AFNI, SPM,Freesurfer).
En este proyecto será utilizado para convertir las imágenes DICOM a NifTI, ya que en el segundo es un formato que tiene información adicional sobre la orientación espacial de la imágen.
**Para instalarlo en Linux:**
```
sudo pip install nibabel
```
### [MatplotLib](http://matplotlib.org/)
Es una librería que permite la construcción de gráficos, histogramas, gráficos de barras, diagramas de dispersión, entre otros, en una variedad de formatos y entornos interactivos.
Puede ser usada en scripts de Python, en el shell de Python y en ipython, también en aplicaciones web.
Para este proyecto se utilizará en la verificación visual de la salida de los algoritmos de segmentación.
**Para instalarlo en Ubuntu:**
```
sudo apt-get install python-matplotlib
```
**Para instalarlo en Linux:**
```
sudo pip install matplotlib
```
### [NumPy](http://www.numpy.org/)
Numeric Python (Numpy) es el paquete base para realizar computación científica con Python. Contiene un potente objeto para trabajar con arreglos multi-dimensionales, funciones sofisticadas, herramientas para integrar código en C/C++ y código en Fortran, capacidad para usar algebra lineal, Transformadas de Fourier y manejo de números aleatorios, entre otras herramientas de utilidad.
En este proyecto, NumPy permitirá acceder a los objetos que contienen la información de las imágenes para realizar operaciones sobre ellas.
**Para instalarlo en Linux:**
```
sudo pip install numpy
```
**Para actualizarlo:**
```
sudo pip install numpy --upgrade
```
### [VTK-Tools](https://github.com/dgobbi/vtk-dicom)
[Visualization toolkit (VTK)](http://www.vtk.org/) es un software para gráficos 3D por computador, procesamiento de imágenes y visualización. Esta herramienta posee variedad de algoritmos de visualización y técnicas de modelado avanzadas; permite también visualización de una imágen por cortes (capas), particularmente utilizado para imágenes médicas.
En este proyecto es utilizado el paquete _vtk-dicom-tools_, el cual permite realizar el proceso de conversión de imágenes [dicom a nifti](https://github.com/dgobbi/vtk-dicom/wiki/dicomtonifti), además de ser una poderosa herramienta para la comprobación y análisis visual de los resultados obtenidos.
**Para instalarlo en Debian y Ubuntu:**
```
sudo aptitude install vtk-dicom-tools
```
Si se tiene otra distribución de Linux, se puede instalar de la siguiente manera:
1. Descargar los archivos del [repositorio](https://github.com/dgobbi/vtk-dicom/)
2. Abrir un terminal
3. Moverse a la carpeta donde se descargó el archivo
4. Crear una carpeta con el nombre _build_
5. Moverse a la carpeta build.
6. Ejecutar los siguientes comandos:
```
cmake ..
make
sudo make install
```
**Nota:** Se debe tener instalado [CMake](https://cmake.org/).
### [Node.js](https://nodejs.org/en/)
Node.js es una solución para el desarrollo de aplicaciones web al lado del servidor, está diseñado para construir aplicaciones de red escalables y para manejar miles de conexiones simultáneas.
Node.js utiliza el lenguaje de programación Javascript pero del lado del servidor; es programación orientada a eventos, trabaja sobre el intérprete de JavaScript creado por Google _([V8](https://en.wikipedia.org/wiki/V8_%28JavaScript_engine%29))_.
Con Node.js se construye el servidor web, herramienta con la que un usuario cualquiera puede ingresar las imágenes de los TAC y obtener el resultado de la densidad cerebral y la gráfica de densidad por cortes; el usuario puede también ver información acerca de los desarrolladores del proyecto, y cuenta con la posibilidad de enviar un correo electrónico para contactarse con ellos.
**Para instalarlo en Ubuntu:**
```
sudo apt-get install nodejs
```
Para estar seguros de que se instaló correctamente, ejecute el siguiente comando:
```
node -v
```
El cual le mostrará la versión que ha sido instalada. Si muestra un error, significa que se debe volver a instalar.
### [NPM](https://www.npmjs.com/)
Node Package Module (NPM) es el manejador de paquetes de node, se usa para la instalación, compartimiento y distribución de código.
En este proyecto se utiliza para la descarga de las dependencias del programa. Estos son algunos de ellos:
* body-parser
* browserify
* chart.js
* express
* ejs
* shortid
* socket.io
Entre otros.
**Para instalarlo en Debian y Ubuntu:**
```
sudo apt-get install npm
```
Para ver la versión de NPM instalada puede ejecutar el siguiente comando:
```
npm -v
```
Para actualizar npm ejecute la siguiente instrucción:
```
sudo npm install npm -g
```
Ahora, cada vez que queramos instalar las dependencias que esté utilizando nuestro programa en node, se debe ejecturar:
```
npm install
```
Y aparecerá una carpeta llamada _node_modules_, donde se encuentran todos los paquetes necesarios para la funcionalidad del programa.
Antes de poder ejecutar node en ambientes basados en Ubuntu, es necesario crear el siguiente enlace simbólico:
```
sudo ln -s /usr/bin/nodejs /usr/bin/node
```
______________________________________
### Ejecución del programa
Para instalar todos los módulos que están siendo utilizados en el proyecto, primero debe moverse desde una terminal en la dirección:
```
“DireccionDelProyecto/brain-densitometry/web/app”
```
Donde _DireccionDelProyecto_ es la ruta donde se descargó el proyecto.
Ahora, ejecutar:
```
npm run build-js
npm start
```
Y ya está corriendo nuestro servidor.
Para hacer pruebas directamente con el archivo __nipypeTest.py__ que se encuentra en la carpeta __source__, nos movemos a dicha carpeta, y ejecutamos lo siguiente:
```
python3 nipypeTest.py ../data/nombreArchivoPruebas Identificador
```
Donde _nombreArchivoPruebas_ es la carpeta que contiene los archivos .DCM, e _Identificador_ es necesario para no sobreescribir archivos dentro del servidor.
29.3896434227
\ No newline at end of file
#!/usr/bin/env python
from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt
import nibabel as nib
from nipype.interfaces import fsl
from nipype import Node, Workflow
from os.path import abspath
import subprocess as sub
import shlex as sh
import sys
import os
def removeFiles(paths):
for element in paths:
if os.path.exists(element):
os.remove(element)
else:
print("No se puede remover el archivo %s" % element)
def write(v,id):
fo = open("../web/app/public/densities/partial_density"+id+".txt",'w')
fo.write(str(len(v))+",\n")
fo.close() #La primera posicion debe ser la longitud del vector
for i in range (0,len(v)):
if(i == len(v)-1):#no le ponga la "," al dato final
fo = open("../web/app/public/densities/partial_density"+id+".txt",'a')
fo.write(str(v[i]))
fo.close()
else:
fo = open("../web/app/public/densities/partial_density"+id+".txt",'a')
fo.write(str(v[i])+",\n")
fo.close()
def partial_density_weighted(data, data_mask, totalPixels):
densities = []
for i in range(0,data.shape[2]):
xPixels = np.sum(data[:,:,i]) #suma de los pixeles en este corte
wPixels = 0 if (xPixels == 0) else xPixels / totalPixels #peso total de ese corte en todo el volumen
densities.insert(i,wPixels)
return densities
def density(file_name, file_name_mask,id):
img = nib.load(file_name)
img_mask = nib.load(file_name_mask)
data = img.get_data()
data_mask = img_mask.get_data()
num_data = data_mask.sum()
sum_data = data.sum()
density = (sum_data / num_data)
print("Densidad Total : " , density)
fo = open("../data/density"+id+".txt",'w')
fo.write(str(density))
fo.close()
nib.aff2axcodes(img.affine)
return partial_density_weighted(data, data_mask, num_data)
def threshold_CT(file_name,id):
try:
img = nib.load(file_name.decode("utf-8"))
data = img.get_data()
indices = data < 0
data[indices] = 0
indices = data > 100
data[indices] = 0
nib.save(img,'../data/threshold_brain'+id+'.nii.gz')
return '../data/threshold_brain'+id+'.nii.gz'
except:
print("Error en los archivos ingresados")
sys.exit(1)
def smooth_image(file_name):
smooth = fsl.IsotropicSmooth(in_file=file_name, sigma=3, out_file=file_name)
res = smooth.run()
def nifti_converter(output_dir, input_dir):
command = 'dicomtonifti -brz -o '+output_dir+' '+input_dir;
args = sh.split(command)
print (command)
p = sub.Popen(args, stdout=sub.PIPE, stderr=sub.PIPE)
output, errors = p.communicate()
print("ERRORES: ", errors)
#sys.exit(1)
output = output[:-1]
return output
#print (output)
def plot_slice(fname, z_idx=5):
# Load the image and collect the data
# and orientation information
img = nib.load(fname)
data = img.get_data()
aff = img.get_affine()
# Find the center of the brain matrix
ctr = np.dot(np.linalg.inv(aff), [0, 0, 0, 1])[:3]
#print(data[:,1,10])
# Plot the data
vmin, vmax = (0, 1) if data.dtype == np.int16 else (30, 150)
plt.imshow(np.rot90(data[:, :, ctr[2] + z_idx]), cmap="gray", vmin=vmin, vmax=vmax)
plt.gca().set_axis_off()
def skullStripping(file_name,id):
skullstrip = fsl.BET()
skullstrip.inputs.in_file = file_name
skullstrip.inputs.out_file = "../data/T1_bet_nipype"+id+".nii.gz"
skullstrip.inputs.mask = True
skullstrip.inputs.frac = 0.01
skullstrip.inputs.vertical_gradient = 0.0
print(skullstrip.cmdline)
skullstrip.run()
return "../data/T1_bet_nipype"+id+".nii.gz","../data/T1_bet_nipype"+id+"_mask.nii.gz"
#f = plt.figure()#figsize=(12,4))
#f.add_subplot(1,2,1)
#plot_slice(file_name)
#plt.title("T1")
#f.add_subplot(1,2,2)
#plot_slice("../data/T1_bet_nipype.nii.gz")
#plt.title("T1 Without Skull")
#plt.show()
def drawImages():
f = plt.figure(figsize=(12,4))
for i, img in enumerate(["../data/T1.nii.gz","../data/smoothflow/smooth/T1_smooth.nii.gz","../data/smoothflow/mask/T1_smooth_masked.nii.gz"]):
f.add_subplot(1,3,i+1)
plot_slice(img)
plt.show()
def createWorkFlow():
in_file = abspath("../data/T1.nii.gz")
skullstrip = Node(fsl.BET(in_file=in_file, mask=True), name ="skullstrip")
smooth = Node(fsl.IsotropicSmooth(in_file=in_file, fwhm=3), name="smooth")
mask = Node(fsl.ApplyMask(), name="mask")
wf = Workflow(name="smoothflow")
wf.base_dir = "/home/john/Documents/Projects/brainDensitometry/brain-densitometry/data/"
wf.connect(skullstrip,"mask_file", mask, "mask_file")
wf.connect([(smooth, mask, [("out_file","in_file")])])
wf.write_graph("workflow_graph.dot")
wf.run()
if len(sys.argv) >= 3:
input_dicom_files = sys.argv[1]
id = sys.argv[2]
print("id : ", id)
else:
print("Too few arguments")
sys.exit(1)
paths = [] #ruta de archivos para remover
#print("antes : ", input_dicom_files)
input_dicom_files = input_dicom_files.replace(" ","\ ")
#print("despues : ", input_dicom_files)
file_name = nifti_converter('../data', input_dicom_files)
print("file_name1: " , file_name)
paths.append(file_name)
file_name = threshold_CT(file_name,id);
print("file_name2: " , file_name)
paths.append(file_name)
#smooth_image('../data/threshold_brain.nii.gz')
#threshold_CT('../data/threshold_brain.nii.gz')
file_name = skullStripping(file_name,id);
print("file_name3: " , file_name)
paths.append(file_name[0])
paths.append(file_name[1])
cuts = density(file_name[0],file_name[1],id)
print("Densidad Parcial : " , np.sum(cuts))
write(cuts,id)
removeFiles(paths)
#charting(cuts)
#createWorkFlow()
#drawImages()reateWorkFlow()
#drawImages()
/public/images/user-images/*.zip
*.log
node_modules/
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var flash = require('connect-flash');
var engine = require('ejs');
var app = express();
app.io = require('socket.io')();
app.use(cookieParser());
app.use(session({
secret: 'kldlkaslkdfasdlfm15efaf5',
resave: false,
saveUninitialized: false
}));
app.use(flash());
var routes = require('./routes/index');
routes(app, '/');
var users = require('./routes/users');
users(app, '/users');
// view engine setup
app.engine('html', engine.renderFile);
app.set('view engine', 'html');
app.set('views', path.join(__dirname, 'views'));
//use icon
app.use(favicon(__dirname + '/public/images/brain.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error.ejs', { message_err : '' ,
message: err.message,
error: err
});
});
}
module.exports = app;
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require('../app');
var debug = require('debug')('app:server');
var http = require('http');
/**
* Get port from environment and store in Express.
*/
var port = normalizePort(process.env.PORT || '3030');
app.set('port', port);
/**
* Create HTTP server.
*/
var server = http.createServer(app);
app.io.attach(server);
/**
* Listen on provided port, on all network interfaces.
*/
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
/**
* Normalize a port into a number, string, or false.
*/
function normalizePort(val) {
var port = parseInt(val, 10);
if (isNaN(port)) {
// named pipe
return val;
}
if (port >= 0) {
// port number
return port;
}
return false;
}
/**
* Event listener for HTTP server "error" event.
*/
function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}
var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' is already in use');
process.exit(1);
break;
default:
throw error;
}
}
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}
/*--------------------Graficas----------------------*/
var downloadFile = function (filename, text) {
var element = document.createElement('a');
//element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
element.href = text;
element.setAttribute('download', filename);
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
};
var loadData = function(data,cuts){//recibe un arreglo con los datos
var cortes = [];
for(var i = 0; i < cuts; i++){
cortes[i] = i;
}
//alert("data : " + data);
//alert("cortes : " + cortes);
var datos_grafico = {
labels : cortes,//cantidad de cortes
datasets : [
{
label: "Densidad cerebral por cortes",
fill: true,
lineTension: 0.1,
backgroundColor: "rgba(131,176,193,0.4)",
borderColor: "rgba(17,37,58,1)",
borderCapStyle: 'butt',
borderDash: [],
borderDashOffset: 0.0,
borderJoinStyle: 'miter',
borderWidth : 1,
pointBorderColor: "rgba(0,0,0,1)",//"rgba(75,192,192,1)",
pointBackgroundColor: "#fff",
pointBorderWidth: 0.5,
pointHoverRadius: 5,
pointHoverBackgroundColor: "rgba(75,192,192,1)",
pointHoverBorderColor: "rgba(220,220,220,1)",
pointHoverBorderWidth: 1,
pointRadius: 1,
pointHitRadius: 5,
pointHoverBorderColor : "rgba(0,0,0,1)",
data : data //este se reempaza por los datos obtenidos en los cortes
}
]
}
createGraphic(datos_grafico);
}
var removeGraphicSpace = function () {
var padre = document.querySelector("#crearGrafico");
var fc = padre.firstChild;
while( fc ) {
padre.removeChild( fc );
fc = padre.firstChild;
}
}
var createGraphicSpace = function () {
removeGraphicSpace();
var padre = document.querySelector("#crearGrafico");
var primero = document.createElement("div");
primero.className = "row";
var segundo = document.createElement("div");
segundo.id = "grafico";
primero.appendChild(segundo);
var tercero = document.createElement("canvas");
tercero.id = "myChart";
segundo.appendChild(tercero);
padre.appendChild(primero);
}
var createGraphic = function (datos_grafico){
//console.log("grafico : " , grafico);
//grafico.className = "";
createGraphicSpace(); // crea los divs
var grafico = document.querySelector("#myChart");
var myNewChart = new Chart(grafico , {
type: "line",
data: datos_grafico,
});
download.className = download.className.replace("hidden","");//le quitamos el hidden
}
var readFile = function(){
if(id === undefined){
//console.log("id undefined");
return;
}
jQuery.get('densities/partial_density'+id+'.txt', function(txt) {
//jQuery.get('densities/partial_density.txt',function(txt){
var partial_sum = []
partial_sum = txt.replace(/\s/g,"");//quita todos los espacios
var array = partial_sum.split(',');
var array2 = []
for(var i = 1; i < array.length; i++){
array2[i-1] = array[i];
}
loadData(array2,array[0]);
});
}
var getCookieId = function(){
var cookie = document.cookie;
var splitted = cookie.split("id=");
//console.log("splitted[0] : ", splitted[0]);
//console.log("splitted[1] : ", splitted[1]);
return splitted[1];
}
/*----------------Sockets------------------*/
var io = require('socket.io-client')(),
send = document.querySelector("#btn_index"),
download = document.querySelector("#downloadForm"),
loader = document.querySelector("#btn-loader"),
id;
if ( document.URL.contains("/grafica") ) {
id = getCookieId();
readFile();
console.log("id adentro: ", id);
}
window.onbeforeunload = function confirmExit(){
io.emit('delete data', "../../data/density"+id+".txt"+" public/densities/partial_density"+id+".txt");
//return "¿Está seguro que quiere abandonar la página?";
};
io.on('serverReady', function(data) {
//console.log("io.on serverReady");
io.emit('clientReady', {
path: window.location.pathname,
data: 'El cliente está listo.',
cookieID: getCookieId()
});
});
send.addEventListener("click", function(e){
download.className = download.className + " hidden";
loader.className = loader.className.replace(" hidden","");
removeGraphicSpace();
io.emit('delete data', "../../data/density"+id+".txt"+" public/densities/partial_density"+id+".txt");
});
download.addEventListener("click", function (){
dir = '../densities/partial_density'+id+'.txt';
downloadFile("datos_grafica",dir);
});
{
"name": "app",
"version": "0.0.0",
"private": true,
"scripts": {
"build-js": "browserify browser/main.js -o public/js/bundle.js",
"start": "node ./bin/www"
},
"dependencies": {
"body-parser": "~1.13.2",
"browserify": "^13.0.1",
"chart.js": "^2.0.2",
"child": "0.0.3",
"connect": "^3.4.1",
"connect-flash": "^0.1.1",
"cookie-parser": "~1.3.5",
"debug": "~2.2.0",
"ejs": "2.4.1",
"express": "~4.13.1",
"express-session": "^1.13.0",
"jade": "~1.11.0",
"morgan": "~1.6.1",
"multer": "^1.1.0",
"nodemailer": "^2.3.0",
"serve-favicon": "~2.3.0",
"shortid": "~2.2.4",
"socket.io": "~1.4.5",
"socket.io-client": "^1.4.6"
}
}
174,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
2.46153175438,
5.55478515625,
12.3182221962,
19.025233048,
21.5556701231,
21.1263095666,
22.5171063957,
25.1144351167,
26.0128276814,
27.3206019547,
28.905620839,
30.3932222222,
31.1503349831,
31.4354690818,
31.2927308927,
30.8155736548,
31.3577731655,
32.3706882202,
32.6736988254,
32.4176869015,
32.4787074955,
32.1038645721,
31.7871339255,
31.1078030497,
30.6731692708,
30.6189597934,
30.6911256136,
30.8405754447,
30.3504396483,
29.7928681925,
29.5450934579,
28.6950986721,
28.4629653907,
29.7399755146,
30.5788586354,
31.0828040166,
31.2656218849,
31.6764624238,
31.9073305583,
31.9467726865,
31.8045409987,
31.6959287112,
31.7503864353,
32.3823523461,
32.5078682831,
32.8176862818,
32.9486127794,
32.5625859544,
32.0503000368,
31.9120229106,
32.1307010243,
32.110974207,
31.8766130241,
31.4084534991,
30.823023857,
30.0482672658,
29.5083771327,
28.8945624101,
28.2682257303,
27.7684482284,
27.5014167323,
27.259806731,
26.9817282821,
27.159834749,
27.5089094007,
28.2167014452,
28.4561827627,
28.7834987452,
28.7812344328,
28.916174243,
29.1741591661,
29.3442539502,
29.2955817254,
29.1985967488,
29.3508525202,
29.4319198684,
29.4520408676,
29.4568802177,
29.4972869149,
29.6039355075,
29.6622612623,
29.4934011883,
29.3315462989,
29.026915636,
28.9453101289,
28.8154516711,
28.6360379151,
28.4792839156,
28.3912238691,
28.4318705863,
28.5107706081,
28.6244673663,
28.8235791213,
28.9171128558,
28.8282540855,
28.8423661877,
28.9676953224,
29.122135657,
29.2585505877,
29.4140736728,
29.5691699605,
29.5470841863,
29.5494287309,
29.3506085185,
29.2934874301,
29.3410432844,
29.3964083552,
29.3885550753,
29.3908518429,
29.437145515,
29.1553488139,
29.1505329962,
29.2343239156,
29.2041654746,
29.3162409559,
29.3469683376,
29.2434385398,
29.2759126914,
29.2611644029,
29.1896939157,
29.092777146,
28.9251067758,
28.8786016313,
28.5914410943,
28.204927657,
28.0889876537,
27.9865525289,
27.8890179018,
27.8508050069,
27.6492221182,
27.2494253906,
27.1168054313,
26.6478125263,
26.3730548426,
25.94714663,
26.0160041053,
25.5148667191,
24.4928672676,
23.2176480631,
22.9717643859,
24.6432694552,
23.6300285915,
3.90720820894,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment