def METHOD_NAME(self):
    ## create containers for location, swimming directions, and 
    locations     = np.empty(shape=(self.N,3 ), dtype=float)
    curDirections = np.empty(shape=(self.N,3 ), dtype=float)
    cutOff        = np.empty(shape=(self.N, ),  dtype=float)
    ## fill matrix with locations / current swimming direction
    for i,fish in enumerate(self.fishes):
        locations[i,:]     = fish.location
        curDirections[i,:] = fish.curDirection
        cutOff[i]          = fish.sigmaPotential
    # normalize swimming directions
    normalCurDirections = curDirections / np.linalg.norm( curDirections, axis=1 )[:, np.newaxis]
    ## create containers for direction, distance, and angle
    directions    = np.empty(shape=(self.N,self.N, 3), dtype=float)
    distances     = np.empty(shape=(self.N,self.N),    dtype=float)
    angles        = np.empty(shape=(self.N,self.N),    dtype=float)
    ## use numpy broadcasting to compute direction, distance, and angles
    directions    = locations[np.newaxis, :, :] - locations[:, np.newaxis, :]
    distances     = np.sqrt( np.einsum('ijk,ijk->ij', directions, directions) )
    # normalize direction
    normalDirections = directions / distances[:,:,np.newaxis]
    angles = np.arccos( np.einsum( 'ijk, ijk->ij', normalCurDirections[:,np.newaxis,:], normalDirections ) )
    ## set diagonals entries
    np.fill_diagonal( distances, np.inf )
    np.fill_diagonal( angles,    np.inf )
    ## fill values to class member variable
    self.directionMat = directions
    self.distancesMat = distances
    self.anglesMat    = angles
    # return if any two fish are closer then the cutOff
    return ( self.distancesMat < cutOff[:,np.newaxis] ).any()