Newer
Older
#include "MantidDataHandling/LoadEventPreNexus2.h"
Federico Montesino Pouzols
committed
#include "MantidAPI/Axis.h"
#include "MantidAPI/FileFinder.h"
Federico Montesino Pouzols
committed
#include "MantidAPI/MemoryManager.h"
#include "MantidAPI/RegisterFileLoader.h"
#include "MantidAPI/WorkspaceFactory.h"
#include "MantidDataObjects/EventWorkspace.h"
#include "MantidDataObjects/EventList.h"
#include "MantidKernel/ArrayProperty.h"
#include "MantidKernel/FileValidator.h"
#include "MantidKernel/DateAndTime.h"
#include "MantidKernel/Glob.h"
#include "MantidAPI/FileProperty.h"
#include "MantidKernel/BinaryFile.h"
#include "MantidKernel/System.h"
#include "MantidKernel/TimeSeriesProperty.h"
#include "MantidKernel/UnitFactory.h"
#include "MantidKernel/DateAndTime.h"
#include "MantidGeometry/IDetector.h"
#include "MantidKernel/CPUTimer.h"
#include "MantidKernel/VisibleWhenProperty.h"
#include "MantidDataObjects/Workspace2D.h"
#include "MantidKernel/BoundedValidator.h"
#include "MantidKernel/ListValidator.h"
#include "MantidKernel/ConfigService.h"
#include <algorithm>
Federico Montesino Pouzols
committed
#include <functional>
#include <set>
#include <sstream>
Federico Montesino Pouzols
committed
#include <stdexcept>
#include <vector>
#include <boost/timer.hpp>
#include <Poco/File.h>
#include <Poco/Path.h>
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
namespace Mantid {
namespace DataHandling {
DECLARE_FILELOADER_ALGORITHM(LoadEventPreNexus2)
using namespace Kernel;
using namespace API;
using namespace Geometry;
using namespace DataObjects;
using boost::posix_time::ptime;
using boost::posix_time::time_duration;
using DataObjects::EventList;
using DataObjects::EventWorkspace;
using DataObjects::EventWorkspace_sptr;
using DataObjects::TofEvent;
using std::cout;
using std::endl;
using std::ifstream;
using std::runtime_error;
using std::stringstream;
using std::string;
using std::vector;
//------------------------------------------------------------------------------------------------
// constants for locating the parameters to use in execution
//------------------------------------------------------------------------------------------------
static const string EVENT_PARAM("EventFilename");
static const string PULSEID_PARAM("PulseidFilename");
static const string MAP_PARAM("MappingFilename");
static const string PID_PARAM("SpectrumList");
static const string PARALLEL_PARAM("UseParallelProcessing");
static const string BLOCK_SIZE_PARAM("LoadingBlockSize");
static const string OUT_PARAM("OutputWorkspace");
/// All pixel ids with matching this mask are errors.
static const PixelType ERROR_PID = 0x80000000;
/// The maximum possible tof as native type
static const uint32_t MAX_TOF_UINT32 = std::numeric_limits<uint32_t>::max();
/// Conversion factor between 100 nanoseconds and 1 microsecond.
static const double TOF_CONVERSION = .1;
/// Conversion factor between picoColumbs and microAmp*hours
static const double CURRENT_CONVERSION = 1.e-6 / 3600.;
/// Veto flag: 0xFF00000000000
static const uint64_t VETOFLAG(72057594037927935);
static const string EVENT_EXTS[] = {
"_neutron_event.dat", "_neutron0_event.dat", "_neutron1_event.dat",
"_neutron2_event.dat", "_neutron3_event.dat", "_neutron4_event.dat",
"_live_neutron_event.dat"};
static const string PULSE_EXTS[] = {
"_pulseid.dat", "_pulseid0.dat", "_pulseid1.dat", "_pulseid2.dat",
"_pulseid3.dat", "_pulseid4.dat", "_live_pulseid.dat"};
static const int NUM_EXT = 7;
//-----------------------------------------------------------------------------
// Statistic Functions
//-----------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
/** Parse preNexus file name to get run number
*/
static string getRunnumber(const string &filename) {
// start by trimming the filename
string runnumber(Poco::Path(filename).getBaseName());
if (runnumber.find("neutron") >= string::npos)
return "0";
std::size_t left = runnumber.find("_");
std::size_t right = runnumber.find("_", left + 1);
return runnumber.substr(left + 1, right - left - 1);
}
//----------------------------------------------------------------------------------------------
/** Generate Pulse ID file name from preNexus event file's name
*/
static string generatePulseidName(string eventfile) {
// initialize vector of endings and put live at the beginning
vector<string> eventExts(EVENT_EXTS, EVENT_EXTS + NUM_EXT);
std::reverse(eventExts.begin(), eventExts.end());
vector<string> pulseExts(PULSE_EXTS, PULSE_EXTS + NUM_EXT);
std::reverse(pulseExts.begin(), pulseExts.end());
// look for the correct ending
for (std::size_t i = 0; i < eventExts.size(); ++i) {
size_t start = eventfile.find(eventExts[i]);
if (start != string::npos)
return eventfile.replace(start, eventExts[i].size(), pulseExts[i]);
// give up and return nothing
return "";
}
//----------------------------------------------------------------------------------------------
/** Generate mapping file name from Event workspace's instrument
*/
static string generateMappingfileName(EventWorkspace_sptr &wksp) {
// get the name of the mapping file as set in the parameter files
std::vector<string> temp =
wksp->getInstrument()->getStringParameter("TS_mapping_file");
if (temp.empty())
return "";
string mapping = temp[0];
// Try to get it from the working directory
Poco::File localmap(mapping);
if (localmap.exists())
return mapping;
// Try to get it from the data directories
string dataversion = Mantid::API::FileFinder::Instance().getFullPath(mapping);
if (!dataversion.empty())
return dataversion;
// get a list of all proposal directories
string instrument = wksp->getInstrument()->getName();
Poco::File base("/SNS/" + instrument + "/");
// try short instrument name
if (!base.exists()) {
instrument =
Kernel::ConfigService::Instance().getInstrument(instrument).shortName();
base = Poco::File("/SNS/" + instrument + "/");
if (!base.exists())
return "";
}
vector<string> dirs; // poco won't let me reuse temp
base.list(dirs);
// check all of the proposals for the mapping file in the canonical place
const string CAL("_CAL");
const size_t CAL_LEN = CAL.length(); // cache to make life easier
vector<string> files;
for (auto &dir : dirs) {
if ((dir.length() > CAL_LEN) &&
(dir.compare(dir.length() - CAL.length(), CAL.length(), CAL) == 0)) {
if (Poco::File(base.path() + "/" + dir + "/calibrations/" + mapping)
files.push_back(base.path() + "/" + dir + "/calibrations/" + mapping);
if (files.empty())
return "";
else if (files.size() == 1)
return files[0];
else // just assume that the last one is the right one, this should never be
// fired
return *(files.rbegin());
}
//----------------------------------------------------------------------------------------------
/** Return the confidence with with this algorithm can load the file
* @param descriptor A descriptor for the file
* @returns An integer specifying the confidence level. 0 indicates it will not
* be used
*/
int LoadEventPreNexus2::confidence(Kernel::FileDescriptor &descriptor) const {
if (descriptor.extension().rfind("dat") == std::string::npos)
return 0;
Loading
Loading full blame...