new_contents: # Copyright 2014-2016 The ODL development group
  #
  # This file is part of ODL.
  #
  # ODL is free software: you can redistribute it and/or modify
  # it under the terms of the GNU General Public License as published by
  # the Free Software Foundation, either version 3 of the License, or
  # (at your option) any later version.
  #
  # ODL is distributed in the hope that it will be useful,
  # but WITHOUT ANY WARRANTY; without even the implied warranty of
  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  # GNU General Public License for more details.
  #
  # You should have received a copy of the GNU General Public License
  # along with ODL.  If not, see <http://www.gnu.org/licenses/>.
  
  """
  Example using a filtered backprojection (FBP) in prarallel 3d using `fbp_op`.
  
  We use a rotated geometry to demonstrate that the FBP still works as expected.
  """
  
  import numpy as np
  import odl
  
  
  # --- Set-up geometry of the problem --- #
  
  
  # Discrete reconstruction space: discretized functions on the cube
  # [-20, 20]^3 with 300 samples per dimension.
  reco_space = odl.uniform_discr(
      min_pt=[-20, -20, -20], max_pt=[20, 20, 20], shape=[300, 300, 300],
      dtype='float32')
  
  # Make a circular cone beam geometry with flat detector
  # Angles: uniformly spaced, n = 360, min = 0, max = 2 * pi
  angle_partition = odl.uniform_partition(0, 2 * np.pi, 360)
  # Detector: uniformly sampled, n = (558, 558), min = (-40, -40), max = (40, 40)
  detector_partition = odl.uniform_partition([-40, -40], [40, 40], [558, 558])
  # Geometry with large cone and fan angle and tilted axis.
  geometry = odl.tomo.Parallel3dAxisGeometry(
      angle_partition, detector_partition, axis=[1, 1, 1])
  
  
  # --- Create FilteredBackProjection (FBP) operator --- #
  
  
  # Ray transform (= forward projection). We use the ASTRA CUDA backend.
  ray_trafo = odl.tomo.RayTransform(reco_space, geometry, impl='astra_cuda')
  
  # Create FBP operator using utility function
  fbp = odl.tomo.fbp_op(ray_trafo, filter_type='Hann', filter_cutoff=0.8)
  
  
  # --- Show some examples --- #
  
  
  # Create a discrete Shepp-Logan phantom (modified version)
  phantom = odl.phantom.shepp_logan(reco_space, modified=True)
  
  # Create projection data by calling the ray transform on the phantom
  proj_data = ray_trafo(phantom)
  
  # Calculate filtered backprojection of data
  fbp_reconstruction = fbp(proj_data)
  
  # Shows a slice of the phantom, projections, and reconstruction
  phantom.show(title='Phantom')
  proj_data.show(title='Projection data (sinogram)')
  fbp_reconstruction.show(title='Filtered backprojection')
  (phantom - fbp_reconstruction).show(title='Error')
  
subject: Add FBP 3d parallel example