Skip to content
Snippets Groups Projects
Commit b93c59a4 authored by Ricardo Leal's avatar Ricardo Leal
Browse files

Working version. Still need time details Refs #7195

parent 5219e1c7
No related branches found
No related tags found
No related merge requests found
......@@ -50,6 +50,7 @@ set ( SRC_FILES
src/LoadInstrumentFromNexus.cpp
src/LoadInstrumentFromRaw.cpp
src/LoadIsawDetCal.cpp
src/LoadLLB.cpp
src/LoadLOQDistancesFromRaw.cpp
src/LoadLiveData.cpp
src/LoadLog.cpp
......@@ -194,6 +195,7 @@ set ( INC_FILES
inc/MantidDataHandling/LoadInstrumentFromNexus.h
inc/MantidDataHandling/LoadInstrumentFromRaw.h
inc/MantidDataHandling/LoadIsawDetCal.h
inc/MantidDataHandling/LoadLLB.h
inc/MantidDataHandling/LoadLOQDistancesFromRaw.h
inc/MantidDataHandling/LoadLiveData.h
inc/MantidDataHandling/LoadLog.h
......@@ -287,7 +289,6 @@ set ( INC_FILES
)
set ( TEST_FILES
LoadDAETest.h
#LoadSNSNexusTest.h # TODO has no active tests in it
#Needs fixing to not rely on network. SNSLiveEventDataListenerTest.h
ADARAPacketTest.h
......@@ -315,6 +316,7 @@ set ( TEST_FILES
LoadAsciiTest.h
LoadCalFileTest.h
LoadCanSAS1dTest.h
LoadDAETest.h
LoadDaveGrpTest.h
LoadDetectorInfoTest.h
LoadDetectorsGroupingFileTest.h
......@@ -330,12 +332,13 @@ set ( TEST_FILES
LoadInstrumentFromRawTest.h
LoadInstrumentTest.h
LoadIsawDetCalTest.h
LoadLLBTest.h
LoadLiveDataTest.h
LoadLogTest.h
LoadLogsFromSNSNexusTest.h
LoadMappingTableTest.h
LoadMaskTest.h
LoadMcStasNexusTest.h
LoadMcStasNexusTest.h
LoadMuonLogTest.h
LoadMuonNexus1Test.h
LoadMuonNexus2Test.h
......@@ -343,7 +346,7 @@ set ( TEST_FILES
LoadNexusLogsTest.h
LoadNexusMonitorsTest.h
LoadNexusProcessedTest.h
LoadNexusTest.h
LoadNexusTest.h
LoadPDFgetNFileTest.h
LoadParameterFileTest.h
LoadPreNexusMonitorsTest.h
......@@ -400,7 +403,7 @@ set ( TEST_FILES
SaveRKHTest.h
SaveSPETest.h
SaveToSNSHistogramNexusTest.h
SetSampleMaterialTest.h
SetSampleMaterialTest.h
SetScalingPSDTest.h
StartLiveDataTest.h
UpdateInstrumentFromFileTest.h
......
#ifndef MANTID_DATAHANDLING_LOADLLB_H_
#define MANTID_DATAHANDLING_LOADLLB_H_
#include "MantidKernel/System.h"
#include "MantidAPI/Algorithm.h"
#include "MantidAPI/IDataFileChecker.h"
#include "MantidNexus/NexusClasses.h"
namespace Mantid
{
namespace DataHandling
{
/** LoadLLB : TODO: DESCRIPTION
Copyright © 2013 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory
This file is part of Mantid.
Mantid is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
Mantid is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
File change history is stored at: <https://github.com/mantidproject/mantid>
Code Documentation is available at: <http://doxygen.mantidproject.org>
*/
class DLLExport LoadLLB: public API::IDataFileChecker {
public:
LoadLLB();
virtual ~LoadLLB();
virtual const std::string name() const;
virtual int version() const;
virtual const std::string category() const;
///checks the file can be loaded by reading 1st 100 bytes and looking at the file extension.
bool quickFileCheck(const std::string& filePath, size_t nread,
const file_header& header);
/// check the structure of the file and if this file can be loaded return a value between 1 and 100
int fileCheck(const std::string& filePath);
private:
virtual void initDocs();
void init();
void exec();
void setInstrumentName(NeXus::NXEntry& entry);
std::string getInstrumentName(NeXus::NXEntry& entry);
void initWorkSpace(NeXus::NXEntry&);
void loadDataIntoTheWorkSpace(NeXus::NXEntry&);
/// Calculate error for y
static double calculateError(double in) {
return sqrt(in);
}
void loadExperimentDetails(NeXus::NXEntry&);
void loadRunDetails(NeXus::NXEntry &);
double calculateEnergy(double);
void runLoadInstrument();
std::vector<std::string> supportedInstruments;
std::string m_nexusInstrumentEntryName;
std::string m_instrumentName;
API::MatrixWorkspace_sptr m_localWorkspace;
size_t m_numberOfTubes; // number of tubes - X
size_t m_numberOfPixelsPerTube; //number of pixels per tube - Y
size_t m_numberOfChannels; // time channels - Z
size_t m_numberOfHistograms;
};
} // namespace DataHandling
} // namespace Mantid
#endif /* MANTID_DATAHANDLING_LOADLLB_H_ */
/*WIKI*
TODO: Enter a full wiki-markup description of your algorithm here. You can then use the Build/wiki_maker.py script to generate your full wiki page.
*WIKI*/
#include "MantidDataHandling/LoadLLB.h"
#include "MantidAPI/FileProperty.h"
#include "MantidKernel/UnitFactory.h"
#include "MantidAPI/LoadAlgorithmFactory.h"
#include "MantidAPI/Progress.h"
#include "MantidGeometry/Instrument.h"
#include <limits>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
namespace Mantid {
namespace DataHandling {
using namespace Kernel;
using namespace API;
using namespace NeXus;
// Register the algorithm into the AlgorithmFactory
DECLARE_ALGORITHM(LoadLLB)
//register the algorithm into loadalgorithm factory
DECLARE_LOADALGORITHM(LoadLLB)
//----------------------------------------------------------------------------------------------
/** Constructor
*/
LoadLLB::LoadLLB() {
m_instrumentName = "";
supportedInstruments.push_back("MIBEMOL");
}
//----------------------------------------------------------------------------------------------
/** Destructor
*/
LoadLLB::~LoadLLB() {
}
//----------------------------------------------------------------------------------------------
/// Algorithm's name for identification. @see Algorithm::name
const std::string LoadLLB::name() const {
return "LoadLLB";
}
;
/// Algorithm's version for identification. @see Algorithm::version
int LoadLLB::version() const {
return 1;
}
;
/// Algorithm's category for identification. @see Algorithm::category
const std::string LoadLLB::category() const {
return "DataHandling";
}
//----------------------------------------------------------------------------------------------
/// Sets documentation strings for this algorithm
void LoadLLB::initDocs() {
this->setWikiSummary("Loads LLB nexus file.");
this->setOptionalMessage("Loads LLB nexus file.");
}
bool LoadLLB::quickFileCheck(const std::string& filePath, size_t nread,
const file_header& header) {
std::string extn = extension(filePath);
bool bnexs(false);
(!extn.compare("nxs") || !extn.compare("nx5")) ? bnexs = true : bnexs =
false;
/*
* HDF files have magic cookie in the first 4 bytes
*/
if (((nread >= sizeof(unsigned))
&& (ntohl(header.four_bytes) == g_hdf_cookie)) || bnexs) {
//hdf
return true;
} else if ((nread >= sizeof(g_hdf5_signature))
&& (!memcmp(header.full_hdr, g_hdf5_signature,
sizeof(g_hdf5_signature)))) {
//hdf5
return true;
}
return false;
}
/**
* Checks the file by opening it and reading few lines
* @param filePath :: name of the file inluding its path
* @return an integer value how much this algorithm can load the file
*/
int LoadLLB::fileCheck(const std::string& filePath) {
// Create the root Nexus class
NXRoot root(filePath);
NXEntry entry = root.openFirstEntry();
std::string instrumentName = getInstrumentName(entry);
if (std::find(supportedInstruments.begin(), supportedInstruments.end(),
instrumentName) != supportedInstruments.end()) {
// FOUND
return 80;
}
return 0;
}
//----------------------------------------------------------------------------------------------
/** Initialize the algorithm's properties.
*/
void LoadLLB::init() {
std::vector<std::string> exts;
exts.push_back(".nxs");
exts.push_back(".hdf");
declareProperty(new FileProperty("Filename", "", FileProperty::Load, exts),
"The name of the Nexus file to load");
declareProperty(
new WorkspaceProperty<>("OutputWorkspace", "", Direction::Output),
"The name to use for the output workspace");
}
//----------------------------------------------------------------------------------------------
/** Execute the algorithm.
*/
void LoadLLB::exec() {
std::string filename = getPropertyValue("Filename");
NXRoot root(filename);
NXEntry entry = root.openFirstEntry();
setInstrumentName(entry);
initWorkSpace(entry);
loadDataIntoTheWorkSpace(entry);
loadRunDetails(entry);
loadExperimentDetails(entry);
runLoadInstrument();
setProperty("OutputWorkspace", m_localWorkspace);
}
void LoadLLB::setInstrumentName(NeXus::NXEntry& entry) {
m_instrumentName = getInstrumentName(entry);
if (m_instrumentName == "") {
std::string message(
"Cannot read the instrument name from the Nexus file!");
g_log.error(message);
throw std::runtime_error(message);
}
}
std::string LoadLLB::getInstrumentName(NeXus::NXEntry& entry) {
// format: /entry0/?????/name
std::string instrumentName = "";
std::vector<NXClassInfo> v = entry.groups();
for (auto it = v.begin(); it < v.end(); it++) {
if (it->nxclass == "NXinstrument" || it->nxname == "nxinstrument") {
m_nexusInstrumentEntryName = it->nxname;
std::string insNamePath = m_nexusInstrumentEntryName + "/name";
instrumentName = entry.getString(insNamePath);
g_log.debug() << "Instrument Name: " << instrumentName
<< " in NxPath: " << insNamePath << std::endl;
break;
}
}
//std::replace( instrumentName.begin(), instrumentName.end(), ' ', '_'); // replace all ' ' to '_'
long unsigned int pos = instrumentName.find(" ");
instrumentName = instrumentName.substr (0,pos);
return instrumentName;
}
void LoadLLB::initWorkSpace(NeXus::NXEntry& entry) {
// read in the data
NXData dataGroup = entry.openNXData("nxdata");
NXInt data = dataGroup.openIntData();
m_numberOfTubes = static_cast<size_t>(data.dim0());
m_numberOfPixelsPerTube = 1;
m_numberOfChannels = static_cast<size_t>(data.dim1());
// dim0 * m_numberOfPixelsPerTube is the total number of detectors
m_numberOfHistograms = m_numberOfTubes * m_numberOfPixelsPerTube;
g_log.debug() << "NumberOfTubes: " << m_numberOfTubes << std::endl;
g_log.debug() << "NumberOfPixelsPerTube: " << m_numberOfPixelsPerTube
<< std::endl;
g_log.debug() << "NumberOfChannels: " << m_numberOfChannels << std::endl;
// Now create the output workspace
// Might need to get this value from the number of monitors in the Nexus file
// params:
// workspace type,
// total number of spectra + (number of monitors = 0),
// bin boundaries = m_numberOfChannels + 1
// Z/time dimension
m_localWorkspace = WorkspaceFactory::Instance().create("Workspace2D",
m_numberOfHistograms, m_numberOfChannels + 1, m_numberOfChannels);
m_localWorkspace->getAxis(0)->unit() = UnitFactory::Instance().create(
"TOF");
m_localWorkspace->setYUnitLabel("Counts");
}
void LoadLLB::loadDataIntoTheWorkSpace(NeXus::NXEntry& entry) {
// read in the data
NXData dataGroup = entry.openNXData("nxdata");
NXInt data = dataGroup.openIntData();
data.load();
NXFloat timeBinning = entry.openNXFloat("nxdata/x_axis");
timeBinning.load();
size_t numberOfBins = static_cast<size_t>(timeBinning.dim1()) + 1; // boundaries
g_log.debug() << "Number of bins: " << numberOfBins << std::endl;
// Assign time bin to first X entry
float* timeBinning_p = &timeBinning[0];
std::vector<double> timeBinningTmp(numberOfBins);
timeBinningTmp.assign(timeBinning_p,timeBinning_p + numberOfBins);
timeBinningTmp[numberOfBins-1] = timeBinningTmp[numberOfBins-2]+timeBinningTmp[1]-timeBinningTmp[0];
m_localWorkspace->dataX(0).assign(timeBinningTmp.begin(),timeBinningTmp.end());
Progress progress(this, 0, 1, m_numberOfTubes * m_numberOfPixelsPerTube);
size_t spec = 0;
for (size_t i = 0; i < m_numberOfTubes; ++i) {
for (size_t j = 0; j < m_numberOfPixelsPerTube; ++j) {
if (spec > 0) {
// just copy the time binning axis to every spectra
m_localWorkspace->dataX(spec) = m_localWorkspace->readX(0);
}
// Assign Y
int* data_p = &data(static_cast<int>(i), static_cast<int>(j));
m_localWorkspace->dataY(spec).assign(data_p,
data_p + m_numberOfChannels);
// Assign Error
MantidVec& E = m_localWorkspace->dataE(spec);
std::transform(data_p, data_p + m_numberOfChannels, E.begin(),
LoadLLB::calculateError);
++spec;
progress.report();
}
}
g_log.debug() << "Data loading inti WS done...." << std::endl;
}
void LoadLLB::loadRunDetails(NXEntry & entry) {
API::Run & runDetails = m_localWorkspace->mutableRun();
// int runNum = entry.getInt("run_number");
// std::string run_num = boost::lexical_cast<std::string>(runNum);
// runDetails.addProperty("run_number", run_num);
std::string start_time = entry.getString("start_time");
//start_time = getDateTimeInIsoFormat(start_time);
runDetails.addProperty("run_start", start_time);
std::string end_time = entry.getString("end_time");
//end_time = getDateTimeInIsoFormat(end_time);
runDetails.addProperty("run_end", end_time);
double wavelength = entry.getFloat("nxbeam/incident_wavelength");
runDetails.addProperty<double>("wavelength", wavelength);
double energy = calculateEnergy(wavelength);
runDetails.addProperty<double>("Ei", energy,true); //overwrite
std::string title = entry.getString("title");
runDetails.addProperty("title", title);
m_localWorkspace->setTitle(title);
}
/**
* Calculate Neutron Energy from wavelength: \f$ E = h^2 / 2m\lambda ^2 \f$
* @param wavelength :: wavelength in \f$ \AA \f$
* @return tof in seconds
*/
double LoadLLB::calculateEnergy(double wavelength) {
double e = (PhysicalConstants::h * PhysicalConstants::h) /
(2 * PhysicalConstants::NeutronMass * wavelength*wavelength * 1e-20)/
PhysicalConstants::meV;
return e;
}
/*
* Load data about the Experiment.
*
* TODO: This is very incomplete. In ISIS they much more info in the nexus file than ILL.
*
* @param entry :: The Nexus entry
*/
void LoadLLB::loadExperimentDetails(NXEntry & entry) {
// TODO: Do the rest
// Pick out the geometry information
(void)entry;
// std::string description = boost::lexical_cast<std::string>(
// entry.getFloat("sample/description"));
//
// m_localWorkspace->mutableSample().setName(description);
// m_localWorkspace->mutableSample().setThickness(static_cast<double> (isis_raw->spb.e_thick));
// m_localWorkspace->mutableSample().setHeight(static_cast<double> (isis_raw->spb.e_height));
// m_localWorkspace->mutableSample().setWidth(static_cast<double> (isis_raw->spb.e_width));
}
/**
* Run the Child Algorithm LoadInstrument.
*/
void LoadLLB::runLoadInstrument() {
IAlgorithm_sptr loadInst = createChildAlgorithm("LoadInstrument");
// Now execute the Child Algorithm. Catch and log any error, but don't stop.
try {
// TODO: depending on the m_numberOfPixelsPerTube we might need to load a different IDF
loadInst->setPropertyValue("InstrumentName", m_instrumentName);
loadInst->setProperty<MatrixWorkspace_sptr>("Workspace",
m_localWorkspace);
loadInst->execute();
} catch (...) {
g_log.information("Cannot load the instrument definition.");
}
}
} // namespace DataHandling
} // namespace Mantid
#ifndef MANTID_DATAHANDLING_LOADLLBTEST_H_
#define MANTID_DATAHANDLING_LOADLLBTEST_H_
#include <cxxtest/TestSuite.h>
#include "MantidDataHandling/LoadLLB.h"
using namespace Mantid::API;
using Mantid::DataHandling::LoadLLB;
class LoadLLBTest: public CxxTest::TestSuite {
public:
// This pair of boilerplate methods prevent the suite being created statically
// This means the constructor isn't called when running other tests
static LoadLLBTest *createSuite() {
return new LoadLLBTest();
}
static void destroySuite(LoadLLBTest *suite) {
delete suite;
}
LoadLLBTest() :
m_testFile("LLB_d22418.nxs") {
}
void testName() {
LoadLLB alg;
TS_ASSERT_EQUALS(alg.name(), "LoadLLB");
}
void testVersion() {
LoadLLB alg;
TS_ASSERT_EQUALS(alg.version(), 1);
}
void test_Init() {
LoadLLB alg;
TS_ASSERT_THROWS_NOTHING(alg.initialize())
TS_ASSERT(alg.isInitialized())
}
void test_exec() {
LoadLLB loader;
loader.initialize();
loader.setPropertyValue("Filename", m_testFile);
std::string outputSpace = "LoadLLBTest_out";
loader.setPropertyValue("OutputWorkspace", outputSpace);
TS_ASSERT_THROWS_NOTHING(loader.execute());
// test workspace, copied from LoadMuonNexusTest.h
MatrixWorkspace_sptr output;
(output = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(
outputSpace));
MatrixWorkspace_sptr output2D = boost::dynamic_pointer_cast<
MatrixWorkspace>(output);
TS_ASSERT_EQUALS(output2D->getNumberHistograms(), 84);
AnalysisDataService::Instance().clear();
}
private:
std::string m_testFile;
};
#endif /* MANTID_DATAHANDLING_LOADLLBTEST_H_ */
......@@ -474,6 +474,15 @@
</facility>
<!-- Reactor Orphee (France) -->
<facility name="LLB" FileExtensions=".nxs,.hdf">
<instrument name="MIBEMOL">
<technique>Neutron Spectroscopy</technique>
<technique>Reactor Direct Geometry Spectroscopy</technique>
</instrument>
</facility>
<facility name="TEST" FileExtensions=".nxs,.dat,.xml">
<livedata listener="MockILiveListener"/>
......
<?xml version="1.0" encoding="utf-8"?>
<!-- For help on the notation used to specify an Instrument Definition File see http://www.mantidproject.org/IDF -->
<instrument name="MIBEMOL" valid-from="1900-01-31 23:59:59" valid-to="2100-01-31 23:59:59" last-modified="2013-05-27 12:29:36">
<!-- Author: ricardo.leal@ill.fr -->
<defaults>
<length unit="meter" />
<angle unit="degree" />
<reference-frame>
<!-- The z-axis is set parallel to and in the direction of the beam. the
y-axis points up and the coordinate system is right handed. -->
<along-beam axis="z" />
<pointing-up axis="y" />
<handedness val="right" />
</reference-frame>
</defaults>
<component type="moderator">
<location z="-0.490000" />
</component>
<type name="moderator" is="Source"></type>
<!-- Sample position -->
<component type="sample-position">
<location y="0.0" x="0.0" z="0.0" />
</component>
<type name="sample-position" is="SamplePos" />
<idlist idname="detectors">
<id start="1" end="84" />
</idlist>
<!-- Detector list def -->
<component type="detectors" idlist="detectors">
<location />
</component>
<!-- Detector Banks -->
<type name="detectors">
<component type="bank">
<location />
</component>
</type>
<!-- Definition of every bank -->
<type name="bank">
<component type="pack">
<location r="3.580000" t="147.157000" p="0.000000" name="det1"></location>
<location r="3.580000" t="143.666000" p="0.000000" name="det2"></location>
<location r="3.580000" t="141.509000" p="0.000000" name="det3"></location>
<location r="3.580000" t="141.484000" p="0.000000" name="det4"></location>
<location r="3.580000" t="139.462000" p="0.000000" name="det5"></location>
<location r="3.580000" t="138.475000" p="0.000000" name="det6"></location>
<location r="3.580000" t="136.565000" p="0.000000" name="det7"></location>
<location r="3.580000" t="135.639000" p="0.000000" name="det8"></location>
<location r="3.580000" t="134.732000" p="0.000000" name="det9"></location>
<location r="3.580000" t="132.967000" p="0.000000" name="det10"></location>
<location r="3.580000" t="132.107000" p="0.000000" name="det11"></location>
<location r="3.580000" t="131.262000" p="0.000000" name="det12"></location>
<location r="3.580000" t="128.009000" p="0.000000" name="det13"></location>
<location r="3.580000" t="126.453000" p="0.000000" name="det14"></location>
<location r="3.580000" t="125.690000" p="0.000000" name="det15"></location>
<location r="3.580000" t="124.193000" p="0.000000" name="det16"></location>
<location r="3.580000" t="122.732000" p="0.000000" name="det17"></location>
<location r="3.580000" t="121.304000" p="0.000000" name="det18"></location>
<location r="3.580000" t="120.602000" p="0.000000" name="det19"></location>
<location r="3.580000" t="119.220000" p="0.000000" name="det20"></location>
<location r="3.580000" t="117.866000" p="0.000000" name="det21"></location>
<location r="3.580000" t="116.538000" p="0.000000" name="det22"></location>
<location r="3.580000" t="115.235000" p="0.000000" name="det23"></location>
<location r="3.580000" t="112.695000" p="0.000000" name="det24"></location>
<location r="3.580000" t="110.845000" p="0.000000" name="det25"></location>
<location r="3.580000" t="110.237000" p="0.000000" name="det26"></location>
<location r="3.580000" t="108.443000" p="0.000000" name="det27"></location>
<location r="3.580000" t="107.853000" p="0.000000" name="det28"></location>
<location r="3.580000" t="106.109000" p="0.000000" name="det29"></location>
<location r="3.580000" t="104.965000" p="0.000000" name="det30"></location>
<location r="3.580000" t="103.836000" p="0.000000" name="det31"></location>
<location r="3.580000" t="102.721000" p="0.000000" name="det32"></location>
<location r="3.580000" t="101.620000" p="0.000000" name="det33"></location>
<location r="3.580000" t="99.991000" p="0.000000" name="det34"></location>
<location r="3.580000" t="98.921000" p="0.000000" name="det35"></location>
<location r="3.580000" t="96.814000" p="0.000000" name="det36"></location>
<location r="3.580000" t="95.263000" p="0.000000" name="det37"></location>
<location r="3.580000" t="94.241000" p="0.000000" name="det38"></location>
<location r="3.580000" t="92.727000" p="0.000000" name="det39"></location>
<location r="3.580000" t="91.729000" p="0.000000" name="det40"></location>
<location r="3.580000" t="90.248000" p="0.000000" name="det41"></location>
<location r="3.580000" t="89.272000" p="0.000000" name="det42"></location>
<location r="3.580000" t="87.822000" p="0.000000" name="det43"></location>
<location r="3.580000" t="86.390000" p="0.000000" name="det44"></location>
<location r="3.580000" t="85.445000" p="0.000000" name="det45"></location>
<location r="3.580000" t="84.040000" p="0.000000" name="det46"></location>
<location r="3.580000" t="79.915000" p="0.000000" name="det47"></location>
<location r="3.580000" t="79.015000" p="0.000000" name="det48"></location>
<location r="3.580000" t="77.677000" p="0.000000" name="det49"></location>
<location r="3.580000" t="76.350000" p="0.000000" name="det50"></location>
<location r="3.580000" t="75.473000" p="0.000000" name="det51"></location>
<location r="3.580000" t="73.884000" p="0.000000" name="det52"></location>
<location r="3.580000" t="72.442000" p="0.000000" name="det53"></location>
<location r="3.580000" t="71.586000" p="0.000000" name="det54"></location>
<location r="3.580000" t="69.889000" p="0.000000" name="det55"></location>
<location r="3.580000" t="69.047000" p="0.000000" name="det56"></location>
<location r="3.580000" t="67.792000" p="0.000000" name="det57"></location>
<location r="3.580000" t="64.899000" p="0.000000" name="det58"></location>
<location r="3.580000" t="63.674000" p="0.000000" name="det59"></location>
<location r="3.580000" t="62.456000" p="0.000000" name="det60"></location>
<location r="3.580000" t="61.246000" p="0.000000" name="det61"></location>
<location r="3.580000" t="60.044000" p="0.000000" name="det62"></location>
<location r="3.580000" t="58.452000" p="0.000000" name="det63"></location>
<location r="3.580000" t="57.266000" p="0.000000" name="det64"></location>
<location r="3.580000" t="56.087000" p="0.000000" name="det65"></location>
<location r="3.580000" t="54.525000" p="0.000000" name="det66"></location>
<location r="3.580000" t="53.360000" p="0.000000" name="det67"></location>
<location r="3.580000" t="52.202000" p="0.000000" name="det68"></location>
<location r="3.580000" t="48.759000" p="0.000000" name="det69"></location>
<location r="3.580000" t="47.623000" p="0.000000" name="det70"></location>
<location r="3.580000" t="46.114000" p="0.000000" name="det71"></location>
<location r="3.580000" t="44.989000" p="0.000000" name="det72"></location>
<location r="3.580000" t="43.868000" p="0.000000" name="det73"></location>
<location r="3.580000" t="42.380000" p="0.000000" name="det74"></location>
<location r="3.580000" t="41.269000" p="0.000000" name="det75"></location>
<location r="3.580000" t="40.162000" p="0.000000" name="det76"></location>
<location r="3.580000" t="38.692000" p="0.000000" name="det77"></location>
<location r="3.580000" t="37.594000" p="0.000000" name="det78"></location>
<location r="3.580000" t="36.499000" p="0.000000" name="det79"></location>
<location r="3.580000" t="27.500000" p="0.000000" name="det80"></location>
<location r="3.580000" t="26.100000" p="0.000000" name="det81"></location>
<location r="3.580000" t="24.800000" p="0.000000" name="det82"></location>
<location r="3.580000" t="23.500000" p="0.000000" name="det83"></location>
<location r="3.580000" t="0.000000" p="0.000000" name="det84"></location>
</component>
</type>
<type name="pack" is="detector">
<cuboid id="pack-pixel-shape">
<left-front-bottom-point z="-0.005" y="-0.2" x="-0.01" />
<left-front-top-point z="-0.005" y="0.2" x="-0.01" />
<left-back-bottom-point z="-0.005" y="-0.2" x="0.01" />
<right-front-bottom-point z="0.005" y="-0.2" x="-0.01" />
</cuboid>
<algebra val="pack-pixel-shape" />
</type>
</instrument>
File added
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment