From 3d128d8eccc1b229791f8a0fdd3b5518d398c1b5 Mon Sep 17 00:00:00 2001 From: SGCMarkus Date: Thu, 19 Sep 2024 12:02:21 +0200 Subject: [PATCH] way too many updates --- main/astrodatagui/AstrodataGUI.py | 123 ++- main/astrodatagui/CalcAllFlaresThread.py | 148 +-- main/astrodatagui/FlareSummaryPlotGUI.py | 968 ++++++++++++++++++-- main/astrodatagui/astrodatagui.ui | 116 ++- main/astrodatagui/db/StarsDB.py | 26 +- main/astrodatagui/ui/FlaredetectorWidget.py | 27 +- main/astrodatagui/ui/NewStarDialog.py | 24 +- main/flaredetector/util.py | 228 ++++- stars.db | Bin 278528 -> 286720 bytes 9 files changed, 1378 insertions(+), 282 deletions(-) diff --git a/main/astrodatagui/AstrodataGUI.py b/main/astrodatagui/AstrodataGUI.py index bf783e6..0b4cdb1 100644 --- a/main/astrodatagui/AstrodataGUI.py +++ b/main/astrodatagui/AstrodataGUI.py @@ -64,6 +64,10 @@ class AstrodataGUI(QtWidgets.QMainWindow): self.flaredetectorPreview.periodsCalculated.connect(self.updatePeriods) self.flaredetectorPreview.epochCalculated.connect(self.updateEpochPeriod) + self.rbLinearFit.toggled.connect(self.rbFoldedPlotTypeChanged) + self.rbSineFit.toggled.connect(self.rbFoldedPlotTypeChanged) + self.rbPolynomialFit.toggled.connect(self.rbFoldedPlotTypeChanged) + self.setupCustomSimbadQueries() self.show() self.loadDB() @@ -109,51 +113,52 @@ class AstrodataGUI(QtWidgets.QMainWindow): if not diag.exec(): return try: - result = self.simbad.query_object(diag.starIdentifier) + results = self.simbad.query_object(diag.starIdentifier) except: self.showErrorMessage("Simbad Error", "Failed to fetcch information from Simbad, aborting...") return + results = results.split(";") + for result in results: + try: + mainName = result["MAIN_ID"][0] + except: + self.showErrorMessage("Main Identifier Error", "Failed to grab main identifier, aborting...") + return - try: - mainName = result["MAIN_ID"][0] - except: - self.showErrorMessage("Main Identifier Error", "Failed to grab main identifier, aborting...") - return + try: + altNames = Simbad.query_objectids(mainName) + except: + self.showErrorMessage("Identifier Error", "Failed to grab all identifiers, aborting...") + return - try: - altNames = Simbad.query_objectids(mainName) - except: - self.showErrorMessage("Identifier Error", "Failed to grab all identifiers, aborting...") - return - - try: - specType = result["SP_TYPE"][0] - if(specType == ""): + try: + specType = result["SP_TYPE"][0] + if(specType == ""): + specType = "-" + except: + print("No spectral type found") specType = "-" - except: - print("No spectral type found") - specType = "-" - rotVel = -1 - rotVelUnit = "" - try: - if(result["RVZ_TYPE"][0] == "v"): - rotVel = result["RV_VALUE"][0] - rotVelUnit = str(result["RV_VALUE"].unit) - except: - print("No radial velocity found") + rotVel = -1 + rotVelUnit = "" + try: + if(result["RVZ_TYPE"][0] == "v"): + rotVel = result["RV_VALUE"][0] + rotVelUnit = str(result["RV_VALUE"].unit) + except: + print("No radial velocity found") - try: - dist = float(result["Distance_distance"][0]) - if(np.isnan(dist)): + try: + dist = float(result["Distance_distance"][0]) + if(np.isnan(dist)): + dist = -1 + distUnit = result["Distance_unit"][0] + except: dist = -1 - distUnit = result["Distance_unit"][0] - except: - dist = -1 - distUnit = "" + distUnit = "" - self.starDB.insertStar(mainName, altNames, diag.productManifest, - specType, rotVel, rotVelUnit, dist, distUnit) + self.starDB.insertStar(mainName, altNames, diag.productManifest, + specType, rotVel, rotVelUnit, dist, distUnit) self.updateStarList() @@ -184,14 +189,41 @@ class AstrodataGUI(QtWidgets.QMainWindow): else: self.lbDistance.setText("-") + def updateStarFoldedFitType(self, foldedFitType): + self.rbLinearFit.blockSignals(True) + self.rbSineFit.blockSignals(True) + self.rbPolynomialFit.blockSignals(True) + if(foldedFitType == "linear"): + self.rbLinearFit.setChecked(True) + self.rbSineFit.setChecked(False) + self.rbPolynomialFit.setChecked(False) + elif(foldedFitType == "sine"): + self.rbLinearFit.setChecked(False) + self.rbSineFit.setChecked(True) + self.rbPolynomialFit.setChecked(False) + elif(foldedFitType == "poly"): + self.rbLinearFit.setChecked(False) + self.rbSineFit.setChecked(False) + self.rbPolynomialFit.setChecked(True) + else: + self.rbLinearFit.setChecked(False) + self.rbSineFit.setChecked(False) + self.rbPolynomialFit.setChecked(False) + self.rbLinearFit.blockSignals(False) + self.rbSineFit.blockSignals(False) + self.rbPolynomialFit.blockSignals(False) + def starSelected(self, item): + self.currentStarMainName = item.text() seqs = self.starDB.getStarSequences(item.text()) infos = self.starDB.getStarInfos(item.text()) altNames = self.starDB.getStarAltNames(item.text()) + self.foldedFitType = self.starDB.getFoldedFitType(item.text()) self.lbMainID.setText(item.text()) self.updateSequenceList(seqs) self.updateStarInfo(infos) self.updateStarAltNames(altNames) + self.updateStarFoldedFitType(self.foldedFitType) def sequenceSelected(self, item): self.gbPlotOptions.setEnabled(True) @@ -202,6 +234,21 @@ class AstrodataGUI(QtWidgets.QMainWindow): seq = seqText[1] filePath = self.starDB.getFilePath(mainName, source, seq) self.flaredetectorPreview.setFitsFile(filePath, mainName) + self.flaredetectorPreview.setFoldedFitType(self.foldedFitType) + + def rbFoldedPlotTypeChanged(self, state): + if(state): + print("Folded fit type changed") + self.foldedFitType = "" + match(self.sender()): + case self.rbLinearFit: + self.foldedFitType = "linear" + case self.rbSineFit: + self.foldedFitType = "sine" + case self.rbPolynomialFit: + self.foldedFitType = "poly" + self.starDB.updateFoldedFitType(self.currentStarMainName, self.foldedFitType) + self.flaredetectorPreview.setFoldedFitType(self.foldedFitType) def updatePeriods(self, periods: list): self.edPlotFoldPeriod.setText(str(periods[0].value)) @@ -378,18 +425,20 @@ class AstrodataGUI(QtWidgets.QMainWindow): "DistanceUnit", "Source", "Sequence", - "FilePath"]) + "FilePath", + "FitType"]) for starName in self.starDB.getAllStars(): sequences = self.starDB.getStarSequences(starName) infos = self.starDB.getStarInfos(starName) + fitType = self.starDB.getFoldedFitType(starName) for sourceSeq in sequences: source = sourceSeq["Source"] seq = sourceSeq["Sequence"] filePath = self.starDB.getFilePath(starName, source, seq) allStarsDictList.loc[len(allStarsDictList.index)] = \ [starName, infos["SpType"], infos["RotVel"], infos["RotVelUnit"], - infos["Distance"], infos["DistanceUnit"], source, seq, filePath] + infos["Distance"], infos["DistanceUnit"], source, seq, filePath, fitType] self.calcAllFlaresThread = CalcAllFlaresThread(allStarsDictList) self.calcAllFlaresThread.finished.connect(self.btCountAllFlaresClickedDone) diff --git a/main/astrodatagui/CalcAllFlaresThread.py b/main/astrodatagui/CalcAllFlaresThread.py index bf5fdee..0e81170 100644 --- a/main/astrodatagui/CalcAllFlaresThread.py +++ b/main/astrodatagui/CalcAllFlaresThread.py @@ -6,76 +6,88 @@ import pandas as pd from ..flaredetector.flaredetector import calculateFlareFitsForLightcurve from ..flaredetector.util import * +import warnings +warnings.filterwarnings("ignore") + def getFlareCount(filesDict): - lc = read(filesDict["FilePath"]) - lc.flux = lc["sap_flux"] - lc.flux_err = lc["sap_flux_err"] - sapPeaks, sapFits = calculateFlareFitsForLightcurve(lc.flatten()) - sapValSec, sapTds = getTotalValidDataInSeconds(lc, "sap_flux") - sapPeriodogram = lc.to_periodogram() - sapPeakPeriod = sapPeriodogram.period[findMaxIndices(sapPeriodogram, num=4, distance=100, sortByHighest=True)[0]] - sapEpochTime = getEpochTime(lc) - sapFoldedLC = lc.fold(period=sapPeakPeriod, epoch_time=sapEpochTime) - sapPhase, sapSineFit, sapFitType = getFoldedBestFit(sapFoldedLC) - sapMinima, sapMaxima = getFoldedFitPeakValley(sapSineFit) - sapminPhasesBounds, sapmaxPhasesBounds = getPhaseRangesNearPeak((sapMinima, sapMaxima), sapPhase, returnPhaseValue=True) - sapFoldedPeaks = [] - sapFoldedPeaksPhasePair = [] - for peak in sapPeaks: - cycle, foldedIndex = convertStarndardIndexToFoldedIndex(sapFoldedLC, peak["StandardIndex"]) - sapFoldedPeaks.append({"Cycle: ": cycle, "Index": foldedIndex}) - sapFoldedPeaksPhasePair.append({"Phase": sapFoldedLC.phase[sapFoldedLC.cycle == cycle][foldedIndex], "Peak": peak}) + try: + print(f"Starting {filesDict['StarName']}, {filesDict['Sequence']}") + lc = read(filesDict["FilePath"]) + lc.flux = lc["sap_flux"] + lc.flux_err = lc["sap_flux_err"] + sapPeaks, sapFits = calculateFlareFitsForLightcurve(lc.flatten()) + sapValSec, sapTds = getTotalValidDataInSeconds(lc, "sap_flux") + sapPeriodogram = lc.to_periodogram() + sapPeakPeriod = sapPeriodogram.period[findMaxIndices(sapPeriodogram, num=4, distance=100, sortByHighest=True)[0]] + sapEpochTime = getEpochTime(lc) + sapFoldedLC = lc.fold(period=sapPeakPeriod, epoch_time=sapEpochTime) + sapPhase, sapSineFit, sapFitType = getFoldedBestFit(sapFoldedLC, fitType=filesDict["FitType"]) + sapMinima, sapMaxima = getFoldedFitPeakValley(sapSineFit) + sapminPhasesBounds, sapmaxPhasesBounds = getPhaseRangesNearPeak((sapMinima, sapMaxima), sapPhase, returnPhaseValue=True) + sapFoldedPeaks = [] + sapFoldedPeaksPhasePair = [] + for peak in sapPeaks: + cycle, foldedIndex = convertStarndardIndexToFoldedIndex(sapFoldedLC, peak["StandardIndex"]) + sapFoldedPeaks.append({"Cycle: ": cycle, "Index": foldedIndex}) + sapFoldedPeaksPhasePair.append({"Phase": sapFoldedLC.phase[sapFoldedLC.cycle == cycle][foldedIndex], "Peak": peak}) - lc.flux = lc["pdcsap_flux"] - lc.flux_err = lc["pdcsap_flux_err"] - pdcsapPeaks, pdcsapFits = calculateFlareFitsForLightcurve(lc.flatten()) - pdcsapValSec, pdcsapTds = getTotalValidDataInSeconds(lc, "pdcsap_flux") - pdcsapPeriodogram = lc.to_periodogram() - pdcsapPeakPeriod = pdcsapPeriodogram.period[findMaxIndices(pdcsapPeriodogram, num=4, distance=100, sortByHighest=True)[0]] - pdcsapEpochTime = getEpochTime(lc) - pdcsapFoldedLC = lc.fold(period=pdcsapPeakPeriod, epoch_time=pdcsapEpochTime) - pdcsapPhase, pdcsapSineFit, pdcsapFitType = getFoldedBestFit(pdcsapFoldedLC) - pdcsapMinima, pdcsapMaxima = getFoldedFitPeakValley(pdcsapSineFit) - pdcsapminPhasesBounds, pdcsapmaxPhasesBounds = getPhaseRangesNearPeak((pdcsapMinima, pdcsapMaxima), pdcsapPhase, returnPhaseValue=True) - pdcsapFoldedPeaks = [] - pdcsapFoldedPeaksPhasePair = [] - for peak in sapPeaks: - cycle, foldedIndex = convertStarndardIndexToFoldedIndex(pdcsapFoldedLC, peak["StandardIndex"]) - pdcsapFoldedPeaks.append({"Cycle: ": cycle, "Index": foldedIndex}) - pdcsapFoldedPeaksPhasePair.append({"Phase": pdcsapFoldedLC.phase[pdcsapFoldedLC.cycle == cycle][foldedIndex], "Peak": peak}) + lc.flux = lc["pdcsap_flux"] + lc.flux_err = lc["pdcsap_flux_err"] + pdcsapPeaks, pdcsapFits = calculateFlareFitsForLightcurve(lc.flatten()) + pdcsapValSec, pdcsapTds = getTotalValidDataInSeconds(lc, "pdcsap_flux") + pdcsapPeriodogram = lc.to_periodogram() + pdcsapPeakPeriod = pdcsapPeriodogram.period[findMaxIndices(pdcsapPeriodogram, num=4, distance=100, sortByHighest=True)[0]] + pdcsapEpochTime = getEpochTime(lc) + pdcsapFoldedLC = lc.fold(period=pdcsapPeakPeriod, epoch_time=pdcsapEpochTime) + pdcsapPhase, pdcsapSineFit, pdcsapFitType = getFoldedBestFit(pdcsapFoldedLC, fitType=filesDict["FitType"]) + pdcsapMinima, pdcsapMaxima = getFoldedFitPeakValley(pdcsapSineFit) + pdcsapminPhasesBounds, pdcsapmaxPhasesBounds = getPhaseRangesNearPeak((pdcsapMinima, pdcsapMaxima), pdcsapPhase, returnPhaseValue=True) + pdcsapFoldedPeaks = [] + pdcsapFoldedPeaksPhasePair = [] + for peak in sapPeaks: + cycle, foldedIndex = convertStarndardIndexToFoldedIndex(pdcsapFoldedLC, peak["StandardIndex"]) + pdcsapFoldedPeaks.append({"Cycle: ": cycle, "Index": foldedIndex}) + pdcsapFoldedPeaksPhasePair.append({"Phase": pdcsapFoldedLC.phase[pdcsapFoldedLC.cycle == cycle][foldedIndex], "Peak": peak}) - filesDict["sapPeaks"] = sapPeaks - filesDict["sapPeaksCount"] = len(sapPeaks) - filesDict["sapFits"] = sapFits - filesDict["sapValidTimespans"] = sapTds - filesDict["sapValidSeconds"] = sapValSec - filesDict["sapFoldedCycle"] = sapFoldedLC.cycle - #filesDict["sapFoldedPhase"] = sapFoldedLC.phase.value - #filesDict["sapFoldedFitPhase"] = sapPhase - filesDict["sapFoldedFitPhaseStarEnd"] = (sapFoldedLC.phase.value[0], sapFoldedLC.phase.value[-1]) - filesDict["sapFoldedPeaksPhasePair"] = sapFoldedPeaksPhasePair - filesDict["sapPeriod"] = sapPeakPeriod.value - filesDict["sapPeriodMinima"] = sapMinima - filesDict["sapPeriodMinimaBoundaries"] = sapminPhasesBounds - filesDict["sapPeriodMaxima"] = sapMaxima - filesDict["sapPeriodMaximaBoundaries"] = sapmaxPhasesBounds - filesDict["pdcsapPeaks"] = pdcsapPeaks - filesDict["pdcsapPeaksCount"] = len(pdcsapPeaks) - filesDict["pdcsapFits"] = pdcsapFits - filesDict["pdcsapValidTimespans"] = pdcsapTds - filesDict["pdcsapValidSeconds"] = pdcsapValSec - filesDict["pdcsapFoldedCycle"] = sapFoldedLC.cycle - #filesDict["pdcsapFoldedPhase"] = sapFoldedLC.phase.value - #filesDict["pdcsapFoldedFitPhase"] = pdcsapPhase - filesDict["pdcsapFoldedFitPhaseStarEnd"] = (pdcsapFoldedLC.phase.value[0], pdcsapFoldedLC.phase.value[-1]) - filesDict["pdcsapFoldedPeaksPhasePair"] = pdcsapFoldedPeaksPhasePair - filesDict["pdcsapPeriod"] = pdcsapPeakPeriod.value - filesDict["pdcsapPeriodMinima"] = pdcsapMinima - filesDict["pdcsapPeriodMinimaBoundaries"] = pdcsapminPhasesBounds - filesDict["pdcsapPeriodMaxima"] = pdcsapMaxima - filesDict["pdcsapPeriodMaximaBoundaries"] = pdcsapmaxPhasesBounds - del lc - return filesDict + filesDict["sapPeaks"] = sapPeaks + filesDict["sapPeaksCount"] = len(sapPeaks) + filesDict["sapFits"] = sapFits + filesDict["sapValidTimespans"] = sapTds + filesDict["sapValidSeconds"] = sapValSec + filesDict["sapFoldedCycle"] = sapFoldedLC.cycle + #filesDict["sapFoldedPhase"] = sapFoldedLC.phase.value + #filesDict["sapFoldedFitPhase"] = sapPhase + filesDict["sapFoldedFitPhaseStarEnd"] = (sapFoldedLC.phase.value[0], sapFoldedLC.phase.value[-1]) + filesDict["sapFoldedPeaksPhasePair"] = sapFoldedPeaksPhasePair + filesDict["sapPeriod"] = sapPeakPeriod.value + filesDict["sapPeriodMinima"] = sapMinima + filesDict["sapPeriodMinimaBoundaries"] = sapminPhasesBounds + filesDict["sapPeriodMaxima"] = sapMaxima + filesDict["sapPeriodMaximaBoundaries"] = sapmaxPhasesBounds + filesDict["pdcsapPeaks"] = pdcsapPeaks + filesDict["pdcsapPeaksCount"] = len(pdcsapPeaks) + filesDict["pdcsapFits"] = pdcsapFits + filesDict["pdcsapValidTimespans"] = pdcsapTds + filesDict["pdcsapValidSeconds"] = pdcsapValSec + filesDict["pdcsapFoldedCycle"] = sapFoldedLC.cycle + #filesDict["pdcsapFoldedPhase"] = sapFoldedLC.phase.value + #filesDict["pdcsapFoldedFitPhase"] = pdcsapPhase + filesDict["pdcsapFoldedFitPhaseStarEnd"] = (pdcsapFoldedLC.phase.value[0], pdcsapFoldedLC.phase.value[-1]) + filesDict["pdcsapFoldedPeaksPhasePair"] = pdcsapFoldedPeaksPhasePair + filesDict["pdcsapPeriod"] = pdcsapPeakPeriod.value + filesDict["pdcsapPeriodMinima"] = pdcsapMinima + filesDict["pdcsapPeriodMinimaBoundaries"] = pdcsapminPhasesBounds + filesDict["pdcsapPeriodMaxima"] = pdcsapMaxima + filesDict["pdcsapPeriodMaximaBoundaries"] = pdcsapmaxPhasesBounds + del lc + print(f"Finished {filesDict['StarName']}, {filesDict['Sequence']}") + return filesDict + except Exception as e: + print("------------------------------------------------------------------------") + print(f"Exception in {filesDict['StarName']}, {filesDict['Sequence']}") + print(e) + print("------------------------------------------------------------------------") + return None class CalcAllFlaresThread(QThread): progress = pyqtSignal(int) @@ -89,7 +101,7 @@ class CalcAllFlaresThread(QThread): def run(self): cpuCount = multiprocessing.cpu_count() executor = concurrent.futures.ProcessPoolExecutor(cpuCount) - + #resFrame = pd.DataFrame([getFlareCount(entry) for entry in self.allFlaresDictList.to_dict(orient="records")]) resFrame = pd.DataFrame(executor.map(getFlareCount, self.allFlaresDictList.to_dict(orient="records"))) self.finished.emit(resFrame) \ No newline at end of file diff --git a/main/astrodatagui/FlareSummaryPlotGUI.py b/main/astrodatagui/FlareSummaryPlotGUI.py index e01880d..97e82d7 100644 --- a/main/astrodatagui/FlareSummaryPlotGUI.py +++ b/main/astrodatagui/FlareSummaryPlotGUI.py @@ -9,6 +9,38 @@ import numpy as np import pandas as pd from itertools import compress +def getNumFlaresInbetweenBound(flarePhasesPairs, lowerBound, higherBound): + count = 0 + for flarePhasePair in flarePhasesPairs: + if(flarePhasePair["Phase"] >= lowerBound and + flarePhasePair["Phase"] <= higherBound): + count += 1 + return count + +def getNumFlaresInBounds(flarePhasesPairs, bounds): + count = 0 + #print("bounds", bounds) + if(len(bounds) > 0): + for bound in bounds[0]: + #print("bound", bound) + if(bound[0] < bound[1]): + count += getNumFlaresInbetweenBound(flarePhasesPairs, bound[0], bound[1]) + else: + count += getNumFlaresInbetweenBound(flarePhasesPairs, bound[1], bound[0]) + return count + +def sumArrayLengths(series): + sumRes = 0 + for s in series: + sumRes += len(s) + return sumRes + +def sumArrayLengthsNorm(series): + sumRes = 0 + for s in series: + sumRes += len(s) + return sumRes / len(series) + class FlareSummaryPlotGUI(QWidget): def __init__(self, starFLareDictList): @@ -46,6 +78,15 @@ class FlareSummaryPlotGUI(QWidget): self.btShowPeriods = QPushButton("Show Mean Periods") self.btShowPeriods.clicked.connect(self.btShowPeriodsClicked) + self.btNumMinimaMaxima = QPushButton("Show num Minima/Maxima") + self.btNumMinimaMaxima.clicked.connect(self.btShowNumMinimaMaximaClicked) + self.btNumMinimaMaximaNorm = QPushButton("Show num Minima/Maxima Norm") + self.btNumMinimaMaximaNorm.clicked.connect(self.btShowNumMinimaMaximaNormalizedClicked) + self.btShowFlaresInMinimaMaxima = QPushButton("Show num Flares in Minima/Maxima") + self.btShowFlaresInMinimaMaxima.clicked.connect(self.btShowFlaresInMinimaMaximaClicked) + self.btShowFlaresInMinimaMaximaPerMinimaMaxima = QPushButton("Show num Flares Minima/Maxima normalized") + self.btShowFlaresInMinimaMaximaPerMinimaMaxima.clicked.connect(self.btShowFlaresInMinimaMaximaPerMinimaMaximaClicked) + self.cbKepler = QCheckBox("Kepler") self.cbKepler.setChecked(True) self.cbK2 = QCheckBox("K2") @@ -66,11 +107,20 @@ class FlareSummaryPlotGUI(QWidget): self.cbSpTypeUnknown = QCheckBox("Unknown") self.cbSpTypeUnknown.setChecked(True) + self.cbShowSAP = QCheckBox("SAP") + self.cbShowSAP.setChecked(True) + self.cbShowPDCSAP = QCheckBox("PDCSAP") + self.cbShowPDCSAP.setChecked(True) + self.buttonGridLayout.addWidget(QLabel("Plot Types: "), 0, 0) self.buttonGridLayout.addWidget(self.btShowFlaresPerFile, 0, 1) self.buttonGridLayout.addWidget(self.btShowFlaresPerStar, 0, 2) self.buttonGridLayout.addWidget(self.btShowFlaresPerStarNormalized, 0, 3) self.buttonGridLayout.addWidget(self.btShowPeriods, 0, 4) + self.buttonGridLayout.addWidget(self.btNumMinimaMaxima, 0, 5) + self.buttonGridLayout.addWidget(self.btNumMinimaMaximaNorm, 0, 6) + self.buttonGridLayout.addWidget(self.btShowFlaresInMinimaMaxima, 0, 7) + self.buttonGridLayout.addWidget(self.btShowFlaresInMinimaMaximaPerMinimaMaxima, 0, 8) self.buttonGridLayout.addWidget(QLabel("Sources: "), 1, 0) self.buttonGridLayout.addWidget(self.cbKepler, 1, 1) @@ -84,6 +134,10 @@ class FlareSummaryPlotGUI(QWidget): self.buttonGridLayout.addWidget(self.cbSpTypeG, 2, 4) self.buttonGridLayout.addWidget(self.cbSpTypeF, 2, 5) self.buttonGridLayout.addWidget(self.cbSpTypeUnknown, 2, 6) + + self.buttonGridLayout.addWidget(self.cbShowSAP, 3, 0) + self.buttonGridLayout.addWidget(self.cbShowPDCSAP, 3, 1) + self.mainLayout.addLayout(self.buttonGridLayout) self.mainLayout.addWidget(toolbar) self.mainLayout.addWidget(fc) @@ -134,28 +188,40 @@ class FlareSummaryPlotGUI(QWidget): self.figureAxis.clear() if(self.cbSpTypeL.isChecked()): if(np.any(Lfilter)): - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeaksCount"], marker="o", color="brown", label="L SAP Count") - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeaksCount"], marker="x", color="brown", label="L PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeaksCount"], marker="o", color="brown", label="L SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeaksCount"], marker="x", color="brown", label="L PDCSAP Count") if(self.cbSpTypeM.isChecked()): if(np.any(Mfilter)): - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeaksCount"], marker="o", color="red", label="M SAP Count") - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeaksCount"], marker="x", color="red", label="M PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeaksCount"], marker="o", color="red", label="M SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeaksCount"], marker="x", color="red", label="M PDCSAP Count") if(self.cbSpTypeK.isChecked()): if(np.any(Kfilter)): - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeaksCount"], marker="o", color="orange", label="K SAP Count") - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeaksCount"], marker="x", color="orange", label="K PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeaksCount"], marker="o", color="orange", label="K SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeaksCount"], marker="x", color="orange", label="K PDCSAP Count") if(self.cbSpTypeG.isChecked()): if(np.any(Gfilter)): - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeaksCount"], marker="o", color="yellow", label="G SAP Count") - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeaksCount"], marker="x", color="yellow", label="G PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeaksCount"], marker="o", color="yellow", label="G SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeaksCount"], marker="x", color="yellow", label="G PDCSAP Count") if(self.cbSpTypeF.isChecked()): if(np.any(Ffilter)): - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeaksCount"], marker="o", color="greenyellow", label="F SAP Count") - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeaksCount"], marker="x", color="greenyellow", label="F PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeaksCount"], marker="o", color="greenyellow", label="F SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeaksCount"], marker="x", color="greenyellow", label="F PDCSAP Count") if(self.cbSpTypeUnknown.isChecked()): if(np.any(Unknownfilter)): - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeaksCount"], marker="o", color="gray", label="Unknown SAP Count") - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeaksCount"], marker="x", color="gray", label="Unknown PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeaksCount"], marker="o", color="gray", label="Unknown SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeaksCount"], marker="x", color="gray", label="Unknown PDCSAP Count") self.figureAxis.set_ylabel("Flare count") self.figureAxis.set_xlabel("File Number") @@ -224,28 +290,40 @@ class FlareSummaryPlotGUI(QWidget): self.figureAxis.clear() if(self.cbSpTypeL.isChecked()): if(np.any(Lfilter)): - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeaksCount"], marker="o", color="brown", label="L SAP Count") - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeaksCount"], marker="x", color="brown", label="L PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeaksCount"], marker="o", color="brown", label="L SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeaksCount"], marker="x", color="brown", label="L PDCSAP Count") if(self.cbSpTypeM.isChecked()): if(np.any(Mfilter)): - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeaksCount"], marker="o", color="red", label="M SAP Count") - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeaksCount"], marker="x", color="red", label="M PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeaksCount"], marker="o", color="red", label="M SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeaksCount"], marker="x", color="red", label="M PDCSAP Count") if(self.cbSpTypeK.isChecked()): if(np.any(Kfilter)): - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeaksCount"], marker="o", color="orange", label="K SAP Count") - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeaksCount"], marker="x", color="orange", label="K PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeaksCount"], marker="o", color="orange", label="K SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeaksCount"], marker="x", color="orange", label="K PDCSAP Count") if(self.cbSpTypeG.isChecked()): if(np.any(Gfilter)): - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeaksCount"], marker="o", color="yellow", label="G SAP Count") - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeaksCount"], marker="x", color="yellow", label="G PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeaksCount"], marker="o", color="yellow", label="G SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeaksCount"], marker="x", color="yellow", label="G PDCSAP Count") if(self.cbSpTypeF.isChecked()): if(np.any(Ffilter)): - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeaksCount"], marker="o", color="greenyellow", label="F SAP Count") - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeaksCount"], marker="x", color="greenyellow", label="F PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeaksCount"], marker="o", color="greenyellow", label="F SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeaksCount"], marker="x", color="greenyellow", label="F PDCSAP Count") if(self.cbSpTypeUnknown.isChecked()): if(np.any(Unknownfilter)): - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeaksCount"], marker="o", color="gray", label="Unknown SAP Count") - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeaksCount"], marker="x", color="gray", label="Unknown PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeaksCount"], marker="o", color="gray", label="Unknown SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeaksCount"], marker="x", color="gray", label="Unknown PDCSAP Count") self.figureAxis.set_ylabel("Flare count") self.figureAxis.set_xlabel("Star Number") @@ -317,40 +395,52 @@ class FlareSummaryPlotGUI(QWidget): self.figureAxis.clear() if(self.cbSpTypeL.isChecked()): if(np.any(Lfilter)): - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeaksCount"]/(data[Lfilter]["sapValidSeconds"]/60/60/24/7), - marker="o", color="brown", label="L SAP Count") - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeaksCount"]/(data[Lfilter]["pdcsapValidSeconds"]/60/60/24/7), - marker="x", color="brown", label="L PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeaksCount"]/(data[Lfilter]["sapValidSeconds"]/60/60/24/7), + marker="o", color="brown", label="L SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeaksCount"]/(data[Lfilter]["pdcsapValidSeconds"]/60/60/24/7), + marker="x", color="brown", label="L PDCSAP Count") if(self.cbSpTypeM.isChecked()): if(np.any(Mfilter)): - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeaksCount"]/(data[Mfilter]["sapValidSeconds"]/60/60/24/7), - marker="o", color="red", label="M SAP Count") - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeaksCount"]/(data[Mfilter]["pdcsapValidSeconds"]/60/60/24/7), - marker="x", color="red", label="M PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeaksCount"]/(data[Mfilter]["sapValidSeconds"]/60/60/24/7), + marker="o", color="red", label="M SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeaksCount"]/(data[Mfilter]["pdcsapValidSeconds"]/60/60/24/7), + marker="x", color="red", label="M PDCSAP Count") if(self.cbSpTypeK.isChecked()): if(np.any(Kfilter)): - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeaksCount"]/(data[Kfilter]["sapValidSeconds"]/60/60/24/7), - marker="o", color="orange", label="K SAP Count") - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeaksCount"]/(data[Kfilter]["pdcsapValidSeconds"]/60/60/24/7), - marker="x", color="orange", label="K PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeaksCount"]/(data[Kfilter]["sapValidSeconds"]/60/60/24/7), + marker="o", color="orange", label="K SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeaksCount"]/(data[Kfilter]["pdcsapValidSeconds"]/60/60/24/7), + marker="x", color="orange", label="K PDCSAP Count") if(self.cbSpTypeG.isChecked()): if(np.any(Gfilter)): - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeaksCount"]/(data[Gfilter]["sapValidSeconds"]/60/60/24/7), - marker="o", color="yellow", label="G SAP Count") - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeaksCount"]/(data[Gfilter]["pdcsapValidSeconds"]/60/60/24/7), - marker="x", color="yellow", label="G PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeaksCount"]/(data[Gfilter]["sapValidSeconds"]/60/60/24/7), + marker="o", color="yellow", label="G SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeaksCount"]/(data[Gfilter]["pdcsapValidSeconds"]/60/60/24/7), + marker="x", color="yellow", label="G PDCSAP Count") if(self.cbSpTypeF.isChecked()): if(np.any(Ffilter)): - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeaksCount"]/(data[Ffilter]["sapValidSeconds"]/60/60/24/7), - marker="o", color="greenyellow", label="F SAP Count") - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeaksCount"]/(data[Ffilter]["pdcsapValidSeconds"]/60/60/24/7), - marker="x", color="greenyellow", label="F PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeaksCount"]/(data[Ffilter]["sapValidSeconds"]/60/60/24/7), + marker="o", color="greenyellow", label="F SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeaksCount"]/(data[Ffilter]["pdcsapValidSeconds"]/60/60/24/7), + marker="x", color="greenyellow", label="F PDCSAP Count") if(self.cbSpTypeUnknown.isChecked()): if(np.any(Unknownfilter)): - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeaksCount"]/(data[Unknownfilter]["sapValidSeconds"]/60/60/24/7), - marker="o", color="gray", label="Unknown SAP Count") - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeaksCount"]/(data[Unknownfilter]["pdcsapValidSeconds"]/60/60/24/7), - marker="x", color="gray", label="Unknown PDCSAP Count") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeaksCount"]/(data[Unknownfilter]["sapValidSeconds"]/60/60/24/7), + marker="o", color="gray", label="Unknown SAP Count") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeaksCount"]/(data[Unknownfilter]["pdcsapValidSeconds"]/60/60/24/7), + marker="x", color="gray", label="Unknown PDCSAP Count") self.figureAxis.set_ylabel("Flare count per Week") self.figureAxis.set_xlabel("Star Number") @@ -424,40 +514,52 @@ class FlareSummaryPlotGUI(QWidget): self.figureAxis.clear() if(self.cbSpTypeL.isChecked()): if(np.any(Lfilter)): - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeriod"], - marker="o", color="brown", label="L SAP Period") - self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeriod"], - marker="x", color="brown", label="L PDCSAP Period") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeriod"], + marker="o", color="brown", label="L SAP Period") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeriod"], + marker="x", color="brown", label="L PDCSAP Period") if(self.cbSpTypeM.isChecked()): if(np.any(Mfilter)): - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeriod"], - marker="o", color="red", label="M SAP Period") - self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeriod"], - marker="x", color="red", label="M PDCSAP Period") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeriod"], + marker="o", color="red", label="M SAP Period") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeriod"], + marker="x", color="red", label="M PDCSAP Period") if(self.cbSpTypeK.isChecked()): if(np.any(Kfilter)): - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeriod"], - marker="o", color="orange", label="K SAP Period") - self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeriod"], - marker="x", color="orange", label="K PDCSAP Period") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeriod"], + marker="o", color="orange", label="K SAP Period") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeriod"], + marker="x", color="orange", label="K PDCSAP Period") if(self.cbSpTypeG.isChecked()): if(np.any(Gfilter)): - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeriod"], - marker="o", color="yellow", label="G SAP Period") - self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeriod"], - marker="x", color="yellow", label="G PDCSAP Period") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeriod"], + marker="o", color="yellow", label="G SAP Period") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeriod"], + marker="x", color="yellow", label="G PDCSAP Period") if(self.cbSpTypeF.isChecked()): if(np.any(Ffilter)): - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeriod"], - marker="o", color="greenyellow", label="F SAP Period") - self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeriod"], - marker="x", color="greenyellow", label="F PDCSAP Period") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeriod"], + marker="o", color="greenyellow", label="F SAP Period") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeriod"], + marker="x", color="greenyellow", label="F PDCSAP Period") if(self.cbSpTypeUnknown.isChecked()): if(np.any(Unknownfilter)): - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeriod"], - marker="o", color="gray", label="Unknown SAP Period") - self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeriod"], - marker="x", color="gray", label="Unknown PDCSAP Period") + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeriod"], + marker="o", color="gray", label="Unknown SAP Period") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeriod"], + marker="x", color="gray", label="Unknown PDCSAP Period") self.figureAxis.set_ylabel("Period / days") self.figureAxis.set_xlabel("Star Number") @@ -466,10 +568,730 @@ class FlareSummaryPlotGUI(QWidget): pass def btShowNumMinimaMaximaClicked(self): + data = self.starFLareDictList.drop(columns=['Distance', + 'DistanceUnit', + 'FilePath', + 'RotVel', + 'RotVelUnit', + 'Sequence', + 'pdcsapFits', + 'sapFits', + 'sapValidTimespans', + 'pdcsapValidTimespans', + 'sapPeaksCount', + 'pdcsapPeaksCount', + 'sapValidSeconds', + 'pdcsapValidSeconds']) + + showSourceFilter = np.full(len(data), False) + + if(self.cbKepler.isChecked()): + showKepler = data["Source"] == "Kepler" + showSourceFilter |= showKepler + if(self.cbK2.isChecked()): + showK2 = data["Source"] == "K2" + showSourceFilter |= showK2 + if(self.cbTESS.isChecked()): + showTESS = data["Source"] == "TESS" + showSourceFilter |= showTESS + + print(data["sapPeriod"]) + + data = data[showSourceFilter].groupby(["StarName", "SpType"], + as_index=False).agg({"sapPeriodMinima": sumArrayLengths, + "sapPeriodMaxima": sumArrayLengths, + "pdcsapPeriodMinima": sumArrayLengths, + "pdcsapPeriodMaxima": sumArrayLengths}) + x = np.arange(start=1, stop=len(data)+1, step=1, dtype=int) + + if(self.cbSpTypeL.isChecked()): + Lfilter = data["SpType"].str.startswith("L") + Lfilter &= showSourceFilter + if(self.cbSpTypeM.isChecked()): + Mfilter = data["SpType"].str.startswith("M") + Mfilter &= showSourceFilter + if(self.cbSpTypeK.isChecked()): + Kfilter = data["SpType"].str.startswith("K") + Kfilter &= showSourceFilter + if(self.cbSpTypeG.isChecked()): + Gfilter = data["SpType"].str.startswith("G") + Gfilter &= showSourceFilter + if(self.cbSpTypeF.isChecked()): + Ffilter = data["SpType"].str.startswith("F") + Ffilter &= showSourceFilter + if(self.cbSpTypeUnknown.isChecked()): + Unknownfilter = data["SpType"].str.startswith("-") + Unknownfilter &= showSourceFilter + + self.figureAxis.clear() + if(self.cbSpTypeL.isChecked()): + if(np.any(Lfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeriodMinima"], + marker="v", color="brown", label="L SAP Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeriodMaxima"], + marker="^", color="brown", label="L SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeriodMinima"], + marker="<", color="brown", label="L PDCSAP Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeriodMaxima"], + marker=">", color="brown", label="L PDCSAP Maxima") + if(self.cbSpTypeM.isChecked()): + if(np.any(Mfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeriodMinima"], + marker="v", color="red", label="M SAP Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeriodMaxima"], + marker="^", color="red", label="M SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeriodMinima"], + marker="<", color="red", label="M PDCSAP Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeriodMaxima"], + marker=">", color="red", label="M PDCSAP Maxima") + if(self.cbSpTypeK.isChecked()): + if(np.any(Kfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeriodMinima"], + marker="v", color="orange", label="K SAP Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeriodMaxima"], + marker="^", color="orange", label="K SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeriodMinima"], + marker="<", color="orange", label="K PDCSAP Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeriodMaxima"], + marker=">", color="orange", label="K PDCSAP Maxima") + if(self.cbSpTypeG.isChecked()): + if(np.any(Gfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeriodMinima"], + marker="v", color="yellow", label="G SAP Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeriodMaxima"], + marker="^", color="yellow", label="G SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeriodMinima"], + marker="<", color="yellow", label="G PDCSAP Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeriodMaxima"], + marker=">", color="yellow", label="G PDCSAP Maxima") + if(self.cbSpTypeF.isChecked()): + if(np.any(Ffilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeriodMinima"], + marker="v", color="greenyellow", label="F SAP Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeriodMaxima"], + marker="^", color="greenyellow", label="F SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeriodMinima"], + marker="<", color="greenyellow", label="F PDCSAP Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeriodMaxima"], + marker=">", color="greenyellow", label="F PDCSAP Maxima") + if(self.cbSpTypeUnknown.isChecked()): + if(np.any(Unknownfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeriodMinima"], + marker="v", color="gray", label="Unknown SAP Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeriodMaxima"], + marker="^", color="gray", label="Unknown SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeriodMinima"], + marker="<", color="gray", label="Unknown PDCSAP Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeriodMaxima"], + marker=">", color="gray", label="Unknown PDCSAP Maxima") + + self.figureAxis.set_ylabel("Amount") + self.figureAxis.set_xlabel("Star Number") + self.figureAxis.legend() + self.figure.canvas.draw_idle() + pass + + def btShowNumMinimaMaximaNormalizedClicked(self): + data = self.starFLareDictList.drop(columns=['Distance', + 'DistanceUnit', + 'FilePath', + 'RotVel', + 'RotVelUnit', + 'Sequence', + 'pdcsapFits', + 'sapFits', + 'sapValidTimespans', + 'pdcsapValidTimespans', + 'sapPeaksCount', + 'pdcsapPeaksCount', + 'sapValidSeconds', + 'pdcsapValidSeconds']) + + showSourceFilter = np.full(len(data), False) + + if(self.cbKepler.isChecked()): + showKepler = data["Source"] == "Kepler" + showSourceFilter |= showKepler + if(self.cbK2.isChecked()): + showK2 = data["Source"] == "K2" + showSourceFilter |= showK2 + if(self.cbTESS.isChecked()): + showTESS = data["Source"] == "TESS" + showSourceFilter |= showTESS + + print(data["sapPeriod"]) + + data = data[showSourceFilter].groupby(["StarName", "SpType"], + as_index=False).agg({"sapPeriodMinima": sumArrayLengthsNorm, + "sapPeriodMaxima": sumArrayLengthsNorm, + "pdcsapPeriodMinima": sumArrayLengthsNorm, + "pdcsapPeriodMaxima": sumArrayLengthsNorm}) + x = np.arange(start=1, stop=len(data)+1, step=1, dtype=int) + + if(self.cbSpTypeL.isChecked()): + Lfilter = data["SpType"].str.startswith("L") + Lfilter &= showSourceFilter + if(self.cbSpTypeM.isChecked()): + Mfilter = data["SpType"].str.startswith("M") + Mfilter &= showSourceFilter + if(self.cbSpTypeK.isChecked()): + Kfilter = data["SpType"].str.startswith("K") + Kfilter &= showSourceFilter + if(self.cbSpTypeG.isChecked()): + Gfilter = data["SpType"].str.startswith("G") + Gfilter &= showSourceFilter + if(self.cbSpTypeF.isChecked()): + Ffilter = data["SpType"].str.startswith("F") + Ffilter &= showSourceFilter + if(self.cbSpTypeUnknown.isChecked()): + Unknownfilter = data["SpType"].str.startswith("-") + Unknownfilter &= showSourceFilter + + self.figureAxis.clear() + if(self.cbSpTypeL.isChecked()): + if(np.any(Lfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeriodMinima"], + marker="v", color="brown", label="L SAP Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["sapPeriodMaxima"], + marker="^", color="brown", label="L SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeriodMinima"], + marker="<", color="brown", label="L PDCSAP Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["pdcsapPeriodMaxima"], + marker=">", color="brown", label="L PDCSAP Maxima") + if(self.cbSpTypeM.isChecked()): + if(np.any(Mfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeriodMinima"], + marker="v", color="red", label="M SAP Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["sapPeriodMaxima"], + marker="^", color="red", label="M SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeriodMinima"], + marker="<", color="red", label="M PDCSAP Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["pdcsapPeriodMaxima"], + marker=">", color="red", label="M PDCSAP Maxima") + if(self.cbSpTypeK.isChecked()): + if(np.any(Kfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeriodMinima"], + marker="v", color="orange", label="K SAP Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["sapPeriodMaxima"], + marker="^", color="orange", label="K SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeriodMinima"], + marker="<", color="orange", label="K PDCSAP Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["pdcsapPeriodMaxima"], + marker=">", color="orange", label="K PDCSAP Maxima") + if(self.cbSpTypeG.isChecked()): + if(np.any(Gfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeriodMinima"], + marker="v", color="yellow", label="G SAP Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["sapPeriodMaxima"], + marker="^", color="yellow", label="G SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeriodMinima"], + marker="<", color="yellow", label="G PDCSAP Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["pdcsapPeriodMaxima"], + marker=">", color="yellow", label="G PDCSAP Maxima") + if(self.cbSpTypeF.isChecked()): + if(np.any(Ffilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeriodMinima"], + marker="v", color="greenyellow", label="F SAP Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["sapPeriodMaxima"], + marker="^", color="greenyellow", label="F SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeriodMinima"], + marker="<", color="greenyellow", label="F PDCSAP Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["pdcsapPeriodMaxima"], + marker=">", color="greenyellow", label="F PDCSAP Maxima") + if(self.cbSpTypeUnknown.isChecked()): + if(np.any(Unknownfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeriodMinima"], + marker="v", color="gray", label="Unknown SAP Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["sapPeriodMaxima"], + marker="^", color="gray", label="Unknown SAP Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeriodMinima"], + marker="<", color="gray", label="Unknown PDCSAP Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["pdcsapPeriodMaxima"], + marker=">", color="gray", label="Unknown PDCSAP Maxima") + + self.figureAxis.set_ylabel("Amount") + self.figureAxis.set_xlabel("Star Number") + self.figureAxis.legend() + self.figure.canvas.draw_idle() pass def btShowFlaresInMinimaMaximaClicked(self): + data = self.starFLareDictList.drop(columns=['Distance', + 'DistanceUnit', + 'FilePath', + 'RotVel', + 'RotVelUnit', + 'Sequence', + 'pdcsapFits', + 'sapFits', + 'sapValidTimespans', + 'pdcsapValidTimespans', + 'sapPeaksCount', + 'pdcsapPeaksCount', + 'sapValidSeconds', + 'pdcsapValidSeconds']) + + showSourceFilter = np.full(len(data), False) + + if(self.cbKepler.isChecked()): + showKepler = data["Source"] == "Kepler" + showSourceFilter |= showKepler + if(self.cbK2.isChecked()): + showK2 = data["Source"] == "K2" + showSourceFilter |= showK2 + if(self.cbTESS.isChecked()): + showTESS = data["Source"] == "TESS" + showSourceFilter |= showTESS + + print(data["sapPeriod"]) + + finalData = [] + #data = data[showSourceFilter].groupby(["StarName", "SpType"], + # as_index=False).agg({"sapPeriod": "mean", + # "pdcsapPeriod": "mean"}) + for ind, row in data[showSourceFilter].reset_index().iterrows(): + print("sapPeriodMinimaBoundaries", row["sapPeriodMinimaBoundaries"]) + print("sapPeriodMaximaBoundaries", row["sapPeriodMaximaBoundaries"]) + print("pdcsapPeriodMinimaBoundaries", row["pdcsapPeriodMinimaBoundaries"]) + print("pdcsapPeriodMaximaBoundaries", row["pdcsapPeriodMaximaBoundaries"]) + minimaCountSAP = getNumFlaresInBounds(row["sapFoldedPeaksPhasePair"], + row["sapPeriodMinimaBoundaries"]) + minimaCountPDCSAP = getNumFlaresInBounds(row["pdcsapFoldedPeaksPhasePair"], + row["pdcsapPeriodMinimaBoundaries"]) + maximaCountSAP = getNumFlaresInBounds(row["sapFoldedPeaksPhasePair"], + row["sapPeriodMaximaBoundaries"]) + maximaCountPDCSAP = getNumFlaresInBounds(row["pdcsapFoldedPeaksPhasePair"], + row["pdcsapPeriodMaximaBoundaries"]) + finalData.append({"SpType": row["SpType"], "StarName": row["StarName"], + "minimaCountSAP": minimaCountSAP, "maximaCountSAP": maximaCountSAP, + "minimaCountPDCSAP": minimaCountPDCSAP, "maximaCountPDCSAP": maximaCountPDCSAP}) + + data = pd.DataFrame(finalData).groupby(["StarName", "SpType"], + as_index=False).agg({"minimaCountSAP": "sum", + "maximaCountSAP": "sum", + "minimaCountPDCSAP": "sum", + "maximaCountPDCSAP": "sum"}) + x = np.arange(start=1, stop=len(data)+1, step=1, dtype=int) + + if(self.cbSpTypeL.isChecked()): + Lfilter = data["SpType"].str.startswith("L") + Lfilter &= showSourceFilter + if(self.cbSpTypeM.isChecked()): + Mfilter = data["SpType"].str.startswith("M") + Mfilter &= showSourceFilter + if(self.cbSpTypeK.isChecked()): + Kfilter = data["SpType"].str.startswith("K") + Kfilter &= showSourceFilter + if(self.cbSpTypeG.isChecked()): + Gfilter = data["SpType"].str.startswith("G") + Gfilter &= showSourceFilter + if(self.cbSpTypeF.isChecked()): + Ffilter = data["SpType"].str.startswith("F") + Ffilter &= showSourceFilter + if(self.cbSpTypeUnknown.isChecked()): + Unknownfilter = data["SpType"].str.startswith("-") + Unknownfilter &= showSourceFilter + + self.figureAxis.clear() + if(self.cbSpTypeL.isChecked()): + if(np.any(Lfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["minimaCountSAP"], + marker="v", color="brown", label="L SAP in Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["maximaCountSAP"], + marker="^", color="brown", label="L SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["minimaCountPDCSAP"], + marker="<", color="brown", label="L PDCSAP in Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["maximaCountPDCSAP"], + marker=">", color="brown", label="L PDCSAP in Maxima") + if(self.cbSpTypeM.isChecked()): + if(np.any(Mfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["minimaCountSAP"], + marker="v", color="red", label="M SAP in Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["maximaCountSAP"], + marker="^", color="red", label="M SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["minimaCountPDCSAP"], + marker="<", color="red", label="M PDCSAP in Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["maximaCountPDCSAP"], + marker=">", color="red", label="M PDCSAP in Maxima") + if(self.cbSpTypeK.isChecked()): + if(np.any(Kfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["minimaCountSAP"], + marker="v", color="orange", label="K SAP in Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["maximaCountSAP"], + marker="^", color="orange", label="K SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["minimaCountPDCSAP"], + marker="<", color="orange", label="K PDCSAP in Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["maximaCountPDCSAP"], + marker=">", color="orange", label="K PDCSAP in Maxima") + if(self.cbSpTypeG.isChecked()): + if(np.any(Gfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["minimaCountSAP"], + marker="v", color="yellow", label="G SAP in Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["maximaCountSAP"], + marker="^", color="yellow", label="G SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["minimaCountPDCSAP"], + marker="<", color="yellow", label="G PDCSAP in Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["maximaCountPDCSAP"], + marker=">", color="yellow", label="G PDCSAP in Maxima") + if(self.cbSpTypeF.isChecked()): + if(np.any(Ffilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["minimaCountSAP"], + marker="v", color="greenyellow", label="F SAP in Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["maximaCountSAP"], + marker="^", color="greenyellow", label="F SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["minimaCountPDCSAP"], + marker="<", color="greenyellow", label="F PDCSAP in Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["maximaCountPDCSAP"], + marker=">", color="greenyellow", label="F PDCSAP in Maxima") + if(self.cbSpTypeUnknown.isChecked()): + if(np.any(Unknownfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["minimaCountSAP"], + marker="v", color="gray", label="Unknown SAP in Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["maximaCountSAP"], + marker="^", color="gray", label="Unknown SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["minimaCountPDCSAP"], + marker="<", color="gray", label="Unknown PDCSAP in Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["maximaCountPDCSAP"], + marker=">", color="gray", label="Unknown PDCSAP in Maxima") + + self.figureAxis.set_ylabel("Flares in Minima/Maxima") + self.figureAxis.set_xlabel("Star Number") + self.figureAxis.legend() + self.figure.canvas.draw_idle() pass def btShowFlaresInMinimaMaximaPerMinimaMaximaClicked(self): - pass + data = self.starFLareDictList.drop(columns=['Distance', + 'DistanceUnit', + 'FilePath', + 'RotVel', + 'RotVelUnit', + 'Sequence', + 'pdcsapFits', + 'sapFits', + 'sapValidTimespans', + 'pdcsapValidTimespans', + 'sapPeaksCount', + 'pdcsapPeaksCount', + 'sapValidSeconds', + 'pdcsapValidSeconds']) + + showSourceFilter = np.full(len(data), False) + + if(self.cbKepler.isChecked()): + showKepler = data["Source"] == "Kepler" + showSourceFilter |= showKepler + if(self.cbK2.isChecked()): + showK2 = data["Source"] == "K2" + showSourceFilter |= showK2 + if(self.cbTESS.isChecked()): + showTESS = data["Source"] == "TESS" + showSourceFilter |= showTESS + + print(data["sapPeriod"]) + + finalData = [] + for ind, row in data[showSourceFilter].reset_index().iterrows(): + minimaCountSAP = getNumFlaresInBounds(row["sapFoldedPeaksPhasePair"], + row["sapPeriodMinimaBoundaries"]) + minimaCountPDCSAP = getNumFlaresInBounds(row["pdcsapFoldedPeaksPhasePair"], + row["pdcsapPeriodMinimaBoundaries"]) + maximaCountSAP = getNumFlaresInBounds(row["sapFoldedPeaksPhasePair"], + row["sapPeriodMaximaBoundaries"]) + maximaCountPDCSAP = getNumFlaresInBounds(row["pdcsapFoldedPeaksPhasePair"], + row["pdcsapPeriodMaximaBoundaries"]) + finalData.append({"SpType": row["SpType"], "StarName": row["StarName"], + "minimaCountSAP": minimaCountSAP, "maximaCountSAP": maximaCountSAP, + "minimasSAP": len(row["sapPeriodMinima"]), "maximasSAP": len(row["sapPeriodMaxima"]), + "minimaCountPDCSAP": minimaCountPDCSAP, "maximaCountPDCSAP": maximaCountPDCSAP, + "minimasPDCSAP": len(row["pdcsapPeriodMinima"]), "maximasPDCSAP": len(row["pdcsapPeriodMaxima"])}) + + data = pd.DataFrame(finalData).groupby(["StarName", "SpType"], + as_index=False).agg({"minimaCountSAP": "sum", + "maximaCountSAP": "sum", + "minimasSAP": "sum", + "maximasSAP": "sum", + "minimaCountPDCSAP": "sum", + "maximaCountPDCSAP": "sum", + "minimasPDCSAP": "sum", + "maximasPDCSAP": "sum"}) + x = np.arange(start=1, stop=len(data)+1, step=1, dtype=int) + + if(self.cbSpTypeL.isChecked()): + Lfilter = data["SpType"].str.startswith("L") + Lfilter &= showSourceFilter + if(self.cbSpTypeM.isChecked()): + Mfilter = data["SpType"].str.startswith("M") + Mfilter &= showSourceFilter + if(self.cbSpTypeK.isChecked()): + Kfilter = data["SpType"].str.startswith("K") + Kfilter &= showSourceFilter + if(self.cbSpTypeG.isChecked()): + Gfilter = data["SpType"].str.startswith("G") + Gfilter &= showSourceFilter + if(self.cbSpTypeF.isChecked()): + Ffilter = data["SpType"].str.startswith("F") + Ffilter &= showSourceFilter + if(self.cbSpTypeUnknown.isChecked()): + Unknownfilter = data["SpType"].str.startswith("-") + Unknownfilter &= showSourceFilter + + self.figureAxis.clear() + if(self.cbSpTypeL.isChecked()): + if(np.any(Lfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["minimaCountSAP"]/data[Lfilter]["minimasSAP"], + marker="v", color="brown", label="L SAP in Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["maximaCountSAP"]/data[Lfilter]["maximasSAP"], + marker="^", color="brown", label="L SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["minimaCountPDCSAP"]/data[Lfilter]["minimasPDCSAP"], + marker="<", color="brown", label="L PDCSAP in Minima") + self.figureAxis.scatter(x[Lfilter], data[Lfilter]["maximaCountPDCSAP"]/data[Lfilter]["maximasPDCSAP"], + marker=">", color="brown", label="L PDCSAP in Maxima") + if(self.cbSpTypeM.isChecked()): + if(np.any(Mfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["minimaCountSAP"]/data[Mfilter]["minimasSAP"], + marker="v", color="red", label="M SAP in Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["maximaCountSAP"]/data[Mfilter]["maximasSAP"], + marker="^", color="red", label="M SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["minimaCountPDCSAP"]/data[Mfilter]["minimasPDCSAP"], + marker="<", color="red", label="M PDCSAP in Minima") + self.figureAxis.scatter(x[Mfilter], data[Mfilter]["maximaCountPDCSAP"]/data[Mfilter]["maximasPDCSAP"], + marker=">", color="red", label="M PDCSAP in Maxima") + if(self.cbSpTypeK.isChecked()): + if(np.any(Kfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["minimaCountSAP"]/data[Kfilter]["minimasSAP"], + marker="v", color="orange", label="K SAP in Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["maximaCountSAP"]/data[Kfilter]["maximasSAP"], + marker="^", color="orange", label="K SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["minimaCountPDCSAP"]/data[Kfilter]["minimasPDCSAP"], + marker="<", color="orange", label="K PDCSAP in Minima") + self.figureAxis.scatter(x[Kfilter], data[Kfilter]["maximaCountPDCSAP"]/data[Kfilter]["maximasPDCSAP"], + marker=">", color="orange", label="K PDCSAP in Maxima") + if(self.cbSpTypeG.isChecked()): + if(np.any(Gfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["minimaCountSAP"]/data[Gfilter]["minimasSAP"], + marker="v", color="yellow", label="G SAP in Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["maximaCountSAP"]/data[Gfilter]["maximasSAP"], + marker="^", color="yellow", label="G SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["minimaCountPDCSAP"]/data[Gfilter]["minimasPDCSAP"], + marker="<", color="yellow", label="G PDCSAP in Minima") + self.figureAxis.scatter(x[Gfilter], data[Gfilter]["maximaCountPDCSAP"]/data[Gfilter]["maximasPDCSAP"], + marker=">", color="yellow", label="G PDCSAP in Maxima") + if(self.cbSpTypeF.isChecked()): + if(np.any(Ffilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["minimaCountSAP"]/data[Ffilter]["minimasSAP"], + marker="v", color="greenyellow", label="F SAP in Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["maximaCountSAP"]/data[Ffilter]["maximasSAP"], + marker="^", color="greenyellow", label="F SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["minimaCountPDCSAP"]/data[Ffilter]["minimasPDCSAP"], + marker="<", color="greenyellow", label="F PDCSAP in Minima") + self.figureAxis.scatter(x[Ffilter], data[Ffilter]["maximaCountPDCSAP"]/data[Ffilter]["maximasPDCSAP"], + marker=">", color="greenyellow", label="F PDCSAP in Maxima") + if(self.cbSpTypeUnknown.isChecked()): + if(np.any(Unknownfilter)): + if(self.cbShowSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["minimaCountSAP"]/data[Unknownfilter]["minimasSAP"], + marker="v", color="gray", label="Unknown SAP in Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["maximaCountSAP"]/data[Unknownfilter]["maximasSAP"], + marker="^", color="gray", label="Unknown SAP in Maxima") + if(self.cbShowPDCSAP.isChecked()): + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["minimaCountPDCSAP"]/data[Unknownfilter]["minimasPDCSAP"], + marker="<", color="gray", label="Unknown PDCSAP in Minima") + self.figureAxis.scatter(x[Unknownfilter], data[Unknownfilter]["maximaCountPDCSAP"]/data[Unknownfilter]["maximasPDCSAP"], + marker=">", color="gray", label="Unknown PDCSAP in Maxima") + + self.figureAxis.set_ylabel("Avg. flares per minima/maxima") + self.figureAxis.set_xlabel("Star Number") + self.figureAxis.legend() + self.figure.canvas.draw_idle() + + # SAP + SAP_L_stars_minima_data = np.array(data[Lfilter]["minimaCountSAP"]/data[Lfilter]["minimasSAP"]) + SAP_L_stars_maxima_data = np.array(data[Lfilter]["maximaCountSAP"]/data[Lfilter]["maximasSAP"]) + + SAP_M_stars_minima_data = np.array(data[Mfilter]["minimaCountSAP"]/data[Mfilter]["minimasSAP"]) + SAP_M_stars_maxima_data = np.array(data[Mfilter]["maximaCountSAP"]/data[Mfilter]["maximasSAP"]) + + SAP_K_stars_minima_data = np.array(data[Kfilter]["minimaCountSAP"]/data[Kfilter]["minimasSAP"]) + SAP_K_stars_maxima_data = np.array(data[Kfilter]["maximaCountSAP"]/data[Kfilter]["maximasSAP"]) + + SAP_G_stars_minima_data = np.array(data[Gfilter]["minimaCountSAP"]/data[Gfilter]["minimasSAP"]) + SAP_G_stars_maxima_data = np.array(data[Gfilter]["maximaCountSAP"]/data[Gfilter]["maximasSAP"]) + + SAP_F_stars_minima_data = np.array(data[Ffilter]["minimaCountSAP"]/data[Ffilter]["minimasSAP"]) + SAP_F_stars_maxima_data = np.array(data[Ffilter]["maximaCountSAP"]/data[Ffilter]["maximasSAP"]) + + SAP_Unknown_stars_minima_data = np.array(data[Unknownfilter]["minimaCountSAP"]/data[Unknownfilter]["minimasSAP"]) + SAP_Unknown_stars_maxima_data = np.array(data[Unknownfilter]["maximaCountSAP"]/data[Unknownfilter]["maximasSAP"]) + np.set_printoptions(linewidth=1000, precision=2) + print("---------------------------------------------------------") + print("SAP Summary:") + SAPtotalMin = 0 + SAPtotalMax = 0 + if(len(SAP_L_stars_minima_data) > 0): + print("L Stars Minima: ", SAP_L_stars_minima_data) + print("L Stars Minima Sum: ", np.nansum(SAP_L_stars_minima_data)) + SAPtotalMin += np.nansum(SAP_L_stars_minima_data) + if(len(SAP_L_stars_maxima_data) > 0): + print("L Stars Maxima: ", SAP_L_stars_maxima_data) + print("L Stars Maxima Sum: ", np.nansum(SAP_L_stars_maxima_data)) + SAPtotalMax += np.nansum(SAP_L_stars_maxima_data) + if(len(SAP_M_stars_minima_data) > 0): + print("M Stars Minima: ", SAP_M_stars_minima_data) + print("M Stars Minima Sum: ", np.nansum(SAP_M_stars_minima_data)) + SAPtotalMin += np.nansum(SAP_M_stars_minima_data) + if(len(SAP_M_stars_maxima_data) > 0): + print("M Stars Maxima: ", SAP_M_stars_maxima_data) + print("M Stars Maxima Sum: ", np.nansum(SAP_M_stars_maxima_data)) + SAPtotalMax += np.nansum(SAP_M_stars_maxima_data) + if(len(SAP_K_stars_minima_data) > 0): + print("K Stars Minima: ", SAP_K_stars_minima_data) + print("K Stars Minima Sum: ", np.nansum(SAP_K_stars_minima_data)) + SAPtotalMin += np.nansum(SAP_K_stars_minima_data) + if(len(SAP_K_stars_maxima_data) > 0): + print("K Stars Maxima: ", SAP_K_stars_maxima_data) + print("K Stars Maxima Sum: ", np.nansum(SAP_K_stars_maxima_data)) + SAPtotalMax += np.nansum(SAP_K_stars_maxima_data) + if(len(SAP_G_stars_minima_data) > 0): + print("G Stars Minima: ", SAP_G_stars_minima_data) + print("G Stars Minima Sum: ", np.nansum(SAP_G_stars_minima_data)) + SAPtotalMin += np.nansum(SAP_G_stars_minima_data) + if(len(SAP_G_stars_maxima_data) > 0): + print("G Stars Maxima: ", SAP_G_stars_maxima_data) + print("G Stars Maxima Sum: ", np.nansum(SAP_G_stars_maxima_data)) + SAPtotalMax += np.nansum(SAP_G_stars_maxima_data) + if(len(SAP_F_stars_minima_data) > 0): + print("F Stars Minima: ", SAP_F_stars_minima_data) + print("F Stars Minima Sum: ", np.nansum(SAP_F_stars_minima_data)) + SAPtotalMin += np.nansum(SAP_F_stars_minima_data) + if(len(SAP_F_stars_maxima_data) > 0): + print("F Stars Maxima: ", SAP_F_stars_maxima_data) + print("F Stars Maxima Sum: ", np.nansum(SAP_F_stars_maxima_data)) + SAPtotalMax += np.nansum(SAP_F_stars_maxima_data) + if(len(SAP_Unknown_stars_minima_data) > 0): + print("Unknown Stars Minima: ", SAP_Unknown_stars_minima_data) + print("Unknown Stars Minima Sum: ", np.nansum(SAP_Unknown_stars_minima_data)) + SAPtotalMin += np.nansum(SAP_Unknown_stars_minima_data) + if(len(SAP_Unknown_stars_maxima_data) > 0): + print("Unknown Stars Maxima: ", SAP_Unknown_stars_maxima_data) + print("Unknown Stars Maxima Sum: ", np.nansum(SAP_Unknown_stars_maxima_data)) + SAPtotalMax += np.nansum(SAP_Unknown_stars_maxima_data) + + print("Total Minima: ", SAPtotalMin) + print("Total Maxima: ", SAPtotalMax) + + # PDCSAP + PDCSAP_L_stars_minima_data = np.array(data[Lfilter]["minimaCountPDCSAP"]/data[Lfilter]["minimasPDCSAP"]) + PDCSAP_L_stars_maxima_data = np.array(data[Lfilter]["maximaCountPDCSAP"]/data[Lfilter]["maximasPDCSAP"]) + PDCSAP_M_stars_minima_data = np.array(data[Mfilter]["minimaCountPDCSAP"]/data[Mfilter]["minimasPDCSAP"]) + PDCSAP_M_stars_maxima_data = np.array(data[Mfilter]["maximaCountPDCSAP"]/data[Mfilter]["maximasPDCSAP"]) + PDCSAP_K_stars_minima_data = np.array(data[Kfilter]["minimaCountPDCSAP"]/data[Kfilter]["minimasPDCSAP"]) + PDCSAP_K_stars_maxima_data = np.array(data[Kfilter]["maximaCountPDCSAP"]/data[Kfilter]["maximasPDCSAP"]) + PDCSAP_G_stars_minima_data = np.array(data[Gfilter]["minimaCountPDCSAP"]/data[Gfilter]["minimasPDCSAP"]) + PDCSAP_G_stars_maxima_data = np.array(data[Gfilter]["maximaCountPDCSAP"]/data[Gfilter]["maximasPDCSAP"]) + PDCSAP_F_stars_minima_data = np.array(data[Ffilter]["minimaCountPDCSAP"]/data[Ffilter]["minimasPDCSAP"]) + PDCSAP_F_stars_maxima_data = np.array(data[Ffilter]["maximaCountPDCSAP"]/data[Ffilter]["maximasPDCSAP"]) + PDCSAP_Unknown_stars_minima_data = np.array(data[Unknownfilter]["minimaCountPDCSAP"]/data[Unknownfilter]["minimasPDCSAP"]) + PDCSAP_Unknown_stars_maxima_data = np.array(data[Unknownfilter]["maximaCountPDCSAP"]/data[Unknownfilter]["maximasPDCSAP"]) + + print("---------------------------------------------------------") + print("PDCSAP Summary:") + PDCSAPtotalMin = 0 + PDCSAPtotalMax = 0 + if(len(PDCSAP_L_stars_minima_data) > 0): + print("L Stars Minima: ", PDCSAP_L_stars_minima_data) + print("L Stars Minima Sum: ", np.nansum(PDCSAP_L_stars_minima_data)) + PDCSAPtotalMin += np.nansum(PDCSAP_L_stars_minima_data) + if(len(PDCSAP_L_stars_maxima_data) > 0): + print("L Stars Maxima: ", PDCSAP_L_stars_maxima_data) + print("L Stars Maxima Sum: ", np.nansum(PDCSAP_L_stars_maxima_data)) + PDCSAPtotalMax += np.nansum(PDCSAP_L_stars_maxima_data) + if(len(PDCSAP_M_stars_minima_data) > 0): + print("M Stars Minima: ", PDCSAP_M_stars_minima_data) + print("M Stars Minima Sum: ", np.nansum(PDCSAP_M_stars_minima_data)) + PDCSAPtotalMin += np.nansum(PDCSAP_M_stars_minima_data) + if(len(PDCSAP_M_stars_maxima_data) > 0): + print("M Stars Maxima: ", PDCSAP_M_stars_maxima_data) + print("M Stars Maxima Sum: ", np.nansum(PDCSAP_M_stars_maxima_data)) + PDCSAPtotalMax += np.nansum(PDCSAP_M_stars_maxima_data) + if(len(PDCSAP_K_stars_minima_data) > 0): + print("K Stars Minima: ", PDCSAP_K_stars_minima_data) + print("K Stars Minima Sum: ", np.nansum(PDCSAP_K_stars_minima_data)) + PDCSAPtotalMin += np.nansum(PDCSAP_K_stars_minima_data) + if(len(PDCSAP_K_stars_maxima_data) > 0): + print("K Stars Maxima: ", PDCSAP_K_stars_maxima_data) + print("K Stars Maxima Sum: ", np.nansum(PDCSAP_K_stars_maxima_data)) + PDCSAPtotalMax += np.nansum(PDCSAP_K_stars_maxima_data) + if(len(PDCSAP_G_stars_minima_data) > 0): + print("G Stars Minima: ", PDCSAP_G_stars_minima_data) + print("G Stars Minima Sum: ", np.nansum(PDCSAP_G_stars_minima_data)) + PDCSAPtotalMin += np.nansum(PDCSAP_G_stars_minima_data) + if(len(PDCSAP_G_stars_maxima_data) > 0): + print("G Stars Maxima: ", PDCSAP_G_stars_maxima_data) + print("G Stars Maxima Sum: ", np.nansum(PDCSAP_G_stars_maxima_data)) + PDCSAPtotalMax += np.nansum(PDCSAP_G_stars_maxima_data) + if(len(PDCSAP_F_stars_minima_data) > 0): + print("F Stars Minima: ", PDCSAP_F_stars_minima_data) + print("F Stars Minima Sum: ", np.nansum(PDCSAP_F_stars_minima_data)) + PDCSAPtotalMin += np.nansum(PDCSAP_F_stars_minima_data) + if(len(PDCSAP_F_stars_maxima_data) > 0): + print("F Stars Maxima: ", PDCSAP_F_stars_maxima_data) + print("F Stars Maxima Sum: ", np.nansum(PDCSAP_F_stars_maxima_data)) + PDCSAPtotalMax += np.nansum(PDCSAP_F_stars_maxima_data) + if(len(PDCSAP_Unknown_stars_minima_data) > 0): + print("Unknown Stars Minima: ", PDCSAP_Unknown_stars_minima_data) + print("Unknown Stars Minima Sum: ", np.nansum(PDCSAP_Unknown_stars_minima_data)) + PDCSAPtotalMin += np.nansum(PDCSAP_Unknown_stars_minima_data) + if(len(PDCSAP_Unknown_stars_maxima_data) > 0): + print("Unknown Stars Maxima: ", PDCSAP_Unknown_stars_maxima_data) + print("Unknown Stars Maxima Sum: ", np.nansum(PDCSAP_Unknown_stars_maxima_data)) + PDCSAPtotalMax += np.nansum(PDCSAP_Unknown_stars_maxima_data) + + print("Total Minima: ", PDCSAPtotalMin) + print("Total Maxima: ", PDCSAPtotalMax) diff --git a/main/astrodatagui/astrodatagui.ui b/main/astrodatagui/astrodatagui.ui index bbd7a2a..6061e27 100644 --- a/main/astrodatagui/astrodatagui.ui +++ b/main/astrodatagui/astrodatagui.ui @@ -968,6 +968,13 @@ + + + + Alt. IDs: + + + @@ -981,23 +988,10 @@ - - - - - 0 - 0 - - + + - - - - - - - - - Alt. IDs: + Spectral Type: @@ -1021,13 +1015,6 @@ - - - - Spectral Type: - - - @@ -1035,19 +1022,6 @@ - - - - - 0 - 0 - - - - - - - - @@ -1077,6 +1051,73 @@ + + + + + 0 + 0 + + + + - + + + + + + + + 0 + 0 + + + + - + + + + + + + Fit Type: + + + + + + + + + Linear + + + bgFitType + + + + + + + Sine + + + bgFitType + + + + + + + Poly + + + bgFitType + + + + + @@ -1156,4 +1197,7 @@ + + + diff --git a/main/astrodatagui/db/StarsDB.py b/main/astrodatagui/db/StarsDB.py index f06b4f9..6dbb851 100644 --- a/main/astrodatagui/db/StarsDB.py +++ b/main/astrodatagui/db/StarsDB.py @@ -1,7 +1,7 @@ from enum import Enum import sqlite3 -supportedFitTypes = ["sine", "linear", "poly"] +supportedFoldedFitTypes = ["sine", "linear", "poly"] class StarDBError(Enum): NO_ERROR = 0 @@ -153,11 +153,12 @@ class StarDB(): self.connection.commit() - def updateFitType(self, mainName, fitType: str): + def updateFoldedFitType(self, mainName, fitType: str): if(fitType in supportedFoldedFitTypes): - self.dbCursor.execute(f"""UPDATE starFoldedFitType - SET foldedFitType = '{fitType}' - WHERE mainName = '{mainName}';""") + print("Updating fit type for ", mainName, " to ", fitType) + self.dbCursor.execute(f"""INSERT OR REPLACE INTO + starFoldedFitType (mainName, foldedFitType) + VALUES ('{mainName}', '{fitType}');""") self.connection.commit() else: raise Exception(f"Fit type {fitType} not supported, must be one of {supportedFitTypes}") @@ -214,8 +215,15 @@ class StarDB(): def getFoldedFitType(self, mainName): res = self.dbCursor.execute(f"""SELECT foldedFitType FROM starFoldedFitType WHERE mainName = \"{mainName}\";""") - ret = res.fetchone()[0] - if(ret in supportedFoldedFitTypes): - return ret - else: + try: + ret = res.fetchone()[0] + print("Fit type for star ", mainName, ": ",ret) + if(ret in supportedFoldedFitTypes): + return ret + else: + print("fit type not supported, return default") + return "sine" + except Exception as e: + print("No custom fit type found, return default") + print(e) return "sine" \ No newline at end of file diff --git a/main/astrodatagui/ui/FlaredetectorWidget.py b/main/astrodatagui/ui/FlaredetectorWidget.py index 24d9e47..262a1ae 100644 --- a/main/astrodatagui/ui/FlaredetectorWidget.py +++ b/main/astrodatagui/ui/FlaredetectorWidget.py @@ -9,6 +9,7 @@ import lightkurve as lk from ...flaredetector.util import * from ...flaredetector.flaredetector import calculateFlareFitsForLightcurve +from ...astrodatagui.db.StarsDB import supportedFoldedFitTypes class FlaredetectorWidget(QtWidgets.QWidget): @@ -64,6 +65,8 @@ class FlaredetectorWidget(QtWidgets.QWidget): def setFitsFile(self, fitsFilePath, mainName: str): print(f"Plotting: {fitsFilePath}") self.currentLC = lk.read(fitsFilePath) + if(isinstance(self.currentLC, lk.lightcurve.KeplerLightCurve)): + print(f"Kepler Quarter: {self.currentLC.hdu[0].header['QUARTER']}") self.currentLCCollection = None self.currentMainName = mainName self.updateFit() @@ -184,6 +187,17 @@ class FlaredetectorWidget(QtWidgets.QWidget): self.ShowQualityState["Enabled"] = enabled self.updatePlot() + def setFoldedFitType(self, foldedFitType): + print("Setting folded Fit Type") + if(foldedFitType in supportedFoldedFitTypes): + self.foldedFitType = foldedFitType + else: + print("Unsupported fit type:", foldedFitType) + print("Setting default: sine") + self.foldedFitType = "sine" + if(hasattr(self, "currentLC")): + self.updatePlot() + def normalizeStichedLightCurve(self, lc): lc.flux = lc[self.fluxType] lc.flux_err = lc[self.fluxErrType] @@ -254,10 +268,15 @@ class FlaredetectorWidget(QtWidgets.QWidget): cycle, foldedIndex = convertStarndardIndexToFoldedIndex(lc, peak["StandardIndex"]) self.figureAxis.plot(lc.phase[lc.cycle == cycle][foldedIndex].value, lc.flux[lc.cycle == cycle][foldedIndex], "x", color="red") - phase, sineFit, _ = getFoldedBestFit(lc) - self.figureAxis.plot(phase, sineFit, color="red") - minPhasesBoundsIndices, maxPhasesBoundsIndices = getPhaseRangesNearPeak(getFoldedFitPeakValley(sineFit), phase) - plotPhaseRangesNearPeak((minPhasesBoundsIndices, maxPhasesBoundsIndices), phase, ax=self.figureAxis) + try: + phase, sineFit, _ = getFoldedBestFit(lc, fitType=self.foldedFitType) + self.figureAxis.plot(phase, sineFit, color="red") + print(phase, sineFit) + minPhasesBoundsIndices, maxPhasesBoundsIndices = getPhaseRangesNearPeak(getFoldedFitPeakValley(sineFit), phase) + plotPhaseRangesNearPeak((minPhasesBoundsIndices, maxPhasesBoundsIndices), phase, ax=self.figureAxis) + except Exception as e: + print("Failed to get fit") + print(e) elif(self.PeriodogramState["Enabled"]): lc.plot(label=label, ax=self.figureAxis, view=self.PeriodogramState["View"]) if(self.PeriodogramState["View"] == "period"): diff --git a/main/astrodatagui/ui/NewStarDialog.py b/main/astrodatagui/ui/NewStarDialog.py index c180f3b..01f6bcc 100644 --- a/main/astrodatagui/ui/NewStarDialog.py +++ b/main/astrodatagui/ui/NewStarDialog.py @@ -3,6 +3,8 @@ from PyQt5.QtWidgets import QDialog, QListWidgetItem from PyQt5 import uic import os +from astropy.table import vstack + from ...astrodatadownloader.astrodatadownloader import (ObservationSource, getStarObservations, downloadStarProducts) @@ -49,16 +51,20 @@ class NewStarDialog(QDialog): k2Kadences = [self.cbK2ShortCadence.isChecked(), self.cbK2LongCadence.isChecked()] - obs = getStarObservations(star, keplerKadences, k2Kadences, sources) - if(len(obs) == 0): - self.showErrorMessage("No observations found", - "No observationnal data has been found with the current filters") - return - + allObs = [] + stars = star.split(";") self.listPreview.clear() - for o in obs: - print(o) - self.listPreview.addItem(QListWidgetItem(f"{star} - {o['obs_collection']} - {o['sequence_number']}")) + for s in stars: + s = s.strip() + obs = getStarObservations(s, keplerKadences, k2Kadences, sources) + if(len(obs) == 0): + self.showErrorMessage("No observations found", + "No observationnal data has been found with the current filters") + return + allObs.append(obs) + for o in obs: + self.listPreview.addItem(QListWidgetItem(f"{s} - {o['obs_collection']} - {o['sequence_number']}")) + obs = vstack(allObs) self.currentObservations = obs self.starIdentifier = star diff --git a/main/flaredetector/util.py b/main/flaredetector/util.py index 3c79598..98df7e1 100644 --- a/main/flaredetector/util.py +++ b/main/flaredetector/util.py @@ -94,8 +94,8 @@ def fitPolynomial(phase, flux, degree): def linear(t, k, d): return k*t + d -def fitLinear(phase, flux, degree): - popt, _ = curve_fit(linear, phase, flux, maxfev=300) +def fitLinear(phase, flux): + popt, _ = curve_fit(linear, phase, flux, maxfev=3000) return linear(phase, *popt) def compureRSS(fit, flux): @@ -122,14 +122,23 @@ def getFoldedBestFit(foldedLc, fitType="sine"): flux = flux[filt] polyDegree = 7 fitThreshold = 0.0 - smoothed_flux = np.convolve(flux, np.ones(len(flux)//100)/(len(flux)//100), mode="valid") - peaks, _ = find_peaks(smoothed_flux, height=np.mean(smoothed_flux)) - #print("Num peaks: ", peaks) if(fitType == "sine"): - retFit = fitSingleSine(phase, flux) + try: + print("using sine") + retFit = fitSingleSine(phase, flux) + except: # if its supposed to be a sine, but we cant find one, use a polynomial + print("Use polynomial instead") + retFit = fitPolynomial(phase, flux, polyDegree) + fitType = "poly" elif(fitType == "poly"): - retFit = fitPolynomial(phase, flux, polyDegree) + try: + print("using poly") + retFit = fitPolynomial(phase, flux, polyDegree) + except: # other way around for poly to sine + print("Use sine instead") + retFit = fitSingleSine(phase, flux) + fitType = "sine" elif(fitType == "linear"): retFit = fitLinear(phase, flux) else: @@ -174,6 +183,27 @@ def getFoldedFitPeakValley(sineFit): else: maxima = np.array((len(sineFit)-1), ndmin=1) + # TODO: if theres a minima and maxima extremely close to the edge of data, remove them + if(len(minima) > 1 and len(maxima) > 1): + lenArray = len(sineFit) + minBorder = lenArray * 0.05 + maxBorder = lenArray - minBorder + minInBorder = -1 + maxInBorder = -1 + for mini in minima: + if(mini < minBorder or mini > maxBorder): + minInBorder = mini + break + for maxi in maxima: + if(maxi < minBorder or maxi > maxBorder): + maxInBorder = maxi + break + if(minInBorder > 0 and maxInBorder > 0): + indMin = np.argwhere(minima == minInBorder) + indMax = np.argwhere(maxima == maxInBorder) + minima = np.delete(minima, indMin) + maxima = np.delete(maxima, indMax) + return minima, maxima def findNearestIndexOfValue(array, value): @@ -185,47 +215,153 @@ def getPhaseRangesNearPeak(maxArgs, phase, returnPhaseValue=False): minPhases = phase[maxArgs[0]] maxPhases = phase[maxArgs[1]] totalPhase = abs(phase[0]) + abs(phase[-1]) - - phasePart = totalPhase * 0.3 / (len(minPhases) + len(maxPhases)) - minPhasesBounds = [] - for minPhase in minPhases: - minPhaseBounds = [] - if(minPhase - phasePart < phase[0]): - minPhaseBounds.append((phase[0], minPhase + phasePart)) - minPhaseBounds.append((phase[-1] + (minPhase - phasePart - phase[0]), phase[-1])) - elif(minPhase + phasePart > phase[-1]): - minPhaseBounds.append((minPhase - phasePart, phase[-1])) - minPhaseBounds.append((phase[0], phase[0] + (minPhase + phasePart - phase[-1]))) - else: - minPhaseBounds.append((minPhase - phasePart, minPhase + phasePart)) - minPhasesBounds.append(minPhaseBounds) - - maxPhasesBounds = [] - for maxPhase in maxPhases: - maxPhaseBounds = [] - if(maxPhase - phasePart < phase[0]): - maxPhaseBounds.append((phase[0], maxPhase + phasePart)) - maxPhaseBounds.append((phase[-1] + (maxPhase - phasePart - phase[0]), phase[-1])) - elif(maxPhase + phasePart > phase[-1]): - maxPhaseBounds.append((maxPhase - phasePart, phase[-1])) - maxPhaseBounds.append((phase[0], phase[0] + (maxPhase + phasePart - phase[-1]))) - else: - maxPhaseBounds.append((maxPhase - phasePart, maxPhase + phasePart)) - maxPhasesBounds.append(maxPhaseBounds) - minPhasesBoundsIndices = [] - for minPhaseBounds in minPhasesBounds: - minPhaseBoundsIndices = [] - for l in minPhaseBounds: - minPhaseBoundsIndices.append([phase[findNearestIndexOfValue(phase, lv)] if returnPhaseValue else findNearestIndexOfValue(phase, lv) for lv in l]) - minPhasesBoundsIndices.append(minPhaseBoundsIndices) - maxPhasesBoundsIndices = [] - for maxPhaseBounds in maxPhasesBounds: - maxPhaseBoundsIndices = [] - for l in maxPhaseBounds: - maxPhaseBoundsIndices.append([phase[findNearestIndexOfValue(phase, lv)] if returnPhaseValue else findNearestIndexOfValue(phase, lv) for lv in l]) - maxPhasesBoundsIndices.append(maxPhaseBoundsIndices) + + if((len(minPhases) + len(maxPhases)) > 0): + phasePart = totalPhase * 0.4 / (len(minPhases) + len(maxPhases)) + minPhasesBounds = [] + for minPhase in minPhases: + minPhaseBounds = [] + if(minPhase - phasePart < phase[0]): + minPhaseBounds.append([phase[0], minPhase + phasePart]) + minPhaseBounds.append([phase[-1] + minPhase - phasePart - phase[0], phase[-1]]) + elif(minPhase + phasePart > phase[-1]): + minPhaseBounds.append([minPhase - phasePart, phase[-1]]) + minPhaseBounds.append([phase[0], phase[0] + minPhase + phasePart - phase[-1]]) + else: + minPhaseBounds.append([minPhase - phasePart, minPhase + phasePart]) + minPhasesBounds.append(minPhaseBounds) + + maxPhasesBounds = [] + for maxPhase in maxPhases: + maxPhaseBounds = [] + if(maxPhase - phasePart < phase[0]): + maxPhaseBounds.append([phase[0], maxPhase + phasePart]) + maxPhaseBounds.append([phase[-1] + maxPhase - phasePart - phase[0], phase[-1]]) + elif(maxPhase + phasePart > phase[-1]): + maxPhaseBounds.append([maxPhase - phasePart, phase[-1]]) + maxPhaseBounds.append([phase[0], phase[0] + maxPhase + phasePart - phase[-1]]) + else: + maxPhaseBounds.append([maxPhase - phasePart, maxPhase + phasePart]) + maxPhasesBounds.append(maxPhaseBounds) + + i = 0; j = 0 + while i < len(minPhasesBounds) and j < len(maxPhasesBounds): + #print(f"i: {i}", f"j: {j}") + if(len(minPhasesBounds[i]) == 1): + start_min, end_min = minPhasesBounds[i][0] + elif(len(minPhasesBounds[i]) == 2): + start_min, end_min = minPhasesBounds[i] + + if(len(maxPhasesBounds[j]) == 1): + start_max, end_max = maxPhasesBounds[j][0] + elif(len(maxPhasesBounds[j]) == 2): + start_max, end_max = maxPhasesBounds[j] + + #print(f"start_min type {type(start_min)}, {start_min}") + #print(f"end_min type {type(end_min)}, {end_min}") + #print(f"start_max type {type(start_max)}, {start_max}") + #print(f"end_max type {type(end_max)}, {end_max}") + + if(isinstance(start_min, np.float64) and isinstance(end_min, np.float64) and + isinstance(start_max, np.float64) and isinstance(end_max, np.float64)): + #print("Case 1") + if(start_max < end_min and start_max > start_min): + overlap_start = max(start_min, start_max) + overlap_end = min(end_min, end_max) + midpoint = (overlap_start + overlap_end) / 2 + + minPhasesBounds[i] = [[start_min, midpoint - 0.01]] + maxPhasesBounds[j] = [[midpoint + 0.01, end_max]] + + i += 1 + j += 1 + elif(start_min < end_max and start_max < start_min): + overlap_start = max(start_min, start_max) + overlap_end = min(end_min, end_max) + midpoint = (overlap_start + overlap_end) / 2 + + minPhasesBounds[i] = [[midpoint + 0.01, end_min]] + maxPhasesBounds[j] = [[start_max, midpoint - 0.01]] + + i += 1 + j += 1 + else: + if end_min < start_max: + i += 1 + elif end_max < start_min: + j += 1 + elif(isinstance(start_max, np.float64) and isinstance(end_max, np.float64)): # Case 2 + #print("Case 2") + if(start_min[0] < end_min[0]): + start_min1, end_min1 = start_min[0], start_min[1] + start_min2, end_min2 = end_min[0], end_min[1] + else: + start_min2, end_min2 = start_min[0], start_min[1] + start_min1, end_min1 = end_min[0], end_min[1] + if(start_max < start_min2 and end_max > start_min2): # 1 + midpoint = (start_min2 + end_max) / 2 + + minPhasesBounds[i] = [[start_min1, end_min1], [midpoint + 0.01, end_min2]] + maxPhasesBounds[j] = [[start_max, midpoint - 0.01]] + + i += 1 + j += 1 + elif(start_max > start_min1 and start_max < end_min1): # 2 + midpoint = (start_max + end_min1) / 2 + + minPhasesBounds[i] = [[start_min1, midpoint - 0.01], [start_min2, end_min2]] + maxPhasesBounds[j] = [[midpoint + 0.01, end_max]] + + i += 1 + j += 1 + else: + i += 1 + j += 1 + elif(isinstance(start_min, np.float64) and isinstance(end_min, np.float64)): # Case 3 + #print("Case 3") + if(start_max[0] < end_max[0]): + start_max1, end_max1 = start_max[0], start_max[1] + start_max2, end_max2 = end_max[0], end_max[1] + else: + start_max2, end_max2 = start_max[0], start_max[1] + start_max1, end_max1 = end_max[0], end_max[1] + if(start_min > start_max1 and start_min < end_max1): # 1 + midpoint = (start_min + end_max1) / 2 + + minPhasesBounds[i] = [[midpoint + 0.01, end_min]] + maxPhasesBounds[j] = [[start_max1, midpoint - 0.01], [start_max2, end_max2]] + + i += 1 + j += 1 + elif(start_min < start_max2 and end_min > start_max2): # 2 + midpoint = (start_max2 + end_min) / 2 + + minPhasesBounds[i] = [[start_min, midpoint - 0.01]] + maxPhasesBounds[j] = [[start_max1, end_max1], [midpoint + 0.01, end_max2]] + + i += 1 + j += 1 + else: + i += 1 + j += 1 + else: + print("Rare case of both going over the border, this shouldnt happen, remove them") + minPhasesBounds.pop(i) + maxPhasesBounds.pop(j) + + for minPhaseBounds in minPhasesBounds: + minPhaseBoundsIndices = [] + for l in minPhaseBounds: + minPhaseBoundsIndices.append([phase[findNearestIndexOfValue(phase, lv)] if returnPhaseValue else findNearestIndexOfValue(phase, lv) for lv in l]) + minPhasesBoundsIndices.append(minPhaseBoundsIndices) + + for maxPhaseBounds in maxPhasesBounds: + maxPhaseBoundsIndices = [] + for l in maxPhaseBounds: + maxPhaseBoundsIndices.append([phase[findNearestIndexOfValue(phase, lv)] if returnPhaseValue else findNearestIndexOfValue(phase, lv) for lv in l]) + maxPhasesBoundsIndices.append(maxPhaseBoundsIndices) return minPhasesBoundsIndices, maxPhasesBoundsIndices diff --git a/stars.db b/stars.db index e7934b5b99bc873956a5203474c7c585efa8a62b..4a6eb5c8dce34d063733afdf91b9035a6e23b15f 100644 GIT binary patch delta 1046 zcmZWoUr19?9KP4%*1X$2XVYEhm~CfUDrVR1{@LzCi01xeBc@OxJY%MrdjlxvNnuU@B?~*Zn9tDb(@EM!j!E)8pfH4N6Viq zgI6eKmn#&aS3>i-i9&vEK37c76ejbN>8bhb!t72Ul{lV?XHz&E?;A+r9efp{J?dYE zwVkO^QAZ(G|JW?*ZR=5U+-i0Whty4LtN*{7#)TbX>6J2bwan1ksnZTvFEjOHky~#; zeK!XKb?6TIjGmzqI){=-L_TDNzu*`62Cl<*0FQ>kH z?pm6gn$9$Kg#(es)~_3)Z2Mwq!GgI-e{T&BvBR_JWI`|WQhacf9_!QoUYg&HCV7&+Q(t3Pd5cuis=sH;7qqjn9uT(~0 z0Xt};Ys11;;Gru)?It?g5xL1EDfMhxs!bym7Xm@ODJ!S+K$@$4BMMF*u7=b~W;(g55&m+yd lgKH`G_Js;8o@^Tz+-GiH%GJJ