Skip to content

Commit dc803df

Browse files
committed
Added a .json file to have centralised settings
if more than one script has to use them.
1 parent 1423d0c commit dc803df

File tree

9 files changed

+87
-58
lines changed

9 files changed

+87
-58
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
__pycache__/
22
*.pyc
3-
*.json
3+
settings.json
44
*.pylintrc

ATS_settings.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
3+
"lebpc34": {
4+
"imageFolder": "C:/Users/stepp/Documents/data_raw/SmartMito/",
5+
"frameNumBinary": "C:/Users/stepp/Documents/data_raw/SmartMito/frameNum.dat",
6+
"modelPath": "C:/Users/stepp/Documents/data_raw/SmartMito/model_Dora.h5",
7+
"matlabPath": "C:/Users/stepp/Documents/data_raw/SmartMito/matlab_bin.dat"
8+
},
9+
"lebpc20": {
10+
"imageFolder": "//lebnas1.epfl.ch/microsc125/Watchdog/",
11+
"frameNumBinary": "E:/Watchdog/SmartMito/frameNum.dat",
12+
"modelPath": "E:/Watchdog/SmartMito/model_Dora.h5",
13+
"matlabPath": "//lebnas1.epfl.ch/microsc125/Watchdog/matlab_bin.dat"
14+
},
15+
16+
"nnImageSize": 128
17+
18+
}

NNGui.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,10 @@ def __init__(self, app):
7272
self.loadBox = QGroupBox()
7373

7474
# Connect the viewers
75-
self.viewerOrig.vb.setXLink(self.viewerProc.vb)
76-
self.viewerOrig.vb.setYLink(self.viewerProc.vb)
77-
self.viewerNN.vb.setXLink(self.viewerProc.vb)
78-
self.viewerNN.vb.setYLink(self.viewerProc.vb)
75+
self.viewerOrig.viewBox.setXLink(self.viewerProc.viewBox)
76+
self.viewerOrig.viewBox.setYLink(self.viewerProc.viewBox)
77+
self.viewerNN.viewBox.setXLink(self.viewerProc.viewBox)
78+
self.viewerNN.viewBox.setYLink(self.viewerProc.viewBox)
7979

8080
# Slider and arrow buttons for frame traversal.
8181
self.sliderBox = QGroupBox()
@@ -97,7 +97,7 @@ def __init__(self, app):
9797

9898
pen = pg.mkPen(color='#AAAAAA', style=Qt.DashLine)
9999
self.frameLine = pg.InfiniteLine(pos=0.5, angle=90, pen=pen)
100-
self.outputPlot.pI.addItem(self.frameLine)
100+
self.outputPlot.plotItem1.addItem(self.frameLine)
101101

102102
# Connect functions to the interactive elements
103103
self.modelButton.clicked.connect(self.loadModel)
@@ -243,10 +243,10 @@ def loadData(self):
243243
# for x in range(N, len(outputData)):
244244
# outputDataSmooth[x] = np.sum(outputData[x-N:x])/N
245245
self.app.processEvents()
246+
self.outputPlot.deleteRects()
247+
self.outputPlot.frames.setData([])
248+
self.outputPlot.nnframeScatter.setData([])
246249
if self.mode == 'stack':
247-
self.outputPlot.deleteRects()
248-
self.outputPlot.frames.setData([])
249-
self.outputPlot.nnframeScatter.setData([])
250250
self.outputPlot.nnline.setData(outputData)
251251
self.outputPlot.scatter.setData(range(0, len(outputData)), outputData)
252252
else:
@@ -262,7 +262,7 @@ def loadData(self):
262262
self.refreshGradients()
263263
self.onTimer()
264264
self.loadingStatusLabel.setText('Done')
265-
self.viewerProc.vb.setRange(xRange=(0, postSize), yRange=(0, postSize))
265+
self.viewerProc.viewBox.setRange(xRange=(0, postSize), yRange=(0, postSize))
266266

267267
def loadModel(self):
268268
""" Load a .h5 model generated using Keras """

NNfeeder.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77

88

99
import numpy as np
10-
from imageTiles import getTilePositionsV2
1110
from skimage import exposure, filters, transform
1211

12+
from ImageTiles import getTilePositionsV2
13+
1314

1415
def prepareNNImages(mitoFull, drpFull, nnImageSize=128):
1516
"""Preprocess raw iSIM images before running them throught the neural network.

NetworkWatchdog.py

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"""
1717

1818

19+
import json
1920
import os
2021
import re # Regular expression module
2122
import sys
@@ -57,6 +58,10 @@ class NetworkWatchdog(QWidget):
5758

5859
def __init__(self):
5960

61+
# Read settings from the json file depending on which computer we are on
62+
with open('./ATS_settings.json') as file:
63+
self.settings = json.load(file)[os.environ['COMPUTERNAME'].lower()]
64+
6065
# Setting for the watchdogs
6166
patterns = ["*.tif"]
6267
ignorePatterns = ["*.txt", "*.tiff"]
@@ -67,11 +72,7 @@ def __init__(self):
6772

6873
# Loading the NN model
6974
self.nnImageSize = 128
70-
if os.environ['COMPUTERNAME'] == 'LEBPC20':
71-
self.modelPath = 'E:/Watchdog/SmartMito/model_Dora.h5'
72-
elif os.environ["COMPUTERNAME"] == 'LEBPC34':
73-
self.modelPath = (
74-
'C:/Users/stepp/Documents/data_raw/SmartMito/model_Dora.h5')
75+
self.modelPath = self.settings['modelPath']
7576
self.model = keras.models.load_model(self.modelPath, compile=True)
7677
# Prep some structure to hold data
7778

@@ -102,17 +103,18 @@ def __init__(self):
102103
self.linePen = pg.mkPen(color='#AAAAAA')
103104

104105
# Assign the event handlers
105-
myEventHandler.on_created = self.on_created
106-
myEventHandler.on_deleted = self.on_deleted
107-
myEventHandler.onModified = self.onModified
108-
myEventHandler.onMoved = self.onMoved
106+
myEventHandler.on_created = self.onCreated
107+
myEventHandler.on_deleted = self.onDeleted
108+
myEventHandler.on_modified = self.onModified
109+
myEventHandler.on_moved = self.onMoved
109110
self.refreshGUI.connect(self.refreshViewBoxes)
110111
self.reinitGUI.connect(self.reinitializeViewBoxes)
111-
self.viewerNN.vb.setXLink(self.viewerMerge.vb)
112-
self.viewerNN.vb.setYLink(self.viewerMerge.vb)
112+
self.viewerNN.viewBox.setXLink(self.viewerMerge.viewBox)
113+
self.viewerNN.viewBox.setYLink(self.viewerMerge.viewBox)
113114

114115
# More settings for the Watchdos
115-
path = "//lebnas1.epfl.ch/microsc125/Watchdog/"
116+
path = self.settings['imageFolder']
117+
print('FOLDERFOLDERFOLDER', path)
116118
goRecursively = True
117119
self.myObserver = Observer()
118120
self.myObserver.schedule(
@@ -145,7 +147,7 @@ def __init__(self):
145147
def onCreated(self, event):
146148
"""Do action when file is created in watchlocation"""
147149

148-
def ondeleted(self, event):
150+
def onDeleted(self, event):
149151
"""Do action when file is deleted in watchlocation"""
150152

151153
def onModified(self, event):
@@ -169,8 +171,7 @@ def onModified(self, event):
169171
return
170172

171173
# check framNumwrite.py output from the binary
172-
file = open(os.path.join(
173-
os.path.dirname(self.modelPath), 'binary_output.dat'), mode='rb')
174+
file = open(os.path.join(self.settings['frameNumBinary']), mode='rb')
174175
content = file.read()
175176
file.close()
176177

@@ -290,7 +291,7 @@ def onModified(self, event):
290291
self.outputX.append(timeX) # (frameNum-1)/2)
291292

292293
# Write output to binary for Matlab to read
293-
writeBin(output, 0)
294+
writeBin(output, printTime=0, path=self.settings['matlabPath'], filename='')
294295
# Write output to txt file for later
295296
file = open(txtFile, 'a')
296297
file.write('%d, %d\n' % (frameNum, output))
@@ -339,16 +340,17 @@ def reinitializeViewBoxes(self, inputSize):
339340
# for line in viewer.lines:
340341
# line.setPen(self.linePen)
341342
# line.setZValue(100)
342-
self.viewerMerge.vb.setRange(xRange=(0, inputSize), yRange=(0, inputSize))
343+
self.viewerMerge.viewBox.setRange(xRange=(0, inputSize), yRange=(0, inputSize))
343344

344345
def onMoved(self, event):
345346
""" start when a file was used in the watchlocation. Could be removed(?) """
346347

347-
def closeEvent(self):
348+
def closeEvent(self, event):
348349
""" Terminate the watchdogs and clean up when the windows of the GUI is closed """
349-
print('Watchdogs stopped')
350+
print(event)
350351
self.myObserver.stop()
351352
self.myObserver.join()
353+
print('Watchdogs stopped')
352354

353355

354356
def main():

SatsGUI.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@
1111
from PyQt5.QtCore import Qt, pyqtSignal
1212
from PyQt5.QtWidgets import QApplication, QGridLayout, QWidget
1313

14-
from nnIO import loadElapsedTime, loadiSIMmetadata, loadNNData
14+
from NNio import loadElapsedTime, loadiSIMmetadata, loadNNData
1515

1616
# Adjust for different screen sizes
1717
QApplication.setAttribute(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)
1818

1919

20-
2120
class RectItem(pg.GraphicsObject):
2221
""" Rectangle that can be added to a pg.ViewBox """
2322
def __init__(self, rect, color='#FFFFFF', parent=None):
@@ -234,5 +233,6 @@ def main():
234233

235234
sys.exit(app.exec_())
236235

236+
237237
if __name__ == '__main__':
238238
main()

TestTifSaver.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"""
1010

1111
import glob
12+
import json
1213
import os
1314
import time
1415

@@ -45,7 +46,6 @@ def main():
4546

4647
inputData = dataPath + '180420_130.tif'
4748

48-
4949
mito = []
5050
drp = []
5151

@@ -71,7 +71,11 @@ def main():
7171
print('Input : ', drp.shape)
7272
print('Input : ', np.shape(drp)[0])
7373

74-
nasPath = '//lebnas1.epfl.ch/microsc125/Watchdog/python_saver/'
74+
with open('./ATS_settings.json') as file:
75+
settings = json.load(file)[os.environ['COMPUTERNAME'].lower()]
76+
77+
nasPath = os.path.join(settings['imageFolder'], 'python_saver/')
78+
7579
# Make new folder there as microManager would
7680
dirs = glob.glob(nasPath + '*/')
7781
if len(dirs) > 0:
@@ -93,10 +97,10 @@ def main():
9397

9498
# First write mito then drp as watchdog waits for drp image
9599
io.imsave(mitoPath, mito[item, :, :].astype(np.uint16),
96-
check_contrast=False)
100+
check_contrast=False)
97101
time.sleep(0.05)
98102
io.imsave(drpPath, drp[item, :, :].astype(np.uint16),
99-
check_contrast=False)
103+
check_contrast=False)
100104
time2 = time.perf_counter()
101105
time.sleep(np.max([0, .3 - (time2 - time1)]))
102106
i = i + 1
@@ -112,10 +116,10 @@ def main():
112116
time.sleep(0.001)
113117
print('Done')
114118

115-
116119
del inputData
117120
del inputDataFilename1
118121
del inputDataFilename2
119122

123+
120124
if __name__ == '__main__':
121125
main()

binOutput.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@
1212
import time
1313
from datetime import datetime
1414

15-
if __name__ == "__main__":
16-
main()
17-
1815

1916
def main():
2017
""" Use this to test a direct binary alternating value to the specified file. """
@@ -45,12 +42,15 @@ def main():
4542
print('done')
4643

4744

48-
def writeBin(output, printTime=0, path="//lebnas1.epfl.ch/microsc125/Watchdog/"):
45+
def writeBin(output, printTime=0, path="//lebnas1.epfl.ch/microsc125/Watchdog/",
46+
filename='binary_output.dat'):
4947
""" Write a integer to a binary file that can be read by readBinNetwork.m from Matlab """
50-
# Set the file location for the watched file here
51-
# path = "//lebnas1.epfl.ch/microsc125/Watchdog/"
52-
filename = 'binary_output.dat'
53-
fullFileDir = ospath.join(path, filename)
48+
49+
if filename != '':
50+
fullFileDir = ospath.join(path, filename)
51+
else:
52+
fullFileDir = path
53+
5454
file = open(fullFileDir, 'wb')
5555
file.write(bytearray(output))
5656
file.close()
@@ -59,3 +59,7 @@ def writeBin(output, printTime=0, path="//lebnas1.epfl.ch/microsc125/Watchdog/")
5959
now = datetime.now()
6060
currentTime = now.strftime("%H:%M:%S.%f")
6161
print(f"{output} written at {currentTime}")
62+
63+
64+
if __name__ == "__main__":
65+
main()

frameNumwrite.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" Implements a class that is used to work together with NetworkWatchdog to skip files if it is
22
to slow to process all the images. """
33

4+
import json
45
import os
56
import re
67
import time
@@ -16,6 +17,9 @@ class FrameNumwrite():
1617
to enable NetworkWatchdog to skip the file if it is working on an older one. """
1718

1819
def __init__(self):
20+
with open('./ATS_settings.json') as file:
21+
self.settings = json.load(file)[os.environ['COMPUTERNAME'].lower()]
22+
1923
patterns = ["*.tif"]
2024
ignorePatterns = ["*.txt", "*.tiff"]
2125
ignoreDirectories = True
@@ -24,18 +28,14 @@ def __init__(self):
2428
ignoreDirectories,
2529
caseSensitive)
2630

27-
if os.environ['COMPUTERNAME'] == 'LEBPC20':
28-
self.modelPath = 'E:/Watchdog/SmartMito/model_Dora.h5'
29-
elif os.environ["COMPUTERNAME"] == 'LEBPC34':
30-
self.modelPath = (
31-
'C:/Users/stepp/Documents/data_raw/SmartMito/model_Dora.h5')
31+
self.binaryPath = self.settings['frameNumBinary']
3232

3333
self.frameNumOld = 100
3434

3535
myEventHandler.on_deleted = self.onDeleted
3636
myEventHandler.on_created = self.onCreated
3737

38-
path = "//lebnas1.epfl.ch/microsc125/Watchdog/"
38+
path = self.settings['imageFolder']
3939
goRecursively = True
4040
self.myObserver = Observer()
4141
self.myObserver.schedule(myEventHandler, path, recursive=goRecursively)
@@ -54,20 +54,16 @@ def onCreated(self, event):
5454
return
5555

5656
if frameNum % 2 and frameNum:
57-
writeBin(frameNum + 1, 0, os.path.dirname(self.modelPath))
57+
writeBin(frameNum + 1, 0, path=self.settings['frameNumBinary'], filename='')
5858
print(int((frameNum-1)/2), ' written')
5959
self.frameNumOld = frameNum
6060

61-
def onDeleted(self):
61+
def onDeleted(self, _):
6262
""" Signal if a file has been deleted, does not work very well. Used with TestTifSaver """
63-
writeBin(0, 0, os.path.dirname(self.modelPath))
63+
writeBin(0, 0, path=self.binaryPath, filename='')
6464
print(0, ' written')
6565

6666

67-
if __name__ == "__main__":
68-
main()
69-
70-
7167
def main():
7268
""" Main instance of the Module """
7369

@@ -81,3 +77,7 @@ def main():
8177
except KeyboardInterrupt:
8278
writer.myObserver.stop()
8379
writer.myObserver.join()
80+
81+
82+
if __name__ == "__main__":
83+
main()

0 commit comments

Comments
 (0)