code: def _determine_stream_spread_single(sigomatrixEig,
                                      thetasTrack,
                                      sigOmega,
                                      sigAngle,
                                      allinvjacsTrack):
      
      #Estimate the spread in all frequencies and angles
      sigObig2= sigOmega(thetasTrack)**2.
      tsigOdiag= copy.copy(sigomatrixEig[0])
      tsigOdiag[numpy.argmax(tsigOdiag)]= sigObig2
      tsigO= numpy.dot(sigomatrixEig[1],
                       numpy.dot(numpy.diag(tsigOdiag),
                                 numpy.linalg.inv(sigomatrixEig[1])))
      #angles
      if hasattr(sigAngle,'__call__'):
          sigangle2= sigAngle(thetasTrack)**2.
      else:
          sigangle2= sigAngle**2.
      tsigadiag= numpy.ones(3)*sigangle2
      tsigadiag[numpy.argmax(tsigOdiag)]= 1.
      tsiga= numpy.dot(sigomatrixEig[1],
                      numpy.dot(numpy.diag(tsigadiag),
                                numpy.linalg.inv(sigomatrixEig[1])))
      #correlations, assume half correlated for now (can be calculated)
      correlations= numpy.diag(0.5*numpy.ones(3))*numpy.sqrt(tsigOdiag*tsigadiag)
      correlations[numpy.argmax(tsigOdiag),numpy.argmax(tsigOdiag)]= 0.
      correlations= numpy.dot(sigomatrixEig[1],
                              numpy.dot(correlations,
                                        numpy.linalg.inv(sigomatrixEig[1])))
      #Now convert
      fullMatrix= numpy.empty((6,6))
      fullMatrix[:3,:3]= tsigO
      fullMatrix[3:,3:]= tsiga
      fullMatrix[3:,:3]= correlations
      fullMatrix[:3,3:]= correlations.T
      return numpy.dot(allinvjacsTrack,numpy.dot(fullMatrix,allinvjacsTrack.T))
docs: sigAngle input may either be a function that returns the dispersion in
      perpendicular angle as a function of parallel angle, or a value