diff --git a/Code/Mantid/Instrument/ARGUS_Definition.xml b/Code/Mantid/Instrument/ARGUS_Definition.xml index b47871c08d9fd0e89c328f305d5c9067d1f014c7..b7e68e21aef7a3bfea5aad02d87519e98afea74b 100644 --- a/Code/Mantid/Instrument/ARGUS_Definition.xml +++ b/Code/Mantid/Instrument/ARGUS_Definition.xml @@ -22,6 +22,10 @@ Data provided by Francis Pratt for the ARGUS instrument --> + <parameter name="Default grouping file" type="string"> + <value val="Grouping/ARGUS_Detector_Grouping_LF_192.xml"/> + </parameter> + <!-- LIST OF PHYSICAL COMPONENTS (which the instrument consists of) --> diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h index de309a0b1deef9ca790ce234f250f01ef29557e6..c90b7c58d75ef5c10d20a0924c4a59ef56843185 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.h @@ -243,6 +243,12 @@ private: /// set grouping in table from information from nexus raw file void setGroupingFromNexus(const QString& nexusFile); + /// + void setDummyGrouping(const int numDetectors); + + /// + void setGroupingFromIDF(const std::string& mainFieldDirection, Mantid::API::MatrixWorkspace_sptr matrix_workspace); + /// title of run std::string m_title; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.ui index 4453acc9f6076a53b3fa23f6cf9f7edd6265f81d..1906d4bd67f2644f0532c1ec92ff3917df0fe38c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MuonAnalysis.ui @@ -801,7 +801,7 @@ </widget> <widget class="QLineEdit" name="timeAxisStartAtInput" > <property name="enabled" > - <bool>false</bool> + <bool>true</bool> </property> <property name="geometry" > <rect> @@ -812,7 +812,7 @@ </rect> </property> <property name="text" > - <string>0</string> + <string>300</string> </property> </widget> <widget class="QLineEdit" name="timeAxisFinishAtInput" > @@ -958,12 +958,12 @@ </property> <item> <property name="text" > - <string>Start at Time Zero</string> + <string>Start at First Good Data</string> </property> </item> <item> <property name="text" > - <string>Start at First Good Data</string> + <string>Start at Time Zero</string> </property> </item> </widget> diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp index da6930531a069a96cea1eca335c270eccef9beea..e055f16758c1d7b7cd5e4af3b8dec5a9f24f031a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp @@ -200,13 +200,13 @@ void MuonAnalysis::runFrontGroupGroupPairComboBox(int index) */ void MuonAnalysis::runTimeComboBox(int index) { - if ( index == 0 ) // Start at Time Zero + if ( index == 1 ) // Start at Time Zero { m_uiForm.timeAxisStartAtInput->setEnabled(false); m_uiForm.timeAxisStartAtInput->setText("0"); } - if ( index == 1 ) // Start at First Good Data + if ( index == 0 ) // Start at First Good Data { m_uiForm.timeAxisStartAtInput->setEnabled(true); m_uiForm.timeAxisStartAtInput->setText(m_uiForm.firstGoodBinFront->text()); @@ -238,6 +238,12 @@ void MuonAnalysis::runFirstGoodBinFront() try { double boevs = boost::lexical_cast<double>(m_uiForm.firstGoodBinFront->text().toStdString()); + + // if this value updated then also update 'Start at" Plot option if "Start at First Good Data" set + if (m_uiForm.timeComboBox->currentIndex() == 0 ) + { + m_uiForm.timeAxisStartAtInput->setText(m_uiForm.firstGoodBinFront->text()); + } } catch (...) { @@ -343,7 +349,7 @@ void MuonAnalysis::runFrontPlotButton() /** -* If the instrument selection has changed, calls instrumentSelectChanged (slot) +* If the instrument selection has changed (slot) * * @param prefix :: instrument name from QComboBox object */ @@ -351,7 +357,8 @@ void MuonAnalysis::userSelectInstrument(const QString& prefix) { if ( prefix != m_curInterfaceSetup ) { - //instrumentSelectChanged(prefix); + runClearGroupingButton(); + m_curInterfaceSetup = prefix; } } @@ -944,7 +951,7 @@ void MuonAnalysis::inputFileChanged() return; } - QString pyString = "from mantidsimple import *\n" + QString pyString = "from mantidsimple import *\n" "import sys\n" "try:\n" " alg = LoadMuonNexus('" + m_previousFilename+"','" + m_workspace_name.c_str() + "', AutoGroup='0')\n" @@ -961,11 +968,16 @@ void MuonAnalysis::inputFileChanged() nowDataAvailable(); - if ( !isGroupingSet() ) - setGroupingFromNexus(m_previousFilename); + // get hold of output parameters + std::stringstream strParam(outputParams.toStdString()); + std::string mainFieldDirection; + double timeZero; + double firstGoodData; + strParam >> mainFieldDirection >> timeZero >> firstGoodData; + timeZero *= 1000.0; // convert to ns + firstGoodData *= 1000.0; // Get hold of a pointer to a matrix workspace and apply grouping if applicatable - Workspace_sptr workspace_ptr = AnalysisDataService::Instance().retrieve(m_workspace_name); WorkspaceGroup_sptr wsPeriods = boost::dynamic_pointer_cast<WorkspaceGroup>(workspace_ptr); MatrixWorkspace_sptr matrix_workspace; @@ -982,18 +994,22 @@ void MuonAnalysis::inputFileChanged() matrix_workspace = boost::dynamic_pointer_cast<MatrixWorkspace>(workspace_ptr); } + // if grouping not set, first see if grouping defined in Nexus + if ( !isGroupingSet() ) + setGroupingFromNexus(m_previousFilename); + // if grouping still not set, then take grouping from IDF + if ( !isGroupingSet() ) + setGroupingFromIDF(mainFieldDirection, matrix_workspace); + // finally if nothing else works set dummy grouping and display + // message to user + if ( !isGroupingSet() ) + setDummyGrouping(static_cast<int>(matrix_workspace->getInstrument()->getDetectors().size())); + + if ( !applyGroupingToWS(m_workspace_name, m_workspace_name+"Grouped") ) return; - // get hold of output parameters - std::stringstream strParam(outputParams.toStdString()); - std::string mainFieldDirection; - double timeZero; - double firstGoodData; - strParam >> mainFieldDirection >> timeZero >> firstGoodData; - - timeZero *= 1000.0; // convert to ns - firstGoodData *= 1000.0; + // Populate instrument fields @@ -1897,22 +1913,12 @@ void MuonAnalysis::setGroupingFromNexus(const QString& nexusFile) } } - // if no grouping in nexus then set dummy grouping and display warning to user + // if no grouping in nexus then return if ( thereIsGrouping == false ) { - std::stringstream idstr; - idstr << "1-" << matrix_workspace->getNumberHistograms(); - m_uiForm.groupTable->setItem(0, 0, new QTableWidgetItem("NoGroupingDetected")); - m_uiForm.groupTable->setItem(0, 1, new QTableWidgetItem(idstr.str().c_str())); - - updateFrontAndCombo(); - - QMessageBox::warning(this, "MantidPlot - MuonAnalysis", "No grouping detected in Nexus."); - return; } - // Add info about grouping from Nexus file to group table for (int wsIndex = 0; wsIndex < matrix_workspace->getNumberHistograms(); wsIndex++) { @@ -1970,12 +1976,85 @@ void MuonAnalysis::setGroupingFromNexus(const QString& nexusFile) m_uiForm.groupTable->setItem(wsIndex, 1, new QTableWidgetItem(idstr.str().c_str())); } } // end loop over wsIndex + + + // check if exactly two groups added in which case assume these are forward/backward groups + // and automatically then create a pair from which, where the first group is assumed to be + // the forward group + + updatePairTable(); + if ( numGroups() == 2 && numPairs() <= 0 ) + { + QTableWidgetItem* it = m_uiForm.pairTable->item(0, 0); + if (it) + it->setText("pair"); + else + { + m_uiForm.pairTable->setItem(0, 0, new QTableWidgetItem("pair")); + } + it = m_uiForm.pairTable->item(0, 3); + if (it) + it->setText("1.0"); + else + { + m_uiForm.pairTable->setItem(0, 3, new QTableWidgetItem("1.0")); + } + } updatePairTable(); updateFrontAndCombo(); } +/** + * If nothing else work set dummy grouping and display comment to user + */ +void MuonAnalysis::setDummyGrouping(const int numDetectors) +{ + // if no grouping in nexus then set dummy grouping and display warning to user + + std::stringstream idstr; + idstr << "1-" << numDetectors; + m_uiForm.groupTable->setItem(0, 0, new QTableWidgetItem("NoGroupingDetected")); + m_uiForm.groupTable->setItem(0, 1, new QTableWidgetItem(idstr.str().c_str())); + + updateFrontAndCombo(); + + QMessageBox::warning(this, "MantidPlot - MuonAnalysis", QString("No grouping detected in Nexus file.\n") + + "and no default grouping file specified in IDF\n" + + "therefore dummy grouping created."); +} + + +/** + * Try to load default grouping file specified in IDF + */ +void MuonAnalysis::setGroupingFromIDF(const std::string& mainFieldDirection, MatrixWorkspace_sptr matrix_workspace) +{ + IInstrument_sptr inst = matrix_workspace->getInstrument(); + + std::vector<std::string> groupFile = inst->getStringParameter("Default grouping file"); + + // get search directory for XML instrument definition files (IDFs) + std::string directoryName = ConfigService::Instance().getInstrumentDirectory(); + + if ( groupFile.size() == 1 ) + { + try + { + loadGroupingXMLtoTable(m_uiForm, directoryName+groupFile[0]); + } + catch (...) + { + QMessageBox::warning(this, "MantidPlot - MuonAnalysis", QString("Can't load default grouping file in IDF.\n") + + "with name: " + groupFile[0].c_str()); + } + } +} + + + + /** * Time zero returend in ms */