diff --git a/Code/Mantid/Framework/Crystal/test/CalculateUMatrixTest.h b/Code/Mantid/Framework/Crystal/test/CalculateUMatrixTest.h index 38cca516ead807e74b6085cdbee0b07d02feea10..60ca8c8eaffaeec215e7e4507e4b6bfe7f9054df 100644 --- a/Code/Mantid/Framework/Crystal/test/CalculateUMatrixTest.h +++ b/Code/Mantid/Framework/Crystal/test/CalculateUMatrixTest.h @@ -8,9 +8,7 @@ #include <iomanip> #include "MantidCrystal/CalculateUMatrix.h" -#include "MantidCrystal/LoadIsawPeaks.h" #include "MantidGeometry/Crystal/OrientedLattice.h" -#include "MantidCrystal/LoadIsawUB.h" #include "MantidDataObjects/PeaksWorkspace.h" #include "MantidKernel/V3D.h" @@ -37,15 +35,8 @@ public: void test_exec() { // Name of the output workspace. - std::string WSName("peaks"); - LoadIsawPeaks loader; - TS_ASSERT_THROWS_NOTHING( loader.initialize() ); - TS_ASSERT( loader.isInitialized() ); - loader.setPropertyValue("Filename", "TOPAZ_3007.peaks"); - loader.setPropertyValue("OutputWorkspace", WSName); - - TS_ASSERT( loader.execute() ); - TS_ASSERT( loader.isExecuted() ); + std::string WSName("peaksCalculateUMatrix"); + generatePeaks(WSName); PeaksWorkspace_sptr ws; TS_ASSERT_THROWS_NOTHING( ws = boost::dynamic_pointer_cast<PeaksWorkspace>( @@ -55,11 +46,11 @@ public: CalculateUMatrix alg; TS_ASSERT_THROWS_NOTHING( alg.initialize() ) TS_ASSERT( alg.isInitialized() ) - TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("a", "14.1526") ); - TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("b", "19.2903") ); - TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("c", "8.5813") ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("a", "2.") ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("b", "3.") ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("c", "4.") ); TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("alpha", "90") ); - TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("beta", "105.0738") ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("beta", "90") ); TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("gamma", "90") ); TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("PeaksWorkspace", WSName) ); TS_ASSERT_THROWS_NOTHING( alg.execute(); ); @@ -69,17 +60,16 @@ public: TS_ASSERT(ws->mutableSample().hasOrientedLattice()); // Check that the UB matrix is the same as in TOPAZ_3007.mat OrientedLattice latt=ws->mutableSample().getOrientedLattice(); + DblMatrix U(3,3,false); + U[0][0]=sqrt(3.)*0.5; + U[2][2]=sqrt(3.)*0.5; + U[2][0]=0.5; + U[0][2]=-0.5; + U[1][1]=1.; - LoadIsawUB alg1; - TS_ASSERT_THROWS_NOTHING( alg1.initialize() ) - TS_ASSERT( alg1.isInitialized() ) - TS_ASSERT_THROWS_NOTHING( alg1.setPropertyValue("Filename", "TOPAZ_3007.mat") ); - TS_ASSERT_THROWS_NOTHING( alg1.setPropertyValue("InputWorkspace", WSName) ); - TS_ASSERT_THROWS_NOTHING( alg1.execute(); ); - TS_ASSERT_THROWS_NOTHING( alg1.isExecuted(); ); - OrientedLattice lattFromUB=ws->mutableSample().getOrientedLattice(); - TS_ASSERT(latt.getUB().equals(lattFromUB.getUB(),2e-4)); //Some values differ by up to 1.7e-4 + TS_ASSERT(latt.getU().equals(U,1e-10)); + // Remove workspace from the data service. AnalysisDataService::Instance().remove(WSName); } @@ -145,6 +135,82 @@ public: TS_ASSERT( alg2.isExecuted() ); AnalysisDataService::Instance().remove(WSName); } + +private: + DblMatrix UB; + + void setupUB() + { + OrientedLattice ol; + DblMatrix U(3,3,false); + U[0][0]=sqrt(3.)*0.5; + U[2][2]=sqrt(3.)*0.5; + U[2][0]=0.5; + U[0][2]=-0.5; + U[1][1]=1.; + ol.set(2,3,4,90,90,90); + ol.setU(U); + UB=ol.getUB(); + } + + double QXUB(double H, double K, double L) + { + return (UB*V3D(H,K,L))[0]*2.*M_PI; + } + + double QYUB(double H, double K, double L) + { + return (UB*V3D(H,K,L))[1]*2.*M_PI; + } + + double QZUB(double H, double K, double L) + { + return (UB*V3D(H,K,L))[2]*2.*M_PI; + } + + double lam(double H,double K,double L) + { + return 2.*QZUB(H,K,L)/(QXUB(H,K,L)*QXUB(H,K,L)+QYUB(H,K,L)*QYUB(H,K,L)+QZUB(H,K,L)*QZUB(H,K,L))*2.*M_PI; + } + + double th(double H,double K,double L) + { + return acos(1.-QZUB(H,K,L)*lam(H,K,L)/2./M_PI); + } + + double ph(double H,double K,double L) + { + return atan2(-QYUB(H,K,L),-QXUB(H,K,L)); + } + + void generatePeaks(std::string WSName) + { + setupUB(); + + double Hpeaks[9]={0,1,1,0,-1,-1,1,-3,-2}; + double Kpeaks[9]={3,0,4,0,2,0,2,3,1}; + double Lpeaks[9]={3,5,5,2,3,2,4,5,3}; + + std::vector<double> lambda(9),theta(9),phi(9),L2(9,1.); + for(int i=0;i<=8;i++) + { + lambda.at(i)=lam(Hpeaks[i],Kpeaks[i],Lpeaks[i]); + theta.at(i)=th(Hpeaks[i],Kpeaks[i],Lpeaks[i]); + phi.at(i)=ph(Hpeaks[i],Kpeaks[i],Lpeaks[i]); + } + + Mantid::Geometry::Instrument_sptr inst = ComponentCreationHelper::createCylInstrumentWithDetInGivenPosisions(L2,theta, phi); + inst->setName("SillyInstrument"); + auto pw = PeaksWorkspace_sptr(new PeaksWorkspace); + pw->setInstrument(inst); + for(int i=0;i<=8;i++) + { + Peak p(inst, i+1, lambda[i],V3D(Hpeaks[i],Kpeaks[i],Lpeaks[i])); + pw->addPeak(p); + } + AnalysisDataService::Instance().addOrReplace(WSName,pw); + } + };