From cd28c04710106e59f8a9003a28ac9aa3b869b3e5 Mon Sep 17 00:00:00 2001
From: "Joachim Wuttke (o)" <j.wuttke@fz-juelich.de>
Date: Tue, 14 Dec 2021 14:32:47 +0100
Subject: [PATCH] ff devtools moved to libformfactor

---
 devtools/math/ff/plot/plotff.py               | 138 ------
 devtools/math/ff/plot/plotpardep.py           | 172 --------
 devtools/math/ff/plot/plotpardeppyramid.py    | 179 --------
 .../math/ff/polyhedron/setup_dodecahedron.py  |  79 ----
 .../math/ff/polyhedron/setup_icosahedron.py   |  67 ---
 devtools/math/ff/test/Makefile                |  15 -
 devtools/math/ff/test/ff_diff.py              |  44 --
 devtools/math/ff/test/limit-run               |  26 --
 devtools/math/ff/test/runff.cpp               | 403 ------------------
 9 files changed, 1123 deletions(-)
 delete mode 100644 devtools/math/ff/plot/plotff.py
 delete mode 100644 devtools/math/ff/plot/plotpardep.py
 delete mode 100644 devtools/math/ff/plot/plotpardeppyramid.py
 delete mode 100755 devtools/math/ff/polyhedron/setup_dodecahedron.py
 delete mode 100755 devtools/math/ff/polyhedron/setup_icosahedron.py
 delete mode 100644 devtools/math/ff/test/Makefile
 delete mode 100755 devtools/math/ff/test/ff_diff.py
 delete mode 100644 devtools/math/ff/test/limit-run
 delete mode 100644 devtools/math/ff/test/runff.cpp

diff --git a/devtools/math/ff/plot/plotff.py b/devtools/math/ff/plot/plotff.py
deleted file mode 100644
index bb50b79f06f..00000000000
--- a/devtools/math/ff/plot/plotff.py
+++ /dev/null
@@ -1,138 +0,0 @@
-# script to plot the form factor
-# after the ROOT window with plots appear,
-# just save the picture in that format which you need
-
-import ROOT
-from libBornAgainCore import *
-
-# define a form factor, I recommend a 10--20 nm diameter
-#ff = FormFactorFullSphere(10.0*nanometer)
-#ff =  FormFactorSphere(10.0*nanometer, 13.0*nanometer)
-ff =  FormFactorPyramid(13*nanometer, 10.0*nanometer, 60*degree)
-
-
-# volume
-# I suggest, that the form factor evaluated for q=0 gives the volume
-# please correct if not
-zero = cvector_t(0,0,0)
-V = abs(ff.evaluate_for_q(zero))
-
-
-# number of bins for qx, qy, qz
-# I recommend to put at least 400 for a better picture quality
-nqy = 400
-nqz = 400
-nqx = 400
-
-# minimum and maximum values for qx, qy qz
-qymin = -2.0
-qymax = 2.0
-qzmin = -2.0
-qzmax = 2.0
-qxmin = -2.0
-qxmax = 2.0
-
-# first and last bin for the projection slice
-# if number of bins=400, then fbin should be set to 200 and lbin to 201
-#fbin=200
-#lbin=201
-
-# step for qx, qy, qz
-stepqy = (qymax - qymin)/(nqy-1)
-stepqz = (qzmax - qzmin)/(nqz-1)
-stepqx = (qxmax - qxmin)/(nqx-1)
-
-# define style of the diagram
-ROOT.gROOT.SetStyle("Plain")
-ROOT.gStyle.SetOptStat(0);
-ROOT.gStyle.SetOptTitle(0);
-ROOT.gStyle.SetLabelSize(0.06, "xyz");
-ROOT.gStyle.SetTitleSize(0.06, "xyz");
-#ROOT.gStyle.SetPadRightMargin(0.1)
-ROOT.gStyle.SetPadLeftMargin(0.18)
-ROOT.gStyle.SetPadBottomMargin(0.18)
-
-t = ROOT.TText()
-# create ROOT histograms
-hist = ROOT.TH2D("hist","Sphere:H=R",nqy,qymin,qymax, nqz, qzmin, qzmax)
-hist2 = ROOT.TH2D("hist2","Sphere:H=R",nqx,qxmin,qxmax, nqy, qymin, qymax)
-
-# and fill them with the values
-for i in range(nqy):
-    qy = qymin + i*stepqy
-    for j in range(nqz):
-        qz = qzmin + j*stepqz
-        k = cvector_t(0,qy,qz)
-        hist.Fill(qy,qz,(abs(ff.evaluate_for_q(k)))**2+1)
-
-for i in range(nqy):
-    qy = qymin + i*stepqy
-    for j in range(nqx):
-        qx = qxmin + j*stepqx
-        k = cvector_t(qx,qy,0)
-        hist2.Fill(qx,qy,(abs(ff.evaluate_for_q(k)))**2+1)
-
-
-# create a ROOT canvas and put all plots on it
-c = ROOT.TCanvas("FormfactorSphere","Formfactor Sphere", 1000,500)
-
-c.Divide(2,1)
-hist.SetMinimum(1)
-hist.SetMaximum(V**2)
-hist2.SetMinimum(1)
-hist2.SetMaximum(V**2)
-hist.SetContour(50)
-hist2.SetContour(50)
-#hist.GetZaxis().SetTitle(" |F|^{2} ")
-#hist2.GetZaxis().SetTitle(" |F|^{2} ")
-
-
-c.cd(1)
-ROOT.gPad.SetLogz()
-hist.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
-hist.GetXaxis().CenterTitle()
-hist.GetXaxis().SetTitleOffset(1.1)
-hist.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
-hist.GetYaxis().CenterTitle()
-hist.GetYaxis().SetTitleOffset(1.4)
-hist.GetZaxis().SetTitleOffset(1.3)
-hist.Draw("col")
-#t.SetNDC(1)
-#t.SetTextSize(8.0e-2)
-#t.DrawText(0.1, 0.01, "a")
-
-c.cd(2)
-ROOT.gPad.SetLogz()
-hist2.SetMinimum(1)
-hist2.GetXaxis().SetTitle(" q_{x} [nm^{-1}] ")
-hist2.GetXaxis().CenterTitle()
-hist2.GetXaxis().SetTitleOffset(1.1)
-hist2.GetYaxis().SetTitle(" q_{y} [nm^{-1}] ")
-hist2.GetYaxis().CenterTitle()
-hist2.GetYaxis().SetTitleOffset(1.4)
-hist2.GetZaxis().SetTitleOffset(1.3)
-hist2.Draw("col")
-#t.DrawText(0.1, 0.004, "b")
-
-#c.cd(3)
-#ROOT.gPad.SetLogy()
-#py = hist.ProjectionX("py", fbin, lbin, 'o')
-#py.GetYaxis().SetTitle(" |F|^{2} ")
-#py.GetYaxis().SetTitleOffset(1.3)
-#py.Draw()
-
-#t.DrawText(0.1, 0.01, "c")
-
-#c.cd(4)
-#ROOT.gPad.SetLogy()
-#px = hist2.ProjectionX("px", fbin, lbin, 'o')
-#px.GetYaxis().SetTitle(" |F|^{2} ")
-#px.GetYaxis().SetTitleOffset(1.3)
-#px.Draw()
-#t.DrawText(0.1, 0.004, "d")
-
-c.Update()
-ROOT.gApplication.Run()
-
-
-
diff --git a/devtools/math/ff/plot/plotpardep.py b/devtools/math/ff/plot/plotpardep.py
deleted file mode 100644
index 784864bda20..00000000000
--- a/devtools/math/ff/plot/plotpardep.py
+++ /dev/null
@@ -1,172 +0,0 @@
-# script to plot the form factor
-# after the ROOT window with plots appear,
-# just save the picture in that format which you need
-
-import ROOT
-from libBornAgainCore import *
-
-# define a form factor, I recommend a 10--20 nm diameter
-#ff = FormFactorFullSphere(10.0*nanometer)
-ff05 =  FormFactorSphere(10.0*nanometer, 5.0*nanometer)
-ff10 =  FormFactorSphere(10.0*nanometer, 10.0*nanometer)
-ff15 =  FormFactorSphere(10.0*nanometer, 15.0*nanometer)
-
-# zero q vector
-zero = cvector_t(0,0,0)
-# volume of particles
-V05 = abs(ff05.evaluate_for_q(zero))
-V10 = abs(ff10.evaluate_for_q(zero))
-V15 = abs(ff15.evaluate_for_q(zero))
-
-
-# number of bins for qx, qy, qz
-# I recommend to put at least 400 for a better picture quality
-nqy = 100
-nqz = 100
-nqx = 100
-
-# minimum and maximum values for qx, qy qz
-qymin = -2.0
-qymax = 2.0
-qzmin = -2.0
-qzmax = 2.0
-qxmin = -2.0
-qxmax = 2.0
-
-# first and last bin for the projection slice
-# if number of bins=400, then fbin should be set to 200 and lbin to 201
-#fbin=50
-#lbin=51
-
-# step for qx, qy, qz
-stepqy = (qymax - qymin)/(nqy-1)
-stepqz = (qzmax - qzmin)/(nqz-1)
-stepqx = (qxmax - qxmin)/(nqx-1)
-
-# define style of the diagram
-ROOT.gROOT.SetStyle("Plain")
-ROOT.gStyle.SetOptStat(0);
-ROOT.gStyle.SetOptTitle(1);
-ROOT.gStyle.SetLabelSize(0.06, "xyz");
-ROOT.gStyle.SetTitleSize(0.06, "xyz");
-ROOT.gStyle.SetTitleFontSize(0.1);
-#ROOT.gStyle.SetPadRightMargin(0.19)
-ROOT.gStyle.SetPadLeftMargin(0.18)
-ROOT.gStyle.SetPadBottomMargin(0.18)
-ROOT.gStyle.SetTitleX(0.3);
-#ROOT.gStyle.SetTitleW(0.5);
-
-
-#t = ROOT.TText()
-# create ROOT histograms 
-h05 = ROOT.TH2D("h05nm","H = 5 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
-h10 = ROOT.TH2D("h10nm","H = 10 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
-h15 = ROOT.TH2D("h15nm","H = 15 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
-
-# and fill them with the values
-for i in range(nqy):
-	qy = qymin + i*stepqy
-	for j in range(nqz):
-		qz = qzmin + j*stepqz
-		k = cvector_t(0,qy,qz)
-		h05.Fill(qy,qz,(abs(ff05.evaluate_for_q(k))/V05)**2)
-		h10.Fill(qy,qz,(abs(ff10.evaluate_for_q(k))/V10)**2)
-		h15.Fill(qy,qz,(abs(ff15.evaluate_for_q(k))/V15)**2)
-
-
-
-# create a ROOT canvas and put all plots on it
-c = ROOT.TCanvas("FormfactorSphere","Formfactor Sphere", 1200,400)
-
-c.Divide(3,1)
-h05.SetMinimum(5e-8)
-#h05.SetMaximum(V05**2)
-h05.SetMaximum(1)
-h10.SetMinimum(5e-8)
-#h10.SetMaximum(V10**2)
-h10.SetMaximum(1)
-h15.SetMinimum(5e-8)
-#h15.SetMaximum(V15**2)
-h15.SetMaximum(1)
-h05.SetContour(50)
-h10.SetContour(50)
-h15.SetContour(50)
-#h05.GetZaxis().SetTitle(" |F|^{2} ")
-#h10.GetZaxis().SetTitle(" |F|^{2} ")
-#h15.GetZaxis().SetTitle(" |F|^{2} ")
-
-
-c.cd(1)
-ROOT.gPad.SetLogz()
-h05.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
-h05.GetXaxis().CenterTitle()
-h05.GetXaxis().SetTitleOffset(1.1)
-h05.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
-h05.GetYaxis().CenterTitle()
-h05.GetYaxis().SetTitleOffset(1.4)
-h05.GetZaxis().SetTitleOffset(1.3)
-h05.Draw("col")
-#t.SetNDC(1)
-#t.SetTextSize(8.0e-2)
-#t.DrawText(0.1, 0.01, "H = 5 nm")
-
-c.cd(2)
-ROOT.gPad.SetLogz()
-h10.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
-h10.GetXaxis().CenterTitle()
-h10.GetXaxis().SetTitleOffset(1.1)
-h10.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
-h10.GetYaxis().CenterTitle()
-h10.GetYaxis().SetTitleOffset(1.4)
-h10.GetZaxis().SetTitleOffset(1.3)
-h10.Draw("col")
-#t.SetNDC(1)
-#t.SetTextSize(8.0e-2)
-#t.DrawText(0.1, 0.01, "H = 10 nm")
-
-c.cd(3)
-ROOT.gPad.SetLogz()
-h15.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
-h15.GetXaxis().CenterTitle()
-h15.GetXaxis().SetTitleOffset(1.1)
-h15.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
-h15.GetYaxis().CenterTitle()
-h15.GetYaxis().SetTitleOffset(1.4)
-h15.GetZaxis().SetTitleOffset(1.3)
-h15.Draw("col")
-#t.SetNDC(1)
-#t.SetTextSize(8.0e-2)
-#t.DrawText(0.1, 0.01, "H = 15 nm")
-
-# draw projections
-#c.cd(4)
-#ROOT.gPad.SetLogy()
-#p05 = h05.ProjectionX("p05", fbin, lbin, 'o')
-#p05.GetYaxis().SetTitle(" |F|^{2} ")
-#p05.GetYaxis().SetTitleOffset(1.3)
-#p05.Draw()
-#t.DrawText(0.1, 0.01, "d")
-
-#c.cd(5)
-#ROOT.gPad.SetLogy()
-#p10 = h10.ProjectionX("p10", fbin, lbin, 'o')
-#p10.GetYaxis().SetTitle(" |F|^{2} ")
-#p10.GetYaxis().SetTitleOffset(1.3)
-#p10.Draw()
-#t.DrawText(0.1, 0.01, "e")
-
-#c.cd(6)
-#ROOT.gPad.SetLogy()
-#p15 = h15.ProjectionX("p15", fbin, lbin, 'o')
-#p15.GetYaxis().SetTitle(" |F|^{2} ")
-#p15.GetYaxis().SetTitleOffset(1.3)
-#p15.Draw()
-#t.DrawText(0.1, 0.01, "f")
-
-
-
-c.Update()
-ROOT.gApplication.Run()
-
-
-
diff --git a/devtools/math/ff/plot/plotpardeppyramid.py b/devtools/math/ff/plot/plotpardeppyramid.py
deleted file mode 100644
index bcc91437e47..00000000000
--- a/devtools/math/ff/plot/plotpardeppyramid.py
+++ /dev/null
@@ -1,179 +0,0 @@
-# script to plot the form factor
-# after the ROOT window with plots appear,
-# just save the picture in that format which you need
-
-import ROOT
-from libBornAgainCore import *
-
-# define a form factor, I recommend a 10--20 nm diameter
-# vary H
-ff05 =  FormFactorPyramid(2.5*nanometer, 5.0*nanometer, 60*degree)
-ff10 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 60*degree)
-ff15 =  FormFactorPyramid(7.5*nanometer, 5.0*nanometer, 60*degree)
-# vary alpha
-#ff05 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 50*degree)
-#ff10 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 65*degree)
-#ff15 =  FormFactorPyramid(5.0*nanometer, 5.0*nanometer, 80*degree)
-
-# zero q vector
-zero = cvector_t(0,0,0)
-# volume of particles
-V05 = abs(ff05.evaluate_for_q(zero))
-V10 = abs(ff10.evaluate_for_q(zero))
-V15 = abs(ff15.evaluate_for_q(zero))
-
-
-# number of bins for qx, qy, qz
-# I recommend to put at least 400 for a better picture quality
-nqy = 400
-nqz = 400
-nqx = 400
-
-# minimum and maximum values for qx, qy qz
-qymin = -2.0
-qymax = 2.0
-qzmin = -2.0
-qzmax = 2.0
-qxmin = -2.0
-qxmax = 2.0
-
-# first and last bin for the projection slice
-# if number of bins=400, then fbin should be set to 200 and lbin to 201
-#fbin=50
-#lbin=51
-
-# step for qx, qy, qz
-stepqy = (qymax - qymin)/(nqy-1)
-stepqz = (qzmax - qzmin)/(nqz-1)
-stepqx = (qxmax - qxmin)/(nqx-1)
-
-# define style of the diagram
-ROOT.gROOT.SetStyle("Plain")
-ROOT.gStyle.SetOptStat(0);
-ROOT.gStyle.SetOptTitle(1);
-ROOT.gStyle.SetLabelSize(0.06, "xyz");
-ROOT.gStyle.SetTitleSize(0.06, "xyz");
-ROOT.gStyle.SetTitleFontSize(0.1);
-#ROOT.gStyle.SetPadRightMargin(0.19)
-ROOT.gStyle.SetPadLeftMargin(0.18)
-ROOT.gStyle.SetPadBottomMargin(0.18)
-ROOT.gStyle.SetTitleX(0.3);
-#ROOT.gStyle.SetTitleW(0.5);
-
-
-#t = ROOT.TText()
-# create ROOT histograms 
-h05 = ROOT.TH2D("h05nm","H = 2.5 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
-h10 = ROOT.TH2D("h10nm","H = 5.0 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
-h15 = ROOT.TH2D("h15nm","H = 7.5 nm",nqy,qymin,qymax, nqz, qzmin, qzmax)
-#h05 = ROOT.TH2D("a50"," #alpha = 50^{o} ",nqy,qymin,qymax, nqz, qzmin, qzmax)
-#h10 = ROOT.TH2D("a65"," #alpha = 65^{o} ",nqy,qymin,qymax, nqz, qzmin, qzmax)
-#h15 = ROOT.TH2D("a80"," #alpha = 80^{o} ",nqy,qymin,qymax, nqz, qzmin, qzmax)
-
-# and fill them with the values
-for i in range(nqy):
-	qy = qymin + i*stepqy
-	for j in range(nqz):
-		qz = qzmin + j*stepqz
-		k = cvector_t(0,qy,qz)
-		h05.Fill(qy,qz,(abs(ff05.evaluate_for_q(k))/V05)**2)
-		h10.Fill(qy,qz,(abs(ff10.evaluate_for_q(k))/V10)**2)
-		h15.Fill(qy,qz,(abs(ff15.evaluate_for_q(k))/V15)**2)
-
-
-
-# create a ROOT canvas and put all plots on it
-c = ROOT.TCanvas("FormfactorSphere","Formfactor Sphere", 1200,400)
-
-c.Divide(3,1)
-h05.SetMinimum(1e-7)
-#h05.SetMaximum(V05**2)
-h05.SetMaximum(1)
-h10.SetMinimum(1e-7)
-#h10.SetMaximum(V10**2)
-h10.SetMaximum(1)
-h15.SetMinimum(1e-7)
-#h15.SetMaximum(V15**2)
-h15.SetMaximum(1)
-h05.SetContour(50)
-h10.SetContour(50)
-h15.SetContour(50)
-#h05.GetZaxis().SetTitle(" |F|^{2} ")
-#h10.GetZaxis().SetTitle(" |F|^{2} ")
-#h15.GetZaxis().SetTitle(" |F|^{2} ")
-
-
-c.cd(1)
-ROOT.gPad.SetLogz()
-h05.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
-h05.GetXaxis().CenterTitle()
-h05.GetXaxis().SetTitleOffset(1.1)
-h05.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
-h05.GetYaxis().CenterTitle()
-h05.GetYaxis().SetTitleOffset(1.4)
-h05.GetZaxis().SetTitleOffset(1.3)
-h05.Draw("col")
-#t.SetNDC(1)
-#t.SetTextSize(8.0e-2)
-#t.DrawText(0.1, 0.01, "H = 5 nm")
-
-c.cd(2)
-ROOT.gPad.SetLogz()
-h10.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
-h10.GetXaxis().CenterTitle()
-h10.GetXaxis().SetTitleOffset(1.1)
-h10.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
-h10.GetYaxis().CenterTitle()
-h10.GetYaxis().SetTitleOffset(1.4)
-h10.GetZaxis().SetTitleOffset(1.3)
-h10.Draw("col")
-#t.SetNDC(1)
-#t.SetTextSize(8.0e-2)
-#t.DrawText(0.1, 0.01, "H = 10 nm")
-
-c.cd(3)
-ROOT.gPad.SetLogz()
-h15.GetXaxis().SetTitle(" q_{y} [nm^{-1}] ")
-h15.GetXaxis().CenterTitle()
-h15.GetXaxis().SetTitleOffset(1.1)
-h15.GetYaxis().SetTitle(" q_{z} [nm^{-1}] ")
-h15.GetYaxis().CenterTitle()
-h15.GetYaxis().SetTitleOffset(1.4)
-h15.GetZaxis().SetTitleOffset(1.3)
-h15.Draw("col")
-#t.SetNDC(1)
-#t.SetTextSize(8.0e-2)
-#t.DrawText(0.1, 0.01, "H = 15 nm")
-
-# draw projections
-#c.cd(4)
-#ROOT.gPad.SetLogy()
-#p05 = h05.ProjectionX("p05", fbin, lbin, 'o')
-#p05.GetYaxis().SetTitle(" |F|^{2} ")
-#p05.GetYaxis().SetTitleOffset(1.3)
-#p05.Draw()
-#t.DrawText(0.1, 0.01, "d")
-
-#c.cd(5)
-#ROOT.gPad.SetLogy()
-#p10 = h10.ProjectionX("p10", fbin, lbin, 'o')
-#p10.GetYaxis().SetTitle(" |F|^{2} ")
-#p10.GetYaxis().SetTitleOffset(1.3)
-#p10.Draw()
-#t.DrawText(0.1, 0.01, "e")
-
-#c.cd(6)
-#ROOT.gPad.SetLogy()
-#p15 = h15.ProjectionX("p15", fbin, lbin, 'o')
-#p15.GetYaxis().SetTitle(" |F|^{2} ")
-#p15.GetYaxis().SetTitleOffset(1.3)
-#p15.Draw()
-#t.DrawText(0.1, 0.01, "f")
-
-
-
-c.Update()
-ROOT.gApplication.Run()
-
-
-
diff --git a/devtools/math/ff/polyhedron/setup_dodecahedron.py b/devtools/math/ff/polyhedron/setup_dodecahedron.py
deleted file mode 100755
index ff5b2710bf5..00000000000
--- a/devtools/math/ff/polyhedron/setup_dodecahedron.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env python3
-
-# setup_dodecahedron.py:
-# Compute vertex coordinates of a regular dodecahedron.
-# Auxiliary program, used during implementation of dodecahedron form factor in BornAgain.
-# Joachim Wuttke, Forschungszentrum Jülich, 2016
-
-from math import sqrt,sin,cos,pi
-
-def distance(s,t):
-    return sqrt((s[0]-t[0])**2+(s[1]-t[1])**2+(s[2]-t[2])**2)
-
-q=sqrt(5)
-# v=pi/5
-# vv=2*v
-c=(1+q)/4 # cos(v)
-s=sqrt((5-q)/8) # sin(v)
-cc=(q-1)/4 # cos(vv)
-ss=sqrt((5+q)/8) # sin(vv)
-
-def plane_rotate(k):
-    t=p[k]
-    ci = cc
-    si = ss
-    x = ci*t[0]-si*t[1]
-    y = si*t[0]+ci*t[1]
-    p[k+1] = [x, y,t[2]]
-    p[k+4] = [x,-y,t[2]]
-    ci = -c
-    si = s
-    x = ci*t[0]-si*t[1]
-    y = si*t[0]+ci*t[1]
-    p[k+2] = [x, y,t[2]]
-    p[k+3] = [x,-y,t[2]]
-
-
-# a=pow((7*q-15)/5, 1/3.) # edge for V=1
-a=1.
-
-rb=a/(2*s)
-rd=a*c/s
-R2a=(9+3*q)/8
-b=a*sqrt(R2a-1/(4*s**2))
-d=a*sqrt(R2a-(c/s)**2)
-
-h=rb*c
-vol = 12 * 5 * h*a*b/6
-print("a=%g, R/a=%g, rb/a=%g, rd/a=%g, b/a=%g, d/a=%g" % (a, sqrt(R2a), rb/a, rd/a, b/a, d/a))
-print("h=%g volume=%20.16g" % (h, vol) )
-
-p=[None for i in range(20)]
-p[ 0] = [+rb,0.,-b]
-p[ 5] = [+rd,0.,-d]
-p[10] = [-rd,0.,+d]
-p[15] = [-rb,0.,+b]
-for m in range(4):
-    plane_rotate(m*5)
-
-for i in range(len(p)):
-    print("        {%20.16g*a,%20.16g*a,%20.16g*a}," % (p[i][0], p[i][1], p[i][2]))
-
-for i in range(20):
-    print("p%2i(%20.16g,%20.16g,%20.16g) at R=%20.16g" %
-          (i, p[i][0], p[i][1], p[i][2], distance(p[i],[0,0,0])))
-
-distcoll = {}
-for i in range(20):
-    for j in range(i+1,20):
-        dist = distance(p[i],p[j])
-        print("p%2i(%9.4g,%9.4g,%9.4g) - p%2i(%9.4g,%9.4g,%9.4g) = %20.17g" %
-              (i, p[i][0], p[i][1], p[i][2], j, p[j][0], p[j][1], p[j][2], dist))
-        dist=round(dist*1e14)/10**14
-        if not dist in distcoll:
-            distcoll[dist] = 1
-        else:
-            distcoll[dist] += 1
-
-for dist in sorted(distcoll.keys()):
-    print( "%2i times %20.16g" % (distcoll[dist],dist) )
diff --git a/devtools/math/ff/polyhedron/setup_icosahedron.py b/devtools/math/ff/polyhedron/setup_icosahedron.py
deleted file mode 100755
index 77c552279be..00000000000
--- a/devtools/math/ff/polyhedron/setup_icosahedron.py
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env python3
-
-# setup_icosahedron.py:
-# Compute vertex coordinates of a regular icosahedron.
-# Auxiliary program, used during implementation of icosahedron form factor in BornAgain.
-# Joachim Wuttke, Forschungszentrum Jülich, 2016
-
-from math import sqrt,sin,cos,pi
-
-def distance(s,t):
-    return sqrt((s[0]-t[0])**2+(s[1]-t[1])**2+(s[2]-t[2])**2)
-
-c=sqrt(3)/2
-q=sqrt(5)
-ss=c
-cc=.5
-
-# a=pow(3*(3-q)/5, 1/3.) # edge for V=1
-a=1.
-
-R2=(5+q)/8*a**2
-rb=a/sqrt(3)
-b=a*sqrt((7+3*q)/24) # sqrt(R2-rb**2)
-rd2=a**2*(3+q)/6 # (4*R2-a**2)/2/(1+cc)
-rd=sqrt(rd2)
-d=a*sqrt((3-q)/24) #sqrt(R2-rd2)
-
-h=rb+sqrt(rb**2-(0.5*a)**2)
-vol = 20 * h*a*b/6
-print("a=%g, R=%g, rb=%g, rd=%g, b=%g, d=%g" % (a, sqrt(R2), rb, rd, b, d))
-print("check P14=%g" % (sqrt( (rd*cc-rb)**2 + (rd*ss)**2 + (d-b)**2 )))
-print("h=%g volume=%20.16g" % (h, vol) )
-
-p=[None for i in range(12)]
-p[ 0] = [ rb,          0,            -b]
-p[ 1] = [-rb*cos(pi/3),+rb*sin(pi/3),-b]
-p[ 2] = [-rb*cos(pi/3),-rb*sin(pi/3),-b]
-p[ 3] = [-rd,          0,            -d]
-p[ 4] = [ rd*cos(pi/3),+rd*sin(pi/3),-d]
-p[ 5] = [ rd*cos(pi/3),-rd*sin(pi/3),-d]
-p[ 6] = [ rd,          0,            +d]
-p[ 7] = [-rd*cos(pi/3),+rd*sin(pi/3),+d]
-p[ 8] = [-rd*cos(pi/3),-rd*sin(pi/3),+d]
-p[ 9] = [-rb,          0,            +b]
-p[10] = [ rb*cos(pi/3),+rb*sin(pi/3),+b]
-p[11] = [ rb*cos(pi/3),-rb*sin(pi/3),+b]
-
-for i in range(len(p)):
-    print("        {%20.16g*a,%20.16g*a,%20.16g*a}," % (p[i][0], p[i][1], p[i][2]))
-
-for i in range(len(p)):
-    print("p%2i(%20.16g,%20.16g,%20.16g) at R=%20.16g" %
-          (i, p[i][0], p[i][1], p[i][2], distance(p[i],[0,0,0])))
-
-distcoll = {}
-for i in range(len(p)):
-    for j in range(i+1,len(p)):
-        dist = distance(p[i],p[j])
-        print("p%2i-%2i = %20.17g" % (i, j, dist))
-        dist=round(dist*1e15)/10**15
-        if not dist in distcoll:
-            distcoll[dist] = 1
-        else:
-            distcoll[dist] += 1
-
-for dist in sorted(distcoll.keys()):
-    print( "%2i times %20.16g" % (distcoll[dist],dist) )
diff --git a/devtools/math/ff/test/Makefile b/devtools/math/ff/test/Makefile
deleted file mode 100644
index 16b5785ea9e..00000000000
--- a/devtools/math/ff/test/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-CC = g++ -ggdb -O3 -std=c++11 -Wall -I/G/ba/Core/FormFactors/ -I/G/ba/Core/Geometry -I/G/ba/Core/Tools -I/G/ba/Core/Samples -I/usr/include/eigen3
-
-# LIBS=           -lm -lgslcblas -lgsl -lyaml-cpp
-
-BIND = ./
-
-all: $(BIND)runff
-
-# source from BornAgain overwrites -lBornAgainCore, cf http://stackoverflow.com/questions/36667429
-SRC = runff.cpp /G/ba/Core/FormFactors/FormFactorPolyhedron.cpp
-
-DIAG = -D POLYHEDRAL_DIAGNOSTIC=ON
-
-$(BIND)runff: $(SRC)
-	$(CC) $(DIAG) -L../../../build/lib/ -l:_libBornAgainCore.so -o $(BIND)runff $(SRC)
diff --git a/devtools/math/ff/test/ff_diff.py b/devtools/math/ff/test/ff_diff.py
deleted file mode 100755
index 72bd9d4da73..00000000000
--- a/devtools/math/ff/test/ff_diff.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python3
-
-import re, sys
-from math import sqrt
-
-def read_file( fn ):
-    fd = open( fn, 'r' )
-    ti = fd.read().rstrip()
-    fd.close
-    ti = re.sub( r'^\s*#.*\n', '', ti, re.M )
-    return ti.split("\n")
-
-## Main
-
-maxdiff = 0
-fpair = sys.argv[1:3]
-tpair = [ read_file( fn ) for fn in fpair ]
-if len(tpair[0])!=len(tpair[1]):
-    raise Exception( "tables differ in size" )
-for i in range(len(tpair[0])):
-    dpair = [ re.split(r'\s+', t[i]) for t in tpair]
-    if len(dpair[0])!=len(dpair[1]):
-        raise Exception( "lines %i differ in size" % i )
-    for j in range(5):
-        if dpair[0][j]!=dpair[1][j]:
-            raise Exception( "lines %i differ in parameter %i" % (i,j) )
-    xypair = [ [ float(d[8]), float(d[9]) ] for d in dpair ]
-    out_of_range = False
-    for x,y in xypair:
-        if abs(x)>1e166 or abs(y)>1e166:
-            out_of_range = True
-            break
-    if out_of_range:
-        print( tpair[0][i] )
-        print( tpair[1][i] )
-        print( "result too large" )
-        continue
-    apair = [ sqrt(x**2+y**2) for x,y in xypair ]
-    aval = (apair[0] + apair[1])/2
-    diff = max( abs(xypair[0][0]-xypair[1][0]), abs(xypair[0][1]-xypair[1][1]) ) / aval
-    maxdiff = max( maxdiff, diff )
-    if diff>3.e-12:
-        print( " ".join(dpair[0]+dpair[1][8:]+["%g" % diff]) )
-print( "# maxdiff = %g" % maxdiff )
diff --git a/devtools/math/ff/test/limit-run b/devtools/math/ff/test/limit-run
deleted file mode 100644
index ce9f0cc5a9d..00000000000
--- a/devtools/math/ff/test/limit-run
+++ /dev/null
@@ -1,26 +0,0 @@
-# no q expansion, hence sum over faces, then no expansion in qpa
-runff 2 7 4 1e-99  1e-99 0 > x0
-
-# no q expansion, hence sum over faces, then expand in qpa
-runff 2 7 4 1e-99  1e99   2 > a1
-runff 2 7 4 1e-99  1e99   4 > a2
-runff 2 7 4 1e-99  1e99   6 > a3
-runff 2 7 4 1e-99  1e99   8 > a4
-runff 2 7 4 1e-99  1e99  10 > a5
-runff 2 7 4 1e-99  1e99  12 > a6
-runff 2 7 4 1e-99  1e99  14 > a7
-runff 2 7 4 1e-99  1e99  16 > a8
-runff 2 7 4 1e-99  1e99  18 > a9
-runff 2 7 4 1e-99  1e99  20 > as
-
-# q expansion (no need for qpa expansion)
-runff 2 7 4 1e99   1e-99  2 > h1
-runff 2 7 4 1e99   1e-99  4 > h2
-runff 2 7 4 1e99   1e-99  6 > h3
-runff 2 7 4 1e99   1e-99  8 > h4
-runff 2 7 4 1e99   1e-99 10 > h5
-runff 2 7 4 1e99   1e-99 12 > h6
-runff 2 7 4 1e99   1e-99 14 > h7
-runff 2 7 4 1e99   1e-99 16 > h8
-runff 2 7 4 1e99   1e-99 18 > h9
-runff 2 7 4 1e99   1e-99 20 > hs
diff --git a/devtools/math/ff/test/runff.cpp b/devtools/math/ff/test/runff.cpp
deleted file mode 100644
index 03a0ac8a620..00000000000
--- a/devtools/math/ff/test/runff.cpp
+++ /dev/null
@@ -1,403 +0,0 @@
-// Form factor computation: test program
-// JWu 2016
-
-// Reference:
-//   Joachim Wuttke
-//   "Form factor (Fourier shape transform) of polygon and polyhedron."
-
-// To use these tests, FormFactorPolyhedron.cpp must be compiled
-// with flag -D POLYHEDRAL_DIAGNOSTIC=ON
-
-#include <cassert>
-#include <iostream>
-#include <iomanip>
-#include <complex>
-#include <vector>
-
-#include "ParticleShapes.h"
-#include "FormFactorTriangle.h"
-
-using std::cout;
-using std::cerr;
-using std::vector;
-
-static complex_t I(0.,1.);
-static double eps(2e-16);
-
-Diagnosis diagnosis;
-
-int nshape = 13;
-
-extern int n_limit;
-extern double q_limit_series;
-extern double qpa_limit_series;
-
-//! Returns a pointer to a particle, according to given code
-
-IFormFactorBorn* make_particle( int ishape )
-{
-    if       ( ishape==1 ) {
-        return new FormFactorDodecahedron(3.);
-    } else if( ishape==2 ) {
-        return new FormFactorIcosahedron(15.);
-    } else if( ishape==3 ) { // true tetrahedron
-        double alpha = 72 * Units::degree;
-        return new FormFactorTetrahedron(1., tan(alpha)/2/sqrt(3), alpha);
-    } else if( ishape==4 ) { // tetrahedral frustum
-        double alpha = 72 * Units::degree;
-        return new FormFactorTetrahedron(1., 0.5*tan(alpha)/2/sqrt(3), alpha);
-    } else if( ishape==5 ) { // tetrahedral frustum, flat one
-        double alpha = 80 * Units::degree;
-        return new FormFactorTetrahedron(1., 0.1*tan(alpha)/2/sqrt(3), alpha);
-    } else if( ishape==6 ) { // tetrahedral frustum as in BasicTest
-        return new FormFactorTetrahedron(16., 4., .8);
-    } else if( ishape==7 ) {
-        double alpha = 72 * Units::degree;
-        return new FormFactorCone6(10., 10., alpha);
-    } else if( ishape==8 ) {
-        return new FormFactorPyramid(1.5, .24, 1.);
-    } else if( ishape==9 ) {
-        return new FormFactorAnisoPyramid(2, .4, .24, 1.);
-    } else if( ishape==10) {
-        return new FormFactorPrism3(1.2, 1.);
-    } else if( ishape==11) {
-        return new FormFactorPrism6(1., 1.);
-    } else if( ishape==12) {
-        return new FormFactorTruncatedCube(4., 1.);
-    } else if( ishape==13 ) {
-        double alpha = 73 * Units::degree;
-        return new FormFactorCuboctahedron(1., 1., .8, alpha);
-    } else if( ishape==90 ) {
-        return new FormFactorTriangle(1.);
-    } else
-        throw "Shape not implemented";
-}
-
-//! Print q in a form that can be easily pasted to the command line for further investigation
-
-std::string nice_q( cvector_t q )
-{
-    std::ostringstream ret;
-    double qmax = 0;
-    ret << std::setprecision(16);
-    for( int i=0; i<3; ++i )
-        qmax = std::max( qmax, q[i].real() );
-    for( int i=0; i<3; ++i )
-        ret << q[i].real()/qmax << " " << q[i].imag()/qmax << " ";
-    ret << qmax;
-    return ret.str();
-}
-
-//! Bisect between two q's to find possible discontinuities
-
-void bisect(
-    const IFormFactorBorn* polyh, int ishape, double q0mag,
-    cvector_t qi, complex_t ri, const Diagnosis di,
-    cvector_t qf, complex_t rf, const Diagnosis df,
-    double& maxrelstep )
-{
-    assert( di!=df );
-    if( (qi-qf).mag()<4*eps*q0mag ) {
-        // narrowed down to minimal step, now check for continuity
-        double aval = (std::abs(ri) + std::abs(rf))/2;
-        double step = std::abs(ri-rf);
-        double relstep = step/aval;
-        if( relstep>maxrelstep){
-            cout<<"ishape="<<ishape<<": relstep "<<std::setprecision(8)<<relstep<<"="<<step<<"/"<<std::setprecision(16)<<aval<<" for "<<di<<"->"<<df<<" at q between "<<nice_q(qi)<<" and "<<nice_q(qf)<<"\n";
-            maxrelstep = relstep;
-        }
-        return;
-    }
-    cvector_t q2 = (qi + qf)/2.;
-    complex_t r2 = polyh->evaluate_for_q(q2);
-    Diagnosis d2 = diagnosis;
-    if( d2!=di )
-        bisect( polyh, ishape, q0mag, qi, ri, di, q2, r2, d2, maxrelstep );
-    if( d2!=df )
-        bisect( polyh, ishape, q0mag, q2, r2, d2, qf, rf, df, maxrelstep );
-}
-
-//! Computes form factor, and prints result according to outfilter.
-
-void run( const IFormFactorBorn* polyh, int ishape, cvector_t q, int outfilter )
-{
-    complex_t ret = polyh->evaluate_for_q(q);
-    cout<<std::scientific<<std::setprecision(16)<<std::setfill('0');
-    if     ( outfilter==0 )
-        cout<<q.mag()<<" "<<std::abs(ret)<<" "<<ret.real()<<" "<<ret.imag()<<" "<<
-            diagnosis.nExpandedFaces<<std::noshowpos<<" "<<diagnosis.maxOrder;
-    else if( outfilter==1 )
-        cout<<ret.real();
-    else if( outfilter==2 )
-        cout<<ret.imag();
-    cout<<"\n";
-}
-
-//! Compute a form factor with modified control parameter settings
-
-complex_t ff_modified( cvector_t q, const IFormFactorBorn* polyh, bool expand_qpa, bool expand_q )
-{
-    PolyhedralFace::setLimits( expand_qpa ? 1e99 : 1e-99, 80 );
-    FormFactorPolyhedron::setLimits( expand_q ? 1e99 : 1e-99, 80 );
-    return polyh->evaluate_for_q( q );
-}
-
-void test_matching( int ishape, const vector<vector<cvector_t>>& scans )
-{
-    cout<<ishape<<"\n";
-    cerr<<"shape "<<ishape<<" ...\n";
-    IFormFactorBorn* polyh( make_particle( ishape ) );
-    int n_mag = 25;
-    double mag_i = 1e-3;
-    double mag_f = 1e1;
-    for( int i=1; i<n_mag; ++i ) {
-        double mag = mag_i*pow(mag_f/mag_i,i/(n_mag-1.));
-        double res = 0;
-        for( const vector<cvector_t>& q_scan: scans ) {
-            assert( q_scan.size()== 1 );
-            cvector_t uq = q_scan[0];
-            const cvector_t q = mag * uq;
-            complex_t ff[2];
-
-            ff[0] = ff_modified( q, polyh, false, false );
-            ff[1] = ff_modified( q, polyh, true, false );
-
-            double dev = std::abs(ff[0]-ff[1])*2/(std::abs(ff[0])+std::abs(ff[1]));
-            res = std::max(res, dev );
-            if( 0 && dev>.1 )
-                cerr<<ishape<<" "<<mag<<" "<<std::setprecision(16)<<
-                    dev<<" "<<ff[0]<<" "<<ff[1]<<" @ "<<q<<"\n";
-        }
-        cout<<" "<<mag*polyh->getRadius()<<" "<<std::setprecision(8)<<res<<"\n";
-    }
-    cout<<"\n";
-}
-
-double test_continuity( int ishape, const vector<vector<cvector_t>>& scans )
-{
-    IFormFactorBorn* polyh( make_particle( ishape ) );
-    double maxrelstep = 0;
-    for( size_t j=0; j<scans.size(); ++j ) {
-        if( !(j%100) )
-            fprintf( stderr, "%2i: %8li/%li\r", ishape, j, scans.size() );
-        const vector<cvector_t>& q_scan = scans[j];
-        for( size_t i=1; i<q_scan.size(); ++i ) {
-            complex_t last_ret = polyh->evaluate_for_q(q_scan[i-1]);
-            Diagnosis last_diag = diagnosis;
-            complex_t ret = polyh->evaluate_for_q(q_scan[i]);
-            Diagnosis diag = diagnosis;
-            if( diag!=last_diag )
-                bisect( polyh, ishape, q_scan[i].mag(),
-                        q_scan[i-1], last_ret, last_diag,
-                        q_scan[i], ret, diag,
-                        maxrelstep );
-        }
-    }
-    fprintf( stderr, "\n" );
-    cout<<"shape "<<ishape<<" => max rel step = "<<maxrelstep<<"\n";
-    return maxrelstep;
-}
-
-void loop_one_shape( int ishape, const vector<vector<cvector_t>>& scans )
-{
-    IFormFactorBorn* polyh( make_particle( ishape ) );
-    for( size_t j=0; j<scans.size(); ++j ) {
-        if( !(j%100) )
-            fprintf( stderr, "%2i: %8li/%li\r", ishape, j, scans.size() );
-        const vector<cvector_t>& q_scan = scans[j];
-        for( const cvector_t q: q_scan ) {
-            complex_t ret = polyh->evaluate_for_q(q);
-            cout <<
-                ishape<<" " <<
-                std::setprecision(16) <<
-                q[0].real()<<" "<<q[0].imag()<<" " <<
-                q[1].real()<<" "<<q[1].imag()<<" " <<
-                q[2].real()<<" "<<q[2].imag()<<" " <<
-                std::setprecision(17) <<
-                q.mag()<<" " <<
-                ret.real()<<" "<<ret.imag()<<" "<<std::abs(ret)<<" " <<
-                diagnosis.nExpandedFaces<<" "<<diagnosis.maxOrder<<"\n";
-        }
-    }
-}
-
-vector<vector<cvector_t>> create_scans( int mode )
-{
-    static int n_dir = 7;
-    cvector_t dir[n_dir] = {
-        { 1., 0., 0. },
-        { 0., 1., 0. },
-        { 0., 0., 1. },
-
-        { 0., 1., 1. },
-        { 1., 0., 1. },
-        { 1., 1., 0. },
-
-        { 1., 1., 1. }
-    };
-
-    static int n_absdir = 8; // absorption component
-    cvector_t absdir[n_absdir] = {
-        { 0., 0., 0. },
-        { 1e-15*I, 0., 0. },
-        { 0., 1e-10*I, 0. },
-        { 0., 0., 1e-5*I },
-        { .1*I, 0., 0. },
-        { 0., .1*I, 0. },
-        { 0., 0., .1*I },
-        { .1*I, .1*I, .1*I }
-    };
-
-    vector<double> mag;
-    if ( mode==0 ) {
-        mag.resize(1);
-        mag[0] = 1;
-    } else if ( mode==1 ) {
-        mag = vector<double>( { 0, 1e-12, 1e-10, 1e-8, 1e-7, 1e-6, 1e-5, 1e-4, 1e-3,
-                    .01, .06, .2, .5, 1, 2, 5, 10, 20, 50, 100 } );
-    } else if (mode==2 ) {
-        mag.resize(1001);
-        mag[0] = 0.;
-        for( size_t i=1; i<mag.size(); ++i )
-            mag[i] = 1e-10*pow(1e13,(i-1.)/(mag.size()-2));
-    }
-
-    static const int n_difmag = 17;
-    static double difmag[n_difmag] =
-        { 0., 3e-16, 1e-15, 3e-15, 1e-14, 1e-13, 1e-12, 1e-11, 1e-9, 1e-7,
-          1e-5, 1e-3, .01, .03, .1, .2, .3 };
-
-    vector<vector<cvector_t>> scans;
-    for( int i=0; i<n_dir; ++i ) {
-        for( int j=0; j<n_dir; ++j ) {
-            if( i==j )
-                continue;
-            for( int k=0; k<n_difmag; ++k ) {
-                for( int l=0; l<n_absdir; ++l ) {
-                    cvector_t uq = ( dir[i].unit() + difmag[k]*dir[j] + absdir[l] ).unit();
-                    vector<cvector_t> scan;
-                    for( size_t m=0; m<mag.size(); ++m )
-                        scan.push_back( mag[m] * uq );
-                    scans.push_back( scan );
-                }
-            }
-        }
-    }
-    return scans;
-}
-
-void help_and_exit()
-{
-    cerr<<"fftest limits inmode debmsg outfilter shape qxr qxi qyr qyi qzr qzi [q]\n";
-    cerr<<"  limits:    \"def\" | qlim qpalim nlim\n";
-    cerr<<"  inmode:    get q from 0:stdin | 1:cmdline | 2:loop\n";
-    cerr<<"  debmsg:    0..6 (only if inmode=1)\n";
-    cerr<<"  outfilter: return 0:all | 1:real | 2:imag\n";
-    cerr<<"fftest limits loop shape\n";
-    cerr<<"  limits:    \"def\" | qlim qpalim nlim\n";
-    cerr<<"  loop:      3[cont_test] | 4[matching_test] | 5[for_plot]\n";
-    cerr<<"  shape:     0[all] | 1..[specific]\n";
-    exit(0);
-}
-
-#define NEXTARG if( (++arg)-argv >= argc ) help_and_exit()
-#define MULTIARG(n) if( (arg+=n)-argv >= argc ) help_and_exit()
-
-int main (int argc, const char *argv[])
-{
-    try {
-        diagnosis.debmsg = 0;
-        diagnosis.request_convergence = false;
-        const char** arg = argv;
-        NEXTARG;
-        if ( !strncmp( *arg, "def", 3 ) ) {
-            // do nothing
-        } else {
-            double q_limit = atof( *arg );
-            NEXTARG;
-            double qpa_limit = atof( *arg );
-            NEXTARG;
-            int n_limit = atoi( *arg );
-            FormFactorPolyhedron::setLimits( q_limit, n_limit );
-            PolyhedralFace::setLimits( qpa_limit, n_limit );
-        }
-        NEXTARG;
-        int inmode = atoi( *arg );
-        if( inmode==1 ) {
-            NEXTARG;
-            diagnosis.debmsg = atoi( *arg );
-        }
-        if( inmode<=2 ) {
-            NEXTARG;
-            int outfilter = atoi( *arg );
-            NEXTARG;
-            int ishape = atoi( *arg );
-            IFormFactorBorn* P( make_particle( ishape ) );
-            MULTIARG(6);
-            cvector_t uq(
-                complex_t( atof(*(arg-5)), atof(*(arg-4)) ),
-                complex_t( atof(*(arg-3)), atof(*(arg-2)) ),
-                complex_t( atof(*(arg-1)), atof(*(arg-0)) ) );
-            double mag;
-            if( inmode==0 ) {
-                // for use through Frida
-                int nop;
-                std::cin >> nop;
-                while( std::cin >> mag )
-                    run( P, ishape, mag*uq, outfilter );
-            } else if( inmode==1 ) {
-                NEXTARG;
-                mag = atof( *arg );
-                run( P, ishape, mag*uq, outfilter );
-            } else if( inmode==2 ) {
-                int n_mag = 2001;
-                double mag_i = 1e-20;
-                double mag_f = 1e4;
-                for( int i=1; i<n_mag; ++i ) {
-                    //mag = 180.*i/(n_mag-1);
-                    mag = mag_i*pow(mag_f/mag_i,i/(n_mag-1.));
-                    run( P, ishape, mag*uq, outfilter );
-                }
-            }
-            exit(0);
-        }
-        // it's some loop
-        NEXTARG;
-        int ishapepar = atoi( *arg );
-
-        if( inmode==3 ) { // continuity test
-            diagnosis.request_convergence = true;
-            vector<vector<cvector_t>> scans = create_scans( 1 );
-            double totmaxrelstep = 0;
-            if( ishapepar==0 ) {
-                for( int ishape=1; ishape<=nshape; ++ishape )
-                    totmaxrelstep = std::max( totmaxrelstep, test_continuity( ishape, scans ) );
-                cout<<"grand total max rel step = "<<totmaxrelstep<<"\n";
-            } else {
-                test_continuity( ishapepar, scans );
-            }
-            exit (0);
-        }
-        if( inmode==4 ) { // compare computation methods
-            vector<vector<cvector_t>> scans = create_scans( 0 );
-            if( ishapepar==0 ) {
-                for( int ishape=1; ishape<=nshape; ++ishape )
-                    test_matching( ishape, scans );
-            } else
-                test_matching( ishapepar, scans );
-            exit (0);
-        }
-        // it's a straight loop over q
-        vector<vector<cvector_t>> scans = create_scans( 2 );
-        if( ishapepar==0 ) {
-            for( int ishape=1; ishape<=nshape; ++ishape )
-                loop_one_shape( ishape, scans );
-        } else
-            loop_one_shape( ishapepar, scans );
-        exit(0);
-
-    } catch( const char* ex ) {
-        cerr<<"F(q) failed: "<<ex<<"\n";
-        exit(0);
-    }
-}
-- 
GitLab