update code for optimized fold

This commit is contained in:
2025-04-25 08:11:55 +02:00
parent a13e32f35e
commit d930d7896b
8 changed files with 598 additions and 195 deletions
+14 -5
View File
@@ -39,10 +39,12 @@ class AstrodataGUI(QtWidgets.QMainWindow):
self.cbPlotRemoveOutliersEnable.stateChanged.connect(self.plotOptionsCBChecked)
self.cbPlotRemoveNansEnable.stateChanged.connect(self.plotOptionsCBChecked)
self.cbPlotBinEnable.stateChanged.connect(self.plotOptionsCBChecked)
self.cbPlotFoldOptimize.stateChanged.connect(self.plotOptionsCBChecked)
self.cbPlotFlattenPlotEnable.stateChanged.connect(self.plotOptionsExclusiveCBChecked)
self.cbPlotFoldEnable.stateChanged.connect(self.plotOptionsExclusiveCBChecked)
self.cbPlotPeriodogramEnable.stateChanged.connect(self.plotOptionsExclusiveCBChecked)
self.cbPlotFoldShowSpotModulation.stateChanged.connect(self.plotOptionsCBChecked)
self.gbPlotFoldOptimize.toggled.connect(self.plotOptionsCBChecked)
self.comboPlotFluxType.currentTextChanged.connect(self.plotOptionsComboBoxTextChanged)
self.comboPlotNormalizeUnit.currentTextChanged.connect(self.plotOptionsComboBoxTextChanged)
@@ -252,7 +254,10 @@ class AstrodataGUI(QtWidgets.QMainWindow):
self.flaredetectorPreview.setFoldedFitType(self.foldedFitType)
def updatePeriods(self, periods: list):
self.edPlotFoldPeriod.setText(str(periods[0].value))
try:
self.edPlotFoldPeriod.setText(str(periods[0].value))
except:
self.edPlotFoldPeriod.setText(str(periods[0]))
def updateEpochPeriod(self, epoch: float):
self.edPlotFoldEpochTime.setText(str(epoch))
@@ -282,7 +287,9 @@ class AstrodataGUI(QtWidgets.QMainWindow):
case self.cbPlotBinEnable:
self.updateFlaredetectionWidgetBin()
case self.cbPlotFoldOptimize:
case self.gbPlotFoldOptimize:
self.updateFlaredetectionWidgetFold()
case self.cbPlotFoldShowSpotModulation:
self.updateFlaredetectionWidgetFold()
def plotOptionsExclusiveCBChecked(self, state):
@@ -399,14 +406,16 @@ class AstrodataGUI(QtWidgets.QMainWindow):
def updateFlaredetectionWidgetFold(self):
foldEnabled = self.cbPlotFoldEnable.isChecked()
optimizeEnabled = self.cbPlotFoldOptimize.isChecked()
optimizeEnabled = self.gbPlotFoldOptimize.isChecked()
showSpotModulationEnabled = self.cbPlotFoldShowSpotModulation.isChecked()
try:
period = float(self.edPlotFoldPeriod.text())
epoch = float(self.edPlotFoldEpochTime.text())
except:
print(f"Invalid period/epoch detected, aborting")
return
self.flaredetectorPreview.setFoldState(foldEnabled, period, epoch, optimizeEnabled)
self.flaredetectorPreview.setFoldState(foldEnabled, period, epoch, optimizeEnabled, showSpotModulationEnabled)
def updateFlaredetectionWidgetPeriodogram(self):
periodogramEnabled = self.cbPlotPeriodogramEnable.isChecked()
+47 -24
View File
@@ -89,47 +89,70 @@ def getFlareCount(filesDict):
plt.savefig(f"{starFolder}/{starNameR}_{source}-{sequence}-periodogram-marked_max.png")
plt.close()
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 = []
pdcsapFoldedLC.scatter()
#pdcsapEpochTime = getEpochTime(lc)
#pdcsapFoldedLC = lc.fold(period=pdcsapPeakPeriod, epoch_time=pdcsapEpochTime)
#pdcsapPhase, pdcsapSineFit, pdcsapFitType = getFoldedBestFit(pdcsapFoldedLC, fitType=filesDict["FitType"])
optimizedFit = getOptimizedFold(lc.normalize(), filesDict["FitType"])
#pdcsapMinima, pdcsapMaxima = getFoldedFitPeakValley(pdcsapSineFit)
#pdcsapminPhasesBounds, pdcsapmaxPhasesBounds = getPhaseRangesNearPeak((pdcsapMinima, pdcsapMaxima), pdcsapPhase, returnPhaseValue=True)
pdcsapFoldedPeaks = []; pdcsapPeriodFoldedPeaks = []
pdcsapFoldedPeaksPhasePair = []; pdcsapPeriodFoldedPeaksPhasePair = []
optimizedFit["foldedLC"].scatter()
plt.title(f"{starName} - folded lightcurve")
plt.plot(pdcsapPhase, pdcsapSineFit, color="blue", label=f"{pdcsapFitType}-fit")
plt.plot(optimizedFit["phase"], optimizedFit["fit"], color="blue", label=f"{optimizedFit['fitType']}-fit")
for peak in pdcsapPeaks:
cycle, foldedIndex = convertStarndardIndexToFoldedIndex(pdcsapFoldedLC, peak["StandardIndex"])
cycle, foldedIndex = convertStarndardIndexToFoldedIndex(optimizedFit["foldedLC"], peak["StandardIndex"])
pdcsapFoldedPeaks.append({"Cycle: ": cycle, "Index": foldedIndex})
pdcsapFoldedPeaksPhasePair.append({"Phase": pdcsapFoldedLC.phase[pdcsapFoldedLC.cycle == cycle][foldedIndex], "Peak": peak})
plt.plot(pdcsapFoldedLC.phase[pdcsapFoldedLC.cycle == cycle][foldedIndex].value,
pdcsapFoldedLC.flux[pdcsapFoldedLC.cycle == cycle][foldedIndex], "x", color="red")
pdcsapFoldedPeaksPhasePair.append({"Phase": optimizedFit["foldedLC"].phase[optimizedFit["foldedLC"].cycle == cycle][foldedIndex], "Peak": peak})
plt.plot(optimizedFit["foldedLC"].phase[optimizedFit["foldedLC"].cycle == cycle][foldedIndex].value,
optimizedFit["foldedLC"].flux[optimizedFit["foldedLC"].cycle == cycle][foldedIndex], "x", color="red")
plt.plot([], [], "x", color="red", label="Flare peaks")
plt.legend()
plt.savefig(f"{starFolder}/{starNameR}_{source}-{sequence}-foldedLC-marked_fit_flares.png")
plt.close()
if(optimizedFit["periodFoldedLC"] is not None):
optimizedFit["periodFoldedLC"].scatter()
plt.title(f"{starName} - folded lightcurve")
plt.plot(optimizedFit["periodFoldedPhase"], optimizedFit["periodFoldedFit"], color="blue", label=f"{optimizedFit['fitType']}-fit")
for peak in pdcsapPeaks:
cycle, foldedIndex = convertStarndardIndexToFoldedIndex(optimizedFit["periodFoldedLC"], peak["StandardIndex"])
pdcsapPeriodFoldedPeaks.append({"Cycle: ": cycle, "Index": foldedIndex})
pdcsapPeriodFoldedPeaksPhasePair.append({"Phase": optimizedFit["periodFoldedLC"].phase[optimizedFit["periodFoldedLC"].cycle == cycle][foldedIndex], "Peak": peak})
plt.plot(optimizedFit["periodFoldedLC"].phase[optimizedFit["periodFoldedLC"].cycle == cycle][foldedIndex].value,
optimizedFit["periodFoldedLC"].flux[optimizedFit["periodFoldedLC"].cycle == cycle][foldedIndex], "x", color="red")
plt.plot([], [], "x", color="red", label="Flare peaks")
plt.legend()
plt.savefig(f"{starFolder}/{starNameR}_{source}-{sequence}-periodFoldedLC-marked_fit_flares.png")
plt.close()
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["pdcsapFoldedEpoch"] = optimizedFit["epoch"]
filesDict["pdcsapFoldedCycle"] = optimizedFit["foldedLC"].cycle
filesDict["pdcsapFoldedPhase"] = optimizedFit["foldedLC"].phase.value
filesDict["pdcsapFoldedFitPhase"] = optimizedFit["phase"]
filesDict["pdcsapFoldedFit"] = optimizedFit["fit"]
filesDict["pdcsapFoldedFitPhaseStarEnd"] = (optimizedFit["foldedLC"].phase.value[0], optimizedFit["foldedLC"].phase.value[-1])
filesDict["pdcsapFoldedPeaksPhasePair"] = pdcsapFoldedPeaksPhasePair
filesDict["pdcsapPeriod"] = pdcsapPeakPeriod.value
filesDict["pdcsapPeriodMinima"] = pdcsapMinima
filesDict["pdcsapPeriodMinimaBoundaries"] = pdcsapminPhasesBounds
filesDict["pdcsapPeriodMaxima"] = pdcsapMaxima
filesDict["pdcsapPeriodMaximaBoundaries"] = pdcsapmaxPhasesBounds
filesDict["pdcsapPeriod"] = optimizedFit["Period"]
filesDict["pdcsapSpotModulation"] = optimizedFit["SpotModulation"]
filesDict['FitType'] = optimizedFit["fitType"]
filesDict["pdcsapPeriodFoldedCycle"] = optimizedFit["periodFoldedLC"].cycle if optimizedFit["periodFoldedLC"] is not None else None
filesDict["pdcsapPeriodFoldedPhase"] = optimizedFit["periodFoldedLC"].phase.value if optimizedFit["periodFoldedLC"] is not None else None
filesDict["pdcsapPeriodFoldedFitPhase"] = optimizedFit["periodFoldedPhase"]
filesDict["pdcsapPeriodFoldedFit"] = optimizedFit["periodFoldedFit"]
filesDict["pdcsapPeriodFoldedFitPhaseStarEnd"] = (optimizedFit["periodFoldedLC"].phase.value[0], optimizedFit["periodFoldedLC"].phase.value[-1]) if optimizedFit["periodFoldedLC"] is not None else (None, None)
filesDict["pdcsapPeriodFoldedPeaksPhasePair"] = pdcsapPeriodFoldedPeaksPhasePair
filesDict['periodFitType'] = optimizedFit["periodFitType"]
csvFile = open(f"{starFolder}/{starNameR}_{source}-{sequence}.csv", "a")
csvFile.write("StarName,Spectral Type,Rotational Velocity,Rotenional Velocity Unit,Distance,Distance Unit,Source,Sequence,File Path,Initial folded Fit Type,Used folded Fit Type")
csvFile.write(f"{filesDict['StarName']},{filesDict['SpType']},{filesDict['RotVel']},{filesDict['RotVelUnit']},{filesDict['Distance']},{filesDict['DistanceUnit']},{filesDict['Source']},{filesDict['Sequence']},{filesDict['FilePath']},{filesDict['FitType']},{pdcsapFitType}")
csvFile.write(f"{filesDict['StarName']},{filesDict['SpType']},{filesDict['RotVel']},{filesDict['RotVelUnit']},{filesDict['Distance']},{filesDict['DistanceUnit']},{filesDict['Source']},{filesDict['Sequence']},{filesDict['FilePath']},{filesDict['FitType']},{optimizedFit['fitType']}")
csvFile.close()
del lc
print(f"Finished {filesDict['StarName']}, {filesDict['Sequence']}")
+217 -47
View File
@@ -174,6 +174,21 @@
<string>Sequences/Target Table ID</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
@@ -255,12 +270,39 @@
<string>Plot options</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<layout class="QGridLayout" name="gridLayout_11">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_19">
<property name="sizePolicy">
@@ -346,6 +388,21 @@
<string>Normalize</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="label_12">
<property name="text">
@@ -412,6 +469,21 @@
<string>Remove Outliers</string>
</property>
<layout class="QGridLayout" name="gridLayout_8">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QCheckBox" name="cbPlotRemoveOutliersEnable">
<property name="text">
@@ -464,6 +536,21 @@
<string>Remove nans/infs</string>
</property>
<layout class="QGridLayout" name="gridLayout_10">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QCheckBox" name="cbPlotRemoveNansEnable">
<property name="sizePolicy">
@@ -522,6 +609,21 @@
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="label_11">
<property name="text">
@@ -625,6 +727,21 @@
<string>Flatten</string>
</property>
<layout class="QGridLayout" name="gridLayout_7">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="label_14">
<property name="text">
@@ -706,34 +823,31 @@
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_2">
<item row="2" column="1">
<widget class="QLineEdit" name="edPlotFoldPeriod">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
<item row="0" column="1">
<widget class="QLabel" name="label_10">
<property name="text">
<string>1</string>
<string>Enable</string>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="QLineEdit" name="edPlotFoldEpochTime">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -758,7 +872,7 @@
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
@@ -783,7 +897,39 @@
</property>
</widget>
</item>
<item row="3" column="0">
<item row="0" column="0">
<widget class="QCheckBox" name="cbPlotFoldEnable">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="edPlotFoldPeriod">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>60</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>60</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>1</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
@@ -808,32 +954,26 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="cbPlotFoldEnable">
<property name="text">
<string/>
<item row="1" column="0" colspan="2" alignment="Qt::AlignHCenter|Qt::AlignVCenter">
<widget class="QGroupBox" name="gbPlotFoldOptimize">
<property name="title">
<string>Optimize</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Enable</string>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="cbPlotFoldOptimize">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_26">
<property name="text">
<string>Optimize:</string>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QCheckBox" name="cbPlotFoldShowSpotModulation">
<property name="text">
<string>Show Spot Modulation</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
@@ -870,6 +1010,21 @@
<string>Periodogram</string>
</property>
<layout class="QGridLayout" name="gridLayout_9">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="1">
<widget class="QLabel" name="label_20">
<property name="text">
@@ -980,6 +1135,21 @@
<string>Star infos</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
+36 -14
View File
@@ -51,14 +51,14 @@ class FlaredetectorWidget(QtWidgets.QWidget):
self.periodogramInfoGroupBox.setSizePolicy(sp)
self.mainLayout.addWidget(self.periodogramInfoGroupBox)
self.fluxType = "sap_flux"
self.fluxErrType = "sap_flux_err"
self.fluxType = "pdcsap_flux"
self.fluxErrType = "pdcsap_flux_err"
self.NormalizeState = {"Enabled": False, "Scale": "unscaled"}
self.RemoveOutliersState = {"Enabled": False, "Sigma": 5.0}
self.RemoveNansState = {"Enabled": False}
self.BinState = {"Enabled": False, "Size": None}
self.FlattenState = {"Enabled": False, "WindowLength": 101, "PolynomialOrder": 2}
self.FoldState = {"Enabled": False, "Period": 1, "EpochTime": 0}
self.FoldState = {"Enabled": False, "Period": 1, "EpochTime": 0, "Optimize": False, "spotModulation": False}
self.PeriodogramState = {"Enabled": False, "Method": "lombscargle", "View": "frequency"}
self.ShowQualityState = {"Enabled": False}
@@ -156,9 +156,10 @@ class FlaredetectorWidget(QtWidgets.QWidget):
self.updateFit()
self.updatePlot()
def setFoldState(self, enabled: bool, period: float, epoch: float, optimize: bool):
def setFoldState(self, enabled: bool, period: float, epoch: float, optimize: bool, spotModulation: bool):
self.FoldState["Enabled"] = enabled
self.FoldState["Optimize"] = optimize
self.FoldState["SpotModulation"] = spotModulation
if(period < 0):
print(f"Negative period detected, setting default 1")
period = 1
@@ -248,7 +249,24 @@ class FlaredetectorWidget(QtWidgets.QWidget):
label += " - flattened"
if(self.FoldState["Enabled"]):
if(self.FoldState["Optimize"]):
pass
optimizedFold = getOptimizedFold(lc.normalize(), self.foldedFitType)
if(self.FoldState["SpotModulation"]):
lc = optimizedFold["foldedLC"]
self.periodsCalculated.emit([optimizedFold["SpotModulation"]])
foldOptimizePhase = optimizedFold["phase"]
foldOptimizeFit = optimizedFold["fit"]
elif(not self.FoldState["SpotModulation"] and optimizedFold["periodFoldedLC"] is not None):
lc = optimizedFold["periodFoldedLC"]
self.periodsCalculated.emit([optimizedFold["Period"]])
foldOptimizePhase = optimizedFold["periodFoldedPhase"]
foldOptimizeFit = optimizedFold["periodFoldedFit"]
else:
lc = optimizedFold["foldedLC"]
self.periodsCalculated.emit([optimizedFold["SpotModulation"]])
foldOptimizePhase = optimizedFold["phase"]
foldOptimizeFit = optimizedFold["fit"]
print(self.FoldState["SpotModulation"])
self.epochCalculated.emit(optimizedFold["epoch"])
else:
lc = lc.fold(period=self.FoldState["Period"],
epoch_time=self.FoldState["EpochTime"])
@@ -275,15 +293,19 @@ 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")
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)
if(self.FoldState["Optimize"]):
self.figureAxis.plot(foldOptimizePhase, foldOptimizeFit, color="red")
else:
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"):
+87 -3
View File
@@ -1,7 +1,8 @@
import numpy as np
from numpy.polynomial.polynomial import Polynomial
from scipy.signal import find_peaks, argrelextrema
from scipy.signal import find_peaks, argrelextrema, periodogram
from scipy.optimize import curve_fit
import itertools
def findMaxIndices(lc, num=3, distance=100, height=(None, None), sortByHighest=False):
if(hasattr(lc, "power")):
@@ -392,5 +393,88 @@ def plotPhaseRangesNearPeak(indices, phase, ax=None):
def getEpochTime(lc):
return lc.time.value[argrelextrema(np.asarray(lc.flux.value), np.less, order=500)[0]][0]
def getOptimizedFold(normalizedLC, period):
pass
def getOptimizedFold(normalizedLC, preferedFoldedFitType):
isValid = False
periodogramLS = normalizedLC.to_periodogram(method="lombscargle")
periodogramBLS = normalizedLC.to_periodogram(method="boxleastsquares")
lsPeriods = periodogramLS.period[findMaxIndices(periodogramLS, num=4, distance=100, sortByHighest=True)]
blsPeriods = periodogramBLS.period[findMaxIndices(periodogramBLS, num=4, distance=100, sortByHighest=True)]
period = -100
spotModulation = -100
for lsP, blsP in itertools.product(lsPeriods, blsPeriods):
if(abs(lsP.value - blsP.value) < max(lsP.value, blsP.value)*0.05):
period = np.average([lsP.value, blsP.value])
print("Period found: ", period)
break
else:
print("No matching LS/BLS peak -> use highest LS")
period = lsPeriods[0].value
spotModulation = period
epoch = getEpochTime(normalizedLC)
tries = 0
periodFoldedLC = None
periodFoldedPhase = None
periodFoldedFit = None
periodFitType = None
while(tries < 30):
tries += 1
foldedLC = normalizedLC.fold(period=spotModulation, epoch_time=epoch)
phase, fit, fitType = getFoldedBestFit(foldedLC, fitType=preferedFoldedFitType)
phaseLength = abs(phase[0]) + abs(phase[-1])
fitMaximaArgs = argrelextrema(np.asarray(fit), np.greater)[0]
spotModulationBefore = spotModulation
if(len(fitMaximaArgs) > 1):
print("fitMaximaArgs > 1: ", fitMaximaArgs)
if(len(fitMaximaArgs) == 2 and fitMaximaArgs[0] > len(phase)*0.1 and fitMaximaArgs[1] < len(phase)*0.1):
halfPeriod = period/2
for lsP, blsP in zip(lsPeriods, blsPeriods):
if(abs(lsP.value - halfPeriod) < period*0.05):
spotModulation = lsP.value
print("lsP.value", lsP.value)
break
elif(abs(blsP.value - halfPeriod) < period*0.05):
spotModulation = blsP.value
print("blsP.value", blsP.value)
break
else:
print("2 fit peaks, but no spot modulation")
if(spotModulationBefore != spotModulation):
periodFoldedLC = foldedLC
periodFoldedPhase = phase
periodFoldedFit = fit
periodFitType = fitType
foldedLC = normalizedLC.fold(period=spotModulation, epoch_time=epoch)
phase, fit, fitType = getFoldedBestFit(foldedLC, fitType=preferedFoldedFitType)
phaseLength = abs(phase[0]) + abs(phase[-1])
fitMinimaArgs = argrelextrema(np.asarray(fit), np.less)[0]
fitMinima = phase[0]
for args in fitMinimaArgs:
if(abs(phase[args]) < abs(fitMinima)):
fitMinima = phase[args]
if(abs(fitMinima) < phaseLength*0.01):
isValid = True
break;
else:
epoch += fitMinima
return {"Period": period,
"SpotModulation": spotModulation,
"lsPeriods": lsPeriods,
"blsPeriods": blsPeriods,
"foldedLC": foldedLC,
"phase": phase,
"fit": fit,
"periodFoldedLC": periodFoldedLC,
"periodFoldedPhase": periodFoldedPhase,
"periodFoldedFit": periodFoldedFit,
"periodFitType": periodFitType,
"fitType": fitType,
"epoch": epoch,
"isValid": isValid}