@@ -59,14 +59,15 @@ import java.io.InputStreamReader
5959import kotlin.text.iterator
6060import androidx.core.net.toUri
6161import com.github.mikephil.charting.components.Legend
62- import io.github.vikulin.opengammakit.math.SpectrumModifier.applySavitzkyGolayFilter
63- import io.github.vikulin.opengammakit.math.SpectrumModifier.detectCWTPeaks
62+ import io.github.vikulin.opengammakit.math.SpectrumModifier
6463import io.github.vikulin.opengammakit.math.SpectrumModifier.smartPeakDetect
64+ import io.github.vikulin.opengammakit.model.EnergySpectrum
6565import io.github.vikulin.opengammakit.model.GammaKitEntry
66- import io.github.vikulin.opengammakit.model.PeakInfo
6766import io.github.vikulin.opengammakit.view.FwhmSpectrumSelectionDialogFragment
6867import io.github.vikulin.opengammakit.view.SaveSelectedSpectrumDialogFragment
6968import io.github.vikulin.opengammakit.view.SpectrumFileChooserDialogFragment
69+ import kotlin.math.log10
70+ import kotlin.math.pow
7071
7172class SpectrumFragment : SerialConnectionFragment (),
7273 CalibrationUpdateOrRemoveDialogFragment .CalibrationDialogListener ,
@@ -89,6 +90,7 @@ class SpectrumFragment : SerialConnectionFragment(),
8990 private lateinit var btnSaveSpectrum: ImageButton
9091 private lateinit var btnToggleFilter: ImageButton
9192 private lateinit var btnToggleDetectPeak: ImageButton
93+ private lateinit var btnToggleLogScale: ImageButton
9294 private lateinit var clockProgressView: ClockProgressView
9395 private lateinit var spectrumDataSet: OpenGammaKitData
9496 // Indicates which graph is currently active for measurements such as Calibration and FWHM
@@ -151,6 +153,7 @@ class SpectrumFragment : SerialConnectionFragment(),
151153 btnSaveSpectrum = view.findViewById(R .id.btnSaveSpectrumFile)
152154 btnToggleFilter = view.findViewById(R .id.btnToggleFilter)
153155 btnToggleDetectPeak = view.findViewById(R .id.btnToggleDetectPeak)
156+ btnToggleLogScale = view.findViewById(R .id.btnToggleLogScale)
154157 clockProgressView = view.findViewById(R .id.clockProgressView)
155158
156159 gestureDetector = GestureDetector (requireContext(), object : GestureDetector .SimpleOnGestureListener () {
@@ -335,6 +338,11 @@ class SpectrumFragment : SerialConnectionFragment(),
335338 }
336339 updateChartSpectrumData()
337340 }
341+
342+ btnToggleLogScale.setOnClickListener {
343+ toggleLogScaleFilter()
344+ updateChartSpectrumData()
345+ }
338346 }
339347
340348 fun drawPeakLimitLines () {
@@ -526,10 +534,13 @@ class SpectrumFragment : SerialConnectionFragment(),
526534
527535 private fun setupChart () {
528536 val primaryColor = resources.getColor(R .color.colorPrimaryText, null )
529-
537+ // copy data to outputSpectrum
538+ spectrumDataSet.data.mapIndexed { index, entry ->
539+ resetSpectrumData(entry.resultData.energySpectrum)
540+ }
530541 // Create LineDataSets from each GammaKitEntry in spectrumDataSet
531542 val dataSets = spectrumDataSet.data.mapIndexed { index, entry ->
532- val spectrum = entry.resultData.energySpectrum.spectrum
543+ val spectrum = entry.resultData.energySpectrum.outputSpectrum
533544 val entries = spectrum.mapIndexed { ch, count ->
534545 Entry (ch.toFloat(), count.toFloat())
535546 }
@@ -591,7 +602,7 @@ class SpectrumFragment : SerialConnectionFragment(),
591602 private fun updateChartSpectrumData () {
592603
593604 val dataSets = spectrumDataSet.data.mapIndexed { index, entry ->
594- val spectrum = entry.resultData.energySpectrum.spectrum
605+ val spectrum = entry.resultData.energySpectrum.outputSpectrum
595606 val entries = spectrum.mapIndexed { ch, count ->
596607 Entry (ch.toFloat(), count.toFloat())
597608 }
@@ -620,7 +631,6 @@ class SpectrumFragment : SerialConnectionFragment(),
620631 setDrawInside(false )
621632 xEntrySpace = 20f
622633 }
623-
624634 spectrumChart.data.notifyDataChanged()
625635 spectrumChart.notifyDataSetChanged()
626636 spectrumChart.invalidate()
@@ -793,16 +803,17 @@ class SpectrumFragment : SerialConnectionFragment(),
793803 " Test" ,
794804 " Spectrum size: ${spectrum.size} , counts: $counts "
795805 )
796- spectrumDataSet.data[deviceSpectrumIndex].
797- resultData.energySpectrum.spectrum = spectrum
798- spectrumDataSet.data[deviceSpectrumIndex].
799- resultData. energySpectrum.validPulseCount =
806+ var energySpectrum = spectrumDataSet.data[deviceSpectrumIndex].
807+ resultData.energySpectrum
808+ energySpectrum.spectrum = spectrum
809+ energySpectrum.validPulseCount =
800810 spectrum.fold(0L ) { acc, num -> acc + num }
801- spectrumDataSet.data[deviceSpectrumIndex].
802- resultData.energySpectrum.numberOfChannels = spectrum.size
803- spectrumDataSet.data[deviceSpectrumIndex].
804- resultData.energySpectrum.measurementTime =
811+ energySpectrum.numberOfChannels = spectrum.size
812+ energySpectrum.measurementTime =
805813 (SystemClock .elapsedRealtime() - measureTimer.base)/ 1000
814+ // copy spectrum. TODO apply filters and peaks detection
815+ resetSpectrumData(energySpectrum)
816+
806817 updateChartSpectrumData()
807818 } catch (e: Exception ) {
808819 Log .e(" Test" , " Failed to parse data: ${e.message} " )
@@ -840,6 +851,10 @@ class SpectrumFragment : SerialConnectionFragment(),
840851 " Parsed scheduled spectrum number: ${openGammaKitData.data.size} "
841852 )
842853 spectrumDataSet.data[deviceSpectrumIndex] = openGammaKitData.data[deviceSpectrumIndex]
854+ var energySpectrum = spectrumDataSet.data[deviceSpectrumIndex].
855+ resultData.energySpectrum
856+ // copy spectrum. TODO apply filters and peaks detection
857+ resetSpectrumData(energySpectrum)
843858 updateChartSpectrumData()
844859 } catch (e: Exception ) {
845860 Log .e(" Test" , " Failed to parse data: ${e.message} " )
@@ -1477,40 +1492,82 @@ class SpectrumFragment : SerialConnectionFragment(),
14771492 for (entry in spectrumDataSet.data) {
14781493 val energy = entry.resultData.energySpectrum
14791494 if (! energy.filters.contains(" SavitzkyGolay" )) {
1480- // create a copy for next recovery
1481- energy.rawSpectrum = energy.spectrum.toList()
14821495 // Apply filter and add tag
1483- applySavitzkyGolayFilter(entry)
1496+ SpectrumModifier . applySavitzkyGolayFilter(entry)
14841497 entry.resultData.energySpectrum.filters.add(" SavitzkyGolay" )
14851498 } else {
1486- if (energy.filters.contains(" SavitzkyGolay" )) {
1487- // Restore raw spectrum and remove tag
1488- energy.spectrum = energy.rawSpectrum ? : energy.spectrum
1489- energy.filters.removeIf { it== " SavitzkyGolay" }
1490- }
1499+ energy.filters.clear()
1500+ resetSpectrumData(energy)
14911501 }
14921502 }
14931503 }
14941504
14951505 private fun applySavitzkyGolayFilter (apply : Boolean ) {
14961506 for (entry in spectrumDataSet.data) {
14971507 val energy = entry.resultData.energySpectrum
1498-
14991508 if (apply) {
1509+ for (filter in energy.filters){
1510+ when (filter) {
1511+ " LogScale" -> {
1512+ applyLogScale(entry, true )
1513+ }
1514+ }
1515+ }
15001516 if (! energy.filters.contains(" SavitzkyGolay" )) {
1501- // create a copy for next recovery
1502- energy.rawSpectrum = energy.spectrum.toList()
15031517 // Apply filter and add tag
1504- applySavitzkyGolayFilter(entry)
1518+ SpectrumModifier . applySavitzkyGolayFilter(entry)
15051519 entry.resultData.energySpectrum.filters.add(" SavitzkyGolay" )
15061520 }
15071521 } else {
1508- if (energy.filters.contains(" SavitzkyGolay" )) {
1509- // Restore raw spectrum and remove tag
1510- energy.spectrum = energy.rawSpectrum ? : energy.spectrum
1511- energy.filters.removeIf { it== " SavitzkyGolay" }
1522+ energy.filters.clear()
1523+ resetSpectrumData(energy)
1524+ }
1525+ }
1526+ }
1527+
1528+ private fun resetSpectrumData (energySpectrum : EnergySpectrum ){
1529+ energySpectrum.outputSpectrum =
1530+ energySpectrum.spectrum.map { count ->
1531+ count.toDouble()
1532+ }.toMutableList()
1533+ // TODO apply it here when filters left
1534+ }
1535+
1536+ private fun toggleLogScaleFilter (){
1537+ for (entry in spectrumDataSet.data) {
1538+ val energy = entry.resultData.energySpectrum
1539+ if (! energy.filters.contains(" LogScale" )) {
1540+ // Apply filter and add tag
1541+ applyLogScale(entry, true )
1542+ } else {
1543+ applyLogScale(entry, false )
1544+ }
1545+ }
1546+ }
1547+
1548+ fun applyLogScale (entry : GammaKitEntry , apply : Boolean ) {
1549+ entry.resultData.energySpectrum.applyLogScale(apply)
1550+ }
1551+
1552+ fun EnergySpectrum.applyLogScale (apply : Boolean ) {
1553+ if (apply) {
1554+ for (filter in filters){
1555+ when (filter) {
1556+ " SavitzkyGolay" -> {
1557+ applySavitzkyGolayFilter(true )
1558+ }
15121559 }
15131560 }
1561+ if (! filters.contains(" LogScale" )) {
1562+ outputSpectrum = outputSpectrum.map { count ->
1563+ val adjusted = if (count > 1L ) count.toDouble() else 1.0
1564+ log10(adjusted)
1565+ }.toMutableList()
1566+ filters.add(" LogScale" )
1567+ }
1568+ } else {
1569+ filters.clear()
1570+ resetSpectrumData(this )
15141571 }
15151572 }
15161573
0 commit comments