diff --git a/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h b/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h index 1ecb3c3c954cc50d4c6bdf35e63a4a2d53148943..4ea4de97af84216aba5933991197e191cddabec1 100644 --- a/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h +++ b/Framework/Crystal/inc/MantidCrystal/LoadIsawPeaks.h @@ -59,7 +59,7 @@ private: /// Read a single peak from peaks file DataObjects::Peak readPeak(DataObjects::PeaksWorkspace_sptr outWS, std::string &lastStr, std::ifstream &in, - int &seqNum, std::string bankName); + int &seqNum, std::string bankName, double qSign); int findPixelID(Geometry::Instrument_const_sptr inst, std::string bankName, int col, int row); diff --git a/Framework/Crystal/src/LoadHKL.cpp b/Framework/Crystal/src/LoadHKL.cpp index 2e00456ddb22559d7420796bdd0c2bfc9aa1078e..dae696eaf2b2ea5121264d4f76884f85320e94c7 100644 --- a/Framework/Crystal/src/LoadHKL.cpp +++ b/Framework/Crystal/src/LoadHKL.cpp @@ -60,6 +60,10 @@ void LoadHKL::exec() { // % (H, K, L, FSQ, SIGFSQ, hstnum, WL, TBAR, CURHST, SEQNUM, TRANSMISSION, // DN, TWOTH, DSP)) // HKL is flipped by -1 due to different q convention in ISAW vs mantid. + // Default for kf-ki has -q + double qSign = -1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = 1.0; Instrument_sptr inst(new Geometry::Instrument); Detector *detector = new Detector("det1", -1, 0); detector->setPos(0.0, 0.0, 0.0); @@ -107,7 +111,7 @@ void LoadHKL::exec() { } Peak peak(inst, scattering, wl); - peak.setHKL(-h, -k, -l); + peak.setHKL(qSign *h, qSign *k, qSign * l); peak.setIntensity(Inti); peak.setSigmaIntensity(SigI); peak.setRunNumber(run); diff --git a/Framework/Crystal/src/LoadIsawPeaks.cpp b/Framework/Crystal/src/LoadIsawPeaks.cpp index 3073c3dc8aba4298ab4d83918d6749b2ceb1caf3..f844eda828604216b60c3e47396fce411431e1de 100644 --- a/Framework/Crystal/src/LoadIsawPeaks.cpp +++ b/Framework/Crystal/src/LoadIsawPeaks.cpp @@ -335,7 +335,7 @@ std::string LoadIsawPeaks::readHeader(PeaksWorkspace_sptr outWS, DataObjects::Peak LoadIsawPeaks::readPeak(PeaksWorkspace_sptr outWS, std::string &lastStr, std::ifstream &in, int &seqNum, - std::string bankName) { + std::string bankName, double qSign) { double h; double k; double l; @@ -408,8 +408,7 @@ DataObjects::Peak LoadIsawPeaks::readPeak(PeaksWorkspace_sptr outWS, // Create the peak object Peak peak(outWS->getInstrument(), pixelID, wl); - // HKL's are flipped by -1 because of the internal Q convention - peak.setHKL(-h, -k, -l); + peak.setHKL(qSign * h, qSign * k, qSign * l); peak.setIntensity(Inti); peak.setSigmaIntensity(SigI); peak.setBinCount(IPK); @@ -506,7 +505,11 @@ std::string LoadIsawPeaks::readPeakBlockHeader(std::string lastStr, */ void LoadIsawPeaks::appendFile(PeaksWorkspace_sptr outWS, std::string filename) { - + // HKL's are flipped by -1 because of the internal Q convention + // unless Crystallography convention + double qSign = -1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = 1.0; // Open the file std::ifstream in(filename.c_str()); @@ -566,7 +569,7 @@ void LoadIsawPeaks::appendFile(PeaksWorkspace_sptr outWS, try { // Read the peak - Peak peak = readPeak(outWS, s, in, seqNum, bankName); + Peak peak = readPeak(outWS, s, in, seqNum, bankName, qSign); // Get the calculated goniometer matrix Matrix<double> gonMat = uniGonio.getR(); diff --git a/Framework/Crystal/src/SaveHKL.cpp b/Framework/Crystal/src/SaveHKL.cpp index 0892660f75417fbe9b98815157a12693a1a32eba..31198850b53b6c0cfc0e57eb92cf30b9cb35758f 100644 --- a/Framework/Crystal/src/SaveHKL.cpp +++ b/Framework/Crystal/src/SaveHKL.cpp @@ -128,6 +128,11 @@ void SaveHKL::exec() { int runSequence = 0; int bankold = -1; int runold = -1; + // HKL is flipped by -1 due to different q convention in ISAW vs mantid. + // Default for kf-ki has -q + double qSign = -1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = 1.0; std::fstream out; bool append = getProperty("AppendFile"); @@ -310,14 +315,13 @@ void SaveHKL::exec() { // hklFile.write('%4d%4d%4d%8.2f%8.2f%4d%8.4f%7.4f%7d%7d%7.4f%4d%9.5f%9.4f\n' // % (H, K, L, FSQ, SIGFSQ, hstnum, WL, TBAR, CURHST, SEQNUM, // TRANSMISSION, DN, TWOTH, DSP)) - // HKL is flipped by -1 due to different q convention in ISAW vs mantid. if (p.getH() == 0 && p.getK() == 0 && p.getL() == 0) { banned.push_back(wi); continue; } if (decimalHKL == EMPTY_INT()) - out << std::setw(4) << Utils::round(-p.getH()) << std::setw(4) - << Utils::round(-p.getK()) << std::setw(4) << Utils::round(-p.getL()); + out << std::setw(4) << Utils::round(qSign *p.getH()) << std::setw(4) + << Utils::round(qSign *p.getK()) << std::setw(4) << Utils::round(qSign *p.getL()); else out << std::setw(5 + decimalHKL) << std::fixed << std::setprecision(decimalHKL) << -p.getH() diff --git a/Framework/Crystal/src/SaveIsawPeaks.cpp b/Framework/Crystal/src/SaveIsawPeaks.cpp index eb5403151890cc03f04798f5d73f622bbd9e0d42..9d19b56bd04c6a404100f178f8e39469e11981b7 100644 --- a/Framework/Crystal/src/SaveIsawPeaks.cpp +++ b/Framework/Crystal/src/SaveIsawPeaks.cpp @@ -246,7 +246,11 @@ void SaveIsawPeaks::exec() { } } } - + // HKL's are flipped by -1 because of the internal Q convention + // unless Crystallography convention + double qSign = -1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = 1.0; // ============================== Save all Peaks // ========================================= // Sequence number @@ -304,11 +308,11 @@ void SaveIsawPeaks::exec() { // Sequence (run) number out << "3" << std::setw(7) << seqNum; - // HKL is flipped by -1 due to different q convention in ISAW vs - // mantid. - out << std::setw(5) << Utils::round(-p.getH()) << std::setw(5) - << Utils::round(-p.getK()) << std::setw(5) - << Utils::round(-p.getL()); + // HKL's are flipped by -1 because of the internal Q convention + // unless Crystallography convention + out << std::setw(5) << Utils::round(qSign *p.getH()) << std::setw(5) + << Utils::round(qSign *p.getK()) << std::setw(5) + << Utils::round(qSign *p.getL()); // Row/column out << std::setw(8) << std::fixed << std::setprecision(2) diff --git a/Framework/Crystal/src/SaveLauenorm.cpp b/Framework/Crystal/src/SaveLauenorm.cpp index 339c05f661de42f35bec75af98fde98ee01a4000..2f74efad9113a0a1193401b6959446e94e609d6d 100644 --- a/Framework/Crystal/src/SaveLauenorm.cpp +++ b/Framework/Crystal/src/SaveLauenorm.cpp @@ -111,6 +111,11 @@ void SaveLauenorm::exec() { // ============================== Save all Peaks // ========================================= + // HKL is flipped by -1 due to different q convention in ISAW vs mantid. + // Default for kf-ki has -q + double qSign = -1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = 1.0; // Go through each peak at this run / bank for (int wi = 0; wi < ws->getNumberPeaks(); wi++) { @@ -170,10 +175,11 @@ void SaveLauenorm::exec() { // h k l lambda theta intensity and sig(intensity) in format // (3I5,2F10.5,2I10) // HKL is flipped by -1 due to different q convention in ISAW vs mantid. + // unless Crystallography convention if (p.getH() == 0 && p.getK() == 0 && p.getL() == 0) continue; - out << std::setw(5) << Utils::round(-p.getH()) << std::setw(5) - << Utils::round(-p.getK()) << std::setw(5) << Utils::round(-p.getL()); + out << std::setw(5) << Utils::round(qSign * p.getH()) << std::setw(5) + << Utils::round(qSign * p.getK()) << std::setw(5) << Utils::round(qSign * p.getL()); out << std::setw(10) << std::fixed << std::setprecision(5) << lambda; // Assume that want theta not two-theta out << std::setw(10) << std::fixed << std::setprecision(5) diff --git a/Framework/DataHandling/src/LoadNexusProcessed.cpp b/Framework/DataHandling/src/LoadNexusProcessed.cpp index c59b6fb24f441e29db68c3c3b1a4768f1842772d..955c0f690625ab6e4596cb5258d4f8f7a4c607c9 100644 --- a/Framework/DataHandling/src/LoadNexusProcessed.cpp +++ b/Framework/DataHandling/src/LoadNexusProcessed.cpp @@ -1074,6 +1074,12 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) { // peaks_workspace m_cppFile->closeGroup(); + // HKL is flipped by -1 due to different q convention in Crystallography. + // Always write out in ki-kf so consistent with old files + double qSign = 1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = -1.0; + for (int r = 0; r < numberPeaks; r++) { Kernel::V3D v3d; v3d[2] = 1.0; @@ -1100,7 +1106,7 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) { nxDouble.load(); for (int r = 0; r < numberPeaks; r++) { - double val = nxDouble[r]; + double val = qSign *nxDouble[r]; peakWS->getPeak(r).setH(val); } } @@ -1110,7 +1116,7 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) { nxDouble.load(); for (int r = 0; r < numberPeaks; r++) { - double val = nxDouble[r]; + double val = qSign *nxDouble[r]; peakWS->getPeak(r).setK(val); } } @@ -1120,7 +1126,7 @@ API::Workspace_sptr LoadNexusProcessed::loadPeaksEntry(NXEntry &entry) { nxDouble.load(); for (int r = 0; r < numberPeaks; r++) { - double val = nxDouble[r]; + double val = qSign *nxDouble[r]; peakWS->getPeak(r).setL(val); } } diff --git a/Framework/DataObjects/src/Peak.cpp b/Framework/DataObjects/src/Peak.cpp index 54383a765a42355701912d6076629669850dcf0b..61928c9b8667212f1033a6a43ee94f884642f1bb 100644 --- a/Framework/DataObjects/src/Peak.cpp +++ b/Framework/DataObjects/src/Peak.cpp @@ -3,6 +3,7 @@ #include "MantidGeometry/Instrument/RectangularDetector.h" #include "MantidGeometry/Instrument/ReferenceFrame.h" #include "MantidGeometry/Objects/InstrumentRayTracer.h" +#include "MantidKernel/ConfigService.h" #include "MantidKernel/Strings.h" #include "MantidKernel/System.h" #include <algorithm> @@ -452,7 +453,11 @@ Mantid::Kernel::V3D Peak::getQLabFrame() const { // Now calculate the wavevector of the scattered neutron double wvf = (2.0 * M_PI) / this->getWavelength(); // And Q in the lab frame - return (beamDir * wvi - detDir * wvf) * -1.0; + // Default for ki-kf is positive + double qSign = 1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = -1.0; + return (beamDir * wvi - detDir * wvf) * qSign; } //---------------------------------------------------------------------------------------------- @@ -528,7 +533,7 @@ void Peak::setQLabFrame(Mantid::Kernel::V3D QLabFrame, boost::shared_ptr<const ReferenceFrame> refFrame = this->m_inst->getReferenceFrame(); const V3D refBeamDir = refFrame->vecPointingAlongBeam(); - const double qBeam = std::fabs(q.scalar_prod(refBeamDir)); + const double qBeam = fabs(q.scalar_prod(refBeamDir)); if (norm_q == 0.0) throw std::invalid_argument("Peak::setQLabFrame(): Q cannot be 0,0,0."); @@ -548,7 +553,12 @@ void Peak::setQLabFrame(Mantid::Kernel::V3D QLabFrame, // Save the wavelength this->setWavelength(wl); - V3D detectorDir = q; // * -1.0; + // Default for ki-kf has -q + double qSign = -1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = 1.0; + + V3D detectorDir = q * qSign; detectorDir[refFrame->pointingAlongBeam()] = one_over_wl - qBeam; detectorDir.normalize(); diff --git a/Framework/DataObjects/src/PeaksWorkspace.cpp b/Framework/DataObjects/src/PeaksWorkspace.cpp index 5f60d4dd27b2d85681491721f7ee737bdefb5355..52f502840fda4c7f3c73232a599414a8856128c9 100644 --- a/Framework/DataObjects/src/PeaksWorkspace.cpp +++ b/Framework/DataObjects/src/PeaksWorkspace.cpp @@ -605,14 +605,20 @@ void PeaksWorkspace::saveNexus(::NeXus::File *file) const { std::vector<double> goniometerMatrix(9 * np); std::vector<std::string> shapes(np); + // HKL is flipped by -1 due to different q convention in Crystallography. + // Always write out in ki-kf so consistent with old files + double qSign = 1.0; + std::string convention = ConfigService::Instance().getString("default.convention"); + if (convention == "Crystallography") qSign = -1.0; + // Populate column vectors from Peak Workspace size_t maxShapeJSONLength = 0; for (size_t i = 0; i < np; i++) { Peak p = peaks[i]; detectorID[i] = p.getDetectorID(); - H[i] = p.getH(); - K[i] = p.getK(); - L[i] = p.getL(); + H[i] = qSign *p.getH(); + K[i] = qSign *p.getK(); + L[i] = qSign *p.getL(); intensity[i] = p.getIntensity(); sigmaIntensity[i] = p.getSigmaIntensity(); binCount[i] = p.getBinCount();