/** Reads from the file getting in order: an unused integer, on the next line the number of * spectra in the group and next one or more lines the spectra numbers, (format in GroupDetectors.h) * @param specs2index :: a map that links spectra numbers to indexes * @param File :: the input stream that is linked to the file * @param lineNum :: the last line read in the file, is updated by this function * @param unUsedSpec :: list of spectra that haven't yet been included in a group * @throw invalid_argument if there is any problem with the file */ void GroupDetectors2::readFile(spec2index_map &specs2index, std::ifstream &File, size_t &lineNum, std::vector<int64_t> &unUsedSpec) { // used in writing the spectra to the outData map. The groups are just labelled incrementally from 1 int spectrumNo = 1; // go through the rest of the file reading in lists of spectra number to group while ( File ) { std::string thisLine; do { std::getline( File, thisLine ), lineNum ++; // we haven't started reading a new group and so if the file ends here it is OK if ( ! File ) return; } while( readInt(thisLine) == EMPTY_LINE && File ); // the number of spectra that will be combined in the group int numberOfSpectra = EMPTY_LINE; do { if ( ! File ) throw std::invalid_argument("Premature end of file, expecting an integer with the number of spectra in the group"); std::getline( File, thisLine ), lineNum ++; numberOfSpectra = readInt(thisLine); } while( numberOfSpectra == EMPTY_LINE ); // the value of this map is the list of spectra numbers that will be combined into a group m_GroupSpecInds[spectrumNo].reserve(numberOfSpectra); do { if ( ! File ) throw std::invalid_argument("Premature end of file, found number of spectra specification but no spectra list"); std::getline( File, thisLine ), lineNum ++; // the spectra numbers that will be included in the group readSpectraIndexes( thisLine, specs2index, m_GroupSpecInds[spectrumNo], unUsedSpec); } while (static_cast<int>(m_GroupSpecInds[spectrumNo].size()) < numberOfSpectra); if ( static_cast<int>(m_GroupSpecInds[spectrumNo].size()) != numberOfSpectra ) {// it makes no sense to continue reading the file, we'll stop here throw std::invalid_argument(std::string("Bad number of spectra specification or spectra list near line number ") + boost::lexical_cast<std::string>(lineNum)); } // make regular progress reports and check for a cancellastion notification if ( (m_GroupSpecInds.size() % INTERVAL) == 1 ) { fileReadProg( m_GroupSpecInds.size(), specs2index.size() ); } spectrumNo++; } }