diff options
| author | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2019-03-29 14:42:53 +0100 | 
|---|---|---|
| committer | Willem Jan Palenstijn <Willem.Jan.Palenstijn@cwi.nl> | 2019-09-25 14:10:08 +0200 | 
| commit | 0f4ceb4c7f3f63fddf8fbf44c59fcd8f415e3847 (patch) | |
| tree | d2f271ffe76f0ec18479a52dfe418beb16e38edb | |
| parent | 1fec36f7ccadd5f7dcf2bb59b0654dc53653b0f3 (diff) | |
| download | astra-0f4ceb4c7f3f63fddf8fbf44c59fcd8f415e3847.tar.gz astra-0f4ceb4c7f3f63fddf8fbf44c59fcd8f415e3847.tar.bz2 astra-0f4ceb4c7f3f63fddf8fbf44c59fcd8f415e3847.tar.xz astra-0f4ceb4c7f3f63fddf8fbf44c59fcd8f415e3847.zip  | |
Adjust line kernels to line integral scaling
| -rw-r--r-- | include/astra/FanFlatBeamLineKernelProjector2D.inl | 6 | ||||
| -rw-r--r-- | include/astra/ParallelBeamLineKernelProjector2D.inl | 6 | ||||
| -rw-r--r-- | tests/python/test_line2d.py | 14 | 
3 files changed, 7 insertions, 19 deletions
diff --git a/include/astra/FanFlatBeamLineKernelProjector2D.inl b/include/astra/FanFlatBeamLineKernelProjector2D.inl index 58dec61..8f2e673 100644 --- a/include/astra/FanFlatBeamLineKernelProjector2D.inl +++ b/include/astra/FanFlatBeamLineKernelProjector2D.inl @@ -82,8 +82,6 @@ void CFanFlatBeamLineKernelProjector2D::projectBlock_internal(int _iProjFrom, in  		const SFanProjection * proj = &pVecProjectionGeometry->getProjectionVectors()[iAngle]; -		float32 detSize = sqrt(proj->fDetUX * proj->fDetUX + proj->fDetUY * proj->fDetUY); -  		// loop detectors  		for (iDetector = _iDetFrom; iDetector < _iDetTo; ++iDetector) { @@ -104,7 +102,7 @@ void CFanFlatBeamLineKernelProjector2D::projectBlock_internal(int _iProjFrom, in  			// vertically  			if (vertical) {  				RxOverRy = Rx/Ry; -				lengthPerRow = detSize * pixelLengthX * sqrt(Rx*Rx + Ry*Ry) / abs(Ry); +				lengthPerRow = pixelLengthX * sqrt(Rx*Rx + Ry*Ry) / abs(Ry);  				deltac = -pixelLengthY * RxOverRy * inv_pixelLengthX;  				S = 0.5f - 0.5f*fabs(RxOverRy);  				T = 0.5f + 0.5f*fabs(RxOverRy); @@ -154,7 +152,7 @@ void CFanFlatBeamLineKernelProjector2D::projectBlock_internal(int _iProjFrom, in  			// horizontally  			else {  				RyOverRx = Ry/Rx; -				lengthPerCol = detSize * pixelLengthY * sqrt(Rx*Rx + Ry*Ry) / abs(Rx); +				lengthPerCol = pixelLengthY * sqrt(Rx*Rx + Ry*Ry) / abs(Rx);  				deltar = -pixelLengthX * RyOverRx * inv_pixelLengthY;  				S = 0.5f - 0.5f*fabs(RyOverRx);  				T = 0.5f + 0.5f*fabs(RyOverRx); diff --git a/include/astra/ParallelBeamLineKernelProjector2D.inl b/include/astra/ParallelBeamLineKernelProjector2D.inl index a9f1aa0..1fc67a8 100644 --- a/include/astra/ParallelBeamLineKernelProjector2D.inl +++ b/include/astra/ParallelBeamLineKernelProjector2D.inl @@ -166,19 +166,17 @@ void CParallelBeamLineKernelProjector2D::projectBlock_internal(int _iProjFrom, i  		const SParProjection * proj = &pVecProjectionGeometry->getProjectionVectors()[iAngle]; -		float32 detSize = sqrt(proj->fDetUX * proj->fDetUX + proj->fDetUY * proj->fDetUY); -  		bool vertical = fabs(proj->fRayX) < fabs(proj->fRayY);  		if (vertical) {  			RxOverRy = proj->fRayX/proj->fRayY; -			lengthPerRow = detSize * pixelLengthX * sqrt(proj->fRayY*proj->fRayY + proj->fRayX*proj->fRayX) / abs(proj->fRayY); +			lengthPerRow = pixelLengthX * sqrt(proj->fRayY*proj->fRayY + proj->fRayX*proj->fRayX) / abs(proj->fRayY);  			deltac = -pixelLengthY * RxOverRy * inv_pixelLengthX;  			S = 0.5f - 0.5f*fabs(RxOverRy);  			T = 0.5f + 0.5f*fabs(RxOverRy);  			invTminSTimesLengthPerRow = lengthPerRow / (T - S);  		} else {  			RyOverRx = proj->fRayY/proj->fRayX; -			lengthPerCol = detSize * pixelLengthY * sqrt(proj->fRayY*proj->fRayY + proj->fRayX*proj->fRayX) / abs(proj->fRayX); +			lengthPerCol = pixelLengthY * sqrt(proj->fRayY*proj->fRayY + proj->fRayX*proj->fRayX) / abs(proj->fRayX);  			deltar = -pixelLengthX * RyOverRx * inv_pixelLengthY;  			S = 0.5f - 0.5f*fabs(RyOverRx);  			T = 0.5f + 0.5f*fabs(RyOverRx); diff --git a/tests/python/test_line2d.py b/tests/python/test_line2d.py index d04ffb8..755bd27 100644 --- a/tests/python/test_line2d.py +++ b/tests/python/test_line2d.py @@ -454,23 +454,15 @@ class Test2DKernel(unittest.TestCase):          for i, (center, edge1, edge2) in enumerate(gen_lines(pg)):            (src, det) = center -          try: -            detweight = pg['DetectorWidth'] -          except KeyError: -            if 'fan' not in type: -              detweight = effective_detweight(src, det, pg['Vectors'][i//pg['DetectorCount'],4:6]) -            else: -              detweight = np.linalg.norm(pg['Vectors'][i//pg['DetectorCount'],4:6], ord=2) -            # We compute line intersections with slightly bigger (cw) and            # smaller (aw) rectangles, and see if the kernel falls            # between these two values.            (aw,bw,cw) = intersect_line_rectangle_interval(src, det,                          xmin, xmax, ymin, ymax,                          1e-3) -          a[i] = aw * detweight -          b[i] = bw * detweight -          c[i] = cw * detweight +          a[i] = aw +          b[i] = bw +          c[i] = cw          a = a.reshape(astra.functions.geom_size(pg))          b = b.reshape(astra.functions.geom_size(pg))          c = c.reshape(astra.functions.geom_size(pg))  | 
