[Genabel-commits] r1264 - in pkg/OmicABEL: . doc src src/float2double
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Mon Jul 1 10:56:30 CEST 2013
Author: dfabregat
Date: 2013-07-01 10:56:30 +0200 (Mon, 01 Jul 2013)
New Revision: 1264
Added:
pkg/OmicABEL/src/float2double/
pkg/OmicABEL/src/float2double/float2double.c
Modified:
pkg/OmicABEL/Makefile
pkg/OmicABEL/doc/HOWTO
Log:
Adding the program float2double to translate DatABEL
"float" data into DatABEL "double" data.
Modified: pkg/OmicABEL/Makefile
===================================================================
--- pkg/OmicABEL/Makefile 2013-07-01 08:50:00 UTC (rev 1263)
+++ pkg/OmicABEL/Makefile 2013-07-01 08:56:30 UTC (rev 1264)
@@ -2,8 +2,10 @@
SRCDIR = ./src
RESH_SRCDIR = ./src/reshuffle
+F2D_SRCDIR = ./src/float2double
CLAKGWAS = ./bin/CLAK-GWAS
RESHUFFLE = ./bin/reshuffle
+F2D = ./bin/float2double
#QUICK and DIRTY
CXX=g++
@@ -15,11 +17,13 @@
SRCS = $(SRCDIR)/CLAK_GWAS.c $(SRCDIR)/fgls_chol.c $(SRCDIR)/fgls_eigen.c $(SRCDIR)/wrappers.c $(SRCDIR)/timing.c $(SRCDIR)/statistics.c $(SRCDIR)/REML.c $(SRCDIR)/optimization.c $(SRCDIR)/ooc_BLAS.c $(SRCDIR)/double_buffering.c $(SRCDIR)/utils.c $(SRCDIR)/GWAS.c $(SRCDIR)/databel.c
OBJS = $(SRCS:.c=.o)
RESH_SRCS=$(RESH_SRCDIR)/main.cpp $(RESH_SRCDIR)/iout_file.cpp $(RESH_SRCDIR)/Parameters.cpp $(RESH_SRCDIR)/reshuffle.cpp $(RESH_SRCDIR)/test.cpp
-RESH_OBJS = $(RESH_SRCS:.cpp=.o)
+RESH_OBJS=$(RESH_SRCS:.cpp=.o)
+F2D_SRCS=$(F2D_SRCDIR)/float2double.c
+F2D_OBJS=$(F2D_SRCS:.c=.o) $(SRCDIR)/databel.o $(SRCDIR)/wrappers.o
.PHONY: all clean
-all: ./bin/ $(CLAKGWAS) $(RESHUFFLE)
+all: ./bin/ $(CLAKGWAS) $(RESHUFFLE) $(F2D)
./bin:
mkdir bin
@@ -31,15 +35,19 @@
cd $(RESH_SRCDIR)
$(CXX) $^ -o $@
+$(F2D): $(F2D_OBJS)
+ cd $(F2D_SRCDIR)
+ $(CC) $^ -o $@
+
# Dirty, improve
platform=Linux
bindistDir=OmicABEL-$(platform)-bin
-bindist: ./bin/ $(CLAKGWAS) $(RESHUFFLE)
+bindist: ./bin/ $(CLAKGWAS) $(RESHUFFLE) $(F2D)
rm -rf $(bindistDir)
mkdir $(bindistDir)
mkdir $(bindistDir)/bin/
mkdir $(bindistDir)/doc/
- cp -a $(CLAKGWAS) $(RESHUFFLE) $(bindistDir)/bin/
+ cp -a $(CLAKGWAS) $(RESHUFFLE) $(F2D) $(bindistDir)/bin/
cp -a COPYING LICENSE README DISCLAIMER.$(platform) $(bindistDir)
cp -a doc/README-reshuffle doc/INSTALL doc/HOWTO $(bindistDir)/doc
tar -czvf $(bindistDir).tgz $(bindistDir)
@@ -52,6 +60,8 @@
$(RM) $(SRCDIR)/*opari_GPU*
$(RM) $(RESH_OBJS)
$(RM) $(RESHUFFLE)
+ $(RM) $(F2D_OBJS)
+ $(RM) $(F2D)
src/CLAK_GWAS.o: src/CLAK_GWAS.c src/wrappers.h src/utils.h src/GWAS.h \
Modified: pkg/OmicABEL/doc/HOWTO
===================================================================
--- pkg/OmicABEL/doc/HOWTO 2013-07-01 08:50:00 UTC (rev 1263)
+++ pkg/OmicABEL/doc/HOWTO 2013-07-01 08:56:30 UTC (rev 1264)
@@ -5,6 +5,9 @@
* CLAK-GWAS: the program to run GWAS analyses (through CLAK-Chol or CLAK-Eig)
* reshuffle: the program to extract the output of CLAK-GWAS into text format
+* float2double: the program to translate databel files (*.fvi, *.fvd)
+ in single precision "float" format into double precision
+ "double" format.
The output produced by CLAK-GWAS is kept in a compact binary format
for performance reasons. The user can then use "reshuffle" to
@@ -21,6 +24,10 @@
http://www.genabel.org/packages/OmicABEL
+If you already prepared your data in DatABEL format, but you used
+single precision (float) data. You can make use of float2double
+to transform it into double precision (double) data.
+
If you need help, please contact us, or use the GenABEL project forum
http://forum.genabel.org
@@ -40,7 +47,7 @@
The example in the tutorial also provides a basic example on using OmicABEL
to run your GWAS analyses. Here we detail the options of CLAK-GWAS.
-The complete list of options for CLAK-GWAS is avaliable through the command
+The complete list of options for CLAK-GWAS is available through the command
./CLAK-GWAS -h
@@ -84,3 +91,5 @@
For a detailed description of "reshuffle", please refer to doc/README-reshuffle
+
+
Added: pkg/OmicABEL/src/float2double/float2double.c
===================================================================
--- pkg/OmicABEL/src/float2double/float2double.c (rev 0)
+++ pkg/OmicABEL/src/float2double/float2double.c 2013-07-01 08:56:30 UTC (rev 1264)
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2010-2013, Diego Fabregat-Traver and Paolo Bientinesi.
+ * All rights reserved.
+ *
+ * This file is part of OmicABEL.
+ *
+ * OmicABEL is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OmicABEL is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with OmicABEL. If not, see <http://www.gnu.org/licenses/>.
+ *
+ *
+ * Coded by:
+ * Diego Fabregat-Traver (fabregat at aices.rwth-aachen.de)
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../wrappers.h"
+#include "../databel.h"
+
+#define MB (1L<<20)
+#define STR_BUFFER_SIZE 256
+
+int main( int argc, char *argv[] )
+{
+ char fin_path_fvi[STR_BUFFER_SIZE],
+ fin_path_fvd[STR_BUFFER_SIZE],
+ fout_path_fvi[STR_BUFFER_SIZE],
+ fout_path_fvd[STR_BUFFER_SIZE];
+ FILE *fin, *fout;
+ struct databel_fvi *databel_in, *databel_out;
+
+ float *datain;
+ double *dataout;
+ size_t buff_size = 256*MB;
+
+ long long int nelems;
+ int nelems_in_buff, nelems_to_write;
+ int header_data_size;
+
+ int i, j, out;
+
+ if ( argc != 3 )
+ {
+ fprintf( stderr, "Usage: %s floatFileIn doubleFileOut\n", argv[0] );
+ exit( EXIT_FAILURE );
+ }
+
+ snprintf( fin_path_fvi, STR_BUFFER_SIZE, "%s.fvi", argv[1] );
+ snprintf( fin_path_fvd, STR_BUFFER_SIZE, "%s.fvd", argv[1] );
+ snprintf( fout_path_fvi, STR_BUFFER_SIZE, "%s.fvi", argv[2] );
+ snprintf( fout_path_fvd, STR_BUFFER_SIZE, "%s.fvd", argv[2] );
+
+ // FVI files
+ databel_in = load_databel_fvi( fin_path_fvi );
+ if ( databel_in->fvi_header.type != FLOAT_TYPE )
+ {
+ fprintf( stderr, "Input databel file(s) %s should include \"float\" data\n", argv[1]);
+ exit( EXIT_FAILURE );
+ }
+ databel_out = (databel_fvi *) fgls_malloc( sizeof(databel_fvi) );
+ // Header
+ databel_out->fvi_header.type = DOUBLE_TYPE;
+ databel_out->fvi_header.nelements = databel_in->fvi_header.nelements;
+ databel_out->fvi_header.numObservations = databel_in->fvi_header.numObservations;
+ databel_out->fvi_header.numVariables = databel_in->fvi_header.numVariables;
+ databel_out->fvi_header.bytesPerRecord = sizeof( double );
+ databel_out->fvi_header.bitsPerRecord = databel_out->fvi_header.bytesPerRecord * 8;
+ databel_out->fvi_header.namelength = databel_in->fvi_header.namelength;
+ for ( i = 0; i < RESERVEDSPACE; i++ )
+ databel_out->fvi_header.reserved[i] = '\0';
+ // Labels
+ header_data_size = (databel_out->fvi_header.numVariables + databel_out->fvi_header.numObservations ) *
+ databel_out->fvi_header.namelength * sizeof(char);
+ databel_out->fvi_data = (char *) fgls_malloc ( header_data_size );
+ memcpy( databel_out->fvi_data, databel_in->fvi_data, header_data_size );
+
+ // Write
+ fout = fgls_fopen( fout_path_fvi, "wb" );
+ out = fwrite( &databel_out->fvi_header, sizeof(databel_fvi_header), 1, fout);
+ if ( out != 1 )
+ {
+ fprintf(stderr, "Error writing fvi header\n" );
+ exit( EXIT_FAILURE );
+ }
+ out = fwrite( databel_out->fvi_data,
+ databel_out->fvi_header.namelength * sizeof(char),
+ databel_out->fvi_header.numVariables + databel_out->fvi_header.numObservations,
+ fout);
+ if ( out != (databel_out->fvi_header.numVariables + databel_out->fvi_header.numObservations) )
+ {
+ fprintf(stderr, "Error writing fvi data\n" );
+ exit( EXIT_FAILURE );
+ }
+ fclose( fout );
+
+ // FVD
+ fin = fgls_fopen( fin_path_fvd, "rb" );
+ fout = fgls_fopen( fout_path_fvd, "wb" );
+ // buff_size determines the size of the buffer for the "double" array.
+ // For the same amount of elements, float needs half the memory space
+ datain = (float *) fgls_malloc( buff_size / 2 );
+ dataout = (double *) fgls_malloc( buff_size );
+
+ nelems = databel_out->fvi_header.numVariables * databel_out->fvi_header.numObservations; // total elems in file
+ nelems_in_buff = buff_size / sizeof(double);
+ for ( i = 0; i < nelems; i += nelems_in_buff )
+ {
+ nelems_to_write = ((nelems - i) >= nelems_in_buff) ? nelems_in_buff : nelems - i;
+ if ( fread( datain, sizeof(float), nelems_to_write, fin ) != nelems_to_write )
+ {
+ fprintf( stderr, "Error reading data from %s\n", fin_path_fvd );
+ exit( EXIT_FAILURE );
+ }
+ for ( j = 0; j < nelems_to_write; j++ )
+ dataout[j] = (double)datain[j];
+ if ( fwrite( dataout, sizeof(double), nelems_to_write, fout ) != nelems_to_write )
+ {
+ fprintf( stderr, "Error writing data to %s\n", fout_path_fvd );
+ exit( EXIT_FAILURE );
+ }
+ }
+ fclose( fin );
+ fclose( fout );
+ free( datain );
+ free( dataout );
+ free_databel_fvi( &databel_in );
+ free_databel_fvi( &databel_out );
+
+ return 0;
+}
More information about the Genabel-commits
mailing list