/** Execute the algorithm. */ void MergeMDFiles::exec() { // clear disk buffer which can remain from previous runs // the existence/ usage of the buffer indicates if the algorithm works with // file based or memory based target workspaces; // pDiskBuffer = NULL; MultipleFileProperty *multiFileProp = dynamic_cast<MultipleFileProperty *>(getPointerToProperty("Filenames")); if (!multiFileProp) { throw std::logic_error( "Filenames property must have MultipleFileProperty type."); } m_Filenames = MultipleFileProperty::flattenFileNames(multiFileProp->operator()()); if (m_Filenames.size() == 0) throw std::invalid_argument("Must specify at least one filename."); std::string firstFile = m_Filenames[0]; std::string outputFile = getProperty("OutputFilename"); m_fileBasedTargetWS = false; if (!outputFile.empty()) { m_fileBasedTargetWS = true; if (Poco::File(outputFile).exists()) throw std::invalid_argument( " File " + outputFile + " already exists. Can not use existing file " "as the target to MergeMD files.\n" + " Use it as one of source files if you want to add MD data to it"); } // Start by loading the first file but just the box structure, no events, and // not file-backed // m_BoxStruct.loadBoxStructure(firstFile, IAlgorithm_sptr loader = createChildAlgorithm("LoadMD", 0.0, 0.05, false); loader->setPropertyValue("Filename", firstFile); loader->setProperty("MetadataOnly", false); loader->setProperty("BoxStructureOnly", true); loader->setProperty("FileBackEnd", false); loader->executeAsChildAlg(); IMDWorkspace_sptr result = (loader->getProperty("OutputWorkspace")); auto firstWS = boost::dynamic_pointer_cast<API::IMDEventWorkspace>(result); if (!firstWS) throw std::runtime_error( "Can not load MDEventWorkspace from initial file " + firstFile); // do the job this->doExecByCloning(firstWS, outputFile); m_OutIWS->setFileNeedsUpdating(false); setProperty("OutputWorkspace", m_OutIWS); }
/** Execute the algorithm. */ void LoadDNSSCD::exec() { MultipleFileProperty *multiFileProp = dynamic_cast<MultipleFileProperty *>(getPointerToProperty("Filenames")); if (!multiFileProp) { throw std::logic_error( "Filenames property must have MultipleFileProperty type."); } std::vector<std::string> filenames = VectorHelper::flattenVector(multiFileProp->operator()()); if (filenames.empty()) throw std::invalid_argument("Must specify at least one filename."); // set type of normalization std::string normtype = getProperty("Normalization"); if (normtype == "monitor") { m_normtype = "Monitor"; m_normfactor = 1.0; } else { m_normtype = "Timer"; m_normfactor = 0.0; // error for time should be 0 } g_log.notice() << "The normalization workspace will contain " << m_normtype << ".\n"; ExperimentInfo_sptr expinfo = boost::make_shared<ExperimentInfo>(); API::Run &run = expinfo->mutableRun(); for (auto fname : filenames) { std::map<std::string, std::string> str_metadata; std::map<std::string, double> num_metadata; try { read_data(fname, str_metadata, num_metadata); // if no stop_time, take file_save_time std::string time(str_metadata["stop_time"]); if (time.empty()) { g_log.warning() << "stop_time is empty! File save time will be used instead." << std::endl; time = str_metadata["file_save_time"]; } updateProperties<std::string>(run, str_metadata, time); updateProperties<double>(run, num_metadata, time); } catch (...) { g_log.warning() << "Failed to read file " << fname; g_log.warning() << ". This file will be ignored. " << std::endl; g_log.debug() << boost::current_exception_diagnostic_information() << std::endl; } } if (m_data.empty()) throw std::runtime_error( "No valid DNS files have been provided. Nothing to load."); m_OutWS = MDEventFactory::CreateMDWorkspace(m_nDims, "MDEvent"); m_OutWS->addExperimentInfo(expinfo); // load huber angles from a table workspace if given ITableWorkspace_sptr huberWS = getProperty("LoadHuberFrom"); if (huberWS) { g_log.notice() << "Huber angles will be loaded from " << huberWS->getName() << std::endl; loadHuber(huberWS); } // get wavelength TimeSeriesProperty<double> *wlprop = dynamic_cast<TimeSeriesProperty<double> *>( expinfo->run().getProperty("Lambda")); // assume, that lambda is in nm double wavelength = wlprop->minValue() * 10.0; // needed to estimate extents => minValue run.addProperty("wavelength", wavelength); run.getProperty("wavelength")->setUnits("Angstrom"); fillOutputWorkspace(wavelength); std::string saveHuberTableWS = getProperty("SaveHuberTo"); if (!saveHuberTableWS.empty()) { Mantid::API::ITableWorkspace_sptr huber_table = saveHuber(); setProperty("SaveHuberTo", huber_table); } setProperty("OutputWorkspace", m_OutWS); }