#!/usr/bin/env -S gnuplot -c
datafilename = '../data/tc.dat'

set style line 101 lc rgb '#808080' lt 1 lw 1
set border 3 front ls 101
set tics nomirror out scale 0.75
set linetype 99963 dashtype (6, 0, 0, 10)
set style line 102 lc rgb '#d6d7d9' lt 99963 lw 1
set grid back ls 102

TC = 2.268

# Temperatura crítica:

t1(x) = a1*x + b1
t2(x) = a2*x + b2

fit t1(x) datafilename using (1/$1):2 via a1, b1
fit t2(x) datafilename using (1/$1):4 via a2, b2

do for [IDX = 0:1] {
  if (IDX == 0) {
    set terminal cairolatex size 8.5cm, 6cm
    set output 'tc.tex'
    set xlabel '$1/L$'
    set ylabel '$T_c$'
    tccv = '$(T_c)_{c_V}$'
    tcsusc = '$(T_c)_\chi$'
    set key spacing 2
  } else {
    set terminal svg dashed size 600, 400 font "Computer Modern,Tinos,Helvetica,15"
    set output 'tc.svg'
    set xlabel "1/L"
    set ylabel "T_c"
    tccv = '(T_c)_(c_V)'
    tcsusc = '(T_c)_\chi'
    set key spacing 1.25
  }

  set xrange [0:*]
  set key top left
  #set key outside top horizontal
  plot datafilename using (1/$1):2:(0.005) with yerr title tccv, \
       datafilename using (1/$1):4:(0.005) with yerr title tcsusc, \
       t1(x) notitle, t2(x) notitle
}

set autoscale x

# Exponent nu

f1(x) = a1*x + b1
f2(x) = a2*x + b2

fit f1(x) datafilename using (log($1)):(log($2 - TC)) via a1, b1
fit f2(x) datafilename using (log($1)):(log($4 - TC)) via a2, b2

do for [IDX = 0:1] {
  if (IDX == 0) {
    set terminal cairolatex size 8.5cm, 6cm
    set output 'nu.tex'
    set xlabel '$\log(L)$'
    set ylabel '$\log((T_c)_L - T_c)$'
    nucv = '$c_V$'
    nususc = '$\chi$'
    set key spacing 2
  } else {
    set terminal svg dashed size 600, 400 font "Computer Modern,Tinos,Helvetica,15"
    set output 'nu.svg'
    set xlabel "log(L)"
    set ylabel "log((T_c)_L - T_c)"
    nucv = 'c_V'
    nususc = '\chi'
    set key spacing 1.25
  }

  set key top right
  plot datafilename using (log($1)):(log($2 - TC)):(0.011/($2 - TC)) with yerr title nucv, \
       datafilename using (log($1)):(log($4 - TC)):(0.011/($4 - TC)) with yerr title nususc, \
       f1(x) notitle, f2(x) notitle
}

# Exponent alfa

fa(x) = a*x + b

fit fa(x) datafilename using (log($1)):(log($3)) via a, b

do for [IDX = 0:1] {
  if (IDX == 0) {
    set terminal cairolatex size 8.5cm, 6cm
    set output 'alpha.tex'
    set xlabel '$\log(L)$'
    set ylabel '$\log(c_V^\text{c})$'
    set key spacing 2
  } else {
    set terminal svg dashed size 600, 400 font "Computer Modern,Tinos,Helvetica,15"
    set output 'alpha.svg'
    set xlabel "log(L)"
    set ylabel "log(c_V c)"
    set key spacing 1.25
  }

  set key top left
  plot datafilename using (log($1)):(log($3)):($6/$3) with yerr title 'Dades', \
       fa(x) notitle
}

# Exponent gamma

fg(x) = a*x + b

fit fg(x) datafilename using (log($1)):(log($5)) via a, b

do for [IDX = 0:1] {
  if (IDX == 0) {
    set terminal cairolatex size 8.5cm, 6cm
    set output 'gamma.tex'
    set xlabel '$\log(L)$'
    set ylabel '$\log(\chi^\text{c})$'
    set key spacing 2
  } else {
    set terminal svg dashed size 600, 400 font "Computer Modern,Tinos,Helvetica,15"
    set output 'gamma.svg'
    set xlabel "log(L)"
    set ylabel "log(chi c)"
    set key spacing 1.25
  }

  set key top left
  plot datafilename using (log($1)):(log($5)):($7/$5) with yerr title 'Dades', \
       fa(x) notitle
}

# Exponent beta

fb1(x) = a1*x + b1
fb2(x) = a2*x + b2

fit fb1(x) datafilename using (log($1)):(log($8/$1**2)) via a1, b1
fit fb2(x) datafilename using (log($1)):(log($9/$1**2)) via a2, b2

do for [IDX = 0:1] {
  if (IDX == 0) {
    set terminal cairolatex size 8.5cm, 6cm
    set output 'beta.tex'
    set xlabel '$\log(L)$'
    set ylabel '$\log(\langle |m|^\text{c} \rangle)$'
    nucv = '$c_V$'
    nususc = '$\chi$'
    set key spacing 2
  } else {
    set terminal svg dashed size 600, 400 font "Computer Modern,Tinos,Helvetica,15"
    set output 'beta.svg'
    set xlabel "log(L)"
    set ylabel "log(<|m|^c>)"
    nucv = 'c_V'
    nususc = '\chi'
    set key spacing 1.25
  }

  set key top right
  plot datafilename using (log($1)):(log($8/$1**2)):($10/($8)) with yerr title nucv, \
       datafilename using (log($1)):(log($9/$1**2)):($11/($9)) with yerr title nususc, \
       f1(x) notitle, f2(x) notitle
}
