* Logs Analysis ** R Scripts *** Plots script #+BEGIN_SRC R :results output :noweb yes :file second-final/plot.png <> 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 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* <> 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* <> 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" <> # 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> $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 <> 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 <> 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]]