#include #include #include #include //#include "RTypes.h" #include "TH1F.h" #include "TH2F.h" #include "TFile.h" #include "WireHit.hpp" #include "Track.hpp" #include "Fitter.hpp" #define WORD_LENGTH 4 #define dprint(a) std::cerr << #a << " : " << a << std::endl // Sets the debug output: // #define DEBUG using namespace std; const bool dump = false; int main(int argc, char *argv[]) { if (argc < 2) { // Checks number of arguments cout << "Usage: hread \nReads the binary file and converts it to text file\n" << endl; cout << "If `-' argument is given, then it read from stdin" << endl; return 0; } istream *in_file = 0; if ((strlen(argv[1]) == 1) && (argv[1][0] == '-')) { // Checks whether the user wants to read from stdin #ifdef DEBUG cerr << "Reading from stdin" << endl; #endif in_file = &cin; } else { #ifdef DEBUG cerr << "Reading from " << argv[1] << endl; #endif in_file = new ifstream(argv[1], ifstream::in); } // Allocates a vector to store event infos vector < vector < WireHit > >events; TFile ofile("tracks.root","CREATE"); TH1F *h1d = new TH1F("h1d", "Slope histogram", 80, 0, 160); TH2F *h2d = new TH2F("h2d", "Position histogram", 5, 1.3, 5 * 1.3, 75, 0, 150); int event_counter = 0; while (!in_file->eof()) { int event_data[2]; bool event_status = in_file->read(reinterpret_cast < char *>(event_data), 2 * WORD_LENGTH); #ifdef DEBUG cerr << "Bites read for this event: " << in_file->gcount() << endl; #endif if (in_file->eof()) { // Checks again if it is at the EOF return 0; } else if (event_status == false) { cerr << "File unexpectedly terminated" << endl; return 1; } int event_number = event_data[0]; int hit_number = event_data[1]; // cout << "Precedente: " << event_number << ' ' << hit_number << endl; // Stores in the vector the pointer to the new vector of hits vector < WireHit > *temp = new vector < WireHit >; events.push_back(*temp); for (int i = 0; i < hit_number; i++) { int hit_data[3]; bool hit_status = in_file->read(reinterpret_cast < char *>(hit_data), 3 * WORD_LENGTH); #ifdef DEBUG cerr << "Bites read for this hit: " << in_file-> gcount() << endl; #endif if (hit_status == false) { cerr << "File unexpectedly terminated" << endl; return 1; } WireHit *temp = new WireHit(hit_data[0], hit_data[1], hit_data[2]); events[event_counter].push_back(*temp); /* cout << "Precedente: " << events[event_counter][i]. layId() << ' ' << events[event_counter][i]. wireId() << ' ' << events[event_counter][i]. driftTime() << endl; */ } // fit segment Track *track = Fitter::findTrack(events[event_counter]); // write track if (dump == true) { cout << track->tkInt() << " " << track-> tkAng() << " " << track->corr() << " " << track-> ySigma() << endl; } //dprint(track->tkAng()); h1d->Fill(track->tkAng()); // loop over layers for (int layer = 1; layer <= 4; layer++) { // retrieve hit info ( 0 for missing hit ) int side = 0; float x = 0; float y = 0; if (track->hitPtr(layer)) { side = track->hitSide(layer); x = track->hitPtr(layer)->x(); y = track->hitPtr(layer)->y(side); } // write info if (dump == true) { cout << side << " " << x << " " << y << " "; } //dprint(x); dprint(y); if ( side != 0 ) { h2d->Fill( x, y ); } } // end line if (dump == true) { cout << endl; } event_counter++; } h1d->Write(); h2d->Write(); ofile.Close(); for ( unsigned int i = 0; i < events.size(); i++) { for ( unsigned int j = 0; j < events[i].size(); j++) { delete & events[i][j]; } delete & events[i]; } return 0; }