whole_func_string: function (N, data, CART_OR_SPH, DIRECT_OR_PINV) {
      
      var Ndirs = data.length, Nsh = (N+1)*(N+1);
      var invY_N;
      var mag = [,];
      if (Nsh>Ndirs)  {
          console.log("The SHT degree is too high for the number of data points")
      }
      
      // Convert cartesian to spherical if needed
      if (CART_OR_SPH==0) data = convertCart2Sph(data);
      for (var  i=0; i<data.length; i++) {
          mag[i] = data[i][2];
      }
      // SH sampling matrix
      Y_N = computeRealSH(N, data);
      // Direct SHT
      if (DIRECT_OR_PINV==0) {
          invY_N = numeric.mul(1/Ndirs,Y_N);
      }
      else {
          invY_N = pinv_direct(numeric.transpose(Y_N));
      }
      // Perform SHT
      var coeffs = numeric.dotMV(invY_N, mag);
      return coeffs;
  }
func_code_string: function (N, data, CART_OR_SPH, DIRECT_OR_PINV) {
      
      var Ndirs = data.length, Nsh = (N+1)*(N+1);
      var invY_N;
      var mag = [,];
      if (Nsh>Ndirs)  {
          console.log("The SHT degree is too high for the number of data points")
      }
      
      // Convert cartesian to spherical if needed
      if (CART_OR_SPH==0) data = convertCart2Sph(data);
      for (var  i=0; i<data.length; i++) {
          mag[i] = data[i][2];
      }
      // SH sampling matrix
      Y_N = computeRealSH(N, data);
      // Direct SHT
      if (DIRECT_OR_PINV==0) {
          invY_N = numeric.mul(1/Ndirs,Y_N);
      }
      else {
          invY_N = pinv_direct(numeric.transpose(Y_N));
      }
      // Perform SHT
      var coeffs = numeric.dotMV(invY_N, mag);
      return coeffs;
  }
func_documentation_string: forwardSHT implements the forward SHT on data defined over the sphere