diff --git a/Resample/Processed/Slicer.cpp b/Resample/Processed/Slicer.cpp index d5cf65a21e356dcdd1fb517e54de429227ddd032..2ce4993b1602b9c1b00920c29566cf98d1a2e21c 100644 --- a/Resample/Processed/Slicer.cpp +++ b/Resample/Processed/Slicer.cpp @@ -75,8 +75,8 @@ IFormFactor* doSlice(const IFormFactor* ff, double dz_bottom, double dz_top) f->height() - dz_bottom - dz_top); } if (const auto* f = dynamic_cast<const HorizontalCylinder*>(ff)) { - return new HorizontalCylinder(f->radius(), f->length(), -f->radius() + dz_bottom, - f->radius() - dz_top); + return new HorizontalCylinder(f->radius(), f->length(), f->slice_bottom() + dz_bottom, + f->slice_top() - dz_top); } if (const auto* f = dynamic_cast<const Sphere*>(ff)) { return new TruncatedSphere(f->radius(), f->height() - dz_bottom, dz_top); diff --git a/Sample/HardParticle/HorizontalCylinder.cpp b/Sample/HardParticle/HorizontalCylinder.cpp index e32bd325dc9cd745f29065704fee75260352c017..84336e78ac390f9ab4ba6b0b97f4ff21fddb9f50 100644 --- a/Sample/HardParticle/HorizontalCylinder.cpp +++ b/Sample/HardParticle/HorizontalCylinder.cpp @@ -57,14 +57,14 @@ complex_t HorizontalCylinder::formfactor(C3 q) const radial_part = M_TWOPI * R * R * Math::Bessel::J1c(qR) * exp_I(q.z() * R); else - radial_part = - 2. - * ComplexIntegrator().integrate( - [=](double z) { - double y = sqrt(R * R - z * z); - return y * Math::sinc(q.y() * y) * exp_I(q.z() * (z - m_slice_bottom)); - }, - m_slice_bottom, m_slice_top); + // integration variable substituted as z = R * sin(t) + radial_part = 2. * pow(R, 2) * exp_I(q.z() * (-m_slice_bottom)) + * ComplexIntegrator().integrate( + [=](double t) { + return pow(cos(t), 2) * Math::sinc(q.y() * R * cos(t)) + * exp_I(q.z() * R * sin(t)); + }, + asin(m_slice_bottom / R), asin(m_slice_top / R)); return radial_part * axial_part; } diff --git a/Tests/Py/Functional/auto_slicing.py b/Tests/Py/Functional/auto_slicing.py index e1e5380be0d6f536e6750c8cb7eae0f18717f44f..beddf2299400965b4e2adb6bc6277d765c2cfbe2 100644 --- a/Tests/Py/Functional/auto_slicing.py +++ b/Tests/Py/Functional/auto_slicing.py @@ -41,20 +41,20 @@ def get_sample(particle, sliced): class SlicedSpheresTest(unittest.TestCase): - def runPlainFF(self, ff): + def runPlainFF(self, ff, eps = 1e-14): particle = ba.Particle(matParticle, ff) diff = infrastruct.diff_MiniGISAS(get_sample(particle, False), get_sample(particle, True)) - self.assertLess(diff, 1e-9) + self.assertLess(diff, eps) def testSlicingPlainFF(self): self.runPlainFF(ba.Cone(8., 9., 80*ba.deg)) self.runPlainFF(ba.Cylinder(3., 9.)) self.runPlainFF(ba.EllipsoidalCylinder(3., 4., 9.)) # self.runPlainFF(ba.HemiEllipsoid(7., 8., 9.)) # yet unsupported - self.runPlainFF(ba.HorizontalCylinder(5., 19.)) # TODO restore tol=1e-13 - #self.runPlainFF(ba.HorizontalCylinder(5., 19., -4., 4.)) TODO wrong! - #self.runPlainFF(ba.HorizontalCylinder(6., 19., -3., 3.)) + self.runPlainFF(ba.HorizontalCylinder(5., 19.), 5e-12) + self.runPlainFF(ba.HorizontalCylinder(5., 19., -4., 4.), 5e-12) + self.runPlainFF(ba.HorizontalCylinder(6., 19., -3., 3.), 5e-12) self.runPlainFF(ba.Sphere(5.)) self.runPlainFF(ba.Spheroid(4., 4.)) self.runPlainFF(ba.TruncatedSphere(7., 9., 1.))