/** Executes the algorithm * @throw invalid_argument if the detection delay time is different for different monitors * @throw FileError if there was a problem opening the file or its format * @throw MisMatch<int> if not very spectra is associated with exaltly one detector * @throw IndexError if there is a problem converting spectra indexes to spectra numbers, which would imply there is a problem with the workspace * @throw runtime_error if the SpectraDetectorMap had not been filled */ void LoadDetectorInfo::exec() { // get the infomation that will be need from the user selected workspace, assume it exsists because of the validator in init() m_workspace = getProperty("Workspace"); m_numHists = static_cast<int>(m_workspace->getNumberHistograms()); // when we change the X-values will care take to maintain sharing. I have only implemented maintaining sharing where _all_ the arrays are initiall common m_commonXs = WorkspaceHelpers::sharedXData(m_workspace); // set the other member variables to their defaults m_FracCompl = 0.0; m_monitors.clear(); m_monitOffset = UNSETOFFSET; m_error = false; m_moveDets = getProperty("RelocateDets"); if( m_moveDets ) { Geometry::IObjComponent_const_sptr sample = m_workspace->getInstrument()->getSample(); if( sample ) m_samplePos = sample->getPos(); } // get the user selected filename std::string filename = getPropertyValue("DataFilename"); // load the data from the file using the correct algorithm depending on the assumed type of file if ( filename.find(".dat") == filename.size()-4 || filename.find(".DAT") == filename.size()-4 ) { readDAT(filename); } if ( filename.find(".sca") == filename.size()-4 || filename.find(".SCA") == filename.size()-4 ) { readDAT(filename); } if ( filename.find(".raw") == filename.size()-4 || filename.find(".RAW") == filename.size()-4) { readRAW(filename); } if (m_error) { g_log.warning() << "Note workspace " << getPropertyValue("Workspace") << " has been changed so if you intend to fix detector mismatch problems by running " << name() << " on this workspace again is likely to corrupt it" << std::endl; } }
/** * Init variables caches * @param :: Workspace pointer */ void SofQW2::initCachedValues(API::MatrixWorkspace_const_sptr workspace) { m_progress->report("Initializing caches"); // Retrieve the emode & efixed properties const std::string emode = getProperty("EMode"); // Convert back to an integer representation m_emode = 0; if (emode == "Direct") m_emode=1; else if (emode == "Indirect") m_emode = 2; m_efixed = getProperty("EFixed"); // Conversion constant for E->k. k(A^-1) = sqrt(energyToK*E(meV)) m_EtoK = 8.0*M_PI*M_PI*PhysicalConstants::NeutronMass*PhysicalConstants::meV*1e-20 / (PhysicalConstants::h*PhysicalConstants::h); // Get a pointer to the instrument contained in the workspace Geometry::Instrument_const_sptr instrument = workspace->getInstrument(); // Get the distance between the source and the sample (assume in metres) Geometry::IObjComponent_const_sptr source = instrument->getSource(); Geometry::IObjComponent_const_sptr sample = instrument->getSample(); m_samplePos = sample->getPos(); m_beamDir = m_samplePos - source->getPos(); m_beamDir.normalize(); // Is the instrument set up correctly double l1(0.0); try { l1 = source->getDistance(*sample); g_log.debug() << "Source-sample distance: " << l1 << std::endl; } catch (Exception::NotFoundError &) { throw Exception::InstrumentDefinitionError("Unable to calculate source-sample distance", workspace->getTitle()); } // Index Q cache initQCache(workspace); }