Frames CompartmentReportCommon::loadFrames(double start, double end) const { const auto startTime = getStartTime(); if (start >= getEndTime() || end < startTime || end <= start) return Frames(); const double timestep = getTimestep(); const size_t startFrame = _getFrameNumber(start); end = std::nextafter(end, -INFINITY); const size_t count = _getFrameNumber(end) - startFrame + 1; Frames frames; frames.timeStamps.reset(new std::vector<double>); for (size_t i = 0; i < count; ++i) frames.timeStamps->push_back(startTime + (i + startFrame) * timestep); const auto frameSize = getFrameSize(); frames.data.reset(new floats(frameSize * count)); if (frameSize == 0) return frames; if (!_loadFrames(startFrame, count, frames.data->data())) return Frames(); return frames; }
bool CompartmentReportHDF5::writeFrame( const uint32_t gid, const floats& voltages, const float timestamp ) { lunchbox::ScopedWrite mutex( detail::_hdf5Lock ); try { H5::DataSet& dataset = _getDataset( gid ); const H5::DataSpace& dataFspace = dataset.getSpace(); const size_t frameNumber = _getFrameNumber( timestamp ); hsize_t dims[2]; dataFspace.getSimpleExtentDims( dims ); // get the correct slab const hsize_t dataDim[2] = { 1, dims[1] }; const hsize_t dataOffset[2] = { frameNumber, 0 }; dataFspace.selectHyperslab( H5S_SELECT_SET, dataDim, dataOffset ); // define mspace H5::DataSpace dataMspace( 1, &dataDim[1] ); // Write data to the dataset dataset.write( &voltages[0], H5::PredType::NATIVE_FLOAT, dataMspace, dataFspace ); return true; } CATCH_HDF5ERRORS return false; }
floatsPtr CompartmentReportCommon::loadFrame(const double timestamp) const { const size_t size = getFrameSize(); floatsPtr buffer(new floats(size)); if (size != 0) _loadFrame(_getFrameNumber(timestamp), buffer->data()); return buffer; }
size_t CompartmentReportCommon::getFrameCount() const { if (getStartTime() < getEndTime()) return _getFrameNumber(getEndTime()) + 1; return 0; }