* Logs Analysis
** R Scripts
*** Plots script
    #+BEGIN_SRC R :results output  :noweb yes  :file second-final/plot.png
      <<RUtils>>
      dataOrig=loadData("./second-final/data.csv")

      data=dataOrig%>%filter(simKey=="nbSensors")%>%filter(state=="sim",nbSensors==100)
      dataIDLE=dataOrig%>%filter(simKey=="nbSensors")%>%filter(state!="sim",nbSensors==100)
      data=data%>%mutate(meanEnergy=mean(energy))
      dataIDLE=dataIDLE%>%mutate(meanEnergy=mean(energy))
      data=rbind(data,dataIDLE)
      ggplot(data,aes(x=time,y=energy))+geom_point(position="jitter")+xlab(getLabel("time"))+expand_limits(y=0)+facet_wrap(~state)+geom_hline(aes(color=state,yintercept=mean(meanEnergy)))
      ggsave("./second-final/plot.png",dpi=180)
    #+END_SRC

    #+RESULTS:
    #+begin_example
    # A tibble: 3,050 x 8
                ts energy simKey    vmSize nbSensors   time state meanEnergy
             <dbl>  <dbl> <chr>      <dbl>     <dbl>  <dbl> <chr>      <dbl>
     1 1558429001.   90.2 nbSensors   2048       100 0      IDLE        90.8
     2 1558429001.   89   nbSensors   2048       100 0.0199 IDLE        90.8
     3 1558429001.   89   nbSensors   2048       100 0.0399 IDLE        90.8
     4 1558429001.   90.8 nbSensors   2048       100 0.0599 IDLE        90.8
     5 1558429001.   91   nbSensors   2048       100 0.0799 IDLE        90.8
     6 1558429001.   90.5 nbSensors   2048       100 0.1000 IDLE        90.8
     7 1558429001.   89.9 nbSensors   2048       100 0.120  IDLE        90.8
     8 1558429001.   88.6 nbSensors   2048       100 0.140  IDLE        90.8
     9 1558429001.   88.6 nbSensors   2048       100 0.160  IDLE        90.8
    10 1558429001.   90.5 nbSensors   2048       100 0.180  IDLE        90.8
    # … with 3,040 more rows
    #+end_example


    



**** Final plot

    #+BEGIN_SRC R :results graphics  :noweb yes :file second-final/plot-final.png :session *R*
      <<RUtils>>
      data=loadData("./second-final/data.csv")
      data=data%>%filter(state=="sim",simKey=="nbSensors")


      # Cloud
      data10=data%>%filter(nbSensors==20)%>%mutate(meanEnergy=mean(energy)) %>% slice(1L)
      data100=data%>%filter(nbSensors==100)%>%mutate(meanEnergy=mean(energy)) %>% slice(1L)
      data300=data%>%filter(nbSensors==300)%>%mutate(meanEnergy=mean(energy)) %>% slice(1L)
      dataCloud=rbind(data10,data100,data300)%>%mutate(nbSensors=as.character(nbSensors))

      # Network
      dataNet=loadData("../../ns3-simulations/logs/data.csv")
      dataNet=dataNet%>%filter(simKey=="NBSENSORS")
      data5=dataNet%>%filter(sensorsNumber==5)%>%select(networkEnergy,sensorsNumber)
      data10=dataNet%>%filter(sensorsNumber==10)%>%select(networkEnergy,sensorsNumber)
      
      print(data20)

      ggplot(dataCloud)+geom_bar(aes(x=nbSensors,y=meanEnergy),stat="identity")+xlab("Sensors Number")+ylab("Power Consumption (W)")
      ggsave("./second-final/plot-final.png",dpi=80)

    #+END_SRC

    #+RESULTS:




    #+BEGIN_SRC R :noweb yes :results graphics  :file final.png :session *R*
      <<RUtils>>


      data=loadData("./second-final/data.csv")
      data=data%>%filter(state=="sim",simKey=="nbSensors")

      # Cloud
      data10=data%>%filter(nbSensors==20)%>%mutate(energy=mean(energy)) %>% slice(1L)
      data100=data%>%filter(nbSensors==100)%>%mutate(energy=mean(energy)) %>% slice(1L)
      data300=data%>%filter(nbSensors==300)%>%mutate(energy=mean(energy)) %>% slice(1L)
      dataCloud=rbind(data10,data100,data300)%>%mutate(sensorsNumber=nbSensors)%>%mutate(type="Cloud")%>%select(sensorsNumber,energy,type)



      approx=function(data1, data2,nbSensors){
        x1=data1$sensorsNumber
        y1=data1$energy

        x2=data2$sensorsNumber
        y2=data2$energy

        a=((y2-y1)/(x2-x1))
        b=y1-a*x1

        return(a*nbSensors+b)

      }


      simTime=1800

      # Network
      data=read_csv("../../ns3-simulations/logs/data.csv")
      data=data%>%filter(simKey=="NBSENSORS")
      dataC5=data%>%filter(sensorsNumber==5)%>% mutate(energy=networkEnergy/simTime) %>%select(energy,sensorsNumber)
      dataC10=data%>%filter(sensorsNumber==10)%>%mutate(energy=networkEnergy/simTime) %>%select(energy,sensorsNumber)
      dataNet=rbind(dataC5,dataC10)%>%mutate(type="Network")

      # Sensors
      dataS5=data%>%filter(sensorsNumber==5)%>% mutate(energy=sensorsEnergy/simTime) %>%select(energy,sensorsNumber) 
      dataS10=data%>%filter(sensorsNumber==10)%>%mutate(energy=sensorsEnergy/simTime) %>%select(energy,sensorsNumber) 
      dataS=rbind(dataS5,dataS10)%>%mutate(type="Sensors")

      fakeNetS=tibble(
        sensorsNumber=c(20,100,300,20,100,300),
        energy=c(dataC10$energy,approx(dataC5,dataC10,100),approx(dataC5,dataC10,300),dataS10$energy,approx(dataS5,dataS10,100),approx(dataS5,dataS10,300)),
        type=c("Network","Network","Network","Sensors","Sensors","Sensors")
      )

      fakeNetS=fakeNetS%>%mutate(sensorsNumber=as.character(sensorsNumber))
      dataCloud=dataCloud%>%mutate(sensorsNumber=as.character(sensorsNumber))

      data=rbind(fakeNetS,dataCloud)%>%mutate(sensorsNumber=as.character(sensorsNumber))


      data=data%>%mutate(sensorsNumber=fct_reorder(sensorsNumber,as.numeric(sensorsNumber)))

      ggplot(data)+geom_bar(position="dodge2",colour="black",aes(x=sensorsNumber,y=energy,fill=type),stat="identity")+ 
      xlab("Sensors Number")+ylab("Power Consumption (W)")+guides(fill=guide_legend(title="Part"))
      ggsave("final.png",dpi=80)

    #+END_SRC

    #+RESULTS:
    [[file:final.png]]





*** R Utils
    RUtils is intended to load logs (data.csv) and providing
    simple plot function for them.

    #+NAME: RUtils
    #+BEGIN_SRC R :eval never
      library("tidyverse")

      # Fell free to update the following
      labels=c(time="Time (s)")
   
      loadData=function(path){
        data=read_csv(path)
      }

      # Get label according to varName
      getLabel=function(varName){
        if(is.na(labels[varName])){
          return(varName)
        }
        return(labels[varName])
      }
    #+END_SRC
    
** Plots -> PDF
   Merge all plots in plots/ folder into a pdf file.
   #+NAME: plotToPDF
   #+BEGIN_SRC bash :results output :noweb yes
     orgFile="plots/plots.org"
     <<singleRun>> # To get all default arguments

     # Write helper function
     function write {
         echo "$1" >> $orgFile
     }

     echo "#+TITLE: Analysis" > $orgFile
     write "#+LATEX_HEADER: \usepackage{fullpage}"
     write "#+OPTIONS: toc:nil"
     # Default arguments
     write '\begin{center}'
     write '\begin{tabular}{lr}'
     write 'Parameters & Values\\'
     write '\hline'
     write "sensorsPktSize & ${sensorsPktSize} bytes\\\\"
     write "sensorsSendInterval & ${sensorsSendInterval}s\\\\"
     write "sensorsNumber & ${sensorsNumber}\\\\"
     write "nbHop & ${nbHop}\\\\"
     write "linksBandwidth & ${linksBandwidth}Mbps\\\\"
     write "linksLatency & ${linksLatency}ms\\\\"
     write '\end{tabular}'
     write '\newline'
     write '\end{center}'

     for plot in $(find plots/ -type f -name "*.png")
     do
         write "\includegraphics[width=0.5\linewidth]{$(basename ${plot})}"
     done

     # Export to pdf
     emacs $orgFile --batch -f org-latex-export-to-pdf --kill  
   #+END_SRC

 
** CSVs -> CSV
   Merge all energy file into one (and add additional fields).

   #+NAME: mergeCSV
   #+BEGIN_SRC sh
     #!/bin/bash

     whichLog="second-final"


     logFile="$(dirname $(readlink -f $0))"/$whichLog/simLogs.txt
     dataFile=$(dirname "$logFile")/data.csv


     getValue () {
         line=$(echo "$1" | grep "Simulation para"|sed "s/Simulation parameters: //g")
         key=$2
         echo "$line"|awk 'BEGIN{RS=" ";FS=":"}"'$key'"==$1{gsub("\n","",$0);print $2}'
     }

     ##### Add extract info to energy #####
     IFS=$'\n'
     for cmd in $(cat $logFile|grep "Simulation parameters")
     do
         nodeName=$(getValue $cmd serverNodeName)
         from=$(getValue $cmd simStart)
         to=$(getValue $cmd simEnd)
         vmSize=$(getValue $cmd vmSize)
         nbSensors=$(getValue $cmd nbSensors)
         simKey=$(getValue $cmd simKey)
         csvFile="$whichLog/${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}.csv"
         csvFileIDLE="$whichLog/${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}_IDLE.csv"
         tmpFile=${csvFile}_tmp
         echo ts,energy,simKey,vmSize,nbSensors,time,state > $tmpFile
         minTs=$(tail -n+2 $csvFile|awk -F"," 'BEGIN{min=0}$1<min||min==0{min=$1}END{print(min)}') # To compute ts field
         minTsIDLE=$(tail -n+2 $csvFileIDLE|awk -F"," 'BEGIN{min=0}$1<min||min==0{min=$1}END{print(min)}') # To compute ts field
         tail -n+2 ${csvFile} | awk -F"," '{print $0",'$simKey','$vmSize','$nbSensors',"$1-'$minTs'",sim"}' >> $tmpFile
         tail -n+2 ${csvFileIDLE} | awk -F"," '{print $0",'$simKey','$vmSize','$nbSensors',"$1-'$minTsIDLE'",IDLE"}' >> $tmpFile
     done


     ##### Fill dataFile #####
     echo ts,energy,simKey,vmSize,nbSensors,time,state > $dataFile
     for tmpFile in $(find ${whichLog}/*_tmp -type f)
     do
         tail -n+2 $tmpFile >> $dataFile
         rm $tmpFile # Pay attention to this line :D
     done
   #+END_SRC

   #+RESULTS: mergeCSV



** Custom Plots

   #+NAME: ssiNet
   #+BEGIN_SRC R :noweb yes :results graphics :file plots/sensorsSendInterval-net.png
     <<RUtils>>

     data%>%filter(simKey=="SENDINTERVAL",sensorsNumber==20) %>% ggplot(aes(x=sensorsSendInterval,y=networkEnergy))+xlab(getLabel("sensorsSendInterval"))+ylab(getLabel("networkEnergy"))+
     geom_line()+labs(title="For 20 sensors")
     ggsave("plots/sensorsSendInterval-net.png",dpi=80)
   #+END_SRC

   #+RESULTS:
   [[file:plots/sensorsSendInterval-net.png]]

   
   #+NAME: ssiWifi
   #+BEGIN_SRC R :noweb yes :results graphics :file plots/sensorsSendInterval-wifi.png
     <<RUtils>>
     data%>%filter(simKey=="SENDINTERVAL",sensorsNumber==20) %>% ggplot(aes(x=sensorsSendInterval,y=sensorsEnergy))+xlab(getLabel("sensorsSendInterval"))+ylab(getLabel("sensorsEnergy"))+
     geom_line() +     geom_line()+labs(title="For 20 sensors")
     ggsave("plots/sensorsSendInterval-wifi.png",dpi=80)
   #+END_SRC

   #+RESULTS: ssiWifi
   [[file:plots/sensorsSendInterval-wifi.png]]

   #+RESULTS:
   [[file:plots/sensorsSendInterval.png]]