void makeVolume(gmtl::Sphere<DATA_TYPE>& container, list pts)
{
   const unsigned int size = extract<unsigned int>(pts.attr("__len__")());
   std::vector< gmtl::Point<DATA_TYPE, 3> > pt_vec(size);

   for ( unsigned int i = 0; i < size; ++i )
   {
#if defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ == 2
      gmtl::Point<DATA_TYPE, 3> temp = extract< gmtl::Point<DATA_TYPE, 3> >(pts[i]);
      pt_vec[i] = temp;
#else
      pt_vec[i] = extract< gmtl::Point<DATA_TYPE, 3> >(pts[i]);
#endif
   }

   gmtl::makeVolume(container, pt_vec);
}
vtkDataArray *
avtCylindricalRadiusExpression::DeriveVariable(vtkDataSet *in_ds, int currentDomainsIndex)
{
    vtkIdType npts = in_ds->GetNumberOfPoints();
    vtkDataArray *rv = CreateArrayFromMesh(in_ds);
    rv->SetNumberOfComponents(1);
    rv->SetNumberOfTuples(npts);
    
    // The cylindrical radius is:
    // norm(pt) * sin(acos(dot(pt,axis)/(norm(pt)*norm(axis))))
    // 
    
    avtVector ax_vec(axisVector);
    ax_vec.normalize();
    
    for (vtkIdType i = 0 ; i < npts ; i++)
    {
        double pt[3];
        in_ds->GetPoint(i, pt);
        avtVector pt_vec(pt);
        
        double pt_vec_mag = pt_vec.norm();
     
        // dot prod of normalized vecs to get angle
        double dp = pt_vec * ax_vec;
        dp = dp / pt_vec_mag ;
        double ang = acos(dp);
        
        // find the orthogonal component
        avtVector proj = pt_vec * sin(ang);
        double r = proj.norm();
        rv->SetComponent(i, 0, r);
    }

    return rv;
}