Developing OFR Analysis functions: issues with dimensions (nm -> cm)

This commit is contained in:
tschan_d committed 2026-06-30 18:27:27 +02:00
1 parent 8dd5a497be
commit 492c1a315d
5 files changed
+117 -35

No files matched your search

+8
View File
@@ -9,6 +9,14 @@
"program": "${file}",
"console": "integratedTerminal",
"env": {"PYTHONPATH": "${workspaceFolder}/defs"}
},
{
"name": "Python Debugger: debug_scrapyard.py",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/defs/debug_scrapyard.py",
"console": "integratedTerminal",
"env": {"PYTHONPATH": "${workspaceFolder}/defs"}
}
]
}
+5 -1
View File
@@ -46,5 +46,9 @@
"strings": "off"
},
"editor.suggestOnTriggerCharacters": false,
"window.zoomLevel": -1
"window.zoomLevel": -1,
"editor.wordWrap": "on",
"editor.rulers": [140],
"notebook.editorOptionsCustomizations": {"editor.rulers":[]},
"editor.fontSize": 16
}
+5 -4
View File
@@ -1,13 +1,14 @@
### -------------------------------------------------------------------------------- ###
### ----------------------------------------------------------------------------------------------------------------------------------- ###
### SCRAPYARD TO DEBUG AND TEST FUNCTIONALITY
import pandas as pd
import numpy as np
from defs import OFRAnalyser, OFRSample
analyser = OFRAnalyser(sourcefile="Z:/People/David_Tschan/data/OFR_SMPS/2026/processed/06_June/20260612/20260612_SET02_EXP01_full.csv")
analyser = OFRAnalyser(sourcefile="Z:/People/David_Tschan/data/OFR_SMPS/2026/processed/06_June/20260612/20260612_SET02_EXP01_full.csv",
lower_bound=22.87, upper_bound=1000, density=102, scan_up=160, scan_down=20)
samplelist = np.linspace(start=1, stop=analyser.max_samples, num=analyser.max_samples, dtype=int).tolist()
analyser.GetTotalMass(samples=samplelist, plot=True)
analyser.GetTotalMass(samples=[33], plot=False)
print("Hello")
print(analyser.total_mass)
+59 -22
View File
@@ -1,44 +1,70 @@
### -------------------------------------------------------------------------------- ###
### ----------------------------------------------------------------------------------------------------------------------------------- ###
### IMPORTS AND CONFIGURATIONS
import numpy as np
import pandas as pd
import csv
import math
import matplotlib.pyplot as plt
### -------------------------------------------------------------------------------- ###
### ----------------------------------------------------------------------------------------------------------------------------------- ###
### OFR ANALYSIS
class OFRSample:
def __init__(self, number, sourcefile, headlines):
def __init__(self, number, sourcefile, headlines, density, lower_bound, upper_bound, scan_up, scan_down):
self.number = number
self.sourcefile = sourcefile
self.headlines = headlines
self.diameters = np.empty(shape=(self.number, 1))
self.counts = np.empty(shape=(self.number, 1))
self.lower_bound = lower_bound
self.upper_bound = upper_bound
self.scan_up = scan_up
self.scan_down = scan_down
# in g/cc
self.density = density
self.diameters = None
self.counts = None
self.__get_data()
def __get_data(self):
columns = ['Diameter #' + str(self.number), 'Counts #' + str(self.number)]
sample_data = pd.read_csv(filepath_or_buffer=self.sourcefile, header=self.headlines, usecols=columns, index=False).to_numpy()
self.diameters = sample_data[:, 0]
self.counts = sample_data[:, 1]
def mass_integrator(self, method='trapz') -> None:
self.__get_data()
sample_data = pd.read_csv(filepath_or_buffer=self.sourcefile, header=self.headlines, usecols=columns, index_col=False,
skipfooter=1, engine='python').to_numpy()
filter_array = np.where((sample_data[:, 0] >= self.lower_bound) & (sample_data[:, 0] <= self.upper_bound), True, False)
pass
# Particle Diameter: (nm)
self.diameters = sample_data[filter_array, 0]
# Particle raw counts: (# / cc)
self.counts = sample_data[filter_array, 1]
def volume_integrator(self, input_prefix = 1E-9, output_prefix = 1E-2) -> np.float64:
adjustment_factor = input_prefix / output_prefix
#
local_volumes = (math.pi / 6) * (self.diameters * adjustment_factor) ** 3
local_volume = np.trapezoid(y=self.counts, x=local_volumes)
return local_volume
class OFRAnalyser:
def __init__(self, sourcefile, headlines = 238) -> None:
def __init__(self, sourcefile, headlines = 238, density=1.2, lower_bound = 0, upper_bound = 1896, scan_up=160, scan_down=20) -> None:
self.sourcefile = sourcefile
self.headlines = headlines
self.density = density
self.lower_bound = lower_bound
self.upper_bound = upper_bound
self.scan_up = scan_up
self.scan_down = scan_down
with open(self.sourcefile) as file:
file_reader = csv.reader(file)
@@ -50,8 +76,8 @@ class OFRAnalyser:
self.max_samples = int((len(head_row) - 1) / 2)
def __get_sample(self, sample_number) -> None:
pass
# total mass in mg
self.total_mass = None
def __sample_number_list_check(self, sample_number_list) -> None:
@@ -66,11 +92,22 @@ class OFRAnalyser:
masses = []
for sample in samples:
local_sample = OFRSample(number=sample, sourcefile=self.sourcefile, headlines=self.headlines)
mass = local_sample.mass_integrator()
masses.append(mass)
local_sample = OFRSample(number=sample, sourcefile=self.sourcefile, headlines=self.headlines, density=self.density,
lower_bound = self.lower_bound, upper_bound = self.upper_bound, scan_up = self.scan_up,
scan_down = self.scan_down)
# For python notebooks and debugging reasons
if plot == True:
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(local_sample.diameters, local_sample.counts)
plt.show()
local_volume = local_sample.volume_integrator()
masses.append(local_volume * local_sample.density)
total_mass = sum(masses)
self.total_mass = total_mass
def PlotSampleDistribution(self, sample) -> None:
pass
@@ -78,5 +115,5 @@ class OFRAnalyser:
def PlotAllDistributions(self):
pass
### -------------------------------------------------------------------------------- ###
### ----------------------------------------------------------------------------------------------------------------------------------- ###
###
+40 -8
View File
@@ -10,17 +10,19 @@
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 1,
"id": "ee443e0d",
"metadata": {},
"outputs": [],
"source": [
"from defs.defs import OFRSample, OFRAnalyser"
"import pandas as pd\n",
"import numpy as np\n",
"from defs.defs import OFRAnalyser, OFRSample"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 8,
"id": "83604ca62804491c",
"metadata": {
"ExecuteTime": {
@@ -30,12 +32,12 @@
},
"outputs": [],
"source": [
"analyser = OFRAnalyser(sourcefile=\"Z:\\People\\David_Tschan\\data\\OFR_SMPS\\2026\\processed\\06_June\\20260612\\20260612_SET02_EXP01_full.csv\")"
"analyser = OFRAnalyser(sourcefile=\"Z:/People/David_Tschan/data/OFR_SMPS/2026/processed/06_June/20260612/20260612_SET02_EXP01_full.csv\", lower_bound=22.87, upper_bound=1000, density=1.2, scan_up=160, scan_down=20)"
]
},
{
"cell_type": "code",
"execution_count": null,
"execution_count": 9,
"id": "fc69589de06ec7c3",
"metadata": {
"ExecuteTime": {
@@ -43,15 +45,45 @@
"start_time": "2026-06-15T14:00:19.820656Z"
}
},
"outputs": [],
"outputs": [
{
"data": {
"image/png": "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 truncated
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"analyser.sourcefile"
"samplelist = np.linspace(start=1, stop=analyser.max_samples, num=analyser.max_samples, dtype=int).tolist()\n",
"analyser.GetTotalMass(samples=[33], plot=True)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "a9eadad8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"1.7670695718029623e-08\n"
]
}
],
"source": [
"print(analyser.total_mass)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "a9eadad8",
"id": "4475bcba",
"metadata": {},
"outputs": [],
"source": []