soccer_field_length = 105 soccer_field_width = 68 soccer_goal_width = 14.02 get_referee <- function(rcl) { referee <- rcl |> dplyr::filter(command == "referee") %>% dplyr::select( step, judge=args, ) %>% tidyr::drop_na() %>% distinct(step, .keep_all = TRUE) return(referee) } read_goal <- function(referee, name) { goal <- referee |> dplyr::filter(stringr::str_detect(judge, "goal_[rl]_[0-9]+")) |> dplyr::mutate( side = judge |> stringr::str_remove("goal_") |> stringr::str_extract("[rl]"), score = judge |> stringr::str_remove("goal_[rl]_") |> stringr::str_extract("[0-9]+"), ) |> dplyr::inner_join(name, by = "side") |> dplyr::select( step, judge, side, name, score, ) %>% tidyr::drop_na() return(goal) } get_player <- function(rcg, name) { output <- rcg |> dplyr::inner_join(name, by = "side") |> dplyr::select( step, team = name, side, unum, px = x, py = y, pvx = vx, pvy = vy, body, neck, ) return(output) } get_ball <- function(rcg) { ball <- rcg |> dplyr::select(step, ball_x, ball_y, ball_vx, ball_vy) |> dplyr::distinct(step, .keep_all = TRUE) %>% dplyr::mutate(before_ball_x = lag(ball_x)) %>% dplyr::mutate(before_ball_y = lag(ball_y)) %>% dplyr::mutate(before_bvx = lag(ball_vx)) %>% dplyr::mutate(before_bvy = lag(ball_vy)) %>% dplyr::mutate(next_ball_x = lead(ball_x)) %>% dplyr::mutate(next_ball_y = lead(ball_y)) %>% dplyr::mutate(next_ball_vx = lead(ball_vx)) %>% dplyr::mutate(next_ball_vy = lead(ball_vy)) %>% dplyr::mutate(kick_speed= (ball_vx^2+ball_vy^2)) %>% dplyr::mutate(a_kick_speed= (next_ball_vx^2+next_ball_vy^2)) %>% dplyr::mutate(target_ball_x = (ball_x + ball_vx)) %>% dplyr::mutate(target_ball_y = (ball_y + ball_vy)) %>% dplyr::mutate(shoot_ball = (kick_speed > 1)&((soccer_field_length/2)abs(target_ball_y))) return(ball) } get_action <- function(rcl,ball,players) { referee <- get_referee(rcl) output <- rcl |> dplyr::filter(command == "kick" | command == "tackle" | command == "catch") |> dplyr::mutate( unum = as.numeric(unum) ) |> dplyr::select( step, team, unum, command, ) |> dplyr::inner_join(players, by = c("step", "team", "unum"))%>% dplyr::inner_join(ball, by = "step") %>% dplyr::distinct(step,team, .keep_all = TRUE) %>% dplyr::full_join(referee,by="step") %>% dplyr::arrange(step) %>% dplyr::mutate(next_judge = lead(judge)) %>% dplyr::filter(command == "kick" | command == "tackle" | command == "catch") %>% dplyr::mutate(a_tackle = (lead(command)=="tackle")) %>% dplyr::mutate(next_team = lead(team)) %>% dplyr::mutate(a_sameteam = (next_team == team)) %>% dplyr::mutate(tackle_scc = (judge == "NULL" & command == "tackle" & a_sameteam)) %>% dplyr::mutate(a_tackle_scc = lead(tackle_scc)) return(output) } get_kick_log <- function(action,goal) { output <- action %>% dplyr::filter(command != "tackle") %>% dplyr::mutate(next_catch = (lead(command) == "catch")) %>% dplyr::filter(command == "kick") %>% dplyr::mutate(before_team = lag(team)) %>% dplyr::mutate(before_unum = lag(unum)) %>% dplyr::mutate(next_team = lead(team)) %>% dplyr::mutate(next_unum = lead(unum)) %>% dplyr::mutate(b_sameteam = (before_team == team)) %>% dplyr::mutate(b_sameunum = (before_unum == unum)) %>% dplyr::mutate(a_sameteam = (next_team == team)) %>% dplyr::mutate(a_sameunum = (next_unum == unum)) output$b_sameteam[1] <- TRUE output$b_sameunum[1] <- FALSE output <- dplyr::full_join(output,goal,by=c("step","judge","side")) %>% dplyr::arrange(step) %>% dplyr::mutate(next_score = lead(score)) %>% dplyr::mutate(next_judge = lead(judge)) %>% dplyr::mutate(is_goal = (!is.na(next_score)&(side==lead(side)))) %>% dplyr::filter(command == "kick") %>% dplyr::mutate(shoot_scc = (judge == "NULL") & is_goal) %>% dplyr::mutate(dribble_scc = ( (judge == "NULL") & (next_judge == "NULL") & a_sameteam & a_sameunum)) %>% dplyr::mutate(pass_scc = ( (judge == "NULL") & (next_judge == "NULL") & a_sameteam & !a_sameunum)) %>% dplyr::mutate(shoot = ( shoot_scc | abs(target_ball_x) > (soccer_field_length/2) & abs(target_ball_y) < 12)) %>% dplyr::mutate(dribble = ( (!shoot)& (!pass_scc)& (dribble_scc | (!shoot) & (a_tackle_scc)| (!shoot) & sqrt((ball_x - next_ball_x)^2 + (ball_y - next_ball_y)^2) < 1.0 ) )) %>% dplyr::mutate(pass = ( (pass_scc | (!dribble & !shoot)) )) %>% group_by(grc = cumsum(!dribble)) %>% mutate(touch = row_number()) %>% ungroup() return(output) } get_kick <- function(kick_log) { output <- action %>% dplyr::filter(command == "kick") %>% select(-c(command, pvx, pvy, body, neck)) return(output) } get_kick_Allplayer <- function(players,kick){ kick <- kick %>% dplyr::select(step,action_unum=unum,action_team = team,ball_x,ball_y,ball_vx,ball_vy,next_ball_x,next_ball_y,next_ball_vx,next_ball_vy) output <- players %>% dplyr::inner_join(kick, by = "step") %>% dplyr::distinct(step,team,unum, .keep_all = TRUE) return(output) } get_action_Allplayer <- function(players, action) { action <- action %>% dplyr::select(step, action_team = team, ball_x, ball_y, pass, dribble) output <- players %>% dplyr::inner_join(action, by = "step") return(output) } get_pass_Allplayer <- function(players, pass) { pass <- pass %>% dplyr::select(step,pass_team = team,ball_x,ball_y,ball_vx,ball_vy,next_ball_x,next_ball_y,next_ball_vx,next_ball_vy,pass,pass_scc) output <- players %>% dplyr::inner_join(pass, by = "step") %>% dplyr::distinct(step,team,unum, .keep_all = TRUE) return(output) } get_dribble_Allplayer <- function(players, dribble) { dribble <- dribble %>% dplyr::select(step,dribble_team = team,ball_x,ball_y,ball_vx,ball_vy,next_ball_x,next_ball_y,next_ball_vx,next_ball_vy,dribble,dribble_scc) output <- players %>% dplyr::inner_join(dribble, by = "step") %>% dplyr::distinct(step,team,unum, .keep_all = TRUE) return(output) } get_shoot_Allplayer <- function(players, shoot) { shoot <- shoot %>% dplyr::select(step,shoot_team = team,ball_x,ball_y,ball_vx,ball_vy,next_ball_x,next_ball_y,next_ball_vx,next_ball_vy,shoot,shoot_scc,ball_goal_dist,ball_goal_angle) output <- players %>% dplyr::inner_join(shoot, by = "step") %>% dplyr::distinct(step,team,unum, .keep_all = TRUE)%>% dplyr::mutate(ball_player_dist = sqrt((px-ball_x)^2+(py-ball_y)^2)) return(output) } get_pass <- function(kick) { output <- kick |> dplyr::filter(pass == TRUE) %>% distinct(step, .keep_all = TRUE) %>% dplyr::select(step,team,unum,px,py,pvx,pvy,ball_x,ball_y,ball_vx,ball_vy,next_ball_x,next_ball_y,next_ball_vx,next_ball_vy,pass,pass_scc) return(output) } get_dribble <- function(kick) { output <- kick %>% dplyr::filter(dribble == TRUE) %>% distinct(step, .keep_all = TRUE) %>% dplyr::select(step,team,unum,px,py,pvx,pvy,ball_x,ball_y,ball_vx,ball_vy,next_ball_x,next_ball_y,next_ball_vx,next_ball_vy,dribble,dribble_scc) return(output) } get_shoot <- function(kick) { output <- kick %>% dplyr::filter(shoot == TRUE) %>% distinct(step, .keep_all = TRUE) %>% dplyr::select(step,team,ball_x,ball_y,ball_vx,ball_vy,next_ball_x,next_ball_y,next_ball_vx,next_ball_vy,shoot,shoot_scc) %>% dplyr::mutate(ball_goal_dist = sqrt(((soccer_field_length/2)-abs(ball_x))^2+abs((ball_y))^2)) %>% dplyr::mutate(ball_goal_angle = atan2(((soccer_field_length/2)-abs(ball_x)),ball_y)) return(output) } get_xg <- function(kick){ output <- kick |> dplyr::filter(shoot == TRUE) %>% distinct(step, .keep_all = TRUE) %>% dplyr::mutate(ball_goal_dist = sqrt(((soccer_field_length/2)-abs(ball_x))^2+abs((ball_y))^2)) %>% dplyr::mutate(ball_goal_angle = atan2(((soccer_field_length/2)-abs(ball_x)),ball_y)) %>% dplyr::select(step,team,px,py,ball_x,ball_y,ball_goal_dist,ball_goal_angle) return(output) } get_xg_label <- function(kick){ output <- kick |> dplyr::filter(shoot == TRUE) %>% distinct(step, .keep_all = TRUE) %>% dplyr::select(step,team,shoot_scc) return(output) } get_xg_l <- function(kick){ output <- kick |> dplyr::filter(shoot == TRUE) %>% dplyr::filter(side == "l") %>% distinct(step, .keep_all = TRUE) %>% dplyr::mutate(ball_goal_dist = sqrt(((soccer_field_length/2)-abs(ball_x))^2+abs((ball_y))^2)) %>% dplyr::mutate(ball_goal_angle = atan2(((soccer_field_length/2)-abs(ball_x)),ball_y)) %>% dplyr::select(px,py,ball_x,ball_y,ball_goal_dist,ball_goal_angle) return(output) } get_xg_l_label <- function(kick){ output <- kick |> dplyr::filter(shoot == TRUE) %>% dplyr::filter(side == "l") %>% distinct(step, .keep_all = TRUE) %>% dplyr::select(shoot_scc) return(output) } get_xg_r <- function(kick){ output <- kick |> dplyr::filter(shoot == TRUE) %>% dplyr::filter(side == "r") %>% distinct(step, .keep_all = TRUE) %>% dplyr::mutate(px = px * -1,py = py *-1,ball_x = -1 * ball_x,ball_y = ball_y * -1) %>% dplyr::mutate(ball_goal_dist = sqrt(((soccer_field_length/2)-abs(ball_x))^2+abs((ball_y))^2)) %>% dplyr::mutate(ball_goal_angle = atan2(((soccer_field_length/2)-abs(ball_x)),ball_y)) %>% dplyr::select(px,py,ball_x,ball_y,ball_goal_dist,ball_goal_angle) return(output) } get_xg_r_label <- function(kick){ output <- kick |> dplyr::filter(shoot == TRUE) %>% dplyr::filter(side == "r") %>% distinct(step, .keep_all = TRUE) %>% dplyr::select(shoot_scc) return(output) } get_dp <- function(dribbleAll){ output <- dribbleAll |> dplyr::mutate(p_speed = sqrt(pvx^2 + pvy^2)) %>% dplyr::mutate(theta = atan2(pvx,pvy)) %>% dplyr::mutate(cos = cos(theta),sin = sin(theta)) return(output) } get_as <- function(kick){ output <- kick |> dplyr::select(step,action_team=team,shoot,dribble,pass) return(output) } get_goalkeeper_action<- function(actionAll){ output <- actionAll |> dplyr::filter(unum == 1) %>% dplyr::mutate(ball_keeper_dist_x = sqrt((px-ball_x)^2)) %>% dplyr::mutate(player_goal_dist = sqrt(((soccer_field_length/2)-abs(px))^2+abs((py))^2)) %>% dplyr::mutate(opp_team =(team != shoot_team)) %>% dplyr::mutate(ball_closer_goal_goalkeeper = opp_team & (ball_goal_dist < player_goal_dist)) return(output) } get_shoot_epv <- function(players,shoot){ shootAll <- get_shoot_Allplayer(players,shoot) goalkeeper <- get_goalkeeper_action(shootAll) |> dplyr::filter(team != shoot_team) |> dplyr::select(step,side,ball_keeper_dist_x,keeper_goal_dist=player_goal_dist,ball_closer_goal_goalkeeper) opponent_team <- shootAll |> dplyr::filter(team != shoot_team) %>% dplyr::mutate(r_post_x = (ball_x + (py - ball_y)*((soccer_goal_width/2)-ball_x)/(-(soccer_field_length/2)-ball_y))) %>% dplyr::mutate(l_post_x = (ball_x + (py - ball_y)*(-(soccer_goal_width/2)-ball_x)/(-(soccer_field_length/2)-ball_y))) %>% dplyr::mutate(triangle_in_player = (px > l_post_x)&(px < r_post_x)) %>% dplyr::mutate(dist_ball_in_3m = (ball_player_dist < 3)) opp_triangle_in_player_num <- opponent_team |> dplyr::filter(triangle_in_player) %>% dplyr::group_by(step) %>% dplyr::summarise(triangle_in_player_num=n()) opp_dist_ball_in_3m_num <- opponent_team |> dplyr::filter(dist_ball_in_3m) %>% dplyr::group_by(step) %>% dplyr::summarise(dist_ball_in_3m_num=n()) output <- shoot |> dplyr::left_join(goalkeeper,by = "step") %>% dplyr::left_join(opp_dist_ball_in_3m_num,by="step") %>% dplyr::left_join(opp_triangle_in_player_num,by = "step") %>% replace_na(list(triangle_in_player_num = 0, dist_ball_in_3m_num = 0)) return(output) } before_goal <- function(kick_log, goal_step, goal_team) { playlist <- kick_log %>% dplyr::arrange(desc(step)) %>% dplyr::filter( step > goal_step - 100, step < goal_step, team == goal_team, ) } get_goal_playlist <- function(kick_log, goal) { if (length(goal$step) < 1) { return(NA) } i <- 1 output <- before_goal(kick_log, goal$step[i], goal$name[i]) i <- i + 1 while (i <= length(goal$step)) { # print(i) i_list <- before_goal(kick_log, goal$step[i], goal$name[i]) output <- output |> bind_rows(i_list) i <- i + 1 } # for(i in goal$step){ # i_list <- before_goal(kick_log,goal$step[i],goal$name[i]) # output <- output |> bind_rows(i_list) # print(i) # } return(output) } convert_by_step <- function(rcg, rcl) { output <- dplyr::inner_join(rcg, rcl, by = "step") return(output) } get_dribble_point <- function(log_data) { output <- log_data %>% filter(dribble == TRUE, pass == FALSE) return(output) } get_pass_point <- function(log_data) { output <- log_data %>% filter(pass == TRUE) return(output) } get_tackle_point <- function(log_data) { output <- log_data %>% filter(tackle == TRUE) return(output) } get_rcl <- function(path_rcl) { output <- path_rcl |> read_rcl() return(output) } get_name <- function(path_rcg) { team_name <- path_rcg |> stringr::str_extract("[a-zA-Z0-9_-]*.rcg") |> stringr::str_remove("[0-9]*-") |> stringr::str_remove(".rcl") l_team <- team_name |> stringr::str_extract("[a-zA-Z0-9_]*-vs-") |> stringr::str_remove("_[0-9]*-vs-") r_team <- path_rcg |> stringr::str_extract("[a-zA-Z0-9_]*.rcg") |> stringr::str_remove("_[0-9]*.rcg") name_table <- tibble::tribble( ~side, ~name, "l", l_team, "r", r_team, ) return(name_table) } replase_rcg_to_rcl <- function(path_rcg) { output <- path_rcg |> stringr::str_replace(pattern = ".rcg", replacement = ".rcl") } replase_rcl_to_rcg <- function(path_rcl) { output <- path_rcl |> stringr::str_replace(pattern = ".rcl", replacement = ".rcg") } kick_dist <- function(rcg) { ball_path <- rcg |> dplyr::group_nest(step, ball_x, ball_y) |> dplyr::mutate( move_dist_x = ball_x - dplyr::lag(ball_x), move_dist_y = ball_y - dplyr::lag(ball_y), move_dist = sqrt(move_dist_x^2 + move_dist_y^2), move_dist = dplyr::if_else(is.na(move_dist), 0, move_dist) ) |> dplyr::filter(move_dist != 0 & move_dist < 40) } select_name <- function(data, name) { output <- data %>% dplyr::filter(team %in% name) return(output) } get_AttackLine <- function(pass) { output <- pass %>% dplyr::group_by(step) %>% filter(px == max(px)) %>% dplyr::select( step, pass_team, pass_scc, AL = px ) return(output) } get_DefendLine <- function(pass) { output <- pass %>% dplyr::group_by(step) %>% filter(px == min(px)) %>% dplyr::select(step, DL = px) return(output) } get_MedianLine <- function(pass) { output <- pass %>% dplyr::group_by(step) %>% dplyr::summarize(ML = median(px)) %>% dplyr::select(step, ML) return(output) } get_DynamicPressureLine <- function(pass) { pass <- pass %>% filter(unum != 1) ad <- get_AttackLine(pass) dd <- get_DefendLine(pass) md <- get_MedianLine(pass) output <- dplyr::inner_join(ad, dd, by = "step") %>% dplyr::inner_join(md, by = "step") %>% distinct(step, .keep_all = TRUE) return(output) } get_AttackLine_D <- function(dribble) { output <- dribble %>% dplyr::group_by(step) %>% filter(px == max(px)) %>% dplyr::select( step, dribble_team, dribble_scc, AL = px ) return(output) } get_DynamicPressureLine_D <- function(dribble) { dribble <- dribble %>% filter(unum != 1) ad <- get_AttackLine_D(dribble) dd <- get_DefendLine(dribble) md <- get_MedianLine(dribble) output <- dplyr::inner_join(ad, dd, by = "step") %>% dplyr::inner_join(md, by = "step") %>% distinct(step, .keep_all = TRUE) %>% dplyr::select(step,AL,ML,DL) return(output) } add_DynamicPressureLine <- function(action_All,name){ action_l <- select_name(action_All,name[1,2]) action_r <- select_name(action_All,name[2,2]) dpl_l <- get_DynamicPressureLine_D(action_l) dpl_r <- get_DynamicPressureLine_D(action_r) output <- dplyr::inner_join(action_All,dpl_l,by="step") %>% dplyr::inner_join(dpl_r,by="step",suffix = c("_l","_r")) return(output) }