//Since all of the getter and setter methods are taken care of in the base class the derived class really only needs to worry about the virtual function. void RCEDataReader::m_importData(EventMap* events ){ if(PRINTOUTS) std::cout << "Opening file: " << filename <<std::endl; //Read file in binary mode, note bitwise OR std::fstream infile(filename.c_str(), std::fstream::in | std::fstream::binary); if(PRINTOUTS) std::cout<< "... reading file ..." <<std::endl; //Timestamp: 4 bytes timestamp = 0; infile.read((char*)×tamp, 4); if(PRINTOUTS) std::cout<<"Data with timestamp: "<< timestamp << std::endl; //Number of rce's: 4 bytes num_rces = 0; infile.read((char*)&num_rces, 4); if(PRINTOUTS) std::cout<<"RCE's used: " << num_rces << std::endl; //********** E V E N T S ********** while(infile){ //Event size: 4 bytes event_size = 0; infile.read((char*)&event_size, 4); //Break here if reached end of file if(!infile) break; //Event number: 4 bytes event_number = 0; infile.read((char*)&event_number, 4); //RCE number: 4 bytes rce_number = 0; infile.read((char*)&rce_number, 4); //Trigger information: 9*4 bytes infile.read(trig_info, 9*4); //TODO event_size -= 12*4; //Subtract the parts of header already read //Read FE data char *fe_data = new char[event_size]; infile.read(fe_data, event_size); unsigned bcid, link; for(unsigned i=0; i<event_size; i+=4){ //Cast first char to ui, so can tell what type of record it is FormattedRecord record(*(unsigned*)&fe_data[i]); bcid = 0; if(record.isHeader()){ link = record.get_link(); //For each new link, we add an EventContainer to the EventMap if(events->find(link)==events->end() ) events->insert(std::pair<unsigned,EventContainer*>(link, new EventContainer)); else if(events->at(link)->back().get_nHits() == 0) events->at(link)->pop_back(); //For a new event (i.e. a new trigger), add an event to the EventContainer events->at(link)->push_back(Event(record.get_lv1id())); //This is used in the Hit info bcid = record.get_bcid(); if(PRINTOUTS){ std::cout<< "DH: "<< record.get_lv1id() <<" " << record.get_bcid() << " " << record.get_link() << std::endl; } } else if(record.isData()) { //Temp var just to keep the code more readable Hit tempHit; tempHit.set_bcid(bcid); tempHit.set_col(record.get_col()); tempHit.set_row(record.get_row()); tempHit.set_tot(record.get_tot()); //Add the hit to the last event at that link events->at(link)->back().addHit(tempHit); if(PRINTOUTS) std::cout<< "DR: "<< record.get_col() <<" " << record.get_row() << " " << record.get_tot() << std::endl; } } /* EventMap::iterator i; EventContainer::iterator j; for(i = events->begin(); i != events->end(); ++i){ for(j = i->second->begin(); j!= i->second->end(); ++j){ if( j->get_nHits() == 0) std::cout<<"This container had no hits!" <<std::endl; //i->second->erase(j); } } */ delete fe_data; } infile.close(); }