13 #ifndef ESYS_LSMPARTICLEFITTER_H
14 #define ESYS_LSMPARTICLEFITTER_H
62 virtual std::string
getName()
const = 0;
64 void write(std::ostream &oStream)
const
75 std::stringstream sStream;
104 fitter.
write(oStream);
118 return "Mv to Surface";
128 const double centreDist = centreDiff.
norm();
129 if (centreDist > 0.0) {
130 const Vec3 newCentrePos =
133 (centreDiff/(centreDist))*(stationary.
getRad() + movable.
getRad());
134 moved.
moveTo(newCentrePos);
147 if (neighbours.size() > 0) {
149 (particle.
getPos() - neighbours[0]->getPos()).norm()
151 (particle.
getRad() + neighbours[0]->getRad())
159 }
else if (newParticle.
isValid()) {
189 if (particleVector.size() > 3) {
190 const bool foundFit =
192 particleVector[0]->getPos(),
193 particleVector[1]->getPos(),
194 particleVector[2]->getPos(),
195 particleVector[3]->getPos(),
196 particleVector[0]->getRad(),
197 particleVector[1]->getRad(),
198 particleVector[2]->getRad(),
199 particleVector[3]->getRad(),
207 throw std::runtime_error(
"findAFit: particleVector argument has fewer than 4 elements.");
209 return fittedParticle;
220 if(neighbours.size() > 3){
222 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
224 newParticle = particle;
230 const double dist_p = plane.sep(newParticle.
getPos());
231 const double dist_3 = (newParticle.
getPos()-neighbours[3]->getPos()).norm()-neighbours[3]->getRad();
232 if (dist_p > dist_3) {
233 newParticle =
findAFit(newParticle, neighbours);
243 }
else if (newParticle.
isValid()) {
273 if (particleVector.size() > 2) {
274 const bool foundFit =
276 particleVector[0]->getPos(),
277 particleVector[1]->getPos(),
278 particleVector[2]->getPos(),
279 particleVector[0]->getRad(),
280 particleVector[1]->getRad(),
281 particleVector[2]->getRad(),
289 throw std::runtime_error(
"findAFit: particleVector argument has fewer than 3 elements.");
291 return fittedParticle;
302 if(neighbours.size() > 2){
304 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
306 newParticle = particle;
312 const double dist_p = plane.sep(newParticle.
getPos());
313 const double dist_2 = (newParticle.
getPos()-neighbours[2]->getPos()).norm()-neighbours[2]->getRad();
314 if (dist_p > dist_2) {
315 newParticle =
findAFit(newParticle, neighbours);
325 }
else if (newParticle.
isValid()) {
354 const int id = particle.
getID();
356 if (particleVector.size() > 1) {
357 const bool foundFit =
359 particleVector[0]->getPos(),
360 particleVector[1]->getPos(),
363 particleVector[0]->getRad(),
364 particleVector[1]->getRad(),
372 throw std::runtime_error(
"findAFit: particleVector vector contains less than 2 particles.");
375 return fittedParticle;
386 if (neighbours.size() >= 2) {
388 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
393 (neighbours.size() == 2)
396 plane.sep(particle.
getPos())
398 (particle.
getPos()-neighbours[2]->getPos()).norm()-neighbours[2]->getRad()
402 newParticle = particle;
403 if (ndist < Pi.
getRad()) {
408 newParticle =
findAFit(newParticle, neighbours, plane);
414 }
else if (newParticle.
isValid()) {
443 const int id = particle.
getID();
445 if (particleVector.size() > 2) {
446 const bool foundFit =
448 particleVector[0]->getPos(),
449 particleVector[1]->getPos(),
450 particleVector[2]->getPos(),
453 particleVector[0]->getRad(),
454 particleVector[1]->getRad(),
455 particleVector[2]->getRad(),
463 throw std::runtime_error(
"findAFit: particleVector vector contains less than 3 particles.");
466 return fittedParticle;
477 if (neighbours.size() >= 3) {
479 const double ndist=(particle.
getPos()-Pi.
getPos()).norm();
484 (neighbours.size() == 3)
487 plane.sep(particle.
getPos())
489 (particle.
getPos()-neighbours[3]->getPos()).norm()-neighbours[3]->getRad()
493 newParticle = particle;
494 if (ndist < Pi.
getRad()) {
499 newParticle =
findAFit(newParticle, neighbours, plane);
505 }
else if (newParticle.
isValid()) {