Align various waves in a specific point.
    
    Given a mode of alignment, this function computes the specific time point of 
    a wave where all the waves would be aligned. With the difference between the
    time point of the reference wave and the time points of all the other waves, 
    we have the amount of samples the waves will move to align in the specific 
    point computed. 
   
    Parameters
    ----------
    w: array-like
      the input signal to use as a reference of alignment (all the other signals
      will be aligned with this one).
    signals: array-like or matrix-like
      the input signals to align. 
    mode: string
      the mode used in the alignment, from 'max', 'min', 'peak', 'peak_neg', 
      'infMaxAlign' and 'infMinAlign'. 

    Returns
    -------
    nw: a masked array
      a new set of aligned signals in a masked array (some cells have NAN values
      due to the alignment).
        
    Example
    -------
    >>> align([6,3,4,5,2,2],[10,30,28,26,13,20],'max')
    [masked_array(data = [30.0 28.0 26.0 13.0 20.0 --],
                 mask = [False False False False False  True],
           fill_value = 1e+20)
    ]
    >>> align([6,3,4,5,2,2],[10,30,28,26,13,20],'peak')
    [masked_array(data = [-- -- 10.0 30.0 28.0 26.0],
                 mask = [ True  True False False False False],
           fill_value = 1e+20)
    ]
    >>> align([34,4,8],[[100,550,278,67,613,120],[10,470,230,189,856,420]],'min')
    [masked_array(data = [278.0 67.0 613.0 120.0 -- --],
                 mask = [False False False False  True  True],
           fill_value = 1e+20)
    , masked_array(data = [-- 10.0 470.0 230.0 189.0 856.0],
                 mask = [ True False False False False False],
           fill_value = 1e+20)
    ]

def align(w,signals,mode):
    """ Align various waves in a specific point.
    
    Given a mode of alignment, this function computes the specific time point of 
    a wave where all the waves would be aligned. With the difference between the
    time point of the reference wave and the time points of all the other waves, 
    we have the amount of samples the waves will move to align in the specific 
    point computed. 
   
    Parameters
    ----------
    w: array-like
      the input signal to use as a reference of alignment (all the other signals
      will be aligned with this one).
    signals: array-like or matrix-like
      the input signals to align. 
    mode: string
      the mode used in the alignment, from 'max', 'min', 'peak', 'peak_neg', 
      'infMaxAlign' and 'infMinAlign'. 

    Returns
    -------
    nw: a masked array
      a new set of aligned signals in a masked array (some cells have NAN values
      due to the alignment).
        
    Example
    -------
    >>> align([6,3,4,5,2,2],[10,30,28,26,13,20],'max')
    [masked_array(data = [30.0 28.0 26.0 13.0 20.0 --],
                 mask = [False False False False False  True],
           fill_value = 1e+20)
    ]
    >>> align([6,3,4,5,2,2],[10,30,28,26,13,20],'peak')
    [masked_array(data = [-- -- 10.0 30.0 28.0 26.0],
                 mask = [ True  True False False False False],
           fill_value = 1e+20)
    ]
    >>> align([34,4,8],[[100,550,278,67,613,120],[10,470,230,189,856,420]],'min')
    [masked_array(data = [278.0 67.0 613.0 120.0 -- --],
                 mask = [False False False False  True  True],
           fill_value = 1e+20)
    , masked_array(data = [-- 10.0 470.0 230.0 189.0 856.0],
                 mask = [ True False False False False False],
           fill_value = 1e+20)
    ]
    """ 
    
    nw = []
    
    if len(shape(signals))==1:       
        signals = [signals]
               
    for i in range(len(signals)):
        
        if (mode == 'max'):
            al = maxAlign(w,signals[i])
        elif (mode == 'min'):
            al = minAlign(w,signals[i])
        elif (mode == 'peak'):
            al = peakAlign(w,signals[i])
        elif (mode == 'peak_neg'):
            al = peakNegAlign(w,signals[i])
        elif (mode == 'infMaxAlign'):
            al = infMaxAlign(w,signals[i])
        elif (mode == 'infMinAlign'):
            al = infMinAlign(w,signals[i])
                
        nw += [ moveWave(signals[i],al) ]
          
    return nw