Dear ROOTers, I cannot compile the attachment. And it cannot be interpreted by ROOT correctly. I use string, ifstream here. What's wrong with it? Regards // // This is the ROOT macro to convert Kmax event file to ROOT tree. // // by Exaos Lee (schlie@iris.ciae.ac.cn) // int evnt2root(); // Change big endian to little endian: 4-byte interger unsigned long swap32(unsigned long x) //ULong_t swap32(ULong_t x) { return ((((x) & 0x00ff0000) >> 8 ) | \ (((x) & 0x0000ff00) << 8 ) | \ (((x) & 0xff000000) >> 24) | \ (((x) & 0x000000ff) << 24)); } // Change big endian to little endian: 2-byte interger unsigned short swap16(unsigned short x) //UShort_t swap16(UShort_t x) { return ((((x) & 0xff00) >> 8) | \ (((x) & 0x00ff) << 8)); } #ifndef __CINT__ #include "TFile.h" #include "TNtuple.h" #include "TROOT.h" #include <stdlib.h> #include <stdio.h> #include <fstream> #include <iostream> #include <cassert> #include <string> //------------------------------------------------------------------ int main() { return evnt2root(); } #endif int evnt2root() { TFile datafile("n2n_2003_01.root","RECREATE","n2n event file"); // create root file // index file: ASCII format, each line contains one event filename for processing. ifstream idx_in("event_index.txt", ios::in); ifstream evnt_in; // Kmax .evnt file stream; //std::string evnt_fn; // Evnt filename char evnt_fn[256]; UShort_t evType, evSize; // Event type and size UShort_t par_num=0x0015; // Our experiment's parameter number: 21 ULong_t blkCount,itmp; // Block count and temporary ULong_t variable Int_t bufCount, total_buffers, total_blocks, total_events, total_files; // counters ULong_t tmp_par[21]; Float_t par[18]; // Array of parameters TString par_name("ph0:ph1:psd1:ph2:psd2:ph3:psd3:ph4:psd4:tof01:tof02:tof03:tof04:tof0:tof1:tof2:tof3:tof4"); // Parameter names Float_t mpar[3]; // Parameters for monitor TString mpar_name("phm:psdm:tofm"); // Parameter names of monitor. TNtuple *par_nt = new TNtuple("n2n_ntuple","Ntuple for n2n experiment",par_name.Data()); TNtuple *mpar_nt = new TNtuple("n2n_mntuple","Ntuple for monitor",mpar_name.Data()); do { idx_in >> evnt_fn; // read a filename //idx_in.getline(evnt_fn,256); if( !strlen(evnt_fn) && idx_in.eof()) break; evnt_in.open(evnt_fn,ios::in | ios::binary); // open an event file to read assert(evnt_in.is_open()); // Make sure the file is open evnt_in.read(&itmp,1); // read file format sign: 4 bytes if( itmp != 0x02000001 ) { printf("******ERROR****** File %s is not a Kmax binary event file!\n",evnt_fn); break; } bufCount = 0; evnt_in.seekg(512L,std::ios::beg); // Start of file 0x0000200: Beginning of event data printf("---Processing Event file: %s ----\n",evnt_fn); while(!evnt_in.eof()) { evnt_in.read(&evType,sizeof(unsigned short)*1); // Read evnt type swap16(evType); evnt_in.read(&evSize,sizeof(unsigned short)*1); // Read evnt size swap16(evSize); if(evSize != par_num) { printf("******ERROR****** Event size is not compatible!\n"); break; } evnt_in.read(&blkCount,sizeof(unsigned long)*1); // Read block count swap32(blkCount); if(blkCount>0 && blkCount !=0xffffffff) { printf("Buffer %5d -- Event Size: %5d Event Type: %5d",++bufCount, evSize, evType); for(int i=0;i<blkCount;i++) { int j; // Read parameters for(j=0;j<evSize;j++) { evnt_in.read(&itmp,sizeof(unsigned long)*1); tmp_par[j]=swap32(itmp); } // Assign parameters to ntuples // Of course, you can give thresholds here. for(j=0;j<9;j++) par[j]=tmp_par[j]/8.0; mpar[0]=tmp_par[9]/8.0; mpar[1]=tmp_par[10]/8.0; mpar[2]=tmp_par[11]/4.0; for(j=12;j<16;j++) par[j-3]=tmp_par[j]/8.0; for(j=16;j<21;j++) par[j-3]=tmp_par[j]/4.0; // Fill ntuples par_nt->Fill(mpar); mpar_nt->Fill(par); total_events++; // this counter is used for counting selected events. // here, it is equivelant to total_buffers*evSize. } else break; } printf(" -- read %10d blocks. OK!\n",blkCount); total_blocks+=blkCount; } printf("--- Total buffers: %d ---\n",bufCount); total_buffers+=bufCount; total_files++; evnt_in.close(); } while(!idx_in.eof()); printf("\nAll event files have been dumped.\n"); printf("Total files: %5d Total buffers: %10d Total blocks: %10d\n", \ total_files,total_buffers,total_blocks); printf("Selected events: %10d\n",total_events); datafile.Write(); datafile.Close(); return 0; }
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:12 MET