#----------------------------------------------------------------------
# Esperimento di affondamenti in acqua (FisAI 1/3/2023)
# Variante che non usa lm() di R, bensì si calcola la slope 
# mediante opportuna funzione 'fatta a mano' 
# la quale 
#  - elimina l'eventuale dato NA
#  - usa la funzione mean() di R per calcolare la media
#    (eventualmente farsela a mano in Python)
#----------------------------------------------------------------------

pausa <- function() { cat ("\n >> press Enter to continue\n"); scan() }

# funzione che calcola la pendenza  della retta 
# che per passa per l'origine e 'fra i punti'
slope <- function(x, y){
   # togliamo eventuale NA finale 
    y <- y[!is.na(y)]
    l <- length(y)
    x <- x[1:l]
   # calcoliamo la slope 
   return(  mean(x*y)/mean(x^2) )
}

# leggi i dati dal file
dati <- read.table("misure_affondamenti.dat", header=TRUE)

# cominciamo a dare un'occhiata generale
print(dati)
plot(dati, col='blue', pch=19)

# mettiamo i dati in comodi 'vettori', 
# sottraendo ai valori la lettura prima dell'immersione
x  <- dati$x  - dati$x[1]
y1 <- dati$y1 - dati$y1[1]
y2 <- dati$y2 - dati$y2[1]
y3 <- dati$y3 - dati$y3[1]
y4 <- dati$y4 - dati$y4[1]
# n  <- length(x)

pausa()

plot(x, y1, xlab='affondamento (cm)', ty='b',
     ylab="massa d'acqua spostata (g)",
     pch=1, cex=1.5, col='darkblue',
     main="Massa d'acqua spostata in funzione dell'affondamento")
grid()
points(x, y2, pch=1, ty='b', cex=1.5, col='blue')
points(x, y3, pch=17, ty='b', cex=1.5, col='orange')
points(x, y4, pch=19, ty='b', cex=1.5, col='darkgray')
legend('topleft', legend=c("Cilindro 1", "Cilindro 2", "Prisma", "Cono"),
       lty=1, cex=1.5,
       col=c("darkblue", "blue","orange", "darkgray"),
       text.col=c("darkblue", "blue","orange", "darkgray"),
       box.col='gray')

pausa()

# per fare quattro plot nella finestra grafica
 par(mfrow= c(2,2) )

# soli dati dei cilindri (dipendenza lineare fra x e y)
plot(x, y1, xlab='affondamento (cm)', ylab="massa d'acqua spostata (g)",
     main='Cilindri', pch=1, cex=1.5, col='darkblue', xaxs = "i", yaxs = "i")
grid()
points(x, y2, pch=1, cex=1.5, col='blue')

# tracciamo rette che passano 'fra i punti',  
# imponendo loro il passaggio per l'origine
m1 <- slope(x, y1)
cat(sprintf("Cilindro 1: coef. di linearità: %f\n", m1))
abline(0, m1, col='darkblue')

m2 <- slope(x, y2)
cat(sprintf("Cilindro 2: coef. di linearità: %f\n", m2))
abline(0, m2, col='blue')

pausa()
# Prisma: plot in funzione di x^2 
plot(x^2, y3, xlab='affondamento^2 (cm^2)', ylab="massa d'acqua spostata (g)",
     main='Prisma', pch=17, cex=1.5, col='orange', xaxs = "i", yaxs = "i",
     xlim=c(0,40), ylim=c(0,20))
grid()
m3 <- slope(x^2, y3)
cat(sprintf("Prisma: coef. di linearità (vs x^2!): %f\n", m3))
abline(0, m3, col='orange')

pausa()
# Prisma: plot in funzione di x^3
plot(x^3, y4, xlab='affondamento^3  (cm^3)', ylab="massa d'acqua spostata  (g)",
     main='Cono', pch=17, cex=1.5, col='darkgray', xaxs = "i", yaxs = "i",
     xlim=c(0,150), ylim=c(0,10))
grid()
m4 <- slope(x^3, y4)
cat(sprintf("Cono: coef. di linearità (vs x^3!): %f\n", m4))
abline(0, m4, col='darkgray')

# plot vuoto con i risultati dei coefficienti di linearità (slopes)
plot(NULL,  xaxt = 'n', yaxt = 'n', bty = 'n', pch = '',
     ylab = '', xlab = '', xlim=c(0,10), ylim=c(0,10))
text(-0.5, 7.5, sprintf("Slopes:\n"), cex=1.8, col='black', pos=4)
text(0.5, 6, sprintf("Cilindro 1:   %.3f   g/cm \n", m1),
     cex=1.8, col='darkblue', pos=4)
text(0.5, 5, sprintf("Cilindro 2:   %.3f   g/cm \n", m2),
     cex=1.8, col='blue', pos=4)
text(0.5, 4, sprintf("Prisma:       %.3f   g/cm^2 \n", m3),
     cex=1.8, col='orange', pos=4)
text(0.5, 3, sprintf("Cono:          %.3f   g/cm^3\n", m4),
     cex=1.8, col='darkgray', pos=4)

pausa()
text(-0.5, 1, sprintf("Attenzione alle cifre significative!\n"),
     cex=1.7, col='red', pos=4)
text(-0.5, 0, sprintf("[ Quali cifre sono veramente significative?\n"),
     cex=1.5, col='gray', pos=4)
text(-0.5, -0.7, sprintf("  ---> analisi incertezze di misura! ]\n!"),
     cex=1.5, col='gray', pos=4)

# resettiamo a un solo plot nella finestra grafica 
par(mfrow= c(1,1) )

pausa()

# ripetiamo il plot con i quattro andamenti sperimentali
# aggiungendo anche le curve che 'passano' per i punti
plot(x, y1, xlab='affondamento (cm)', ty='b',
     ylab="massa d'acqua spostata (g)",
     pch=1, cex=1.5, col='darkblue',
     main="Massa d'acqua spostata in funzione dell'affondamento")
grid()
pausa()
xi <- seq(0, 6, by=0.1)
points(xi,  m1*xi, ty='l', lty=2, col='darkblue')
pausa()
points(x, y2, pch=1, ty='b', cex=1.5, col='blue')
pausa()
points(xi,  m2*xi, ty='l', lty=2, col='blue')
pausa()
points(x, y3, pch=17, ty='b', cex=1.5, col='orange')
pausa()
points(xi,  m3*xi^2, ty='l', lty=2, col='orange')
pausa()
points(x, y4, pch=19, ty='b', cex=1.5, col='darkgray')
pausa()
points(xi,  m4*xi^3, ty='l', lty=2, col='darkgray')
legend('topleft', legend=c("Cilindro 1", "Cilindro 2", "Prisma", "Cono"),
       lty=1, cex=1.5,
       col=c("darkblue", "blue","orange", "darkgray"),
       text.col=c("darkblue", "blue","orange", "darkgray"),
       box.col='gray')
