/** Load the instrument geometry File * @param instrument :: instrument name. * @param localWorkspace :: MatrixWorkspace in which to put the instrument geometry */ void LoadPreNexusMonitors::runLoadInstrument(const std::string &instrument, MatrixWorkspace_sptr localWorkspace) { IAlgorithm_sptr loadInst = createChildAlgorithm("LoadInstrument"); // Now execute the Child Algorithm. Catch and log any error, but don't stop. bool executionSuccessful(true); try { loadInst->setPropertyValue("InstrumentName", instrument); loadInst->setProperty<MatrixWorkspace_sptr> ("Workspace", localWorkspace); loadInst->setProperty("RewriteSpectraMap", false); // We have a custom mapping loadInst->execute(); // Populate the instrument parameters in this workspace - this works around a bug localWorkspace->populateInstrumentParameters(); } catch (std::invalid_argument& e) { g_log.information() << "Invalid argument to LoadInstrument Child Algorithm : " << e.what() << std::endl; executionSuccessful = false; } catch (std::runtime_error& e) { g_log.information() << "Unable to successfully run LoadInstrument Child Algorithm : " << e.what() << std::endl; executionSuccessful = false; } // If loading instrument definition file fails if (!executionSuccessful) { g_log.error() << "Error loading Instrument definition file\n"; } else { this->instrument_loaded_correctly = true; } }
/** Load the instrument geometry File * @param eventfilename :: Used to pick the instrument. * @param localWorkspace :: MatrixWorkspace in which to put the instrument * geometry */ void LoadEventPreNexus::runLoadInstrument(const std::string &eventfilename, MatrixWorkspace_sptr localWorkspace) { // determine the instrument parameter file string instrument = Poco::Path(eventfilename).getFileName(); size_t pos = instrument.rfind("_"); // get rid of 'event.dat' pos = instrument.rfind("_", pos - 1); // get rid of 'neutron' pos = instrument.rfind("_", pos - 1); // get rid of the run number instrument = instrument.substr(0, pos); // do the actual work IAlgorithm_sptr loadInst = createChildAlgorithm("LoadInstrument"); // Now execute the Child Algorithm. Catch and log any error, but don't stop. loadInst->setPropertyValue("InstrumentName", instrument); loadInst->setProperty<MatrixWorkspace_sptr>("Workspace", localWorkspace); loadInst->setProperty("RewriteSpectraMap", false); loadInst->executeAsChildAlg(); // Populate the instrument parameters in this workspace - this works around a // bug localWorkspace->populateInstrumentParameters(); }
/** Loads the parameters from the Nexus file if possible, else from a parameter *file * into the specified workspace * @param nxfile :: open NeXus file * @param localWorkspace :: workspace into which loading occurs * * @throw FileError Thrown if unable to parse XML file */ void LoadIDFFromNexus::LoadParameters( ::NeXus::File *nxfile, const MatrixWorkspace_sptr localWorkspace) { std::string parameterString; // First attempt to load parameters from nexus file. nxfile->openGroup("instrument", "NXinstrument"); localWorkspace->loadInstrumentParametersNexus(nxfile, parameterString); nxfile->closeGroup(); // loadInstrumentParametersNexus does not populate any instrument params // so we do it here. localWorkspace->populateInstrumentParameters(); if (parameterString.empty()) { // No parameters have been found in Nexus file, so we look for them in a // parameter file. std::vector<std::string> directoryNames = ConfigService::Instance().getInstrumentDirectories(); const std::string instrumentName = localWorkspace->getInstrument()->getName(); for (const auto &directoryName : directoryNames) { // This will iterate around the directories from user ->etc ->install, and // find the first appropriate file const std::string paramFile = directoryName + instrumentName + "_Parameters.xml"; // Attempt to load specified file, if successful, use file and stop // search. if (loadParameterFile(paramFile, localWorkspace)) break; } } else { // We do have parameters from the Nexus file g_log.notice() << "Found Instrument parameter map entry in Nexus file, " "which is loaded.\n\n"; // process parameterString into parameters in workspace localWorkspace->readParameterMap(parameterString); } }
/** Reads the header of a .peaks file * @param outWS :: the workspace in which to place the information * @param in :: stream of the input file * @param T0 :: Time offset * @return the first word on the next line */ std::string LoadIsawPeaks::readHeader( PeaksWorkspace_sptr outWS, std::ifstream& in, double &T0 ) { std::string tag; std::string r = getWord( in , false ); if( r.length() < 1 ) throw std::logic_error( std::string( "No first line of Peaks file" ) ); if( r.compare( std::string( "Version:" ) ) != 0 ) throw std::logic_error( std::string( "No Version: on first line of Peaks file" ) ); std::string C_version = getWord( in , false ); if( C_version.length() < 1 ) throw std::logic_error( std::string( "No Version for Peaks file" ) ); getWord( in , false ); //tag // cppcheck-suppress unreadVariable std::string C_Facility = getWord( in , false ); getWord( in , false ); //tag std::string C_Instrument = getWord( in , false ); if( C_Instrument.length() < 1 ) throw std::logic_error( std::string( "No Instrument for Peaks file" ) ); // Date: use the current date/time if not found Kernel::DateAndTime C_experimentDate; std::string date; tag = getWord( in , false ); if(tag.empty()) date = Kernel::DateAndTime::getCurrentTime().toISO8601String(); else if(tag == "Date:") date = getWord( in , false ); readToEndOfLine( in , true ); // Now we load the instrument using the name and date MatrixWorkspace_sptr tempWS = WorkspaceFactory::Instance().create("Workspace2D", 1, 1, 1); tempWS->mutableRun().addProperty<std::string>("run_start", date); IAlgorithm_sptr loadInst= createChildAlgorithm("LoadInstrument"); loadInst->setPropertyValue("InstrumentName", C_Instrument); loadInst->setProperty<MatrixWorkspace_sptr> ("Workspace", tempWS); loadInst->executeAsChildAlg(); // Populate the instrument parameters in this workspace - this works around a bug tempWS->populateInstrumentParameters(); Geometry::Instrument_const_sptr instr_old = tempWS->getInstrument() ; boost::shared_ptr< ParameterMap > map(new ParameterMap()); Geometry::Instrument_const_sptr instr ( new Geometry::Instrument(instr_old->baseInstrument(), map )); //std::string s; std::string s = ApplyCalibInfo(in, "", instr_old, instr, T0); outWS->setInstrument( instr); // Now skip all lines on L1, detector banks, etc. until we get to a block of peaks. They start with 0. // readToEndOfLine( in , true ); // readToEndOfLine( in , true ); // s = getWord(in, false); while (s != "0" && in.good()) { readToEndOfLine( in , true ); s = getWord(in, false); } return s; }