Adding more analysis to the OFR Analysis

This commit is contained in:
tschan_d committed 2026-07-06 18:48:23 +02:00
1 parent e18c0c4ea7
commit fcb58b6dbe
5 files changed
+124 -125

No files matched your search

+57 -5
View File
@@ -197,12 +197,13 @@ class OFRSample:
class OFRAnalyser:
def __init__(self, source_file, sample_number_list, data_separator = ',') -> None:
def __init__(self, data_source_file, sample_number_list, data_separator = ',') -> None:
self.source_file = source_file
self.data_source_file = data_source_file
self.flow_source_file = None
self.__data_separator = data_separator
with open(self.source_file, 'r', errors = 'ignore') as file:
with open(self.data_source_file, 'r', errors = 'ignore') as file:
for i, line in enumerate(file.readlines()):
if i == 17:
items = line.split(',')
@@ -214,6 +215,7 @@ class OFRAnalyser:
self.sample_number_list = sample_number_list
self.data = None
self.flow_data = None
def __sample_number_list_check(self, sample_number_list) -> None:
@@ -236,7 +238,7 @@ class OFRAnalyser:
times = []
for sample_number in self.sample_number_list:
sample = OFRSample(source_file=self.source_file, sample_number = sample_number, data_separator = self.__data_separator)
sample = OFRSample(source_file=self.data_source_file, sample_number = sample_number, data_separator = self.__data_separator)
numbers.append(sample.Count.integrate())
lengths.append(sample.Length.integrate() / 1E6)
@@ -254,8 +256,58 @@ class OFRAnalyser:
'Density (pg/μm^3)': densities,
'Mass (mg/cm^3)': masses,
'Time (s)': times})
def GetFlowData(self, flow_source_file):
# For a step diagram
self.flow_source_file = flow_source_file
dry_air_flows = []
species_flows = []
ozone_flows = []
cnc_flows = []
starts = []
stops = []
out_flag = False
with open(self.flow_source_file, 'r', errors='ignore') as file:
i = 0
for line_counter, line in enumerate(file.readlines()):
if out_flag == True:
continue
if line_counter == 2:
items = line.split()
start_time = float(items[-1])
if line_counter == 6:
items = line.split()
dry_air_flows.append(float(items[0]))
species_flows.append(float(items[1]))
ozone_flows.append(float(items[2]))
cnc_flows.append(float(items[-1]))
starts.append(start_time)
stops.append(float(items[3]) * float(items[4]) + start_time)
i += 1
elif line_counter > 6 and not line.startswith('-'):
items = line.split()
dry_air_flows.append(float(items[0]))
species_flows.append(float(items[1]))
ozone_flows.append(float(items[2]))
cnc_flows.append(float(items[-1]))
starts.append(stops[i-1])
stops.append(stops[i-1] + float(items[3]) * float(items[4]))
i += 1
if line_counter > 6 and line.startswith('-'):
out_flag = True
else:
continue
self.flow_data = pd.DataFrame({'Dry Air (L/min)': dry_air_flows, 'Species (L/min)': species_flows, 'Ozone (L/min)': ozone_flows, 'Start (s)': starts, 'Stop (s)': stops, 'CNC Flow (L/min)': cnc_flows})
def GetCumulativeMass(self):
pass
### ----------------------------------------------------------------------------------------------------------------------------------- ###
###
+7 -11
View File
@@ -2,21 +2,17 @@
#%%
from defs.computing import OFRSample, OFRAnalyser
import numpy as np
from bokeh.plotting import figure, show
from pathlib import Path
# Path to the source file
source_file = Path(r"C:\Users\tschan_d\Documents\data_local\20260612_SET02_EXP01_full.txt")
flow_source_file = Path(r"C:\Users\tschan_d\Documents\data_local\20260612_SET02_EXP01_full_flows.txt")
#%%
# Plotting one of the spectra to show properties
# first load and get the data of sample 57 (arbitrary)
sample = OFRSample(source_file = source_file, sample_number = 150)
# Now plot the spectrum
p = figure(width = 600, height = 400, x_axis_type='log')
p.line(x = sample.Count.var, y = sample.Count.fct)
show(p)
analyser = OFRAnalyser(data_source_file=source_file, sample_number_list=range(1, 157))
analyser.Analyse()
analyser.GetFlowData(flow_source_file=flow_source_file)
print(analyser.flow_data)
# %%
+60 -109
View File
@@ -10,7 +10,7 @@
},
{
"cell_type": "code",
"execution_count": 137,
"execution_count": null,
"id": "8769766b",
"metadata": {},
"outputs": [],
@@ -26,7 +26,8 @@
"import pandas as pd\n",
"\n",
"# Specify the source file for this analysis\n",
"source_file = Path(r\"C:\\Users\\tschan_d\\Documents\\data_local\\20260612_SET02_EXP01_full.txt\")"
"source_file = Path(r\"C:\\Users\\tschan_d\\Documents\\data_local\\20260612_SET02_EXP01_full.txt\")\n",
"flow_source_file = Path(r\"C:\\Users\\tschan_d\\Documents\\data_local\\20260612_SET02_EXP01_full_flows.txt\")"
]
},
{
@@ -39,21 +40,10 @@
},
{
"cell_type": "code",
"execution_count": 114,
"execution_count": null,
"id": "76a9b026",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA/MAAAJjCAYAAABA7UFUAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAA469JREFUeJzs3Qd4k9UXBvCXvffegrL3HgoiIFsEBAVkiLJU/rgXDgQVxYEgioqCDAFlCIiyBEFAlshegjLL3kM29P+895pSSltKm+RL8r2/5wn9SNPk9iZtc7577jmJwsPDwyEiIiIiIiIiQSOx0wMQERERERERkVujYF5EREREREQkyCiYFxEREREREQkyCuZFREREREREgoyCeREREREREZEgo2BeREREREREJMgomBcREREREREJMgrmRURERERERIKMgnkRERERERGRIOPqYP7XX3/Fo48+imLFiiFNmjTIkycP7r//fvz555/R3n7VqlWoV68e0qZNi4wZM6Jly5bYvn37dbfZunUrnn/+eVSsWNHcJnPmzLjzzjsxadKkGMcxbdo03H333UifPr0ZR8mSJTFs2LA4fx9xGZfHrl27zPecO3dupEiRwnzPLVq0iNPjnD59Gi+++CLq16+PbNmyIVGiRHjzzTdvuN2VK1cwcOBANGzYEHnz5kXq1KlRvHhxvPzyyzhx4kScHuvff//FgAEDULZsWTMv6dKlw+23344HH3wQv/32W8TtFixYYMYR02XkyJHmEtttPJfbbrst4n4PHTqERx55BFmzZjXjr169OubNm3fdGE+dOoV33nkHtWvXRs6cOc38ly5d2oz7/PnzMX5vFSpUwFNPPWWO+Rixjclj9OjR5v/RvS6WLFmCJEmSmNedB8cU+X5SpUpl5nLQoEG4evXqdV/P1wpfM3zt8Hu49957zWsqKo6hTZs2KFq0KBInTnzdfCXE8uXLzWswf/785jWZI0cOM9/PPfccAh2fP2/NA3leqylTpjQ/q1HxeS1VqhS8qUuXLuY++fzzdVKkSBG88MILOHLkyHW3W7NmDZo0aWKeJ96Ov9v4PH377bdeHY+IiIiIxE1SuNjnn3+Oo0ePmsCqRIkSOHz4MD766CNUq1YNs2fPRp06dSJuu2XLFvNGuly5cpgwYYIJ1t544w3UrFnTvMllcEtz5szBzz//jA4dOqBy5cq4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 truncated
"text/plain": [
"<Figure size 1000x600 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"outputs": [],
"source": [
"# First load and get the data of sample 33 (arbitrary) and create a sample object\n",
"sample_number = 33\n",
@@ -95,51 +85,16 @@
},
{
"cell_type": "code",
"execution_count": 115,
"execution_count": null,
"id": "8db19b57",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" Sample Number (#/cm^3) Length (mm/cm^3) Surface (mm^2/cm^3) \\\n",
"0 1 3.090062e+00 0.001888 1.241420e-05 \n",
"1 2 3.454977e+00 0.000126 3.560755e-08 \n",
"2 3 9.325444e+00 0.001036 8.623624e-07 \n",
"3 4 4.171921e+02 0.402549 2.812996e-03 \n",
"4 5 1.052317e+05 6.641894 4.353249e-03 \n",
".. ... ... ... ... \n",
"151 152 9.529171e+05 177.681731 3.199811e-01 \n",
"152 153 1.017064e+06 181.659088 3.188865e-01 \n",
"153 154 1.041903e+06 186.626996 3.273445e-01 \n",
"154 155 1.008587e+06 181.815120 3.214411e-01 \n",
"155 156 9.957403e+05 182.039508 3.234802e-01 \n",
"\n",
" Volume (μm^3/cm^3) Density (pg/μm^3) Mass (mg/cm^3) Time (s) \n",
"0 0.836666 1.2 1.003999e-03 180.0 \n",
"1 0.000109 1.2 1.302891e-07 360.0 \n",
"2 0.007271 1.2 8.725170e-06 540.0 \n",
"3 196.905653 1.2 2.362868e-01 720.0 \n",
"4 38.618096 1.2 4.634172e-02 900.0 \n",
".. ... ... ... ... \n",
"151 7645.085680 1.2 9.174103e+00 27360.0 \n",
"152 7524.532677 1.2 9.029439e+00 27540.0 \n",
"153 7732.212330 1.2 9.278655e+00 27720.0 \n",
"154 7646.483862 1.2 9.175781e+00 27900.0 \n",
"155 7694.993582 1.2 9.233992e+00 28080.0 \n",
"\n",
"[156 rows x 8 columns]\n"
]
}
],
"outputs": [],
"source": [
"sample_number_list = [int(i) for i in range(1, 157)]\n",
"\n",
"analyser = OFRAnalyser(source_file = source_file, sample_number_list=sample_number_list)\n",
"analyser = OFRAnalyser(data_source_file = source_file, sample_number_list=sample_number_list)\n",
"analyser.Analyse()\n",
"\n",
"print(analyser.data)"
"analyser.GetFlowData(flow_source_file = flow_source_file)"
]
},
{
@@ -152,21 +107,10 @@
},
{
"cell_type": "code",
"execution_count": 134,
"execution_count": null,
"id": "a4477003",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA/MAAAGbCAYAAACIxMC9AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjksIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvJkbTWQAAAAlwSFlzAAAPYQAAD2EBqD+naQAA2nJJREFUeJzsnQd4FNXXxg9JIEASeu8gRTqiIBYUsQCiiAUFRVQUK4qinwULgoqi/BUbFgSxYQFsKIgKKKgUFUSKIL1KbwkkIZD5nvfe3M1ks7vZ3Wzf9/c8k92dnezOzM7sznvPOe8pYVmWJYQQQgghhBBCCIkaEsK9AoQQQgghhBBCCPENinlCCCGEEEIIISTKoJgnhBBCCCGEEEKiDIp5QgghhBBCCCEkyqCYJ4QQQgghhBBCogyKeUIIIYQQQgghJMqgmCeEEEIIIYQQQqIMinlCCCGEEEIIISTKoJgnhBBCCCGEEEKijLgW83PmzJGBAwfKySefLCkpKVK7dm257LLL5M8//3S5/JIlS+SCCy6Q1NRUqVChglxxxRWyYcOGAsv8+++/8sADD8ipp56qlqlUqZKcddZZMnXqVLfr8dVXX8m5554r5cqVU+vRsmVLefvtt73eDm/Wy7B582a1zbVq1ZLk5GS1zZdffrlX75Oeni4PPvigXHTRRVK1alUpUaKEPPnkk4WWO3HihLz44ovSvXt3qVOnjpQtW1aaN28uDz/8sBw8eNCr9zpy5IiMHj1a2rZtq/ZLWlqanHTSSXL11VfLzz//7Fjup59+Uuvhbpo0aZKaPC1jpgYNGjhed/fu3XLjjTdKlSpV1PqfccYZMnv27ALrePjwYXnmmWekS5cuUqNGDbX/W7durdY7KyvL7ba1b99ehgwZou7jPTytk+H9999Xj10dF7/99pskJiaq486AdbK/TpkyZdS+HDt2rOTm5hb4fxwrOGZw7GAbLrzwQnVMOYN16Nu3rzRr1kwSEhIK7C9/KeqzwecbyZjjL9LXc8aMGS7PVU9YliWTJ0+Wrl27SsWKFdX3RaNGjeSuu+6SrVu3SjSA8wBTuHn00UfllFNOUb8HpUuXVvvx1ltvVd/HdrBf8X2M5/FbUL58efV/r732mhw/fjxs608IIYSQyCRJ4pg33nhD9u3bp4RVixYtZM+ePfK///1POnXqJLNmzVIXsYbVq1eri8J27drJZ599psTaE088IZ07d5a//vpLiVvw/fffy7fffivXX3+9dOjQQV2Affrpp9KnTx8ZMWKE+h87zz33nLrQu/322+WRRx6RkiVLqvc6duyYV9vg7XqBFStWqGVxoThmzBgltP/77z+1rd6AfQUxCVHYu3dveeedd1wul5mZqYRDv3795JZbblGCGOLw6aeflunTp8sff/yhxKU7MBiAAYPly5fL//3f/0nHjh3V/LVr16r/nz9/vhr8sDNq1Cg577zzCr0WBgDAggULCsyHOL/qqqvk/vvvd8yDWAHZ2dly/vnnq4GHl19+WapVqyavv/66Gpz48ccfHe+9ZcsWJY7xWQ8dOlQJYawbtv2HH35Qk12Qg40bN8rSpUvV/xmwLzCw5IkBAwbI559/rtYX+8YIaQx63HDDDdK0aVO1f+3gc/7oo48cgxNvvvmm3Hfffeozx4ADwDGPYwVibeLEiUpoPPvss+o4+f3335VwN3zwwQeyc+dO9XlgQCAnJ0cCxbvvvqsG1ZzBeRnJYGAGx1akryfEPI5hbwU9Pt9rr71WfXfhPMagC4Tl33//LS+88IIS+d98840aqIxkxo0bJ5EAvkuwHzGoiYHJVatWqfP166+/lpUrV0rlypUd5zMGLx9//HGpV6+e+h3AZ3f33Xer73N337mEEEIIiVOsOGbXrl2F5qWnp1vVq1e3zj///ALz+/TpY1WpUsU6dOiQY96mTZuskiVLWg8++KBj3p49e6zc3NxCr9uzZ0+rbNmyVlZWlmPeH3/8YSUkJFijR4/2exu8XS+sU7t27dRkXwdfwGuYbcN24vAZPnx4oeWOHz9u7d27t9D8KVOmqP/54IMPPL7PnDlz1HITJ050+fyJEycc9+fOnauWxWv7Av7nrrvucvnc66+/rp7/7bffHPNycnKsFi1aWB07dnTMy8jIUJMzL7zwgvr/+fPnF3ru+eeft6pVq+bYhhtuuMFKSUnxap137txpVa5c2erSpYvjc7jjjjusxMREa9GiRQWWPffcc62WLVsWmHfs2DGrUaNG6jjEffB///d/6ljBMWPAsYRj6uqrr3a733E8169f3you7777rtpXv//+uxVNYP/hmIgWcKz78nU/atQotfxzzz3n8jjEZ4/vyQMHDlih5MiRI1asMGPGDLWPJ0yYUOSyOBeTkpL8/u4mhBBCSGwS12n2iLg6g+gqomz2NFJE1xGFuvLKK1XUxFC/fn0VDf7iiy8c8xCFdo7GAkQzjx49Kvv373fMQ+okosGIuviDL+s1b948Fdm59957HRFoX3FO/XYHUr5NpMmOibAXlaKLDABQs2ZNl88jxTuYYL8hIo3ovSEpKUn69+8vixcvlu3bt6t5SIPF5Mt2Tps2TaXR+rMN1atXV5FGpHS/+uqrKvKP7BKUL5j39ASyPlD+geMQEXmzrchAwTFjwLGEtHtkQdhTe4O93z3xySefqGMP54yd4cOHq+MN+wJs2rRJLff888+rEghEN5FtcNpppxUqkzDZHohA47sA5wUip4hgu0qlR2YCMiNQmoJl161b5zLNHqUT+B5B1ky3bt3UMYJjGVk4YOHChXL22Wer+cioeO+99wqtFzIgbrvtNpU9U6pUKWnYsKHK7LF/HmZbkWWDshYsg/fFcYv3sK+P2SZ7CQP+3xWIBiP6jn2BshpXxyGyN3bt2iUTJkxQ8/C9gu1B6Ykz11xzjfofeyYHIv5YT/wP1hn7CRkrdsx+RIYOslEQ0UbGjC/v5SrNHtuHqDgyQfA5InvppptucpwTABlByERAlpAB39PYb9g39u8qnBc4H33FZE3hu8WbZfE+ONYJIYQQQgxxLeZdcejQIZUSjrp1w/r161XqeJs2bQotj3m4qPdUIw3mzp2rLsjsAwgQ2LhghsCDeMSFGi7eIc68SbP3Zb3wXgAXxBdffLESOLhQvuSSS5ToCAUmldy+b10B4QXhifIHpIkjLdybtGAIHefJH1CO4G6fAqTF+rOd27ZtU4MBGHxxxtW6O9e2A3gGYEJJBtLrsU7OpRtFHTMQD0irx7GDx+62Fc+7814oCogeX2qVIZqct98upFCrj1IUiGmUaZj9DFE2bNgwVedvB6L/u+++U+UMH374oRJCPXr0KFBugVRnlMLg80Z5DQbGevbsKffcc48Szs5gn6O0AuUKGOhwNRhogJjEgAheD54YeG/8P9YVnxt8K8ygEUSr3afDlDKg/AWf7cyZM+Xmm29WAnrQoEGF3gtCHYMZ2FacL0jVxjmO7zKAlG2UlABsv5ncDZZhXQ4cOCC9evVyO3h36aWXqn1qBlGwPRgkQqmPc3o5th8DYTinTUkMUs4xaIrlMUgCPw6Ue+AzsYPvQawHBpzwOvhcfHkvZ3BOwRcFAysYxEFJFO5jO3C84pgH8CDBYAHOVwNKbFASY7YZYIAIiT5Y3htwXOM9MHCBQQkM5uA4cQaviWXxOWDgA2UOOPa9Ef6EEEIIiSPCnRoQaVx33XUqnREp8IZff/1VpUN+/PHHbtNRd+zY4fY1x48fr5Z5+eWXC8xPTk620tLSrIoVK1qvvfaaSi9/9NFHVdr0tddeW+S6+rJet912m3pcrlw56+abb7Z+/PFHle6OdFmkVHtaf1d4SrN3xbZt21Ra7mmnnVYgXdsdSD1NTU1V74GpZs2a1oABA6x58+YVWM6k2bubtm7d6nOaPdLOsb+cQdo9/m/y5Mlu13vZsmVWmTJlrMsvv7zQc2PHjlWftT09G2n27tbdudTDvi9RnoFl7MepqzR7vBcmfL4PP/yw+h+UZoDt27erx88++2yh/8c2Opca2CkqzR7HcNeuXS1v0+xdTXgNO0gxPuWUU6yGDRtaq1atUscTthNlHYaNGzeq/61Vq5aVmZnpmH/48GGrUqVK1gUXXOCY161bN6tOnToFSlTA4MGDrdKlS1v79+8vcIydc845hdbfPIdb58902rRpjnn4DKpWrarmL1myxDF/3759ajuHDh3qmIdjD8f+5s2bC7zXmDFj1P+vXLmywLa2bt26wD5YvHhxoe8FX9LsP/nkE7Xsm2++6XE57P/mzZs7Hrdv394688wzCywzbtw49VrLly9Xj7ds2aK+X+++++5C5U01atQoUNph9qOrchtv3gvg+MBkwD5x/mwAyjwwH69h0vlLlSpljRw50nHO4fmHHnpInd8m3X3QoEHqWPOG//77r8Dxffrpp6tz0BU4J81yJUqUUL8LhBBCCCHOMDJvAxEsRLZeeukllY7sjKcUc3fPIaoG92dExpzT6RElQkQKqdNYBqnxiDRiORhMIbJulnMXsfR2vUyUF6mtMFFCuioiWF9++aXs3bvXkYZrIkLFjW7bQWkBIoV4bUSZvEnXRvQNkWzsB0RK69atqyKsMJ+zp7kaYOgGwzbnCSm3/uDPZ420ZWQ6YF1dGVUhAwNRQefoGqJ9rtbdnXnXK6+8ovYlsEcJnUEGASKUmNC9ANHn6667TsaPH1/sbS0KHDeu0trdAad85+1ftGhRgWWQEo1oLFKbYTyHffDxxx+7TD1GtBPZJwZkpCCajAwVnD/IWMH6oeQB3QrsxzuOVTxvT1UHrjIqPO03vI4Bn3njxo1VNBzu5Aa4myPCb3c1R4YAvgvwmdnXC9F9YO/mABD9t+8Dk2nh7JQeaLD/7ccHUtXRWWHNmjUFjA2R/dCqVSv1GNkG2BYYOtq3DZ8Vzm1XXQFc7Xdv3ssV2Lfo2oBjwf7+MBBFRwrz/qaDBaLx5jzD/yH9HtkCv/zyi5qLine truncated
"text/plain": [
"<Figure size 1000x400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"outputs": [],
"source": [
"fig = plt.figure(figsize=(10,4), constrained_layout = True)\n",
"ax = fig.add_subplot(111)\n",
@@ -175,7 +119,7 @@
"ax.plot(analyser.data['Time (s)'], analyser.data['Number (#/cm^3)'], color='red', label='Number')\n",
"ax_2.plot(analyser.data['Time (s)'], analyser.data['Mass (mg/cm^3)'], color='blue', label='Mass')\n",
"\n",
"ax.set_title('2026-06-12 SET02/EXP01: Experiment Overview ' + str(sample_number))\n",
"ax.set_title('2026-06-12 SET02/EXP01: Experiment Overview')\n",
"ax.set_xlabel('Time $(s)$')\n",
"ax.set_ylabel('Number Density $(cm^{-3})$')\n",
"ax_2.set_ylabel('Mass Denisty $(mg cm^{-3})$')\n",
@@ -191,7 +135,7 @@
"\n",
"ax.legend(lines_1 + lines_2, labels_1 + labels_2, loc='upper left')\n",
"\n",
"plt.savefig(\"20260723_OFR_Analysis_01_Experiment_Overview.pdf\", format='pdf', dpi=400)"
"plt.savefig(\"20260723_OFR_Analysis_01_Experiment_Overview_top.pdf\", format='pdf', dpi=400)"
]
},
{
@@ -202,68 +146,75 @@
"Clearly, something is happening at around 5000 s, 12000s, and after 17000s. This corresponds to shifts in the flow rates... These are read from disk and depicted below:"
]
},
{
"cell_type": "code",
"execution_count": 159,
"id": "dec710d2",
"metadata": {},
"outputs": [],
"source": [
"# Reading from disk\n",
"\n",
"source_file_for_flows = Path(r\"C:\\Users\\tschan_d\\Documents\\data_local\\20260612_SET02_EXP01_full_flows.txt\")\n",
"\n",
"dry_air_flows = []\n",
"species_flows = []\n",
"ozone_flows = []\n",
"numbers_of_samples = []\n",
"\n",
"with open(source_file_for_flows, 'r', errors='ignore') as file:\n",
" for i,line in enumerate(file.readlines()):\n",
" if i >= 2:\n",
" items = line.split()\n",
" dry_air_flows.append(float(items[0]))\n",
" species_flows.append(float(items[1]))\n",
" ozone_flows.append(float(items[2]))\n",
" numbers_of_samples.append(float(items[-1]))\n",
"\n",
"flow_data = pd.DataFrame({'Dry Air (L/min)': dry_air_flows, 'Species (L/min)': species_flows, 'Ozone (L/min)': ozone_flows, 'Samples': numbers_of_samples})"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "75347e52",
"id": "a5af245c",
"metadata": {},
"outputs": [],
"source": [
"fig = plt.figure(figsize=(10,4), constrained_layout = True)\n",
"# Obtaining the data to plot the flows correctly\n",
"\n",
"times = []\n",
"dry_air = []\n",
"species = []\n",
"ozone = []\n",
"\n",
"for _, row in analyser.flow_data.iterrows():\n",
" times.append(row['Start (s)'])\n",
" times.append(row['Stop (s)'])\n",
"\n",
" # append it twice so that we can plot the data correctly\n",
" i = 0\n",
" while i < 2:\n",
" dry_air.append(row['Dry Air (L/min)'])\n",
" species.append(row['Species (L/min)'])\n",
" ozone.append(row['Ozone (L/min)'])\n",
" i += 1\n",
"\n",
"# Doing the actual plotting\n",
"\n",
"fig = plt.figure(figsize=(10,2.5), constrained_layout = True)\n",
"ax = fig.add_subplot(111)\n",
"ax_2 = plt.twinx(ax)\n",
"\n",
"ax.plot(times, ozone, color='red', linestyle='--', label='Ozone')\n",
"ax_2.plot(times, species, color='blue', linestyle='--', label=r'$\\alpha$-Pinene')\n",
"\n",
"\n",
"ax.plot([], analyser.data['Number (#/cm^3)'], color='red', label='Number')\n",
"ax_2.plot(analyser.data['Time (s)'], analyser.data['Mass (mg/cm^3)'], color='blue', label='Mass')\n",
"\n",
"ax.set_title('2026-06-12 SET02/EXP01: Experiment Overview ' + str(sample_number))\n",
"ax.set_title('2026-06-12 SET02/EXP01: Flow Rates Overview ')\n",
"ax.set_xlabel('Time $(s)$')\n",
"ax.set_ylabel('Number Density $(cm^{-3})$')\n",
"ax_2.set_ylabel('Mass Denisty $(mg cm^{-3})$')\n",
"ax.set_ylabel('Ozone Flow Rate $(L min^{-1})$')\n",
"ax_2.set_ylabel(r'$\\alpha$-Pinene Flow Rate $(L min^{-1})$')\n",
"ax.xaxis.set_minor_locator(MultipleLocator(base=180, offset=0))\n",
"ax.xaxis.set_major_locator(MultipleLocator(base=1800, offset=0))\n",
"\n",
"ax.set_xlim([0, 30000])\n",
"ax.set_ylim([0, 1.2E6])\n",
"ax_2.set_ylim([0, 15])\n",
"ax.set_ylim([0.6, 2.4])\n",
"ax_2.set_ylim([0.015, 0.045])\n",
"\n",
"lines_1, labels_1 = ax.get_legend_handles_labels()\n",
"lines_2, labels_2 = ax_2.get_legend_handles_labels()\n",
"\n",
"ax.legend(lines_1 + lines_2, labels_1 + labels_2, loc='upper left')\n",
"\n",
"plt.savefig(\"20260723_OFR_Analysis_01_Experiment_Overview.pdf\", format='pdf', dpi=400)"
"plt.savefig(\"20260723_OFR_Analysis_01_Experiment_Overview_bottom.pdf\", format='pdf', dpi=400)"
]
},
{
"cell_type": "markdown",
"id": "e6212394",
"metadata": {},
"source": [
"To refine the analysis, we may also consider the production rates of SOA using the integral of the SOA production rate, obtained by multiplying the concentration with the flow rate with the sampling time for each sample:"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "e2ae6dbb",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
Binary file not shown.
Binary file not shown.