diff --git a/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h b/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h index 01edd88c41687fcb3dff71a37e7140f1cd711036..c22d72370816a2ddc30d48b49f2b1701f46aae74 100644 --- a/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h +++ b/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h @@ -188,6 +188,8 @@ namespace Mantid std::string defaultConfig() const; /// Writes out a fresh user properties file void createUserPropertiesFile() const; + /// Adds the passed path to the end of the list of data search paths + void appendDataSearchDir(const std::string & path); /// Convert any relative paths to absolute ones and store them locally so that /// if the working directory is altered the paths will not be affected void convertRelativeToAbsolute(); @@ -197,6 +199,8 @@ namespace Mantid void cacheDataSearchPaths(); /// Create the storage of the user search directories void cacheUserSearchPaths(); + /// Returns true if the path is in the data search list + bool isADataSearchDir(const std::string & path) const; // Forward declaration of inner class template <class T> diff --git a/Code/Mantid/Framework/Kernel/src/ConfigService.cpp b/Code/Mantid/Framework/Kernel/src/ConfigService.cpp index 55e082087b12f472f8202de66813bd7c55ef3df6..7e114ea188f70041e7c1f86ef0ec52b61d78a3eb 100644 --- a/Code/Mantid/Framework/Kernel/src/ConfigService.cpp +++ b/Code/Mantid/Framework/Kernel/src/ConfigService.cpp @@ -465,6 +465,46 @@ void ConfigServiceImpl::cacheUserSearchPaths() } } +/** + * The path that is passed should be as returned by makeAbsolute() and + * this function will return true if that path is in the list + * @param path the absolute path name to search for + * @return true if the path was found + */ +bool ConfigServiceImpl::isADataSearchDir(const std::string & path) const +{ + std::vector<std::string>::const_iterator it = m_DataSearchDirs.begin(); + for( ; it != m_DataSearchDirs.end(); ++it) + { + if ( path == *it ) + { + return true; + } + } + return false; +} + +/** + * Adds the passed path to the end of the list of data search paths + * the path name must be absolute + * @param path the absolute path to add + */ +void ConfigServiceImpl::appendDataSearchDir(const std::string & path) +{ + if ( ! isADataSearchDir(path) ) + { + std::string newSearchString; + std::vector<std::string>::const_iterator it = m_DataSearchDirs.begin(); + for( ; it != m_DataSearchDirs.end(); ++it) + { + newSearchString.append(*it); + newSearchString.append(";"); + } + newSearchString.append(path); + setString("datasearch.directories", newSearchString); + } +} + /** * writes a basic placeholder user.properties file to disk * any errors are caught and logged, but not propagated @@ -726,11 +766,15 @@ void ConfigServiceImpl::setString(const std::string & key, const std::string & v { cacheDataSearchPaths(); } - - if (key == "usersearch.directories") + else if (key == "usersearch.directories") { cacheUserSearchPaths(); } + else if (key == "defaultsave.directory") + { + //Some recursion here! As this call calls the current function + appendDataSearchDir(m_AbsolutePaths[key]); + } // If this key exists within the loaded configuration then mark that its value will have // changed from the default diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h index 1e8f216da6f4f44d079ea61661cf71c5874e6b4b..c2f69c48795acf97bca661d145f49adbe07051fa 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h @@ -44,7 +44,6 @@ private: void initLayout(); void setToolTips(); QListWidgetItem* insertListFront(const QString &text); - ///The directory where files are saved is defined by the config data service void changeOutputDir(Mantid::Kernel::ConfigValChangeNotification_ptr pDirInfo); void setOutDir(std::string dir); void readSettings(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h index 5864772ef62fac5e340a9dec6f35ec89933f690f..b1f70c8f17c6d98670d0b42206214dc25a35f61b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h @@ -14,7 +14,8 @@ #include <QStringList> #include "Poco/NObserver.h" #include "MantidAPI/AnalysisDataService.h" -#include "MantidAPI/MatrixWorkspace.h" +#include "MantidAPI/MatrixWorkspace.h" +#include "MantidKernel/ConfigService.h" namespace Mantid { @@ -78,7 +79,9 @@ signals: private: ///Mode enumeration - enum RunMode { SingleMode = 0, BatchMode }; + enum RunMode { SingleMode = 0, BatchMode }; + + /// Initialize the layout virtual void initLayout(); /// Init Python environment @@ -268,7 +271,9 @@ private: typedef QHash<const QCheckBox * const, QString>::const_iterator SavFormatsConstIt; /// A flag indicating there were warning messsages in the log bool m_log_warnings; - // An observer for a delete notification from Mantid + /// Get notified when the system input directories have changed + Poco::NObserver<SANSRunWindow, Mantid::Kernel::ConfigValChangeNotification> m_newInDir; + /// An observer for a delete notification from Mantid Poco::NObserver<SANSRunWindow, Mantid::API::WorkspaceDeleteNotification> m_delete_observer; /// A map of S2D detector names to QLabel pointers QList<QHash<QString, QLabel*> > m_s2d_detlabels; @@ -290,8 +295,10 @@ private: QAction *m_batch_paste; ///A clear action for the batch table QAction *m_batch_clear; - - bool setDataDir(); + + void upDateDataDir(); + bool exportDataDir(); + void handleInputDirChange(Mantid::Kernel::ConfigValChangeNotification_ptr pDirInfo); //A reference to a logger static Mantid::Kernel::Logger & g_log; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui index 96e07a2a3ebc5ab4e706ac18e1e74e0ab3c5f8be..d3b6db5ad5c43a0133fa2406244dc51bdced801b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui @@ -5,8 +5,8 @@ <rect> <x>0</x> <y>0</y> - <width>724</width> - <height>450</height> + <width>719</width> + <height>480</height> </rect> </property> <property name="sizePolicy" > @@ -73,32 +73,32 @@ <attribute name="title" > <string>Run Numbers</string> </attribute> - <layout class="QGridLayout" name="gridLayout_21" > - <item row="0" column="0" colspan="2" > - <layout class="QHBoxLayout" name="horizontalLayout_12" > - <item> - <widget class="QLabel" name="label_7" > + <layout class="QGridLayout" name="gridLayout_47" > + <item row="0" column="0" > + <layout class="QGridLayout" name="gridLayout_46" > + <item row="0" column="0" > + <widget class="QLabel" name="label_11" > <property name="sizePolicy" > <sizepolicy vsizetype="Maximum" hsizetype="Maximum" > - <horstretch>0</horstretch> + <horstretch>39</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> - <property name="maximumSize" > + <property name="minimumSize" > <size> - <width>16777215</width> - <height>16777215</height> + <width>39</width> + <height>0</height> </size> </property> <property name="text" > - <string>Data directory</string> + <string>User file: </string> </property> </widget> </item> - <item> - <widget class="QLineEdit" name="datadir_edit" > + <item row="0" column="1" colspan="2" > + <widget class="QLineEdit" name="userfile_edit" > <property name="sizePolicy" > - <sizepolicy vsizetype="Maximum" hsizetype="Minimum" > + <sizepolicy vsizetype="Maximum" hsizetype="Preferred" > <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> @@ -111,8 +111,8 @@ </property> </widget> </item> - <item> - <widget class="QPushButton" name="data_dirBtn" > + <item row="0" column="3" > + <widget class="QPushButton" name="userfileBtn" > <property name="sizePolicy" > <sizepolicy vsizetype="Maximum" hsizetype="Minimum" > <horstretch>0</horstretch> @@ -120,68 +120,74 @@ </sizepolicy> </property> <property name="text" > - <string>Browse</string> + <string>Load Mask</string> </property> <property name="autoDefault" > <bool>false</bool> </property> </widget> </item> - <item> - <spacer name="horizontalSpacer" > - <property name="orientation" > - <enum>Qt::Horizontal</enum> + <item row="1" column="0" > + <widget class="QLabel" name="outDirs_lb" > + <property name="sizePolicy" > + <sizepolicy vsizetype="Preferred" hsizetype="Minimum" > + <horstretch>50</horstretch> + <verstretch>0</verstretch> + </sizepolicy> </property> - <property name="sizeHint" stdset="0" > + <property name="minimumSize" > <size> - <width>40</width> - <height>20</height> + <width>0</width> + <height>0</height> </size> </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="label_11" > - <property name="sizePolicy" > - <sizepolicy vsizetype="Maximum" hsizetype="Maximum" > - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <property name="maximumSize" > + <size> + <width>16777215</width> + <height>16777215</height> + </size> </property> <property name="text" > - <string>User file</string> + <string>Data Directory:</string> </property> </widget> </item> - <item> - <widget class="QLineEdit" name="userfile_edit" > + <item row="1" column="1" > + <widget class="QLabel" name="saveDir_lb" > + <property name="text" > + <string>TextLabel</string> + </property> + </widget> + </item> + <item row="1" column="2" > + <widget class="QLabel" name="plusDirs_lb" > <property name="sizePolicy" > - <sizepolicy vsizetype="Maximum" hsizetype="Maximum" > - <horstretch>0</horstretch> + <sizepolicy vsizetype="Minimum" hsizetype="Minimum" > + <horstretch>55</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="minimumSize" > <size> - <width>200</width> + <width>55</width> <height>0</height> </size> </property> - <property name="alignment" > - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> + <property name="text" > + <string>+? others</string> </property> </widget> </item> - <item> - <widget class="QPushButton" name="userfileBtn" > + <item row="1" column="3" > + <widget class="QPushButton" name="data_dirBtn" > <property name="sizePolicy" > - <sizepolicy vsizetype="Maximum" hsizetype="Maximum" > + <sizepolicy vsizetype="Maximum" hsizetype="Minimum" > <horstretch>0</horstretch> <verstretch>0</verstretch> </sizepolicy> </property> <property name="text" > - <string>Load Mask</string> + <string>Manage Directories</string> </property> <property name="autoDefault" > <bool>false</bool> @@ -190,7 +196,7 @@ </item> </layout> </item> - <item row="1" column="0" colspan="2" > + <item row="1" column="0" > <layout class="QHBoxLayout" name="horizontalLayout_8" > <item> <widget class="QRadioButton" name="single_mode_btn" > @@ -270,78 +276,18 @@ </item> </layout> </item> - <item row="4" column="0" > - <widget class="QGroupBox" name="groupBox_4" > - <property name="title" > - <string>Options</string> - </property> - <layout class="QGridLayout" name="gridLayout_20" > - <item row="0" column="1" > - <widget class="QCheckBox" name="verbose_check" > - <property name="text" > - <string>Verbose</string> - </property> - </widget> - </item> - <item row="0" column="2" > - <widget class="QCheckBox" name="log_colette" > - <property name="text" > - <string>Log Colette cmds</string> - </property> - </widget> - </item> - <item row="0" column="0" > - <widget class="QCheckBox" name="plot_check" > - <property name="text" > - <string>Plot result</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="5" column="0" > - <widget class="QGroupBox" name="groupBox_7" > - <property name="title" > - <string>Reduce</string> - </property> - <property name="flat" > - <bool>false</bool> - </property> - <layout class="QGridLayout" name="gridLayout_19" > - <item row="0" column="0" > - <widget class="QPushButton" name="load_dataBtn" > - <property name="text" > - <string>Load Data</string> - </property> - </widget> - </item> - <item row="0" column="1" > - <widget class="QPushButton" name="oneDBtn" > - <property name="text" > - <string>1D Reduce</string> - </property> - </widget> - </item> - <item row="0" column="2" > - <widget class="QPushButton" name="twoDBtn" > - <property name="text" > - <string>2D Reduce</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - <item row="2" column="0" colspan="2" > + <item row="2" column="0" > <widget class="Line" name="line_2" > <property name="orientation" > <enum>Qt::Horizontal</enum> </property> </widget> </item> - <item row="3" column="0" colspan="2" > + <item row="3" column="0" > <widget class="QStackedWidget" name="mode_stack" > + <property name="lineWidth" > + <number>0</number> + </property> <property name="currentIndex" > <number>0</number> </property> @@ -908,6 +854,185 @@ </item> </layout> </item> + <item> + <layout class="QGridLayout" name="gridLayout_44" > + <item row="0" column="0" > + <widget class="QGroupBox" name="groupBox_4" > + <property name="title" > + <string>Options</string> + </property> + <layout class="QGridLayout" name="gridLayout_20" > + <item row="0" column="1" > + <widget class="QCheckBox" name="verbose_check" > + <property name="text" > + <string>Verbose</string> + </property> + </widget> + </item> + <item row="0" column="2" > + <widget class="QCheckBox" name="log_colette" > + <property name="text" > + <string>Log Colette cmds</string> + </property> + </widget> + </item> + <item row="0" column="0" > + <widget class="QCheckBox" name="plot_check" > + <property name="text" > + <string>Plot result</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item row="1" column="0" > + <widget class="QGroupBox" name="groupBox_7" > + <property name="title" > + <string>Reduce</string> + </property> + <property name="flat" > + <bool>false</bool> + </property> + <layout class="QGridLayout" name="gridLayout_19" > + <item row="0" column="0" > + <widget class="QPushButton" name="load_dataBtn" > + <property name="text" > + <string>Load Data</string> + </property> + </widget> + </item> + <item row="0" column="1" > + <widget class="QPushButton" name="oneDBtn" > + <property name="text" > + <string>1D Reduce</string> + </property> + </widget> + </item> + <item row="0" column="2" > + <widget class="QPushButton" name="twoDBtn" > + <property name="text" > + <string>2D Reduce</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + <item rowspan="2" row="0" column="1" > + <widget class="QGroupBox" name="groupBox_5" > + <property name="title" > + <string>Save</string> + </property> + <layout class="QGridLayout" name="gridLayout" > + <item rowspan="2" row="0" column="4" > + <widget class="QPushButton" name="saveFilename_btn" > + <property name="minimumSize" > + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="toolTip" > + <string>Save the output workspace to this file</string> + </property> + <property name="text" > + <string>Browse</string> + </property> + </widget> + </item> + <item row="3" column="4" > + <widget class="QCheckBox" name="saveCSV_check" > + <property name="toolTip" > + <string>Select one or more file formats</string> + </property> + <property name="text" > + <string>CSV</string> + </property> + </widget> + </item> + <item row="3" column="3" > + <widget class="QCheckBox" name="saveRKH_check" > + <property name="toolTip" > + <string>Select one or more file formats</string> + </property> + <property name="text" > + <string>RKH</string> + </property> + </widget> + </item> + <item row="3" column="2" > + <widget class="QCheckBox" name="saveCan_check" > + <property name="toolTip" > + <string>Select one or more file formats</string> + </property> + <property name="text" > + <string>CanSAS</string> + </property> + </widget> + </item> + <item row="3" column="1" > + <widget class="QCheckBox" name="saveNex_check" > + <property name="toolTip" > + <string>Select one or more file formats</string> + </property> + <property name="text" > + <string>Nexus</string> + </property> + </widget> + </item> + <item rowspan="2" row="0" column="0" > + <widget class="QLabel" name="label_58" > + <property name="toolTip" > + <string>Save the output workspace to this file</string> + </property> + <property name="text" > + <string>Filename:</string> + </property> + </widget> + </item> + <item rowspan="2" row="2" column="0" > + <widget class="QLabel" name="label_64" > + <property name="toolTip" > + <string>Select one or more file formats</string> + </property> + <property name="text" > + <string>Formats:</string> + </property> + </widget> + </item> + <item row="4" column="1" colspan="2" > + <widget class="QPushButton" name="saveDefault_btn" > + <property name="toolTip" > + <string>Save the workspace from a single run file reduction</string> + </property> + <property name="text" > + <string>Save Result</string> + </property> + </widget> + </item> + <item row="1" column="1" colspan="3" > + <widget class="QLineEdit" name="outfile_edit" > + <property name="toolTip" > + <string>Save the output workspace to this file</string> + </property> + </widget> + </item> + <item row="4" column="3" colspan="2" > + <widget class="QPushButton" name="saveSel_btn" > + <property name="toolTip" > + <string>Save multiple workspaces</string> + </property> + <property name="text" > + <string>Save Other</string> + </property> + </widget> + </item> + </layout> + </widget> + </item> + </layout> + </item> </layout> </widget> <widget class="QWidget" name="page_6" > @@ -1033,118 +1158,6 @@ </widget> </widget> </item> - <item rowspan="2" row="4" column="1" > - <widget class="QGroupBox" name="groupBox_5" > - <property name="title" > - <string>Save</string> - </property> - <layout class="QGridLayout" name="gridLayout" > - <item rowspan="2" row="0" column="4" > - <widget class="QPushButton" name="saveFilename_btn" > - <property name="minimumSize" > - <size> - <width>0</width> - <height>0</height> - </size> - </property> - <property name="toolTip" > - <string>Save the output workspace to this file</string> - </property> - <property name="text" > - <string>Browse</string> - </property> - </widget> - </item> - <item row="3" column="4" > - <widget class="QCheckBox" name="saveCSV_check" > - <property name="toolTip" > - <string>Select one or more file formats</string> - </property> - <property name="text" > - <string>CSV</string> - </property> - </widget> - </item> - <item row="3" column="3" > - <widget class="QCheckBox" name="saveRKH_check" > - <property name="toolTip" > - <string>Select one or more file formats</string> - </property> - <property name="text" > - <string>RKH</string> - </property> - </widget> - </item> - <item row="3" column="2" > - <widget class="QCheckBox" name="saveCan_check" > - <property name="toolTip" > - <string>Select one or more file formats</string> - </property> - <property name="text" > - <string>CanSAS</string> - </property> - </widget> - </item> - <item row="3" column="1" > - <widget class="QCheckBox" name="saveNex_check" > - <property name="toolTip" > - <string>Select one or more file formats</string> - </property> - <property name="text" > - <string>Nexus</string> - </property> - </widget> - </item> - <item rowspan="2" row="0" column="0" > - <widget class="QLabel" name="label_58" > - <property name="toolTip" > - <string>Save the output workspace to this file</string> - </property> - <property name="text" > - <string>Filename:</string> - </property> - </widget> - </item> - <item rowspan="2" row="2" column="0" > - <widget class="QLabel" name="label_64" > - <property name="toolTip" > - <string>Select one or more file formats</string> - </property> - <property name="text" > - <string>Formats:</string> - </property> - </widget> - </item> - <item row="4" column="1" colspan="2" > - <widget class="QPushButton" name="saveDefault_btn" > - <property name="toolTip" > - <string>Save the workspace from a single run file reduction</string> - </property> - <property name="text" > - <string>Save Result</string> - </property> - </widget> - </item> - <item row="1" column="1" colspan="3" > - <widget class="QLineEdit" name="outfile_edit" > - <property name="toolTip" > - <string>Save the output workspace to this file</string> - </property> - </widget> - </item> - <item row="4" column="3" colspan="2" > - <widget class="QPushButton" name="saveSel_btn" > - <property name="toolTip" > - <string>Save multiple workspaces</string> - </property> - <property name="text" > - <string>Save Other</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> </layout> </widget> <widget class="QWidget" name="tab_2" > @@ -1152,7 +1165,7 @@ <string>Analysis Details</string> </attribute> <layout class="QGridLayout" name="gridLayout_13" > - <item row="0" column="0" > + <item row="1" column="0" > <layout class="QHBoxLayout" name="horizontalLayout_4" > <item> <widget class="QGroupBox" name="limits_group" > @@ -1641,7 +1654,7 @@ p, li { white-space: pre-wrap; } </item> </layout> </item> - <item row="0" column="1" > + <item row="1" column="1" > <layout class="QVBoxLayout" name="verticalLayout_8" > <item> <widget class="QGroupBox" name="groupBox_14" > @@ -1825,7 +1838,7 @@ p, li { white-space: pre-wrap; } </item> </layout> </item> - <item rowspan="2" row="1" column="0" > + <item rowspan="2" row="3" column="0" > <widget class="QGroupBox" name="groupBox_6" > <property name="title" > <string>Efficiency correction</string> @@ -1906,7 +1919,7 @@ p, li { white-space: pre-wrap; } </layout> </widget> </item> - <item row="1" column="1" > + <item row="3" column="1" > <layout class="QHBoxLayout" name="horizontalLayout_6" > <item> <widget class="QGroupBox" name="groupBox_3" > @@ -2027,7 +2040,7 @@ p, li { white-space: pre-wrap; } </item> </layout> </item> - <item row="2" column="1" > + <item row="4" column="1" > <spacer name="verticalSpacer_2" > <property name="orientation" > <enum>Qt::Vertical</enum> @@ -2040,6 +2053,58 @@ p, li { white-space: pre-wrap; } </property> </spacer> </item> + <item row="5" column="0" > + <spacer name="verticalSpacer_5" > + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item row="0" column="0" > + <spacer name="verticalSpacer_11" > + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="0" > + <spacer name="verticalSpacer_12" > + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item row="2" column="1" > + <spacer name="verticalSpacer_13" > + <property name="orientation" > + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0" > + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> </layout> </widget> <widget class="QWidget" name="tab_4" > diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp index 14566988b4e40007744cf4e5c3f13223d539b628..817e3b16b38a95cab86ae64c9b24cbc117a9ba01 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp @@ -145,7 +145,7 @@ void SANSAddFiles::setOutDir(std::string dir) m_outDir = QString::fromStdString(dir); m_SANSForm->summedPath_lb->setText(OUT_MSG+m_outDir); } -/** Update the output directory edit box if the Mantid system output +/** Update the output directory label if the Mantid system output * directory has changed * @param pDirInfo a pointer to an object with the output directory name in it */ @@ -285,9 +285,9 @@ void SANSAddFiles::new2AddBrowse() { QSettings prevVals; prevVals.beginGroup("CustomInterfaces/SANSRunWindow/AddRuns"); - //get the previous data input directory or, if there wasn't one, use the directory entered on the main form - QString dir = - prevVals.value("InPath", m_SANSForm->datadir_edit->text()).toString(); + //get the previous data input directory or, if there wasn't one, the first directory of on the default load path + std::string d0 = ConfigService::Instance().getDataSearchDirs()[0]; + QString dir = prevVals.value("InPath",QString::fromStdString(d0)).toString(); QString fileFilter = "Files ("; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp index 3b58757e259c7432eede245eb51c90a2c39b4d1c..a86ef93077051deea1077ab35c7e0db8675df46a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp @@ -3,7 +3,8 @@ //---------------------- #include "MantidQtCustomInterfaces/SANSRunWindow.h" #include "MantidQtCustomInterfaces/SANSUtilityDialogs.h" -#include "MantidQtCustomInterfaces/SANSAddFiles.h" +#include "MantidQtCustomInterfaces/SANSAddFiles.h" +#include "MantidQtAPI/ManageUserDirectories.h" #include "MantidQtAPI/FileDialogHandler.h" #include "MantidKernel/ConfigService.h" @@ -63,22 +64,31 @@ SANSRunWindow::SANSRunWindow(QWidget *parent) : m_data_dir(""), m_ins_defdir(""), m_last_dir(""), m_cfg_loaded(true), m_userFname(false), m_sample_no(), m_run_no_boxes(), m_period_lbls(), m_warnings_issued(false), m_force_reload(false), - m_log_warnings(false), + m_log_warnings(false), m_newInDir(*this, &SANSRunWindow::handleInputDirChange), m_delete_observer(*this, &SANSRunWindow::handleMantidDeleteWorkspace), m_s2d_detlabels(), m_loq_detlabels(), m_allowed_batchtags(), m_lastreducetype(-1), m_have_reducemodule(false), m_dirty_batch_grid(false), m_tmp_batchfile("") { + ConfigService::Instance().addObserver(m_newInDir); } ///Destructor SANSRunWindow::~SANSRunWindow() { - if( isInitialized() ) + try { - // Seems to crash on destruction of if I don't do this - AnalysisDataService::Instance().notificationCenter.removeObserver(m_delete_observer); - saveSettings(); - delete m_addFilesTab; + ConfigService::Instance().removeObserver(m_newInDir); + if( isInitialized() ) + { + // Seems to crash on destruction of if I don't do this + AnalysisDataService::Instance().notificationCenter.removeObserver(m_delete_observer); + saveSettings(); + delete m_addFilesTab; + } + } + catch(...) + { + //we've cleaned up the best we can, move on } } @@ -163,7 +173,7 @@ void SANSRunWindow::initLayout() m_addFilesTab = new SANSAddFiles(this, &m_uiForm); } //Listen for Workspace delete signals - AnalysisDataService::Instance().notificationCenter.addObserver(m_delete_observer); + AnalysisDataService::Instance().notificationCenter.addObserver(m_delete_observer); readSettings(); } @@ -388,7 +398,6 @@ void SANSRunWindow::readSettings() g_log.debug("Reading settings."); QSettings value_store; value_store.beginGroup("CustomInterfaces/SANSRunWindow"); - m_uiForm.datadir_edit->setText(value_store.value("data_dir").toString()); m_uiForm.userfile_edit->setText(value_store.value("user_file").toString()); m_last_dir = value_store.value("last_dir", "").toString(); @@ -405,7 +414,9 @@ void SANSRunWindow::readSettings() } //The instrument definition directory - m_ins_defdir = QString::fromStdString(ConfigService::Instance().getString("instrumentDefinition.directory")); + m_ins_defdir = QString::fromStdString( + ConfigService::Instance().getString("instrumentDefinition.directory")); + upDateDataDir(); // Set allowed extensions m_uiForm.file_opt->clear(); @@ -422,8 +433,8 @@ void SANSRunWindow::readSettings() value_store.endGroup(); readSaveSettings(value_store); - g_log.debug() << "Found previous data directory " << m_uiForm.datadir_edit->text().toStdString() - << "\nFound previous user mask file " << m_uiForm.userfile_edit->text().toStdString() + g_log.debug() << "Found previous data directory " << "\nFound previous user mask file " + << m_uiForm.userfile_edit->text().toStdString() << "\nFound instrument definition directory " << m_ins_defdir.toStdString() << std::endl; } @@ -1598,18 +1609,11 @@ void SANSRunWindow::markError(QLabel* label) /** * Select the base directory for the data */ -void SANSRunWindow::selectDataDir() -{ - QString data_dir = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), m_last_dir); - if( !data_dir.isEmpty() && QDir(data_dir).exists() ) - { - m_last_dir = data_dir; - m_data_dir = data_dir; - m_uiForm.datadir_edit->setText(data_dir); - } +void SANSRunWindow::selectDataDir() +{ + MantidQt::API::ManageUserDirectories::openUserDirsDialog(this); } - /** * Select and load the user file */ @@ -1741,14 +1745,12 @@ bool SANSRunWindow::browseForFile(const QString & box_title, QLineEdit* file_fie bool SANSRunWindow::oldLoadButtonClick() { QString origin_dir = QDir::currentPath(); - QString work_dir = QDir(m_uiForm.datadir_edit->text()).absolutePath(); - if( work_dir.isEmpty() || !QDir(work_dir).exists() ) + if( m_data_dir.isEmpty() || !QDir(m_data_dir).exists() ) { - showInformationBox("The specified data directory " + m_uiForm.datadir_edit->text() + " does not exist."); + showInformationBox("The data directory " + m_data_dir + " does not exist."); return false; } - if( !work_dir.endsWith('/') ) work_dir += "/"; - m_data_dir = work_dir; + if( !m_data_dir.endsWith('/') ) m_data_dir += "/"; runReduceScriptFunction("import SANSReduction\nSANSReduction.INSTRUMENT = i.ISIS_global().instrument\nSANSReduction.DataPath('" + m_data_dir + "')"); runReduceScriptFunction("SANSReduction.UserPath('" + QFileInfo(m_uiForm.userfile_edit->text()).path() + "')"); @@ -1878,7 +1880,7 @@ bool SANSRunWindow::oldLoadButtonClick() */ bool SANSRunWindow::handleLoadButtonClick() { - if ( ! setDataDir() ) + if ( ! exportDataDir() ) { return false; } @@ -2075,7 +2077,7 @@ QString SANSRunWindow::createAnalysisDetailsScript(const QString & type) QString exec_reduce = "i.ISIS_global().instrument.setDetector('" + m_uiForm.detbank_sel->currentText() + "')\n"; - setDataDir(); + exportDataDir(); exec_reduce += "i.ISIS_global().to_Q.output_type='"+type+"'\n"; //Analysis details @@ -2163,7 +2165,7 @@ QString SANSRunWindow::createOldAnalysisDetailsScript(const QString & type) QString exec_reduce = "SANSReduction.Detector('" + m_uiForm.detbank_sel->currentText() + "')\n"; //Add the path in the single mode data box if it is not empty - QString data_path = m_uiForm.datadir_edit->text(); + QString data_path = m_data_dir; if( !data_path.isEmpty() ) { exec_reduce += "SANSReduction.DataPath('" + data_path + "')\n"; @@ -3428,22 +3430,56 @@ void SANSRunWindow::checkLogFlags() } m_log_warnings = false; } -/** Update Python variables with the user selected directory in datadir_edit - */ -bool SANSRunWindow::setDataDir() +/** Display the first data search and the number of data directorys to users and +* update our input directory in m_data_dir +*/ +void SANSRunWindow::upDateDataDir() +{ + const std::vector<std::string> &dirs + = ConfigService::Instance().getDataSearchDirs(); + if ( ! dirs.empty() ) + {// use the first directory in the list + m_data_dir = QString::fromStdString(dirs.front()); + m_uiForm.saveDir_lb->setText(m_data_dir); + + m_uiForm.plusDirs_lb->setText( + QString("+ ") + QString::number(dirs.size()-1) + QString(" others")); + } + else + { + m_data_dir = ""; + m_uiForm.saveDir_lb->setText("No input search directories defined"); + m_uiForm.plusDirs_lb->setText(""); + } + +} +/** Set the Python data directory to that displayed on this GUI, which is the first data +* serach directory +* @return false if the there were Python errors, otherwise true +*/ +bool SANSRunWindow::exportDataDir() { - QString work_dir = QDir(m_uiForm.datadir_edit->text()).absolutePath(); - if( work_dir.isEmpty() || !QDir(work_dir).exists() ) + if( m_data_dir.isEmpty() || !QDir(m_data_dir).exists() ) { - showInformationBox("The specified data directory " + m_uiForm.datadir_edit->text() + " does not exist."); + showInformationBox("The specified data directory \"" + m_data_dir + "\" does not exist. Use the \"Manage Directories\" button to change this"); return false; } - if( !work_dir.endsWith('/') ) work_dir += "/"; - m_data_dir = work_dir; + if( !m_data_dir.endsWith('/') ) m_data_dir += "/"; const QString worked = runReduceScriptFunction("i.ISIS_global().set_data_path('" + m_data_dir + "')"); return worked != "Error"; +} +/** Update the input directory labels if the Mantid system input +* directories have changed +* @param pDirInfo a pointer to an object with the output directory name in it +*/ +void SANSRunWindow::handleInputDirChange(Mantid::Kernel::ConfigValChangeNotification_ptr pDirInfo) +{ + if ( pDirInfo->key() == "datasearch.directories" ) + { + upDateDataDir(); + } } } //namespace CustomInterfaces diff --git a/Code/Mantid/Scripts/SANS/ISISCommandInterface.py b/Code/Mantid/Scripts/SANS/ISISCommandInterface.py index 65cf0d786ef3b3f826713e4bbbe85d774d3e835e..32b4a0ffc8c1982397e32ac1a0cbead679d08a69 100644 --- a/Code/Mantid/Scripts/SANS/ISISCommandInterface.py +++ b/Code/Mantid/Scripts/SANS/ISISCommandInterface.py @@ -173,7 +173,7 @@ def AssignSample(sample_run, reload = True, period = -1): sample_wksp, logs = ISIS_global().data_loader.execute( ISIS_global(), None) - ISIS_global().set_run_number(sample_run, sample_wksp) + ISIS_global().set_run_number(sample_wksp) return sample_wksp, logs def SetCentre(XVAL, YVAL): diff --git a/Code/Mantid/Scripts/SANS/isis_instrument.py b/Code/Mantid/Scripts/SANS/isis_instrument.py index 1671e1b4024465077c31d613c57f457159253fb2..f81266ed89c7784e3f189f1a9b2ab9fa2644c30a 100644 --- a/Code/Mantid/Scripts/SANS/isis_instrument.py +++ b/Code/Mantid/Scripts/SANS/isis_instrument.py @@ -431,18 +431,25 @@ class LOQ(ISISInstrument): class SANS2D(ISISInstrument): - + """ + The SANS2D instrument has movable detectors whose locations have to + be read in from the workspace logs (Run object) + """ + _NAME = 'SANS2D' # Number of digits in standard file name run_number_width = 8 WAV_RANGE_MIN = 2.0 WAV_RANGE_MAX = 14.0 def __init__(self, wrksp_name=None): - self._NAME = 'SANS2D' super(SANS2D, self).__init__(wrksp_name) self._marked_dets = [] - + # set to true once the detector positions have been moved to the locations given in the sample logs + self.corrections_applied = False + # a warning is issued if the can logs are not the same as the sample + self._can_logs = {} + def set_up_for_run(self, base_runno): """ Handles changes required when a sample is loaded, both generic @@ -506,12 +513,47 @@ class SANS2D(ISISInstrument): #does this reflect the detector being immovable? return [0.0,0.0], [xshift, yshift] - # Load the detector logs - def load_detector_logs(self,log_name,file_path): - # Adding runs produces a 1000nnnn or 2000nnnn. For less copying, of log files doctor the filename + def get_detector_log(self, logs, period=-1): + """ + Reads information about the state of the instrument on the current run + from the log files + @param logs: a workspace pointer for NeXus files or a .log file for raw files + """ self._marked_dets = [] - log_name = log_name[0:6] + '0' + log_name[7:] - filename = os.path.join(file_path, log_name + '.log') + + try: + logvalues = self._get_sample_logs(logs, period) + except AttributeError: + #this happens if we were passed a filename, as raw files have .log files + logvalues = self._get_dot_log_file(logs) + + return logvalues + + def _get_sample_logs(self, p_wksp, period): + """ + Reads information about the state of the instrument on the information + stored in the sample + @param logs: a workspace pointer + @return the values that were read as a dictionary + """ + samp = p_wksp.getSampleDetails() + + logvalues = {} + logvalues['Front_Det_Z'] = self._get_log(samp, 'Front_Det_Z', period) + logvalues['Front_Det_X'] = self._get_log(samp, 'Front_Det_X', period) + logvalues['Front_Det_Rot'] = self._get_log(samp, 'Front_Det_Rot', period) + logvalues['Rear_Det_Z'] = self._get_log(samp, 'Rear_Det_Z', period) + logvalues['Rear_Det_X'] = self._get_log(samp, 'Rear_Det_X', period) + + return logvalues + + def _get_log(self, log_data, log_name, period): + if period == -1: + return float(log_data.getLogData(log_name).value) + else: + return float(log_data.getLogData(log_name).value[period]) + + def _get_dot_log_file(self, log_file): # Build a dictionary of log data logvalues = {} @@ -521,28 +563,77 @@ class SANS2D(ISISInstrument): logvalues['Front_Det_Z'] = '0.0' logvalues['Front_Det_Rot'] = '0.0' try: - file_handle = open(filename, 'r') + file_handle = open(log_file, 'r') except IOError: - mantid.sendLogMessage("::SANS::load_detector_logs: Log file \"" + filename + "\" could not be loaded.") + mantid.sendLogMessage("::SANS::load_detector_logs: Log file \"" + log_file + "\" could not be loaded.") return None for line in file_handle: parts = line.split() if len(parts) != 3: - mantid.sendLogMessage('::SANS::load_detector_logs: Incorrect structure detected in logfile "' + filename + '" for line \n"' + line + '"\nEntry skipped') + mantid.sendLogMessage('::SANS::load_detector_logs: Incorrect structure detected in logfile "' + log_file + '" for line \n"' + line + '"\nEntry skipped') component = parts[1] if component in logvalues.keys(): logvalues[component] = parts[2] file_handle.close() - + + return logvalues + + def apply_detector_logs(self, logvalues): + #apply the corrections that came from the logs self.FRONT_DET_Z = float(logvalues['Front_Det_Z']) self.FRONT_DET_X = float(logvalues['Front_Det_X']) self.FRONT_DET_ROT = float(logvalues['Front_Det_Rot']) self.REAR_DET_Z = float(logvalues['Rear_Det_Z']) self.REAR_DET_X = float(logvalues['Rear_Det_X']) + self.corrections_applied = True + if len(self._can_logs) > 0: + self.check_can_logs(self._can_logs) + + def check_can_logs(self, new_logs): + """ + Tests if applying the corrections from the passed logvalues + would give the same result as the corrections that were + already made + @param new_logs: the new values to check are equivalent + @return: True if the are the same False if not + """ + if not self.corrections_applied: + #the check needs to wait until there's something to compare against + self._can_logs = new_logs + + if len(new_logs) == 0: + return False + + existing_values = [] + existing_values.append(self.FRONT_DET_Z) + existing_values.append(self.FRONT_DET_X) + existing_values.append(self.FRONT_DET_ROT) + existing_values.append(self.REAR_DET_Z) + existing_values.append(self.REAR_DET_X) + + new_values = [] + new_values.append(float(new_logs['Front_Det_Z'])) + new_values.append(float(new_logs['Front_Det_X'])) + new_values.append(float(new_logs['Front_Det_Rot'])) + new_values.append(float(new_logs['Rear_Det_Z'])) + new_values.append(float(new_logs['Rear_Det_X'])) + + errors = 0 + corr_names = ['Front_Det_Z', 'Front_Det_X','Front_Det_Rot', 'Rear_Det_Z', 'Rear_Det_X'] + for i in range(0, len(existing_values)): + if math.fabs(existing_values[i] - new_values[i]) > 5e-04: + mantid.sendLogMessage('::SANS::Warning: values differ between sample and can runs: Sample ' + corr_names[i] + ' = ' + str(existing_values[i]) + \ + ', can value is ' + str(new_values[i])) + errors += 1 + + self.append_marked(corr_names[i]) + + #the check has been done clear up + self._can_logs = {} - return logvalues + return errors == 0 def append_marked(self, detNames): self._marked_dets.append(detNames) diff --git a/Code/Mantid/Scripts/SANS/isis_reducer.py b/Code/Mantid/Scripts/SANS/isis_reducer.py index 8885ed681529a07c1aa4ed8906ed2fd0641a2c27..24b6529c4e9da32bae14843334d19c5c3396bd21 100644 --- a/Code/Mantid/Scripts/SANS/isis_reducer.py +++ b/Code/Mantid/Scripts/SANS/isis_reducer.py @@ -131,11 +131,10 @@ class ISISReducer(SANSReducer): user_file_path = property(get_user_path, set_user_path, None, None) - def set_run_number(self, data_file, workspace): + def set_run_number(self, workspace): """ The run number is a number followed by a . and then the extension of the run file to load - @param data_file: name of the file to be processed @param workspace: optional name of the workspace for this data, default will be the name of the file """ diff --git a/Code/Mantid/Scripts/SANS/isis_reduction_steps.py b/Code/Mantid/Scripts/SANS/isis_reduction_steps.py index 1b13bc9311b639f0f0500a01e5a536e1a434fd20..bf6c4cd05eb96fa573ee7d015e33531937da740d 100644 --- a/Code/Mantid/Scripts/SANS/isis_reduction_steps.py +++ b/Code/Mantid/Scripts/SANS/isis_reduction_steps.py @@ -58,7 +58,13 @@ class LoadRun(ReductionStep): self.ext = '' self.shortrun_no = -1 - def load(self): + def _load(self, inst = None, is_can=False): + """ + Load a workspace and read the logs into the passed instrument reference + @param inst: a reference to the current instrument + @param iscan: set this to True for can runs + @return: name of the workspace, log values, number of periods in the workspace + """ workspace = self._get_workspace_name() @@ -70,15 +76,20 @@ class LoadRun(ReductionStep): if self._period != self.UNSET_PERIOD: workspace = self._leaveSinglePeriod(workspace) + log_file = alg.getPropertyValue("Filename") + + SANS2D_log_file = log_file.rpartition('.')[0]+'.log' else: #this is the generic situation if not self._period == self.UNSET_PERIOD: - alg = Load(self._data_file, workspace, + Load(self._data_file, workspace, SpectrumMin=self._spec_min, SpectrumMax=self._spec_max, EntryNumber=self._period) else: #no specific period was requested - alg = Load(self._data_file, workspace, + Load(self._data_file, workspace, SpectrumMin=self._spec_min, SpectrumMax=self._spec_max) + + SANS2D_log_file = mtd[workspace] numPeriods = self._find_workspace_num_periods(workspace) #deal with the difficult situation of not reporting the period of single period files @@ -88,10 +99,20 @@ class LoadRun(ReductionStep): RenameWorkspace(workspace, period_definitely_inc) workspace = period_definitely_inc - # Return the file path actually used to load the data - fullpath = alg.getPropertyValue("Filename") + log = None + if (not inst is None) and inst.name() == 'SANS2D': + #this instrument has logs to be loaded + try: + if numPeriods > 1: + log = inst.get_detector_log(SANS2D_log_file, self._period) + else: + log = inst.get_detector_log(SANS2D_log_file) + except: + #transmission files, don't have logs + if not self._is_trans: + raise - return [ os.path.dirname(fullpath), workspace, numPeriods] + return workspace, numPeriods, log def _get_workspace_name(self, optional_entry_no=True): """ @@ -113,7 +134,7 @@ class LoadRun(ReductionStep): # Helper function def _assignHelper(self, reducer): if self._data_file == '' or self._data_file.startswith('.'): - return SANSUtility.WorkspaceDetails('', -1),True,'','', -1 + return '', '', -1 try: run_no, logname, data_file = self._extract_run_details( @@ -123,15 +144,15 @@ class LoadRun(ReductionStep): raise AttributeError('No instrument has been assign, run SANS2D or LOQ first') if run_no == '': - return SANSUtility.WorkspaceDetails('', -1),True,'','', -1 + return '', '', -1 workspace = self._get_workspace_name() #this always contains the period number period_definitely_inc = self._get_workspace_name(False) if self._reload == False and mantid.workspaceExists(workspace): - return SANSUtility.WorkspaceDetails(workspace, run_no),False,'','', -1 + return workspace, '', -1 if self._reload == False and mantid.workspaceExists(period_definitely_inc): - return SANSUtility.WorkspaceDetails(period_definitely_inc, run_no),False,'','', -1 + return period_definitely_inc, '', -1 self._data_file = os.path.join(reducer._data_path, data_file) # Workaround so that the FileProperty does the correct searching of data paths if this file doesn't exist @@ -148,20 +169,18 @@ class LoadRun(ReductionStep): else: self._spec_min = None self._spec_max = 8 - [filepath, wkspname, nPeriods] = self.load() + wkspname, nPeriods, logs = self._load(reducer.instrument) except RuntimeError, err: mantid.sendLogMessage("::SANS::Warning: "+str(err)) - return SANSUtility.WorkspaceDetails('', -1),True,'','', -1 + return '', '', -1 else: try: - [filepath, wkspname, nPeriods] = self.load() + wkspname, nPeriods, logs = self._load(reducer.instrument) except RuntimeError, details: mantid.sendLogMessage("::SANS::Warning: "+str(details)) - return SANSUtility.WorkspaceDetails('', -1),True,'','', -1 - - inWS = SANSUtility.WorkspaceDetails(wkspname, run_no) + return '', '', -1 - return inWS,True, reducer.instrument.name() + logname, filepath, nPeriods + return wkspname, nPeriods, logs def _leaveSinglePeriod(self, workspace): groupW = mantid[workspace] @@ -196,8 +215,6 @@ class LoadRun(ReductionStep): def _clearPrevious(self, inWS, others = []): if inWS != None: - if type(inWS) == SANSUtility.WorkspaceDetails: - inWS = inWS.getName() if mantid.workspaceExists(inWS) and (not inWS in others): mantid.deleteWorkspace(inWS) @@ -279,16 +296,14 @@ class LoadTransmissions(sans_reduction_steps.BaseTransmission): def execute(self, reducer, workspace): if self._trans_name not in [None, '']: - loader = LoadRun(self._trans_name, trans=True, reload=self._reload, entry=self._period_t) - trans_ws, dummy1, dummy2, dummy3, self.TRANS_SAMPLE_N_PERIODS = \ - loader._assignHelper(reducer) - self.trans_name = trans_ws.getName() + load = LoadRun(self._trans_name, trans=True, reload=self._reload, entry=self._period_t) + self.trans_name, self.TRANS_SAMPLE_N_PERIODS, dummy = \ + load._assignHelper(reducer) if self._direct_name not in [None, '']: - loader = LoadRun(self._direct_name, trans=True, reload=self._reload, entry=self._period_d) - direct_sample_ws, dummy1, dummy2, dummy3, self.DIRECT_SAMPLE_N_PERIODS = \ - loader._assignHelper(reducer) - self.direct_name = direct_sample_ws.getName() + load = LoadRun(self._direct_name, trans=True, reload=self._reload, entry=self._period_d) + self.direct_name, self.DIRECT_SAMPLE_N_PERIODS, dummy = \ + load._assignHelper(reducer) return self.trans_name, self.direct_name @@ -309,7 +324,7 @@ class CanSubtraction(LoadRun): @param fit_method: FitMethod parameter for CalculateTransmission (Linear or Log) """ super(CanSubtraction, self).__init__(can_run, reload=reload, entry=period) - self.SCATTER_CAN = None + self._scatter_can = None def assign_can(self, reducer, reload = True): #TODO: get rid of any reference to the instrument object as much as possible @@ -323,58 +338,24 @@ class CanSubtraction(LoadRun): return '', '()' - self.SCATTER_CAN ,reset, logname,filepath, self._CAN_N_PERIODS = \ - self._assignHelper(reducer) - if self.SCATTER_CAN.getName() == '': - mantid.sendLogMessage('::SANS::Warning: Unable to load sans can run, cannot continue.') + self._scatter_can, self._CAN_N_PERIODS, logs = self._assignHelper( + reducer) + if self._scatter_can == '': + mantid.sendLogMessage('::SANS::Warning: Unable to load SANS can run, cannot continue.') return '','()' - if reset == True: - self._CAN_SETUP = None - - try: - logvalues = reducer.instrument.load_detector_logs(logname,filepath) - if logvalues == None: - _issueWarning("Can logs could not be loaded, using sample values.") - return self.SCATTER_CAN.getName(), "()" - except AttributeError: - if not reducer.instrument.name() == 'LOQ' : raise - self.PERIOD_NOS["SCATTER_CAN"] = self._period - if (reducer.instrument.name() == 'LOQ'): - return self.SCATTER_CAN.getName(), "" - - smp_values = [] - front_det = reducer.instrument.getDetector('front') - smp_values.append(reducer.instrument.FRONT_DET_Z + front_det.z_corr) - smp_values.append(reducer.instrument.FRONT_DET_X + front_det.x_corr) - smp_values.append(reducer.instrument.FRONT_DET_ROT + front_det.rot_corr) - rear_det = reducer.instrument.getDetector('rear') - smp_values.append(reducer.instrument.REAR_DET_Z + rear_det.z_corr) - smp_values.append(reducer.instrument.REAR_DET_X + rear_det.x_corr) - - # Check against sample values and warn if they are not the same but still continue reduction - if len(logvalues) == 0: - return self.SCATTER_CAN.getName(), logvalues - - can_values = [] - can_values.append(float(logvalues['Front_Det_Z']) + front_det.z_corr) - can_values.append(float(logvalues['Front_Det_X']) + front_det.x_corr) - can_values.append(float(logvalues['Front_Det_Rot']) + front_det.rot_corr) - can_values.append(float(logvalues['Rear_Det_Z']) + rear_det.z_corr) - can_values.append(float(logvalues['Rear_Det_X']) + rear_det.x_corr) - - - det_names = ['Front_Det_Z', 'Front_Det_X','Front_Det_Rot', 'Rear_Det_Z', 'Rear_Det_X'] - for i in range(0, 5): - if math.fabs(smp_values[i] - can_values[i]) > 5e-04: - mantid.sendLogMessage("::SANS::Warning: values differ between sample and can runs. Sample = " + str(smp_values[i]) + \ - ' , Can = ' + str(can_values[i])) - reducer.instrument.append_marked(det_names[i]) - # End of AssignCan code + if reducer.instrument.name() == 'LOQ': + return self._scatter_can, "" + + if reducer.instrument.name() == 'SANS2D': + if logs is None: + _issueWarning("Can logs could not be loaded, using sample values.") + return self._scatter_can, "()" + reducer.instrument.check_can_logs(logs) - return self.SCATTER_CAN.getName(), logvalues + return self._scatter_can, logs def execute(self, reducer, workspace): """ @@ -386,9 +367,8 @@ class CanSubtraction(LoadRun): beamcoords = reducer._beam_finder.get_beam_center() # Put the components in the correct positions - currentDet = reducer.instrument.cur_detector().name() reducer.instrument.set_component_positions( - self.SCATTER_CAN.getName(), beamcoords[0], beamcoords[1]) + self._scatter_can, beamcoords[0], beamcoords[1]) mantid.sendLogMessage('::SANS:: Initialized can workspace to [' + str(beamcoords[0]) + ',' + str(beamcoords[1]) + ']' ) # Create a run details object @@ -404,8 +384,7 @@ class CanSubtraction(LoadRun): tmp_smp = workspace+"_sam_tmp" RenameWorkspace(workspace, tmp_smp) - # Run correction function - # was Correct(SCATTER_CAN, can_setup[0], can_setup[1], wav_start, wav_end, can_setup[2], can_setup[3], finding_centre) + tmp_can = workspace+"_can_tmp" # Can correction @@ -421,11 +400,11 @@ class CanSubtraction(LoadRun): norm_step_ind = reduce_can.step_num(reduce_can.norm_mon) reduce_can.norm_mon = NormalizeToMonitor( - raw_ws = self.SCATTER_CAN.getName()) + raw_ws = self._scatter_can) reduce_can._reduction_steps[norm_step_ind] = reduce_can.norm_mon #set the workspace that we've been setting up as the one to be processed - reduce_can.set_process_single_workspace(self.SCATTER_CAN.getName()) + reduce_can.set_process_single_workspace(self._scatter_can) #this will be the first command that is run in the new chain start = reduce_can.step_num(reduce_can.flood_file) @@ -776,8 +755,7 @@ class LoadSample(LoadRun): def __init__(self, sample=None, reload=True, entry=-1): super(LoadSample, self).__init__(sample, reload=reload, entry=entry) - self.SCATTER_SAMPLE = None - self._SAMPLE_SETUP = None + self._scatter_sample = None self._SAMPLE_RUN = None self._SAMPLE_N_PERIODS = -1 @@ -791,22 +769,21 @@ class LoadSample(LoadRun): if self._data_file is None: self._data_file = reducer.get_sample() # Code from AssignSample - self._clearPrevious(self.SCATTER_SAMPLE) + self._clearPrevious(self._scatter_sample) self._SAMPLE_N_PERIODS = -1 if( self._data_file.startswith('.') or self._data_file == '' or self._data_file == None): - self._SAMPLE_SETUP = None self._SAMPLE_RUN = '' - self.SCATTER_SAMPLE = None + self._scatter_sample = None raise RuntimeError('Sample needs to be assigned as run_number.file_type') - self.SCATTER_SAMPLE, reset, logname, filepath, self._SAMPLE_N_PERIODS = self._assignHelper(reducer) - if self.SCATTER_SAMPLE.getName() == '': + self._scatter_sample, self._SAMPLE_N_PERIODS, logs =\ + self._assignHelper(reducer) + + if self._scatter_sample == '': raise RuntimeError('Unable to load SANS sample run, cannot continue.') - if reset == True: - self._SAMPLE_SETUP = None - self.uncropped = self.SCATTER_SAMPLE.getName() + self.uncropped = self._scatter_sample p_run_ws = mantid[self.uncropped] if p_run_ws.isGroup(): @@ -820,20 +797,17 @@ class LoadSample(LoadRun): reducer.instrument.set_up_for_run(run_num) - logvalues = None - try: - logvalues = reducer.instrument.load_detector_logs(logname,filepath) - if logvalues == None: - mantid.deleteWorkspace(self.SCATTER_SAMPLE.getName()) + if reducer.instrument.name() == 'SANS2D': + if logs == None: + mantid.deleteWorkspace(self._scatter_sample) raise RuntimeError('Sample logs cannot be loaded, cannot continue') - except AttributeError: - if not reducer.instrument.name() == 'LOQ': raise + reducer.instrument.apply_detector_logs(logs) self.PERIOD_NOS["SCATTER_SAMPLE"] = self._period reducer.wksp_name = self.uncropped - return reducer.wksp_name, logvalues + return reducer.wksp_name, logs class MoveComponents(ReductionStep): """