void Load::loadMultipleFiles() { // allFilenames contains "rows" of filenames. If the row has more than 1 file // in it // then that row is to be summed across each file in the row const std::vector<std::vector<std::string>> allFilenames = getProperty("Filename"); std::string outputWsName = getProperty("OutputWorkspace"); std::vector<std::string> wsNames(allFilenames.size()); std::transform(allFilenames.begin(), allFilenames.end(), wsNames.begin(), generateWsNameFromFileNames); auto wsName = wsNames.cbegin(); assert(allFilenames.size() == wsNames.size()); std::vector<API::Workspace_sptr> loadedWsList; loadedWsList.reserve(allFilenames.size()); Workspace_sptr tempWs; // Cycle through the filenames and wsNames. for (auto filenames = allFilenames.cbegin(); filenames != allFilenames.cend(); ++filenames, ++wsName) { auto filename = filenames->cbegin(); Workspace_sptr sumWS = loadFileToWs(*filename, *wsName); ++filename; for (; filename != filenames->cend(); ++filename) { tempWs = loadFileToWs(*filename, "__@loadsum_temp@"); sumWS = plusWs(sumWS, tempWs); } API::WorkspaceGroup_sptr group = boost::dynamic_pointer_cast<WorkspaceGroup>(sumWS); if (group) { std::vector<std::string> childWsNames = group->getNames(); auto childWsName = childWsNames.begin(); size_t count = 1; for (; childWsName != childWsNames.end(); ++childWsName, ++count) { Workspace_sptr childWs = group->getItem(*childWsName); const std::string childName = group->getName() + "_" + std::to_string(count); API::AnalysisDataService::Instance().addOrReplace(childName, childWs); // childWs->setName(group->getName() + "_" + // boost::lexical_cast<std::string>(count)); } } // Add the sum to the list of loaded workspace names. loadedWsList.push_back(sumWS); } // If we only have one loaded ws, set it as the output. if (loadedWsList.size() == 1) { setProperty("OutputWorkspace", loadedWsList[0]); AnalysisDataService::Instance().rename(loadedWsList[0]->getName(), outputWsName); } // Else we have multiple loaded workspaces - group them and set the group as // output. else { API::WorkspaceGroup_sptr group = groupWsList(loadedWsList); setProperty("OutputWorkspace", group); std::vector<std::string> childWsNames = group->getNames(); size_t count = 1; for (auto &childWsName : childWsNames) { if (childWsName == outputWsName) { Mantid::API::Workspace_sptr child = group->getItem(childWsName); // child->setName(child->getName() + "_" + // boost::lexical_cast<std::string>(count)); const std::string childName = child->getName() + "_" + std::to_string(count); API::AnalysisDataService::Instance().addOrReplace(childName, child); count++; } } childWsNames = group->getNames(); count = 1; for (auto &childWsName : childWsNames) { Workspace_sptr childWs = group->getItem(childWsName); std::string outWsPropName = "OutputWorkspace_" + std::to_string(count); ++count; declareProperty(Kernel::make_unique<WorkspaceProperty<Workspace>>( outWsPropName, childWsName, Direction::Output)); setProperty(outWsPropName, childWs); } } // Clean up. if (tempWs) { Algorithm_sptr alg = AlgorithmManager::Instance().createUnmanaged("DeleteWorkspace"); alg->initialize(); alg->setChild(true); alg->setProperty("Workspace", tempWs); alg->execute(); } }
/// Execute the algorithm void SassenaFFT::exec() { const std::string gwsName = this->getPropertyValue("InputWorkspace"); API::WorkspaceGroup_sptr gws = this->getProperty("InputWorkspace"); const std::string ftqReName = gwsName + "_fqt.Re"; const std::string ftqImName = gwsName + "_fqt.Im"; // Make sure the intermediate structure factor is there if(!gws->contains(ftqReName) ) { const std::string errMessg = "workspace "+gwsName+" does not contain an intermediate structure factor"; this->g_log.error(errMessg); throw Kernel::Exception::NotFoundError("group workspace does not contain",ftqReName); } // Retrieve the real and imaginary parts of the intermediate scattering function DataObjects::Workspace2D_sptr fqtRe = boost::dynamic_pointer_cast<DataObjects::Workspace2D>( gws->getItem( ftqReName ) ); DataObjects::Workspace2D_sptr fqtIm = boost::dynamic_pointer_cast<DataObjects::Workspace2D>( gws->getItem( ftqImName ) ); // Calculate the FFT for all spectra, retaining only the real part since F(q,-t) = F*(q,t) int part=3; // extract the real part of the transform, assuming I(Q,t) is real const std::string sqwName = gwsName + "_sqw"; API::IAlgorithm_sptr fft = this->createChildAlgorithm("ExtractFFTSpectrum"); fft->setProperty<DataObjects::Workspace2D_sptr>("InputWorkspace", fqtRe); if( !this->getProperty("FFTonlyRealPart") ) { part=0; // extract the real part of the transform, assuming I(Q,t) is complex fft->setProperty<DataObjects::Workspace2D_sptr>("InputImagWorkspace", fqtIm); } fft->setPropertyValue("OutputWorkspace", sqwName ); fft->setProperty<int>("FFTPart",part); // extract the real part fft->executeAsChildAlg(); API::MatrixWorkspace_sptr sqw0 = fft->getProperty("OutputWorkspace"); DataObjects::Workspace2D_sptr sqw = boost::dynamic_pointer_cast<DataObjects::Workspace2D>( sqw0 ); API::AnalysisDataService::Instance().addOrReplace( sqwName, sqw ); // Transform the X-axis to appropriate dimensions // We assume the units of the intermediate scattering function are in picoseconds // The resulting frequency unit is in mili-eV, thus use m_ps2meV API::IAlgorithm_sptr scaleX = this->createChildAlgorithm("ScaleX"); scaleX->setProperty<DataObjects::Workspace2D_sptr>("InputWorkspace",sqw); scaleX->setProperty<double>("Factor", m_ps2meV); scaleX->setProperty<DataObjects::Workspace2D_sptr>("OutputWorkspace", sqw); scaleX->executeAsChildAlg(); //Do we apply the detailed balance condition exp(E/(2*kT)) ? if( this->getProperty("DetailedBalance") ) { double T = this->getProperty("Temp"); // The ExponentialCorrection algorithm assumes the form C0*exp(-C1*x). Note the explicit minus in the exponent API::IAlgorithm_sptr ec = this->createChildAlgorithm("ExponentialCorrection"); ec->setProperty<DataObjects::Workspace2D_sptr>("InputWorkspace", sqw); ec->setProperty<DataObjects::Workspace2D_sptr>("OutputWorkspace", sqw); ec->setProperty<double>("C0",1.0); ec->setProperty<double>("C1",-1.0/(2.0*T*m_T2ueV)); // Temperature in units of ueV ec->setPropertyValue("Operation","Multiply"); ec->executeAsChildAlg(); } // Set the Energy unit for the X-axis sqw->getAxis(0)->unit() = Kernel::UnitFactory::Instance().create("DeltaE"); // Add to group workspace, except if we are replacing the workspace. In this case, the group workspace // is already notified of the changes by the analysis data service. if(!gws->contains(sqwName)) { gws->add( sqwName ); } else { this->g_log.information("Workspace "+sqwName+" replaced with new contents"); } }