void QmitkQBallReconstructionView::NumericalQBallReconstruction
  (mitk::DataStorage::SetOfObjects::Pointer inImages, int normalization)
{
  try
  {
    itk::TimeProbe clock;

    int nrFiles = inImages->size();
    if (!nrFiles) return;

    QString status;
    mitk::ProgressBar::GetInstance()->AddStepsToDo(nrFiles);

    mitk::DataStorage::SetOfObjects::const_iterator itemiter( inImages->begin() );
    mitk::DataStorage::SetOfObjects::const_iterator itemiterend( inImages->end() );

    std::vector<mitk::DataNode::Pointer> nodes;
    while ( itemiter != itemiterend ) // for all items
    {

      mitk::DiffusionImage<DiffusionPixelType>* vols =
        static_cast<mitk::DiffusionImage<DiffusionPixelType>*>(
        (*itemiter)->GetData());

      std::string nodename;
      (*itemiter)->GetStringProperty("name", nodename);
      ++itemiter;

      // QBALL RECONSTRUCTION
      clock.Start();
      MBI_INFO << "QBall reconstruction ";
      mitk::StatusBar::GetInstance()->DisplayText(status.sprintf(
        "QBall reconstruction for %s", nodename.c_str()).toAscii());

      typedef itk::DiffusionQballReconstructionImageFilter
        <DiffusionPixelType, DiffusionPixelType, TTensorPixelType, QBALL_ODFSIZE>
        QballReconstructionImageFilterType;

      QballReconstructionImageFilterType::Pointer filter =
        QballReconstructionImageFilterType::New();
      filter->SetGradientImage( vols->GetDirections(), vols->GetVectorImage() );
      filter->SetNumberOfThreads( m_Controls->m_QBallReconstructionNumberThreadsSpinbox->value() );
      filter->SetBValue(vols->GetB_Value());
      filter->SetThreshold( m_Controls->m_QBallReconstructionThreasholdEdit->text().toFloat() );

      switch(normalization)
      {
      case 0:
        {
          filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
          break;
        }
      case 1:
        {
          filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO_B_VALUE);
          break;
        }
      case 2:
        {
          filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_B_ZERO);
          break;
        }
      case 3:
        {
          filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_NONE);
          break;
        }
      default:
        {
          filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
        }
      }

      filter->Update();
      clock.Stop();
      MBI_DEBUG << "took " << clock.GetMeanTime() << "s." ;

      // ODFs TO DATATREE
      mitk::QBallImage::Pointer image = mitk::QBallImage::New();
      image->InitializeByItk( filter->GetOutput() );
      //image->SetImportVolume( filter->GetOutput()->GetBufferPointer(), 0, 0, mitk::Image::ImportMemoryManagementType::ManageMemory );
      image->SetVolume( filter->GetOutput()->GetBufferPointer() );
      mitk::DataNode::Pointer node=mitk::DataNode::New();
      node->SetData( image );
      QString newname;
      newname = newname.append(nodename.c_str());
      newname = newname.append("_QN%1").arg(normalization);
      SetDefaultNodeProperties(node, newname.toStdString());
      nodes.push_back(node);

      // B-Zero TO DATATREE
      if(m_Controls->m_OutputB0Image->isChecked())
      {
        mitk::Image::Pointer image4 = mitk::Image::New();
        image4->InitializeByItk( filter->GetBZeroImage().GetPointer() );
        image4->SetVolume( filter->GetBZeroImage()->GetBufferPointer() );
        mitk::DataNode::Pointer node4=mitk::DataNode::New();
        node4->SetData( image4 );
        node4->SetProperty( "name", mitk::StringProperty::New(
          QString(nodename.c_str()).append("_b0").toStdString()) );
        nodes.push_back(node4);
      }
      mitk::ProgressBar::GetInstance()->Progress();

    }

    std::vector<mitk::DataNode::Pointer>::iterator nodeIt;
    for(nodeIt = nodes.begin(); nodeIt != nodes.end(); ++nodeIt)
      GetDefaultDataStorage()->Add(*nodeIt);

    mitk::StatusBar::GetInstance()->DisplayText(status.sprintf("Finished Processing %d Files", nrFiles).toAscii());
    m_MultiWidget->RequestUpdate();

  }
  catch (itk::ExceptionObject &ex)
  {
    MBI_INFO << ex ;
    return ;
  }
}
int mitkImageReconstructionTest(int argc, char* argv[])
{
    MITK_TEST_BEGIN("mitkImageReconstructionTest");

    MITK_TEST_CONDITION_REQUIRED(argc>1,"check for input data")

    try
    {
        mitk::DiffusionImage<short>::Pointer dwi = dynamic_cast<mitk::DiffusionImage<short>*>(mitk::IOUtil::LoadDataNode(argv[1])->GetData());

        {
            MITK_INFO << "Tensor reconstruction " << argv[2];
            mitk::TensorImage::Pointer tensorImage = dynamic_cast<mitk::TensorImage*>(mitk::IOUtil::LoadDataNode(argv[2])->GetData());
            typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, float > TensorReconstructionImageFilterType;
            TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->Update();
            mitk::TensorImage::Pointer testImage = mitk::TensorImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, tensorImage, 0.0001, true), "tensor reconstruction test.");
        }

        {
            MITK_INFO << "Numerical Q-ball reconstruction " << argv[3];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[3])->GetData());
            typedef itk::DiffusionQballReconstructionImageFilter<short, short, float, QBALL_ODFSIZE> QballReconstructionImageFilterType;
            QballReconstructionImageFilterType::Pointer filter = QballReconstructionImageFilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "Numerical Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "Standard Q-ball reconstruction " << argv[4];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[4])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_STANDARD);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "Standard Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "CSA Q-ball reconstruction " << argv[5];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[5])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_SOLID_ANGLE);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "CSA Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "ADC profile reconstruction " << argv[6];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[6])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_ADC_ONLY);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "ADC profile reconstruction test.");
        }

        {
            MITK_INFO << "Raw signal modeling " << argv[7];
            mitk::QBallImage::Pointer qballImage = dynamic_cast<mitk::QBallImage*>(mitk::IOUtil::LoadDataNode(argv[7])->GetData());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,QBALL_ODFSIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetGradientImage( dwi->GetDirections(), dwi->GetVectorImage() );
            filter->SetBValue(dwi->GetB_Value());
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_RAW_SIGNAL);
            filter->Update();
            mitk::QBallImage::Pointer testImage = mitk::QBallImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(testImage, qballImage, 0.0001, true), "Raw signal modeling test.");
        }
    }
    catch (itk::ExceptionObject e)
    {
        MITK_INFO << e;
        return EXIT_FAILURE;
    }
    catch (std::exception e)
    {
        MITK_INFO << e.what();
        return EXIT_FAILURE;
    }
    catch (...)
    {
        MITK_INFO << "ERROR!?!";
        return EXIT_FAILURE;
    }

    MITK_TEST_END();
}
int mitkImageReconstructionTest(int argc, char* argv[])
{
    MITK_TEST_BEGIN("mitkImageReconstructionTest");

    MITK_TEST_CONDITION_REQUIRED(argc>1,"check for input data")

    try
    {
        mitk::Image::Pointer dwi = dynamic_cast<mitk::Image*>(mitk::IOUtil::Load(argv[1])[0].GetPointer());

        itk::VectorImage<short,3>::Pointer itkVectorImagePointer = itk::VectorImage<short,3>::New();
        mitk::CastToItkImage(dwi, itkVectorImagePointer);

        float b_value = mitk::DiffusionPropertyHelper::GetReferenceBValue( dwi );
        mitk::DiffusionPropertyHelper::GradientDirectionsContainerType::Pointer gradients = mitk::DiffusionPropertyHelper::GetGradientContainer(dwi);
        {
            MITK_INFO << "Tensor reconstruction " << argv[2];
            mitk::TensorImage::Pointer tensorImage = dynamic_cast<mitk::TensorImage*>(mitk::IOUtil::Load(argv[2])[0].GetPointer());
            typedef itk::DiffusionTensor3DReconstructionImageFilter< short, short, float > TensorReconstructionImageFilterType;
            TensorReconstructionImageFilterType::Pointer filter = TensorReconstructionImageFilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->Update();
            mitk::TensorImage::Pointer testImage = mitk::TensorImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *tensorImage, 0.0001, true), "tensor reconstruction test.");
        }

        {
            MITK_INFO << "Numerical Q-ball reconstruction " << argv[3];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[3])[0].GetPointer());
            typedef itk::DiffusionQballReconstructionImageFilter<short, short, float, ODF_SAMPLING_SIZE> QballReconstructionImageFilterType;
            QballReconstructionImageFilterType::Pointer filter = QballReconstructionImageFilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetNormalizationMethod(QballReconstructionImageFilterType::QBR_STANDARD);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "Numerical Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "Standard Q-ball reconstruction " << argv[4];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[4])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_STANDARD);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "Standard Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "CSA Q-ball reconstruction " << argv[5];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[5])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_SOLID_ANGLE);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "CSA Q-ball reconstruction test.");
        }

        {
            MITK_INFO << "ADC profile reconstruction " << argv[6];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[6])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_ADC_ONLY);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "ADC profile reconstruction test.");
        }

        {
            MITK_INFO << "Raw signal modeling " << argv[7];
            mitk::OdfImage::Pointer odfImage = dynamic_cast<mitk::OdfImage*>(mitk::IOUtil::Load(argv[7])[0].GetPointer());
            typedef itk::AnalyticalDiffusionQballReconstructionImageFilter<short,short,float,4,ODF_SAMPLING_SIZE> FilterType;
            FilterType::Pointer filter = FilterType::New();
            filter->SetBValue( b_value );
            filter->SetGradientImage( gradients, itkVectorImagePointer );
            filter->SetLambda(0.006);
            filter->SetNormalizationMethod(FilterType::QBAR_RAW_SIGNAL);
            filter->Update();
            mitk::OdfImage::Pointer testImage = mitk::OdfImage::New();
            testImage->InitializeByItk( filter->GetOutput() );
            testImage->SetVolume( filter->GetOutput()->GetBufferPointer() );
            MITK_TEST_CONDITION_REQUIRED(mitk::Equal(*testImage, *odfImage, 0.0001, true), "Raw signal modeling test.");
        }
    }
    catch (itk::ExceptionObject e)
    {
        MITK_INFO << e;
        return EXIT_FAILURE;
    }
    catch (std::exception e)
    {
        MITK_INFO << e.what();
        return EXIT_FAILURE;
    }
    catch (...)
    {
        MITK_INFO << "ERROR!?!";
        return EXIT_FAILURE;
    }

    MITK_TEST_END();
}