/** * Perform a call to nxgetslab, via the NexusClasses wrapped methods for a given blocksize. The xbins are read along with * each call to the data/error loading * @param data :: The NXDataSet object of y values * @param errors :: The NXDataSet object of error values * @param xbins :: The xbin NXDataSet * @param blocksize :: The blocksize to use * @param nchannels :: The number of channels for the block * @param hist :: The workspace index to start reading into * @param wsIndex :: The workspace index to save data into * @param local_workspace :: A pointer to the workspace */ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> & data, NXDataSetTyped<double> & errors, NXDouble & xbins, int64_t blocksize, int64_t nchannels, int64_t &hist, int64_t& wsIndex, API::MatrixWorkspace_sptr local_workspace) { data.load(static_cast<int>(blocksize),static_cast<int>(hist)); double *data_start = data(); double *data_end = data_start + nchannels; errors.load(static_cast<int>(blocksize),static_cast<int>(hist)); double *err_start = errors(); double *err_end = err_start + nchannels; xbins.load(static_cast<int>(blocksize),static_cast<int>(hist)); const int64_t nxbins(nchannels + 1); double *xbin_start = xbins(); double *xbin_end = xbin_start + nxbins; int64_t final(hist + blocksize); while( hist < final ) { MantidVec& Y = local_workspace->dataY(wsIndex); Y.assign(data_start, data_end); data_start += nchannels; data_end += nchannels; MantidVec& E = local_workspace->dataE(wsIndex); E.assign(err_start, err_end); err_start += nchannels; err_end += nchannels; MantidVec& X = local_workspace->dataX(wsIndex); X.assign(xbin_start, xbin_end); xbin_start += nxbins; xbin_end += nxbins; ++hist; ++wsIndex; } }
/** * Perform a call to nxgetslab, via the NexusClasses wrapped methods for a given * block-size * @param data :: The NXDataSet object * @param blocksize :: The block-size to use * @param period :: The period number * @param start :: The index within the file to start reading from (zero based) * @param hist :: The workspace index to start reading into * @param spec_num :: The spectrum number that matches the hist variable * @param local_workspace :: The workspace to fill the data with */ void LoadISISNexus2::loadBlock(NXDataSetTyped<int> &data, int64_t blocksize, int64_t period, int64_t start, int64_t &hist, int64_t &spec_num, DataObjects::Workspace2D_sptr &local_workspace) { data.load(static_cast<int>(blocksize), static_cast<int>(period), static_cast<int>(start)); // TODO this is just wrong int *data_start = data(); int *data_end = data_start + m_loadBlockInfo.numberOfChannels; int64_t final(hist + blocksize); while (hist < final) { m_progress->report("Loading data"); MantidVec &Y = local_workspace->dataY(hist); Y.assign(data_start, data_end); data_start += m_detBlockInfo.numberOfChannels; data_end += m_detBlockInfo.numberOfChannels; MantidVec &E = local_workspace->dataE(hist); std::transform(Y.begin(), Y.end(), E.begin(), dblSqrt); // Populate the workspace. Loop starts from 1, hence i-1 local_workspace->setX(hist, m_tof_data); if (m_load_selected_spectra) { // local_workspace->getAxis(1)->setValue(hist, // static_cast<specid_t>(spec_num)); auto spec = local_workspace->getSpectrum(hist); specid_t specID = m_specInd2specNum_map.at(hist); // set detectors corresponding to spectra Number spec->setDetectorIDs(m_spec2det_map.getDetectorIDsForSpectrumNo(specID)); // set correct spectra Number spec->setSpectrumNo(specID); } ++hist; ++spec_num; } }
/** * Perform a call to nxgetslab, via the NexusClasses wrapped methods for a given blocksize. This assumes that the * xbins have alread been cached * @param data :: The NXDataSet object of y values * @param errors :: The NXDataSet object of error values * @param blocksize :: The blocksize to use * @param nchannels :: The number of channels for the block * @param hist :: The workspace index to start reading into * @param local_workspace :: A pointer to the workspace */ void LoadNexusProcessed::loadBlock(NXDataSetTyped<double> & data, NXDataSetTyped<double> & errors, int64_t blocksize, int64_t nchannels, int64_t &hist, API::MatrixWorkspace_sptr local_workspace) { data.load(static_cast<int>(blocksize),static_cast<int>(hist)); errors.load(static_cast<int>(blocksize),static_cast<int>(hist)); double *data_start = data(); double *data_end = data_start + nchannels; double *err_start = errors(); double *err_end = err_start + nchannels; int64_t final(hist + blocksize); while( hist < final ) { MantidVec& Y = local_workspace->dataY(hist); Y.assign(data_start, data_end); data_start += nchannels; data_end += nchannels; MantidVec& E = local_workspace->dataE(hist); E.assign(err_start, err_end); err_start += nchannels; err_end += nchannels; local_workspace->setX(hist, m_xbins); ++hist; } }
/** * Perform a call to nxgetslab, via the NexusClasses wrapped methods for a given blocksize * @param data :: The NXDataSet object * @param blocksize :: The blocksize to use * @param period :: The period number * @param start :: The index within the file to start reading from (zero based) * @param hist :: The workspace index to start reading into * @param spec_num :: The spectrum number that matches the hist variable * @param local_workspace :: The workspace to fill the data with */ void LoadISISNexus2::loadBlock(NXDataSetTyped<int> & data, int64_t blocksize, int64_t period, int64_t start, int64_t &hist, int64_t& spec_num, DataObjects::Workspace2D_sptr local_workspace) { data.load(static_cast<int>(blocksize), static_cast<int>(period), static_cast<int>(start)); // TODO this is just wrong int *data_start = data(); int *data_end = data_start + m_numberOfChannels; int64_t final(hist + blocksize); while( hist < final ) { m_progress->report("Loading data"); MantidVec& Y = local_workspace->dataY(hist); Y.assign(data_start, data_end); data_start += m_numberOfChannels; data_end += m_numberOfChannels; MantidVec& E = local_workspace->dataE(hist); std::transform(Y.begin(), Y.end(), E.begin(), dblSqrt); // Populate the workspace. Loop starts from 1, hence i-1 local_workspace->setX(hist, m_tof_data); local_workspace->getAxis(1)->spectraNo(hist)= static_cast<specid_t>(spec_num); ++hist; ++spec_num; } }
/** Load the event_workspace field * * @param wksp_cls * @param progressStart * @param progressRange * @return */ API::MatrixWorkspace_sptr LoadNexusProcessed::loadEventEntry(NXData & wksp_cls, NXDouble & xbins, const double& progressStart, const double& progressRange) { NXDataSetTyped<int64_t> indices_data = wksp_cls.openNXDataSet<int64_t>("indices"); indices_data.load(); boost::shared_array<int64_t> indices = indices_data.sharedBuffer(); int numspec = indices_data.dim0()-1; int num_xbins = xbins.dim0(); if (num_xbins < 2) num_xbins = 2; EventWorkspace_sptr ws = boost::dynamic_pointer_cast<EventWorkspace> (WorkspaceFactory::Instance().create("EventWorkspace", numspec, num_xbins, num_xbins-1)); // Set the YUnit label ws->setYUnit(indices_data.attributes("units")); std::string unitLabel = indices_data.attributes("unit_label"); if (unitLabel.empty()) unitLabel = indices_data.attributes("units"); ws->setYUnitLabel(unitLabel); //Handle optional fields. // TODO: Handle inconsistent sizes boost::shared_array<int64_t> pulsetimes; if (wksp_cls.isValid("pulsetime")) { NXDataSetTyped<int64_t> pulsetime = wksp_cls.openNXDataSet<int64_t>("pulsetime"); pulsetime.load(); pulsetimes = pulsetime.sharedBuffer(); } boost::shared_array<double> tofs; if (wksp_cls.isValid("tof")) { NXDouble tof = wksp_cls.openNXDouble("tof"); tof.load(); tofs = tof.sharedBuffer(); } boost::shared_array<float> error_squareds; if (wksp_cls.isValid("error_squared")) { NXFloat error_squared = wksp_cls.openNXFloat("error_squared"); error_squared.load(); error_squareds = error_squared.sharedBuffer(); } boost::shared_array<float> weights; if (wksp_cls.isValid("weight")) { NXFloat weight = wksp_cls.openNXFloat("weight"); weight.load(); weights = weight.sharedBuffer(); } // What type of event lists? EventType type = TOF; if (tofs && pulsetimes && weights && error_squareds) type = WEIGHTED; else if ((tofs && weights && error_squareds)) type = WEIGHTED_NOTIME; else if (pulsetimes && tofs) type = TOF; else throw std::runtime_error("Could not figure out the type of event list!"); // Create all the event lists PARALLEL_FOR_NO_WSP_CHECK() for (int wi=0; wi < numspec; wi++) { PARALLEL_START_INTERUPT_REGION int64_t index_start = indices[wi]; int64_t index_end = indices[wi+1]; if (index_end >= index_start) { EventList & el = ws->getEventList(wi); el.switchTo(type); // Allocate all the required memory el.reserve(index_end - index_start); el.clearDetectorIDs(); for (long i=index_start; i<index_end; i++) switch (type) { case TOF: el.addEventQuickly( TofEvent( tofs[i], DateAndTime(pulsetimes[i])) ); break; case WEIGHTED: el.addEventQuickly( WeightedEvent( tofs[i], DateAndTime(pulsetimes[i]), weights[i], error_squareds[i]) ); break; case WEIGHTED_NOTIME: el.addEventQuickly( WeightedEventNoTime( tofs[i], weights[i], error_squareds[i]) ); break; } // Set the X axis if (this->m_shared_bins) el.setX(this->m_xbins); else { MantidVec x; x.resize(xbins.dim0()); for (int i=0; i < xbins.dim0(); i++) x[i] = xbins(wi, i); el.setX(x); } } progress(progressStart + progressRange*(1.0/numspec)); PARALLEL_END_INTERUPT_REGION } PARALLEL_CHECK_INTERUPT_REGION // Clean up some stuff ws->doneAddingEventLists(); return ws; }