本文整理汇总了C++中geometry::IDetector_const_sptr类的典型用法代码示例。如果您正苦于以下问题:C++ IDetector_const_sptr类的具体用法?C++ IDetector_const_sptr怎么用?C++ IDetector_const_sptr使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了IDetector_const_sptr类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: setDetectorPosition
/**
* Set the absolute detector position of a detector
* @param instrument :: The instrument that contains the defined detector
* @param detID :: Detector ID
* @param pos :: new position of Dectector
* @param sameParent :: true if detector has same parent as previous detector set here.
*/
void ApplyCalibration::setDetectorPosition(const Geometry::Instrument_const_sptr & instrument, int detID, V3D pos, bool /*sameParent*/ )
{
Geometry::IDetector_const_sptr det = instrument->getDetector(detID);
// Then find the corresponding relative position
boost::shared_ptr<const Geometry::IComponent> parent = det->getParent();
if (parent)
{
pos -= parent->getPos();
Quat rot = parent->getRelativeRot();
rot.inverse();
rot.rotate(pos);
}
boost::shared_ptr<const Geometry::IComponent>grandparent = parent->getParent();
if (grandparent)
{
Quat rot = grandparent->getRelativeRot();
rot.inverse();
rot.rotate(pos);
boost::shared_ptr<const Geometry::IComponent>greatgrandparent = grandparent->getParent();
if (greatgrandparent) {
Quat rot2 = greatgrandparent->getRelativeRot();
rot2.inverse();
rot2.rotate(pos);
}
}
// Add a parameter for the new position
m_pmap->addV3D(det.get(), "pos", pos);
}
示例2: calculate
void CalculateDIFC::calculate(API::Progress &progress,
API::MatrixWorkspace_sptr &outputWs,
DataObjects::OffsetsWorkspace_sptr &offsetsWS,
double l1, double beamlineNorm,
Kernel::V3D &beamline, Kernel::V3D &samplePos,
detid2det_map &allDetectors) {
SpecialWorkspace2D_sptr localWS =
boost::dynamic_pointer_cast<SpecialWorkspace2D>(outputWs);
// Now go through all
detid2det_map::const_iterator it = allDetectors.begin();
for (; it != allDetectors.end(); ++it) {
Geometry::IDetector_const_sptr det = it->second;
if ((!det->isMasked()) && (!det->isMonitor())) {
const detid_t detID = it->first;
double offset = 0.;
if (offsetsWS)
offset = offsetsWS->getValue(detID, 0.);
double difc = Geometry::Instrument::calcConversion(
l1, beamline, beamlineNorm, samplePos, det, offset);
difc = 1. / difc; // calcConversion gives 1/DIFC
localWS->setValue(detID, difc);
}
progress.report("Calculate DIFC");
}
}
示例3: calcDetPar
/** Method calculates averaged polar coordinates of the detector's group
(which may consist of one detector)
*@param spDet -- shared pointer to the Mantid Detector
*@param Observer -- sample position or the centre of the polar system of
coordinates to calculate detector's parameters.
*@param Detector -- return Detector class containing averaged polar coordinates
of the detector or detector's group in
spherical coordinate system with centre at Observer
*/
void FindDetectorsPar::calcDetPar(const Geometry::IDetector_const_sptr &spDet,
const Kernel::V3D &Observer,
DetParameters &Detector) {
// get number of basic detectors within the composit detector
size_t nDetectors = spDet->nDets();
// define summator
AvrgDetector detSum;
// do we want spherical or linear box sizes?
detSum.setUseSpherical(!m_SizesAreLinear);
if (nDetectors == 1) {
detSum.addDetInfo(spDet, Observer);
} else {
// access contributing detectors;
Geometry::DetectorGroup_const_sptr spDetGroup =
boost::dynamic_pointer_cast<const Geometry::DetectorGroup>(spDet);
if (!spDetGroup) {
g_log.error() << "calc_cylDetPar: can not downcast IDetector_sptr to "
"detector group for det->ID: " << spDet->getID()
<< std::endl;
throw(std::bad_cast());
}
auto detectors = spDetGroup->getDetectors();
auto it = detectors.begin();
auto it_end = detectors.end();
for (; it != it_end; it++) {
detSum.addDetInfo(*it, Observer);
}
}
// calculate averages and return the detector parameters
detSum.returnAvrgDetPar(Detector);
}
示例4: calculateDetectorPosition
/** Retrieves the detector postion for a given spectrum
* @param index :: The workspace index of the spectrum
* @param l1 :: Returns the source-sample distance
* @param l2 :: Returns the sample-detector distance
* @param twoTheta :: Returns the detector's scattering angle
*/
void RemoveBins::calculateDetectorPosition(const int& index, double& l1, double& l2, double& twoTheta)
{
// Get a pointer to the instrument contained in the workspace
Geometry::Instrument_const_sptr instrument = m_inputWorkspace->getInstrument();
// Get the distance between the source and the sample (assume in metres)
Geometry::IObjComponent_const_sptr sample = instrument->getSample();
// Check for valid instrument
if (sample == NULL)
{
throw Exception::InstrumentDefinitionError("Instrument not sufficiently defined: failed to get sample");
}
l1 = instrument->getSource()->getDistance(*sample);
Geometry::IDetector_const_sptr det = m_inputWorkspace->getDetector(index);
// Get the sample-detector distance for this detector (in metres)
if ( ! det->isMonitor() )
{
l2 = det->getDistance(*sample);
// The scattering angle for this detector (in radians).
twoTheta = m_inputWorkspace->detectorTwoTheta(det);
}
else // If this is a monitor then make l1+l2 = source-detector distance and twoTheta=0
{
l2 = det->getDistance(*(instrument->getSource()));
l2 = l2 - l1;
twoTheta = 0.0;
}
g_log.debug() << "Detector for index " << index << " has L1+L2=" << l1+l2 << " & 2theta= " << twoTheta << std::endl;
return;
}
示例5: calculate
void CalculateDIFC::calculate() {
Instrument_const_sptr instrument = m_inputWS->getInstrument();
SpecialWorkspace2D_sptr localWS =
boost::dynamic_pointer_cast<SpecialWorkspace2D>(m_outputWS);
double l1;
Kernel::V3D beamline, samplePos;
double beamline_norm;
instrument->getInstrumentParameters(l1, beamline, beamline_norm, samplePos);
// To get all the detector ID's
detid2det_map allDetectors;
instrument->getDetectors(allDetectors);
// Now go through all
detid2det_map::const_iterator it = allDetectors.begin();
for (; it != allDetectors.end(); ++it) {
Geometry::IDetector_const_sptr det = it->second;
if ((!det->isMasked()) && (!det->isMonitor())) {
const detid_t detID = it->first;
double offset = 0.;
if (m_offsetsWS)
offset = m_offsetsWS->getValue(detID, 0.);
double difc = Geometry::Instrument::calcConversion(
l1, beamline, beamline_norm, samplePos, det, offset);
difc = 1. / difc; // calcConversion gives 1/DIFC
localWS->setValue(detID, difc);
}
}
}
示例6: populate_values_from_file
void FindDetectorsPar::populate_values_from_file(
const API::MatrixWorkspace_sptr &inputWS) {
size_t nHist = inputWS->getNumberHistograms();
if (this->current_ASCII_file.Type == PAR_type) {
// in this case data in azimuthal width and polar width are in fact real
// sizes in meters; have to transform it in into angular values
for (size_t i = 0; i < nHist; i++) {
azimuthalWidth[i] =
atan2(azimuthalWidth[i], secondaryFlightpath[i]) * rad2deg;
polarWidth[i] = atan2(polarWidth[i], secondaryFlightpath[i]) * rad2deg;
}
m_SizesAreLinear = false;
} else {
Geometry::IComponent_const_sptr sample =
inputWS->getInstrument()->getSample();
secondaryFlightpath.resize(nHist);
// Loop over the spectra
for (size_t i = 0; i < nHist; i++) {
Geometry::IDetector_const_sptr spDet;
try {
spDet = inputWS->getDetector(i);
} catch (Kernel::Exception::NotFoundError &) {
continue;
}
// Check that we aren't writing a monitor...
if (spDet->isMonitor())
continue;
/// this is the only value, which is not defined in phx file, so we
/// calculate it
secondaryFlightpath[i] = spDet->getDistance(*sample);
}
}
}
示例7: checkProperties
/** Makes sure that the input properties are set correctly
* @param inputWorkspace The input workspace
* @throw std::runtime_error If the properties are invalid
*/
void NormaliseToMonitor::checkProperties(API::MatrixWorkspace_sptr inputWorkspace)
{
// Check where the monitor spectrum should come from
Property* monSpec = getProperty("MonitorSpectrum");
Property* monWS = getProperty("MonitorWorkspace");
Property* monID = getProperty("MonitorID");
// Is the monitor spectrum within the main input workspace
const bool inWS = !monSpec->isDefault();
// Or is it in a separate workspace
bool sepWS = !monWS->isDefault();
// or monitor ID
bool monIDs = !monID->isDefault();
// something has to be set
if ( !inWS && !sepWS && !monIDs)
{
const std::string mess("Neither the MonitorSpectrum, nor the MonitorID or the MonitorWorkspace property has been set");
g_log.error()<<mess<<std::endl;
throw std::runtime_error(mess);
}
// One and only one of these properties should have been set
// input from separate workspace is owerwritten by monitor spectrum
if ( inWS && sepWS ){
g_log.information("Both input workspace MonitorSpectrum number and monitor workspace are specified. Ignoring Monitor Workspace");
sepWS = false;
}
// input from detector ID is rejected in favour of monitor sp
if ( inWS && monIDs ){
g_log.information("Both input workspace MonitorSpectrum number and detector ID are specified. Ignoring Detector ID");
monIDs = false;
}
// separate ws takes over detectorID (this logic is dublicated within getInWSMonitorSpectrum)
if ( sepWS && monIDs ){
g_log.information("Both input MonitorWorkspace and detector ID are specified. Ignoring Detector ID");
}
// Do a check for common binning and store
m_commonBins = API::WorkspaceHelpers::commonBoundaries(inputWorkspace);
int spec_num(-1);
// Check the monitor spectrum or workspace and extract into new workspace
m_monitor = sepWS ? this->getMonitorWorkspace(inputWorkspace,spec_num) : this->getInWSMonitorSpectrum(inputWorkspace,spec_num) ;
// Check that the 'monitor' spectrum actually relates to a monitor - warn if not
try {
Geometry::IDetector_const_sptr mon = m_monitor->getDetector(0);
if ( !mon->isMonitor() )
{
g_log.warning()<<"The spectrum N: "<<spec_num<<" in MonitorWorkspace does not refer to a monitor.\n"
<<"Continuing with normalisation regardless.";
}
} catch (Kernel::Exception::NotFoundError &) {
g_log.warning("Unable to check if the spectrum provided relates to a monitor - "
"the instrument is not fully specified.\n"
"Continuing with normalisation regardless.");
}
}
示例8: calculateFlightpath
/** Calculates the total flightpath for the given detector.
* This is L1+L2 normally, but is the source-detector distance for a monitor.
* @param spectrum :: The workspace index
* @param L1 :: The primary flightpath
* @param isMonitor :: Output: true is this detector is a monitor
* @return The flightpath (Ld) for the detector linked to spectrum
* @throw Kernel::Exception::InstrumentDefinitionError if the detector position
* can't be obtained
*/
double UnwrapMonitor::calculateFlightpath(const int &spectrum, const double &L1,
bool &isMonitor) const {
double Ld = -1.0;
try {
// Get the detector object for this histogram
Geometry::IDetector_const_sptr det = m_inputWS->getDetector(spectrum);
// Get the sample-detector distance for this detector (or source-detector if
// a monitor)
// This is the total flightpath
isMonitor = det->isMonitor();
// Get the L2 distance if this detector is not a monitor
if (!isMonitor) {
double L2 = det->getDistance(*(m_inputWS->getInstrument()->getSample()));
Ld = L1 + L2;
}
// If it is a monitor, then the flightpath is the distance to the source
else {
Ld = det->getDistance(*(m_inputWS->getInstrument()->getSource()));
}
} catch (Exception::NotFoundError &) {
// If the detector information is missing, return a negative number
}
return Ld;
}
示例9:
/**
* Corrects a spectra for the detector efficiency calculated from detector
* information. Gets the detector information and uses this to calculate its
* efficiency
* @param spectraIndex :: index of the spectrum to get the efficiency for
* @throw invalid_argument if the shape of a detector is isn't a cylinder
* aligned along one axis
* @throw runtime_error if the SpectraDetectorMap has not been filled
* @throw NotFoundError if the detector or its gas pressure or wall thickness
* were not found
*/
void He3TubeEfficiency::correctForEfficiency(std::size_t spectraIndex)
{
Geometry::IDetector_const_sptr det = this->inputWS->getDetector(spectraIndex);
if( det->isMonitor() || det->isMasked() )
{
return;
}
const double exp_constant = this->calculateExponential(spectraIndex, det);
const double scale = this->getProperty("ScaleFactor");
Mantid::MantidVec &yout = this->outputWS->dataY(spectraIndex);
Mantid::MantidVec &eout = this->outputWS->dataE(spectraIndex);
// Need the original values so this is not a reference
const Mantid::MantidVec yValues = this->inputWS->readY(spectraIndex);
const Mantid::MantidVec eValues = this->inputWS->readE(spectraIndex);
std::vector<double>::const_iterator yinItr = yValues.begin();
std::vector<double>::const_iterator einItr = eValues.begin();
Mantid::MantidVec::const_iterator xItr = this->inputWS->readX(spectraIndex).begin();
Mantid::MantidVec::iterator youtItr = yout.begin();
Mantid::MantidVec::iterator eoutItr = eout.begin();
for( ; youtItr != yout.end(); ++youtItr, ++eoutItr)
{
const double wavelength = (*xItr + *(xItr + 1)) / 2.0;
const double effcorr = this->detectorEfficiency(exp_constant * wavelength, scale);
*youtItr = (*yinItr) * effcorr;
*eoutItr = (*einItr) * effcorr;
++yinItr; ++einItr;
++xItr;
}
return;
}
示例10:
/** Purpose: Process mask workspace
* Requirement: m_maskWS is not None
* Guarantees: an array will be set up for masked detectors
* @brief IntegratePeaksCWSD::processMaskWorkspace
* @param maskws
*/
std::vector<detid_t> IntegratePeaksCWSD::processMaskWorkspace(
DataObjects::MaskWorkspace_const_sptr maskws) {
std::vector<detid_t> vecMaskedDetID;
// Add the detector IDs of all masked detector to a vector
size_t numspec = maskws->getNumberHistograms();
for (size_t iws = 0; iws < numspec; ++iws) {
Geometry::IDetector_const_sptr detector = maskws->getDetector(iws);
const MantidVec &vecY = maskws->readY(iws);
if (vecY[0] > 0.1) {
// vecY[] > 0 is masked. det->isMasked() may not be reliable.
detid_t detid = detector->getID();
vecMaskedDetID.push_back(detid);
}
}
// Sort the vector for future lookup
if (vecMaskedDetID.size() > 1)
std::sort(vecMaskedDetID.begin(), vecMaskedDetID.end());
g_log.warning() << "[DB] There are " << vecMaskedDetID.size()
<< " detectors masked."
<< "\n";
return vecMaskedDetID;
}
示例11: findPixelID
int LoadIsawPeaks::findPixelID(Instrument_const_sptr inst, std::string bankName, int col, int row)
{
boost::shared_ptr<const IComponent> parent = inst->getComponentByName(bankName);
if (parent->type().compare("RectangularDetector") == 0)
{
boost::shared_ptr<const RectangularDetector> RDet = boost::dynamic_pointer_cast<
const RectangularDetector>(parent);
boost::shared_ptr<Detector> pixel = RDet->getAtXY(col, row);
return pixel->getID();
}
else
{
std::vector<Geometry::IComponent_const_sptr> children;
boost::shared_ptr<const Geometry::ICompAssembly> asmb = boost::dynamic_pointer_cast<const Geometry::ICompAssembly>(parent);
asmb->getChildren(children, false);
int col0 = (col%2==0 ? col/2+75 : (col-1)/2);
boost::shared_ptr<const Geometry::ICompAssembly> asmb2 = boost::dynamic_pointer_cast<const Geometry::ICompAssembly>(children[col0]);
std::vector<Geometry::IComponent_const_sptr> grandchildren;
asmb2->getChildren(grandchildren,false);
Geometry::IComponent_const_sptr first = grandchildren[row-1];
Geometry::IDetector_const_sptr det = boost::dynamic_pointer_cast<const Geometry::IDetector>(first);
return det->getID();
}
}
示例12: componentToDetectors
/** Extract a component's detectors and return it within detectors array
* It is a generalized version of bankToDetectors()
*
* @param componentnames -- vector of component names to process
* @param detectors -- vector of detector ids, which belongs to components
*provided as input.
*/
void LoadMask::componentToDetectors(
const std::vector<std::string> &componentnames,
std::vector<detid_t> &detectors) {
Geometry::Instrument_const_sptr minstrument = m_maskWS->getInstrument();
for (auto &componentname : componentnames) {
g_log.debug() << "Component name = " << componentname << '\n';
// a) get component
Geometry::IComponent_const_sptr component =
minstrument->getComponentByName(componentname);
if (component)
g_log.debug() << "Component ID = " << component->getComponentID() << '\n';
else {
// A non-exiting component. Ignore
g_log.warning() << "Component " << componentname << " does not exist!\n";
continue;
}
// b) component -> component assembly --> children (more than detectors)
boost::shared_ptr<const Geometry::ICompAssembly> asmb =
boost::dynamic_pointer_cast<const Geometry::ICompAssembly>(component);
std::vector<Geometry::IComponent_const_sptr> children;
asmb->getChildren(children, true);
g_log.debug() << "Number of Children = " << children.size() << '\n';
size_t numdets(0);
detid_t id_min(std::numeric_limits<Mantid::detid_t>::max());
detid_t id_max(0);
for (const auto &child : children) {
// c) convert component to detector
Geometry::IDetector_const_sptr det =
boost::dynamic_pointer_cast<const Geometry::IDetector>(child);
if (det) {
detid_t detid = det->getID();
detectors.push_back(detid);
numdets++;
if (detid < id_min)
id_min = detid;
if (detid > id_max)
id_max = detid;
}
}
g_log.debug() << "Number of Detectors in Children = " << numdets
<< " Range = " << id_min << ", " << id_max << '\n';
} // for component
}
示例13: getDetectorGeometry
/** Update the shape cache if necessary
* @param det :: a pointer to the detector to query
* @param detRadius :: An output parameter that contains the detector radius
* @param detAxis :: An output parameter that contains the detector axis vector
*/
void DetectorEfficiencyCor::getDetectorGeometry(const Geometry::IDetector_const_sptr & det, double & detRadius, V3D & detAxis)
{
boost::shared_ptr<const Object> shape_sptr = det->shape();
if(!shape_sptr->hasValidShape())
{
throw Exception::NotFoundError("Shape", "Detector has no shape");
}
std::map<const Geometry::Object *, std::pair<double, Kernel::V3D> >::const_iterator it =
m_shapeCache.find(shape_sptr.get());
if( it == m_shapeCache.end() )
{
double xDist = distToSurface( V3D(DIST_TO_UNIVERSE_EDGE, 0, 0), shape_sptr.get() );
double zDist = distToSurface( V3D(0, 0, DIST_TO_UNIVERSE_EDGE), shape_sptr.get() );
if ( std::abs(zDist - xDist) < 1e-8 )
{
detRadius = zDist/2.0;
detAxis = V3D(0,1,0);
// assume radi in z and x and the axis is in the y
PARALLEL_CRITICAL(deteff_shapecachea)
{
m_shapeCache.insert(std::pair<const Object *,std::pair<double, V3D> >(shape_sptr.get(), std::pair<double, V3D>(detRadius, detAxis)));
}
return;
}
示例14: distToSurface
/**
* Update the shape cache if necessary
* @param det :: a pointer to the detector to query
* @param detRadius :: An output parameter that contains the detector radius
* @param detAxis :: An output parameter that contains the detector axis vector
*/
void He3TubeEfficiency::getDetectorGeometry(\
Geometry::IDetector_const_sptr det,
double & detRadius, Kernel::V3D & detAxis)
{
boost::shared_ptr<const Geometry::Object> shape_sptr = det->shape();
std::map<const Geometry::Object *, std::pair<double, Kernel::V3D> >::const_iterator it =
this->shapeCache.find(shape_sptr.get());
if( it == this->shapeCache.end() )
{
double xDist = distToSurface( Kernel::V3D(DIST_TO_UNIVERSE_EDGE, 0, 0),
shape_sptr.get() );
double zDist = distToSurface( Kernel::V3D(0, 0, DIST_TO_UNIVERSE_EDGE),
shape_sptr.get() );
if ( std::abs(zDist - xDist) < 1e-8 )
{
detRadius = zDist / 2.0;
detAxis = Kernel::V3D(0, 1, 0);
// assume radii in z and x and the axis is in the y
PARALLEL_CRITICAL(deteff_shapecachea)
{
this->shapeCache.insert(std::pair<const Geometry::Object *,
std::pair<double, Kernel::V3D> >(shape_sptr.get(),
std::pair<double, Kernel::V3D>(detRadius, detAxis)));
}
return;
}
示例15: ic
/// helper function to preprocess the detectors directions
void
ConvertToQ3DdE::process_detectors_positions(const DataObjects::Workspace2D_const_sptr inputWS)
{
const size_t nHist = inputWS->getNumberHistograms();
det_loc.det_dir.resize(nHist);
det_loc.det_id.resize(nHist);
// Loop over the spectra
size_t ic(0);
for (size_t i = 0; i < nHist; i++){
Geometry::IDetector_const_sptr spDet;
try{
spDet= inputWS->getDetector(i);
}catch(Kernel::Exception::NotFoundError &){
continue;
}
// Check that we aren't dealing with monitor...
if (spDet->isMonitor())continue;
det_loc.det_id[ic] = spDet->getID();
// dist = spDet->getDistance(*sample);
double polar = inputWS->detectorTwoTheta(spDet);
double azim = spDet->getPhi();
double sPhi=sin(polar);
double ez = cos(polar);
double ex = sPhi*cos(azim);
double ey = sPhi*sin(azim);
det_loc.det_dir[ic].setX(ex);
det_loc.det_dir[ic].setY(ey);
det_loc.det_dir[ic].setZ(ez);
ic++;
}
//
if(ic<nHist){
det_loc.det_dir.resize(ic);
det_loc.det_id.resize(ic);
}
}