tests/testthat/test_overlap2D.R

# testing overlap functions for 2D. Circle, square, annulus.
test_that(
  'Overlap Errors',{
    expect_error(calc_overlap_2D(alpha=-1))
    expect_error(calc_overlap_2D(alpha=1, r=-1))
    expect_error(calc_overlap_2D(alpha=1, r=0.5, rmin=-1))
    expect_error(calc_overlap_2D(alpha=1, r=0.5, rmin=1))
    expect_error(calc_overlap_2D(alpha=1, bound = "triangle"))
    expect_error(circle_overlap_ia(3.4, 2, 1))
    expect_error(calc_overlap_2D(alpha=1, r=1, rmin=2, bound="annulus"))
  }
)

test_that(
  'Overlap Square', {
    #given
    rad=0.5
    alpha1=0.2
    alpha2= 0.35
    alpha3 = 1
    theta=acos(0.5/0.7)
    a1 = 0.5*(theta-sin(theta))*0.7^2
    #when
    overlap1 = calc_overlap_2D(alpha=alpha1, r=rad)
    overlap2 = calc_overlap_2D(alpha=alpha2, r=rad)
    overlap3 = calc_overlap_2D(alpha=alpha3, r=rad)
    #then
    expect_equal(overlap1, (pi*0.4^2/4)/0.25)
    expect_equal(overlap2, (pi*0.7^2/4 - a1)/0.25)
    expect_equal(overlap3, 1)
  }
)

test_that(
  'Overlap Circle', {
    #given
    rad=0.5
    alpha1 = 0.25
    alpha2 = 0.4
    alpha3 = 2
    theta1 = 2*acos(0.5)
    theta2 = 2*acos(0.5)
    a1 = 0.5*(theta1-sin(theta1))*0.5^2
    a2 = 0.5*(theta2-sin(theta2))*0.5^2
    o1 = a1+a2
    theta1 = 2*acos(0.8)
    theta2 = 2*acos(-0.28)
    a1 = 0.5*(theta1-sin(theta1))*0.8^2
    a2 = 0.5*(theta2 + sin((2 * pi - theta2)))*0.5^2
    o2 = a1+a2
    #when
    overlap1 = calc_overlap_2D(alpha=alpha1, r=rad, bound="circle")
    overlap2 = calc_overlap_2D(alpha=alpha2, r=rad, bound="circle")
    overlap3 = calc_overlap_2D(alpha=alpha3, r=rad, bound="circle")
    #then
    expect_equal(overlap1, o1/(pi*rad^2))
    expect_equal(overlap2, o2/(pi*rad^2))
    expect_equal(overlap3, 1)
  }
)

test_that(
  'Overlap Annulus', {
  #given
  R_big = 2
  r_lit = 1
  total = pi*3
  #First overlap
  alpha1 = 0.25 # 0 < 0.5 < 1
  alpha2 = 0.75 # 1 < 1.5 < 2
  alpha5 = 1.2  # 2 < 2.4 < 3
  alpha3 = 1.7  # 3 < 3.4 < 4
  alpha4 = 3    # 4 < 6
  theta1 = 2*acos(0.125)
  theta2 = 2*acos(0.96875)
  a1 = 0.5*(theta1-sin(theta1))*0.5^2
  a2 = 0.5*(theta2-sin(theta2))*2^2
  o1 = a1+a2
  #Second overlap
  theta1 = 2*acos(0.375)
  theta2 = 2*acos(0.71875)
  theta3 = 2*acos(((2*alpha2)^2+R_big^2-r_lit^2)/(2*(2*alpha2)*R_big))
  theta4 = 2*acos((R_big^2+r_lit^2-(2*alpha2)^2)/(2*r_lit*R_big))
  a1 = 0.5*(theta1-sin(theta1))*1.5^2
  a2=0
  if (2*alpha2 < 2*sqrt(2)){
    a2 = R_big^2*0.5*(theta2 - sin(theta2))
  } else {
    a2 = R_big^2*0.5*(theta2 + sin((2*pi-theta2)))
  }
  a3 = 1.5^2*0.5*(theta3 - sin(theta3))
  a4 = 0
  if ((2*alpha2)^2 < r_lit^2+R_big^2){
    a4 = r_lit^2*0.5*(theta4 - sin(theta4))
  } else {
    a4 = r_lit^2*0.5*(theta4 + sin((2*pi-theta4)))
  }
  o2 = a1+a2-a3-a4
  #Third overlap
  theta1 = 2*acos(0.85)
  theta2 = 2*acos(-0.445)
  a1 = 0.5*(theta1-sin(theta1))*(2*alpha3)^2
  a2=0 
  if (alpha3*2 < (R_big*sqrt(2))){
    a2 = R_big^2 * 0.5 * (theta2 - sin(theta2))
  } else {
    a2 = R_big^2 * 0.5 * (theta2 + sin((2 * pi - theta2)))
  }
  o3 = a1+a2
  #Fifth overlap
  theta1 = 2*acos(0.6)
  theta2 = 2*acos(0.28)
  theta3 = 2*acos(((2*alpha5)^2+R_big^2-r_lit^2)/(2*(2*alpha5)*R_big))
  theta4 = 2*acos((R_big^2+r_lit^2-(2*alpha5)^2)/(2*r_lit*R_big))
  a1 = 0.5*(theta1-sin(theta1))*2.4^2
  a2=0
  if (2*alpha5<2*sqrt(2)){
    a2 = R_big^2*0.5*(theta2 - sin(theta2))
  } else {
    a2 = R_big^2*0.5*(theta2 + sin((2*pi-theta2)))
  }
  a3 = 2.4^2*0.5*(theta3 - sin(theta3))
  a4 = 0
  if ((2*alpha5)^2 < r_lit^2+R_big^2){
    a4 = r_lit^2*0.5*(theta4 - sin(theta4))
  } else {
    a4 = r_lit^2*0.5*(theta4 + sin((2*pi-theta4)))
  }
  o5 = a1+a2-a3-a4
  #when
  overlap1 = calc_overlap_2D(alpha=alpha1, r=R_big, rmin=r_lit, bound="annulus")
  overlap2 = calc_overlap_2D(alpha=alpha2, r=R_big, rmin=r_lit, bound="annulus")
  overlap3 = calc_overlap_2D(alpha=alpha3, r=R_big, rmin=r_lit, bound="annulus")
  overlap4 = calc_overlap_2D(alpha=alpha4, r=R_big, rmin=r_lit, bound="annulus")
  overlap5 = calc_overlap_2D(alpha=alpha5, r=R_big, rmin=r_lit, bound="annulus")
  #then
  expect_equal(overlap1, o1/total)
  expect_equal(overlap2, o2/total)
  expect_equal(overlap3, (o3 - pi*r_lit^2)/total)
  expect_equal(overlap4, 1)
  expect_equal(overlap5, o5/total)
  }
)

Try the ashapesampler package in your browser

Any scripts or data that you put into this service are public.

ashapesampler documentation built on May 29, 2024, 3:22 a.m.