#include <stdio.h>

#define MAXPARAMETER 10


TNtuple* makeGpNtuple(const Char_t *fileName) {

  Int_t iParameters = 0;
  TString fileStructure;
  TString ntupleName;
  TString ntupleTitle;
  bool skipFirst=kFALSE;


  // decide ntuple structure
  if(TString(fileName).Contains("lumi.ee.out")) {
    iParameters = 9;
    fileStructure = TString("e1:e2:x:y:z:vx1:vy1:vx2:vy2");
  }
  else if(TString(fileName).Contains("lumi.dat")) {
    iParameters = 5;
    fileStructure = TString("e1:e2:x:y:z");
  }
  else if(TString(fileName).Contains("lumi.ee.outcat")) {
    iParameters = 10;
    fileStructure = TString("ievent:e1:e2:x:y:z:vx1:vy1:vx2:vy2");
    cout << "outcat" << endl;
    skipFirst=kTRUE;
  }
  else if(TString(fileName).Contains("pairs")) {
    iParameters = 7;
    fileStructure = TString("a:b:c:d:e:f:g");
  }
  else if(TString(fileName).Contains("beam")) {
    iParameters = 6;
    fileStructure = TString("e:vx:vy:x:y:z");
  }

  // add index to all files (can be important for some files)
  //fileStructure = "i:"+fileStructure;

  // create ntuple
  TNtuple *nt = new TNtuple("gpNtuple","Guinea pig ntuple",fileStructure.Data());

  // reset input values
  Float_t dInputValues[MAXPARAMETER];

  for(Int_t i=0;i<iParameters;i++) {
      dInputValues[i] = 0.0;
  }


  //FILE *fp=fopen(fileName,"r");

  Int_t iEntry=0;
  Int_t scan;

  ifstream ifstr(fileName,ios::in);
  Int_t iEntry = 0;
  while(ifstr) {
    if (skipFirst==kTRUE){
      ifstr >> dInputValues[0];
      skipFirst=kFALSE;
      cout << "skipping first line" << endl;
      iEntry++;
      continue;
    }

    for(Int_t i=0;i<iParameters;i++) {
      ifstr >> dInputValues[i];
    }
    nt->Fill(dInputValues);
    iEntry++;
  }

//    while(1){

//      if (skipFirst==kTRUE){
//        scan=fscanf(fp,"%f",&dInputValues[0]);
//        skipFirst=kFALSE;
//        iEntry++;
//        continue;
//      }


//      scan = fscanf(fp,"%f %f %f %f %f %f %f %f %f %f",&dInputValues[0],
//         &dInputValues[1],&dInputValues[2],&dInputValues[3],
//         &dInputValues[4],&dInputValues[5],&dInputValues[6],
//         &dInputValues[7],&dInputValues[8],&dInputValues[9]);


//      if(scan < 0) break;
//      nt->Fill( dInputValues );
//      iEntry++;

//   }


  cout << iEntry << endl;
  // return ntuple
  return nt;
}