Skip to content

Commit

Permalink
Finalize the codes. Refs #5836.
Browse files Browse the repository at this point in the history
  • Loading branch information
wdzhou committed Oct 24, 2012
1 parent 623682c commit 6b62868
Show file tree
Hide file tree
Showing 2 changed files with 237 additions and 62 deletions.
143 changes: 81 additions & 62 deletions Code/Mantid/Framework/DataHandling/src/SaveFullprofResolution.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace Mantid
namespace DataHandling
{

DECLARE_ALGORITHM(SaveFullprofResolution)

//----------------------------------------------------------------------------------------------
/** Constructor
Expand Down Expand Up @@ -43,15 +44,15 @@ namespace DataHandling
*/
void SaveFullprofResolution::init()
{
this->declareProperty(new API::WorkspaceProperty<DataObjects::TableWorkspace>("InputWorkspace", "Anonymous", Direction::InOut),
"Input TableWorkspace containing the parameters for .irf file.");
this->declareProperty(new API::WorkspaceProperty<DataObjects::TableWorkspace>("InputWorkspace", "Anonymous", Direction::InOut),
"Input TableWorkspace containing the parameters for .irf file.");

std::vector<std::string> exts;
exts.push_back(".irf");
this->declareProperty(new API::FileProperty("OutputFile", "fp.irf", API::FileProperty::Save, exts),
"Name of the output .irf file.");
std::vector<std::string> exts;
exts.push_back(".irf");
this->declareProperty(new API::FileProperty("OutputFile", "fp.irf", API::FileProperty::Save, exts),
"Name of the output .irf file.");

this->declareProperty("Bank", 1, "Bank number of the parameters belonged to. ");
this->declareProperty("Bank", 1, "Bank number of the parameters belonged to. ");
}

/** Main execution body
Expand All @@ -63,10 +64,13 @@ namespace DataHandling
std::string irffilename = getProperty("OutputFile");
int bankid = getProperty("Bank");

// 2. Generate the string for the file to write
// 2. Parse the input
parseTableWorkspace();

// 3. Generate the string for the file to write
std::string filestr = toIRFString(bankid);

// 3. Write to file
// 4. Write to file
std::ofstream ofile;
ofile.open(irffilename.c_str());
ofile << filestr;
Expand All @@ -85,6 +89,13 @@ namespace DataHandling

// 2. Check the table workspace
std::vector<std::string> colnames = inpWS->getColumnNames();
stringstream dbmsgss("Input table's column names: ");
for (size_t i = 0; i < colnames.size(); ++i)
{
dbmsgss << setw(20) << colnames[i];
}
cout << dbmsgss.str() << endl;

// FIXME - The order of the column name can be flexible in future
if (colnames.size() < 2 || colnames[0].compare("Name") || colnames[1].compare("Value"))
{
Expand All @@ -106,6 +117,13 @@ namespace DataHandling
mParameters.insert(std::make_pair(parname, parvalue));
}

// 4. Debug output
stringstream dbss("Imported Parameter Table: \n");
map<string, double>::iterator mit;
for (mit = mParameters.begin(); mit != mParameters.end(); ++mit)
dbss << setw(20) << mit->first << " = " << setprecision(5) << mit->second << endl;
cout << dbss.str();

return;
}

Expand All @@ -114,59 +132,60 @@ namespace DataHandling
*/
std::string SaveFullprofResolution::toIRFString(int bankid)
{
double tofmin = mParameters["tof-min"];
double tofmax = mParameters["tof-max"];
double zero = mParameters["Zero"];
double zerot = mParameters["Zerot"];
double tofstep = mParameters["step"];
double dtt1 = mParameters["Dtt1"];
double dtt1t = mParameters["Dtt1t"];
double dtt2t = mParameters["Dtt2t"];
double xcross = mParameters["Tcross"];
double width = mParameters["Width"];
double sig2 = mParameters["Sig2"];
double sig1 = mParameters["Sig1"];
double sig0 = mParameters["Sig0"];
double gam2 = mParameters["Gam2"];
double gam1 = mParameters["Gam1"];
double gam0 = mParameters["Gam0"];
double alph0 = mParameters["Alph0"];
double alph1 = mParameters["Alph1"];
double alph0t = mParameters["Alph0t"];
double alph1t = mParameters["Alph1t"];
double beta0 = mParameters["Beta0"];
double beta1 = mParameters["Beta1"];
double beta0t = mParameters["Beta0t"];
double beta1t = mParameters["Beta0"];
double profindex = mParameters["Profile"];
double twotheta = mParameters["twotheta"];

std::stringstream content;

content << " Instrumental resolution function for POWGEN/SNS J.P. Hodges 2011-09-02 ireso: 6" << std::endl;
content << "! To be used with function NPROF=" << profindex << " in FullProf (Res=6)" << std::endl;
content << "! ---------------------------------------------- Bank " << bankid << " CWL = 0.5330A" << std::endl;
content << "! Type of profile function: back-to-back exponentials * pseudo-Voigt" << std::endl;
content << "NPROF " << profindex << std::endl;
content << "! Tof-min(us) step Tof-max(us)" << std::endl;
content << "TOFRG " << setw(10) << tofmin << setw(10) << tofstep << setw(10) << tofmax << std::endl;
content << "! Zero Dtt1" << std::endl;
content << "ZD2TOF " << setw(10) << zero << setw(10) << dtt1 << std::endl;
content << "! Zerot Dtt1t Dtt2t x-cross Width" << std::endl;
content << "ZD2TOT " << setw(10) << zerot << setw(10) << dtt1t << setw(10) << dtt2t << setw(10) << xcross << setw(10) << width << std::endl;
content << "! TOF-TWOTH of the bank" << std::endl;
content << "TWOTH " << twotheta << std::endl;
content << "! Sig-2 Sig-1 Sig-0" << std::endl;
content << "SIGMA " << setw(10) << sig2 << setw(10) << sig1 << setw(10) << sig0 << std::endl;
content << "! Gam-2 Gam-1 Gam-0" << std::endl;
content << "GAMMA " << setw(10) << gam2 << setw(10) << gam1 << setw(10) << gam0 << std::endl;
content << "! alph0 beta0 alph1 beta1" << std::endl;
content << "ALFBE " << setw(10) << alph0 << setw(10) << beta0 << setw(10) << alph1 << setw(10) << beta1 << std::endl;
content << "! alph0t beta0t alph1t beta1t" << std::endl;
content << "ALFBT " << setw(10) << alph0t << setw(10) << beta0t << setw(10) << alph1t << setw(10) << beta1t << std::endl;
content << "END" << std::endl;

return content.str();
double tofmin = mParameters["tof-min"];
double tofmax = mParameters["tof-max"];
double zero = mParameters["Zero"];
double zerot = mParameters["Zerot"];
double tofstep = mParameters["step"];
double dtt1 = mParameters["Dtt1"];
double dtt1t = mParameters["Dtt1t"];
double dtt2t = mParameters["Dtt2t"];
double xcross = mParameters["Tcross"];
double width = mParameters["Width"];
double sig2 = mParameters["Sig2"];
double sig1 = mParameters["Sig1"];
double sig0 = mParameters["Sig0"];
double gam2 = mParameters["Gam2"];
double gam1 = mParameters["Gam1"];
double gam0 = mParameters["Gam0"];
double alph0 = mParameters["Alph0"];
double alph1 = mParameters["Alph1"];
double alph0t = mParameters["Alph0t"];
double alph1t = mParameters["Alph1t"];
double beta0 = mParameters["Beta0"];
double beta1 = mParameters["Beta1"];
double beta0t = mParameters["Beta0t"];
double beta1t = mParameters["Beta0"];
double profindex = mParameters["Profile"];
double twotheta = mParameters["twotheta"];

std::stringstream content;

content << " Instrumental resolution function for POWGEN/SNS J.P. Hodges 2011-09-02 ireso: 6" << std::endl;
content << "! To be used with function NPROF=" << profindex << " in FullProf (Res=6)" << std::endl;
content << "! ---------------------------------------------- Bank " << bankid << " CWL = 0.5330A" << std::endl;
content << "! Type of profile function: back-to-back exponentials * pseudo-Voigt" << std::endl;
content << "NPROF " << profindex << std::endl;
content << "! Tof-min(us) step Tof-max(us)" << std::endl;
content << "TOFRG " << setw(10) << tofmin << setw(10) << tofstep << setw(10) << tofmax << std::endl;
content << "! Zero Dtt1" << std::endl;
content << "ZD2TOF " << setw(10) << zero << setw(10) << dtt1 << std::endl;
content << "! Zerot Dtt1t Dtt2t x-cross Width" << std::endl;
content << "ZD2TOT " << setw(10) << zerot << setw(10) << dtt1t << setw(10) << dtt2t << setw(10) << xcross
<< setw(10) << width << std::endl;
content << "! TOF-TWOTH of the bank" << std::endl;
content << "TWOTH " << twotheta << std::endl;
content << "! Sig-2 Sig-1 Sig-0" << std::endl;
content << "SIGMA " << setw(10) << sig2 << setw(10) << sig1 << setw(10) << sig0 << std::endl;
content << "! Gam-2 Gam-1 Gam-0" << std::endl;
content << "GAMMA " << setw(10) << gam2 << setw(10) << gam1 << setw(10) << gam0 << std::endl;
content << "! alph0 beta0 alph1 beta1" << std::endl;
content << "ALFBE " << setw(10) << alph0 << setw(10) << beta0 << setw(10) << alph1 << setw(10) << beta1 << std::endl;
content << "! alph0t beta0t alph1t beta1t" << std::endl;
content << "ALFBT " << setw(10) << alph0t << setw(10) << beta0t << setw(10) << alph1t << setw(10) << beta1t << std::endl;
content << "END" << std::endl;

return content.str();

}

Expand Down
156 changes: 156 additions & 0 deletions Code/Mantid/Framework/DataHandling/test/SaveFullprofResolutionTest.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,17 @@
#include <cxxtest/TestSuite.h>

#include "MantidDataHandling/SaveFullprofResolution.h"
#include "MantidDataObjects/TableWorkspace.h"
#include "MantidAPI/TableRow.h"

#include <fstream>
#include <iostream>

using namespace std;
using namespace Mantid;
using namespace Mantid::API;
using namespace Mantid::Kernel;
using namespace Mantid::DataObjects;

using Mantid::DataHandling::SaveFullprofResolution;

Expand All @@ -23,6 +34,151 @@ class SaveFullprofResolutionTest : public CxxTest::TestSuite
TS_ASSERT(alg.isInitialized());
}

void test_SaveFile()
{
// 1. Create input workspace
string filename("/home/wzz/Mantid/Code/debug/MyTestData/Bank1InstrumentTable.dat");
map<std::string, double> parameters, newvalueparameters;
map<string, vector<double> > parametermcs;
importInstrumentTxtFile(filename, parameters, parametermcs);
TableWorkspace_sptr itablews = createInstrumentParameterWorkspace(parameters, newvalueparameters, parametermcs);

AnalysisDataService::Instance().addOrReplace("Bank1InstrumentParameterTable", itablews);

// 2. Init the algorithm
Mantid::DataHandling::SaveFullprofResolution alg;
TS_ASSERT_THROWS_NOTHING(alg.initialize());

// 3. Set up
alg.setProperty("InputWorkspace", "Bank1InstrumentParameterTable");
alg.setProperty("OutputFile", "bank1.irf");
alg.setProperty("Bank", 1);

// 4. Execute
TS_ASSERT_THROWS_NOTHING(alg.execute());
TS_ASSERT(alg.isExecuted());

TS_ASSERT_EQUALS(1, 212);

}



//---------------- Helpers To Create Input Workspaces --------------------------

/** Create instrument geometry parameter/LeBail parameter workspaces
*/
DataObjects::TableWorkspace_sptr createInstrumentParameterWorkspace(std::map<std::string, double> parameters,
std::map<std::string, double> newvalueparameters,
map<string, vector<double> > mcparameters)
{
UNUSED_ARG(mcparameters);

// 1. Combine 2 inputs
std::map<std::string, double>::iterator nvit;
std::stringstream infoss;
infoss << "Modifying parameters: " << std::endl;
for (nvit = newvalueparameters.begin(); nvit != newvalueparameters.end(); ++nvit)
{
std::map<std::string, double>::iterator fdit;
fdit = parameters.find(nvit->first);
if (fdit != parameters.end())
{
fdit->second = nvit->second;
infoss << "Name: " << std::setw(15) << fdit->first << ", Value: " << fdit->second << std::endl;
}
}
std::cout << infoss.str();

// 2. Crate table workspace
DataObjects::TableWorkspace* tablews = new DataObjects::TableWorkspace();
DataObjects::TableWorkspace_sptr geomws = DataObjects::TableWorkspace_sptr(tablews);

tablews->addColumn("str", "Name");
tablews->addColumn("double", "Value");
tablews->addColumn("str", "FitOrTie");
tablews->addColumn("double", "Chi2");
tablews->addColumn("double", "Min");
tablews->addColumn("double", "Max");
tablews->addColumn("double", "StepSize");

// 2. Add peak parameters' name and values
map<string, double>::iterator mit;
string fitortie("f");
double minvalue = 0.0;
double maxvalue = 0.0;
double stepsize = 0.0;
for (mit = parameters.begin(); mit != parameters.end(); ++mit)
{
string parname = mit->first;
double parvalue = mit->second;

API::TableRow newrow = geomws->appendRow();
newrow << parname << parvalue << fitortie << 1.234 << minvalue << maxvalue << stepsize;
}

return geomws;
}

/** Import text file containing the instrument parameters
* Format: name, value, min, max, step-size
* Input: a text based file
* Output: a map for (parameter name, parameter value)
*/
void importInstrumentTxtFile(std::string filename, std::map<std::string, double>& parameters,
std::map<string, vector<double> >& parametermcs)
{
// 1. Open file
std::ifstream ins;
ins.open(filename.c_str());
if (!ins.is_open())
{
std::cout << "File " << filename << " cannot be opened. " << std::endl;
throw std::invalid_argument("Cannot open Reflection-Text-File.");
}
else
{
std::cout << "Importing instrument parameter file " << filename << std::endl;
}

// 2. Parse
parameters.clear();
parametermcs.clear();

char line[256];
while(ins.getline(line, 256))
{
if (line[0] != '#')
{
std::string parname;
double parvalue, parmin, parmax, parstepsize;

std::stringstream ss;
ss.str(line);
ss >> parname >> parvalue;
parameters.insert(std::make_pair(parname, parvalue));

try
{
ss >> parmin >> parmax >> parstepsize;
vector<double> mcpars;
mcpars.push_back(parmin);
mcpars.push_back(parmax);
mcpars.push_back(parstepsize);
parametermcs.insert(make_pair(parname, mcpars));
}
catch (runtime_error err)
{
;
}
}
}

ins.close();

return;
}


};

Expand Down

0 comments on commit 6b62868

Please sign in to comment.