## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  fig.width = 6.5,
  fig.height = 6.5,
  dpi = 96,
  out.width = "100%"
)
library(visPedigree)

## ----gettingdataset,eval=FALSE------------------------------------------------
# data(package="visPedigree")

## ----simpleped----------------------------------------------------------------
head(simple_ped)
tail(simple_ped)
# The number of individuals in the pedigree dataset
nrow(simple_ped)
# Individual records with missing parents
simple_ped[Sire %in% c("0", "*", "NA", NA) |
             Dam %in% c("0", "*", "NA", NA)]

## ----error=TRUE---------------------------------------------------------------
try({
x <- data.table::copy(simple_ped)
x[ID == "J2F588", Sire := "J0Z167"]
y <- tidyped(x)
})

## ----tidyped------------------------------------------------------------------
tidy_simple_ped <- tidyped(simple_ped)
head(tidy_simple_ped)
tail(tidy_simple_ped)
nrow(tidy_simple_ped)

## -----------------------------------------------------------------------------
tidy_simple_ped_no_gen_num <-
  tidyped(simple_ped, addgen = FALSE, addnum = FALSE)
    head(tidy_simple_ped_no_gen_num)

## ----loop_detection, error=TRUE-----------------------------------------------
try({
# loop_ped contains cycles (e.g., V -> T -> R -> P -> M -> V)
# Attempting to tidy it will result in an error
try(tidyped(loop_ped))
})

## ----writeped,eval=FALSE------------------------------------------------------
# saved_ped <- data.table::copy(tidy_simple_ped)
# saved_ped[is.na(Sire), Sire := "0"]
# saved_ped[is.na(Dam), Dam := "0"]
# data.table::fwrite(
#   x = saved_ped,
#   file = tempfile(fileext = ".csv"),
#   sep = ",",
#   quote = FALSE
# )

## -----------------------------------------------------------------------------
tidy_simple_ped_J5X804_ancestors <-
  tidyped(ped = tidy_simple_ped_no_gen_num, cand = "J5X804")
  tail(tidy_simple_ped_J5X804_ancestors)

## -----------------------------------------------------------------------------
tidy_simple_ped_J5X804_ancestors_2 <-
  tidyped(ped = tidy_simple_ped_no_gen_num,
  cand = "J5X804",
  tracegen = 2)
  print(tidy_simple_ped_J5X804_ancestors_2)

## -----------------------------------------------------------------------------
tidy_simple_ped_J0Z990_offspring <-
  tidyped(ped = tidy_simple_ped_no_gen_num, cand = "J0Z990", trace = "down")
  print(tidy_simple_ped_J0Z990_offspring)

## ----intped-------------------------------------------------------------------
tidy_simple_ped_with_int <-
  tidyped(ped = tidy_simple_ped_no_gen_num, addnum = TRUE)
head(tidy_simple_ped_with_int)

## ----inbreed------------------------------------------------------------------
# Create a simple inbred pedigree
library(data.table)
test_ped <- data.table(
  Ind = c("A", "B", "C", "D", "E"),
  Sire = c(NA, NA, "A", "C", "C"),
  Dam = c(NA, NA, "B", "B", "D"),
  Sex = c("male", "female", "male", "female", "male")
)
# Option 1: Calculate during tidying
tidy_test <- tidyped(test_ped, inbreed = TRUE)
head(tidy_test)

# Option 2: Calculate after tidying
tidy_test <- inbreed(tidyped(test_ped))

## ----genmethod----------------------------------------------------------------
# Default behavior (Top-Down): J2Y434 is at Gen 3
tidy_top <- tidyped(simple_ped, genmethod = "top")
tidy_top[Ind == "J2Y434"]

# Bottom-Up behavior: J2Y434 is at Gen 6
tidy_bottom <- tidyped(simple_ped, genmethod = "bottom")
tidy_bottom[Ind == "J2Y434"]

## ----summary------------------------------------------------------------------
# Summarize the tidied pedigree
summary(tidy_simple_ped)

## ----splitped-----------------------------------------------------------------
# Split the pedigree into components
sub_pedigrees <- splitped(tidy_simple_ped)

# View summary of the split result
summary(sub_pedigrees)

# Access a specific sub-pedigree
# first_sub <- sub_pedigrees[[1]]

## ----plant-selfing------------------------------------------------------------
library(data.table)

# A plant pedigree with self-fertilization:
# P1 (male) × P2 (female) → F1
# F1 selfs → F2_1, F2_2
# F2_1 selfs → F3
plant_ped <- data.table(
  Ind  = c("P1", "P2", "F1", "F2_1", "F2_2", "F3"),
  Sire = c(NA,   NA,   "P1", "F1",   "F1",   "F2_1"),
  Dam  = c(NA,   NA,   "P2", "F1",   "F1",   "F2_1")
)

# Without selfing = TRUE: error — F1 and F2_1 appear as both Sire and Dam
try(tidyped(plant_ped))

## ----plant-selfing-tidy-------------------------------------------------------
tp_plant <- tidyped(plant_ped, selfing = TRUE, inbreed = TRUE)
tp_plant[]

# Check metadata
attr(tp_plant, "ped_meta")

## ----plant-selfing-summary----------------------------------------------------
summary(tp_plant)

## ----plant-selfing-inbreed----------------------------------------------------
# Inbreeding coefficients
tp_plant[, .(Ind, Sex, Gen, f)]

