/**
 * Rebuilds the internal list of scatterers
 *
 * This method extracts two items from the supplied CrystalStructure object, the
 * list of scatterers in the asymmetric unit and the space group. Then it
 * generates all equivalent positions and creates a complete list of scatterers.
 *
 * @param crystalStructure :: CrystalStructure for structure factor calculation.
 */
void StructureFactorCalculatorSummation::updateUnitCellScatterers(
    const CrystalStructure &crystalStructure) {
  m_unitCellScatterers->removeAllScatterers();

  CompositeBraggScatterer_sptr scatterersInAsymmetricUnit =
      crystalStructure.getScatterers();
  SpaceGroup_const_sptr spaceGroup = crystalStructure.spaceGroup();

  if (spaceGroup) {
    std::vector<BraggScatterer_sptr> braggScatterers;
    braggScatterers.reserve(scatterersInAsymmetricUnit->nScatterers() *
                            spaceGroup->order());

    for (size_t i = 0; i < scatterersInAsymmetricUnit->nScatterers(); ++i) {
      BraggScattererInCrystalStructure_sptr current =
          boost::dynamic_pointer_cast<BraggScattererInCrystalStructure>(
              scatterersInAsymmetricUnit->getScatterer(i));

      if (current) {
        std::vector<V3D> positions =
            spaceGroup->getEquivalentPositions(current->getPosition());

        for (auto &position : positions) {
          BraggScatterer_sptr clone = current->clone();
          clone->setProperty("Position", getV3DasString(position));

          braggScatterers.push_back(clone);
        }
      }
    }

    m_unitCellScatterers->setScatterers(braggScatterers);
  }
}
Exemplo n.º 2
0
/// Adds all scatterers in the supplied collection into the internal one
/// (scatterers are copied).
void CrystalStructure::addScatterers(
    const CompositeBraggScatterer_sptr &scatterers) {
  size_t count = scatterers->nScatterers();

  for (size_t i = 0; i < count; ++i) {
    m_scatterers->addScatterer(scatterers->getScatterer(i));
  }

  assignUnitCellToScatterers(m_cell);
  assignSpaceGroupToScatterers(m_spaceGroup);
}