Re: [ROOT] data reader

From: Henrique de M. J. Barbosa - mestrado (hbarbosa@ifi.unicamp.br)
Date: Fri Feb 22 2002 - 18:08:19 MET


Dear Tommaso,

I've something that maybe is useful. It's a function that reads a file the
way you want and returns a double** with all values. The matrix is
organized so that val[0][1] means 2nd value of 1st column so that you can
do:

int cols,lines;
double **vals = readf("myfile.dat",&cols,&lines);
TGraph *gr = new TGraph(vals[0],vals[1],lines);


to create a graf with the 1st and 2nd columns of the data file.
I think it's very ease to you to build a macro that creates the histograms
or whatever you want and save it to a root file.

Maybe its also possible to chande the function so that it returns an
ntuple or something else.

]['s
herique
****************************************
State University at Campinas - BRASIL
"Gleb Wathagin" Physics Institute
Department of Cosmic Rays and Chronology

Henrique Barbosa      The Pierre Auger
PhD Student             Observatory
****************************************


> Hi all,
> is there anybody who has already wrote a macro capable to read a data file
> organized in columns, no matter how many they are, no matter how long the
> file is and issue a root file?
>
> Thanks, Tommaso
>
>



#include <iostream.h>
#include <fstream.h>
#include <strstream.h>
#include <string.h>
#include <iomanip.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>


/* ==================================================================================
 *
 *  function readf - Read a file with 1, 2 or 3 columns
 *
 * ================================================================================== */
double **readf(char *name, int *ncols, int *nrows) {

  int const maxcolums = 20;
  int const linwidth = 256;

  ifstream arq;
  strstream strline;

  char line[linwidth];
  int sline = sizeof(line);

  int i = 0, j = 0;
  double firstline[maxcolums];

  double **xx;

  if ((!(*ncols > 0)) || (!(*nrows > 0))) {
    arq.open(name, ios::in);

    // Reading first line and determining the number of columns
    if (!(*ncols > 0)) {
      arq.getline(line,sline);
      strline << line;
      i++;
      do {
	strline >> firstline[j++];
      } while (!strline.eof());
      *ncols = j-1;
      strline.clear();
    }

    // Reading the rest of the file and determining the number of lines
    if (!(*nrows > 0)) {
      do {
	arq.getline(line,sline);
	i++;
      } while (!arq.eof());
      *nrows = i-1;
      strline.clear();
    }

    arq.close();
  }

  // reopening file for real read
  arq.open(name, ios::in);

  // allocating memory
  xx = new double*[*ncols];
  for (j=0;j<*ncols;j++)
    xx[j] = new double[*nrows];

  // reading file
  for (i=0; i<*nrows; i++) {
    if ((i%10000)==0) { cout << i << endl; }
    arq.getline(line,sizeof(line));
    strline << line;
    for (j=0;j<*ncols;j++) {
      strline >> xx[j][i];
    }
    strline.clear();
  }
  arq.close();

  cout << "-- Function le_arquivo --\n";
  cout << "-- file: " << name << endl;
  cout << "-- ncols: " << *ncols << endl;
  cout << "-- nlines: " << *nrows << endl;


  return(xx);
} // end of **readf(char *name, int *ncols, int *nrows)



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:42 MET