#Trackmate turning angle calculation
import statsmodels.api as sm
import numpy as np
import pandas as pd
#import pims
#import trackpy as tp
import os

import matplotlib  as mpl 
import matplotlib.pyplot as plt 
import glob
import os
import cv2
import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning) 
directory='C:/Users/marcb/Desktop/trackmate_bgs/sim_trajectories'
substring='z'
os.chdir('C:/Users/marcb/Desktop/flow_trajectories/tmate_angles')
for filename in os.listdir(directory):
    if substring in filename:
        print ('Working on ' + str(filename))
        timename=filename[:-15]+'_time.xlsx'
        t1 = pd.read_csv(os.path.join(directory,filename),header=3,usecols=[2,4,5,7],names=['particle','x','y','frame'])
        time=pd.read_excel(os.path.join(directory,timename), usecols=[1])
        dt=[]
        time.dropna(inplace=True)
        for count, value in enumerate (time.iloc):
            dt.append(time.iloc[count+1][0]-time.iloc[count][0])
            if (count+2)==len(time):
                break
            if dt[count]<0:
                print ('Time file is erroneous. T[0] = time.iloc[403]', count)
                time.drop(time.index[0:count+1], inplace=True)
                time.reset_index(drop=True, inplace=True)
            else:
                continue
        unique_part=[]
        for i in t1.particle.unique():
            unique_part.append(i)
        unique_part = [x for x in unique_part if str(x) != 'nan']
        traj_stats=[]
        dist=[]
        count=0
        for n in range(len(unique_part)):
            tslice=t1.particle==unique_part[n]
            traj_x=t1[tslice].sort_values(['frame']).x
            traj_y=t1[tslice].sort_values(['frame']).y
            frame=t1[tslice].sort_values(['frame']).frame
            if np.any(frame>len(time)):
                break
            start_ind=time.index[int(frame.iloc[0])]
            current_time=time.iloc[start_ind:start_ind+len(frame)]
            dt=current_time.diff()
            #frame_diff=frame.diff()
            x_diff=traj_x.diff()
            y_diff=traj_y.diff()
            vel_dist=np.sqrt(x_diff**2+y_diff**2)
            vel=np.reshape(vel_dist.values,[len(vel_dist),1])/np.reshape(np.array(dt),[len(vel_dist),1])
 
            angles=np.zeros((len(x_diff),1))
            for i in range(len(x_diff)-1):
                theta_1=np.arctan(y_diff.iloc[i]/x_diff.iloc[i])
                theta_2=np.arctan(y_diff.iloc[i+1]/x_diff.iloc[i+1])
                angles[i]=(theta_2-theta_1)*(180/np.pi)
            #    if angles[i]==0:
            #        angles[i]=np.nan
            #        vel[i]=np.nan
            #    if i==len(x_diff)-1:
            #        vel[i]=np.nan
            #angles[i+1]=np.nan
            for count, val in enumerate (angles):
                if val==0:
                    angles[count]=np.nan
            vel=vel[0:len(angles)]
                    
            traj_stats.append([n, angles,vel])

        angle_array=[]
        vel_array=[]
        for i in range(len(traj_stats)):
            section1=traj_stats[i][1]
            section1=np.reshape(section1,(len(section1),))
            section2=traj_stats[i][2]
            section2=np.reshape(section2,(len(section2),))
            angle_array=np.hstack([section1,angle_array])
            vel_array=np.hstack([section2,vel_array])
            final_array=np.vstack([np.transpose(angle_array)[0:len(vel_array)],np.transpose(vel_array)])

        pd.DataFrame(np.transpose(final_array)).to_csv('vel'+str(filename))