# -*- coding: utf-8 -*- """ GEPARD - Gepard-Enabled PARticle Detection Copyright (C) 2018 Lars Bittrich and Josef Brandt, Leibniz-Institut für Polymerforschung Dresden e. V. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program, see COPYING. If not, see . """ import numpy as np from viewitems import SegmentationContour, RamanScanIndicator class Particle(object): def __init__(self): super(Particle, self).__init__() self.index = None self.longSize_ellipse = np.nan self.shortSize_ellipse = np.nan self.longSize_box = np.nan self.shortSize_box = np.nan self.area = None self.contour = None self.measurements = [] self.viewItem = None def addMeasurement(self, refToMeasurement): refToMeasurement.assignedParticle = self self.measurements.append(refToMeasurement) def setAllSpectraToNewAssignment(self, newAssignment): for meas in self.measurements: meas.setAssignment(newAssignment) meas.setHQI(100) def getParticleAssignment(self): return self.getMeasAssignmentWithHighestHQI() #probably another method could be more suitable... def getHighestHQI(self): hqis = [] for meas in self.measurements: hqis.append(meas.getHQI()) return max(hqis) def getHQIOfMeasurementIndex(self, index): for meas in self.measurements: if meas.ramanScanIndex == index: return meas.getHQI() def getMeasurementIndices(self): indices = [] for meas in self.measurements: indices.append(meas.ramanScanIndex) return indices def getMeasurements(self): return self.measurements def getMeasAssignmentWithHighestHQI(self): hqis = [] assignments = [] for meas in self.measurements: hqis.append(meas.getHQI()) assignments.append(meas.getAssignment()) indexOfHighestHQI = hqis.index(max(hqis)) return assignments[indexOfHighestHQI] def getParticleSize(self): if not np.isnan(self.longSize_ellipse): size = self.longSize_ellipse elif not np.isnan(self.longSize_box): size = self.longSize_box else: print(f'Error, particle size requested, but not yet set.\nParticle Index is {self.index}') raise ValueError assert size is not None, f'Error, size or particle {self.index} is None' return round(size) def getShortParticleSize(self): if not np.isnan(self.shortSize_ellipse): return self.shortSize_ellipse elif not np.isnan(self.shortSize_box): return self.shortSize_box else: print(f'Error, particle size requested, but not yet set.\nParticle Index is {self.index}') raise ValueError def getNumberOfMeasurements(self): return len(self.measurements) def measurementsHaveSameOrigAssignment(self): allResults = [meas.getOrigAssignment() for meas in self.measurements] if len(np.unique(allResults)) == 1: return True elif len(np.unique(allResults)) > 1: return False def getOrigMeasurementAssignments(self): assignments = [meas.getOrigAssignment() for meas in self.measurements] return assignments def applyHQITresholdToMeasurements(self, minHQI): for measurement in self.measurements: measurement.applyHQIThreshold(minHQI) def recreateViewItem(self): self.viewItem = SegmentationContour() class Measurement(object): def __init__(self): super(Measurement, self).__init__() self.ramanScanIndex = None self.pixelcoord_x= None self.pixelcoord_y = None self.assignment_orig = 'Not Evaluated' self.assignment_afterHQI = None self.hqi = None self.assignedParticle = None def setAssignment(self, assignment): self.assignment_orig = assignment self.applyHQIThreshold() def setHQI(self, hqi): self.hqi = hqi self.applyHQIThreshold() def applyHQIThreshold(self, minHQI=0): if self.hqi is not None: #i.e. skip for initial setup, when hqi is not yet aplied... if self.hqi >= minHQI: self.assignment_afterHQI = self.assignment_orig else: self.assignment_afterHQI = 'unknown' def getHQI(self): return self.hqi def getAssignment(self): if self.assignment_afterHQI is None: return self.assignment_orig else: return self.assignment_afterHQI def getOrigAssignment(self): return self.assignment_orig def getScanIndex(self): return self.ramanScanIndex