def driver(image_file, 
          algorithm,
          binary_threshold, 
          canny_low, 
          canny_high, 
          window_height,
          window_width,
          tracking,
          gap, 
          repeat,
          transpose, 
          debug, 
          quiet):
    align = Alignment(image_file)
    params = {
        'binary_threshold': binary_threshold,
        'canny_thresh_low': canny_low,
        'canny_thresh_high': canny_high,
        'window_height': window_height,
        'window_width' : window_width,
        'gap': gap,
        'transpose': transpose,
        'debug': debug,
        'quiet': quiet
    }
    
    if tracking:
        tracking(params, algorithm, repeat)
    elif algorithm:
        print(align.compute_center(algorithm, params));
def tracking(params, algorithm='pin', repeat=1):

    #### ENABLE TAB COMPLETION
    readline.parse_and_bind('tab: complete')

    #################################################
    pixel_size = 1.172
    ## um / pixel

    slit_center_x = 1000
    slit_center_y = 600

    #################################################
    ### MOTOR SETTINGS
    #################################################
    mtr_samXE = PyEpics.Motor('1ide1:m34')
    mtr_samYE = PyEpics.Motor('1ide1:m35')
    mtr_samZE = PyEpics.Motor('1ide1:m36')
    mtr_samTh = PyEpics.Motor('1ide1:m86')
    mtr_samChi = PyEpics.Motor('1ide1:m87')
    mtr_samOme = PyEpics.Motor('1ide:m9')
    mtr_aeroXE = PyEpics.Motor('1ide1:m101')
    mtr_aeroZE = PyEpics.Motor('1ide1:m102')
    #################################################

    pname = '/home/beams/S1IDUSER/mnt/s1c/mli_nov19/tomo'

    for i in range(repeat):
        #################################################
        ### ALIGN ROTATION AXIS TO THE HS
        #################################################
        ### MOVE STAGE TO 0
        mtr_samOme.move(0, wait=True)

        ### TAKE AN IMAGE AT OME 0
        PyEpics.caput('1idPG1:cam1:Acquire', 1)
        time.sleep(3)

        fname = PyEpics.caget('1idPG1:TIFF1:FileName_RBV', 'str') + "_%06d" % (
            PyEpics.caget('1idPG1:TIFF1:FileNumber_RBV') - 1) + '.tif'
        pfname = os.path.join(pname, fname)

        print(pfname)

        align0 = Alignment(pfname)
        x0, y0 = align0.compute_center(algorithm, params)
        print(f"pin x,y position when omega is 0 : (x = {x0}, y = {y0}")

        if (x0 == -1) or (y0 == -1):
            print("Alignment failed at zero degress")
            break

        ### MOVE STAGE TO 180
        mtr_samOme.move(180, wait=True)

        ### TAKE AN IMAGE AT OME 180
        PyEpics.caput('1idPG1:cam1:Acquire', 1)
        time.sleep(3)

        fname = PyEpics.caget('1idPG1:TIFF1:FileName_RBV', 'str') + "_%06d" % (
            PyEpics.caget('1idPG1:TIFF1:FileNumber_RBV') - 1) + '.tif'
        pfname = os.path.join(pname, fname)

        align180 = Alignment(pfname)
        x180, y180 = align180.compute_center(algorithm, params)
        if (x180 == -1) or (y180 == -1):
            print("Alignment failed at 180 degrees")
            break

        print(f"pin x,y position when omega is 180 : (X = {x180}, y = {180})")

        ### COMPUTE MOTIONS TO MAKE
        mid_x = (x180 + x0) / 2
        half_delta_x = (x180 - x0) / 2

        print(mid_x)
        print(half_delta_x)

        ### NEED TO CHECK / FIGURE OUT THE SIGNS ON THESE
        aeroXE_motion = ((mid_x - slit_center_x) * pixel_size) / 1000
        samXE_motion = -(half_delta_x * pixel_size) / 1000

        print('motions to execute')
        print(aeroXE_motion)
        print(samXE_motion)

        mtr_aeroXE.move(aeroXE_motion, relative=True, wait=True)
        mtr_samXE.move(samXE_motion, relative=True, wait=True)