Commit a6b5ebbd authored by Carl Poelking's avatar Carl Poelking
Browse files

Center-target spectra.

parent d36596b8
...@@ -9,3 +9,4 @@ test/back ...@@ -9,3 +9,4 @@ test/back
*.coeff *.coeff
*.cube *.cube
*.arch *.arch
*.back
...@@ -41,22 +41,118 @@ Spectrum::~Spectrum() { ...@@ -41,22 +41,118 @@ Spectrum::~Spectrum() {
} }
void Spectrum::compute() { void Spectrum::compute() {
GLOG() << "Compute spectrum ..." << std::endl; this->compute(_structure->particles(), _structure->particles());
}
void Spectrum::compute(Segment *center, Segment *target) {
this->compute(center->particles(), target->particles());
}
void Spectrum::compute(Structure::particle_array_t &centers, Structure::particle_array_t &targets) {
GLOG() << "Compute spectrum "
<< "(centers " << centers.size() << ", targets " << targets.size() << ") ..." << std::endl;
GLOG() << _options->summarizeOptions() << std::endl; GLOG() << _options->summarizeOptions() << std::endl;
GLOG() << "Using radial basis of type '" << _basis->getRadBasis()->identify() << "'" << std::endl; GLOG() << "Using radial basis of type '" << _basis->getRadBasis()->identify() << "'" << std::endl;
GLOG() << "Using angular basis of type '" << _basis->getAngBasis()->identify() << "'" << std::endl; GLOG() << "Using angular basis of type '" << _basis->getAngBasis()->identify() << "'" << std::endl;
GLOG() << "Using cutoff function of type '" << _basis->getCutoff()->identify() << "'" << std::endl; GLOG() << "Using cutoff function of type '" << _basis->getCutoff()->identify() << "'" << std::endl;
Structure::particle_it_t pit; Structure::particle_it_t pit;
for (pit = _structure->beginParticles(); pit != _structure->endParticles(); ++pit) { for (pit = centers.begin(); pit != centers.end(); ++pit) {
// Continue if exclusion defined ... // Continue if exclusion defined ...
if (_options->doExcludeCenter((*pit)->getType())) continue; if (_options->doExcludeCenter((*pit)->getType())) continue;
// Compute ... // Compute ...
AtomicSpectrum *atomic_spectrum = this->computeAtomic(*pit); AtomicSpectrum *atomic_spectrum = this->computeAtomic(*pit, targets);
//atomic_spectrum->getReduced()->writeDensityOnGrid("density.expanded.cube", _options, _structure, *pit, true); //atomic_spectrum->getReduced()->writeDensityOnGrid("density.expanded.cube", _options, _structure, *pit, true);
//atomic_spectrum->getReduced()->writeDensityOnGrid("density.explicit.cube", _options, _structure, *pit, false); //atomic_spectrum->getReduced()->writeDensityOnGrid("density.explicit.cube", _options, _structure, *pit, false);
this->addAtomic(atomic_spectrum); this->addAtomic(atomic_spectrum);
}
}
void Spectrum::computePower() {
atomspec_array_t::iterator it;
for (it = _atomspec_array.begin(); it != _atomspec_array.end(); ++it) {
(*it)->computePower();
}
return;
}
AtomicSpectrum *Spectrum::computeAtomic(Particle *center) {
return this->computeAtomic(center, _structure->particles());
}
AtomicSpectrum *Spectrum::computeAtomic(Particle *center, Structure::particle_array_t &targets) {
GLOG() << "Compute atomic spectrum for particle " << center->getId()
<< " (type " << center->getType() << ", targets " << targets.size() << ") ..." << std::endl;
// RadialCoefficients c_n_zero = _radbasis->computeCoefficientsAllZero();
// AngularCoefficients c_lm_zero = _angbasis->computeCoefficientsAllZero();
// BasisCoefficients c_nlm(c_n_zero, c_lm_zero);
// c_nlm.linkBasis(_radbasis, _angbasis);
// BasisExpansion *nbhood_expansion = new BasisExpansion(this->_basis);
AtomicSpectrum *atomic_spectrum = new AtomicSpectrum(center, this->_basis);
Structure::particle_it_t pit;
for (pit = targets.begin(); pit != targets.end(); ++pit) {
// CHECK FOR EXCLUSIONS
if (_options->doExcludeTarget((*pit)->getType())) continue;
// FIND DISTANCE & DIRECTION, APPLY CUTOFF (= WEIGHT REDUCTION)
vec dr = _structure->connect(center->getPos(), (*pit)->getPos());
double r = soap::linalg::abs(dr);
double weight_scale = this->_basis->getCutoff()->calculateWeight(r);
if (weight_scale < 0.) continue; // <- Negative cutoff weight means: skip
vec d = dr/r;
// APPLY WEIGHT IF CENTER
if (*pit == center) {
weight_scale *= this->_basis->getCutoff()->getCenterWeight();
}
// COMPUTE EXPANSION & ADD TO SPECTRUM
BasisExpansion nb_expansion(this->_basis);
nb_expansion.computeCoefficients(r, d, weight_scale*(*pit)->getWeight(), (*pit)->getSigma());
std::string type_other = (*pit)->getType();
atomic_spectrum->addQnlm(type_other, nb_expansion);
// nbhood_expansion->add(nb_expansion);
// // COMPUTE RADIAL COEFFICIENTS
// RadialCoefficients c_n_pair = _radbasis->computeCoefficients(r);
// /*
// GLOG() << "Radial coefficients r = " << r << std::endl;
// for (int i = 0; i < c_n.size(); ++i) {
// GLOG() << c_n[i] << " | ";
// }
// GLOG() << std::endl;
// */
//
// // COMPUTE ANGULAR COEFFICIENTS
// AngularCoefficients c_lm_pair = _angbasis->computeCoefficients(d, r);
// /*
// GLOG() << "Angular coefficients d = " << d << std::endl;
// for (int lm = 0; lm < c_lm.size(); ++lm) {
// GLOG() << c_lm[lm] << " | ";
// }
// GLOG() << std::endl;
// */
//
// BasisCoefficients c_nlm_pair(c_n_pair, c_lm_pair);
// c_nlm.add(c_nlm_pair);
} }
// c_nlm.writeDensityOnGrid("density.expanded.cube", _options, _structure, center, true);
// c_nlm.writeDensityOnGrid("density.explicit.cube", _options, _structure, center, false);
// nbhood_expansion->writeDensityOnGrid("density.expanded.cube", _options, _structure, center, true);
// nbhood_expansion->writeDensityOnGrid("density.explicit.cube", _options, _structure, center, false);
return atomic_spectrum;
} }
AtomicSpectrum *Spectrum::getAtomic(int slot_idx, std::string center_type) { AtomicSpectrum *Spectrum::getAtomic(int slot_idx, std::string center_type) {
...@@ -135,93 +231,6 @@ void Spectrum::writePowerDensity(int slot_idx, std::string center_type, std::str ...@@ -135,93 +231,6 @@ void Spectrum::writePowerDensity(int slot_idx, std::string center_type, std::str
return; return;
} }
void Spectrum::computePower() {
atomspec_array_t::iterator it;
for (it = _atomspec_array.begin(); it != _atomspec_array.end(); ++it) {
(*it)->computePower();
}
return;
}
// TODO change to ::computeAtomic(Particle *center, vector<Particle*> &nbhood)
AtomicSpectrum *Spectrum::computeAtomic(Particle *center) {
GLOG() << "Compute atomic spectrum for particle " << center->getId()
<< " (type " << center->getType() << ")" << std::endl;
// RadialCoefficients c_n_zero = _radbasis->computeCoefficientsAllZero();
// AngularCoefficients c_lm_zero = _angbasis->computeCoefficientsAllZero();
// BasisCoefficients c_nlm(c_n_zero, c_lm_zero);
// c_nlm.linkBasis(_radbasis, _angbasis);
// BasisExpansion *nbhood_expansion = new BasisExpansion(this->_basis);
AtomicSpectrum *atomic_spectrum = new AtomicSpectrum(center, this->_basis);
Structure::particle_it_t pit;
for (pit = _structure->beginParticles(); pit != _structure->endParticles(); ++pit) {
// CHECK FOR EXCLUSIONS
if (_options->doExcludeTarget((*pit)->getType())) continue;
// FIND DISTANCE & DIRECTION, APPLY CUTOFF (= WEIGHT REDUCTION)
vec dr = _structure->connect(center->getPos(), (*pit)->getPos());
double r = soap::linalg::abs(dr);
double weight_scale = this->_basis->getCutoff()->calculateWeight(r);
if (weight_scale < 0.) continue; // <- Negative cutoff weight means: skip
vec d = dr/r;
// APPLY WEIGHT IF CENTER
if (*pit == center) {
weight_scale *= this->_basis->getCutoff()->getCenterWeight();
}
// COMPUTE EXPANSION & ADD TO SPECTRUM
BasisExpansion nb_expansion(this->_basis);
nb_expansion.computeCoefficients(r, d, weight_scale*(*pit)->getWeight(), (*pit)->getSigma());
std::string type_other = (*pit)->getType();
atomic_spectrum->addQnlm(type_other, nb_expansion);
// nbhood_expansion->add(nb_expansion);
// // COMPUTE RADIAL COEFFICIENTS
// RadialCoefficients c_n_pair = _radbasis->computeCoefficients(r);
// /*
// GLOG() << "Radial coefficients r = " << r << std::endl;
// for (int i = 0; i < c_n.size(); ++i) {
// GLOG() << c_n[i] << " | ";
// }
// GLOG() << std::endl;
// */
//
// // COMPUTE ANGULAR COEFFICIENTS
// AngularCoefficients c_lm_pair = _angbasis->computeCoefficients(d, r);
// /*
// GLOG() << "Angular coefficients d = " << d << std::endl;
// for (int lm = 0; lm < c_lm.size(); ++lm) {
// GLOG() << c_lm[lm] << " | ";
// }
// GLOG() << std::endl;
// */
//
// BasisCoefficients c_nlm_pair(c_n_pair, c_lm_pair);
// c_nlm.add(c_nlm_pair);
}
// c_nlm.writeDensityOnGrid("density.expanded.cube", _options, _structure, center, true);
// c_nlm.writeDensityOnGrid("density.explicit.cube", _options, _structure, center, false);
// nbhood_expansion->writeDensityOnGrid("density.expanded.cube", _options, _structure, center, true);
// nbhood_expansion->writeDensityOnGrid("density.explicit.cube", _options, _structure, center, false);
return atomic_spectrum;
}
void Spectrum::addAtomic(AtomicSpectrum *atomspec) { void Spectrum::addAtomic(AtomicSpectrum *atomspec) {
assert(atomspec->getBasis() == _basis && assert(atomspec->getBasis() == _basis &&
"Should not append atomic spectrum linked against different basis."); "Should not append atomic spectrum linked against different basis.");
...@@ -252,11 +261,17 @@ void Spectrum::load(std::string archfile) { ...@@ -252,11 +261,17 @@ void Spectrum::load(std::string archfile) {
void Spectrum::registerPython() { void Spectrum::registerPython() {
using namespace boost::python; using namespace boost::python;
void (Spectrum::*computeAll)() = &Spectrum::compute;
void (Spectrum::*computeSegPair)(Segment*, Segment*) = &Spectrum::compute;
void (Spectrum::*computeCentersTargets)(Structure::particle_array_t&, Structure::particle_array_t&) = &Spectrum::compute;
class_<Spectrum>("Spectrum", init<Structure &, Options &>()) class_<Spectrum>("Spectrum", init<Structure &, Options &>())
.def(init<Structure &, Options &, Basis &>()) .def(init<Structure &, Options &, Basis &>())
.def(init<std::string>()) .def(init<std::string>())
.def("__iter__", range<return_value_policy<reference_existing_object> >(&Spectrum::beginAtomic, &Spectrum::endAtomic)) .def("__iter__", range<return_value_policy<reference_existing_object> >(&Spectrum::beginAtomic, &Spectrum::endAtomic))
.def("compute", &Spectrum::compute) .def("compute", computeAll)
.def("compute", computeSegPair)
.def("compute", computeCentersTargets)
.def("computePower", &Spectrum::computePower) .def("computePower", &Spectrum::computePower)
.def("addAtomic", &Spectrum::addAtomic) .def("addAtomic", &Spectrum::addAtomic)
.def("getAtomic", &Spectrum::getAtomic, return_value_policy<reference_existing_object>()) .def("getAtomic", &Spectrum::getAtomic, return_value_policy<reference_existing_object>())
......
...@@ -46,7 +46,10 @@ public: ...@@ -46,7 +46,10 @@ public:
void clean(); void clean();
void compute(); void compute();
void compute(Segment *centers, Segment *targets);
void compute(Structure::particle_array_t &sources, Structure::particle_array_t &targets);
AtomicSpectrum *computeAtomic(Particle *center); AtomicSpectrum *computeAtomic(Particle *center);
AtomicSpectrum *computeAtomic(Particle *center, Structure::particle_array_t &targets);
void addAtomic(AtomicSpectrum *atomspec); void addAtomic(AtomicSpectrum *atomspec);
AtomicSpectrum *getAtomic(int slot_idx, std::string center_type); AtomicSpectrum *getAtomic(int slot_idx, std::string center_type);
void writeDensityOnGrid(int slot_idx, std::string center_type, std::string density_type); void writeDensityOnGrid(int slot_idx, std::string center_type, std::string density_type);
......
...@@ -47,7 +47,11 @@ Particle &Segment::addParticle(Particle *new_part) { ...@@ -47,7 +47,11 @@ Particle &Segment::addParticle(Particle *new_part) {
void Segment::registerPython() { void Segment::registerPython() {
using namespace boost::python; using namespace boost::python;
class_<Segment>("Segment", init<int>()) class_<Segment, Segment*>("Segment", init<int>())
.add_property("id", &Segment::getId, &Segment::setId)
.add_property("name", make_function(&Segment::getName, copy_non_const()), &Segment::setName)
.add_property("type", make_function(&Segment::getType, copy_non_const()), &Segment::setType)
.add_property("particles", range<return_value_policy<reference_existing_object> >(&Segment::beginParticles, &Segment::endParticles))
.def("addParticle", &Segment::addParticle, return_value_policy<reference_existing_object>()); .def("addParticle", &Segment::addParticle, return_value_policy<reference_existing_object>());
} }
...@@ -154,14 +158,18 @@ void Structure::registerPython() { ...@@ -154,14 +158,18 @@ void Structure::registerPython() {
using namespace boost::python; using namespace boost::python;
class_<Structure>("Structure", init<std::string>()) class_<Structure>("Structure", init<std::string>())
.def("addSegment", &Structure::addSegment, return_value_policy<reference_existing_object>()) .def("addSegment", &Structure::addSegment, return_value_policy<reference_existing_object>())
.def("getSegment", &Structure::getSegment, return_value_policy<reference_existing_object>())
.def("addParticle", &Structure::addParticle, return_value_policy<reference_existing_object>()) .def("addParticle", &Structure::addParticle, return_value_policy<reference_existing_object>())
.def("__iter__", range<return_value_policy<reference_existing_object> >(&Structure::beginParticles, &Structure::endParticles)) .def("__iter__", range<return_value_policy<reference_existing_object> >(&Structure::beginParticles, &Structure::endParticles))
.add_property("particles", range<return_value_policy<reference_existing_object> >(&Structure::beginParticles, &Structure::endParticles)) .add_property("particles", range<return_value_policy<reference_existing_object> >(&Structure::beginParticles, &Structure::endParticles))
.add_property("segments", range<return_value_policy<reference_existing_object> >(&Structure::beginSegments, &Structure::endSegments))
.def("connect", &Structure::connectNumeric) .def("connect", &Structure::connectNumeric)
.add_property("box", &Structure::getBoundaryNumeric, &Structure::setBoundaryNumeric) .add_property("box", &Structure::getBoundaryNumeric, &Structure::setBoundaryNumeric)
.add_property("label", make_function(&Structure::getLabel, copy_non_const()), &Structure::setLabel); .add_property("label", make_function(&Structure::getLabel, copy_non_const()), &Structure::setLabel);
class_<particle_array_t>("ParticleContainer") class_<particle_array_t>("ParticleContainer")
.def(vector_indexing_suite<particle_array_t>()); .def(vector_indexing_suite<particle_array_t>());
class_<segment_array_t>("SegmentContainer")
.def(vector_indexing_suite<segment_array_t>());
} }
} /* CLOSE NAMESPACE */ } /* CLOSE NAMESPACE */
...@@ -6,6 +6,8 @@ ...@@ -6,6 +6,8 @@
#include <boost/python/iterator.hpp> #include <boost/python/iterator.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp> #include <boost/python/suite/indexing/vector_indexing_suite.hpp>
#include <iostream> #include <iostream>
#include "base/exceptions.hpp"
#include "types.hpp" #include "types.hpp"
#include "boundary.hpp" #include "boundary.hpp"
...@@ -49,6 +51,8 @@ public: ...@@ -49,6 +51,8 @@ public:
// Sigma // Sigma
void setSigma(double sigma) { _sigma = sigma; } void setSigma(double sigma) { _sigma = sigma; }
double &getSigma() { return _sigma; } double &getSigma() { return _sigma; }
// Segment
Segment *getSegment() { return _segment; }
static void registerPython(); static void registerPython();
...@@ -85,24 +89,43 @@ class Segment ...@@ -85,24 +89,43 @@ class Segment
{ {
public: public:
typedef std::vector<Particle*> particle_array_t; typedef std::vector<Particle*> particle_array_t;
typedef particle_array_t::iterator particle_it_t;
Segment(int id) : _id(id) { ; } Segment(int id) : _id(id), _name("?"), _type("?") { ; }
Segment() : _id(-1) { ; } Segment() : _id(-1), _name("?"), _type("?") { ; }
~Segment() { _particles.clear(); } ~Segment() { _particles.clear(); }
// PARTICLE CONTAINER
Particle &addParticle(Particle *new_part); Particle &addParticle(Particle *new_part);
particle_array_t &particles() { return _particles; }
particle_it_t beginParticles() { return _particles.begin(); }
particle_it_t endParticles() { return _particles.end(); }
// Name
void setName(std::string name) { _name = name; }
std::string &getName() { return _name; }
// Id
void setId(int id) { _id = id; }
int getId() { return _id; }
// Type
void setType(std::string type) { _type = type; }
std::string &getType() { return _type; }
static void registerPython(); static void registerPython();
template<class Archive> template<class Archive>
void serialize(Archive &arch, const unsigned int version) { void serialize(Archive &arch, const unsigned int version) {
arch & _id; arch & _id;
arch & _name;
arch & _type;
arch & _particles; arch & _particles;
return; return;
} }
private: private:
int _id; int _id;
std::string _name;
std::string _type;
particle_array_t _particles; particle_array_t _particles;
}; };
...@@ -120,10 +143,18 @@ public: ...@@ -120,10 +143,18 @@ public:
~Structure(); ~Structure();
void null(); void null();
// PARTICLE CONTAINER
particle_array_t &particles() { return _particles; } particle_array_t &particles() { return _particles; }
particle_it_t beginParticles() { return _particles.begin(); } particle_it_t beginParticles() { return _particles.begin(); }
particle_it_t endParticles() { return _particles.end(); } particle_it_t endParticles() { return _particles.end(); }
// SEGMENT CONTAINER
segment_array_t &segments() { return _segments; }
segment_it_t beginSegments() { return _segments.begin(); }
segment_it_t endSegments() { return _segments.end(); }
Segment *getSegment(int id) { if (id > _segments.size()) throw soap::base::OutOfRange("getSegment"); return _segments[id-1]; }
std::string &getLabel() { return _label; } std::string &getLabel() { return _label; }
void setLabel(std::string label) { _label = label; } void setLabel(std::string label) { _label = label; }
......
...@@ -33,7 +33,7 @@ def ase_load_single(config_file, log=None): ...@@ -33,7 +33,7 @@ def ase_load_single(config_file, log=None):
ase_config_list = AseConfigList([config_file], log=log) ase_config_list = AseConfigList([config_file], log=log)
return ase_config_list[0] return ase_config_list[0]
def setup_structure_ase(label, ase_config): def setup_structure_ase(label, ase_config, top=None):
# DEFINE SYSTEM # DEFINE SYSTEM
structure = soap.Structure(label) structure = soap.Structure(label)
# DEFINE BOUNDARY # DEFINE BOUNDARY
...@@ -45,26 +45,42 @@ def setup_structure_ase(label, ase_config): ...@@ -45,26 +45,42 @@ def setup_structure_ase(label, ase_config):
else: else:
raise NotImplementedError("<setup_structure_ase> Partial periodicity not implemented.") raise NotImplementedError("<setup_structure_ase> Partial periodicity not implemented.")
structure.box = box structure.box = box
# CREATE SINGLE SEGMENT # PARTICLE PROPERTIES
segment = structure.addSegment()
# CREATE PARTICLES
props = ['id', 'type', 'mass', 'pos'] props = ['id', 'type', 'mass', 'pos']
ids = [ i+1 for i in range(ase_config.get_number_of_atoms()) ] ids = [ i+1 for i in range(ase_config.get_number_of_atoms()) ]
types = ase_config.get_atomic_numbers() types = ase_config.get_atomic_numbers()
positions = ase_config.get_positions() positions = ase_config.get_positions()
masses = ase_config.get_masses() masses = ase_config.get_masses()
names = ase_config.get_chemical_symbols() names = ase_config.get_chemical_symbols()
for id, name, typ, pos, mass in zip(ids, names, types, positions, masses): # DEFAULT TOPOLOGY
particle = structure.addParticle(segment) if top == None:
particle.pos = pos top = [('segment', 1, len(positions))]
particle.mass = mass # VERIFY PARTICLE COUNT
particle.weight = 1. atom_count = 0
particle.sigma = 0.5 for section in top:
particle.name = name atom_count += section[1]*section[2]
particle.type = name assert atom_count == len(positions) # Does topology match structure?
particle.type_id = typ # PARTITION: CREATE SEGMENTS, PARTICLES
return structure atom_idx = 0
for section in top:
seg_type = section[0]
n_segs = section[1]
n_atoms = section[2]
for i in range(n_segs):
segment = structure.addSegment()
segment.name = seg_type
segment.type = seg_type
for j in range(n_atoms):
particle = structure.addParticle(segment)
particle.pos = positions[atom_idx]
particle.mass = masses[atom_idx]
particle.weight = 1.
particle.sigma = 0.5
particle.name = names[atom_idx]
particle.type = names[atom_idx]
particle.type_id = types[atom_idx]
atom_idx += 1
return structure
class AseConfigList(object): class AseConfigList(object):
def __init__(self, def __init__(self,
......
56
N 31.7089747 41.3358810 86.1879144
C 31.0963060 42.3161507 86.2185478
N 31.3970531 45.5996138 85.1468239
C 30.9257581 44.6682396 85.6434692
C 30.3374277 43.5219791 86.2588437
C 29.1051424 43.6238866 86.8452780
H 28.6444550 44.6060930 86.7995154
S 26.5114656 43.0332444 87.7821424
C 28.0557940 42.5877650 87.0792750
C 25.9764906 41.3711514 87.7813444
C 28.1114444 41.2134848 86.8713598
C 26.9523627 40.5322804 87.2623076
H 28.9805352 40.7295230 86.4444793
H 26.8266698 39.4615986 87.1706784
S 23.9568568 39.5509530 87.2655544
C 24.6420806 40.8717467 88.1791861
C 22.4560907 39.6397130 88.1695727
C 23.7445178 41.3425147 89.1269129
C 22.5256926 40.6534842 89.1195166
H 23.9674447 42.1589141 89.8009676
H 21.7023754 40.8769762 89.7858237
N 22.8727617 36.4567146 86.2629242
C 22.0151208 37.0052059 86.8114155
N 18.5761651 36.7452785 87.1665305
C 19.6445382 37.1630458 87.3089482
C 20.9614142 37.6845811 87.4894200
C 21.1535122 38.7831753 88.2825193
H 20.2573205 39.1962221 88.7356038
N 19.1184299 44.4606155 84.8200553
C 19.8203483 43.7586971 85.4132258
N 21.9330886 43.9144593 88.1577179
C 21.3729007 43.4590333 87.2549388
C 20.6843079 42.8896901 86.1411975
C 20.8756715 41.5716588 85.8265692
H 21.5634575 41.0315692 86.4702384
S 19.2379633 41.4329068 83.4498397
C 20.4513290 40.9071150 84.6025371
C 19.2139267 39.8633124 82.6852826
C 20.7913095 39.5782930 84.3709831
C 20.1021994 38.9935283 83.3016247
H 21.5250027 39.0574350 84.9727855
H 20.2449165 37.9687937 82.9852308
S 18.6109755 38.3455761 80.4189344
C 18.4701380 39.7438911 81.4550959
C 17.5286776 39.0538128 79.2338359
C 17.6279332 40.6957514 80.8982471
C 17.1039831 40.3083420 79.6589961
H 17.4016988 41.6397519 81.3759868
H 16.4286554 40.9179682 79.0724356
N 15.2367960 40.9679090 76.8556936
C 15.6011496 39.8748479 76.9541676
N 14.4666724 36.6838087 76.2123351
C 15.1748066 37.5118217 76.5985657
C 16.0545982 38.5292386 77.0776911
C 17.2620658 38.1820877 77.6202088
H 17.4738301 37.1174875 77.6491110
#! /usr/bin/env python
import soap
import soap.tools
import os
import numpy as np
from momo import osio, endl, flush
options = soap.Options()
options.excludeCenters(['H'])
options.excludeTargets([])
options.set('radialbasis.type', 'gaussian')
options.set('radialbasis.mode', 'adaptive')
options.set('radialbasis.N', 9)
options.set('radialbasis.sigma', 0.9)
options.set('radialbasis.integration_steps', 15)
options.set('radialcutoff.Rc', 6.8)
options.set('radialcutoff.Rc_width', 0.5)
options.set('radialcutoff.type', 'shifted-cosine')