From eeaadc13f446337d1939f017ded24e9adcf90566 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Thu, 22 Aug 2019 09:35:48 -0700 Subject: [PATCH 01/56] implement FA module --- xicam/BSISB/__init__.py | 33 ++--- .../BSISB/__pycache__/__init__.cpython-37.pyc | Bin 10599 -> 10464 bytes xicam/BSISB/widgets/factorizationwidget.py | 139 ++++++++++-------- 3 files changed, 94 insertions(+), 78 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index 0a41803..5d1aca1 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -95,8 +95,6 @@ def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): self.imageview.setHeader(header, field='image') self.spectra.setHeader(header, field='spectra') self.header = header - # init pixel selection dict - self.pixSelection = {'ROI': None, 'Mask': None} #setup ROI item sideLen = 10 @@ -107,6 +105,7 @@ def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): #constants self.path = os.path.expanduser('~/') + self.pixSelection = {'ROI': None, 'Mask': None} # init pixel selection dict # Connect signals self.imageview.sigShowSpectra.connect(self.spectra.showSpectra) @@ -274,12 +273,12 @@ def __init__(self, *args, **kwargs): # Selection model self.selectionmodel = QItemSelectionModel(self.headermodel) - self.PCA_widget = FactorizationWidget(self.headermodel, self.selectionmodel) - self.NMF_widget = FactorizationWidget(self.headermodel, self.selectionmodel) + self.FA_widget = FactorizationWidget(self.headermodel, self.selectionmodel) + # self.NMF_widget = FactorizationWidget(self.headermodel, self.selectionmodel) # update headers list when a tab window is closed - self.headermodel.rowsRemoved.connect(partial(self.PCA_widget.setHeader, 'spectra')) - self.headermodel.rowsRemoved.connect(partial(self.NMF_widget.setHeader, 'volume')) + self.headermodel.rowsRemoved.connect(partial(self.FA_widget.setHeader, 'spectra')) + # self.headermodel.rowsRemoved.connect(partial(self.NMF_widget.setHeader, 'volume')) # Setup tabviews and update map selection self.imageview = TabView(self.headermodel, self.selectionmodel, MapView, 'image') @@ -287,8 +286,8 @@ def __init__(self, *args, **kwargs): self.stages = {"MapToH5": GUILayout(self.mapToH5), "Image View": GUILayout(self.imageview), - "PCA": GUILayout(self.PCA_widget), - "NMF": GUILayout(self.NMF_widget)} + "Factor Analysis": GUILayout(self.FA_widget)} + # "NMF": GUILayout(self.NMF_widget)} super(BSISB, self).__init__(*args, **kwargs) def appendHeader(self, header: NonDBHeader, **kwargs): @@ -314,10 +313,10 @@ def appendHeader(self, header: NonDBHeader, **kwargs): currentMapView.sigAutoMaskState.connect(partial(self.appendSelection, 'autoMask')) currentMapView.sigSelectMaskState.connect(partial(self.appendSelection, 'select')) - self.PCA_widget.setHeader(field='spectra') - self.NMF_widget.setHeader(field='volume') + self.FA_widget.setHeader(field='spectra') + # self.NMF_widget.setHeader(field='volume') for i in range(4): - self.PCA_widget.roiList[i].sigRegionChangeFinished.connect(self.updateROI) + self.FA_widget.roiList[i].sigRegionChangeFinished.connect(self.updateROI) def appendSelection(self, sigCase, sigContent): # get current widget and append selectedPixels to item @@ -326,16 +325,16 @@ def appendSelection(self, sigCase, sigContent): self.headermodel.item(currentItemIdx).selectedPixels = sigContent elif sigCase == 'ROI': self.headermodel.item(currentItemIdx).roiState = sigContent - self.PCA_widget.updateRoiMask() - self.NMF_widget.updateRoiMask() + self.FA_widget.updateRoiMask() + # self.NMF_widget.updateRoiMask() elif sigCase == 'autoMask': self.headermodel.item(currentItemIdx).maskState = sigContent - self.PCA_widget.updateRoiMask() - self.NMF_widget.updateRoiMask() + self.FA_widget.updateRoiMask() + # self.NMF_widget.updateRoiMask() elif sigCase == 'select': self.headermodel.item(currentItemIdx).selectState = sigContent - self.PCA_widget.updateRoiMask() - self.NMF_widget.updateRoiMask() + self.FA_widget.updateRoiMask() + # self.NMF_widget.updateRoiMask() def updateROI(self, roi): diff --git a/xicam/BSISB/__pycache__/__init__.cpython-37.pyc b/xicam/BSISB/__pycache__/__init__.cpython-37.pyc index 87b763d4b89ce49d5f64a55030365fb12c42990a..d4721f824129c2612641a6b6d73394f6a616181e 100644 GIT binary patch delta 1193 zcmY*YZ)jUp6u;-am*g!?(lkxmr2q0i^)>7MbTUQVSjQII&9t;BY*T7Y`{K-Nm##Oj ztm>-+1A?N1dG{E{zt^(`|CpIMb;-Nta7EW-Q!@tfJxAY@v9~0P&1NiSxQwl}A+nh| z028*htxk4!d(+=hXTZ#z#&B(y9_JIdy zJikumNIf4VXegBzmQFQVDy8F7OQpP7FpCYPc%o$T!(vyh6wPLkKSfIo__HGMx&NUc zylH}0?6cl|0B_(AzHj`Za5JAfg*Sm8x0>*}9r0TL6S&@%f>FHDHV25Qz=8$4GkBY510i(Fw znTNypb?0Mn?d`5Rxa{q59HE_?wi@aL$Y3P=D&+8dSc9MJTj9Il6jgWzH+qI(67TkW z2)FI?y-|QU{Ic&HypKowx1Xj#NQSGXnp?tW&eK9!ia^q2+!yI+ zf2lQFm^YVrbfjEZe6dohXdPIHOv+obBX}cnF46*wRXQnwNvfpE9?7qSlpy#e6;wie zIXVO?UWop@Z8dFn>m=p?o9SM2k+6`_W4Xf2=&c24)hC26-#)S_#fM+TcEKS26YF*T zu26NYAEWUkT*ia(cbuP4fFHy=@f~mt!-+%Alu!}HQX&cxzM0rc-^OQ&zmIhgk>t&YDZyi1L17$i#U50fuPgeMXcR3Nc=LfYBVvW{qa+9OL|RA*wmq zGs63VvAs-l^PRM4c;;6)FP6=*vR+)}m&N{ufOiEf2oSIIw0GsCPM3l%hq!2XJvp7c zN%0Z!b|G?@mv*m0G@&)|>gz5ee7L7c=zCclcYfkeM5PW8}Q1x507`+C)O)x|GTKuhv*oEykN L*1kCKDL~~vHTEp9 delta 1307 zcmZ8gTWl0%6rMA)x9;w2r)Ar2>1FRrr*5HAu||s#l;UD{Dcyp$SZiS>b*Gmtvs2rU zZAe(3R7l|T!Dt_L2_)hhnOaFe9v~)an#N1w!)l`O1$ptoTVle4=bus(cara%|2voe zoIU^f>B!w7ala_KIr{zZ`_Zx4YvPi98>eteXoW9w&^gulyu=?A?ko_c}H} zl=-SKbU0PDr6&qg=y3(jUe`?!y>q$6tU9fpG;;Y_{HP*hi2bk4WPz{UJ({z+Ue~ksc{tzaZ zHcW8FydXXY@D6_C`&?p)t$5wRv_br+)_}Lopi~4H#Fe@@r0{m#30TH>{Y(?P$f`x3 zBuy4J??~a*`Vd?(zpMuy4&u5$;yJ_|Ut*BKzx^X{)yy`y!M}r;;eJ`tpJJvH3{rTi zF$)9uS>w}i^J3F4kimOR?XYgT0*wG27;HXE)TL$_zBAXG?}LNo&^vIWr3?D;e#;fO zYhG#%0i47;ZOgEMue9$vW7ugBG)~P{VncPZljbVd7;e%Wnn!^W|6ol2@=oIUP2TWs z#T%j`lx&p4M~qLaE!U8gSgcV;8dm~K`W{G!C6Ch^DuH5KVS)9=Hp5@!O1#!kgd%^Q zLKQB{$@Yw%pjN7mH}li;GpZh^gKQghrYGix^Dpi>?M}^1Osb({Id!2b3_ibaRLG?J zzl^^~oK=;ir|)2|WSvk}Na{30BKRs1#lp63&0I>6vMz8mR=Tli_@kR!oL zkDwS03E%_V8BM~6csv^0bG8TyKgH{rBAX^(7K%az#@TcoWhYxi(p;O`>@o5c$oDj^ zM+4da7&^&dBg5rKl2}jS|4FtcbDLH8us{6{Yr}&O^CwrC`7=M-8= zT1~d;`gP*4FE-q{LCSvCUppxr@3zL^qBh;M09Q-?$cSMegof6M4<+6C0gMyexFFg LK~vtb24MUHy0A#i diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index 84f45dd..08f2734 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -6,7 +6,7 @@ from qtpy.QtGui import QStandardItemModel from functools import partial from qtpy.QtCore import Signal -from sklearn.decomposition import PCA, NMF +from sklearn.decomposition import PCA, NMF, FastICA from sklearn.preprocessing import StandardScaler, Normalizer import numpy as np import pandas as pd @@ -31,7 +31,11 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti self.selectionmodel = selectionmodel self.parameter = Parameter(name='params', type='group', - children=[{'name': "# of Components", + children=[{'name': "Method", + 'values': ['PCA', 'NMF', 'MCR'], + 'value': 'PCA', + 'type': 'list'}, + {'name': "# of Components", 'value': 4, 'type': 'int'}, {'name': "Calculate", @@ -65,10 +69,26 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti self.setParameters(self.parameter, showTop=False) self.setIndentation(0) + #constants + self.method = 'PCA' self.parameter.child('Calculate').sigActivated.connect(self.calculate) self.parameter.child('Save results').sigActivated.connect(self.saveResults) self.parameter.child('# of Components').sigValueChanged.connect(self.setNumComponents) + self.parameter.child('Method').sigValueChanged.connect(self.setMethod) + + def setMethod(self): + if self.parameter['Method'] == 'PCA': + self.method = 'PCA' + self.field = 'spectra' + elif self.parameter['Method'] == 'NMF': + self.method = 'NMF' + self.field = 'volume' + self.parameter.child('Normalization').setValue('None') + elif self.parameter['Method'] == 'MCR': + self.method = 'MCR' + self.field = 'spectra' + self.parameter.child('Normalization').setValue('None') def setHeader(self, wavenumbers, imgShapes, rc2indList, ind2rcList, field: str): # get all headers selected @@ -81,25 +101,20 @@ def setHeader(self, wavenumbers, imgShapes, rc2indList, ind2rcList, field: str): self.imgShapes = imgShapes self.rc2indList = rc2indList self.ind2rcList = ind2rcList - self._dataSets = [] + self._dataSets = {'spectra': [], 'volume': []} - if field == 'spectra': # PCA workflow - for header in self.headers: - data = None - try: - data = header.meta_array(self.field) - except IndexError: - msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) - - if data is not None: - self._dataSets.append(data) - elif field == 'volume': # NMF workflow - self.parameter.child('Normalization').setValue('None') - for header in self.headers: - volumeEvent = next(header.events(fields=['volume'])) - # readin filepath - path = volumeEvent['path'] - self._dataSets.append(path) + for header in self.headers: + data = None + try: # spectra datasets + data = header.meta_array('spectra') + except IndexError: + msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) + if data is not None: + self._dataSets['spectra'].append(data) + # NMF path sets + volumeEvent = next(header.events(fields=['volume'])) + path = volumeEvent['path'] # readin filepath + self._dataSets['volume'].append(path) def setNumComponents(self): N = self.parameter['# of Components'] @@ -143,7 +158,7 @@ def calculate(self): self._allData = np.empty((0, self.N_w)) print(self.imgShapes) - for i, data in enumerate(self._dataSets): # i: map idx + for i, data in enumerate(self._dataSets['spectra']): # i: map idx if self.selectedPixelsList[i] is None: n_spectra = len(data) tmp = np.zeros((n_spectra, self.N_w)) @@ -161,32 +176,41 @@ def calculate(self): self.dataRowSplit.append(self.dataRowSplit[-1] + n_spectra) self._allData = np.append(self._allData, tmp, axis=0) - # define pop up plots labels - self.fac_method_name = 'PCA' - self.data_fac_name = 'data_PCA' - if len(self._allData) > 0: - # normalize and mean center - if self.parameter['Normalization'] == 'L1':# normalize - data_norm = Normalizer(norm='l1').fit_transform(self._allData) - elif self.parameter['Normalization'] == 'L2': - data_norm = Normalizer(norm='l2').fit_transform(self._allData) - else: - data_norm = self._allData - #subtract mean - data_centered = StandardScaler(with_std=False).fit_transform(data_norm) - # Do PCA - self.PCA = PCA(n_components=N) - self.PCA.fit(data_centered) - self.data_PCA = self.PCA.transform(data_centered) - # pop up plots - self.popup_plots() + if self.method == 'PCA': + self.data_fac_name = 'data_PCA' # define pop up plots labels + # normalize and mean center + if self.parameter['Normalization'] == 'L1':# normalize + data_norm = Normalizer(norm='l1').fit_transform(self._allData) + elif self.parameter['Normalization'] == 'L2': + data_norm = Normalizer(norm='l2').fit_transform(self._allData) + else: + data_norm = self._allData + #subtract mean + data_centered = StandardScaler(with_std=False).fit_transform(data_norm) + # Do PCA + self.PCA = PCA(n_components=N) + self.PCA.fit(data_centered) + self.data_PCA = self.PCA.transform(data_centered) + # pop up plots + self.popup_plots() + elif self.method == 'MCR': + self.data_fac_name = 'data_MCR' # define pop up plots labels + # Do MCR + self.MCR = FastICA(n_components=N) + self.data_MCR = self.MCR.fit_transform(self._allData) + # pop up plots + self.popup_plots() else: msg.logMessage('The data matrix is empty. No PCA is performed.', msg.ERROR) MsgBox('The data matrix is empty. No PCA is performed.', 'error') self.PCA, self.data_PCA = None, None - # emit PCA and transformed data : data_PCA - self.sigPCA.emit((self.wavenumbers_select, self.PCA, self.data_PCA, self.dataRowSplit)) + self.MCR, self.data_MCR = None, None + # emit PCA and transformed data + if self.method == 'PCA': + self.sigPCA.emit((self.wavenumbers_select, self.PCA, self.data_PCA, self.dataRowSplit)) + elif self.method == 'MCR': + self.sigPCA.emit((self.wavenumbers_select, self.MCR, self.data_MCR, self.dataRowSplit)) elif self.field == 'volume': # NMF workflow data_files = [] @@ -195,7 +219,7 @@ def calculate(self): self.allDataRowSplit = [0] # row split for complete datasets print(self.imgShapes) - for i, file in enumerate(self._dataSets): + for i, file in enumerate(self._dataSets['volume']): ir_data, fmt = read_map.read_all_formats(file) n_spectra = ir_data.data.shape[0] self.allDataRowSplit.append(self.allDataRowSplit[-1] + n_spectra) @@ -218,20 +242,18 @@ def calculate(self): self.dataRowSplit.append(self.dataRowSplit[-1] + n_spectra) # row split for ROI selected rows # define pop up plots labels - self.fac_method_name = 'NMF' self.data_fac_name = 'data_NMF' if len(self.df_row_idx) > 0: # aggregate datasets - ir_data_agg = aggregate_data(self._dataSets, data_files, wav_masks) + ir_data_agg = aggregate_data(self._dataSets['volume'], data_files, wav_masks) col_idx = list(set(wavROIidx) & set(ir_data_agg.master_wmask)) self.wavenumbers_select = self.wavenumbers[col_idx] ir_data_agg.data = ir_data_agg.data[:, col_idx] ir_data_agg.data = ir_data_agg.data[row_idx, :] # perform NMF - NMF_obj = NMF(n_components=N) - self.data_NMF = NMF_obj.fit_transform(ir_data_agg.data) - self.NMF = NMF_obj + self.NMF = NMF(n_components=N) + self.data_NMF = self.NMF.fit_transform(ir_data_agg.data) # pop up plots self.popup_plots() else: @@ -243,9 +265,9 @@ def calculate(self): def popup_plots(self): labels = [] - for i in range(getattr(self, self.fac_method_name).components_.shape[0]): - labels.append(self.fac_method_name + str(i + 1)) - plt.plot(self.wavenumbers_select, getattr(self, self.fac_method_name).components_[i, :], '-', + for i in range(getattr(self, self.method).components_.shape[0]): + labels.append(self.method + str(i + 1)) + plt.plot(self.wavenumbers_select, getattr(self, self.method).components_[i, :], '-', label=labels[i]) loadings_legend = plt.legend(loc='best') plt.setp(loadings_legend, draggable=True) @@ -271,8 +293,9 @@ def popup_plots(self): plt.show() def saveResults(self): - if (hasattr(self, 'PCA') and self.PCA is not None) or (hasattr(self, 'NMF') and self.NMF is not None): - name = self.fac_method_name + if (hasattr(self, 'PCA') and self.PCA is not None) or (hasattr(self, 'NMF') and self.NMF is not None)\ + or (hasattr(self, 'MCR') and self.MCR is not None): + name = self.method df_fac_components = pd.DataFrame(getattr(self, name).components_, columns=self.wavenumbers_select) df_data_fac = pd.DataFrame(getattr(self, self.data_fac_name), index=self.df_row_idx) df_fac_components.to_csv(name + '_components.csv') @@ -426,10 +449,7 @@ def updateComponents(self, i): # update PCA components if hasattr(self, '_plots'): # update plots - if self.field == 'spectra': - name = 'PCA' + str(component_index) - elif self.field == 'volume': - name = 'NMF' + str(component_index) + name = self.parameter['Method'] + str(component_index) self._plots[i].setData(self.wavenumbers, self._fac.components_[component_index - 1, :], name=name) # update legend label sample, label = self._plotLegends.items[i] @@ -471,10 +491,7 @@ def showComponents(self, fac_obj): self._plots = [] for i in range(4): component_index = self.parameter[f'Map {i + 1} Component'] - if self.field == 'spectra': - name = 'PCA' + str(component_index) - elif self.field == 'volume': - name = 'NMF' + str(component_index) + name = self.parameter['Method'] + str(component_index) # show loading plots tmp = self.componentSpectra.plot(self.wavenumbers, self._fac.components_[component_index - 1, :], name=name, pen=mkPen(self._colors[i], width=2)) From 3578f164270c468cb3ec375fd0e54068106ea5cd Mon Sep 17 00:00:00 2001 From: lchen23 Date: Fri, 23 Aug 2019 17:17:33 -0700 Subject: [PATCH 02/56] implement MCR --- xicam/BSISB/__init__.py | 8 +---- .../BSISB/__pycache__/__init__.cpython-37.pyc | Bin 10464 -> 0 bytes xicam/BSISB/widgets/factorizationwidget.py | 33 +++++++++++++----- 3 files changed, 26 insertions(+), 15 deletions(-) delete mode 100644 xicam/BSISB/__pycache__/__init__.cpython-37.pyc diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index 5d1aca1..b350cd3 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -155,6 +155,7 @@ def loadRoi(self): self.roi.show() self.autoMaskBtn.setChecked(roiStates['maskBtn']) self.selectMaskBtn.setChecked(True) + self.showSelectMask() for k, v in roiStates['parameter'].items(): self.parameter[k] = v MsgBox(f'ROI states were loaded from: \n{filePath + fileName}') @@ -274,11 +275,9 @@ def __init__(self, *args, **kwargs): self.selectionmodel = QItemSelectionModel(self.headermodel) self.FA_widget = FactorizationWidget(self.headermodel, self.selectionmodel) - # self.NMF_widget = FactorizationWidget(self.headermodel, self.selectionmodel) # update headers list when a tab window is closed self.headermodel.rowsRemoved.connect(partial(self.FA_widget.setHeader, 'spectra')) - # self.headermodel.rowsRemoved.connect(partial(self.NMF_widget.setHeader, 'volume')) # Setup tabviews and update map selection self.imageview = TabView(self.headermodel, self.selectionmodel, MapView, 'image') @@ -314,7 +313,6 @@ def appendHeader(self, header: NonDBHeader, **kwargs): currentMapView.sigSelectMaskState.connect(partial(self.appendSelection, 'select')) self.FA_widget.setHeader(field='spectra') - # self.NMF_widget.setHeader(field='volume') for i in range(4): self.FA_widget.roiList[i].sigRegionChangeFinished.connect(self.updateROI) @@ -326,16 +324,12 @@ def appendSelection(self, sigCase, sigContent): elif sigCase == 'ROI': self.headermodel.item(currentItemIdx).roiState = sigContent self.FA_widget.updateRoiMask() - # self.NMF_widget.updateRoiMask() elif sigCase == 'autoMask': self.headermodel.item(currentItemIdx).maskState = sigContent self.FA_widget.updateRoiMask() - # self.NMF_widget.updateRoiMask() elif sigCase == 'select': self.headermodel.item(currentItemIdx).selectState = sigContent self.FA_widget.updateRoiMask() - # self.NMF_widget.updateRoiMask() - def updateROI(self, roi): if self.selectionmodel.hasSelection(): diff --git a/xicam/BSISB/__pycache__/__init__.cpython-37.pyc b/xicam/BSISB/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index d4721f824129c2612641a6b6d73394f6a616181e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10464 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 diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index 08f2734..8c4a7dd 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -6,6 +6,7 @@ from qtpy.QtGui import QStandardItemModel from functools import partial from qtpy.QtCore import Signal +from pymcr.mcr import McrAR from sklearn.decomposition import PCA, NMF, FastICA from sklearn.preprocessing import StandardScaler, Normalizer import numpy as np @@ -63,6 +64,10 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti 'values': ['L2', 'L1', 'None'], 'value': 'L2', 'type': 'list'}, + {'name': "C regressor", + 'values': ['OLS', 'NNLS'], + 'value': 'OLS', + 'type': 'list'}, {'name': "Save results", 'type': 'action'} ]) @@ -71,31 +76,37 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti self.setIndentation(0) #constants self.method = 'PCA' + self.field = 'spectra' self.parameter.child('Calculate').sigActivated.connect(self.calculate) self.parameter.child('Save results').sigActivated.connect(self.saveResults) self.parameter.child('# of Components').sigValueChanged.connect(self.setNumComponents) self.parameter.child('Method').sigValueChanged.connect(self.setMethod) + self.parameter.child('C regressor').hide() def setMethod(self): if self.parameter['Method'] == 'PCA': self.method = 'PCA' self.field = 'spectra' + self.parameter.child('Normalization').setToDefault() + self.parameter.child('Normalization').show() + self.parameter.child('C regressor').hide() elif self.parameter['Method'] == 'NMF': self.method = 'NMF' self.field = 'volume' - self.parameter.child('Normalization').setValue('None') + self.parameter.child('Normalization').hide() + self.parameter.child('C regressor').hide() elif self.parameter['Method'] == 'MCR': self.method = 'MCR' self.field = 'spectra' - self.parameter.child('Normalization').setValue('None') + self.parameter.child('Normalization').hide() + self.parameter.child('C regressor').show() - def setHeader(self, wavenumbers, imgShapes, rc2indList, ind2rcList, field: str): + def setHeader(self, wavenumbers, imgShapes, rc2indList, ind2rcList): # get all headers selected # headers = [self.headermodel.itemFromIndex(i).header for i in self.selectionmodel.selectedRows()] self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] - self.field = field self.wavenumbers = wavenumbers self.N_w = len(self.wavenumbers) self.imgShapes = imgShapes @@ -113,7 +124,7 @@ def setHeader(self, wavenumbers, imgShapes, rc2indList, ind2rcList, field: str): self._dataSets['spectra'].append(data) # NMF path sets volumeEvent = next(header.events(fields=['volume'])) - path = volumeEvent['path'] # readin filepath + path = volumeEvent['path'] # readin filepath self._dataSets['volume'].append(path) def setNumComponents(self): @@ -196,9 +207,15 @@ def calculate(self): self.popup_plots() elif self.method == 'MCR': self.data_fac_name = 'data_MCR' # define pop up plots labels + # Do ICA to find initial estimate of ST matrix + self.ICA = FastICA(n_components=N) + self.ICA.fit(self._allData) # Do MCR - self.MCR = FastICA(n_components=N) - self.data_MCR = self.MCR.fit_transform(self._allData) + self.MCR = McrAR(max_iter=100, c_regr=self.parameter['C regressor'], st_regr='NNLS', + tol_err_change=1e-6, tol_increase=0.5) + self.MCR.fit(self._allData, ST=self.ICA.components_) + self.MCR.components_ = self.MCR.ST_opt_ + self.data_MCR = self.MCR.C_opt_ # pop up plots self.popup_plots() else: @@ -553,7 +570,7 @@ def setHeader(self, field: str): MsgBox('Length of wavenumber arrays of displayed maps are not equal. \n' 'Perform PCA or NMF on these maps will lead to error.','warn') - self.parametertree.setHeader(self.wavenumbers, self.imgShapes, self.rc2indList, self.ind2rcList, field=field) + self.parametertree.setHeader(self.wavenumbers, self.imgShapes, self.rc2indList, self.ind2rcList) From e12f305f8a637ddd84b72d41fce5a0eabac2ade5 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 28 Aug 2019 16:50:03 -0700 Subject: [PATCH 03/56] add interactivity to FA components --- requirements.txt | 2 +- .../__pycache__/mapviewwidget.cpython-37.pyc | Bin 3583 -> 3583 bytes .../spectraplotwidget.cpython-37.pyc | Bin 4450 -> 4689 bytes xicam/BSISB/widgets/factorizationwidget.py | 91 +++++++++++++++--- xicam/BSISB/widgets/mapviewwidget.py | 4 - xicam/BSISB/widgets/spectraplotwidget.py | 9 +- 6 files changed, 88 insertions(+), 18 deletions(-) diff --git a/requirements.txt b/requirements.txt index 2429bca..934e790 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,4 +10,4 @@ matplotlib seaborn scikit-learn umap-learn - +pyMCR diff --git a/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc index ef8c62c3d35deb1eceae558ea68bf28bc4e1f539..31a4b7545006ba850337e7b47e90c564baafbfc7 100644 GIT binary patch delta 80 zcmew_{a>2biIr^T9Yp&6UNZV?mWjCc_;JpPGyXmyp%Tz0Ea3UZ~y=R delta 80 zcmew_{a>2biI1R?0EgKa00000 diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc index 0a5d9fa954a9babfb05a4241a593976675fc23c2..612cb47db31a43988c4797f42d168abccbf4aa43 100644 GIT binary patch delta 1329 zcmZ8h&2Jk;6yKTs@a}s3ku-7Q6rr?Ycl}f&WzqLO14exETTH+og#59pD;(Ho5!aWTpoHH~Ajv227zImf52tl#8@0Sx1WCIq-?TEo9= z=D`RFELBW*S|4sEbFh`JDR00miMDbEr1A&*^7^iL5R=KcO!zg+O+_Yu;TOli!b4@R zz-F4Fy~wV<8zoypj+$TjH58R_rPJ~!^Qc{AJ`3bM^IZ9JJjA2<4m3so7Jcq2V-9 z#}H_x;|K=k;IaVGXAZBLWzN|+X7#=E8>`DN3Jdj@Pzhc}P*z)PXUY-RMLSEOF8?mf zUmin2Sb&g}9%{l#VrLMp25CpEWDs2-BW1;y*C3UL`RGTwD56-vto+2iy+AJU0TU4c zOpv2z>A>nFo0-0B$aOfy*8lIRn67PpygUdvFPq+bPn05APHrrERmM%T{mm~C*Fk6G7g zKbbkXjXH%Jyj!3>FVsng>m7%s>886edGT%=vH7*xb=&3GLf)67rKyEtjzbmuw@{-I zWTl+nU|kQbjYb)Df?g#q#zF3l7=2Eo*0gZga3FJsdQlG_`40A5r8{hINV!yXnV;F3XX!m z^xcIUAIoow51FH(*n%y7DqgXbu2gB1no6TJWKG7DP)U_aIb&O>Oewx0616w?GeiTw zUHnq78+Oc-tKzaYAzo|Gdpukykhh%(g|#x1S=dbGW`B=)BGFG2AK+rD%%J~S8&dIJ zhqY72eb#A17p_QSF^Cp8*f@qVp-p@?59+=N-NMTa4DF@44E;3Pf!KvD?m#Ha!7W{+ z!%WrFimJ-CiCXRlD~l`Ec;^tRz!8Mht9&VuCST;$B!;qhYn{DR!UaDE-K6wa6M9JO zMO<~`8lO%e7$YO8hd~mo2l6)>Nf$D~gOJ0ZIB!22CzsNgj(7mjMvnH=gkFp0lk9N5 znr$c9o&P=Mh<7)3eD!W;KM*VZh^ z7K-*F52_mxUl6}t&c2ACuy1lkYv@g-Zlp%YW>pvtS>3GePEf`wFjv)jj`}p$NjhrQ zn>dq;tD%a$^-Kx17h2t_7DF9nTYN9{9&=JFv_t0+YE<%xo2sj?8bBc_dQCz$egafddGs%>_&A z)oNnGC+B0|*~sIPWXqc+0|R7oh%iVvjOds8GMR6^!7P%SxE%K(6tzP%y>9Wrn_Ah9 zBGA*yN*zobNi9wQPSe~O!WiK)fzBffmCAG!#PKwbqDp0RBcA~|hwR\ + X = {x_val: .2f}, Y = {y_val: .4f}' + self.txt.setHtml(txt_html) + self.cross.setData([x_val], [y_val]) + + def plot(self, x, y, *args, **kwargs): + # set up infinity line and get its position + plot_item = self.plotItem.plot(x, y, *args, **kwargs) + self.addItem(self.line) + self.addItem(self.cross) + x_val = self.line.value() + idx = val2ind(x_val, x) + x_val = x[idx] + y_val = y[idx] + txt_html = f'
\ + X = {x_val: .2f}, Y = {y_val: .4f}
' + self.txt.setHtml(txt_html) + self.txt.setZValue(self.zmax - 1) + self.cross.setData([x_val], [y_val]) + self.cross.setZValue(self.zmax) + ymax = max(y) + if ymax > self.ymax: + self.ymax = ymax + self._x, self._y = x, y + self.txt.setPos(1200, 0.95 * self.ymax) + self.addItem(self.txt) + return plot_item class FactorizationWidget(QSplitter): def __init__(self, headermodel, selectionmodel): @@ -339,10 +388,10 @@ def __init__(self, headermodel, selectionmodel): self.gridwidget.setLayout(self.gridlayout) self.display = QSplitter() - self.componentSpectra = PlotWidget() + # self.componentSpectra = PlotWidget() + self.componentSpectra = ComponentPlotWidget() self._plotLegends = self.componentSpectra.addLegend() self._colors = ['r', 'g', 'b', 'y', 'c', 'm', 'w'] # color for plots - self.componentSpectra.getViewBox().invertX(True) # self.spectraROI = PlotWidget() self.NWimage = BetterButtons() @@ -361,22 +410,25 @@ def __init__(self, headermodel, selectionmodel): getattr(self, self._imageDict[i]).view.invertY(True) getattr(self, self._imageDict[i]).imageItem.setOpts(axisOrder="row-major") # set up roi item - roi = pg.PolyLineROI(positions=[[0, 0], [sideLen, 0], [sideLen, sideLen], [0, sideLen]], closed=True) + roi = PolyLineROI(positions=[[0, 0], [sideLen, 0], [sideLen, sideLen], [0, sideLen]], closed=True) roi.hide() self.roiInitState = roi.getState() self.roiList.append(roi) # set up mask item - maskItem = pg.ImageItem(np.ones((1,1)), axisOrder="row-major", autoLevels=True, opacity=0.3) + maskItem = ImageItem(np.ones((1,1)), axisOrder="row-major", autoLevels=True, opacity=0.3) maskItem.hide() self.maskList.append(maskItem) # set up select mask item - selectMaskItem = pg.ImageItem(np.ones((1, 1)), axisOrder="row-major", autoLevels=True, opacity=0.3, + selectMaskItem = ImageItem(np.ones((1, 1)), axisOrder="row-major", autoLevels=True, opacity=0.3, lut = np.array([[0, 0, 0], [255, 0, 0]])) selectMaskItem.hide() self.selectMaskList.append(selectMaskItem) + # set up image title + getattr(self, self._imageDict[i]).imageTitle = TextItem() getattr(self, self._imageDict[i]).view.addItem(roi) getattr(self, self._imageDict[i]).view.addItem(maskItem) getattr(self, self._imageDict[i]).view.addItem(selectMaskItem) + getattr(self, self._imageDict[i]).view.addItem(getattr(self, self._imageDict[i]).imageTitle) self.parametertree = FactorizationParameters(headermodel, selectionmodel) self.parameter = self.parametertree.parameter @@ -453,7 +505,6 @@ def updateRoiMask(self): except Exception: pass - def updateComponents(self, i): # i is imageview/window number # component_index is the PCA component index @@ -498,7 +549,8 @@ def showComponents(self, fac_obj): # get map ROI selected region self.selectedPixelsList = [self.headermodel.item(i).selectedPixels for i in range(self.headermodel.rowCount())] # clear plots and legends - self.componentSpectra.clear() + self.componentSpectra.plotItem.clearPlots() + self.componentSpectra.ymax = 0 for sample, label in self._plotLegends.items[:]: self._plotLegends.removeItem(label.text) @@ -512,9 +564,14 @@ def showComponents(self, fac_obj): # show loading plots tmp = self.componentSpectra.plot(self.wavenumbers, self._fac.components_[component_index - 1, :], name=name, pen=mkPen(self._colors[i], width=2)) + tmp.curve.setClickable(True) + tmp.curve.sigClicked.connect(partial(self.curveHighLight, i)) self._plots.append(tmp) # show score plots self.drawMap(component_index, i) + # update the last image and loading plots as a recalculation complete signal + N = self.parameter['# of Components'] + self.parameter.child(f'Map 4 Component').setValue(N) # clear maps else: tab_idx = self.headermodel.rowCount() - 1 @@ -523,10 +580,6 @@ def showComponents(self, fac_obj): img = np.zeros((self.imgShapes[tab_idx][0], self.imgShapes[tab_idx][1])) getattr(self, self._imageDict[i]).setImage(img=img) - # update the last image and loading plots as a recalculation complete signal - N = self.parameter['# of Components'] - self.parameter.child(f'Map 4 Component').setValue(N) - def drawMap(self, component_index, i): # i is imageview/window number data_slice = self._data_fac[self._dataRowSplit[self.selectMapIdx]:self._dataRowSplit[self.selectMapIdx + 1], @@ -542,6 +595,20 @@ def drawMap(self, component_index, i): 1]] = data_slice img = np.flipud(img) getattr(self, self._imageDict[i]).setImage(img=img) + # set imageTitle + imageTitle = getattr(self, self._imageDict[i]).imageTitle + title = self.parameter['Method'] + str(component_index) + imageTitle.setHtml(f'
{title}
') + imageTitle.setPos(0, -5) + + def curveHighLight(self, k): + for i in range(4): + if i == k: + self._plots[i].setPen(mkPen(self._colors[k], width=6)) + else: + self._plots[i].setPen(mkPen(self._colors[i], width=2)) + self.componentSpectra._x, self.componentSpectra._y = self._plots[k].getData() + self.componentSpectra.getEnergy() def setHeader(self, field: str): diff --git a/xicam/BSISB/widgets/mapviewwidget.py b/xicam/BSISB/widgets/mapviewwidget.py index 1051bec..a136d0a 100644 --- a/xicam/BSISB/widgets/mapviewwidget.py +++ b/xicam/BSISB/widgets/mapviewwidget.py @@ -14,12 +14,8 @@ def __init__(self, *args, **kwargs): # self.scene.sigMouseMoved.connect(self.showSpectra) self.scene.sigMouseClicked.connect(self.showSpectra) self.view.invertY(True) - # add arrow - # self.arrow = ArrowItem(angle=60, headLen=15, tipAngle=45, baseAngle=30, brush = (200, 80, 20)) - # self.arrow.setPos(0, 0) self.cross = PlotDataItem([0], [0], symbolBrush=(200, 0, 0), symbolPen=(200, 0, 0), symbol='+', symbolSize=16) - self.view.addItem(self.cross) self.cross.hide() #add txt diff --git a/xicam/BSISB/widgets/spectraplotwidget.py b/xicam/BSISB/widgets/spectraplotwidget.py index 9a27aa1..a9af72d 100644 --- a/xicam/BSISB/widgets/spectraplotwidget.py +++ b/xicam/BSISB/widgets/spectraplotwidget.py @@ -18,10 +18,14 @@ def __init__(self, *args, **kwargs): self._meanSpec = True # whether current spectrum is a mean spectrum self.line = InfiniteLine(movable=True) self.line.setPen((255, 255, 0, 200)) - self.line.setZValue(100) + self.line.setValue(650) self.line.sigPositionChanged.connect(self.sigEnergyChanged) self.line.sigPositionChanged.connect(self.getEnergy) self.addItem(self.line) + self.cross = PlotDataItem([650], [0], symbolBrush=(255, 0, 0), symbolPen=(255, 0, 0), symbol='+', + symbolSize=20) + self.cross.setZValue(100) + self.addItem(self.cross) self.getViewBox().invertX(True) self.selectedPixels = None self._y = None @@ -42,6 +46,7 @@ def getEnergy(self, lineobject): txt_html += f'
\ X = {x_val: .2f}, Y = {y_val: .4f}
' self.txt.setHtml(txt_html) + self.cross.setData([x_val], [y_val]) def setHeader(self, header: NonDBHeader, field: str, *args, **kwargs): self.header = header @@ -99,6 +104,7 @@ def plot(self, x, y, *args, **kwargs): # set up infinity line and get its position self.plotItem.plot(x, y, *args, **kwargs) self.addItem(self.line) + self.addItem(self.cross) x_val = self.line.value() if x_val == 0: y_val = 0 @@ -120,4 +126,5 @@ def plot(self, x, y, *args, **kwargs): ymax = max(y) self._y = y self.txt.setPos(1500, 0.95 * ymax) + self.cross.setData([x_val], [y_val]) self.addItem(self.txt) From 13d98d5ef2e0cbe63e95d11064b496ec8fcf1748 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Fri, 30 Aug 2019 14:03:03 -0700 Subject: [PATCH 04/56] add pix value reader --- .../__pycache__/mapviewwidget.cpython-37.pyc | Bin 3583 -> 3769 bytes xicam/BSISB/widgets/mapviewwidget.py | 16 ++++++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc index 31a4b7545006ba850337e7b47e90c564baafbfc7..0950263ec8fef3f022e4313e8a581d14ba6c2427 100644 GIT binary patch delta 711 zcmXAnPe>F|9LL{p=FOX#byn2XT-VG+`?GU!CH%7`mYR48)NsqPf6Ks(vgMBQb`+H- z9SVd9BOVkafd-vAbttHV2QS^a1O*dB*Dm6rbM<@rhTmtt@5k@W_xI+#f2|+el9!Un z1i|rnqkQM*yW|JGkjI&TZL&kwwFrbJ$UW_$wyxt_7kUd3q(lYTHiW(dKzvdpE=;&g z?(3OaqvU&$7qe2i;>`upq&cdW{S|qZw%1t71}x11M;_RXvO-e{2UDXM)j#qv&A@?t zL;K*7{6WVbur1GC-^=P z^?3P)}{vi@^ZEsthk90I2(qN%(2^Y z&j`R%s%hGrAIPrJY`%APjSY6=s*7%;e9kru?&7Cpo7vvnjpAmavanPQt}K+pi1%WG z_sODpIt>=ofdd(+1r5W|vyjl3J|Lf&W3VT`n=jAoV#{?x_ie$-Am|Hi6E`Ms^Ch+U zdfz-efCl-*%0XVfw=TD)_^@&qLBuq~?qe1#2Vqp@1(~srL%%H8qiLQ~MXF2J`q{KHlLs<-zG$1QdL}4xTY|TaP_0bV=B?162Lo^KB;g@VN%|$ z*=$gDG4t@JE(Wm{F7h7vx8`+EkE%GQ(4^3%(4s&Qv0jZhpHkDJ!lC~y`PCU}K33OU XOC8G9U3KeYBV4L1uJRe_Ccpg$7p|k= delta 571 zcmXw%&ubGw6vyYyPG+;)-O@&CYEs)^vAR@|T5GXLgN7m$68b}FEs6xQYAW4^*=;eh z1wqi0UfxX+60e^0Q0%=3o&*t*^&)r@{0pi@-xz$u`!MhEzTY>8**W|t?_P9Wn^7$N zx^;c>wYzPM9-%6R7HhLD9zo1ww#py!EhA-8W~r>UXF@wYkB&(qKY4&N_|P{ zMy(oEJyR9*bVq`h>~nIG>ac*1>|uOm@4y23UGYF!4=rk3*0@6OjE=N~`&~IGW54q> zQ=xt$t6|h^_z4dhY7E~xFUQBU=B!4a#;C?24M9kZFj8t>mkS#IR;}O@x0ucL9PAd3 VQ2Kv(y-6zASZg%ZGJbbI{{@o>hd%%S diff --git a/xicam/BSISB/widgets/mapviewwidget.py b/xicam/BSISB/widgets/mapviewwidget.py index a136d0a..d936a53 100644 --- a/xicam/BSISB/widgets/mapviewwidget.py +++ b/xicam/BSISB/widgets/mapviewwidget.py @@ -25,12 +25,11 @@ def __init__(self, *args, **kwargs): def setEnergy(self, lineobject): E = lineobject.value() # map E to index - i = val2ind(E, self.wavenumbers) - # print('E:', E, 'wav:', self.wavenumbers[i]) - self.setCurrentIndex(i) + idx = val2ind(E, self.wavenumbers) + self._image = self._data[idx] + self.setCurrentIndex(idx) def showSpectra(self, event): - pos = event.pos() if self.view.sceneBoundingRect().contains(pos): # Note, when axes are added, you must get the view with self.view.getViewBox() mousePoint = self.view.mapSceneToView(pos) @@ -40,14 +39,14 @@ def showSpectra(self, event): ind = self.rc2ind[(y,x)] self.sigShowSpectra.emit(ind) # print(x, y, ind, x + y * self.n_col) - - #update arrow + #update crosshair self.cross.setData([x + 0.5], [self.row - y - 0.5]) self.cross.show() # update text - self.txt.setHtml(f'
X: {x}
\ + self.txt.setHtml(f'
Point: #{ind}
\ +
X: {x}
\
Y: {y}
\ -
Point: #{ind}
') +
Val: {self._image[self.row - y -1, x]: .4f}
') except Exception: self.cross.hide() @@ -73,6 +72,7 @@ def setHeader(self, header: NonDBHeader, field: str, *args, **kwargs): # kwargs['transform'] = QTransform(1, 0, 0, -1, 0, data.shape[-2]) self.setImage(img=data, *args, **kwargs) self._data = data + self._image = self._data[0] def updateImage(self, autoHistogramRange=True): super(MapViewWidget, self).updateImage(autoHistogramRange) From 53a4e63c001e4dd597dc40da98b201485d1a0720 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Fri, 30 Aug 2019 17:04:11 -0700 Subject: [PATCH 05/56] fix the crosshair bug in mapconvertwidget --- xicam/BSISB/__init__.py | 5 +---- .../spectraplotwidget.cpython-37.pyc | Bin 4689 -> 4702 bytes xicam/BSISB/widgets/mapconvertwidget.py | 3 ++- xicam/BSISB/widgets/spectraplotwidget.py | 1 + 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index b350cd3..ccb4877 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -5,6 +5,7 @@ from qtpy.QtWidgets import * import pickle import pyqtgraph as pg +from pyqtgraph.parametertree import ParameterTree, Parameter import numpy as np from xicam.core.data import NonDBHeader from xicam.BSISB.widgets.uiwidget import MsgBox, uiSaveFile, uiGetFile @@ -12,12 +13,8 @@ from xicam.BSISB.widgets.mapviewwidget import MapViewWidget from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget from xicam.BSISB.widgets.factorizationwidget import FactorizationWidget - from xicam.plugins import GUIPlugin, GUILayout from xicam.gui.widgets.tabview import TabView -from pyqtgraph.parametertree import ParameterTree, Parameter - - class MapView(QSplitter): sigRoiPixels = Signal(object) diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc index 612cb47db31a43988c4797f42d168abccbf4aa43..3b0efefc1ead6da0c6ef33a6a654b270f709ef6b 100644 GIT binary patch delta 579 zcmcbpa!-ZViIB6*O-AUy~R?HlV4IK31n(A6@g5@#h8h%k-In}zdRW1iA49w zx?Iu58VL18AU3)V!SvLU;M5$Tw^LIBGAmMZiv2e4=32nWs4+Q)Cj{urjXYWksJ^_# z53Qh)!-4oFf2N4KZJTvaXN{0IfWMh5!Hn delta 545 zcmcboa#4lXiIY%5lM-FaQu9h~v7{uH zBtlGp8*_`ZIJLwhH8CZ%$ar!D=NdBupuSry1v&X8U>9jJ6@g5@#h8h%k-In}zdRW1 z(nPn(R$S3C>Oh51^+g~yvX03cxx^TKH=p2Iz{sdRIg=*@=&5}?S_-J1y2TGN)HgLT z4{C7WW)5Ca<{*8LX{e!81afGRA&6iG5k^4b7ISW5MG-h;*?`^($S*E30Saq!LH$s1 zi?I?KI+ODSlvY@Qh)nJioFf2N L4UL`2RzfNOBH4KI diff --git a/xicam/BSISB/widgets/mapconvertwidget.py b/xicam/BSISB/widgets/mapconvertwidget.py index 3753a54..3f732cb 100644 --- a/xicam/BSISB/widgets/mapconvertwidget.py +++ b/xicam/BSISB/widgets/mapconvertwidget.py @@ -7,7 +7,6 @@ from xicam.BSISB.widgets.uiwidget import MsgBox, YesNoDialog, uiGetFile, uiGetDir, uiSaveFile from xicam.BSISB.widgets.mapviewwidget import MapViewWidget from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget - from lbl_ir.data_objects import ir_map from lbl_ir.io_tools.read_omnic import read_and_convert @@ -129,6 +128,8 @@ def updateImage(self, row, col, wavenumbers, rc2ind, dataCube): self.imageview.row, self.imageview.col = row, col self.imageview.wavenumbers = wavenumbers self.imageview.rc2ind = rc2ind + self.imageview._data = dataCube + self.imageview._image = self.imageview._data[0] self.imageview.setImage(img=dataCube) def saveBtnClicked(self): diff --git a/xicam/BSISB/widgets/spectraplotwidget.py b/xicam/BSISB/widgets/spectraplotwidget.py index a9af72d..afed59e 100644 --- a/xicam/BSISB/widgets/spectraplotwidget.py +++ b/xicam/BSISB/widgets/spectraplotwidget.py @@ -27,6 +27,7 @@ def __init__(self, *args, **kwargs): self.cross.setZValue(100) self.addItem(self.cross) self.getViewBox().invertX(True) + self.spectrumInd = 0 self.selectedPixels = None self._y = None From 81a544c2a9f2bf43b2e0d05a3674fbe628f7f57f Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 9 Sep 2019 12:26:24 -0700 Subject: [PATCH 06/56] show file open, FA calculate message in status bar --- xicam/BSISB/__init__.py | 6 +++++- .../spectraplotwidget.cpython-37.pyc | Bin 4702 -> 4705 bytes xicam/BSISB/widgets/factorizationwidget.py | 4 +--- xicam/BSISB/widgets/spectraplotwidget.py | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index ccb4877..9e6ec88 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -7,6 +7,7 @@ import pyqtgraph as pg from pyqtgraph.parametertree import ParameterTree, Parameter import numpy as np +from xicam.core import msg from xicam.core.data import NonDBHeader from xicam.BSISB.widgets.uiwidget import MsgBox, uiSaveFile, uiGetFile from xicam.BSISB.widgets.mapconvertwidget import mapToH5 @@ -287,8 +288,11 @@ def __init__(self, *args, **kwargs): super(BSISB, self).__init__(*args, **kwargs) def appendHeader(self, header: NonDBHeader, **kwargs): + # get fileName and update status bar + fileName = header.startdoc.get('sample_name', '????') + msg.showMessage(f'Opening {fileName}.h5') # init item - item = QStandardItem(header.startdoc.get('sample_name', '????') + '_' + str(self.headermodel.rowCount())) + item = QStandardItem(fileName + '_' + str(self.headermodel.rowCount())) item.header = header item.selectedPixels = None diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc index 3b0efefc1ead6da0c6ef33a6a654b270f709ef6b..f78d7e98126611424a29013d54dff6e94c5b6935 100644 GIT binary patch delta 205 zcmcbo@=%4>iI Date: Tue, 10 Sep 2019 15:45:51 -0700 Subject: [PATCH 07/56] allow npy format import --- .../__pycache__/mapviewwidget.cpython-37.pyc | Bin 3769 -> 3769 bytes .../spectraplotwidget.cpython-37.pyc | Bin 4705 -> 4705 bytes xicam/BSISB/widgets/mapconvertwidget.py | 69 +++++++++++------- 3 files changed, 43 insertions(+), 26 deletions(-) diff --git a/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc index 0950263ec8fef3f022e4313e8a581d14ba6c2427..3dac6ffda2f2ca08009b93267a931c694fb1bec8 100644 GIT binary patch delta 20 acmdlfyHl3iiIA') self.T2AConvert.setChecked(True) # Assemble widgets - self.toollayout.addWidget(self.openBtn) + self.toollayout.addWidget(self.openMapBtn) + self.toollayout.addWidget(self.openNpyBtn) self.toollayout.addWidget(self.saveBtn) self.toollayout.addWidget(self.batchBtn) self.toollayout.addWidget(QLabel('Sample Name:')) @@ -66,19 +69,29 @@ def __init__(self): # Connect signals self.imageview.sigShowSpectra.connect(self.spectra.showSpectra) self.spectra.sigEnergyChanged.connect(self.imageview.setEnergy) - self.openBtn.clicked.connect(self.openBtnClicked) + self.openMapBtn.clicked.connect(self.openBtnClicked) + self.openNpyBtn.clicked.connect(self.openNpy) self.saveBtn.clicked.connect(self.saveBtnClicked) self.batchBtn.clicked.connect(self.batchBtnClicked) # Constants self.path = os.path.dirname(sys.path[1]) self.minYLimit = 5 self.epsilon = 1e-10 + self.fileFormat = 'map' + + def openNpy(self): + self.fileFormat = 'npy' + self.T2AConvert.setChecked(True) + self.openBtnClicked() def openBtnClicked(self): # open omnic map file - self.filePath, self.fileName, canceled = uiGetFile('Open map file', self.path, "Omnic Map Files (*.map)") + if self.fileFormat == 'map': + self.filePath, self.fileName, canceled = uiGetFile('Open map file', self.path, "Omnic Map Files (*.map)") + elif self.fileFormat == 'npy': + self.filePath, self.fileName, canceled = uiGetFile('Open npy file', self.path, "Numpy array Files (*.npy)") if canceled: - self.infoBox.setText('Open map canceled.') + self.infoBox.setText('Open file canceled.') return # set sample_id if self.sampleName.text() == 'None': @@ -87,31 +100,35 @@ def openBtnClicked(self): sample_info = ir_map.sample_info(sample_id=self.sampleName.text()) #try to open omnic map file try: - self.irMap = read_and_convert(self.filePath + self.fileName, sample_info=sample_info) + if self.fileFormat == 'map': + self.irMap = read_and_convert(self.filePath + self.fileName, sample_info=sample_info) + elif self.fileFormat == 'npy': + self.irMap = read_npy(self.filePath + self.fileName, sample_info=sample_info) except Exception as error: self.infoBox.setText(error.args[0] + f'\nFailed to open file: {self.fileName}.') else: - # check whether to perform T->A conversion - spec0 = self.irMap.imageCube[0, 0, :] - maxSpecY = np.max(spec0) - if (not self.T2AConvert.isChecked()) and (maxSpecY >= self.minYLimit): - userMsg = YesNoDialog(f'max(Y) of the first spectrum is greater than {self.minYLimit}, \ - while the "Auto T->A" box is not checked. \nPlease make sure data format is in absorbance.\ - \nDo you want to perform "Auto T->A" conversion?') - userChoice = userMsg.choice() - if userChoice == QMessageBox.Yes: - self.T2AConvert.setChecked(True) + if self.fileFormat == 'map': + # check whether to perform T->A conversion + spec0 = self.irMap.imageCube[0, 0, :] + maxSpecY = np.max(spec0) + if (not self.T2AConvert.isChecked()) and (maxSpecY >= self.minYLimit): + userMsg = YesNoDialog(f'max(Y) of the first spectrum is greater than {self.minYLimit}, \ + while the "Auto T->A" box is not checked. \nPlease make sure data format is in absorbance.\ + \nDo you want to perform "Auto T->A" conversion?') + userChoice = userMsg.choice() + if userChoice == QMessageBox.Yes: + self.T2AConvert.setChecked(True) + self.irMap.imageCube = -np.log10(self.irMap.imageCube / 100 + self.epsilon) + self.irMap.data = -np.log10(self.irMap.data / 100 + self.epsilon) + self.infoBox.setText(f'User chooses to perform T->A conversion in {self.fileName}.') + else: + self.infoBox.setText(f'User chooses not to perform T->A conversion in {self.fileName}.') + elif maxSpecY >= self.minYLimit: self.irMap.imageCube = -np.log10(self.irMap.imageCube / 100 + self.epsilon) self.irMap.data = -np.log10(self.irMap.data / 100 + self.epsilon) - self.infoBox.setText(f'User chooses to perform T->A conversion in {self.fileName}.') + self.infoBox.setText(f'T->A conversion is performed in {self.fileName}.') else: - self.infoBox.setText(f'User chooses not to perform T->A conversion in {self.fileName}.') - elif maxSpecY >= self.minYLimit: - self.irMap.imageCube = -np.log10(self.irMap.imageCube / 100 + self.epsilon) - self.irMap.data = -np.log10(self.irMap.data / 100 + self.epsilon) - self.infoBox.setText(f'T->A conversion is performed in {self.fileName}.') - else: - self.infoBox.setText(f"{self.fileName}'s datatype is absorbance. \nT->A conversion is not performed.") + self.infoBox.setText(f"{self.fileName}'s datatype is absorbance. \nT->A conversion is not performed.") self.dataCube = np.moveaxis(np.flipud(self.irMap.imageCube), -1, 0) # set up required data/properties in self.imageview From 005814d67a985429f57d0126ef4a8614676549ed Mon Sep 17 00:00:00 2001 From: lchen23 Date: Tue, 10 Sep 2019 22:24:47 -0700 Subject: [PATCH 08/56] fix open npy bug --- xicam/BSISB/widgets/mapconvertwidget.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xicam/BSISB/widgets/mapconvertwidget.py b/xicam/BSISB/widgets/mapconvertwidget.py index f41ba91..1a3a94d 100644 --- a/xicam/BSISB/widgets/mapconvertwidget.py +++ b/xicam/BSISB/widgets/mapconvertwidget.py @@ -81,8 +81,9 @@ def __init__(self): def openNpy(self): self.fileFormat = 'npy' - self.T2AConvert.setChecked(True) + self.T2AConvert.setChecked(False) self.openBtnClicked() + self.fileFormat = 'map' def openBtnClicked(self): # open omnic map file @@ -90,6 +91,7 @@ def openBtnClicked(self): self.filePath, self.fileName, canceled = uiGetFile('Open map file', self.path, "Omnic Map Files (*.map)") elif self.fileFormat == 'npy': self.filePath, self.fileName, canceled = uiGetFile('Open npy file', self.path, "Numpy array Files (*.npy)") + if canceled: self.infoBox.setText('Open file canceled.') return From f21d5aa6ae24743b57d52f6fbb3d2e68b7be3543 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Fri, 13 Sep 2019 16:55:51 -0700 Subject: [PATCH 09/56] fix bugs in mapconvert and spectraview --- xicam/BSISB/widgets/mapconvertwidget.py | 3 ++- xicam/BSISB/widgets/spectraplotwidget.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/xicam/BSISB/widgets/mapconvertwidget.py b/xicam/BSISB/widgets/mapconvertwidget.py index 1a3a94d..5b10d24 100644 --- a/xicam/BSISB/widgets/mapconvertwidget.py +++ b/xicam/BSISB/widgets/mapconvertwidget.py @@ -8,7 +8,8 @@ from xicam.BSISB.widgets.mapviewwidget import MapViewWidget from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget from lbl_ir.data_objects import ir_map -from lbl_ir.io_tools.read_omnic import read_and_convert, read_npy +from lbl_ir.io_tools.read_omnic import read_and_convert +from lbl_ir.io_tools.read_numpy import read_npy class mapToH5(QSplitter): def __init__(self): diff --git a/xicam/BSISB/widgets/spectraplotwidget.py b/xicam/BSISB/widgets/spectraplotwidget.py index 0cac753..cdb0fbf 100644 --- a/xicam/BSISB/widgets/spectraplotwidget.py +++ b/xicam/BSISB/widgets/spectraplotwidget.py @@ -69,7 +69,7 @@ def setHeader(self, header: NonDBHeader, field: str, *args, **kwargs): self._data = data def showSpectra(self, i=0): - if self._data is not None: + if (self._data is not None) and (i < len(self._data)): self.clear() self._meanSpec = False self.spectrumInd = i From b7449d8203c107e3ae938a975bb5bea9fecbb101 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Fri, 13 Sep 2019 16:57:55 -0700 Subject: [PATCH 10/56] implement ROI for sparse image --- xicam/BSISB/__init__.py | 44 +++++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index 9e6ec88..af52f2c 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -11,8 +11,9 @@ from xicam.core.data import NonDBHeader from xicam.BSISB.widgets.uiwidget import MsgBox, uiSaveFile, uiGetFile from xicam.BSISB.widgets.mapconvertwidget import mapToH5 +from xicam.BSISB.widgets.xasimagewidget import xasImageView from xicam.BSISB.widgets.mapviewwidget import MapViewWidget -from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget +from xicam.BSISB.widgets.xasimagewidget import xasSpectraWidget from xicam.BSISB.widgets.factorizationwidget import FactorizationWidget from xicam.plugins import GUIPlugin, GUILayout from xicam.gui.widgets.tabview import TabView @@ -28,7 +29,7 @@ def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): # layout set up self.setOrientation(Qt.Vertical) self.imageview = MapViewWidget() - self.spectra = SpectraPlotWidget() + self.spectra = xasSpectraWidget() self.imageview_and_toolbar = QSplitter() self.imageview_and_toolbar.setOrientation(Qt.Horizontal) @@ -164,13 +165,22 @@ def roiMove(self, roi): roiState = roi.getState() self.roi.setState(roiState) - def getImgShape(self, imgShape): + def getImgShape(self, imgShape, rc2ind): self.row, self.col = imgShape[0], imgShape[1] + self.rc2ind = rc2ind + # determine whether spectra data is sparse + if len(rc2ind) == self.row * self.col: + self.isDenseImage = True + else: + self.isDenseImage = False #set up X,Y grid x = np.linspace(0, self.col - 1, self.col) y = np.linspace(self.row - 1, 0, self.row) self.X, self.Y = np.meshgrid(x, y) - self.fullMap = list(zip(self.Y.ravel(), self.X.ravel())) + if self.isDenseImage: + self.fullMap = list(zip(self.Y.ravel(), self.X.ravel())) + else: + self.fullMap = list(rc2ind.keys()) # setup automask item self.autoMask = np.ones((self.row, self.col)) self.autoMaskItem = pg.ImageItem(self.autoMask, axisOrder="row-major", autoLevels=True, opacity=0.3) @@ -237,8 +247,15 @@ def intersectSelection(self, selector, selectedPixels): self.pixSelection['ROI'] = list(reverseROI) if (self.pixSelection['ROI'] is None) and (self.pixSelection['Mask'] is None): - self.sigRoiPixels.emit(None) # no ROI, select all pixels - self.selectMask = np.ones((self.row, self.col)) + if self.isDenseImage: + self.sigRoiPixels.emit(None) # no ROI, select all pixels + self.selectMask = np.ones((self.row, self.col)) + else: + allSelected = np.array(list(self.rc2ind.keys()), dtype='int') + self.sigRoiPixels.emit(allSelected) # no ROI, select all sparse rc2ind + self.selectMask = np.zeros((self.row, self.col)) + self.selectMask[allSelected[:, 0], allSelected[:, 1]] = 1 + self.selectMask = np.flipud(self.selectMask) return elif self.pixSelection['ROI'] is None: allSelected = set(self.pixSelection['Mask']) #de-duplication of pixels @@ -247,7 +264,12 @@ def intersectSelection(self, selector, selectedPixels): else: allSelected = set(self.pixSelection['ROI']) & set(self.pixSelection['Mask']) - allSelected = np.array(list(allSelected), dtype='int') # convert to array + if self.isDenseImage: + allSelected = np.array(list(allSelected), dtype='int') # convert to array + else: + allSelected &= set(self.rc2ind.keys()) + allSelected = np.array(list(allSelected), dtype='int') + self.selectMask = np.zeros((self.row, self.col)) if len(allSelected) > 0: self.selectMask[allSelected[:, 0], allSelected[:, 1]] = 1 @@ -265,6 +287,7 @@ class BSISB(GUIPlugin): def __init__(self, *args, **kwargs): + self.xas = xasImageView() self.mapToH5 = mapToH5() # Data model self.headermodel = QStandardItemModel() @@ -281,8 +304,8 @@ def __init__(self, *args, **kwargs): self.imageview = TabView(self.headermodel, self.selectionmodel, MapView, 'image') self.imageview.currentChanged.connect(self.updateTab) - self.stages = {"MapToH5": GUILayout(self.mapToH5), - "Image View": GUILayout(self.imageview), + self.stages = {'Xas View': GUILayout(self.xas), + "ROI View": GUILayout(self.imageview), "Factor Analysis": GUILayout(self.FA_widget)} # "NMF": GUILayout(self.NMF_widget)} super(BSISB, self).__init__(*args, **kwargs) @@ -302,11 +325,12 @@ def appendHeader(self, header: NonDBHeader, **kwargs): # read out image shape imageEvent = next(header.events(fields=['image'])) imgShape = imageEvent['imgShape'] + rc2ind = imageEvent['rc_index'] # get current MapView widget currentMapView = self.imageview.currentWidget() # transmit imgshape to currentMapView - currentMapView.getImgShape(imgShape) + currentMapView.getImgShape(imgShape, rc2ind) # get xy coordinates of ROI selected pixels currentMapView.sigRoiPixels.connect(partial(self.appendSelection, 'pixel')) currentMapView.sigRoiState.connect(partial(self.appendSelection, 'ROI')) From 6caff125e80ac353eace906e3e4efe805c6a9f51 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Fri, 13 Sep 2019 17:06:55 -0700 Subject: [PATCH 11/56] change back from XAS view to maptoH5 --- xicam/BSISB/__init__.py | 10 ++++------ .../spectraplotwidget.cpython-37.pyc | Bin 4705 -> 4724 bytes 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index af52f2c..068d08d 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -11,9 +11,8 @@ from xicam.core.data import NonDBHeader from xicam.BSISB.widgets.uiwidget import MsgBox, uiSaveFile, uiGetFile from xicam.BSISB.widgets.mapconvertwidget import mapToH5 -from xicam.BSISB.widgets.xasimagewidget import xasImageView from xicam.BSISB.widgets.mapviewwidget import MapViewWidget -from xicam.BSISB.widgets.xasimagewidget import xasSpectraWidget +from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget from xicam.BSISB.widgets.factorizationwidget import FactorizationWidget from xicam.plugins import GUIPlugin, GUILayout from xicam.gui.widgets.tabview import TabView @@ -29,7 +28,7 @@ def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): # layout set up self.setOrientation(Qt.Vertical) self.imageview = MapViewWidget() - self.spectra = xasSpectraWidget() + self.spectra = SpectraPlotWidget() self.imageview_and_toolbar = QSplitter() self.imageview_and_toolbar.setOrientation(Qt.Horizontal) @@ -287,7 +286,6 @@ class BSISB(GUIPlugin): def __init__(self, *args, **kwargs): - self.xas = xasImageView() self.mapToH5 = mapToH5() # Data model self.headermodel = QStandardItemModel() @@ -304,8 +302,8 @@ def __init__(self, *args, **kwargs): self.imageview = TabView(self.headermodel, self.selectionmodel, MapView, 'image') self.imageview.currentChanged.connect(self.updateTab) - self.stages = {'Xas View': GUILayout(self.xas), - "ROI View": GUILayout(self.imageview), + self.stages = {'MapToH5': GUILayout(self.mapToH5), + "Image View": GUILayout(self.imageview), "Factor Analysis": GUILayout(self.FA_widget)} # "NMF": GUILayout(self.NMF_widget)} super(BSISB, self).__init__(*args, **kwargs) diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc index cbbf303fc545a93b69c7a8a16314263a06b9f2e4..b3b813dc0124e8f32093bd047ae7307b20bfe9f2 100644 GIT binary patch delta 103 zcmaE;@W5r ug$#@gDL}D!<{A*m0u*Bfs$iRZpHq~By+|CWy~t_ucg_GtiOn8dk{kdxHyI-U delta 100 zcmeyO@=%4>iIU|h(+$dJNV!w}C@ u10tD$Vk|%vtRPi2jFJosnSk;P!3>&Aer}p Date: Sat, 14 Sep 2019 21:41:05 -0700 Subject: [PATCH 12/56] add 3 initial params to make spectraplot more customizable --- .../spectraplotwidget.cpython-37.pyc | Bin 4724 -> 5201 bytes xicam/BSISB/widgets/spectraplotwidget.py | 23 ++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc index b3b813dc0124e8f32093bd047ae7307b20bfe9f2..5ce648b3c3dea68f7a2ea2d3553edee7545442e4 100644 GIT binary patch delta 1907 zcmZ8iO>7%Q6rNe{+UuY7UrgGRHeHDVbs+trrHG`Zv}&Odr8Oifm8;flJ>$gf`bRUH zzp|Aj8dQN)B(xGI4$cvALg9kMfg2n_;=&xbq8va7aVESsag*Y)=G*sX-pqXS&71K* zhkibsJ?}Uv0%iL9`!^r%`7HZy&qNoBd>??5DrKZ<@EA8A(5l5s4@rYElUZxYYMjMc zVvST2+~!GUe_^mBORbsJ6nlzgn6pN!X_jR_cLbYHpU4M^$0A z%j<#gDt;$;ugQAzJlOoiAmn!>LC8;M=jx9s#lg3s=Ag>I00I)wkUTK%7@-+jpHfN~ z__bJQFypQz4#PKgm&#*-$$s3gQn4d=om>W)|4VAjK>ee?-F`sii}5C*9Am z#5zo!jD;6UNYG$aSygIHqwQqac{$S(K2JJ1FPe%o92 zSgYRQjYhNHdfa+eo4 zuoSqr?Kb!Nq_@(PJB+Rf(1L6t+?%ZU+>_juD8?>Dcggb?xqF)j%bd5}W3Ja`?(rjY zWvUXb&XRZA=Vfzq3uX|QR>ILU{s?9{CUVhN#?187%94v+E(G2bW!GvbO|7P^8uJ2A zWzR_od_lg8LUe>mKe2jLjQzSVu1v}OMl~_eUhKz(UI2*xj@>Pdf#E=v696Ppq;a}; zqh&H<{}J$&r8gjwV2g2tg9tB1f5Z?Y|nYxW~9S9oQLTfhdh3)f!nt8C~s6>SbrmzE2i z<-sd)HL9d;oS1~6gLr}V@Q4E3h*|E#yTVzexx#&UZR5Ap=k$!$u7V@Zsu-Nsv(A;Nm#Hr}(%&4P};2rR_+`nWd-2cn1a>({=?zIPutI@b~ zJ(q?N_ruc<4VUBi2Cx delta 1398 zcmZ8hOK%)S5bmDonVp%P*_R(-c{+{-9)lAe5h3J&FyRpr9D|X7L17uT+ne2t*Q=h1 zajZoavZW}Nf`mpwIdE7XIXjo|3%J55YWWXXLL5*eBo07Tdy^2)s=ltSuIhSp)&4qt zZ>lsG1RjBJf4YCEGxmMypA8eY@TFe>2oh0FB14#hZPLiPPL?RA+}Ls=o12_%k*FXX z;d1LogWJ5Y#UhVaxy!vR8Wnkw`=H_TfR|tmc$rsVEnO#!MCC;i)>L(|Cz_dz7m}6i zlQwUOjjTzve?l-42dE5`{sxedjP}W<(J}h8Z+u57;iOL*X2v#gwe-&BpwlR14#s&C zdACnG?!e>b4p?Zu$k~0q;|~ImmG191hJx~eU{FB=HoeGN2f zgAwli&!RTuM|a3zj8oik3v|bIh(|O&#tD?5IR9}-RbhE$HU26QA)DO)7c!MT0v2Nb z7l8J*G2Dix^z#vRj@I)_?CJa#yIU|7OGUDjZ(CO?rOyHoTHAGPZaf(RudLNL zxhkX!ysRTUj__Q5!+EB93>6Bg$j-)D9NKawzvIk~9!CWYCy+Y|FuD7;6HsvOcysmF zQF;bIv94Illr2_8H%nzbZ+h>{AAy6gAZJkNfu?*Ow=V!hetPioZ=;c796TR5d*D&I z5Yc-g=0cv#|MGsifLF>n0A)235zAo;C}2HkAe~oeXrGF<4_{YIFRy$(?6-IG-;1BW zG7Y9feTn>Gi)u?`iz0yz6?~z+CX#f1cisPieyMAB9xb$)j>+iul(jD8N-E#NkSrN@ zTS8gc)m|c`j{PiJyo85rS;SrCY4t|Zz9J6ZE#IE%8=LeSw{Jkhm7qEOK^Z5p?~alkLr(x3RPuV|DH`mas@$L( z?LCW-){_4Icq6PT2djB56U!0;!Eb&1 z@PA2m9P`NcYG*nVcqLAUZexiRQ)Ze;`98|#5wL>tGXzXp1&u~CiPN+xlBCgi7(+= 0) and (txtPosRatio <= 1), 'Please set txtPosRatio value between 0 and 1.' + self.txtPosRatio = txtPosRatio self.positionmap = dict() self.wavenumbers = None - self._meanSpec = True # whether current spectrum is a mean spectrum + self._meanSpec = True # whether current spectrum is a mean spectrum self.line = InfiniteLine(movable=True) self.line.setPen((255, 255, 0, 200)) - self.line.setValue(650) + self.line.setValue(linePos) self.line.sigPositionChanged.connect(self.sigEnergyChanged) self.line.sigPositionChanged.connect(self.getEnergy) self.addItem(self.line) - self.cross = PlotDataItem([650], [0], symbolBrush=(255, 0, 0), symbolPen=(255, 0, 0), symbol='+', + self.cross = PlotDataItem([linePos], [0], symbolBrush=(255, 0, 0), symbolPen=(255, 0, 0), symbol='+', symbolSize=20) self.cross.setZValue(100) self.addItem(self.cross) - self.getViewBox().invertX(True) + self.getViewBox().invertX(invertX) self.spectrumInd = 0 self.selectedPixels = None self._y = None @@ -124,8 +132,9 @@ def plot(self, x, y, *args, **kwargs): txt_html += f'
\ X = {x_val: .2f}, Y = {y_val: .4f}
' self.txt = TextItem(html=txt_html, anchor=(0, 0)) - ymax = max(y) + ymax = np.max(y) self._y = y - self.txt.setPos(1500, 0.95 * ymax) + r = self.txtPosRatio + self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) self.cross.setData([x_val], [y_val]) self.addItem(self.txt) From 1e3c4c21420d9284e0828e5b56d3296de8060678 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sun, 15 Sep 2019 21:41:44 -0700 Subject: [PATCH 13/56] add a splitter to spectraplot panel, make markselect control all mask --- xicam/BSISB/__init__.py | 31 +++++++++++++++++++--- xicam/BSISB/widgets/factorizationwidget.py | 8 +++--- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index 068d08d..fc66833 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -9,6 +9,7 @@ import numpy as np from xicam.core import msg from xicam.core.data import NonDBHeader +from xicam.gui.widgets.imageviewmixins import BetterButtons from xicam.BSISB.widgets.uiwidget import MsgBox, uiSaveFile, uiGetFile from xicam.BSISB.widgets.mapconvertwidget import mapToH5 from xicam.BSISB.widgets.mapviewwidget import MapViewWidget @@ -24,11 +25,20 @@ class MapView(QSplitter): sigSelectMaskState = Signal(object) def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): + """ + A widget to display imageCube like dataset with ROI buttons + :param header: Xi-cam datahandler header + :param field: header's field param + """ super(MapView, self).__init__() # layout set up self.setOrientation(Qt.Vertical) self.imageview = MapViewWidget() self.spectra = SpectraPlotWidget() + self.spectraSplitter = QSplitter() + self.spectraSplitter.addWidget(self.spectra) + # self.spectraSplitter.insertWidget(1, BetterButtons()) # add a 2D spectrum window + # self.spectra.getViewBox().setXRange(0, 4000) # set xrange self.imageview_and_toolbar = QSplitter() self.imageview_and_toolbar.setOrientation(Qt.Horizontal) @@ -86,7 +96,7 @@ def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): self.imageview_and_toolbar.addWidget(self.imageview) self.imageview_and_toolbar.setSizes([1, 1000])#adjust initial splitter size self.addWidget(self.imageview_and_toolbar) - self.addWidget(self.spectra) + self.addWidget(self.spectraSplitter) self.setSizes([1000, 1000]) # adjust initial splitter size # readin header @@ -153,7 +163,7 @@ def loadRoi(self): self.roi.show() self.autoMaskBtn.setChecked(roiStates['maskBtn']) self.selectMaskBtn.setChecked(True) - self.showSelectMask() + self.showSelectMask(True) for k, v in roiStates['parameter'].items(): self.parameter[k] = v MsgBox(f'ROI states were loaded from: \n{filePath + fileName}') @@ -208,8 +218,15 @@ def roiSelectPixel(self): self.intersectSelection('ROI', None) # no ROI, select all pixels self.sigRoiState.emit((False, self.roi.getState())) - def showSelectMask(self): + def showSelectMask(self, signalReceived): if self.selectMaskBtn.isChecked(): + # show roi and autoMask + if self.roiBtn.isChecked(): + self.roi.show() + self.sigRoiState.emit((True, self.roi.getState())) + if self.autoMaskBtn.isChecked(): + self.autoMaskItem.show() + self.sigAutoMaskState.emit((True, self.autoMask)) # update and show mask self.selectMaskItem.setImage(self.selectMask) self.selectMaskItem.show() @@ -217,6 +234,12 @@ def showSelectMask(self): else: self.selectMaskItem.hide() self.sigSelectMaskState.emit((False, self.selectMask)) + if signalReceived == False: + self.roi.hide() + self.autoMaskItem.hide() + self.sigRoiState.emit((False, self.roi.getState())) + self.sigAutoMaskState.emit((False, self.autoMask)) + def showAutoMask(self): if self.autoMaskBtn.isChecked(): @@ -275,7 +298,7 @@ def intersectSelection(self, selector, selectedPixels): self.selectMask = np.flipud(self.selectMask) self.sigRoiPixels.emit(allSelected) # show SelectMask - self.showSelectMask() + self.showSelectMask(selector) #recover ROI selection if (self.parameter['ROI type'] == '-') and (self.pixSelection['ROI'] is not None): self.pixSelection['ROI'] = roi_copy diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index dfc0d06..2f0f21e 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -475,17 +475,15 @@ def updateRoiMask(self): self.roiList[i].blockSignals(True) self.roiList[i].setState(roiState[1]) self.roiList[i].blockSignals(False) - except Exception: for i in range(4): self.roiList[i].hide() - # self.roiList[i].setState(self.roiInitState) - # update mask + # update automask try: maskState = self.headermodel.item(self.selectMapIdx).maskState for i in range(4): self.maskList[i].setImage(maskState[1]) - if maskState[0]: # roi on + if maskState[0]: # automask on self.maskList[i].show() else: self.maskList[i].hide() @@ -496,7 +494,7 @@ def updateRoiMask(self): selectMaskState = self.headermodel.item(self.selectMapIdx).selectState for i in range(4): self.selectMaskList[i].setImage(selectMaskState[1]) - if selectMaskState[0]: # roi on + if selectMaskState[0]: # selectmask on self.selectMaskList[i].show() else: self.selectMaskList[i].hide() From c2275d73a047183e064b7b35bd76e99ce6ced5ac Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sun, 15 Sep 2019 22:00:43 -0700 Subject: [PATCH 14/56] make spectramaproi widget --- xicam/BSISB/widgets/spectramaproiwidget.py | 298 +++++++++++++++++++++ 1 file changed, 298 insertions(+) create mode 100644 xicam/BSISB/widgets/spectramaproiwidget.py diff --git a/xicam/BSISB/widgets/spectramaproiwidget.py b/xicam/BSISB/widgets/spectramaproiwidget.py new file mode 100644 index 0000000..74cc46e --- /dev/null +++ b/xicam/BSISB/widgets/spectramaproiwidget.py @@ -0,0 +1,298 @@ +import os +from qtpy.QtCore import * +from qtpy.QtGui import * +from qtpy.QtWidgets import * +import pickle +import pyqtgraph as pg +from pyqtgraph.parametertree import ParameterTree, Parameter +import numpy as np +from xicam.core.data import NonDBHeader +from xicam.gui.widgets.imageviewmixins import BetterButtons +from xicam.BSISB.widgets.uiwidget import MsgBox, uiSaveFile, uiGetFile +from xicam.BSISB.widgets.mapviewwidget import MapViewWidget +from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget + +class MapView(QSplitter): + sigRoiPixels = Signal(object) + sigRoiState = Signal(object) + sigAutoMaskState = Signal(object) + sigSelectMaskState = Signal(object) + + def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): + """ + A widget to display imageCube like dataset with ROI buttons + :param header: Xi-cam datahandler header + :param field: header's field param + """ + super(MapView, self).__init__() + # layout set up + self.setOrientation(Qt.Vertical) + self.imageview = MapViewWidget() + self.spectra = SpectraPlotWidget() + self.spectraSplitter = QSplitter() + self.spectraSplitter.addWidget(self.spectra) + # self.spectraSplitter.insertWidget(1, BetterButtons()) # add a 2D spectrum window + # self.spectra.getViewBox().setXRange(0, 4000) # set xrange + + self.imageview_and_toolbar = QSplitter() + self.imageview_and_toolbar.setOrientation(Qt.Horizontal) + self.toolbar_and_param = QSplitter() + self.toolbar_and_param.setOrientation(Qt.Vertical) + #define tool bar + self.toolBar = QWidget() + self.gridlayout = QGridLayout() + self.toolBar.setLayout(self.gridlayout) + #add tool bar buttons + self.roiBtn = QToolButton() + self.roiBtn.setText('Manual ROI') + self.roiBtn.setCheckable(True) + self.roiMeanBtn = QToolButton() + self.roiMeanBtn.setText('ROI Mean') + self.autoMaskBtn = QToolButton() + self.autoMaskBtn.setText('Auto ROI') + self.autoMaskBtn.setCheckable(True) + self.selectMaskBtn = QToolButton() + self.selectMaskBtn.setText('Mark Select') + self.selectMaskBtn.setCheckable(True) + self.saveRoiBtn = QToolButton() + self.saveRoiBtn.setText('Save ROI') + self.saveRoiBtn.setCheckable(False) + self.loadRoiBtn = QToolButton() + self.loadRoiBtn.setText('Load ROI') + self.loadRoiBtn.setCheckable(False) + self.gridlayout.addWidget(self.roiBtn, 0, 0, 1, 1) + self.gridlayout.addWidget(self.autoMaskBtn, 0, 1, 1, 1) + self.gridlayout.addWidget(self.selectMaskBtn, 1, 0, 1, 1) + self.gridlayout.addWidget(self.roiMeanBtn, 1, 1, 1, 1) + self.gridlayout.addWidget(self.saveRoiBtn, 2, 0, 1, 1) + self.gridlayout.addWidget(self.loadRoiBtn, 2, 1, 1, 1) + + self.parameterTree = ParameterTree() + self.parameter = Parameter(name='Threshhold', type='group', + children=[{'name': 'Amide II', + 'value': 0, + 'type': 'float'}, + {'name': "ROI type", + 'values': ['+', '-'], + 'value': '+', + 'type': 'list'}, + ]) + self.parameter.child('Amide II').setOpts(step=0.1) + self.parameterTree.setParameters(self.parameter, showTop=False) + self.parameterTree.setHeaderLabels(['Params','Value']) + self.parameterTree.setIndentation(0) + + # Assemble widgets + self.toolbar_and_param.addWidget(self.toolBar) + self.toolbar_and_param.addWidget(self.parameterTree) + self.toolbar_and_param.setSizes([1000, 1]) #adjust initial splitter size + self.imageview_and_toolbar.addWidget(self.toolbar_and_param) + self.imageview_and_toolbar.addWidget(self.imageview) + self.imageview_and_toolbar.setSizes([1, 1000])#adjust initial splitter size + self.addWidget(self.imageview_and_toolbar) + self.addWidget(self.spectraSplitter) + self.setSizes([1000, 1000]) # adjust initial splitter size + + # readin header + self.imageview.setHeader(header, field='image') + self.spectra.setHeader(header, field='spectra') + self.header = header + + #setup ROI item + sideLen = 10 + self.roi = pg.PolyLineROI(positions=[[0, 0], [sideLen, 0], [sideLen, sideLen], [0, sideLen]], closed=True) + self.imageview.view.addItem(self.roi) + self.roiInitState = self.roi.getState() + self.roi.hide() + + #constants + self.path = os.path.expanduser('~/') + self.pixSelection = {'ROI': None, 'Mask': None} # init pixel selection dict + + # Connect signals + self.imageview.sigShowSpectra.connect(self.spectra.showSpectra) + self.spectra.sigEnergyChanged.connect(self.imageview.setEnergy) + self.roiBtn.clicked.connect(self.roiBtnClicked) + self.roi.sigRegionChangeFinished.connect(self.roiSelectPixel) + self.roi.sigRegionChangeFinished.connect(self.showSelectMask) + self.sigRoiPixels.connect(self.spectra.getSelectedPixels) + self.roiMeanBtn.clicked.connect(self.spectra.showMeanSpectra) + self.autoMaskBtn.clicked.connect(self.showAutoMask) + self.selectMaskBtn.clicked.connect(self.showSelectMask) + self.saveRoiBtn.clicked.connect(self.saveRoi) + self.loadRoiBtn.clicked.connect(self.loadRoi) + self.parameter.child('Amide II').sigValueChanged.connect(self.showAutoMask) + self.parameter.child('Amide II').sigValueChanged.connect(self.intersectSelection) + self.parameter.child('ROI type').sigValueChanged.connect(self.intersectSelection) + + def roiBtnClicked(self): + self.roiSelectPixel() + if self.roiBtn.isChecked(): + self.imageview.cross.hide() + self.roi.show() + self.sigRoiState.emit((True, self.roi.getState())) + else: + self.roi.hide() + self.roi.setState(self.roiInitState) + self.sigRoiState.emit((False, self.roi.getState())) + + def saveRoi(self): + parameterDict = {name: self.parameter[name] for name in self.parameter.names.keys()} + roiStates = {'roiBtn': self.roiBtn.isChecked(), 'maskBtn': self.autoMaskBtn.isChecked(), + 'roiState': self.roi.getState(), 'parameter': parameterDict} + filePath, fileName, canceled = uiSaveFile('Save ROI state', self.path, "Pickle Files (*.pkl)") + if not canceled: + with open(filePath + fileName, 'wb') as f: + pickle.dump(roiStates, f) + MsgBox(f'ROI state file was saved! \nFile Location: {filePath + fileName}') + + def loadRoi(self): + filePath, fileName, canceled = uiGetFile('Open ROI state file', self.path, "Pickle Files (*.pkl)") + if not canceled: + with open(filePath + fileName, 'rb') as f: + roiStates = pickle.load(f) + self.roiBtn.setChecked(roiStates['roiBtn']) + self.roi.setState(roiStates['roiState']) + if roiStates['roiBtn']: + self.roi.show() + self.autoMaskBtn.setChecked(roiStates['maskBtn']) + self.selectMaskBtn.setChecked(True) + self.showSelectMask(True) + for k, v in roiStates['parameter'].items(): + self.parameter[k] = v + MsgBox(f'ROI states were loaded from: \n{filePath + fileName}') + else: + return + + def roiMove(self, roi): + roiState = roi.getState() + self.roi.setState(roiState) + + def getImgShape(self, imgShape, rc2ind): + self.row, self.col = imgShape[0], imgShape[1] + self.rc2ind = rc2ind + # determine whether spectra data is sparse + if len(rc2ind) == self.row * self.col: + self.isDenseImage = True + else: + self.isDenseImage = False + #set up X,Y grid + x = np.linspace(0, self.col - 1, self.col) + y = np.linspace(self.row - 1, 0, self.row) + self.X, self.Y = np.meshgrid(x, y) + if self.isDenseImage: + self.fullMap = list(zip(self.Y.ravel(), self.X.ravel())) + else: + self.fullMap = list(rc2ind.keys()) + # setup automask item + self.autoMask = np.ones((self.row, self.col)) + self.autoMaskItem = pg.ImageItem(self.autoMask, axisOrder="row-major", autoLevels=True, opacity=0.3) + self.imageview.view.addItem(self.autoMaskItem) + self.autoMaskItem.hide() + # setup selctmask item to mark selected pixels + self.selectMask = np.ones((self.row, self.col)) + self.selectMaskItem = pg.ImageItem(self.selectMask, axisOrder="row-major", autoLevels=True, opacity=0.3, + lut = np.array([[0, 0, 0], [255, 0, 0]])) + self.imageview.view.addItem(self.selectMaskItem) + self.selectMaskItem.hide() + + def roiSelectPixel(self): + if self.roiBtn.isChecked(): + #get x,y positions list + xPos = self.roi.getArrayRegion(self.X, self.imageview.imageItem) + xPos = np.round(xPos[xPos > 0]) + yPos = self.roi.getArrayRegion(self.Y, self.imageview.imageItem) + yPos = np.round(yPos[yPos > 0]) + + # extract x,y coordinate from selected region + selectedPixels = list(zip(yPos, xPos)) + self.intersectSelection('ROI', selectedPixels) + self.sigRoiState.emit((True, self.roi.getState())) + else: + self.intersectSelection('ROI', None) # no ROI, select all pixels + self.sigRoiState.emit((False, self.roi.getState())) + + def showSelectMask(self, signalReceived): + if self.selectMaskBtn.isChecked(): + # show roi and autoMask + if self.roiBtn.isChecked(): + self.roi.show() + self.sigRoiState.emit((True, self.roi.getState())) + if self.autoMaskBtn.isChecked(): + self.autoMaskItem.show() + self.sigAutoMaskState.emit((True, self.autoMask)) + # update and show mask + self.selectMaskItem.setImage(self.selectMask) + self.selectMaskItem.show() + self.sigSelectMaskState.emit((True, self.selectMask)) + else: + self.selectMaskItem.hide() + self.sigSelectMaskState.emit((False, self.selectMask)) + if signalReceived == False: + self.roi.hide() + self.autoMaskItem.hide() + self.sigRoiState.emit((False, self.roi.getState())) + self.sigAutoMaskState.emit((False, self.autoMask)) + + + def showAutoMask(self): + if self.autoMaskBtn.isChecked(): + # update and show mask + self.autoMask = self.imageview.makeMask([self.parameter['Amide II']]) + self.autoMaskItem.setImage(self.autoMask) + self.autoMaskItem.show() + # select pixels + mask = self.autoMask.astype(np.bool) + selectedPixels = list(zip(self.Y[mask], self.X[mask])) + self.intersectSelection('Mask', selectedPixels) + self.sigAutoMaskState.emit((True, self.autoMask)) + else: + self.autoMaskItem.hide() + self.autoMask[:, :] = 1 + self.intersectSelection('Mask', None) # no mask, select all pixels + self.sigAutoMaskState.emit((False, self.autoMask)) + + def intersectSelection(self, selector, selectedPixels): + # update pixel selection dict + if (selector == 'ROI') or (selector == 'Mask'): + self.pixSelection[selector] = selectedPixels + # reverse ROI selection + if (self.parameter['ROI type'] == '-') and (self.pixSelection['ROI'] is not None): + roi_copy = self.pixSelection['ROI'] + reverseROI = set(self.fullMap) - set(self.pixSelection['ROI']) + self.pixSelection['ROI'] = list(reverseROI) + + if (self.pixSelection['ROI'] is None) and (self.pixSelection['Mask'] is None): + if self.isDenseImage: + self.sigRoiPixels.emit(None) # no ROI, select all pixels + self.selectMask = np.ones((self.row, self.col)) + else: + allSelected = np.array(list(self.rc2ind.keys()), dtype='int') + self.sigRoiPixels.emit(allSelected) # no ROI, select all sparse rc2ind + self.selectMask = np.zeros((self.row, self.col)) + self.selectMask[allSelected[:, 0], allSelected[:, 1]] = 1 + self.selectMask = np.flipud(self.selectMask) + return + elif self.pixSelection['ROI'] is None: + allSelected = set(self.pixSelection['Mask']) #de-duplication of pixels + elif self.pixSelection['Mask'] is None: + allSelected = set(self.pixSelection['ROI']) #de-duplication of pixels + else: + allSelected = set(self.pixSelection['ROI']) & set(self.pixSelection['Mask']) + + if self.isDenseImage: + allSelected = np.array(list(allSelected), dtype='int') # convert to array + else: + allSelected &= set(self.rc2ind.keys()) + allSelected = np.array(list(allSelected), dtype='int') + + self.selectMask = np.zeros((self.row, self.col)) + if len(allSelected) > 0: + self.selectMask[allSelected[:, 0], allSelected[:, 1]] = 1 + self.selectMask = np.flipud(self.selectMask) + self.sigRoiPixels.emit(allSelected) + # show SelectMask + self.showSelectMask(selector) + #recover ROI selection + if (self.parameter['ROI type'] == '-') and (self.pixSelection['ROI'] is not None): + self.pixSelection['ROI'] = roi_copy \ No newline at end of file From cb5d497f2ead86a8be374c97a2efeb5d20723efb Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sun, 15 Sep 2019 22:14:05 -0700 Subject: [PATCH 15/56] pull out spectramaproi widget, reformat init file --- xicam/BSISB/__init__.py | 294 +--------------------------------------- 1 file changed, 1 insertion(+), 293 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index fc66833..e38e94a 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -1,308 +1,16 @@ -import os from functools import partial from qtpy.QtCore import * from qtpy.QtGui import * -from qtpy.QtWidgets import * -import pickle -import pyqtgraph as pg -from pyqtgraph.parametertree import ParameterTree, Parameter -import numpy as np from xicam.core import msg from xicam.core.data import NonDBHeader -from xicam.gui.widgets.imageviewmixins import BetterButtons -from xicam.BSISB.widgets.uiwidget import MsgBox, uiSaveFile, uiGetFile from xicam.BSISB.widgets.mapconvertwidget import mapToH5 from xicam.BSISB.widgets.mapviewwidget import MapViewWidget +from xicam.BSISB.widgets.spectramaproiwidget import MapView from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget from xicam.BSISB.widgets.factorizationwidget import FactorizationWidget from xicam.plugins import GUIPlugin, GUILayout from xicam.gui.widgets.tabview import TabView -class MapView(QSplitter): - sigRoiPixels = Signal(object) - sigRoiState = Signal(object) - sigAutoMaskState = Signal(object) - sigSelectMaskState = Signal(object) - - def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): - """ - A widget to display imageCube like dataset with ROI buttons - :param header: Xi-cam datahandler header - :param field: header's field param - """ - super(MapView, self).__init__() - # layout set up - self.setOrientation(Qt.Vertical) - self.imageview = MapViewWidget() - self.spectra = SpectraPlotWidget() - self.spectraSplitter = QSplitter() - self.spectraSplitter.addWidget(self.spectra) - # self.spectraSplitter.insertWidget(1, BetterButtons()) # add a 2D spectrum window - # self.spectra.getViewBox().setXRange(0, 4000) # set xrange - - self.imageview_and_toolbar = QSplitter() - self.imageview_and_toolbar.setOrientation(Qt.Horizontal) - self.toolbar_and_param = QSplitter() - self.toolbar_and_param.setOrientation(Qt.Vertical) - #define tool bar - self.toolBar = QWidget() - self.gridlayout = QGridLayout() - self.toolBar.setLayout(self.gridlayout) - #add tool bar buttons - self.roiBtn = QToolButton() - self.roiBtn.setText('Manual ROI') - self.roiBtn.setCheckable(True) - self.roiMeanBtn = QToolButton() - self.roiMeanBtn.setText('ROI Mean') - self.autoMaskBtn = QToolButton() - self.autoMaskBtn.setText('Auto ROI') - self.autoMaskBtn.setCheckable(True) - self.selectMaskBtn = QToolButton() - self.selectMaskBtn.setText('Mark Select') - self.selectMaskBtn.setCheckable(True) - self.saveRoiBtn = QToolButton() - self.saveRoiBtn.setText('Save ROI') - self.saveRoiBtn.setCheckable(False) - self.loadRoiBtn = QToolButton() - self.loadRoiBtn.setText('Load ROI') - self.loadRoiBtn.setCheckable(False) - self.gridlayout.addWidget(self.roiBtn, 0, 0, 1, 1) - self.gridlayout.addWidget(self.autoMaskBtn, 0, 1, 1, 1) - self.gridlayout.addWidget(self.selectMaskBtn, 1, 0, 1, 1) - self.gridlayout.addWidget(self.roiMeanBtn, 1, 1, 1, 1) - self.gridlayout.addWidget(self.saveRoiBtn, 2, 0, 1, 1) - self.gridlayout.addWidget(self.loadRoiBtn, 2, 1, 1, 1) - - self.parameterTree = ParameterTree() - self.parameter = Parameter(name='Threshhold', type='group', - children=[{'name': 'Amide II', - 'value': 0, - 'type': 'float'}, - {'name': "ROI type", - 'values': ['+', '-'], - 'value': '+', - 'type': 'list'}, - ]) - self.parameter.child('Amide II').setOpts(step=0.1) - self.parameterTree.setParameters(self.parameter, showTop=False) - self.parameterTree.setHeaderLabels(['Params','Value']) - self.parameterTree.setIndentation(0) - - # Assemble widgets - self.toolbar_and_param.addWidget(self.toolBar) - self.toolbar_and_param.addWidget(self.parameterTree) - self.toolbar_and_param.setSizes([1000, 1]) #adjust initial splitter size - self.imageview_and_toolbar.addWidget(self.toolbar_and_param) - self.imageview_and_toolbar.addWidget(self.imageview) - self.imageview_and_toolbar.setSizes([1, 1000])#adjust initial splitter size - self.addWidget(self.imageview_and_toolbar) - self.addWidget(self.spectraSplitter) - self.setSizes([1000, 1000]) # adjust initial splitter size - - # readin header - self.imageview.setHeader(header, field='image') - self.spectra.setHeader(header, field='spectra') - self.header = header - - #setup ROI item - sideLen = 10 - self.roi = pg.PolyLineROI(positions=[[0, 0], [sideLen, 0], [sideLen, sideLen], [0, sideLen]], closed=True) - self.imageview.view.addItem(self.roi) - self.roiInitState = self.roi.getState() - self.roi.hide() - - #constants - self.path = os.path.expanduser('~/') - self.pixSelection = {'ROI': None, 'Mask': None} # init pixel selection dict - - # Connect signals - self.imageview.sigShowSpectra.connect(self.spectra.showSpectra) - self.spectra.sigEnergyChanged.connect(self.imageview.setEnergy) - self.roiBtn.clicked.connect(self.roiBtnClicked) - self.roi.sigRegionChangeFinished.connect(self.roiSelectPixel) - self.roi.sigRegionChangeFinished.connect(self.showSelectMask) - self.sigRoiPixels.connect(self.spectra.getSelectedPixels) - self.roiMeanBtn.clicked.connect(self.spectra.showMeanSpectra) - self.autoMaskBtn.clicked.connect(self.showAutoMask) - self.selectMaskBtn.clicked.connect(self.showSelectMask) - self.saveRoiBtn.clicked.connect(self.saveRoi) - self.loadRoiBtn.clicked.connect(self.loadRoi) - self.parameter.child('Amide II').sigValueChanged.connect(self.showAutoMask) - self.parameter.child('Amide II').sigValueChanged.connect(self.intersectSelection) - self.parameter.child('ROI type').sigValueChanged.connect(self.intersectSelection) - - def roiBtnClicked(self): - self.roiSelectPixel() - if self.roiBtn.isChecked(): - self.imageview.cross.hide() - self.roi.show() - self.sigRoiState.emit((True, self.roi.getState())) - else: - self.roi.hide() - self.roi.setState(self.roiInitState) - self.sigRoiState.emit((False, self.roi.getState())) - - def saveRoi(self): - parameterDict = {name: self.parameter[name] for name in self.parameter.names.keys()} - roiStates = {'roiBtn': self.roiBtn.isChecked(), 'maskBtn': self.autoMaskBtn.isChecked(), - 'roiState': self.roi.getState(), 'parameter': parameterDict} - filePath, fileName, canceled = uiSaveFile('Save ROI state', self.path, "Pickle Files (*.pkl)") - if not canceled: - with open(filePath + fileName, 'wb') as f: - pickle.dump(roiStates, f) - MsgBox(f'ROI state file was saved! \nFile Location: {filePath + fileName}') - - def loadRoi(self): - filePath, fileName, canceled = uiGetFile('Open ROI state file', self.path, "Pickle Files (*.pkl)") - if not canceled: - with open(filePath + fileName, 'rb') as f: - roiStates = pickle.load(f) - self.roiBtn.setChecked(roiStates['roiBtn']) - self.roi.setState(roiStates['roiState']) - if roiStates['roiBtn']: - self.roi.show() - self.autoMaskBtn.setChecked(roiStates['maskBtn']) - self.selectMaskBtn.setChecked(True) - self.showSelectMask(True) - for k, v in roiStates['parameter'].items(): - self.parameter[k] = v - MsgBox(f'ROI states were loaded from: \n{filePath + fileName}') - else: - return - - def roiMove(self, roi): - roiState = roi.getState() - self.roi.setState(roiState) - - def getImgShape(self, imgShape, rc2ind): - self.row, self.col = imgShape[0], imgShape[1] - self.rc2ind = rc2ind - # determine whether spectra data is sparse - if len(rc2ind) == self.row * self.col: - self.isDenseImage = True - else: - self.isDenseImage = False - #set up X,Y grid - x = np.linspace(0, self.col - 1, self.col) - y = np.linspace(self.row - 1, 0, self.row) - self.X, self.Y = np.meshgrid(x, y) - if self.isDenseImage: - self.fullMap = list(zip(self.Y.ravel(), self.X.ravel())) - else: - self.fullMap = list(rc2ind.keys()) - # setup automask item - self.autoMask = np.ones((self.row, self.col)) - self.autoMaskItem = pg.ImageItem(self.autoMask, axisOrder="row-major", autoLevels=True, opacity=0.3) - self.imageview.view.addItem(self.autoMaskItem) - self.autoMaskItem.hide() - # setup selctmask item to mark selected pixels - self.selectMask = np.ones((self.row, self.col)) - self.selectMaskItem = pg.ImageItem(self.selectMask, axisOrder="row-major", autoLevels=True, opacity=0.3, - lut = np.array([[0, 0, 0], [255, 0, 0]])) - self.imageview.view.addItem(self.selectMaskItem) - self.selectMaskItem.hide() - - def roiSelectPixel(self): - if self.roiBtn.isChecked(): - #get x,y positions list - xPos = self.roi.getArrayRegion(self.X, self.imageview.imageItem) - xPos = np.round(xPos[xPos > 0]) - yPos = self.roi.getArrayRegion(self.Y, self.imageview.imageItem) - yPos = np.round(yPos[yPos > 0]) - - # extract x,y coordinate from selected region - selectedPixels = list(zip(yPos, xPos)) - self.intersectSelection('ROI', selectedPixels) - self.sigRoiState.emit((True, self.roi.getState())) - else: - self.intersectSelection('ROI', None) # no ROI, select all pixels - self.sigRoiState.emit((False, self.roi.getState())) - - def showSelectMask(self, signalReceived): - if self.selectMaskBtn.isChecked(): - # show roi and autoMask - if self.roiBtn.isChecked(): - self.roi.show() - self.sigRoiState.emit((True, self.roi.getState())) - if self.autoMaskBtn.isChecked(): - self.autoMaskItem.show() - self.sigAutoMaskState.emit((True, self.autoMask)) - # update and show mask - self.selectMaskItem.setImage(self.selectMask) - self.selectMaskItem.show() - self.sigSelectMaskState.emit((True, self.selectMask)) - else: - self.selectMaskItem.hide() - self.sigSelectMaskState.emit((False, self.selectMask)) - if signalReceived == False: - self.roi.hide() - self.autoMaskItem.hide() - self.sigRoiState.emit((False, self.roi.getState())) - self.sigAutoMaskState.emit((False, self.autoMask)) - - - def showAutoMask(self): - if self.autoMaskBtn.isChecked(): - # update and show mask - self.autoMask = self.imageview.makeMask([self.parameter['Amide II']]) - self.autoMaskItem.setImage(self.autoMask) - self.autoMaskItem.show() - # select pixels - mask = self.autoMask.astype(np.bool) - selectedPixels = list(zip(self.Y[mask], self.X[mask])) - self.intersectSelection('Mask', selectedPixels) - self.sigAutoMaskState.emit((True, self.autoMask)) - else: - self.autoMaskItem.hide() - self.autoMask[:, :] = 1 - self.intersectSelection('Mask', None) # no mask, select all pixels - self.sigAutoMaskState.emit((False, self.autoMask)) - - def intersectSelection(self, selector, selectedPixels): - # update pixel selection dict - if (selector == 'ROI') or (selector == 'Mask'): - self.pixSelection[selector] = selectedPixels - # reverse ROI selection - if (self.parameter['ROI type'] == '-') and (self.pixSelection['ROI'] is not None): - roi_copy = self.pixSelection['ROI'] - reverseROI = set(self.fullMap) - set(self.pixSelection['ROI']) - self.pixSelection['ROI'] = list(reverseROI) - - if (self.pixSelection['ROI'] is None) and (self.pixSelection['Mask'] is None): - if self.isDenseImage: - self.sigRoiPixels.emit(None) # no ROI, select all pixels - self.selectMask = np.ones((self.row, self.col)) - else: - allSelected = np.array(list(self.rc2ind.keys()), dtype='int') - self.sigRoiPixels.emit(allSelected) # no ROI, select all sparse rc2ind - self.selectMask = np.zeros((self.row, self.col)) - self.selectMask[allSelected[:, 0], allSelected[:, 1]] = 1 - self.selectMask = np.flipud(self.selectMask) - return - elif self.pixSelection['ROI'] is None: - allSelected = set(self.pixSelection['Mask']) #de-duplication of pixels - elif self.pixSelection['Mask'] is None: - allSelected = set(self.pixSelection['ROI']) #de-duplication of pixels - else: - allSelected = set(self.pixSelection['ROI']) & set(self.pixSelection['Mask']) - - if self.isDenseImage: - allSelected = np.array(list(allSelected), dtype='int') # convert to array - else: - allSelected &= set(self.rc2ind.keys()) - allSelected = np.array(list(allSelected), dtype='int') - - self.selectMask = np.zeros((self.row, self.col)) - if len(allSelected) > 0: - self.selectMask[allSelected[:, 0], allSelected[:, 1]] = 1 - self.selectMask = np.flipud(self.selectMask) - self.sigRoiPixels.emit(allSelected) - # show SelectMask - self.showSelectMask(selector) - #recover ROI selection - if (self.parameter['ROI type'] == '-') and (self.pixSelection['ROI'] is not None): - self.pixSelection['ROI'] = roi_copy - class BSISB(GUIPlugin): name = 'BSISB' From 9d2948227da131df6dc39df4d068a5a34ed2da14 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 23 Sep 2019 15:56:29 -0700 Subject: [PATCH 16/56] fix datahandler import --- .../__pycache__/mapfile.cpython-37.pyc | Bin 5658 -> 5658 bytes xicam/BSISB/formats/mapfile.py | 2 +- .../__pycache__/mapviewwidget.cpython-37.pyc | Bin 3769 -> 3769 bytes .../spectraplotwidget.cpython-37.pyc | Bin 5201 -> 5201 bytes 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/xicam/BSISB/formats/__pycache__/mapfile.cpython-37.pyc b/xicam/BSISB/formats/__pycache__/mapfile.cpython-37.pyc index ff5c4d838f82e4a223de1bab83de6670aebba28d..0df2008a696519093495b22b612ee78abcdebd68 100644 GIT binary patch delta 37 rcmbQGGfRitiI6yQ3JWG+$w mv0W$s<(6Xf-z>qC$|w*75(x$oU>(tudwD|{BPT!Ry#@dxW)?UA diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc index 5ce648b3c3dea68f7a2ea2d3553edee7545442e4..1219cd3dde53cbcbdfac3cd94fd10e58e261b8b9 100644 GIT binary patch delta 20 acmcbpaZ!WYiIj|B1n delta 20 acmcbpaZ!WYiIG6eDf From c6805efae1f7f61851e3221a10ab5faa32f93635 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 7 Oct 2019 10:55:30 -0700 Subject: [PATCH 17/56] add new imageview widget --- xicam/BSISB/widgets/imshowwidget.py | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 xicam/BSISB/widgets/imshowwidget.py diff --git a/xicam/BSISB/widgets/imshowwidget.py b/xicam/BSISB/widgets/imshowwidget.py new file mode 100644 index 0000000..7b8a06b --- /dev/null +++ b/xicam/BSISB/widgets/imshowwidget.py @@ -0,0 +1,33 @@ +from xicam.gui.widgets.imageviewmixins import BetterButtons +import numpy as np + + +class SlimImageView(BetterButtons): + def __init__(self, invertY=True): + super(SlimImageView, self).__init__() + # Shrink LUT + self.getHistogramWidget().setMinimumWidth(1) + # set up layout + self.ui.gridLayout.addWidget(self.resetAxesBtn, 2, 2, 1, 1) + self.ui.gridLayout.addWidget(self.resetLUTBtn, 3, 2, 1, 1) + self.ui.gridLayout.addWidget(self.ui.graphicsView, 0, 0, 4, 1) + # set up colorbar + self.setPredefinedGradient("viridis") + self.view.invertY(invertY) + self.imageItem.setOpts(axisOrder="row-major") + # Setup late signal + self.sigTimeChangeFinished = self.timeLine.sigPositionChangeFinished + + def quickMinMax(self, data): + """ + Estimate the min/max values of *data* by subsampling. MODIFIED TO USE THE 99TH PERCENTILE instead of max. + """ + if data is None: + return 0, 0 + ax = np.argmax(data.shape) + sl = [slice(None)] * data.ndim + sl[ax] = slice(None, None, max(1, int(data.size // 1e4))) + data = data[sl] + return (np.nanmin(data), np.nanpercentile(np.where(data < np.nanmax(data), data, np.nanmin(data)), 99)) + + From 61bf38fbfa30bf06a652cf79419893e03dcfba7a Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 7 Oct 2019 11:40:49 -0700 Subject: [PATCH 18/56] add slim window widget and toHtml func --- .../__pycache__/mapfile.cpython-37.pyc | Bin 5658 -> 5658 bytes .../__pycache__/mapviewwidget.cpython-37.pyc | Bin 3769 -> 3695 bytes .../spectraplotwidget.cpython-37.pyc | Bin 5201 -> 4621 bytes xicam/BSISB/widgets/factorizationwidget.py | 24 +++++++++++++----- xicam/BSISB/widgets/mapviewwidget.py | 16 +++++++----- xicam/BSISB/widgets/spectraplotwidget.py | 19 +++++--------- 6 files changed, 34 insertions(+), 25 deletions(-) diff --git a/xicam/BSISB/formats/__pycache__/mapfile.cpython-37.pyc b/xicam/BSISB/formats/__pycache__/mapfile.cpython-37.pyc index 0df2008a696519093495b22b612ee78abcdebd68..0c1067dead972ef633b786ffa41eef8b5505141e 100644 GIT binary patch delta 20 acmbQGGfRitiIhyuA2t(15@0DG&K|hDg;QQP(m%*2%=U28oL6sc&6zl_O3O% zNfXN@LKJaABAOdkrTD-BRYF3Xdg_J$0cm^TniDq;91!nqng(U8`DWfX@4b2N&09Zw z{;#6D;JP+}@!+feXMgOvV{~(O`euc@Jj?BSv|jjt@EmvU5$*`~4XdBzbeWX%`)IOM zrir`U^4q&V)n@h`V4528FmN?sz7I1R0^qbq`-E#f0?6(g;6z{QR@Gy(dbX=~;)(gL zIrl2}H|KvQWi4UxR-EXO-xV?k)(Gkqwm6!Yad;(ex3cIry^P8eu>bYnKBWcqqqb&9 z3`AwwWZ}RxkM_?2oKSb!!wXZetJ^I<5aE|=q8TT&nlPVlJ-vrWv`Dg%h^v8+tJ_88 z>oe09kZCp(l#m|XBLi|5vRR{h+JNk_o;ILAPzOB*9R+t&|0jgSGQarSu z@u}B>MK4v}xK(~8VVy9NCG}pWK_}E8b7}`moMfOv_!j8{$n!{Lt6NRciTyB;FQVg& z#BwKw*c3r5FTlQTx5JG{r1#6WfspT@2J-`c>;>cta4-ooDgqE{(IM*4ahj)E9>8HG zYHKFrTH&`j>l`&-0wwvnTFZWT=`wDs0Er$5Xe2YeKav-bN4>;ui`Z*;QhM8o5#9DW zLe3)3nqf;i>hJ9AnU_%+vwD(+eCk!6#iMC;-F|lbusi?PHCKek!JYcr{>~gn&4SA3 z&eJJ%F*iPZ4vEw#?aLJquPZ+nR1Y-q^kak?LLK2IK$)e5l#57ABSGacPiXatDmveu zP78t2C#Dz0+Z~Z;K}WuYR)(BXkDT(@v8b)Kw=O>NqV<}hZfyru}r zBrJ-hyn!MHe-P~#c;Ge~&6XEMP0?yK8b_~r7;Bnv0W`6DBHUQi(j3>ySR;jzyzb}{ z$?^=9Hm*a75p1+O+wyae>ZL8e>9s2h%U72dDtCOoD&nZ(x1-zPodZdk`R*nBFG#%{ eU4K;V#F}e|e4{1i@oRVzfdftD&|yT)X8!@F7!f7_ delta 1227 zcmaJ>&2QX96rb_e+O9WjA^q4WP2GelwM4gvHff1M8lVeRprzk!mR2iwXS#Lb^{&Rw z$3}~Cpa^k{<`|H&5>kN^QsK}mH~xh=An2`^mIHqP?|G?$BE(ql=QqFk&CGjm#(p{a z^hoi&V$mhgzWwN{d%tZJ%QW7a{B+_&!ffU|BFy3X=X$Ng=yejf&rx_epvt?@O}2hq zeBx=_l)CaeeaTdMww}pD#svLd{y-NjaR9WQTri%V_Q9*Uag^}({UzSW6s;;fV(a2f z7#P5D@RXDCteSAq?3U%UIepv%@_n%MFMuB1A${_h)+0-FN9&Uvy{Gl5_)|)AiawIR znhTpu?^)Y~89f8g?3sWT$oGTUJ@YVO^f2ie54192g>8e`-#C3r$!(I186?sh<`TuJ2JgtuAsyj3O{|gpD5dQZHgMDs=F-Q!*a^}H?H4p~FO7FB& zF(RK?_03TTRTZGD7s4!5M*6V5CXT-1E@rJ*1lV(`>kZz?qIM$2pdS>3kF?2Gd6J1! z;Md$%dnM(0V&V)CVhR;{l(0RgD9SM4gQcV72)w9GOVpzybckwTp6*juv-BA{^yFFL z1hpnXBPz1wd^|so?z;fWNT8m|%J)yjS>#ct+!oKmdMHHLRc87y>~JxSyxwTX;;8)E znYnrb#hBGUS%`Tga8+>(VH`lYQ7dfnDyF9l2DRCfM1B=7@{qy$a?<_M8pf%v{K${bC6>FX_{xck~v;<&NTl0!`!9G|zG-P;& zz|r93eq|;rtxi|epj#VTj~ZdC(p-ruYY}VmEUmC^k{`rs#Mk7{#f`Ud-tLCG^;Pz4 WtIbwoK1V^34guJ3sqh&_)cywdh8QOR diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc index 1219cd3dde53cbcbdfac3cd94fd10e58e261b8b9..0078a648b1ce2cbc0a36fe083cccb6e59307a027 100644 GIT binary patch delta 1501 zcmZux-ESL35WhX&o%hb)j!9Zd6_+BKgC-3vP!yV`7z#;6LuiUx5|BB0H?G_BhxRUs zV_g(PkPs4;h_0%TqDamoyrDk9U%)GGXvIH(gb;5?yui#lG-||I`}54s%?a16G1Xp$XsYtJr$f%QjoxmP&0BgSIEOvM;6syhh>7H@B zJYDV?<%#nvJ?m`w!}4^zSD>fU;v6I<%{9+o<-!J8j3Sf~uyA5L{*sOsTo7e4;Ne?d z=((1djDMix=Uzq!1+SoV2H-^)!7zYE970JN&>S_I%c*OpbjKS-Mq$$d%=C+q6A@+~*GkZCk#kG~ji5H7Rah#rOBxawT#f!vWCEqF z0i`3YkEvyl@QU8)dDV$eayAT{Xl?E4)iGL~1Y(0-6zC5ZAg$0sK z1fdWMICm4_1B5C9mO^H#)tc`GL5=%KvO%HR2lF=QNP5$E%!-? delta 2038 zcmcgt&2Jk;6yMn|@2)?ShQxt3T~eTNz=V`SMdCWBkTeyL7J?#?0A}Txx@p&IGrJCn zwUH%2f*y*LuEeE^R1Z~}fVaG@U63|4uu61|P}?B{W13wn zlxrkZYh*_zkO7J|7TT>6U0t*NV8dk>M+3GV6diZ9=1tjE<^_z8cFHBc>3I7V)rQ;P zQ}&s;xw&ckdczBf{%V^|*^}p*!D!h&=2>jAYQS4{`%GIeO+eyu+x0d0@j!q?pN0R(y*j1seIc|$_6Xtvb;WWZa(MO5XePd{l@LBM-6F3E(Peiv9#mQIE zAcpfedjVh^hMxzJh(!#N0s>>X{w>$*%xZ~BB(1KReWjrqR3VOVbO0~`$Pgt>e z#a+F{dfW3p=;Ey?r^oHTZiUEVweNx3Ud7ANx9N{9WbsuPet+~J?RMH!M%n>U6(Ftw z#8pAI_T|u^8jx29!X`qU8t_(P;u=8`bSAa#fPWG~Ef!0STE7rfRo8)PVbXkNct2#nMvP8R9;WS%@1}`}2Rw zjw8s?IjR@@O(VGRALho?PtJdA&v~o~9I?zNu2Mw}Hh}1S_SsGv&PDBd{5+T`oDc?b z;!42k9M2g)i(n&QE8wpoJlZMn8y;A$AY4FL0uV~wS&v%`$Gb)7K+J1!@ZSKTklf?j z?7AQuhXm)-=zS5Pgir<$>IMW7gg;C)RAPZm82)%PlFJ(h&8Cza)01eBif-m+I?v-2 zue7*PaU_FK{D5<$1Ybn>5aCktr9z#xX4 zIc4wj&_h#k ICxy52Cr|X?Hvj+t diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index 2f0f21e..1ac4ab7 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -1,6 +1,5 @@ from qtpy.QtWidgets import QSplitter, QGridLayout, QWidget, QListView from xicam.core import msg -from xicam.gui.widgets.imageviewmixins import BetterButtons from pyqtgraph import PlotWidget, PlotDataItem, TextItem, mkPen, InfiniteLine, ImageItem, PolyLineROI from qtpy.QtCore import Qt, QItemSelectionModel from qtpy.QtGui import QStandardItemModel @@ -11,10 +10,10 @@ from sklearn.preprocessing import StandardScaler, Normalizer import numpy as np import pandas as pd -import pyqtgraph as pg import matplotlib.pyplot as plt import seaborn as sns from xicam.BSISB.widgets.uiwidget import MsgBox +from xicam.BSISB.widgets.imshowwidget import SlimImageView from lbl_ir.data_objects.ir_map import val2ind from lbl_ir.tasks.preprocessing import data_prep from lbl_ir.tasks.NMF.multi_set_analyses import aggregate_data @@ -282,6 +281,15 @@ def calculate(self): self.sigPCA.emit((self.wavenumbers_select, self.NMF, self.data_NMF, self.dataRowSplit)) def popup_plots(self): + # component variance ratio plot + if self.method == 'PCA': + plt.plot(getattr(self, self.method).explained_variance_ratio_, 'o-b') + ax = plt.gca() + ax.set_ylabel('Explained variance ratio', fontsize=16) + ax.set_xlabel('Component number', fontsize=16) + ax.set_xticks(np.arange(self.parameter['# of Components'])) + # loadings plot + plt.figure() labels = [] for i in range(getattr(self, self.method).components_.shape[0]): labels.append(self.method + str(i + 1)) @@ -290,7 +298,9 @@ def popup_plots(self): loadings_legend = plt.legend(loc='best') plt.setp(loadings_legend, draggable=True) plt.xlim([max(self.wavenumbers_select), min(self.wavenumbers_select)]) - + ax = plt.gca() + ax.set_xlabel('Wavenumber$(cm^{-1})$', fontsize=16) + # matrix plot groupLabel = np.zeros((self.dataRowSplit[-1], 1)) for i in range(len(self.dataRowSplit) - 1): groupLabel[self.dataRowSplit[i]:self.dataRowSplit[i + 1]] = int(i) @@ -392,10 +402,10 @@ def __init__(self, headermodel, selectionmodel): self._colors = ['r', 'g', 'b', 'y', 'c', 'm', 'w'] # color for plots # self.spectraROI = PlotWidget() - self.NWimage = BetterButtons() - self.NEimage = BetterButtons() - self.SWimage = BetterButtons() - self.SEimage = BetterButtons() + self.NWimage = SlimImageView() + self.NEimage = SlimImageView() + self.SWimage = SlimImageView() + self.SEimage = SlimImageView() # setup ROI item sideLen = 10 self.roiList = [] diff --git a/xicam/BSISB/widgets/mapviewwidget.py b/xicam/BSISB/widgets/mapviewwidget.py index d936a53..7ac93c7 100644 --- a/xicam/BSISB/widgets/mapviewwidget.py +++ b/xicam/BSISB/widgets/mapviewwidget.py @@ -1,12 +1,15 @@ import numpy as np -from xicam.gui.widgets.dynimageview import DynImageView +from xicam.BSISB.widgets.imshowwidget import SlimImageView from xicam.core import msg from xicam.core.data import NonDBHeader from pyqtgraph import ArrowItem, TextItem, PlotDataItem from qtpy.QtCore import Signal from lbl_ir.data_objects.ir_map import val2ind -class MapViewWidget(DynImageView): +def toHtml(txt, size=12): + return f'
{txt}
' + +class MapViewWidget(SlimImageView): sigShowSpectra = Signal(int) def __init__(self, *args, **kwargs): @@ -43,10 +46,11 @@ def showSpectra(self, event): self.cross.setData([x + 0.5], [self.row - y - 0.5]) self.cross.show() # update text - self.txt.setHtml(f'
Point: #{ind}
\ -
X: {x}
\ -
Y: {y}
\ -
Val: {self._image[self.row - y -1, x]: .4f}
') + self.txt.setHtml(toHtml(f'Point: #{ind}', size=8) + + toHtml(f'X: {x}', size=8) + + toHtml(f'Y: {y}', size=8) + + toHtml(f'Val: {self._image[self.row - y -1, x]: .4f}', size=8) + ) except Exception: self.cross.hide() diff --git a/xicam/BSISB/widgets/spectraplotwidget.py b/xicam/BSISB/widgets/spectraplotwidget.py index 5bf0b7c..9fc03d0 100644 --- a/xicam/BSISB/widgets/spectraplotwidget.py +++ b/xicam/BSISB/widgets/spectraplotwidget.py @@ -5,6 +5,7 @@ from pyqtgraph import InfiniteLine from qtpy.QtCore import Signal from lbl_ir.data_objects.ir_map import val2ind +from xicam.BSISB.widgets.mapviewwidget import toHtml class SpectraPlotWidget(PlotWidget): @@ -46,14 +47,11 @@ def getEnergy(self, lineobject): x_val = self.wavenumbers[idx] y_val = self._y[idx] if not self._meanSpec: - txt_html = f'
\ - Spectrum #{self.spectrumInd}
' + txt_html = toHtml(f'Spectrum #{self.spectrumInd}') else: - txt_html = f'
\ - {self._mean_title}
' + txt_html = toHtml(f'{self._mean_title}') - txt_html += f'
\ - X = {x_val: .2f}, Y = {y_val: .4f}
' + txt_html += toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') self.txt.setHtml(txt_html) self.cross.setData([x_val], [y_val]) @@ -123,14 +121,11 @@ def plot(self, x, y, *args, **kwargs): y_val = y[idx] if not self._meanSpec: - txt_html = f'
\ - Spectrum #{self.spectrumInd}
' + txt_html = toHtml(f'Spectrum #{self.spectrumInd}') else: - txt_html = f'
\ - {self._mean_title}
' + txt_html = toHtml(f'{self._mean_title}') - txt_html += f'
\ - X = {x_val: .2f}, Y = {y_val: .4f}
' + txt_html += toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') self.txt = TextItem(html=txt_html, anchor=(0, 0)) ymax = np.max(y) self._y = y From 852639b6bfbfbbe71122025399e8cdfe10b5aab4 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 11 Mar 2020 10:35:56 -0700 Subject: [PATCH 19/56] Update MapView with stream arg (see xi-cam.gui #44) --- xicam/BSISB/widgets/spectramaproiwidget.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xicam/BSISB/widgets/spectramaproiwidget.py b/xicam/BSISB/widgets/spectramaproiwidget.py index 74cc46e..2f427e6 100644 --- a/xicam/BSISB/widgets/spectramaproiwidget.py +++ b/xicam/BSISB/widgets/spectramaproiwidget.py @@ -18,7 +18,7 @@ class MapView(QSplitter): sigAutoMaskState = Signal(object) sigSelectMaskState = Signal(object) - def __init__(self, header: NonDBHeader = None, field: str = 'primary', ): + def __init__(self, header: NonDBHeader = None, stream: str = 'primary', field: str = 'primary' ): """ A widget to display imageCube like dataset with ROI buttons :param header: Xi-cam datahandler header From 0e6e80e27cb21a7995ee1709efabe0dcaa8578ba Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 11 Mar 2020 10:38:58 -0700 Subject: [PATCH 20/56] Replaced yapsy plugin file with entry points --- setup.py | 7 ++++++- xicam/BSISB/formats/mapfile.yapsy-plugin | 9 --------- 2 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 xicam/BSISB/formats/mapfile.yapsy-plugin diff --git a/setup.py b/setup.py index d44db80..1ef8e3f 100644 --- a/setup.py +++ b/setup.py @@ -35,5 +35,10 @@ author='Liang Chen', install_requires=install_requires, dependency_links=dependency_links, - author_email='lchen2@lbl.gov' + author_email='lchen2@lbl.gov', + entry_points={"xicam.plugins.GUIPlugin": + ["BSISB = xicam.BSISB:BSISB"], + "xicam.plugins.DataHandlerPlugin": + ["mapfile = xicam.BSISB.formats.mapfile:MapFilePlugin"] + } ) diff --git a/xicam/BSISB/formats/mapfile.yapsy-plugin b/xicam/BSISB/formats/mapfile.yapsy-plugin deleted file mode 100644 index 39da3f9..0000000 --- a/xicam/BSISB/formats/mapfile.yapsy-plugin +++ /dev/null @@ -1,9 +0,0 @@ -[Core] -Name = BSISB Map File Format -Module = mapfile.py - -[Documentation] -Author = Liang Chen -Version = 0.1 -Website = -Description = From 931a63250fd141cb18f2c2a1dddc3c8c125faf3c Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 11 Mar 2020 10:39:53 -0700 Subject: [PATCH 21/56] Remove BSISB yapsy file --- xicam/BSISB/BSISB.yapsy-plugin | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 xicam/BSISB/BSISB.yapsy-plugin diff --git a/xicam/BSISB/BSISB.yapsy-plugin b/xicam/BSISB/BSISB.yapsy-plugin deleted file mode 100644 index 4d507f8..0000000 --- a/xicam/BSISB/BSISB.yapsy-plugin +++ /dev/null @@ -1,9 +0,0 @@ -[Core] -Name = xicam.BSISB -Module = __init__.py - -[Documentation] -Author = Liang Chen -Version = 0.1 -Website = -Description = From 7888cb653ed3e551f4379447862d021ca3570bbd Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 11 Mar 2020 10:46:44 -0700 Subject: [PATCH 22/56] Removed tracked files that should be ignored --- xicam.BSISB.egg-info/PKG-INFO | 46 ------------------ xicam.BSISB.egg-info/SOURCES.txt | 16 ------ xicam.BSISB.egg-info/dependency_links.txt | 1 - xicam.BSISB.egg-info/requires.txt | 3 -- xicam.BSISB.egg-info/top_level.txt | 1 - .../__pycache__/mapfile.cpython-37.pyc | Bin 5658 -> 0 bytes .../__pycache__/__init__.cpython-37.pyc | Bin 153 -> 0 bytes .../__pycache__/mapviewwidget.cpython-37.pyc | Bin 3695 -> 0 bytes .../spectraplotwidget.cpython-37.pyc | Bin 4621 -> 0 bytes 9 files changed, 67 deletions(-) delete mode 100644 xicam.BSISB.egg-info/PKG-INFO delete mode 100644 xicam.BSISB.egg-info/SOURCES.txt delete mode 100644 xicam.BSISB.egg-info/dependency_links.txt delete mode 100644 xicam.BSISB.egg-info/requires.txt delete mode 100644 xicam.BSISB.egg-info/top_level.txt delete mode 100644 xicam/BSISB/formats/__pycache__/mapfile.cpython-37.pyc delete mode 100644 xicam/BSISB/widgets/__pycache__/__init__.cpython-37.pyc delete mode 100644 xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc delete mode 100644 xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc diff --git a/xicam.BSISB.egg-info/PKG-INFO b/xicam.BSISB.egg-info/PKG-INFO deleted file mode 100644 index eed8d82..0000000 --- a/xicam.BSISB.egg-info/PKG-INFO +++ /dev/null @@ -1,46 +0,0 @@ -Metadata-Version: 1.1 -Name: xicam.BSISB -Version: 0.1 -Summary: UNKNOWN -Home-page: UNKNOWN -Author: Liang Chen -Author-email: lchen2@lbl.gov -License: BSD -Description: Bsisb (Xi-cam PluginMaker) - =============================== - - version number: 0.1 - author: Liang Chen - - Overview - -------- - - - - Installation / Usage - -------------------- - - To install use pip: - - $ pip install Xi-cam.plugins.BSISB - - - Or clone the repo: - - $ git clone - $ python setup.py install - - Contributing - ------------ - - TBD - - Example - ------- - - TBD - -Platform: UNKNOWN -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: Programming Language :: Python :: 3 diff --git a/xicam.BSISB.egg-info/SOURCES.txt b/xicam.BSISB.egg-info/SOURCES.txt deleted file mode 100644 index bf7fb28..0000000 --- a/xicam.BSISB.egg-info/SOURCES.txt +++ /dev/null @@ -1,16 +0,0 @@ -MANIFEST.in -README.md -requirements.txt -setup.cfg -setup.py -xicam.BSISB.egg-info/PKG-INFO -xicam.BSISB.egg-info/SOURCES.txt -xicam.BSISB.egg-info/dependency_links.txt -xicam.BSISB.egg-info/requires.txt -xicam.BSISB.egg-info/top_level.txt -xicam/BSISB/__init__.py -xicam/BSISB/formats/__init__.py -xicam/BSISB/formats/mapfile.py -xicam/BSISB/widgets/__init__.py -xicam/BSISB/widgets/mapviewwidget.py -xicam/BSISB/widgets/spectraplotwidget.py \ No newline at end of file diff --git a/xicam.BSISB.egg-info/dependency_links.txt b/xicam.BSISB.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/xicam.BSISB.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/xicam.BSISB.egg-info/requires.txt b/xicam.BSISB.egg-info/requires.txt deleted file mode 100644 index 4d9416b..0000000 --- a/xicam.BSISB.egg-info/requires.txt +++ /dev/null @@ -1,3 +0,0 @@ -nose -coverage -pypi-publisher diff --git a/xicam.BSISB.egg-info/top_level.txt b/xicam.BSISB.egg-info/top_level.txt deleted file mode 100644 index db1e266..0000000 --- a/xicam.BSISB.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -xicam diff --git a/xicam/BSISB/formats/__pycache__/mapfile.cpython-37.pyc b/xicam/BSISB/formats/__pycache__/mapfile.cpython-37.pyc deleted file mode 100644 index 0c1067dead972ef633b786ffa41eef8b5505141e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5658 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 EZ+lP=RsaA1 diff --git a/xicam/BSISB/widgets/__pycache__/__init__.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 5c9ad3002aa2eac82fd70475fc2bd18db09f78ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmZ?b<>g`k0*h6PVnFm`5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6u$*(#>AIJKxa zCMPp7FFmFrQ#Uy=7fR_R6=xPF0XZNcr(n-uro diff --git a/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/mapviewwidget.cpython-37.pyc deleted file mode 100644 index 985395f24e0d5b25aef68fa93b31f2eaad8faa39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3695 zcmZ`+TXP&o6`r2k&aQS>vSN@OQn00PTY{G)U@nd^AX`pMl@-Slz6^$8wB1^bG?#VH ztZt0*B3I?fsl4%EQnh-dsNyH^z!U#~s(zx1C;f#y@tvMs$&q2Iy8HC~oIc;V%u=h> zF!25L;}^gCSKBcDL!IeogZL#%zJrPzoW+LE(3-KCSiZ$*%!=*A@f}Uuv76NVnx>uD zOX_|-Y50v~#-Gt+Zrn^-eoND}xSh=Uv!GkN&Ku8|Kli@DXL$3O!JEQ5viu92ts33- z3GOylx=giJ<0!e4gah#)61y0%l6-(>W+h8+Eqx$DE@anI^RfDiEH{MU51ZZ2jwP8K97pClD&ZBrGeV|+yQ6y z%E9t=9_@7UVm}r?Uo3Fhl`zJ^*E)TX7D6uGxSkKgbh@CQ#hJX;dGq$|+wXNYvb4C8 zM+f3s=fEBoi#HD3>p#G0H~wODO=T5(g|cZ{&fs=keer((+LKW(Wd0}>H_K8GFcPYm1eXYr!*s&zLUl6D_z*85DeU>Fu!4~4kQKSos;1uKms zbIUAQX@1I>Q5sv;mOXaRy2n+&Hug9px~Ow=0CrI$!`-n!PwKhbDfS6{HVPUdLBRx|m2vYy3Da+GhX zdeylnQsq{pYEuVcOr!WOr6M`DiGlq%)Nl1W_6lL4Z*JOsLsB8r;nQ ziJNiM-xgfe`dONaeu2w3v)$DpNEs@dw6AJWx+7%qSk~w)r!TWSSGACHZ6Nk$1oLr8 z7%~Ldk)4ZpL)oDmXD=FK_QG+$?J)-c=b z;HzKKX>TgTsjU&xNWt3HdLT+RHja%$6Dr2@Z<$Btp@r5et;G&i5~S74Znz`TQL+wGQBJ^N_R0++@*H?FQQRC!3H!X0a3JJm3 z*gQ7IR%sry&zStW9>e9OOj9+YOykf#B%FJta|w>=l5yzl{|)_m>6G?{ zdD%DwwznFvP<5p>NbHNzEY9{;4OXwY&+H#uXHlZGKv*Wqq0=G){h4Hybmh#+0 z-!1L4{(^y#TIrk{@vwXT^mK4l@xtpb?CD7h1}W{Kk#=mOcx}4@Y2RSDcf!L(;^DE8 znvbSdc0xurK*9I#UmSS%vM4R!K~Lx@yG*vw99WOwLaoQBoCje{?zGeU(MI|lwypzUQT8>Ku-2lq+I9!#YOqcm4-_{UYUr?re+4|Jab1AB_?D+`fCxw20ILbYLS zt1p|CNTNb6()l$goT3Yi1`D(W=`r%M+O^8>)3W;VUSAB0C`;ux(eKtY_LL(4*Fydf zLkN~+&st9TQw+$T(MGVu&%sfC0~2qe!lm9(*9Ew3&^)$zzlGz@0g!>ZRKb$Kps|$n=4QD;Z)%W{InNqEmkp#ffVn2S2*h19J@X=F|A#BA&R9G3h4j880~LMhG@6frt4SQz zvAl}jT6gBk?XD|d$Brr%&Wwg&S!i*UIf_(GW)UTMh^wM_5arQ&ED%-6xvTkbgp4Q3 zi);X;-AC>u;5@!dhw1D}2eC)!euR=!JTlm;cJtDWr=m>7pks1++Nmg%m~5O&P5!?) zat&MMW2$_rev7JWY3AjxX@C^=D$BI%Hz*U9FTN6Mr+_%+mvUO-`6lgp7ga%-EkY1t zEI8&AJSf(hC8*Ncwh!&n9$SUI5bBV+ARQhGWu`;< z6AW~nNq{XjrGR&gdG32d5pKV8_3GPx4WmRTI|=jc^8oaca9iBP1iehI|5JcAkNn#! zqE44~*;;pwQl%8;iBzc(1WCq6G11K+csdH>YDQ8F(JadAL{SnW-=>N@t0WXCD=(yc zNL@llrKLa6L~D`;^+g;{Qz62@R7V<7lnqfbl@sAns?hRk-oo5M+iuz###l~LA@OyP zuMGF)@6q!+I*IS;B)&IE;(Jj-p{43cvLMx{mi03!Dwi;OHqg`dtYxSV_n#KP{cux~ z_NyF^+`F22S`7Dl9~C$01bPks^>{rFBB^%=mD9_6kqi(aD?L+|r#XK~Ri`GTyzA9d S-=MHPk(&Gic?i^I!}>3t$AzE( diff --git a/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc b/xicam/BSISB/widgets/__pycache__/spectraplotwidget.cpython-37.pyc deleted file mode 100644 index 0078a648b1ce2cbc0a36fe083cccb6e59307a027..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4621 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 H`nCQG40e?t From 1a924b34272cb4c0eaed279c25e4a1ddeff3f758 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 11 Mar 2020 10:51:36 -0700 Subject: [PATCH 23/56] Ignore egg-info dir --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f40e32a..de24304 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ *.tif build/ dist/ -*.egg_info/ +*.egg-info/ From 19caf7732efcd6fc643cd7510e9875aff5420b61 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sat, 4 Apr 2020 20:10:00 -0700 Subject: [PATCH 24/56] adjust cross size and change txt position from fixed to x[0] --- xicam/BSISB/widgets/factorizationwidget.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index 1ac4ab7..2f35f2f 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -339,7 +339,7 @@ def __init__(self, *args, **kwargs): self.line = InfiniteLine(pos=800, movable=True) self.line.sigPositionChanged.connect(self.getEnergy) self.addItem(self.line) - self.cross = PlotDataItem([800], [0], symbolBrush=(255, 255, 255), symbolPen=(255, 255, 255), symbol='+', symbolSize=20) + self.cross = PlotDataItem([800], [0], symbolBrush=(255, 255, 255), symbolPen=(255, 255, 255), symbol='+', symbolSize=25) self.addItem(self.cross) self.txt = TextItem() self.getViewBox().invertX(True) @@ -376,7 +376,7 @@ def plot(self, x, y, *args, **kwargs): if ymax > self.ymax: self.ymax = ymax self._x, self._y = x, y - self.txt.setPos(1200, 0.95 * self.ymax) + self.txt.setPos(x[0], 0.95 * self.ymax) self.addItem(self.txt) return plot_item From bb4e9ed5c02045397a277fd5c3bdd3530e67769d Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 6 Apr 2020 16:20:31 -0700 Subject: [PATCH 25/56] add lbl_ir install --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 6e5f50f..c2aec49 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,11 @@ Install Xi-CAM: Follow the guide [here](https://xi-cam2.readthedocs.io/en/latest/install.html) +Install lbl_ir: + + $ git clone https://lchen2ir@bitbucket.org/berkeleylab/lbl_ir.git + $ cd lbl_ir + $ pip install -e . Clone the repo: @@ -23,6 +28,7 @@ Clone the repo: $ pip install -e . $ cd .. $ xicam + Contributing ------------ From 783025cedb141e4f69e2cf3c8adba74eece9beb8 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 4 May 2020 21:25:53 -0700 Subject: [PATCH 26/56] bring highlighted curve to front in PCA loadings --- xicam/BSISB/widgets/factorizationwidget.py | 4 +++- xicam/BSISB/widgets/preprocesswidget.py | 0 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 xicam/BSISB/widgets/preprocesswidget.py diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index 2f35f2f..bb9ebc1 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -399,7 +399,7 @@ def __init__(self, headermodel, selectionmodel): # self.componentSpectra = PlotWidget() self.componentSpectra = ComponentPlotWidget() self._plotLegends = self.componentSpectra.addLegend() - self._colors = ['r', 'g', 'b', 'y', 'c', 'm', 'w'] # color for plots + self._colors = ['r', 'g', 'm', 'y', 'c', 'b', 'w'] # color for plots # self.spectraROI = PlotWidget() self.NWimage = SlimImageView() @@ -611,8 +611,10 @@ def curveHighLight(self, k): for i in range(4): if i == k: self._plots[i].setPen(mkPen(self._colors[k], width=6)) + self._plots[i].setZValue(50) else: self._plots[i].setPen(mkPen(self._colors[i], width=2)) + self._plots[i].setZValue(0) self.componentSpectra._x, self.componentSpectra._y = self._plots[k].getData() self.componentSpectra.getEnergy() diff --git a/xicam/BSISB/widgets/preprocesswidget.py b/xicam/BSISB/widgets/preprocesswidget.py new file mode 100644 index 0000000..e69de29 From 63e5f20aca4fb4eb7e78225526b9d80bb70afc49 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 4 May 2020 21:26:27 -0700 Subject: [PATCH 27/56] add preprocess stage --- xicam/BSISB/__init__.py | 35 +- xicam/BSISB/formats/mapfile.py | 4 +- xicam/BSISB/widgets/preprocesswidget.py | 572 +++++++++++++++++++++++ xicam/BSISB/widgets/spectraplotwidget.py | 131 +++++- 4 files changed, 731 insertions(+), 11 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index d3713a1..0557f5e 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -8,9 +8,25 @@ from xicam.BSISB.widgets.spectramaproiwidget import MapView from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget from xicam.BSISB.widgets.factorizationwidget import FactorizationWidget +from xicam.BSISB.widgets.preprocesswidget import PreprocessWidget from xicam.plugins import GUIPlugin, GUILayout from xicam.gui.widgets.tabview import TabView +class BSISBTabview(TabView): + + def __init__(self, *args, **kwargs): + super(BSISBTabview, self).__init__(*args, **kwargs) + + def closeTab(self, i): + newindex = self.currentIndex() + if (i <= self.currentIndex()) and (newindex > 0): + newindex -= 1 + + self.removeTab(i) + self.catalogmodel.removeRow(i) + self.setCurrentIndex(newindex) + self.selectionmodel.setCurrentIndex(self.catalogmodel.index(newindex, 0), QItemSelectionModel.Rows + | QItemSelectionModel.ClearAndSelect) class BSISB(GUIPlugin): name = 'BSISB' @@ -23,17 +39,19 @@ def __init__(self, *args, **kwargs): # Selection model self.selectionmodel = QItemSelectionModel(self.headermodel) - + self.preprocess = PreprocessWidget(self.headermodel, self.selectionmodel) self.FA_widget = FactorizationWidget(self.headermodel, self.selectionmodel) # update headers list when a tab window is closed self.headermodel.rowsRemoved.connect(partial(self.FA_widget.setHeader, 'spectra')) # Setup tabviews and update map selection - self.imageview = TabView(self.headermodel, self.selectionmodel, MapView, 'image') + self.imageview = BSISBTabview(self.headermodel, self.selectionmodel, MapView, 'image') + self.imageview.currentChanged.connect(self.updateTab) - self.stages = {'MapToH5': GUILayout(self.mapToH5), + self.stages = {"MapToH5": GUILayout(self.mapToH5), "Image View": GUILayout(self.imageview), + "Preprocess": GUILayout(self.preprocess), "Factor Analysis": GUILayout(self.FA_widget)} # "NMF": GUILayout(self.NMF_widget)} super(BSISB, self).__init__(*args, **kwargs) @@ -65,6 +83,7 @@ def appendHeader(self, header: NonDBHeader, **kwargs): currentMapView.sigAutoMaskState.connect(partial(self.appendSelection, 'autoMask')) currentMapView.sigSelectMaskState.connect(partial(self.appendSelection, 'select')) + self.preprocess.setHeader(field='spectra') self.FA_widget.setHeader(field='spectra') for i in range(4): self.FA_widget.roiList[i].sigRegionChangeFinished.connect(self.updateROI) @@ -91,7 +110,9 @@ def updateROI(self, roi): selectMapIdx = 0 self.imageview.widget(selectMapIdx).roiMove(roi) - def updateTab(self, tabIdx): - if tabIdx >= 0: - self.selectionmodel.select(self.headermodel.index(tabIdx, 0), QItemSelectionModel.ClearAndSelect) - + def updateTab(self): + # clear specItemModel + self.preprocess.specItemModel.clear() + self.preprocess.rawSpectra.clearAll() + self.preprocess.resultSpectra.clearAll() + self.preprocess.infoBox.setText('') \ No newline at end of file diff --git a/xicam/BSISB/formats/mapfile.py b/xicam/BSISB/formats/mapfile.py index f41731b..b47073f 100644 --- a/xicam/BSISB/formats/mapfile.py +++ b/xicam/BSISB/formats/mapfile.py @@ -86,7 +86,7 @@ def getImageEvents(cls, path, descriptor_uid): for i in range(n): yield embedded_local_event_doc(descriptor_uid, 'image', cls, (path,), resource_kwargs={'E': i}, - metadata={'wavenumbers': wavenumbers, 'rc_index': rc2ind, 'index_rc': ind2rc, 'imgShape': imgShape}) + metadata={'path': path, 'wavenumbers': wavenumbers, 'rc_index': rc2ind, 'index_rc': ind2rc, 'imgShape': imgShape}) @classmethod def getSpectraDescriptor(cls, path, start_uid): @@ -112,7 +112,7 @@ def getSpectraEvents(cls, path, descriptor_uid): for i in range(n): yield embedded_local_event_doc(descriptor_uid, 'spectra', cls, (path,), resource_kwargs={'i': i}, - metadata={'wavenumbers':wavenumbers, 'rc_index': rc2ind, 'index_rc': ind2rc, 'imgShape':imgShape}) + metadata={'path': path, 'wavenumbers':wavenumbers, 'rc_index': rc2ind, 'index_rc': ind2rc, 'imgShape':imgShape}) @classmethod def ingest(cls, paths): diff --git a/xicam/BSISB/widgets/preprocesswidget.py b/xicam/BSISB/widgets/preprocesswidget.py index e69de29..2bddf7a 100644 --- a/xicam/BSISB/widgets/preprocesswidget.py +++ b/xicam/BSISB/widgets/preprocesswidget.py @@ -0,0 +1,572 @@ +import os +import numpy as np +import pandas as pd +from scipy.interpolate import interp1d +from functools import partial +from qtpy.QtWidgets import * +from qtpy.QtCore import Qt, QItemSelectionModel, Signal +from qtpy.QtGui import QStandardItemModel, QStandardItem, QFont +from pyqtgraph.parametertree import ParameterTree, Parameter +from xicam.core import msg +from lbl_ir.data_objects.ir_map import ir_map, val2ind +from xicam.BSISB.widgets.spectraplotwidget import baselinePlotWidget +from xicam.BSISB.widgets.uiwidget import MsgBox, YesNoDialog + + +class Preprocessor: + def __init__(self, wavenumbers, spectrum): + self.wavenumbers = wavenumbers + self.spectrum = spectrum + self.preprocess_method = None + self.interp_method = None + self.wav_anchor = None + + def parse_anchors(self, anchors): + """ + parse anchor points str to real valued wavenumbers and confine energy range + :return: None + """ + anchor_idx = [] + for entry in anchors.split(','): + try: + anchor_idx.append(val2ind(int(entry.strip()), self.wavenumbers)) + except: + continue + anchor_idx = sorted(anchor_idx) + + self.energy = self.wavenumbers[anchor_idx[0]: anchor_idx[-1] + 1] + self.specTrim = self.spectrum[anchor_idx[0]: anchor_idx[-1] + 1] + + self.wav_anchor = self.wavenumbers[anchor_idx] + self.spec_anchor = self.spectrum[anchor_idx] + return None + + def isBaseFitOK(self, anchors, kind): + """ + Check is there is enough anchor points to fit higher order baseline + :param anchors: anchor points + :param kind: fitting method + :return: decide if there is enough anchor points for baseline fit + """ + # parse anchor points + self.parse_anchors(anchors) + # decide if num of anchor points is enough for 'quadratic' or 'cubic' fit + if len(self.wav_anchor) < 2: + MsgBox('Baseline fitting needs at least 2 anchor points.\n' + + 'Please add more "anchor points" to correctly fit the baseline.') + return False + elif len(self.wav_anchor) < 3 and kind == 'quadratic': + MsgBox('Quadratic baseline needs more than 2 anchor points.\n' + + 'Please add more "anchor points" to correctly fit the baseline.') + return False + elif len(self.wav_anchor) < 4 and kind == 'cubic': + MsgBox('Cubic baseline needs more than 3 anchor points.\n' + + 'Please add more "anchor points" to correctly fit the baseline.') + return False + else: + return True + + def rubber_band(self, anchors, kind='linear'): + """ + Calculate rubberBaseline, debased spectrum and 2nd, 4th order derivative of the spectrum + :param anchors: rubberband anchor points + :param kind: spline fit curve order + :return: baseline fit success (bool) + """ + self.preprocess_method = 'rubberband' + self.interp_method = kind + # get rubberBaseline and debased spectrum + if not self.isBaseFitOK(anchors, kind): + return False + + f = interp1d(self.wav_anchor, self.spec_anchor, kind=kind) + self.rubberBaseline = f(self.energy) + self.rubberDebased = self.specTrim - self.rubberBaseline + + # get 2nd and 4th order derivatives + self.get_derivative() + return True + + def get_derivative(self): + """ + Calculate 2nd and 4th order derivative of the spectrum + :param n: the derivative order + :return: None + """ + dx = self.energy[1] - self.energy[0] + self.deriv2 = self.nthOrderGradient(dx, self.specTrim, n=2) + self.deriv4 = self.nthOrderGradient(dx, self.specTrim, n=4) + return None + + def nthOrderGradient(self, dx, y, n=1): + """ + Calculate nth order derivative of array y + :param dx: spacing of x + :param y: array + :param n: order of derivative + :return: nth order derivative + """ + for i in range(n): + z = np.gradient(y, dx) + y = z + y = np.where(np.abs(y) == np.inf, 0, y) # fix infinity values + return y + + +class PreprocessParameters(ParameterTree): + sigParamChanged = Signal(object) + + def __init__(self): + super(PreprocessParameters, self).__init__() + + self.parameter = Parameter(name='params', type='group', + children=[{'name': "Preprocess method", + 'values': ['Rubberband'], + 'value': 'Rubberband', + 'type': 'list'}, + {'name': "Anchor points", + 'value': '400, 4000', + 'type': 'str'}, + {'name': "Interp method", + 'value': 'linear', + 'values': ['linear', 'quadratic', 'cubic'], + 'type': 'list'} + ]) + self.setParameters(self.parameter, showTop=False) + self.setIndentation(0) + # change Fonts + self.fontSize = 12 + font = QFont("Helvetica [Cronyx]", self.fontSize) + boldFont = QFont("Helvetica [Cronyx]", self.fontSize, QFont.Bold) + self.header().setFont(font) + for item in self.listAllItems(): + if hasattr(item, 'widget'): + item.setFont(0, boldFont) + item.widget.setFont(font) + item.displayLabel.setFont(font) + item.widget.setMaximumHeight(40) + # init params dict + self.argMap = {"Anchor points": 'anchors', + "Interp method": 'kind' + } + # set self.processArgs to default value + self.processArgs = {} + for child in self.parameter.childs: + if child.name() == "Anchor points": + self.processArgs['anchors'] = '400, 4000' + elif child.name() == "Interp method": + self.processArgs['kind'] = 'linear' + # elif child.name() not in ["Normalization method"]: + # self.processArgs[self.argMap[child.name()]] = None + + # connect signals + for name in self.argMap.keys(): + self.parameter.child(name).sigValueChanged.connect(partial(self.updateParam, name)) + + # self.parameter.child('Preprocess method').sigValueChanged.connect(self.updateMethod) + + def updateParam(self, name): + """ + get latest parameter values + :param name: parameter name + :return: None + """ + self.processArgs[self.argMap[name]] = self.parameter[name] + self.sigParamChanged.emit(self.processArgs) + + # def updateMethod(self): + # """ + # Toggle parameter menu based on fit method + # :return: + # """ + # if self.parameter["Normalization method"] == 'mback': + # self.parameter.child('Z number').show() + # self.parameter.child('Edge').show() + # self.parameter.child('Edge step').hide() + # else: + # self.parameter.child('Z number').hide() + # self.parameter.child('Edge').hide() + # self.parameter.child('Edge step').show() + + +class PreprocessWidget(QSplitter): + def __init__(self, headermodel, selectionmodel): + super(PreprocessWidget, self).__init__() + self.headermodel = headermodel + self.mapselectmodel = selectionmodel + self.selectMapidx = 0 + self.resultDict = {} + self.isBatchProcessOn = False + self.out = None + self.reportList = ['preprocess_method', 'wav_anchor', 'interp_method'] + self.arrayList = ['rubberDebased', 'deriv2', 'deriv4'] + + # split between spectrum parameters and viewwindow, vertical split + self.params_and_specview = QSplitter() + self.params_and_specview.setOrientation(Qt.Vertical) + # split between buttons and parameters + self.buttons_and_params = QSplitter() + self.buttons_and_params.setOrientation(Qt.Horizontal) + # split between speclist and report + self.speclist_and_report = QSplitter() + self.speclist_and_report.setOrientation(Qt.Vertical) + + # buttons layout + self.buttons = QWidget() + self.buttonlayout = QGridLayout() + self.buttons.setLayout(self.buttonlayout) + # set up buttons + self.fontSize = 12 + font = QFont("Helvetica [Cronyx]", self.fontSize) + self.loadBtn = QPushButton() + self.loadBtn.setText('Load spectra') + self.loadBtn.setFont(font) + self.removeBtn = QPushButton() + self.removeBtn.setText('Remove spectrum') + self.removeBtn.setFont(font) + self.normBox = QComboBox() + self.normBox.addItems(['Raw spectrum', + 'Rubberband baseline', + 'Rubberband + 2nd derivative', + 'Rubberband + 4th derivative', + ]) + self.normBox.setFont(font) + self.batchBtn = QPushButton() + self.batchBtn.setText('Batch process') + self.batchBtn.setFont(font) + self.saveResultBox = QComboBox() + self.saveResultBox.addItems(['Save rubberband', + 'Save 2nd derivative', + 'Save 4th derivative', + 'Save all', + ]) + self.saveResultBox.setFont(font) + # add all buttons + self.buttonlayout.addWidget(self.loadBtn) + self.buttonlayout.addWidget(self.removeBtn) + self.buttonlayout.addWidget(self.normBox) + self.buttonlayout.addWidget(self.batchBtn) + self.buttonlayout.addWidget(self.saveResultBox) + # define report + self.reportWidget = QWidget() + self.reportWidget.setLayout(QVBoxLayout()) + self.infoBox = QTextEdit() + reportTitle = QLabel('Preprocess results') + reportTitle.setFont(font) + self.reportWidget.layout().addWidget(reportTitle) + self.reportWidget.layout().addWidget(self.infoBox) + # spectrum list view + self.specItemModel = QStandardItemModel() + self.specSelectModel = QItemSelectionModel(self.specItemModel) + self.speclistview = QListView() + self.speclistview.setModel(self.specItemModel) + self.speclistview.setSelectionModel(self.specSelectModel) + # add title to list view + self.specListWidget = QWidget() + self.listLayout = QVBoxLayout() + self.specListWidget.setLayout(self.listLayout) + specListTitle = QLabel('Spectrum List') + specListTitle.setFont(font) + self.listLayout.addWidget(specListTitle) + self.listLayout.addWidget(self.speclistview) + + # spectrum plot + self.rawSpectra = baselinePlotWidget() + self.resultSpectra = baselinePlotWidget() + # ParameterTree + self.parametertree = PreprocessParameters() + self.processArgs = self.parametertree.processArgs + self.argMap = self.parametertree.argMap + + # assemble widgets + self.buttons_and_params.addWidget(self.parametertree) + self.buttons_and_params.addWidget(self.buttons) + self.buttons_and_params.setSizes([1000, 100]) + self.params_and_specview.addWidget(self.buttons_and_params) + self.params_and_specview.addWidget(self.rawSpectra) + self.params_and_specview.addWidget(self.resultSpectra) + self.params_and_specview.setSizes([150, 50, 50]) + self.speclist_and_report.addWidget(self.specListWidget) + self.speclist_and_report.addWidget(self.reportWidget) + self.speclist_and_report.setSizes([150, 100]) + self.addWidget(self.params_and_specview) + self.addWidget(self.speclist_and_report) + self.setSizes([1000, 200]) + + # Connect signals + self.loadBtn.clicked.connect(self.loadData) + self.removeBtn.clicked.connect(self.removeSpec) + self.batchBtn.clicked.connect(self.batchProcess) + self.specSelectModel.selectionChanged.connect(self.updateSpecPlot) + self.normBox.currentIndexChanged.connect(self.updateSpecPlot) + self.parametertree.sigParamChanged.connect(self.updateSpecPlot) + + def setHeader(self, field: str): + self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] + self.field = field + self.wavenumberList = [] + self.rc2indList = [] + self.ind2rcList = [] + self.pathList = [] + self.dataSets = [] + + # get wavenumbers, rc2ind + for header in self.headers: + dataEvent = next(header.events(fields=[field])) + self.wavenumberList.append(dataEvent['wavenumbers']) + self.rc2indList.append(dataEvent['rc_index']) + self.ind2rcList.append(dataEvent['index_rc']) + self.pathList.append(dataEvent['path']) + # get raw spectra + data = None + try: # spectra datasets + data = header.meta_array('spectra') + except IndexError: + msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) + if data is not None: + self.dataSets.append(data) + + def isMapOpen(self): + if not self.mapselectmodel.selectedIndexes(): # no map is open + return False + else: + self.selectMapidx = self.mapselectmodel.selectedIndexes()[0].row() + return True + + def getCurrentSpecid(self): + # get selected spectrum idx + specidx = None # default value + if self.specSelectModel.selectedIndexes(): + selectedSpecRow = self.specSelectModel.selectedIndexes()[0].row() + currentSpecItem = self.specItemModel.item(selectedSpecRow) + specidx = currentSpecItem.idx + return specidx + + + + def updateSpecPlot(self): + # get current map idx and selected spectrum idx + specidx = self.getCurrentSpecid() + if not self.isMapOpen(): + return + elif self.specItemModel.rowCount() == 0: + MsgBox('No spectrum is loaded.\nPlease click "Load spectra" to import data.') + return + elif specidx is None: + return + + # get plotchoice + plotChoice = self.normBox.currentIndex() + + # create Preprocessor object + self.out = Preprocessor(self.wavenumberList[self.selectMapidx], self.dataSets[self.selectMapidx][specidx]) + # calculate rubberband baseline + baselineOK = self.out.rubber_band(**self.processArgs) + if not baselineOK: + return + + # make results report + if plotChoice != 0: + self.getReport(self.out) + + # if not batch processing, show plots + if not self.isBatchProcessOn: + # clean up plots + self.rawSpectra.clearAll() + self.resultSpectra.clearAll() + if plotChoice == 0: # plot raw spectrum + self.infoBox.setText('') # clear txt + self.rawSpectra.plotBase(self.out, plotType='raw') + elif plotChoice == 1: # plot raw, edges, norm + self.rawSpectra.plotBase(self.out, plotType='base') + self.resultSpectra.plotBase(self.out, plotType='rubberband') + elif plotChoice == 2: # plot raw, edges, flattened + self.rawSpectra.plotBase(self.out, plotType='base') + self.resultSpectra.plotBase(self.out, plotType='deriv2') + elif plotChoice == 3: # plot raw, edges, Mback + poly normalized + self.rawSpectra.plotBase(self.out, plotType='base') + self.resultSpectra.plotBase(self.out, plotType='deriv4') + + def getReport(self, output): + resultTxt = '' + # get normalization results + for item in dir(output): + if item in self.reportList: + if item == 'wav_anchor': + val = getattr(output, item) + printFormat = ('{:.2f}, ' * len(val))[:-1] + resultTxt += item + ': ' + printFormat.format(*val) + '\n' + else: + resultTxt += item + ': ' + getattr(output, item) + '\n' + if (item in self.arrayList) or (item in self.reportList): + self.resultDict[item] = getattr(output, item) + + # send text to report info box + self.infoBox.setText(resultTxt) + + def loadData(self): + # get current map idx + if not self.isMapOpen(): + return + # pass the selected map data to plotwidget + self.rawSpectra.setHeader(self.headers[self.selectMapidx], 'spectra') + currentMapItem = self.headermodel.item(self.selectMapidx) + rc2ind = self.rc2indList[self.selectMapidx] + # get current map name + mapName = currentMapItem.data(0) + # get current selected pixels + pixelCoord = currentMapItem.selectedPixels + # get selected specIds + spectraIds = [] + if currentMapItem.selectedPixels is None: # select all + spectraIds = list(range(len(rc2ind))) + else: + for i in range(len(pixelCoord)): + row_col = tuple(pixelCoord[i]) + spectraIds.append(rc2ind[row_col]) + spectraIds = sorted(spectraIds) + # add specitem model + self.specItemModel.clear() + for idx in spectraIds: + item = QStandardItem(mapName + '# ' + str(idx)) + item.idx = idx + self.specItemModel.appendRow(item) + + def removeSpec(self): + # get current selectedSpecRow + if self.specSelectModel.selectedIndexes(): + selectedSpecRow = self.specSelectModel.selectedIndexes()[0].row() + self.specSelectModel.blockSignals(True) + self.specItemModel.removeRow(selectedSpecRow) + self.specSelectModel.blockSignals(False) + # clean up plots + self.rawSpectra.clearAll() + self.resultSpectra.clearAll() + self.infoBox.setText('') + + def batchProcess(self): + # get current map idx + if not self.isMapOpen(): + return + elif self.specItemModel.rowCount() == 0: + MsgBox('No spectrum is loaded.\nPlease click "Load spectra" to import data.') + return + # check if baseline fit OK + if self.out is None: + self.out = Preprocessor(self.wavenumberList[self.selectMapidx], self.dataSets[self.selectMapidx][0]) + baselineOK = self.out.rubber_band(**self.processArgs) + if not baselineOK: + return + # notice to user + userMsg = YesNoDialog(f'Ready to batch process selected spectra.\nDo you want to continue?') + userChoice = userMsg.choice() + if userChoice == QMessageBox.No: # user choose to stop + return + + self.isBatchProcessOn = True + # set plot type to rubberband + self.normBox.setCurrentIndex(1) + + # init resultSetsDict, paramsDict + self.resultSetsDict = {} + self.paramsDict = {} + self.paramsDict['specID'] = [] + self.paramsDict['row_column'] = [] + ind2rc = self.ind2rcList[self.selectMapidx] + filePath = self.pathList[self.selectMapidx] + energy = self.out.energy + n_energy = len(energy) + for item in self.arrayList: + self.resultSetsDict[item] = np.empty((0, n_energy)) + for item in self.reportList: + self.paramsDict[item] = [] + # batch process begins + n_spectra = self.specItemModel.rowCount() + for i in range(n_spectra): + msg.showMessage(f'Processing {i + 1}/{n_spectra} spectra') + # select each spec and collect results + self.specSelectModel.select(self.specItemModel.index(i, 0), QItemSelectionModel.ClearAndSelect) + # get spec idx + currentSpecItem = self.specItemModel.item(i) + self.paramsDict['specID'].append(currentSpecItem.idx) + self.paramsDict['row_column'].append(ind2rc[currentSpecItem.idx]) + # append all results into a single array/list + for item in self.arrayList: + self.resultSetsDict[item] = np.append(self.resultSetsDict[item], self.resultDict[item].reshape(1, -1), + axis=0) + for item in self.reportList: + self.paramsDict[item].append(self.resultDict[item]) + + # result collection completed. convert paramsDict to df + dfDict = {} + dfDict['param'] = pd.DataFrame(self.paramsDict).set_index('specID') + for item in self.arrayList: + # convert resultSetsDict to df + dfDict[item] = pd.DataFrame(self.resultSetsDict[item], columns=energy.tolist(), + index=self.paramsDict['specID']).rename_axis('specID', axis=0) + + # save df to files + msg.showMessage(f'Batch processing is completed! Saving results to csv files.') + saveDataChoice = self.saveResultBox.currentIndex() + if saveDataChoice != 3: # save a single result + saveDataType = self.arrayList[saveDataChoice] + dirName, csvName, h5Name = self.saveToFiles(energy, dfDict, filePath, saveDataType) + if h5Name is None: + MsgBox(f'Processed data was saved as csv file at: \n{dirName + csvName}') + else: + MsgBox( + f'Processed data was saved as: \n\ncsv file at: {dirName + csvName} and \n\nHDF5 file at: {dirName + h5Name}') + else: # save all results + csvList = [] + h5List = [] + for saveDataType in self.arrayList: + dirName, csvName, h5Name = self.saveToFiles(energy, dfDict, filePath, saveDataType) + csvList.append(csvName) + h5List.append(h5Name) + + allcsvName = (', ').join(csvList) + if h5Name is None: + MsgBox(f'Processed data was saved as csv files at: \n{dirName + allcsvName}') + else: + allh5Name = (', ').join(h5List) + MsgBox( + f'Processed data was saved as: \n\ncsv files at: {dirName + allcsvName} and \n\nHDF5 files at: {dirName + allh5Name}') + + # save parameter + xlsName = csvName[:-4] + '_param.xlsx' + dfDict['param'].to_excel(dirName + xlsName) + # batch process completed + self.isBatchProcessOn = False + + def saveToFiles(self, energy, dfDict, filePath, saveDataType): + + ind2rc = self.ind2rcList[self.selectMapidx] + n_spectra = self.specItemModel.rowCount() + + # get dirname and old filename + dirName = os.path.dirname(filePath) + dirName += '/' + oldFileName = os.path.basename(filePath) + + # save dataFrames to csv file + csvName = oldFileName[:-3] + '_' + saveDataType + '.csv' + dfDict[saveDataType].to_csv(dirName + csvName) + + # if a full map is processed, also save results to a h5 file + h5Name = None + if n_spectra == len(ind2rc): + fullMap = ir_map(filename=filePath) + fullMap.add_image_cube() + fullMap.wavenumbers = energy + fullMap.N_w = len(energy) + fullMap.data = np.zeros((fullMap.data.shape[0], fullMap.N_w)) + fullMap.imageCube = np.zeros((fullMap.imageCube.shape[0], fullMap.imageCube.shape[1], fullMap.N_w)) + for i in self.paramsDict['specID']: + fullMap.data[i, :] = self.resultSetsDict[saveDataType][i, :] + row, col = ind2rc[i] + fullMap.imageCube[row, col, :] = fullMap.data[i, :] = self.resultSetsDict[saveDataType][i, :] + # save data as hdf5 + h5Name = oldFileName[:-3] + '_' + saveDataType + '.h5' + fullMap.write_as_hdf5(dirName + h5Name) + + return dirName, csvName, h5Name diff --git a/xicam/BSISB/widgets/spectraplotwidget.py b/xicam/BSISB/widgets/spectraplotwidget.py index 9fc03d0..7e598d3 100644 --- a/xicam/BSISB/widgets/spectraplotwidget.py +++ b/xicam/BSISB/widgets/spectraplotwidget.py @@ -1,4 +1,5 @@ -from pyqtgraph import PlotWidget, TextItem, PlotDataItem +from qtpy.QtCore import Qt +from pyqtgraph import PlotWidget, TextItem, PlotDataItem, mkPen from xicam.core import msg from xicam.core.data import NonDBHeader import numpy as np @@ -11,7 +12,7 @@ class SpectraPlotWidget(PlotWidget): sigEnergyChanged = Signal(object) - def __init__(self, linePos=650, txtPosRatio=0.25, invertX=True, *args, **kwargs): + def __init__(self, linePos=650, txtPosRatio=0.3, invertX=True, *args, **kwargs): """ A widget to display a 1D spectrum :param linePos: the initial position of the InfiniteLine @@ -133,3 +134,129 @@ def plot(self, x, y, *args, **kwargs): self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) self.cross.setData([x_val], [y_val]) self.addItem(self.txt) + +class baselinePlotWidget(SpectraPlotWidget): + def __init__(self): + super(baselinePlotWidget, self).__init__() + self.line.setValue(800) + self.txt = TextItem('', anchor=(0, 0)) + self.cross = PlotDataItem([800], [0], symbolBrush=(255, 255, 0), symbolPen=(255, 255, 0), + symbol='+',symbolSize=20) + self.line.sigPositionChanged.connect(self.getMu) + self._mu = None + + def plot(self, x, y, *args, **kwargs): + # set up infinity line and get its position + self.plotItem.plot(x, y, *args, **kwargs) + self.addItem(self.line) + self.addItem(self.cross) + x_val = self.line.value() + if x_val == 0: + y_val = 0 + else: + idx = val2ind(x_val, self.wavenumbers) + x_val = self.wavenumbers[idx] + y_val = y[idx] + + if not self._meanSpec: + txt_html = f'
\ + Spectrum #{self.spectrumInd}
' + else: + txt_html = f'
\ + {self._mean_title}
' + + txt_html += f'
\ + X = {x_val: .2f}, Y = {y_val: .4f}
' + self.txt = TextItem(html=txt_html, anchor=(0, 0)) + ymax = np.max(y) + self._y = y + r = self.txtPosRatio + self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) + self.cross.setData([x_val], [y_val]) + self.addItem(self.txt) + + def getMu(self): + if self._mu is not None: + x_val = self.line.value() + if x_val == 0: + y_val = 0 + else: + idx = val2ind(x_val, self._x) + x_val = self._x[idx] + y_val = self._mu[idx] + txt_html = f'
\ + X = {x_val: .2f}, Y = {y_val: .4f}
' + self.txt.setHtml(txt_html) + self.cross.setData([x_val], [y_val]) + + def addDataCursor(self, x, y): + self.addItem(self.line) + self.addItem(self.cross) + ymax = np.max(y) + self.txt.setText('') + r = self.txtPosRatio + self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) + self.addItem(self.txt) + self.getMu() + + def clearAll(self): + # remove legend + _legend = self.plotItem.legend + if (_legend is not None) and (_legend.scene() is not None): + _legend.scene().removeItem(_legend) + self.clear() + + def plotBase(self, dataGroup, plotType='raw'): + """ + make plots for Larch Group object + :param dataGroup: Larch Group object + :return: + """ + # add legend + self.plotItem.addLegend(offset=(-1, -1)) + x = self._x = dataGroup.energy # self._x, self._mu for getEnergy + y = self._mu = dataGroup.specTrim + n = len(x) # array length + self._y = None # disable getEnergy func + if plotType == 'raw': + self.plotItem.plot(x, y, name='Raw', pen=mkPen('w', width=2)) + elif plotType == 'base': + self.plotItem.plot(x, y, name='Raw', pen=mkPen('w', width=2)) + self.plotItem.plot(x, dataGroup.rubberBaseline, name='Rubberband baseline', pen=mkPen('g', style=Qt.DotLine, width=2)) + self.plotItem.plot(dataGroup.wav_anchor, dataGroup.spec_anchor, symbol='o', symbolPen='r', symbolBrush=0.5) + elif plotType == 'rubberband': + y = self._mu = dataGroup.rubberDebased + self.plotItem.plot(x, y, name='Rubberband debased', pen=mkPen('r', width=2)) + elif plotType == 'deriv2': + y = self._mu = dataGroup.rubberDebased # for data cursor + scale, offset = self.alignTwoCurve(dataGroup.rubberDebased[n//4:n*3//4], dataGroup.deriv2[n//4:n*3//4]) + deriv2Scaled = dataGroup.deriv2 * scale + offset + ymin, ymax = np.min(y), np.max(y) + self.getViewBox().setYRange(ymin, ymax, padding=0.1) + self.plotItem.plot(x, y, name='Rubberband debased', pen=mkPen('r', width=2)) + self.plotItem.plot(x, deriv2Scaled, name='2nd derivative (scaled)', pen=mkPen('g', width=2)) + elif plotType == 'deriv4': + y = self._mu = dataGroup.rubberDebased + scale, offset = self.alignTwoCurve(dataGroup.rubberDebased[n//4:n*3//4], dataGroup.deriv4[n//4:n*3//4]) + deriv4Scaled = dataGroup.deriv4 * scale + offset + ymin, ymax = np.min(y), np.max(y) + self.getViewBox().setYRange(ymin, ymax, padding=0.1) + self.plotItem.plot(x, y, name='Rubberband debased', pen=mkPen('r', width=2)) + self.plotItem.plot(x, deriv4Scaled, name='4th derivative (normed, scaled)', pen=mkPen('g', width=2)) + # add infinityline, cross + self.addDataCursor(x, y) + + def alignTwoCurve(self, y1, y2): + """ + Align the scale of y2 to that of y1 + :param y1: the main curve + :param y2: the curve to be aligned + :return: + scale: scale factor + offset: y offset + """ + y1Range, y2Range = np.max(y1) - np.min(y1), np.max(y2) - np.min(y2) + scale = y1Range / y2Range + y = y2 * scale + offset = np.max(y1) - np.max(y) + return scale, offset \ No newline at end of file From 512bcc5b21269164047ff26ba6ea86deb51d61e6 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Tue, 5 May 2020 00:37:21 -0700 Subject: [PATCH 28/56] add 'error type' to isbaselineOK msgbox --- xicam/BSISB/widgets/preprocesswidget.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xicam/BSISB/widgets/preprocesswidget.py b/xicam/BSISB/widgets/preprocesswidget.py index 2bddf7a..e0fccdd 100644 --- a/xicam/BSISB/widgets/preprocesswidget.py +++ b/xicam/BSISB/widgets/preprocesswidget.py @@ -53,15 +53,15 @@ def isBaseFitOK(self, anchors, kind): # decide if num of anchor points is enough for 'quadratic' or 'cubic' fit if len(self.wav_anchor) < 2: MsgBox('Baseline fitting needs at least 2 anchor points.\n' + - 'Please add more "anchor points" to correctly fit the baseline.') + 'Please add more "anchor points" to correctly fit the baseline.', type='error') return False elif len(self.wav_anchor) < 3 and kind == 'quadratic': MsgBox('Quadratic baseline needs more than 2 anchor points.\n' + - 'Please add more "anchor points" to correctly fit the baseline.') + 'Please add more "anchor points" to correctly fit the baseline.', type='error') return False elif len(self.wav_anchor) < 4 and kind == 'cubic': MsgBox('Cubic baseline needs more than 3 anchor points.\n' + - 'Please add more "anchor points" to correctly fit the baseline.') + 'Please add more "anchor points" to correctly fit the baseline.', type='error') return False else: return True From 2dec52ffaa20205b9d59ac1a0001df74da57ff17 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 11 May 2020 10:40:04 -0700 Subject: [PATCH 29/56] hide mapToH5 stage for review --- xicam/BSISB/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index 0557f5e..7280c76 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -49,7 +49,7 @@ def __init__(self, *args, **kwargs): self.imageview = BSISBTabview(self.headermodel, self.selectionmodel, MapView, 'image') self.imageview.currentChanged.connect(self.updateTab) - self.stages = {"MapToH5": GUILayout(self.mapToH5), + self.stages = {#"MapToH5": GUILayout(self.mapToH5), "Image View": GUILayout(self.imageview), "Preprocess": GUILayout(self.preprocess), "Factor Analysis": GUILayout(self.FA_widget)} From 07fb319b110f282fb55bc4a297f3f7ea61a9b6e4 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 25 May 2020 18:16:23 -0700 Subject: [PATCH 30/56] change fonts and button names in FA widget --- xicam/BSISB/widgets/clusteringwidget.py | 262 +++++++++++++++++++++ xicam/BSISB/widgets/factorizationwidget.py | 52 ++-- 2 files changed, 300 insertions(+), 14 deletions(-) create mode 100644 xicam/BSISB/widgets/clusteringwidget.py diff --git a/xicam/BSISB/widgets/clusteringwidget.py b/xicam/BSISB/widgets/clusteringwidget.py new file mode 100644 index 0000000..87b8262 --- /dev/null +++ b/xicam/BSISB/widgets/clusteringwidget.py @@ -0,0 +1,262 @@ +import os +import numpy as np +import pandas as pd +from umap import UMAP +from sklearn import cluster +from functools import partial +from qtpy.QtWidgets import * +from qtpy.QtCore import Qt, QItemSelectionModel, Signal +from qtpy.QtGui import QStandardItemModel, QStandardItem, QFont +from pyqtgraph.parametertree import ParameterTree, Parameter +from xicam.core import msg +from lbl_ir.data_objects.ir_map import val2ind +from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget +from xicam.BSISB.widgets.imshowwidget import SlimImageView +from xicam.BSISB.widgets.uiwidget import MsgBox, YesNoDialog + + +class ClusteringParameters(ParameterTree): + sigParamChanged = Signal(object) + + def __init__(self): + super(ClusteringParameters, self).__init__() + + self.parameter = Parameter(name='params', type='group', + children=[{'name': "Embedding", + 'values': ['PCA', 'UMAP'], + 'value': 'UMAP', + 'type': 'list'}, + {'name': "Components", + 'value': 2, + 'type': 'int'}, + {'name': "Neighbors", + 'value': 15, + 'type': 'int'}, + {'name': "Min Dist", + 'value': 0.1, + 'type': 'float'}, + {'name': "Metric", + 'values': ['euclidean', 'manhattan', 'correlation'], + 'value': 'euclidean', + 'type': 'list'}, + {'name': "Normalization", + 'values': ['L2', 'L1', 'None'], + 'value': 'L2', + 'type': 'list'}, + {'name': "Wavenumber Range", + 'value': '400, 4000', + 'type': 'str'}, + {'name': "Clusters", + 'value': 3, + 'type': 'int'}, + {'name': "X Component", + 'values': [1, 2, 3, 4], + 'value': 1, + 'type': 'list'}, + {'name': "Y Component", + 'values': [1, 2, 3, 4], + 'value': 2, + 'type': 'list'} + ]) + self.setParameters(self.parameter, showTop=False) + self.setIndentation(0) + # change Fonts + self.fontSize = 12 + font = QFont("Helvetica [Cronyx]", self.fontSize) + boldFont = QFont("Helvetica [Cronyx]", self.fontSize, QFont.Bold) + self.header().setFont(font) + for item in self.listAllItems(): + if hasattr(item, 'widget'): + item.setFont(0, boldFont) + item.widget.setFont(font) + item.displayLabel.setFont(font) + item.widget.setMaximumHeight(40) + + # connect signals + self.parameter.child('Embedding').sigValueChanged.connect(self.updateMethod) + self.parameter.child('Components').sigValueChanged.connect(self.setComponents) + + def updateMethod(self): + """ + Toggle parameter menu based on embedding method + :return: None + """ + if self.parameter["Embedding"] == 'UMAP': + self.parameter.child('Neighbors').show() + self.parameter.child('Min Dist').show() + self.parameter.child('Metric').show() + self.parameter.child('Normalization').hide() + else: + self.parameter.child('Neighbors').hide() + self.parameter.child('Min Dist').hide() + self.parameter.child('Metric').hide() + self.parameter.child('Normalization').show() + + def setComponents(self): + N = self.parameter['Components'] + for entry in ['X Component', 'Y Component']: + param = self.parameter.child(entry) + param.setLimits(list(range(1, N + 1))) + + +class ScatterPlotWidget(SpectraPlotWidget): + def __init__(self): + super(ScatterPlotWidget, self).__init__(invertX=False) + self.scene().sigMouseClicked.connect(self.getMousePos) + self.line.hide() + + def getMousePos(self, event): + pos = event.pos() + if self.getViewBox().sceneBoundingRect().contains(pos): + mousePoint = self.getViewBox().mapSceneToView(pos) + x, y = mousePoint.x(), mousePoint.y() + + +class ClusteringWidget(QSplitter): + def __init__(self, headermodel, selectionmodel): + super(ClusteringWidget, self).__init__() + self.headermodel = headermodel + self.mapselectmodel = selectionmodel + self.selectMapidx = 0 + + # split between cluster image and scatter plot + self.image_and_scatter = QSplitter() + # split between image&scatter and spec plot, vertical split + self.leftsplitter = QSplitter() + self.leftsplitter.setOrientation(Qt.Vertical) + # split between params, buttons and map list, vertical split + self.rightsplitter = QSplitter() + self.rightsplitter.setOrientation(Qt.Vertical) + + self.clusterImage = SlimImageView() + self.clusterScatterPlot = ScatterPlotWidget() + self.rawSpecPlot = SpectraPlotWidget() + self.clusterMeanPlot = SpectraPlotWidget() + + # ParameterTree + self.parametertree = ClusteringParameters() + self.parameter = self.parametertree.parameter + + # buttons layout + self.buttons = QWidget() + self.buttonlayout = QGridLayout() + self.buttons.setLayout(self.buttonlayout) + # set up buttons + self.fontSize = 12 + font = QFont("Helvetica [Cronyx]", self.fontSize) + self.computeBtn = QPushButton() + self.computeBtn.setText('Compute clusters') + self.computeBtn.setFont(font) + self.removeBtn = QPushButton() + self.removeBtn.setText('Remove spectra') + self.removeBtn.setFont(font) + # add all buttons + self.buttonlayout.addWidget(self.computeBtn) + self.buttonlayout.addWidget(self.removeBtn) + + # Headers listview + self.headerlistview = QListView() + self.headerlistview.setModel(headermodel) + self.headerlistview.setSelectionModel(selectionmodel) # This might do weird things in the map view? + self.headerlistview.setSelectionMode(QListView.SingleSelection) + + # assemble widgets + self.image_and_scatter.addWidget(self.clusterImage) + self.image_and_scatter.addWidget(self.clusterScatterPlot) + self.leftsplitter.addWidget(self.image_and_scatter) + self.leftsplitter.addWidget(self.rawSpecPlot) + self.leftsplitter.addWidget(self.clusterMeanPlot) + self.leftsplitter.setSizes([200, 50, 50]) + self.rightsplitter.addWidget(self.parametertree) + self.rightsplitter.addWidget(self.buttons) + self.rightsplitter.addWidget(self.headerlistview) + self.rightsplitter.setSizes([200, 50, 50]) + self.addWidget(self.leftsplitter) + self.addWidget(self.rightsplitter) + self.setSizes([500, 100]) + + # Connect signals + self.computeBtn.clicked.connect(self.computeCluster) + self.removeBtn.clicked.connect(self.removeSpec) + + def computeCluster(self): + # get current map idx + if not self.isMapOpen(): + return + # Select wavenumber region + wavROIList = [] + for entry in self.parameter['Wavenumber Range'].split(','): + try: + wavROIList.append(val2ind(int(entry), self.wavenumbers)) + except: + continue + if len(wavROIList) % 2 == 0: + wavROIList = sorted(wavROIList) + wavROIidx = [] + for i in range(len(wavROIList) // 2): + wavROIidx += list(range(wavROIList[2 * i], wavROIList[2 * i + 1] + 1)) + else: + msg.logMessage('"Wavenumber Range" values must be in pairs', msg.ERROR) + MsgBox('Clustering computation aborted.', 'error') + return + self.wavenumbers_select = self.wavenumbers[wavROIidx] + self.N_w = len(self.wavenumbers_select) + # get current dataset + n_spectra = len(self.data) + self.dataset = np.zeros((n_spectra, self.N_w)) + for i in range(n_spectra): + self.dataset[i, :] = self.data[i][wavROIidx] + # get parameters and compute embedding + n_components = self.parameter['Components'] + if self.parameter['Embedding'] == 'UMAP': + n_neighbors = self.parameter['Neighbors'] + metric = self.parameter['Metric'] + min_dist = np.clip(self.parameter['Min Dist'], 0, 1) + self.umap = UMAP(n_neighbors=n_neighbors, + min_dist=min_dist, + n_components=n_components, + metric=metric) + self.low_dim = self.umap.fit_transform(self.dataset) + elif self.parameter['Embedding'] == 'PCA': + pass + + def removeSpec(self): + pass + + def setHeader(self, field: str): + self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] + self.field = field + self.wavenumberList = [] + self.imgShapes = [] + self.rc2indList = [] + self.ind2rcList = [] + self.dataSets = [] + + # get wavenumbers, imgShapes, rc2ind + for header in self.headers: + dataEvent = next(header.events(fields=[field])) + self.wavenumberList.append(dataEvent['wavenumbers']) + self.imgShapes.append(dataEvent['imgShape']) + self.rc2indList.append(dataEvent['rc_index']) + self.ind2rcList.append(dataEvent['index_rc']) + # get raw spectra + data = None + try: # spectra datasets + data = header.meta_array('spectra') + except IndexError: + msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) + if data is not None: + self.dataSets.append(data) + + def isMapOpen(self): + if not self.mapselectmodel.selectedIndexes(): # no map is open + return False + else: + self.selectMapidx = self.mapselectmodel.selectedIndexes()[0].row() + # get current data + self.wavenumbers = self.wavenumberList[self.selectMapidx] + self.rc2ind = self.rc2indList[self.selectMapidx] + self.ind2rc = self.ind2rcList[self.selectMapidx] + self.imgShape = self.imgShapes[self.selectMapidx] + self.data = self.dataSets[self.selectMapidx] + return True diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index bb9ebc1..8c94b77 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -1,8 +1,8 @@ -from qtpy.QtWidgets import QSplitter, QGridLayout, QWidget, QListView +from qtpy.QtWidgets import * from xicam.core import msg from pyqtgraph import PlotWidget, PlotDataItem, TextItem, mkPen, InfiniteLine, ImageItem, PolyLineROI from qtpy.QtCore import Qt, QItemSelectionModel -from qtpy.QtGui import QStandardItemModel +from qtpy.QtGui import QStandardItemModel, QFont from functools import partial from qtpy.QtCore import Signal from pymcr.mcr import McrAR @@ -35,7 +35,7 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti 'values': ['PCA', 'NMF', 'MCR'], 'value': 'PCA', 'type': 'list'}, - {'name': "# of Components", + {'name': "Components", 'value': 4, 'type': 'int'}, {'name': "Calculate", @@ -56,7 +56,7 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti 'values': [1, 2, 3, 4], 'value': 4, 'type': 'list'}, - {'name': "Wavenumber ROI", + {'name': "Wavenumber Range", 'value': '800,1800', 'type': 'str'}, {'name': "Normalization", @@ -76,10 +76,21 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti #constants self.method = 'PCA' self.field = 'spectra' - + # change Fonts + self.fontSize = 12 + font = QFont("Helvetica [Cronyx]", self.fontSize) + boldFont = QFont("Helvetica [Cronyx]", self.fontSize, QFont.Bold) + self.header().setFont(font) + for item in self.listAllItems(): + if hasattr(item, 'widget'): + item.setFont(0, boldFont) + item.widget.setFont(font) + item.displayLabel.setFont(font) + item.widget.setMaximumHeight(40) + # connect signals self.parameter.child('Calculate').sigActivated.connect(self.calculate) self.parameter.child('Save results').sigActivated.connect(self.saveResults) - self.parameter.child('# of Components').sigValueChanged.connect(self.setNumComponents) + self.parameter.child('Components').sigValueChanged.connect(self.setNumComponents) self.parameter.child('Method').sigValueChanged.connect(self.setMethod) self.parameter.child('C regressor').hide() @@ -127,7 +138,7 @@ def setHeader(self, wavenumbers, imgShapes, rc2indList, ind2rcList): self._dataSets['volume'].append(path) def setNumComponents(self): - N = self.parameter['# of Components'] + N = self.parameter['Components'] for i in range(4): param = self.parameter.child(f'Map {i + 1} Component') @@ -135,11 +146,11 @@ def setNumComponents(self): def calculate(self): - N = self.parameter['# of Components'] + N = self.parameter['Components'] if hasattr(self, '_dataSets'): wavROIList = [] - for entry in self.parameter['Wavenumber ROI'].split(','): + for entry in self.parameter['Wavenumber Range'].split(','): try: wavROIList.append(val2ind(int(entry), self.wavenumbers)) except: @@ -151,7 +162,7 @@ def calculate(self): for i in range(len(wavROIList) // 2): wavROIidx += list(range(wavROIList[2 * i], wavROIList[2 * i + 1] + 1)) else: - msg.logMessage('"Wavenumber ROI" values must be in pairs', msg.ERROR) + msg.logMessage('"Wavenumber Range" values must be in pairs', msg.ERROR) MsgBox('Factorization computation aborted.', 'error') return @@ -287,7 +298,7 @@ def popup_plots(self): ax = plt.gca() ax.set_ylabel('Explained variance ratio', fontsize=16) ax.set_xlabel('Component number', fontsize=16) - ax.set_xticks(np.arange(self.parameter['# of Components'])) + ax.set_xticks(np.arange(self.parameter['Components'])) # loadings plot plt.figure() labels = [] @@ -446,7 +457,6 @@ def __init__(self, headermodel, selectionmodel): partial(self.updateComponents, i)) self.addWidget(self.display) - self.rightsplitter.addWidget(self.parametertree) self.addWidget(self.rightsplitter) self.display.addWidget(self.gridwidget) self.display.addWidget(self.componentSpectra) @@ -463,8 +473,22 @@ def __init__(self, headermodel, selectionmodel): self.headerlistview = QListView() self.headerlistview.setModel(headermodel) self.headerlistview.setSelectionModel(selectionmodel) # This might do weird things in the map view? - self.rightsplitter.addWidget(self.headerlistview) self.headerlistview.setSelectionMode(QListView.SingleSelection) + # add title to list view + self.fontSize = 12 + font = QFont("Helvetica [Cronyx]", self.fontSize) + self.mapListWidget = QWidget() + self.listLayout = QVBoxLayout() + self.mapListWidget.setLayout(self.listLayout) + mapListTitle = QLabel('Maps list') + mapListTitle.setFont(font) + self.listLayout.addWidget(mapListTitle) + self.listLayout.addWidget(self.headerlistview) + + # adjust right splitter + self.rightsplitter.addWidget(self.parametertree) + self.rightsplitter.addWidget(self.mapListWidget) + self.rightsplitter.setSizes([200, 50]) def updateRoiMask(self): if self.selectionmodel.hasSelection(): @@ -576,7 +600,7 @@ def showComponents(self, fac_obj): # show score plots self.drawMap(component_index, i) # update the last image and loading plots as a recalculation complete signal - N = self.parameter['# of Components'] + N = self.parameter['Components'] self.parameter.child(f'Map 4 Component').setValue(N) # clear maps else: From bad8f4a7adbbf3a9ec0b0cce636dd44f3d3e49c4 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 25 May 2020 18:17:42 -0700 Subject: [PATCH 31/56] add cleanup func in preprocess --- xicam/BSISB/widgets/preprocesswidget.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/xicam/BSISB/widgets/preprocesswidget.py b/xicam/BSISB/widgets/preprocesswidget.py index e0fccdd..0f1b490 100644 --- a/xicam/BSISB/widgets/preprocesswidget.py +++ b/xicam/BSISB/widgets/preprocesswidget.py @@ -342,8 +342,6 @@ def getCurrentSpecid(self): specidx = currentSpecItem.idx return specidx - - def updateSpecPlot(self): # get current map idx and selected spectrum idx specidx = self.getCurrentSpecid() @@ -444,6 +442,12 @@ def removeSpec(self): self.resultSpectra.clearAll() self.infoBox.setText('') + def cleanUp(self): + self.specItemModel.clear() + self.rawSpectra.clearAll() + self.resultSpectra.clearAll() + self.infoBox.setText('') + def batchProcess(self): # get current map idx if not self.isMapOpen(): From ea3c18b6d2da509df909c7821e8f3f80fe88206b Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 25 May 2020 18:18:24 -0700 Subject: [PATCH 32/56] add clustering widget --- xicam/BSISB/__init__.py | 15 +- xicam/BSISB/widgets/clusteringwidget.py | 234 +++++++++++++++++++++--- 2 files changed, 213 insertions(+), 36 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index 7280c76..dbc41f2 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -9,6 +9,7 @@ from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget from xicam.BSISB.widgets.factorizationwidget import FactorizationWidget from xicam.BSISB.widgets.preprocesswidget import PreprocessWidget +from xicam.BSISB.widgets.clusteringwidget import ClusteringWidget from xicam.plugins import GUIPlugin, GUILayout from xicam.gui.widgets.tabview import TabView @@ -41,6 +42,7 @@ def __init__(self, *args, **kwargs): self.selectionmodel = QItemSelectionModel(self.headermodel) self.preprocess = PreprocessWidget(self.headermodel, self.selectionmodel) self.FA_widget = FactorizationWidget(self.headermodel, self.selectionmodel) + self.clusterwidget = ClusteringWidget(self.headermodel, self.selectionmodel) # update headers list when a tab window is closed self.headermodel.rowsRemoved.connect(partial(self.FA_widget.setHeader, 'spectra')) @@ -52,8 +54,8 @@ def __init__(self, *args, **kwargs): self.stages = {#"MapToH5": GUILayout(self.mapToH5), "Image View": GUILayout(self.imageview), "Preprocess": GUILayout(self.preprocess), - "Factor Analysis": GUILayout(self.FA_widget)} - # "NMF": GUILayout(self.NMF_widget)} + "Factor Analysis": GUILayout(self.FA_widget), + "Clustering": GUILayout(self.clusterwidget)} super(BSISB, self).__init__(*args, **kwargs) def appendHeader(self, header: NonDBHeader, **kwargs): @@ -85,6 +87,7 @@ def appendHeader(self, header: NonDBHeader, **kwargs): self.preprocess.setHeader(field='spectra') self.FA_widget.setHeader(field='spectra') + self.clusterwidget.setHeader(field='spectra') for i in range(4): self.FA_widget.roiList[i].sigRegionChangeFinished.connect(self.updateROI) @@ -111,8 +114,6 @@ def updateROI(self, roi): self.imageview.widget(selectMapIdx).roiMove(roi) def updateTab(self): - # clear specItemModel - self.preprocess.specItemModel.clear() - self.preprocess.rawSpectra.clearAll() - self.preprocess.resultSpectra.clearAll() - self.preprocess.infoBox.setText('') \ No newline at end of file + # clean up all widgets + self.preprocess.cleanUp() + self.clusterwidget.cleanUp() diff --git a/xicam/BSISB/widgets/clusteringwidget.py b/xicam/BSISB/widgets/clusteringwidget.py index 87b8262..532c94d 100644 --- a/xicam/BSISB/widgets/clusteringwidget.py +++ b/xicam/BSISB/widgets/clusteringwidget.py @@ -1,18 +1,19 @@ -import os -import numpy as np -import pandas as pd -from umap import UMAP -from sklearn import cluster from functools import partial -from qtpy.QtWidgets import * -from qtpy.QtCore import Qt, QItemSelectionModel, Signal -from qtpy.QtGui import QStandardItemModel, QStandardItem, QFont -from pyqtgraph.parametertree import ParameterTree, Parameter -from xicam.core import msg +import numpy as np from lbl_ir.data_objects.ir_map import val2ind +from matplotlib import cm +from pyqtgraph import TextItem, mkBrush, mkPen +from pyqtgraph.parametertree import ParameterTree, Parameter +from qtpy.QtCore import Qt, Signal +from qtpy.QtGui import QFont +from qtpy.QtWidgets import * +from sklearn.cluster import KMeans +from sklearn.neighbors import NearestNeighbors +from umap import UMAP +from xicam.BSISB.widgets.mapviewwidget import MapViewWidget, toHtml from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget -from xicam.BSISB.widgets.imshowwidget import SlimImageView -from xicam.BSISB.widgets.uiwidget import MsgBox, YesNoDialog +from xicam.BSISB.widgets.uiwidget import MsgBox +from xicam.core import msg class ClusteringParameters(ParameterTree): @@ -27,7 +28,7 @@ def __init__(self): 'value': 'UMAP', 'type': 'list'}, {'name': "Components", - 'value': 2, + 'value': 3, 'type': 'int'}, {'name': "Neighbors", 'value': 15, @@ -50,16 +51,17 @@ def __init__(self): 'value': 3, 'type': 'int'}, {'name': "X Component", - 'values': [1, 2, 3, 4], + 'values': [1, 2, 3], 'value': 1, 'type': 'list'}, {'name': "Y Component", - 'values': [1, 2, 3, 4], + 'values': [1, 2, 3], 'value': 2, 'type': 'list'} ]) self.setParameters(self.parameter, showTop=False) self.setIndentation(0) + self.parameter.child('Normalization').hide() # change Fonts self.fontSize = 12 font = QFont("Helvetica [Cronyx]", self.fontSize) @@ -75,6 +77,8 @@ def __init__(self): # connect signals self.parameter.child('Embedding').sigValueChanged.connect(self.updateMethod) self.parameter.child('Components').sigValueChanged.connect(self.setComponents) + for entry in ['Components', 'Clusters', 'X Component', 'Y Component']: + self.parameter.child(entry).sigValueChanged.connect(partial(self.updateClusterParams, entry)) def updateMethod(self): """ @@ -98,26 +102,92 @@ def setComponents(self): param = self.parameter.child(entry) param.setLimits(list(range(1, N + 1))) + def updateClusterParams(self, name): + self.sigParamChanged.emit(name) class ScatterPlotWidget(SpectraPlotWidget): + sigScatterClicked = Signal(object) + def __init__(self): - super(ScatterPlotWidget, self).__init__(invertX=False) - self.scene().sigMouseClicked.connect(self.getMousePos) + super(ScatterPlotWidget, self).__init__(invertX=False, linePos=0) + self.scene().sigMouseClicked.connect(self.setCrossPos) self.line.hide() + self.scatterData = None + self.nbr = None - def getMousePos(self, event): + def setCrossPos(self, event): pos = event.pos() - if self.getViewBox().sceneBoundingRect().contains(pos): - mousePoint = self.getViewBox().mapSceneToView(pos) + if (self.getViewBox().sceneBoundingRect().contains(pos)) and (self.scatterData is not None): + mousePoint = self.getViewBox().mapToView(pos) x, y = mousePoint.x(), mousePoint.y() + _, ind = self.nbr.kneighbors(np.array([[x, y]])) + self.cross.setData(self.scatterData[ind[0], 0], self.scatterData[ind[0], 1]) + self.sigScatterClicked.emit(ind[0, 0]) + + def clickFromImage(self, ind): + self.cross.setData([self.scatterData[ind, 0]], [self.scatterData[ind, 1]]) + + def getNN(self): + msg.showMessage('Training NearestNeighbors model in scatter plot.') + self.nbr = NearestNeighbors(n_neighbors=1, algorithm='auto').fit(self.scatterData) + msg.showMessage('NearestNeighbors model training is finished.') + +class ClusterSpectraWidget(SpectraPlotWidget): + def __init__(self): + super(ClusterSpectraWidget, self).__init__() + + def getEnergy(self, lineobject): + if self._y is not None: + x_val = lineobject.value() + idx = val2ind(x_val, self.wavenumbers) + x_val = self.wavenumbers[idx] + y_val = self._y[idx] + txt_html = toHtml(f'Cluster #{self.spectrumInd}') + txt_html += toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') + self.txt.setHtml(txt_html) + self.cross.setData([x_val], [y_val]) + + def setColors(self, colorLUT): + self.colorLUT = colorLUT + + def showClusterSpectra(self, i=0): + if (self._data is not None) and (i < len(self._data)): + self.clear() + self.spectrumInd = i + self.plot(self.wavenumbers, self._data[i], pen=mkPen(self.colorLUT[i], width=4)) + def plot(self, x, y, *args, **kwargs): + # set up infinity line and get its position + self.plotItem.plot(x, y, *args, **kwargs) + self.addItem(self.line) + self.addItem(self.cross) + x_val = self.line.value() + if x_val == 0: + y_val = 0 + else: + idx = val2ind(x_val, self.wavenumbers) + x_val = self.wavenumbers[idx] + y_val = y[idx] + txt_html = toHtml(f'Cluster #{self.spectrumInd}') + txt_html += toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') + self.txt = TextItem(html=txt_html, anchor=(0, 0)) + ymax = np.max(y) + self._y = y + r = self.txtPosRatio + self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) + self.cross.setData([x_val], [y_val]) + self.addItem(self.txt) class ClusteringWidget(QSplitter): def __init__(self, headermodel, selectionmodel): super(ClusteringWidget, self).__init__() self.headermodel = headermodel self.mapselectmodel = selectionmodel + # init some values self.selectMapidx = 0 + self.low_dim = None + self.labels = None + self.mean_spectra = None # split between cluster image and scatter plot self.image_and_scatter = QSplitter() @@ -128,10 +198,10 @@ def __init__(self, headermodel, selectionmodel): self.rightsplitter = QSplitter() self.rightsplitter.setOrientation(Qt.Vertical) - self.clusterImage = SlimImageView() + self.clusterImage = MapViewWidget() self.clusterScatterPlot = ScatterPlotWidget() self.rawSpecPlot = SpectraPlotWidget() - self.clusterMeanPlot = SpectraPlotWidget() + self.clusterMeanPlot = ClusterSpectraWidget() # ParameterTree self.parametertree = ClusteringParameters() @@ -152,13 +222,21 @@ def __init__(self, headermodel, selectionmodel): self.removeBtn.setFont(font) # add all buttons self.buttonlayout.addWidget(self.computeBtn) - self.buttonlayout.addWidget(self.removeBtn) + # self.buttonlayout.addWidget(self.removeBtn) # Headers listview self.headerlistview = QListView() self.headerlistview.setModel(headermodel) self.headerlistview.setSelectionModel(selectionmodel) # This might do weird things in the map view? self.headerlistview.setSelectionMode(QListView.SingleSelection) + # add title to list view + self.mapListWidget = QWidget() + self.listLayout = QVBoxLayout() + self.mapListWidget.setLayout(self.listLayout) + mapListTitle = QLabel('Maps list') + mapListTitle.setFont(font) + self.listLayout.addWidget(mapListTitle) + self.listLayout.addWidget(self.headerlistview) # assemble widgets self.image_and_scatter.addWidget(self.clusterImage) @@ -169,20 +247,28 @@ def __init__(self, headermodel, selectionmodel): self.leftsplitter.setSizes([200, 50, 50]) self.rightsplitter.addWidget(self.parametertree) self.rightsplitter.addWidget(self.buttons) - self.rightsplitter.addWidget(self.headerlistview) + self.rightsplitter.addWidget(self.mapListWidget) self.rightsplitter.setSizes([200, 50, 50]) self.addWidget(self.leftsplitter) self.addWidget(self.rightsplitter) self.setSizes([500, 100]) # Connect signals - self.computeBtn.clicked.connect(self.computeCluster) + self.computeBtn.clicked.connect(self.computeEmbedding) self.removeBtn.clicked.connect(self.removeSpec) + self.clusterImage.sigShowSpectra.connect(self.rawSpecPlot.showSpectra) + self.clusterImage.sigShowSpectra.connect(self.showClusterMean) + self.clusterImage.sigShowSpectra.connect(self.clusterScatterPlot.clickFromImage) + self.clusterScatterPlot.sigScatterClicked.connect(self.rawSpecPlot.showSpectra) + self.clusterScatterPlot.sigScatterClicked.connect(self.showClusterMean) + self.clusterScatterPlot.sigScatterClicked.connect(self.setImageCross) + self.parametertree.sigParamChanged.connect(self.updateClusterParams) - def computeCluster(self): + def computeEmbedding(self): # get current map idx if not self.isMapOpen(): return + msg.showMessage('Compute embedding.') # Select wavenumber region wavROIList = [] for entry in self.parameter['Wavenumber Range'].split(','): @@ -213,16 +299,100 @@ def computeCluster(self): metric = self.parameter['Metric'] min_dist = np.clip(self.parameter['Min Dist'], 0, 1) self.umap = UMAP(n_neighbors=n_neighbors, - min_dist=min_dist, - n_components=n_components, - metric=metric) + min_dist=min_dist, + n_components=n_components, + metric=metric, + random_state=0) self.low_dim = self.umap.fit_transform(self.dataset) elif self.parameter['Embedding'] == 'PCA': pass + # update cluster map + self.computeCluster() + + def computeCluster(self): + # check if embeddings exist + if self.low_dim is None: + return + msg.showMessage('Compute clusters.') + # get num of clusters + n_clusters = self.parameter['Clusters'] + # set colorLUT + self.colorLUT = cm.get_cmap('viridis', n_clusters).colors[:, :3] * 255 + # compute cluster + cluster_object = KMeans(n_clusters=n_clusters, random_state=0).fit(self.low_dim) + self.labels = cluster_object.labels_ + # update cluster image + self.cluster_map = self.labels.reshape(self.imgShape[0], self.imgShape[1]) + self.cluster_map = np.flipud(self.cluster_map) + self.clusterImage.setImage(self.cluster_map, levels=[0, n_clusters-1]) + # self.clusterImage.setImage(self.cluster_map) + self.clusterImage._image = self.cluster_map + self.clusterImage.rc2ind = self.rc2ind + self.clusterImage.row, self.clusterImage.col = self.imgShape[0], self.imgShape[1] + self.clusterImage.txt.setPos(self.clusterImage.col, 0) + self.clusterImage.cross.show() + #update cluster mean + mean_spectra = [] + for ii in range(n_clusters): + sel = (self.labels == ii) + this_mean = np.mean(self.dataset[sel, :], axis=0) + mean_spectra.append(this_mean) + self.mean_spectra = np.vstack(mean_spectra) + self.clusterMeanPlot.setColors(self.colorLUT) + self.clusterMeanPlot._data = self.mean_spectra + self.clusterMeanPlot.wavenumbers = self.wavenumbers_select + # update scatter plot + self.updateScatterPlot() + + def updateScatterPlot(self): + if (self.low_dim is None) or (self.labels is None): + return + # get scatter x, y values + self.clusterScatterPlot.scatterData = self.low_dim[:, [self.parameter['X Component'] - 1, self.parameter['Y Component'] - 1]] + # get colormapings + brushes = [mkBrush(self.colorLUT[x, :]) for x in self.labels] + # make plots + if hasattr(self, 'scatterPlot'): + self.clusterScatterPlot.removeItem(self.scatterPlot) + self.scatterPlot = self.clusterScatterPlot.plotItem.plot(self.clusterScatterPlot.scatterData, pen=None, symbol='o', symbolBrush=brushes) + self.clusterScatterPlot.getViewBox().autoRange(padding=0.1) + self.clusterScatterPlot.getNN() + + def updateClusterParams(self, name): + if name == 'Components': + self.computeEmbedding() + elif name == 'Clusters': + self.computeCluster() + elif name in ['X Component', 'Y Component']: + self.updateScatterPlot() + + def showClusterMean(self, i): + if self.mean_spectra is None: + return + self.clusterMeanPlot.showClusterSpectra(self.labels[i]) + + def setImageCross(self, ind): + row, col = self.ind2rc[ind] + # update cross + self.clusterImage.cross.setData([col + 0.5], [self.imgShape[0] - row - 0.5],) + # update text + self.clusterImage.txt.setHtml(toHtml(f'Point: #{ind}', size=8) + + toHtml(f'X: {col}', size=8) + + toHtml(f'Y: {row}', size=8) + + toHtml(f'Val: {self.clusterImage._image[self.imgShape[0] - row -1, col] :d}', size=8)) def removeSpec(self): pass + def cleanUp(self): + if hasattr(self, 'imgShape'): + img = np.zeros((self.imgShape[0], self.imgShape[1])) + self.clusterImage.setImage(img=img) + if hasattr(self, 'scatterPlot'): + self.clusterScatterPlot.removeItem(self.scatterPlot) + self.rawSpecPlot.clear() + self.clusterMeanPlot.clear() + def setHeader(self, field: str): self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] self.field = field @@ -247,6 +417,7 @@ def setHeader(self, field: str): msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) if data is not None: self.dataSets.append(data) + self.isMapOpen() def isMapOpen(self): if not self.mapselectmodel.selectedIndexes(): # no map is open @@ -254,9 +425,14 @@ def isMapOpen(self): else: self.selectMapidx = self.mapselectmodel.selectedIndexes()[0].row() # get current data + self.currentHeader = self.headers[self.selectMapidx] self.wavenumbers = self.wavenumberList[self.selectMapidx] self.rc2ind = self.rc2indList[self.selectMapidx] self.ind2rc = self.ind2rcList[self.selectMapidx] self.imgShape = self.imgShapes[self.selectMapidx] self.data = self.dataSets[self.selectMapidx] + self.rawSpecPlot.setHeader(self.currentHeader, 'spectra') + # reset custer image + img = np.zeros((self.imgShape[0], self.imgShape[1])) + self.clusterImage.setImage(img=img) return True From 39b8268ae7ccd70e2ea96142fec5a1235a08f809 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Tue, 26 May 2020 13:05:35 -0700 Subject: [PATCH 33/56] change scatter plot mouseClick to mouseMove --- xicam/BSISB/widgets/clusteringwidget.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/xicam/BSISB/widgets/clusteringwidget.py b/xicam/BSISB/widgets/clusteringwidget.py index 532c94d..5a6e814 100644 --- a/xicam/BSISB/widgets/clusteringwidget.py +++ b/xicam/BSISB/widgets/clusteringwidget.py @@ -110,7 +110,8 @@ class ScatterPlotWidget(SpectraPlotWidget): def __init__(self): super(ScatterPlotWidget, self).__init__(invertX=False, linePos=0) - self.scene().sigMouseClicked.connect(self.setCrossPos) + # self.scene().sigMouseClicked.connect(self.setCrossPos) + self.scene().sigMouseMoved.connect(self.moveCrossPos) self.line.hide() self.scatterData = None self.nbr = None @@ -121,6 +122,16 @@ def setCrossPos(self, event): mousePoint = self.getViewBox().mapToView(pos) x, y = mousePoint.x(), mousePoint.y() _, ind = self.nbr.kneighbors(np.array([[x, y]])) + self.addItem(self.cross) + self.cross.setData(self.scatterData[ind[0], 0], self.scatterData[ind[0], 1]) + self.sigScatterClicked.emit(ind[0, 0]) + + def moveCrossPos(self, pos): + if (self.getViewBox().sceneBoundingRect().contains(pos)) and (self.scatterData is not None): + mousePoint = self.getViewBox().mapSceneToView(pos) + x, y = mousePoint.x(), mousePoint.y() + _, ind = self.nbr.kneighbors(np.array([[x, y]])) + self.addItem(self.cross) self.cross.setData(self.scatterData[ind[0], 0], self.scatterData[ind[0], 1]) self.sigScatterClicked.emit(ind[0, 0]) @@ -353,7 +364,7 @@ def updateScatterPlot(self): brushes = [mkBrush(self.colorLUT[x, :]) for x in self.labels] # make plots if hasattr(self, 'scatterPlot'): - self.clusterScatterPlot.removeItem(self.scatterPlot) + self.clusterScatterPlot.plotItem.clearPlots() self.scatterPlot = self.clusterScatterPlot.plotItem.plot(self.clusterScatterPlot.scatterData, pen=None, symbol='o', symbolBrush=brushes) self.clusterScatterPlot.getViewBox().autoRange(padding=0.1) self.clusterScatterPlot.getNN() @@ -389,7 +400,7 @@ def cleanUp(self): img = np.zeros((self.imgShape[0], self.imgShape[1])) self.clusterImage.setImage(img=img) if hasattr(self, 'scatterPlot'): - self.clusterScatterPlot.removeItem(self.scatterPlot) + self.clusterScatterPlot.plotItem.clearPlots() self.rawSpecPlot.clear() self.clusterMeanPlot.clear() @@ -432,7 +443,6 @@ def isMapOpen(self): self.imgShape = self.imgShapes[self.selectMapidx] self.data = self.dataSets[self.selectMapidx] self.rawSpecPlot.setHeader(self.currentHeader, 'spectra') - # reset custer image - img = np.zeros((self.imgShape[0], self.imgShape[1])) - self.clusterImage.setImage(img=img) + # reset custer image and plots + self.cleanUp() return True From cbeb8bc1f9822d5eaf554d0572ef71fdc59758a7 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 27 May 2020 10:40:38 -0700 Subject: [PATCH 34/56] add clearAll func --- xicam/BSISB/widgets/spectraplotwidget.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/xicam/BSISB/widgets/spectraplotwidget.py b/xicam/BSISB/widgets/spectraplotwidget.py index 7e598d3..9b03f9a 100644 --- a/xicam/BSISB/widgets/spectraplotwidget.py +++ b/xicam/BSISB/widgets/spectraplotwidget.py @@ -77,7 +77,7 @@ def setHeader(self, header: NonDBHeader, field: str, *args, **kwargs): def showSpectra(self, i=0): if (self._data is not None) and (i < len(self._data)): - self.clear() + self.getViewBox().clear() self._meanSpec = False self.spectrumInd = i self.plot(self.wavenumbers, self._data[i]) @@ -86,9 +86,16 @@ def getSelectedPixels(self, selectedPixels): self.selectedPixels = selectedPixels # print(selectedPixels) + def clearAll(self): + # remove legend + _legend = self.plotItem.legend + if (_legend is not None) and (_legend.scene() is not None): + _legend.scene().removeItem(_legend) + self.getViewBox().clear() + def showMeanSpectra(self): self._meanSpec = True - self.clear() + self.getViewBox().clear() if self.selectedPixels is not None: n_spectra = len(self.selectedPixels) tmp = np.zeros((n_spectra, self.N_w)) @@ -199,13 +206,6 @@ def addDataCursor(self, x, y): self.addItem(self.txt) self.getMu() - def clearAll(self): - # remove legend - _legend = self.plotItem.legend - if (_legend is not None) and (_legend.scene() is not None): - _legend.scene().removeItem(_legend) - self.clear() - def plotBase(self, dataGroup, plotType='raw'): """ make plots for Larch Group object From bd4f9fbd088dba626b39e35750cc5860f820b3ae Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 27 May 2020 10:50:24 -0700 Subject: [PATCH 35/56] show all cluster mean spectra and fix clearAll bug --- xicam/BSISB/widgets/clusteringwidget.py | 107 ++++++++++++++++-------- 1 file changed, 71 insertions(+), 36 deletions(-) diff --git a/xicam/BSISB/widgets/clusteringwidget.py b/xicam/BSISB/widgets/clusteringwidget.py index 5a6e814..3cb651d 100644 --- a/xicam/BSISB/widgets/clusteringwidget.py +++ b/xicam/BSISB/widgets/clusteringwidget.py @@ -105,6 +105,7 @@ def setComponents(self): def updateClusterParams(self, name): self.sigParamChanged.emit(name) + class ScatterPlotWidget(SpectraPlotWidget): sigScatterClicked = Signal(object) @@ -143,51 +144,81 @@ def getNN(self): self.nbr = NearestNeighbors(n_neighbors=1, algorithm='auto').fit(self.scatterData) msg.showMessage('NearestNeighbors model training is finished.') + class ClusterSpectraWidget(SpectraPlotWidget): def __init__(self): super(ClusterSpectraWidget, self).__init__() + self._x = None + self.ymax, self.zmax = 0, 100 + self._plots = [] - def getEnergy(self, lineobject): + def getEnergy(self): if self._y is not None: - x_val = lineobject.value() - idx = val2ind(x_val, self.wavenumbers) - x_val = self.wavenumbers[idx] + x_val = self.line.value() + idx = val2ind(x_val, self._x) + x_val = self._x[idx] y_val = self._y[idx] - txt_html = toHtml(f'Cluster #{self.spectrumInd}') - txt_html += toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') + txt_html = toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') self.txt.setHtml(txt_html) self.cross.setData([x_val], [y_val]) def setColors(self, colorLUT): - self.colorLUT = colorLUT - - def showClusterSpectra(self, i=0): - if (self._data is not None) and (i < len(self._data)): - self.clear() - self.spectrumInd = i - self.plot(self.wavenumbers, self._data[i], pen=mkPen(self.colorLUT[i], width=4)) + self.colorLUT = colorLUT.copy() + self.colorLUT[0, :] = np.ones(3) * 255 + + def plotClusterSpectra(self): + if self._data is not None: + if self._plots: + self.clearAll() + self._plots = [] + self.ymax = 0 + self.plotItem.addLegend(offset=(1, 1)) + self.nSpectra = len(self._data) + for i in range(self.nSpectra): + name = 'Cluster #' + str(i) + tmp = self.plot(self.wavenumbers, self._data[i], pen=mkPen(self.colorLUT[i], width=2), name=name) + tmp.curve.setClickable(True) + tmp.curve.sigClicked.connect(partial(self.curveHighLight, i)) + self._plots.append(tmp) + self.addItem(self.txt) + + def curveHighLight(self, k): + for i in range(self.nSpectra): + if i == k: + self._plots[i].setPen(mkPen(self.colorLUT[k], width=6)) + self._plots[i].setZValue(50) + else: + self._plots[i].setPen(mkPen(self.colorLUT[i], width=2)) + self._plots[i].setZValue(0) + self._x, self._y = self._plots[k].getData() + ymin, ymax = np.min(self._y), np.max(self._y) + self.getViewBox().setYRange(ymin, ymax, padding=0.1) + r = self.txtPosRatio + self.txt.setPos(r * self._x[-1] + (1 - r) * self._x[0], 0.95 * ymax) + self.getEnergy() def plot(self, x, y, *args, **kwargs): # set up infinity line and get its position - self.plotItem.plot(x, y, *args, **kwargs) + plot_item = self.plotItem.plot(x, y, *args, **kwargs) self.addItem(self.line) self.addItem(self.cross) x_val = self.line.value() - if x_val == 0: - y_val = 0 - else: - idx = val2ind(x_val, self.wavenumbers) - x_val = self.wavenumbers[idx] - y_val = y[idx] - txt_html = toHtml(f'Cluster #{self.spectrumInd}') - txt_html += toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') + idx = val2ind(x_val, x) + x_val = x[idx] + y_val = y[idx] + txt_html = toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') self.txt = TextItem(html=txt_html, anchor=(0, 0)) + self.txt.setZValue(self.zmax - 1) + self.cross.setData([x_val], [y_val]) + self.cross.setZValue(self.zmax) ymax = np.max(y) - self._y = y + if ymax > self.ymax: + self.ymax = ymax + self._x, self._y = x, y r = self.txtPosRatio self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) - self.cross.setData([x_val], [y_val]) - self.addItem(self.txt) + return plot_item + class ClusteringWidget(QSplitter): def __init__(self, headermodel, selectionmodel): @@ -335,14 +366,14 @@ def computeCluster(self): # update cluster image self.cluster_map = self.labels.reshape(self.imgShape[0], self.imgShape[1]) self.cluster_map = np.flipud(self.cluster_map) - self.clusterImage.setImage(self.cluster_map, levels=[0, n_clusters-1]) + self.clusterImage.setImage(self.cluster_map, levels=[0, n_clusters - 1]) # self.clusterImage.setImage(self.cluster_map) self.clusterImage._image = self.cluster_map self.clusterImage.rc2ind = self.rc2ind self.clusterImage.row, self.clusterImage.col = self.imgShape[0], self.imgShape[1] self.clusterImage.txt.setPos(self.clusterImage.col, 0) self.clusterImage.cross.show() - #update cluster mean + # update cluster mean mean_spectra = [] for ii in range(n_clusters): sel = (self.labels == ii) @@ -352,6 +383,7 @@ def computeCluster(self): self.clusterMeanPlot.setColors(self.colorLUT) self.clusterMeanPlot._data = self.mean_spectra self.clusterMeanPlot.wavenumbers = self.wavenumbers_select + self.clusterMeanPlot.plotClusterSpectra() # update scatter plot self.updateScatterPlot() @@ -359,13 +391,15 @@ def updateScatterPlot(self): if (self.low_dim is None) or (self.labels is None): return # get scatter x, y values - self.clusterScatterPlot.scatterData = self.low_dim[:, [self.parameter['X Component'] - 1, self.parameter['Y Component'] - 1]] + self.clusterScatterPlot.scatterData = self.low_dim[:, + [self.parameter['X Component'] - 1, self.parameter['Y Component'] - 1]] # get colormapings brushes = [mkBrush(self.colorLUT[x, :]) for x in self.labels] # make plots if hasattr(self, 'scatterPlot'): self.clusterScatterPlot.plotItem.clearPlots() - self.scatterPlot = self.clusterScatterPlot.plotItem.plot(self.clusterScatterPlot.scatterData, pen=None, symbol='o', symbolBrush=brushes) + self.scatterPlot = self.clusterScatterPlot.plotItem.plot(self.clusterScatterPlot.scatterData, pen=None, + symbol='o', symbolBrush=brushes) self.clusterScatterPlot.getViewBox().autoRange(padding=0.1) self.clusterScatterPlot.getNN() @@ -380,17 +414,18 @@ def updateClusterParams(self, name): def showClusterMean(self, i): if self.mean_spectra is None: return - self.clusterMeanPlot.showClusterSpectra(self.labels[i]) + self.clusterMeanPlot.curveHighLight(self.labels[i]) def setImageCross(self, ind): row, col = self.ind2rc[ind] # update cross - self.clusterImage.cross.setData([col + 0.5], [self.imgShape[0] - row - 0.5],) + self.clusterImage.cross.setData([col + 0.5], [self.imgShape[0] - row - 0.5]) # update text self.clusterImage.txt.setHtml(toHtml(f'Point: #{ind}', size=8) - + toHtml(f'X: {col}', size=8) - + toHtml(f'Y: {row}', size=8) - + toHtml(f'Val: {self.clusterImage._image[self.imgShape[0] - row -1, col] :d}', size=8)) + + toHtml(f'X: {col}', size=8) + + toHtml(f'Y: {row}', size=8) + + toHtml(f'Val: {self.clusterImage._image[self.imgShape[0] - row - 1, col] :d}', + size=8)) def removeSpec(self): pass @@ -401,8 +436,8 @@ def cleanUp(self): self.clusterImage.setImage(img=img) if hasattr(self, 'scatterPlot'): self.clusterScatterPlot.plotItem.clearPlots() - self.rawSpecPlot.clear() - self.clusterMeanPlot.clear() + self.rawSpecPlot.clearAll() + self.clusterMeanPlot.clearAll() def setHeader(self, field: str): self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] From e44e0c20d3e337f2efc237db0329dd2861f9d4aa Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sat, 30 May 2020 21:57:26 -0700 Subject: [PATCH 36/56] change FA to Decomposition --- xicam/BSISB/__init__.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/xicam/BSISB/__init__.py b/xicam/BSISB/__init__.py index dbc41f2..21e88ba 100644 --- a/xicam/BSISB/__init__.py +++ b/xicam/BSISB/__init__.py @@ -54,7 +54,7 @@ def __init__(self, *args, **kwargs): self.stages = {#"MapToH5": GUILayout(self.mapToH5), "Image View": GUILayout(self.imageview), "Preprocess": GUILayout(self.preprocess), - "Factor Analysis": GUILayout(self.FA_widget), + "Decomposition": GUILayout(self.FA_widget), "Clustering": GUILayout(self.clusterwidget)} super(BSISB, self).__init__(*args, **kwargs) @@ -116,4 +116,3 @@ def updateROI(self, roi): def updateTab(self): # clean up all widgets self.preprocess.cleanUp() - self.clusterwidget.cleanUp() From 98d2ae9d31062d53bf9349442b40797ad311a47f Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sat, 30 May 2020 22:03:37 -0700 Subject: [PATCH 37/56] change text position --- xicam/BSISB/widgets/spectraplotwidget.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/xicam/BSISB/widgets/spectraplotwidget.py b/xicam/BSISB/widgets/spectraplotwidget.py index 9b03f9a..193f525 100644 --- a/xicam/BSISB/widgets/spectraplotwidget.py +++ b/xicam/BSISB/widgets/spectraplotwidget.py @@ -12,7 +12,7 @@ class SpectraPlotWidget(PlotWidget): sigEnergyChanged = Signal(object) - def __init__(self, linePos=650, txtPosRatio=0.3, invertX=True, *args, **kwargs): + def __init__(self, linePos=650, txtPosRatio=0.35, invertX=True, *args, **kwargs): """ A widget to display a 1D spectrum :param linePos: the initial position of the InfiniteLine @@ -36,6 +36,7 @@ def __init__(self, linePos=650, txtPosRatio=0.3, invertX=True, *args, **kwargs): symbolSize=20) self.cross.setZValue(100) self.addItem(self.cross) + self.txt = TextItem() self.getViewBox().invertX(invertX) self.spectrumInd = 0 self.selectedPixels = None @@ -134,11 +135,11 @@ def plot(self, x, y, *args, **kwargs): txt_html = toHtml(f'{self._mean_title}') txt_html += toHtml(f'X = {x_val: .2f}, Y = {y_val: .4f}') - self.txt = TextItem(html=txt_html, anchor=(0, 0)) + self.txt.setHtml(txt_html) ymax = np.max(y) self._y = y r = self.txtPosRatio - self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) + self.txt.setPos(r * x[-1] + (1 - r) * x[0], ymax) self.cross.setData([x_val], [y_val]) self.addItem(self.txt) From 69f52bcb47762c9ff530d44a953d0ac6f1feb605 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sat, 30 May 2020 22:12:20 -0700 Subject: [PATCH 38/56] add PCA and multimap clustering --- xicam/BSISB/widgets/clusteringwidget.py | 71 +++++++++++++++++-------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/xicam/BSISB/widgets/clusteringwidget.py b/xicam/BSISB/widgets/clusteringwidget.py index 3cb651d..c7af578 100644 --- a/xicam/BSISB/widgets/clusteringwidget.py +++ b/xicam/BSISB/widgets/clusteringwidget.py @@ -9,6 +9,8 @@ from qtpy.QtWidgets import * from sklearn.cluster import KMeans from sklearn.neighbors import NearestNeighbors +from sklearn.decomposition import PCA +from sklearn.preprocessing import StandardScaler, Normalizer from umap import UMAP from xicam.BSISB.widgets.mapviewwidget import MapViewWidget, toHtml from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget @@ -147,7 +149,7 @@ def getNN(self): class ClusterSpectraWidget(SpectraPlotWidget): def __init__(self): - super(ClusterSpectraWidget, self).__init__() + super(ClusterSpectraWidget, self).__init__(txtPosRatio=0.35) self._x = None self.ymax, self.zmax = 0, 100 self._plots = [] @@ -194,7 +196,7 @@ def curveHighLight(self, k): ymin, ymax = np.min(self._y), np.max(self._y) self.getViewBox().setYRange(ymin, ymax, padding=0.1) r = self.txtPosRatio - self.txt.setPos(r * self._x[-1] + (1 - r) * self._x[0], 0.95 * ymax) + self.txt.setPos(r * self._x[-1] + (1 - r) * self._x[0], ymax) self.getEnergy() def plot(self, x, y, *args, **kwargs): @@ -216,7 +218,7 @@ def plot(self, x, y, *args, **kwargs): self.ymax = ymax self._x, self._y = x, y r = self.txtPosRatio - self.txt.setPos(r * x[-1] + (1 - r) * x[0], 0.95 * ymax) + self.txt.setPos(r * x[-1] + (1 - r) * x[0], self.ymax) return plot_item @@ -227,7 +229,7 @@ def __init__(self, headermodel, selectionmodel): self.mapselectmodel = selectionmodel # init some values self.selectMapidx = 0 - self.low_dim = None + self.embedding = None self.labels = None self.mean_spectra = None @@ -259,12 +261,8 @@ def __init__(self, headermodel, selectionmodel): self.computeBtn = QPushButton() self.computeBtn.setText('Compute clusters') self.computeBtn.setFont(font) - self.removeBtn = QPushButton() - self.removeBtn.setText('Remove spectra') - self.removeBtn.setFont(font) # add all buttons self.buttonlayout.addWidget(self.computeBtn) - # self.buttonlayout.addWidget(self.removeBtn) # Headers listview self.headerlistview = QListView() @@ -290,14 +288,13 @@ def __init__(self, headermodel, selectionmodel): self.rightsplitter.addWidget(self.parametertree) self.rightsplitter.addWidget(self.buttons) self.rightsplitter.addWidget(self.mapListWidget) - self.rightsplitter.setSizes([200, 50, 50]) + self.rightsplitter.setSizes([300, 50, 50]) self.addWidget(self.leftsplitter) self.addWidget(self.rightsplitter) self.setSizes([500, 100]) # Connect signals self.computeBtn.clicked.connect(self.computeEmbedding) - self.removeBtn.clicked.connect(self.removeSpec) self.clusterImage.sigShowSpectra.connect(self.rawSpecPlot.showSpectra) self.clusterImage.sigShowSpectra.connect(self.showClusterMean) self.clusterImage.sigShowSpectra.connect(self.clusterScatterPlot.clickFromImage) @@ -305,6 +302,7 @@ def __init__(self, headermodel, selectionmodel): self.clusterScatterPlot.sigScatterClicked.connect(self.showClusterMean) self.clusterScatterPlot.sigScatterClicked.connect(self.setImageCross) self.parametertree.sigParamChanged.connect(self.updateClusterParams) + self.mapselectmodel.selectionChanged.connect(self.updateMap) def computeEmbedding(self): # get current map idx @@ -345,15 +343,29 @@ def computeEmbedding(self): n_components=n_components, metric=metric, random_state=0) - self.low_dim = self.umap.fit_transform(self.dataset) + self.embedding = self.umap.fit_transform(self.dataset) elif self.parameter['Embedding'] == 'PCA': - pass + # normalize and mean center + if self.parameter['Normalization'] == 'L1': # normalize + data_norm = Normalizer(norm='l1').fit_transform(self.dataset) + elif self.parameter['Normalization'] == 'L2': + data_norm = Normalizer(norm='l2').fit_transform(self.dataset) + else: + data_norm = self.dataset + # subtract mean + data_centered = StandardScaler(with_std=False).fit_transform(data_norm) + # Do PCA + self.PCA = PCA(n_components=n_components) + self.PCA.fit(data_centered) + self.embedding = self.PCA.transform(data_centered) + # save embedding to standardModelItem + self.item.embedding = self.embedding # update cluster map self.computeCluster() def computeCluster(self): # check if embeddings exist - if self.low_dim is None: + if self.embedding is None: return msg.showMessage('Compute clusters.') # get num of clusters @@ -361,7 +373,7 @@ def computeCluster(self): # set colorLUT self.colorLUT = cm.get_cmap('viridis', n_clusters).colors[:, :3] * 255 # compute cluster - cluster_object = KMeans(n_clusters=n_clusters, random_state=0).fit(self.low_dim) + cluster_object = KMeans(n_clusters=n_clusters, random_state=0).fit(self.embedding) self.labels = cluster_object.labels_ # update cluster image self.cluster_map = self.labels.reshape(self.imgShape[0], self.imgShape[1]) @@ -388,10 +400,10 @@ def computeCluster(self): self.updateScatterPlot() def updateScatterPlot(self): - if (self.low_dim is None) or (self.labels is None): + if (self.embedding is None) or (self.labels is None): return # get scatter x, y values - self.clusterScatterPlot.scatterData = self.low_dim[:, + self.clusterScatterPlot.scatterData = self.embedding[:, [self.parameter['X Component'] - 1, self.parameter['Y Component'] - 1]] # get colormapings brushes = [mkBrush(self.colorLUT[x, :]) for x in self.labels] @@ -411,6 +423,22 @@ def updateClusterParams(self, name): elif name in ['X Component', 'Y Component']: self.updateScatterPlot() + def updateMap(self): + # get current map idx + if not self.mapselectmodel.selectedIndexes(): # no map is open + return + else: + self.selectMapidx = self.mapselectmodel.selectedIndexes()[0].row() + # get current item + self.item = self.headermodel.item(self.selectMapidx) + if hasattr(self.item, 'embedding'): + # load embedding + self.embedding = self.item.embedding + self.computeCluster() + else: + # reset custer image and plots + self.cleanUp() + def showClusterMean(self, i): if self.mean_spectra is None: return @@ -427,17 +455,17 @@ def setImageCross(self, ind): + toHtml(f'Val: {self.clusterImage._image[self.imgShape[0] - row - 1, col] :d}', size=8)) - def removeSpec(self): - pass - def cleanUp(self): if hasattr(self, 'imgShape'): img = np.zeros((self.imgShape[0], self.imgShape[1])) self.clusterImage.setImage(img=img) if hasattr(self, 'scatterPlot'): self.clusterScatterPlot.plotItem.clearPlots() + self.clusterScatterPlot.scatterData = None self.rawSpecPlot.clearAll() + self.rawSpecPlot._data = None self.clusterMeanPlot.clearAll() + self.clusterMeanPlot._data = None def setHeader(self, field: str): self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] @@ -463,7 +491,7 @@ def setHeader(self, field: str): msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) if data is not None: self.dataSets.append(data) - self.isMapOpen() + self.cleanUp() def isMapOpen(self): if not self.mapselectmodel.selectedIndexes(): # no map is open @@ -471,6 +499,7 @@ def isMapOpen(self): else: self.selectMapidx = self.mapselectmodel.selectedIndexes()[0].row() # get current data + self.item = self.headermodel.item(self.selectMapidx) self.currentHeader = self.headers[self.selectMapidx] self.wavenumbers = self.wavenumberList[self.selectMapidx] self.rc2ind = self.rc2indList[self.selectMapidx] @@ -478,6 +507,4 @@ def isMapOpen(self): self.imgShape = self.imgShapes[self.selectMapidx] self.data = self.dataSets[self.selectMapidx] self.rawSpecPlot.setHeader(self.currentHeader, 'spectra') - # reset custer image and plots - self.cleanUp() return True From f417e01c4d1ea27739d49b2135d5ab232f9898f6 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Sat, 30 May 2020 22:19:57 -0700 Subject: [PATCH 39/56] move buttons out of parameterlist --- xicam/BSISB/widgets/factorizationwidget.py | 518 +++++++++++---------- 1 file changed, 262 insertions(+), 256 deletions(-) diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index 8c94b77..d2873b9 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -14,6 +14,7 @@ import seaborn as sns from xicam.BSISB.widgets.uiwidget import MsgBox from xicam.BSISB.widgets.imshowwidget import SlimImageView +from xicam.BSISB.widgets.spectraplotwidget import SpectraPlotWidget from lbl_ir.data_objects.ir_map import val2ind from lbl_ir.tasks.preprocessing import data_prep from lbl_ir.tasks.NMF.multi_set_analyses import aggregate_data @@ -23,7 +24,6 @@ class FactorizationParameters(ParameterTree): - sigPCA = Signal(object) def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelectionModel): super(FactorizationParameters, self).__init__() @@ -38,8 +38,6 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti {'name': "Components", 'value': 4, 'type': 'int'}, - {'name': "Calculate", - 'type': 'action'}, {'name': "Map 1 Component", 'values': [1, 2, 3, 4], 'value': 1, @@ -66,9 +64,7 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti {'name': "C regressor", 'values': ['OLS', 'NNLS'], 'value': 'OLS', - 'type': 'list'}, - {'name': "Save results", - 'type': 'action'} + 'type': 'list'} ]) self.setParameters(self.parameter, showTop=False) @@ -88,55 +84,22 @@ def __init__(self, headermodel: QStandardItemModel, selectionmodel: QItemSelecti item.displayLabel.setFont(font) item.widget.setMaximumHeight(40) # connect signals - self.parameter.child('Calculate').sigActivated.connect(self.calculate) - self.parameter.child('Save results').sigActivated.connect(self.saveResults) self.parameter.child('Components').sigValueChanged.connect(self.setNumComponents) self.parameter.child('Method').sigValueChanged.connect(self.setMethod) self.parameter.child('C regressor').hide() def setMethod(self): if self.parameter['Method'] == 'PCA': - self.method = 'PCA' - self.field = 'spectra' self.parameter.child('Normalization').setToDefault() self.parameter.child('Normalization').show() self.parameter.child('C regressor').hide() elif self.parameter['Method'] == 'NMF': - self.method = 'NMF' - self.field = 'volume' self.parameter.child('Normalization').hide() self.parameter.child('C regressor').hide() elif self.parameter['Method'] == 'MCR': - self.method = 'MCR' - self.field = 'spectra' self.parameter.child('Normalization').hide() self.parameter.child('C regressor').show() - def setHeader(self, wavenumbers, imgShapes, rc2indList, ind2rcList): - # get all headers selected - # headers = [self.headermodel.itemFromIndex(i).header for i in self.selectionmodel.selectedRows()] - self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] - - self.wavenumbers = wavenumbers - self.N_w = len(self.wavenumbers) - self.imgShapes = imgShapes - self.rc2indList = rc2indList - self.ind2rcList = ind2rcList - self._dataSets = {'spectra': [], 'volume': []} - - for header in self.headers: - data = None - try: # spectra datasets - data = header.meta_array('spectra') - except IndexError: - msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) - if data is not None: - self._dataSets['spectra'].append(data) - # NMF path sets - volumeEvent = next(header.events(fields=['volume'])) - path = volumeEvent['path'] # readin filepath - self._dataSets['volume'].append(path) - def setNumComponents(self): N = self.parameter['Components'] @@ -144,216 +107,11 @@ def setNumComponents(self): param = self.parameter.child(f'Map {i + 1} Component') param.setLimits(list(range(1, N + 1))) - def calculate(self): - - N = self.parameter['Components'] - - if hasattr(self, '_dataSets'): - wavROIList = [] - for entry in self.parameter['Wavenumber Range'].split(','): - try: - wavROIList.append(val2ind(int(entry), self.wavenumbers)) - except: - continue - # Select wavenumber region - if len(wavROIList) % 2 == 0: - wavROIList = sorted(wavROIList) - wavROIidx = [] - for i in range(len(wavROIList) // 2): - wavROIidx += list(range(wavROIList[2 * i], wavROIList[2 * i + 1] + 1)) - else: - msg.logMessage('"Wavenumber Range" values must be in pairs', msg.ERROR) - MsgBox('Factorization computation aborted.', 'error') - return - - self.wavenumbers_select = self.wavenumbers[wavROIidx] - # get map ROI selected region - self.selectedPixelsList = [self.headermodel.item(i).selectedPixels for i in - range(self.headermodel.rowCount())] - self.df_row_idx = [] # row index for dataframe data_fac - - msg.showMessage('Start computing', self.method + '. Image shape:', str(self.imgShapes)) - self.dataRowSplit = [0] # remember the starting/end row positions of each dataset - if self.field == 'spectra': # PCA workflow - self.N_w = len(self.wavenumbers_select) - self._allData = np.empty((0, self.N_w)) - - for i, data in enumerate(self._dataSets['spectra']): # i: map idx - if self.selectedPixelsList[i] is None: - n_spectra = len(data) - tmp = np.zeros((n_spectra, self.N_w)) - for j in range(n_spectra): - tmp[j, :] = data[j][wavROIidx] - self.df_row_idx.append((self.ind2rcList[i][j], j)) - else: - n_spectra = len(self.selectedPixelsList[i]) - tmp = np.zeros((n_spectra, self.N_w)) - for j in range(n_spectra): # j: jth selected pixel - row_col = tuple(self.selectedPixelsList[i][j]) - tmp[j, :] = data[self.rc2indList[i][row_col]][wavROIidx] - self.df_row_idx.append((row_col, self.rc2indList[i][row_col])) - - self.dataRowSplit.append(self.dataRowSplit[-1] + n_spectra) - self._allData = np.append(self._allData, tmp, axis=0) - - if len(self._allData) > 0: - if self.method == 'PCA': - self.data_fac_name = 'data_PCA' # define pop up plots labels - # normalize and mean center - if self.parameter['Normalization'] == 'L1':# normalize - data_norm = Normalizer(norm='l1').fit_transform(self._allData) - elif self.parameter['Normalization'] == 'L2': - data_norm = Normalizer(norm='l2').fit_transform(self._allData) - else: - data_norm = self._allData - #subtract mean - data_centered = StandardScaler(with_std=False).fit_transform(data_norm) - # Do PCA - self.PCA = PCA(n_components=N) - self.PCA.fit(data_centered) - self.data_PCA = self.PCA.transform(data_centered) - # pop up plots - self.popup_plots() - elif self.method == 'MCR': - self.data_fac_name = 'data_MCR' # define pop up plots labels - # Do ICA to find initial estimate of ST matrix - self.ICA = FastICA(n_components=N) - self.ICA.fit(self._allData) - # Do MCR - self.MCR = McrAR(max_iter=100, c_regr=self.parameter['C regressor'], st_regr='NNLS', - tol_err_change=1e-6, tol_increase=0.5) - self.MCR.fit(self._allData, ST=self.ICA.components_) - self.MCR.components_ = self.MCR.ST_opt_ - self.data_MCR = self.MCR.C_opt_ - #test ICA - # self.MCR = self.ICA - # self.data_MCR = self.ICA.transform(self._allData) - # pop up plots - self.popup_plots() - else: - msg.logMessage('The data matrix is empty. No PCA is performed.', msg.ERROR) - MsgBox('The data matrix is empty. No PCA is performed.', 'error') - self.PCA, self.data_PCA = None, None - self.MCR, self.data_MCR = None, None - # emit PCA and transformed data - if self.method == 'PCA': - self.sigPCA.emit((self.wavenumbers_select, self.PCA, self.data_PCA, self.dataRowSplit)) - elif self.method == 'MCR': - self.sigPCA.emit((self.wavenumbers_select, self.MCR, self.data_MCR, self.dataRowSplit)) - - elif self.field == 'volume': # NMF workflow - data_files = [] - wav_masks = [] - row_idx = np.array([], dtype='int') - self.allDataRowSplit = [0] # row split for complete datasets - - for i, file in enumerate(self._dataSets['volume']): - ir_data, fmt = read_map.read_all_formats(file) - n_spectra = ir_data.data.shape[0] - self.allDataRowSplit.append(self.allDataRowSplit[-1] + n_spectra) - data_files.append(ir_data) - ds = data_prep.data_prepper(ir_data) - wav_masks.append(ds.decent_bands) - # row selection - if self.selectedPixelsList[i] is None: - row_idx = np.append(row_idx, np.arange(self.allDataRowSplit[-2], self.allDataRowSplit[-1])) - for k, v in self.rc2indList[i].items(): - self.df_row_idx.append((k, v)) - else: - n_spectra = len(self.selectedPixelsList[i]) - for j in range(n_spectra): - row_col = tuple(self.selectedPixelsList[i][j]) - row_idx = np.append(row_idx, self.allDataRowSplit[-2] + - self.rc2indList[i][row_col]) - self.df_row_idx.append((row_col, self.rc2indList[i][row_col])) - - self.dataRowSplit.append(self.dataRowSplit[-1] + n_spectra) # row split for ROI selected rows - - # define pop up plots labels - self.data_fac_name = 'data_NMF' - - if len(self.df_row_idx) > 0: - # aggregate datasets - ir_data_agg = aggregate_data(self._dataSets['volume'], data_files, wav_masks) - col_idx = list(set(wavROIidx) & set(ir_data_agg.master_wmask)) - self.wavenumbers_select = self.wavenumbers[col_idx] - ir_data_agg.data = ir_data_agg.data[:, col_idx] - ir_data_agg.data = ir_data_agg.data[row_idx, :] - # perform NMF - self.NMF = NMF(n_components=N) - self.data_NMF = self.NMF.fit_transform(ir_data_agg.data) - # pop up plots - self.popup_plots() - else: - msg.logMessage('The data matrix is empty. No NMF is performed.', msg.ERROR) - MsgBox('The data matrix is empty. No NMF is performed.', 'error') - self.NMF, self.data_NMF = None, None - # emit NMF and transformed data : data_NMF - self.sigPCA.emit((self.wavenumbers_select, self.NMF, self.data_NMF, self.dataRowSplit)) - - def popup_plots(self): - # component variance ratio plot - if self.method == 'PCA': - plt.plot(getattr(self, self.method).explained_variance_ratio_, 'o-b') - ax = plt.gca() - ax.set_ylabel('Explained variance ratio', fontsize=16) - ax.set_xlabel('Component number', fontsize=16) - ax.set_xticks(np.arange(self.parameter['Components'])) - # loadings plot - plt.figure() - labels = [] - for i in range(getattr(self, self.method).components_.shape[0]): - labels.append(self.method + str(i + 1)) - plt.plot(self.wavenumbers_select, getattr(self, self.method).components_[i, :], '-', - label=labels[i]) - loadings_legend = plt.legend(loc='best') - plt.setp(loadings_legend, draggable=True) - plt.xlim([max(self.wavenumbers_select), min(self.wavenumbers_select)]) - ax = plt.gca() - ax.set_xlabel('Wavenumber$(cm^{-1})$', fontsize=16) - # matrix plot - groupLabel = np.zeros((self.dataRowSplit[-1], 1)) - for i in range(len(self.dataRowSplit) - 1): - groupLabel[self.dataRowSplit[i]:self.dataRowSplit[i + 1]] = int(i) - - df_scores = pd.DataFrame(np.append(getattr(self, self.data_fac_name), groupLabel, axis=1), - columns=labels + ['Group label']) - grid = sns.pairplot(df_scores, vars=labels, hue="Group label") - # change legend properties - legend_labels = [] - for i in range(self.headermodel.rowCount()): - if (self.selectedPixelsList[i] is None) or (self.selectedPixelsList[i].size > 0): - legend_labels.append(self.headermodel.item(i).data(0)) - for t, l in zip(grid._legend.texts, legend_labels): t.set_text(l) - plt.setp(grid._legend.get_texts(), fontsize=14) - plt.setp(grid._legend.get_title(), fontsize=14) - plt.setp(grid._legend, bbox_to_anchor=(0.2, 0.95), frame_on=True, draggable=True) - plt.setp(grid._legend.get_frame(), edgecolor='k', linewidth=1, alpha=1) - plt.show() - - def saveResults(self): - if (hasattr(self, 'PCA') and self.PCA is not None) or (hasattr(self, 'NMF') and self.NMF is not None)\ - or (hasattr(self, 'MCR') and self.MCR is not None): - name = self.method - df_fac_components = pd.DataFrame(getattr(self, name).components_, columns=self.wavenumbers_select) - df_data_fac = pd.DataFrame(getattr(self, self.data_fac_name), index=self.df_row_idx) - df_fac_components.to_csv(name + '_components.csv') - df_data_fac.to_csv(name + '_data.csv') - np.savetxt(name + '_mapRowSplit.csv', np.array(self.dataRowSplit), fmt='%d', delimiter=',') - MsgBox(name + ' components successfully saved!') - else: - MsgBox('No factorization components available.') - -class ComponentPlotWidget(PlotWidget): +class ComponentPlotWidget(SpectraPlotWidget): def __init__(self, *args, **kwargs): - super(ComponentPlotWidget, self).__init__(*args, **kwargs) - self.line = InfiniteLine(pos=800, movable=True) - self.line.sigPositionChanged.connect(self.getEnergy) - self.addItem(self.line) - self.cross = PlotDataItem([800], [0], symbolBrush=(255, 255, 255), symbolPen=(255, 255, 255), symbol='+', symbolSize=25) - self.addItem(self.cross) - self.txt = TextItem() - self.getViewBox().invertX(True) + super(ComponentPlotWidget, self).__init__(linePos=800, txtPosRatio=0.35, *args, **kwargs) + self.cross = PlotDataItem([800], [0], symbolBrush=(255, 255, 255), symbolPen=(255, 255, 255), + symbol='+', symbolSize=25) self._x, self._y = None, None self.ymax, self.zmax = 0, 100 @@ -387,11 +145,14 @@ def plot(self, x, y, *args, **kwargs): if ymax > self.ymax: self.ymax = ymax self._x, self._y = x, y - self.txt.setPos(x[0], 0.95 * self.ymax) + r = self.txtPosRatio + self.txt.setPos(r * x[-1] + (1 - r) * x[0], self.ymax) self.addItem(self.txt) return plot_item class FactorizationWidget(QSplitter): + sigPCA = Signal(object) + def __init__(self, headermodel, selectionmodel): super(FactorizationWidget, self).__init__() self.headermodel = headermodel @@ -451,7 +212,6 @@ def __init__(self, headermodel, selectionmodel): self.parametertree = FactorizationParameters(headermodel, selectionmodel) self.parameter = self.parametertree.parameter - self.parametertree.sigPCA.connect(self.showComponents) for i in range(4): self.parameter.child(f'Map {i + 1} Component').sigValueChanged.connect( partial(self.updateComponents, i)) @@ -469,6 +229,23 @@ def __init__(self, headermodel, selectionmodel): self.setOrientation(Qt.Horizontal) self.display.setOrientation(Qt.Vertical) + # buttons layout + self.buttons = QWidget() + self.buttonlayout = QGridLayout() + self.buttons.setLayout(self.buttonlayout) + # set up buttons + self.fontSize = 12 + font = QFont("Helvetica [Cronyx]", self.fontSize) + self.computeBtn = QPushButton() + self.computeBtn.setText('Decompose') + self.computeBtn.setFont(font) + self.saveBtn = QPushButton() + self.saveBtn.setText('Save Results') + self.saveBtn.setFont(font) + # add all buttons + self.buttonlayout.addWidget(self.computeBtn) + self.buttonlayout.addWidget(self.saveBtn) + # Headers listview self.headerlistview = QListView() self.headerlistview.setModel(headermodel) @@ -487,8 +264,14 @@ def __init__(self, headermodel, selectionmodel): # adjust right splitter self.rightsplitter.addWidget(self.parametertree) + self.rightsplitter.addWidget(self.buttons) self.rightsplitter.addWidget(self.mapListWidget) - self.rightsplitter.setSizes([200, 50]) + self.rightsplitter.setSizes([300, 50, 50]) + + #connect signals + self.computeBtn.clicked.connect(self.calculate) + self.saveBtn.clicked.connect(self.saveResults) + self.sigPCA.connect(self.showComponents) def updateRoiMask(self): if self.selectionmodel.hasSelection(): @@ -579,10 +362,11 @@ def showComponents(self, fac_obj): # get map ROI selected region self.selectedPixelsList = [self.headermodel.item(i).selectedPixels for i in range(self.headermodel.rowCount())] # clear plots and legends - self.componentSpectra.plotItem.clearPlots() + # self.componentSpectra.plotItem.clearPlots() + self.componentSpectra.clearAll() self.componentSpectra.ymax = 0 - for sample, label in self._plotLegends.items[:]: - self._plotLegends.removeItem(label.text) + # for sample, label in self._plotLegends.items[:]: + # self._plotLegends.removeItem(label.text) self.wavenumbers, self._fac, self._data_fac, self._dataRowSplit = fac_obj[0], fac_obj[1], fac_obj[2], fac_obj[3] @@ -650,16 +434,30 @@ def setHeader(self, field: str): self.imgShapes = [] self.rc2indList = [] self.ind2rcList = [] + self._dataSets = {'spectra': [], 'volume': []} # get wavenumbers, imgShapes for header in self.headers: dataEvent = next(header.events(fields=[field])) self.wavenumbers = dataEvent['wavenumbers'] + self.N_w = len(self.wavenumbers) wavenum_align.append( - (round(self.wavenumbers[0]), len(self.wavenumbers))) # append (first wavenum value, wavenum length) + (round(self.wavenumbers[0]), self.N_w)) # append (first wavenum value, wavenum length) self.imgShapes.append(dataEvent['imgShape']) self.rc2indList.append(dataEvent['rc_index']) self.ind2rcList.append(dataEvent['index_rc']) + # load data + data = None + try: # spectra datasets + data = header.meta_array('spectra') + except IndexError: + msg.logMessage('Header object contained no frames with field ''{field}''.', msg.ERROR) + if data is not None: + self._dataSets['spectra'].append(data) + # NMF path sets + volumeEvent = next(header.events(fields=['volume'])) + path = volumeEvent['path'] # readin filepath + self._dataSets['volume'].append(path) # init maps if len(self.imgShapes) > 0: @@ -669,7 +467,215 @@ def setHeader(self, field: str): MsgBox('Length of wavenumber arrays of displayed maps are not equal. \n' 'Perform PCA or NMF on these maps will lead to error.','warn') - self.parametertree.setHeader(self.wavenumbers, self.imgShapes, self.rc2indList, self.ind2rcList) + # self.parametertree.setHeader(self.wavenumbers, self.imgShapes, self.rc2indList, self.ind2rcList) + def calculate(self): + N = self.parameter['Components'] + #set decompose method + if self.parameter['Method'] == 'PCA': + self.method = 'PCA' + self.field = 'spectra' + elif self.parameter['Method'] == 'NMF': + self.method = 'NMF' + self.field = 'volume' + elif self.parameter['Method'] == 'MCR': + self.method = 'MCR' + self.field = 'spectra' + + if hasattr(self, '_dataSets'): + wavROIList = [] + for entry in self.parameter['Wavenumber Range'].split(','): + try: + wavROIList.append(val2ind(int(entry), self.wavenumbers)) + except: + continue + # Select wavenumber region + if len(wavROIList) % 2 == 0: + wavROIList = sorted(wavROIList) + wavROIidx = [] + for i in range(len(wavROIList) // 2): + wavROIidx += list(range(wavROIList[2 * i], wavROIList[2 * i + 1] + 1)) + else: + msg.logMessage('"Wavenumber Range" values must be in pairs', msg.ERROR) + MsgBox('Factorization computation aborted.', 'error') + return + + self.wavenumbers_select = self.wavenumbers[wavROIidx] + # get map ROI selected region + self.selectedPixelsList = [self.headermodel.item(i).selectedPixels for i in + range(self.headermodel.rowCount())] + self.df_row_idx = [] # row index for dataframe data_fac + + msg.showMessage('Start computing', self.method + '. Image shape:', str(self.imgShapes)) + self.dataRowSplit = [0] # remember the starting/end row positions of each dataset + if self.field == 'spectra': # PCA workflow + self.N_w = len(self.wavenumbers_select) + self._allData = np.empty((0, self.N_w)) + + for i, data in enumerate(self._dataSets['spectra']): # i: map idx + if self.selectedPixelsList[i] is None: + n_spectra = len(data) + tmp = np.zeros((n_spectra, self.N_w)) + for j in range(n_spectra): + tmp[j, :] = data[j][wavROIidx] + self.df_row_idx.append((self.ind2rcList[i][j], j)) + else: + n_spectra = len(self.selectedPixelsList[i]) + tmp = np.zeros((n_spectra, self.N_w)) + for j in range(n_spectra): # j: jth selected pixel + row_col = tuple(self.selectedPixelsList[i][j]) + tmp[j, :] = data[self.rc2indList[i][row_col]][wavROIidx] + self.df_row_idx.append((row_col, self.rc2indList[i][row_col])) + + self.dataRowSplit.append(self.dataRowSplit[-1] + n_spectra) + self._allData = np.append(self._allData, tmp, axis=0) + + if len(self._allData) > 0: + if self.method == 'PCA': + self.data_fac_name = 'data_PCA' # define pop up plots labels + # normalize and mean center + if self.parameter['Normalization'] == 'L1':# normalize + data_norm = Normalizer(norm='l1').fit_transform(self._allData) + elif self.parameter['Normalization'] == 'L2': + data_norm = Normalizer(norm='l2').fit_transform(self._allData) + else: + data_norm = self._allData + #subtract mean + data_centered = StandardScaler(with_std=False).fit_transform(data_norm) + # Do PCA + self.PCA = PCA(n_components=N) + self.PCA.fit(data_centered) + self.data_PCA = self.PCA.transform(data_centered) + # pop up plots + self.popup_plots() + elif self.method == 'MCR': + self.data_fac_name = 'data_MCR' # define pop up plots labels + # Do ICA to find initial estimate of ST matrix + self.ICA = FastICA(n_components=N) + self.ICA.fit(self._allData) + # Do MCR + self.MCR = McrAR(max_iter=100, c_regr=self.parameter['C regressor'], st_regr='NNLS', + tol_err_change=1e-6, tol_increase=0.5) + self.MCR.fit(self._allData, ST=self.ICA.components_) + self.MCR.components_ = self.MCR.ST_opt_ + self.data_MCR = self.MCR.C_opt_ + #test ICA + # self.MCR = self.ICA + # self.data_MCR = self.ICA.transform(self._allData) + # pop up plots + self.popup_plots() + else: + msg.logMessage('The data matrix is empty. No PCA is performed.', msg.ERROR) + MsgBox('The data matrix is empty. No PCA is performed.', 'error') + self.PCA, self.data_PCA = None, None + self.MCR, self.data_MCR = None, None + # emit PCA and transformed data + if self.method == 'PCA': + self.sigPCA.emit((self.wavenumbers_select, self.PCA, self.data_PCA, self.dataRowSplit)) + elif self.method == 'MCR': + self.sigPCA.emit((self.wavenumbers_select, self.MCR, self.data_MCR, self.dataRowSplit)) + + elif self.field == 'volume': # NMF workflow + data_files = [] + wav_masks = [] + row_idx = np.array([], dtype='int') + self.allDataRowSplit = [0] # row split for complete datasets + + for i, file in enumerate(self._dataSets['volume']): + ir_data, fmt = read_map.read_all_formats(file) + n_spectra = ir_data.data.shape[0] + self.allDataRowSplit.append(self.allDataRowSplit[-1] + n_spectra) + data_files.append(ir_data) + ds = data_prep.data_prepper(ir_data) + wav_masks.append(ds.decent_bands) + # row selection + if self.selectedPixelsList[i] is None: + row_idx = np.append(row_idx, np.arange(self.allDataRowSplit[-2], self.allDataRowSplit[-1])) + for k, v in self.rc2indList[i].items(): + self.df_row_idx.append((k, v)) + else: + n_spectra = len(self.selectedPixelsList[i]) + for j in range(n_spectra): + row_col = tuple(self.selectedPixelsList[i][j]) + row_idx = np.append(row_idx, self.allDataRowSplit[-2] + + self.rc2indList[i][row_col]) + self.df_row_idx.append((row_col, self.rc2indList[i][row_col])) + + self.dataRowSplit.append(self.dataRowSplit[-1] + n_spectra) # row split for ROI selected rows + + # define pop up plots labels + self.data_fac_name = 'data_NMF' + + if len(self.df_row_idx) > 0: + # aggregate datasets + ir_data_agg = aggregate_data(self._dataSets['volume'], data_files, wav_masks) + col_idx = list(set(wavROIidx) & set(ir_data_agg.master_wmask)) + self.wavenumbers_select = self.wavenumbers[col_idx] + ir_data_agg.data = ir_data_agg.data[:, col_idx] + ir_data_agg.data = ir_data_agg.data[row_idx, :] + # perform NMF + self.NMF = NMF(n_components=N) + self.data_NMF = self.NMF.fit_transform(ir_data_agg.data) + # pop up plots + self.popup_plots() + else: + msg.logMessage('The data matrix is empty. No NMF is performed.', msg.ERROR) + MsgBox('The data matrix is empty. No NMF is performed.', 'error') + self.NMF, self.data_NMF = None, None + # emit NMF and transformed data : data_NMF + self.sigPCA.emit((self.wavenumbers_select, self.NMF, self.data_NMF, self.dataRowSplit)) + + def popup_plots(self): + # component variance ratio plot + if self.method == 'PCA': + plt.plot(getattr(self, self.method).explained_variance_ratio_, 'o-b') + ax = plt.gca() + ax.set_ylabel('Explained variance ratio', fontsize=16) + ax.set_xlabel('Component number', fontsize=16) + ax.set_xticks(np.arange(self.parameter['Components'])) + # loadings plot + plt.figure() + labels = [] + for i in range(getattr(self, self.method).components_.shape[0]): + labels.append(self.method + str(i + 1)) + plt.plot(self.wavenumbers_select, getattr(self, self.method).components_[i, :], '-', + label=labels[i]) + loadings_legend = plt.legend(loc='best') + plt.setp(loadings_legend, draggable=True) + plt.xlim([max(self.wavenumbers_select), min(self.wavenumbers_select)]) + ax = plt.gca() + ax.set_xlabel('Wavenumber$(cm^{-1})$', fontsize=16) + # matrix plot + groupLabel = np.zeros((self.dataRowSplit[-1], 1)) + for i in range(len(self.dataRowSplit) - 1): + groupLabel[self.dataRowSplit[i]:self.dataRowSplit[i + 1]] = int(i) + + df_scores = pd.DataFrame(np.append(getattr(self, self.data_fac_name), groupLabel, axis=1), + columns=labels + ['Group label']) + grid = sns.pairplot(df_scores, vars=labels, hue="Group label") + # change legend properties + legend_labels = [] + for i in range(self.headermodel.rowCount()): + if (self.selectedPixelsList[i] is None) or (self.selectedPixelsList[i].size > 0): + legend_labels.append(self.headermodel.item(i).data(0)) + for t, l in zip(grid._legend.texts, legend_labels): t.set_text(l) + plt.setp(grid._legend.get_texts(), fontsize=14) + plt.setp(grid._legend.get_title(), fontsize=14) + plt.setp(grid._legend, bbox_to_anchor=(0.2, 0.95), frame_on=True, draggable=True) + plt.setp(grid._legend.get_frame(), edgecolor='k', linewidth=1, alpha=1) + plt.show() + + def saveResults(self): + if (hasattr(self, 'PCA') and self.PCA is not None) or (hasattr(self, 'NMF') and self.NMF is not None)\ + or (hasattr(self, 'MCR') and self.MCR is not None): + name = self.method + df_fac_components = pd.DataFrame(getattr(self, name).components_, columns=self.wavenumbers_select) + df_data_fac = pd.DataFrame(getattr(self, self.data_fac_name), index=self.df_row_idx) + df_fac_components.to_csv(name + '_components.csv') + df_data_fac.to_csv(name + '_data.csv') + np.savetxt(name + '_mapRowSplit.csv', np.array(self.dataRowSplit), fmt='%d', delimiter=',') + MsgBox(name + ' components successfully saved!') + else: + MsgBox('No factorization components available.') From 73d1f4be9868caad039fcb407eeb3447b5db9441 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Mon, 1 Jun 2020 12:03:17 -0700 Subject: [PATCH 40/56] add lbl_ir package --- lbl_ir/.gitignore | 2 + lbl_ir/README.md | 30 ++ lbl_ir/lbl_ir/GPR/GPR_engine.py | 143 +++++ lbl_ir/lbl_ir/GPR/GPR_peaks.py | 227 ++++++++ lbl_ir/lbl_ir/GPR/__init__.py | 0 lbl_ir/lbl_ir/GPR/spectral_peak_picker.py | 116 ++++ lbl_ir/lbl_ir/__init__.py | 1 + lbl_ir/lbl_ir/data_objects/__init__.py | 2 + lbl_ir/lbl_ir/data_objects/ir_map.py | 504 ++++++++++++++++++ lbl_ir/lbl_ir/gui_tools/__init__.py | 0 lbl_ir/lbl_ir/gui_tools/ispectrum.py | 85 +++ lbl_ir/lbl_ir/gui_tools/rc2ind_mapping.py | 23 + .../io_tools/Omnic_PyMca5/DataObject.py | 166 ++++++ .../lbl_ir/io_tools/Omnic_PyMca5/OmnicMap.py | 363 +++++++++++++ .../lbl_ir/io_tools/Omnic_PyMca5/__init__.py | 0 lbl_ir/lbl_ir/io_tools/__init__.py | 0 lbl_ir/lbl_ir/io_tools/basic_parser.py | 142 +++++ lbl_ir/lbl_ir/io_tools/map_IO.py | 249 +++++++++ lbl_ir/lbl_ir/io_tools/read_XAS.py | 54 ++ lbl_ir/lbl_ir/io_tools/read_map.py | 47 ++ lbl_ir/lbl_ir/io_tools/read_numpy.py | 42 ++ lbl_ir/lbl_ir/io_tools/read_omnic.py | 51 ++ lbl_ir/lbl_ir/math_tools/__init__.py | 3 + lbl_ir/lbl_ir/math_tools/batched_SVD.py | 467 ++++++++++++++++ lbl_ir/lbl_ir/simulations/__init__.py | 0 .../simulations/spectra_map_simulator.py | 287 ++++++++++ lbl_ir/lbl_ir/tasks/NMF/__init__.py | 0 lbl_ir/lbl_ir/tasks/NMF/basic_NMF.py | 40 ++ lbl_ir/lbl_ir/tasks/NMF/multi_set_analyses.py | 124 +++++ lbl_ir/lbl_ir/tasks/Worms/Shai_Hulut.py | 227 ++++++++ lbl_ir/lbl_ir/tasks/Worms/__init__.py | 0 lbl_ir/lbl_ir/tasks/__init__.py | 0 lbl_ir/lbl_ir/tasks/baseline/__init__.py | 0 lbl_ir/lbl_ir/tasks/baseline/rubberband.py | 29 + lbl_ir/lbl_ir/tasks/preprocessing/__init__.py | 0 .../lbl_ir/tasks/preprocessing/data_prep.py | 96 ++++ lbl_ir/lbl_ir/tasks/preprocessing/denoise.py | 18 + .../tasks/preprocessing/spatial_mask.py | 41 ++ lbl_ir/lbl_ir/tasks/preprocessing/svd_data.py | 16 + .../lbl_ir/tasks/preprocessing/transform.py | 22 + lbl_ir/setup.py | 100 ++++ 41 files changed, 3717 insertions(+) create mode 100644 lbl_ir/.gitignore create mode 100644 lbl_ir/README.md create mode 100644 lbl_ir/lbl_ir/GPR/GPR_engine.py create mode 100644 lbl_ir/lbl_ir/GPR/GPR_peaks.py create mode 100644 lbl_ir/lbl_ir/GPR/__init__.py create mode 100644 lbl_ir/lbl_ir/GPR/spectral_peak_picker.py create mode 100644 lbl_ir/lbl_ir/__init__.py create mode 100644 lbl_ir/lbl_ir/data_objects/__init__.py create mode 100644 lbl_ir/lbl_ir/data_objects/ir_map.py create mode 100644 lbl_ir/lbl_ir/gui_tools/__init__.py create mode 100644 lbl_ir/lbl_ir/gui_tools/ispectrum.py create mode 100644 lbl_ir/lbl_ir/gui_tools/rc2ind_mapping.py create mode 100644 lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/DataObject.py create mode 100644 lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/OmnicMap.py create mode 100644 lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/__init__.py create mode 100644 lbl_ir/lbl_ir/io_tools/__init__.py create mode 100644 lbl_ir/lbl_ir/io_tools/basic_parser.py create mode 100644 lbl_ir/lbl_ir/io_tools/map_IO.py create mode 100644 lbl_ir/lbl_ir/io_tools/read_XAS.py create mode 100644 lbl_ir/lbl_ir/io_tools/read_map.py create mode 100644 lbl_ir/lbl_ir/io_tools/read_numpy.py create mode 100644 lbl_ir/lbl_ir/io_tools/read_omnic.py create mode 100644 lbl_ir/lbl_ir/math_tools/__init__.py create mode 100644 lbl_ir/lbl_ir/math_tools/batched_SVD.py create mode 100644 lbl_ir/lbl_ir/simulations/__init__.py create mode 100644 lbl_ir/lbl_ir/simulations/spectra_map_simulator.py create mode 100644 lbl_ir/lbl_ir/tasks/NMF/__init__.py create mode 100644 lbl_ir/lbl_ir/tasks/NMF/basic_NMF.py create mode 100644 lbl_ir/lbl_ir/tasks/NMF/multi_set_analyses.py create mode 100644 lbl_ir/lbl_ir/tasks/Worms/Shai_Hulut.py create mode 100644 lbl_ir/lbl_ir/tasks/Worms/__init__.py create mode 100644 lbl_ir/lbl_ir/tasks/__init__.py create mode 100644 lbl_ir/lbl_ir/tasks/baseline/__init__.py create mode 100644 lbl_ir/lbl_ir/tasks/baseline/rubberband.py create mode 100644 lbl_ir/lbl_ir/tasks/preprocessing/__init__.py create mode 100644 lbl_ir/lbl_ir/tasks/preprocessing/data_prep.py create mode 100644 lbl_ir/lbl_ir/tasks/preprocessing/denoise.py create mode 100644 lbl_ir/lbl_ir/tasks/preprocessing/spatial_mask.py create mode 100644 lbl_ir/lbl_ir/tasks/preprocessing/svd_data.py create mode 100644 lbl_ir/lbl_ir/tasks/preprocessing/transform.py create mode 100644 lbl_ir/setup.py diff --git a/lbl_ir/.gitignore b/lbl_ir/.gitignore new file mode 100644 index 0000000..cc715cc --- /dev/null +++ b/lbl_ir/.gitignore @@ -0,0 +1,2 @@ +__pycache__/ +.ipynb_checkpoints/ \ No newline at end of file diff --git a/lbl_ir/README.md b/lbl_ir/README.md new file mode 100644 index 0000000..234c43d --- /dev/null +++ b/lbl_ir/README.md @@ -0,0 +1,30 @@ +# README # + + +This README would normally document whatever steps are necessary to get your application up and running. + +### What is this repository for? ### + +* Quick summary +* Version +* [Learn Markdown](https://bitbucket.org/tutorials/markdowndemo) + +### How do I get set up? ### + +* Summary of set up +* Configuration +* Dependencies +* Database configuration +* How to run tests +* Deployment instructions + +### Contribution guidelines ### + +* Writing tests +* Code review +* Other guidelines + +### Who do I talk to? ### + +* Repo owner or admin +* Other community or team contact diff --git a/lbl_ir/lbl_ir/GPR/GPR_engine.py b/lbl_ir/lbl_ir/GPR/GPR_engine.py new file mode 100644 index 0000000..e1c7f75 --- /dev/null +++ b/lbl_ir/lbl_ir/GPR/GPR_engine.py @@ -0,0 +1,143 @@ +import numpy as np +import matplotlib.pyplot as plt +import numba +from scipy.optimize import minimize +from scipy.optimize import basinhopping + +@numba.jit(nopython=True) #,cache=True) +def dmat(X1,X2=None): + if X2 is None: + X2 = X1 + N1,M1 = X1.shape + N2,M2 = X2.shape + + dd = np.zeros( (N2,N1) ) + for ii in range(N2): + for jj in range(N1): + tmp = 0 + for kk in range(M1): + delta = X2[ii,kk]-X1[jj,kk] + tmp += delta*delta + tmp = np.sqrt( tmp ) + dd[ii,jj]=tmp + return dd + +@numba.jit(nopython=True) #,cache=True) +def rbf_kern(dmat, variance, length): + result = np.exp( -dmat*dmat/(1e-8+length*length*2.0))*(1e-8+variance) + return result + +@numba.jit(nopython=True) #,cache=True) +def d_rbf_kern_FD(X2, X, variance, length, h=1e-4): + dmat_plus = dmat(X,X2+h/2) + dmat_minus= dmat(X,X2-h/2) + Kplus = np.exp( -dmat_plus*dmat_plus/(length*length*2.0) )*variance + Kminus = np.exp( -dmat_minus*dmat_minus/(length*length*2.0) )*variance + result = (Kplus - Kminus)/h + return result + +def d_rbf_kern(X2, X, dxx2, Kxx2, variance, length): + # first derivative + result1 = [] + for xx in X2.flatten(): + result1.append( X.flatten()-xx ) + result1 = np.vstack(result1) + result1 = result1*Kxx2 + + # second derivative + result2 = [] + N2,N1 = result1.shape + for ii in range(N2): + xx = X2[ii,:] + dK = result1[ii,:] + K = Kxx2[ii,:] + tmp = -K/(length*length) + tmp2 = (X-xx).flatten()*dK.flatten()/(length*length) + result2.append( tmp.flatten()+tmp2.flatten() ) + result2 = np.vstack(result2) + return result1, result2 + + + +class GPR_exp_fitter(object): + def __init__(self,sigma,length, mu=0,niter=3): + """ + :param sigma: The sigma + :param length: The length scale + :param mu: The mean value + :param niter: the number of iterations in basin hopping to fit the GPR model + """ + + self.sigma = sigma + self.length = length + self.mu = mu + + # to compute later + self.dX1X1 = None + + + def marginal_likelihood(self,hparams): + this_mu = hparams[0] + this_sigma = hparams[1] + this_length= hparams[2] + KX1X1 = rbf_kern( self.dX1X1, this_sigma*this_sigma, this_length ) + + II = np.diag(self.sY*self.sY) + KX1X1_inv = np.linalg.pinv(KX1X1+II) + tY = self.Y - this_mu + tY = tY.reshape(-1,1) + KiY = KX1X1_inv.dot(tY) + term1 = 0.5*tY.transpose().dot(KiY) + term2 = 0.5*np.linalg.slogdet(KX1X1+II)[1] + + result = term1+term2 + result = result.flatten()[0] + return result + + + def fit(self,X,Y,sY): + # first we need to build a distance matrix + self.sY = sY + if type(self.sY) is float: + self.sY = self.Y*0+sY + self.X = X + self.Y = Y + self.dX1X1 = dmat(X.reshape(-1,1)) + fitter = basinhopping( func = self.marginal_likelihood, + x0 = np.array([self.mu, self.sigma, self.length]), + niter = 13) + self.mu = fitter.x[0] + self.sigma = abs(fitter.x[1]) + self.length = abs(fitter.x[2]) + + + self.tY = (Y - self.mu).reshape(-1,1) + self.KX1X1 = rbf_kern( self.dX1X1, self.sigma**2.0, self.length ) + np.eye( self.dX1X1.shape[0])*self.sY + self.KX1X1_inv = np.linalg.pinv(self.KX1X1) + self.KiY = self.KX1X1_inv.dot(self.tY) + + + + def predict(self,X): + dX1X2 = dmat(self.X.reshape(-1,1), X.reshape(-1,1)) + kX1X2 = rbf_kern( dX1X2, self.sigma**2, self.length ) + tmp = kX1X2.dot( self.KiY ) + return tmp+self.mu + + + + +def tst(): + x = np.linspace(-10,10,20, True) + xx = np.linspace(-10,10,200,True) + y = np.sin(x) #10 + x*x + x + + plt.plot(x,y,'.');plt.show() + obj = GPR_exp_fitter(1,1,1) + obj.fit(x,y,0.01) + yy = obj.predict( xx ).flatten() + plt.plot(x,y,'.'); plt.plot(xx,yy);plt.show() + + +if __name__ == "__main__": + tst() diff --git a/lbl_ir/lbl_ir/GPR/GPR_peaks.py b/lbl_ir/lbl_ir/GPR/GPR_peaks.py new file mode 100644 index 0000000..32c7069 --- /dev/null +++ b/lbl_ir/lbl_ir/GPR/GPR_peaks.py @@ -0,0 +1,227 @@ +import numpy as np +import matplotlib.pyplot as plt +import numba +from numpy.polynomial.polynomial import Polynomial +from scipy.optimize import minimize +from lbl_ir.GPR import GPR_engine + +""" +Here I try to use Gaussian process regression for identifying peaks +and estimate their standard deviation. +I build a simple GPR fitter myself because I needed more control over +kernel and hyper parameters. Things need to be cleaned up. + +""" + + +#@numba.jit(nopython=True) +def dmat(X1,X2=None): + if X2 is None: + X2 = X1 + N1,M1 = X1.shape + N2,M2 = X2.shape + + dd = np.zeros( (N2,N1) ) + for ii in range(N2): + for jj in range(N1): + tmp = 0 + for kk in range(M1): + delta = X2[ii,kk]-X1[jj,kk] + tmp += delta*delta + tmp = np.sqrt( tmp ) + dd[ii,jj]=tmp + return dd + +@numba.jit(nopython=True) +def rbf_kern(dmat, variance, length): + result = np.exp( -dmat*dmat/(length*length*2.0))*variance + return result + +def d_rbf_kerni_FD(X2, X, variance, length, h=1e-4): + dmat_plus = dmat(X,X2+h/2) + dmat_minus= dmat(X,X2-h/2) + Kplus = np.exp( -dmat_plus*dmat_plus/(length*length*2.0) )*variance + Kminus = np.exp( -dmat_minus*dmat_minus/(length*length*2.0) )*variance + result = (Kplus - Kminus)/h + return result + +def d_rbf_kern(X2, X, dxx2, Kxx2, variance, length): + # first derivative + result1 = [] + for xx in X2.flatten(): + result1.append( X.flatten()-xx ) + result1 = np.vstack(result1) + result1 = result1*Kxx2 + + # second derivative + result2 = [] + N2,N1 = result1.shape + for ii in range(N2): + xx = X2[ii,:] + dK = result1[ii,:] + K = Kxx2[ii,:] + tmp = -K/(length*length) + tmp2 = (X-xx).flatten()*dK.flatten()/(length*length) + result2.append( tmp.flatten()+tmp2.flatten() ) + result2 = np.vstack(result2) + return result1, result2 + + + +class peak_picker(object): + def __init__(self,X,Y,sY): + self.X = X + self.Y = Y + self.N = X.shape[0] + self.sY = sY + init_scale = np.std( self.X.flatten()) + obj = GPR_engine.GPR_exp_fitter( sigma=np.std(Y.flatten()), length=init_scale) + obj.fit( self.X, self.Y, self.sY ) + + self.lengthscale = obj.length + self.variance = obj.sigma**2.0 + self.mu = obj.mu + + # set things up for peak picking purposes + self.dXX = dmat(self.X) + self.Kxx = rbf_kern(self.dXX,self.variance,self.lengthscale) + self.Keff = np.eye( self.N )*self.sY*self.sY + self.Kxx + self.Keff_inv = np.linalg.pinv(self.Keff,rcond=1e-10) + self.Keff_invY= self.Keff_inv.dot(self.Y-self.mu) + + self.dx = np.mean( np.sort( self.dXX.flatten() )[self.N:self.N*2] ) + + + + + def predict(self,x, grads=True): + # setup stuff + dxx2 = dmat(self.X, x ) + dx2x2 = dmat(x) + Kxx2 = rbf_kern( dxx2, self.variance,self.lengthscale ) + Kx2x2 = rbf_kern( dx2x2, self.variance, self.lengthscale ) + + # mean and variance + cond_mean = Kxx2.dot( self.Keff_invY ) + self.mu + cond_variance = Kx2x2 - Kxx2.dot(self.Keff_inv).dot(Kxx2.transpose()) + + if grads: + # derivatives if requested + dK,ddK = d_rbf_kern(x, self.X, dxx2, Kxx2, self.variance, self.lengthscale) + dmu = dK.dot( self.Keff_invY ) + ddmu = ddK.dot( self.Keff_invY ) + return cond_mean, cond_variance, dmu, ddmu + + else: + return cond_mean, cond_variance + + def f(self,x): + xx = np.array([x]).reshape(-1,1) + result = self.predict(xx)[0][0,0]+self.mu + return -result + + + def find_peak(self, x, eps=1e-2, max_iter=1000): + init_simplex = np.array( [x, x+eps] ).reshape(-1,1) + x_opt = minimize(fun=self.f, method='Nelder-Mead',x0=x, options={'initial_simplex':init_simplex} ) + return x_opt.x + + def find_peak_oof(self, x, eps=1e-8,max_iter=1000, damp=1.0, peak_range=None): + # do a simple root finding starting from x + converged=False + x_in = np.array(x).reshape(-1,1) + iter = 0 + restart = 0 + max_delta = 1.0 + if peak_range is not None: + max_delta = np.max_peak(range) - np.min(peak_range) + max_delta = max_delta / 10.0 + while not converged: + m,v,dm,ddm = self.predict(x_in,True) + tmp = np.random.uniform(0.95,1.05,1)[0] + #print("HERE",m,v,dm,ddm) + delta = tmp*dm/ddm + #if np.abs(delta) > max_delta: + # delta = max_delta*(np.sign(delta)) + #print(x_in, delta, dm, ddm,"DELTA", x_in - delta*damp ) + x_in = x_in - delta*damp + iter+=1 + if np.abs(dm) < eps: + converged=True + if iter > max_iter: + converged = False + print("Early termination in peak finding. Apply damping") + restart += 1 + iter = 0 + x_in = np.array(x).reshape(-1,1) + damp = damp * 0.5 + if restart > 5: + print("Early termination in peak finding. Damping doesn't work") + converged = True + return None + return x_in[0,0] + + + def fst_der_prop(self,x): + x0 = np.array([x]).reshape(-1,1) + # we need to get the vector + M = self.X.flatten()-x + M = np.diag(M/self.lengthscale*self.lengthscale) + + dxx2 = dmat(self.X, x0 ) + dx2x2 = dmat(x0) + Kxx2 = rbf_kern( dxx2, self.variance,self.lengthscale ) + Kx2x2 = rbf_kern( dx2x2, self.variance, self.lengthscale ) + nmu = M.dot(Kxx2.transpose()).transpose().dot(self.Keff_invY) + tmp = M.dot(Kxx2.transpose()).transpose() + nmu = tmp.dot(self.Keff_invY) + nvar = Kx2x2 - tmp.dot(self.Keff_inv).dot(tmp.transpose()) + return nmu[0][0], nvar[0][0] + + def peak_and_std_via_resample(self,x_start,N=10, factor = 0.75): + x_peak = self.find_peak( x_start ) + h = self.dx*factor + x_around = np.array( [x_peak-h, x_peak, x_peak+h] ).reshape(-1,1) + # collect the new posterior mean and variance + mu, var = self.predict(x_around, grads=False) + fs = np.random.multivariate_normal( mu.flatten(), var, N ) + ds = [] + for ii in range(N): + c = Polynomial.fit( x_around.flatten()-x_peak, fs[ii,:], deg = 2 ) + c = c.coef + dx = -0.5*c[1]/c[2] + ds.append(dx) + return x_peak, np.std( ds ), mu[1], np.sqrt(np.abs(var[1][1])) + + +def tst(P=8,S=0.1, show=False): + X = np.random.uniform(-3,3,P).reshape(-1,1) # np.linspace(-3,3,P).reshape((P,1)) + X = np.linspace(-3,3,P).reshape((P,1)) + Y = 10.0*np.exp(-X*X) + np.random.normal(0,S, (P,1) ) + + this_one = np.argmax( Y.flatten() ) + this_x = X.flatten()[this_one] + S = np.zeros( P )+S + obj = peak_picker(X,Y,S) + peak,sigma,val,sig = obj.peak_and_std_via_resample(this_x, N=100) + assert abs(peak/sigma) < 4 + print( "OK" ) + if show: + Xstar = np.linspace(-3,3,1024).reshape(-1,1) + y,v,dm,ddm = obj.predict(Xstar, True) + plt.plot( X.flatten() , Y.flatten(), '.' ) + plt.plot( Xstar.flatten(), y.flatten(), '-' ) + #plt.plot( Xstar.flatten(), dm.flatten(), '--', lw=3) + #plt.plot( Xstar.flatten(), ddm.flatten(), '--', lw=2) + print(peak) + peak_val, peak_std = obj.predict(np.array([[peak[0]]]), False) + print(peak_val, peak_std) + plt.errorbar( peak, peak_val, peak_std, sigma )# '.', markersize=10) + plt.show() + + + + + +if __name__ =="__main__": + tst(P=35,S=0.25,show=True) diff --git a/lbl_ir/lbl_ir/GPR/__init__.py b/lbl_ir/lbl_ir/GPR/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/GPR/spectral_peak_picker.py b/lbl_ir/lbl_ir/GPR/spectral_peak_picker.py new file mode 100644 index 0000000..45d8fc3 --- /dev/null +++ b/lbl_ir/lbl_ir/GPR/spectral_peak_picker.py @@ -0,0 +1,116 @@ +import numpy as np +import matplotlib.pyplot as plt +from scipy.signal import find_peaks +import sys + +from lbl_ir.io_tools.read_map import read_all_formats +from lbl_ir.tasks.preprocessing.transform import to_absorbance +from lbl_ir.GPR.GPR_peaks import peak_picker + + +class spectral_peak_picker(object): + def __init__(self, + wavenumbers, + spectrum, + sigma=None, + window=5, + peak_height_threshold=0.1, + peak_separation_threshold=3, + peak_prominence=0.001, + ): + """ + + :param wavenumbers: The wavenumbers + :param spectrum: The IR spectrum (Absorbance) + :param sigma: The associated standard deviation. If None, a suitable default will be chosen. + :param window: A parameter that determines the window size when fitting peak using a GPR approach. + The default should be fine. + :param peak_height_threshold: minimum peak height + :param peak_separation_threshold: minimum distance between peaks + :param peak_prominence: peak prominance + """ + + self.wavenumbers = wavenumbers + self.Nwavs = len(wavenumbers) + self.spectrum = spectrum + self.sigma = sigma + self.window = window + self.peak_height_threshold = peak_height_threshold + self.peak_separation_threshold = peak_separation_threshold + self.peak_prominence = peak_prominence + + # first pass: find the peak using a simple approach + self.raw_peaks_indx, self.peak_props = find_peaks(self.spectrum, + height=self.peak_height_threshold, + distance=self.peak_separation_threshold, + prominence=self.peak_prominence ) + self.prominances = self.peak_props['prominences'] + + def refine_peaks(self, level=0.05, sigma_multi=0.0005): + these_peaks = self.prominances > level + these_peak_indx = self.raw_peaks_indx[ these_peaks ] + # now loop over these peaks and do the GPR stuff + peak_locations = [] + peak_sigmas = [] + peak_vals = [] + val_sigmas = [] + ok_flags = [] + for ii in these_peak_indx: + min_indx = max(ii-self.window,0) + max_indx = min(ii+self.window+1,self.Nwavs) + these_waves = self.wavenumbers[min_indx:max_indx] + these_specs = self.spectrum[min_indx:max_indx] + obs_sigma = np.sqrt(np.abs( these_specs ))*sigma_multi + + + + obj = peak_picker(X=these_waves.reshape(-1,1),Y=these_specs.reshape(-1,1),sY=obs_sigma) + x_start = np.mean(these_waves.flatten()) + + peak, sigma, val, val_sig = obj.peak_and_std_via_resample(x_start = x_start ) + if abs(peak - x_start) > 3*(these_waves[1]- these_waves[0]): + peak = x_start + sigma = 2*(these_waves[1]- these_waves[0]) + val = self.spectrum[ii] + val_sig = -1 + ok_flags.append(False) + else: + ok_flags.append(True) + + peak_locations.append(peak) + peak_sigmas.append(sigma) + peak_vals.append(val) + val_sigmas.append(val_sig) + return np.array(peak_locations).flatten(), \ + np.array(peak_sigmas).flatten(), \ + np.array(peak_vals).flatten(), \ + np.array(val_sigmas).flatten(), \ + np.array(ok_flags).flatten() + + + + + + + + + + + +def tst(filename): + map, fmt = read_all_formats(filename) + data,bg = to_absorbance( map.data,map.wavenumbers ) + waves = map.wavenumbers + spec = np.mean(data, axis=0) + #plt.plot(spec);plt.show() + obj = spectral_peak_picker(waves, spec, sigma=0.05, peak_height_threshold=0.1) + peaks, sigma, val, vs, ok = obj.refine_peaks( 0.005) + plt.plot(waves, spec,'.-', markersize=4) + plt.plot(peaks,val,'x',markersize=8);plt.show() + plt.plot( peaks, sigma, '.', markersize=4); plt.show() + + + + +if __name__ =="__main__": + tst(sys.argv[1]) diff --git a/lbl_ir/lbl_ir/__init__.py b/lbl_ir/lbl_ir/__init__.py new file mode 100644 index 0000000..4f1fbed --- /dev/null +++ b/lbl_ir/lbl_ir/__init__.py @@ -0,0 +1 @@ +from . import data_objects, GPR, gui_tools, io_tools, math_tools, simulations, tasks diff --git a/lbl_ir/lbl_ir/data_objects/__init__.py b/lbl_ir/lbl_ir/data_objects/__init__.py new file mode 100644 index 0000000..139597f --- /dev/null +++ b/lbl_ir/lbl_ir/data_objects/__init__.py @@ -0,0 +1,2 @@ + + diff --git a/lbl_ir/lbl_ir/data_objects/ir_map.py b/lbl_ir/lbl_ir/data_objects/ir_map.py new file mode 100644 index 0000000..d5cc26e --- /dev/null +++ b/lbl_ir/lbl_ir/data_objects/ir_map.py @@ -0,0 +1,504 @@ +import numpy as np +import h5py +import datetime +import sys +import os +import matplotlib.pyplot as plt + +def val2ind(val, an_array): + return np.argmin(abs(an_array-val), axis=0) + +class sample_info(object): + """ + A simple class that contains sample info. + + Arguments: + ---------- + + sample_id : A string that identifies the sample, spaces will be + substituted for underscores. + Specifying this is mandatory. + + sample_meta_data : More verbose description of the data. Having this + structured isn't a bad idea, but not enforced at this + level. Not requiered but highly encouraged. + + sample_date : The date at which the data was taken. Default is + today. + + Attributes: + ----------- + + show(out) : prints the contents of id, meta data and date to out. + If out is None, it defaults to sys.stdout + + Examples: + --------- + + si = sample_info(sample_id = 'C_elegans', + sample_date='2004_04_18', + sample_meta_data='Some details.') + si.show() + + """ + def __init__(self, sample_id="Unknown", sample_meta_data="None", sample_date=None): + assert ' ' not in sample_id + self.sample_id = sample_id + + self.sample_meta_data = sample_meta_data + if sample_date is None: + sample_date = str(datetime.date.today().year)+ \ + '_'+str(datetime.date.today().month)+ \ + '_'+str(datetime.date.today().day) + + self.sample_date = sample_date + + def show(self, out=None): + if out is None: + out = sys.stdout + print("Sample_id : %s "%self.sample_id, file=out) + print("Sample date : %s "%self.sample_date, file=out ) + print("Sample description:\n ", self.sample_meta_data, file=out ) + + +class ir_map(object): + """ A simple data object that contains IR data. + + Arguments: + ---------- + wavenumbers : An array of wavenumbers + + sample_info : A sample_info object + + filename : The hdf5 filename where data will be read from. Required for + the 'hdf5' mode. + + data_type : Either 'transmission', 'reflection', or 'absorbance'(default) + + _mode : Choice between 'memory' or 'hdf5' + If 'memory', the dataset currenly resides in memory + If 'hdf5', the dataset currenly resides in an hdf5 file + + _N_obs : The number of rows in the 2D spectral matrix. + + Attributes: + ----------- + As above plus + + add_data(self, spectrum, xy) : add data, provide a numpy array of spectra + and xy positions + + _allocate_space(self) : this is a function that allocates space for + an hdf5 file. no need to call it yourself. + + write_as_hdf5(self, filename) : Writes in-memory data as an hdf5 file. + + """ + + def __init__(self, + wavenumbers = [], + sample_info = sample_info(), + filename = None, + data_type = 'absorbance', + with_image_cube = False, + with_factorization = False): + self.wavenumbers = wavenumbers + self.N_w = len(wavenumbers) + self.sample_info = sample_info + self._h5_filename = filename + self.xy = np.empty( (0,2) ) + self.data = np.empty( (0,self.N_w) ) + self._N_obs = 0 + self._with_image_cube = with_image_cube + self._with_factorization = with_factorization + + assert data_type in ['transmission', 'reflection', 'absorbance'] + self.data_type = data_type + + if self._h5_filename is not None: # hdf5 mode, load data from hdf5 file + self._mode = 'hdf5' + + self._h5= h5py.File(self._h5_filename,'r') + with self._h5: + self._root = list(self._h5.keys())[0] #get sample root group name + self.sample_info.sample_id = self._h5[self._root+'/info/sample_id'][()] + self.sample_info.sample_meta_data = self._h5[self._root+'/info/sample_meta_data'][()] + self.sample_info.sample_date = self._h5[self._root+'/info/sample_date'][()] + else: # memory mode, data is in memory + self._mode = 'memory' + self._h5 = None # this stays None until we allocate space + +# assert self.sample_info.sample_id != "Unknown", "Missing 'sample_info' keyword parameter" + self._root = str(self.sample_info.sample_id) + '_' + str(self.sample_info.sample_date) + + def add_data(self, spectrum=None, xy=None, ind=[]): + """When working in memory mode, append the data in memory into the ir_map object. + + When working in hdf5 mode, load the data from the hdf5 file. + + Arguments: + + ---------- + spectrum : The 2D spectral data matrix + + xy : An array of xy positions + + ind : An array of indices for selecting specific rows in the 2D spectra matrix. + If it is not given(default), full spectra matrix with all data points are loaded + into the ir_map object, 1D int array + + """ + if self._mode == 'memory': + assert spectrum is not None, "please provide a spectrum matrix" + assert xy is not None, "please provide a xy position array" + + if len(ind) == 0: + self.xy = np.append(self.xy, xy, axis = 0) + self.data = np.append(self.data, spectrum, axis = 0) + else: + self.xy = np.append(self.xy, xy[ind,:], axis = 0) + self.data = np.append(self.data, spectrum[ind,:], axis = 0) + + if self._mode == 'hdf5': + self._h5= h5py.File(self._h5_filename,'r') + with self._h5: + self.wavenumbers = self._h5[self._root+'/data/wavenumbers'][:] + if len(ind) == 0: + self.data = self._h5[self._root+'/data/spectra'][:,:] + self.xy = self._h5[self._root+'/data/xy'][:,:] + else: + self.data = self._h5[self._root+'/data/spectra'][ind,:] + self.xy = self._h5[self._root+'/data/xy'][ind,:] + + def add_image_cube(self, imageCube=None, imageMask=None, image_grid_param=None, ind=[]): + """When working in memory mode, load the image cube data in memory into the ir_map object + and flatten the image cube to 2d spectrum matrix. + + When working in hdf5 mode, load the data from the hdf5 file and flatten the image cube + to 2d spectrum matrix. + + Arguments: + + ---------- + imageCube : The spectral image cube, 3D float array + + imageMask : An image mask where non-blank pixels = True, 2D bool array + + image_grid_param : [x0, y0, dx, dy], 1D float list or array + + ind : An array of indices for selecting wavenumber range. If it is not given(default), + full spectrum are loaded into the ir_map object, 1D int array + """ + self._with_image_cube = True + + if self._mode == 'memory': + assert imageCube is not None, "please provide an image cube" + assert imageMask is not None, "please provide an image mask matrix" + assert image_grid_param is not None, "please provide image grid parameters : [x0, y0, dx, dy]" + + self.imageMask = imageMask + self.image_grid_param = image_grid_param + self.N_y, self.N_x = imageMask.shape[0], imageMask.shape[1] + + if len(ind) == 0:# read in full spectra + self.imageCube = imageCube + else:# read in partial spectra + self.imageCube = imageCube[:,:,ind] + assert len(ind) <= len(self.wavenumbers), "The selected wavenumber indices is longer than the full wavenumber range" + self.wavenumbers = self.wavenumbers[ind] + self.N_w = len(self.wavenumbers) + # convert image cube to 2d data matrix and load the data into self.data, self.xy + self.flatten_image_cube(imageCube, imageMask, image_grid_param) + + if self._mode == 'hdf5': + self._h5= h5py.File(self._h5_filename,'r') + with self._h5: + self.imageMask = self._h5[self._root+'/data/image/image_mask'][:,:] + self.image_grid_param = self._h5[self._root+'/data/image/image_grid_param'][:] + self.wavenumbers = self._h5[self._root+'/data/wavenumbers'][:] + if len(ind) == 0:# read in full spectra + self.imageCube = self._h5[self._root+'/data/image/image_cube'][:,:,:] + else:# read in partial spectrum + self.imageCube = self._h5[self._root+'/data/image/image_cube'][:,:,ind] + assert len(ind) <= len(self.wavenumbers), "The selected wavenumber indices is longer than the full wavenumber range" + self.wavenumbers = self.wavenumbers[ind] + self.N_w = len(self.wavenumbers) + # convert image cube to 2d data matrix and load the data into self.data, self.xy + self.flatten_image_cube(self.imageCube, self.imageMask, self.image_grid_param) + + def add_factorization(self, component=None, component_coef=None, prefix='PCA', ind=[]): + """When working in memory mode, load the factorized components data in memory into the ir_map object. + + When working in hdf5 mode, load the data from the hdf5 file. + + Arguments: + + ---------- + component : The spectral image cube, 3D float array + + component_coef : An image mask where non-blank pixels = True, 2D bool array + + prefix : Name of the factorized components, e.g. PCA, MCR + + ind : An array of indices for selecting specific rows in the 2D spectra matrix. + If it is not given(default), full spectra matrix with all data points are loaded + into the ir_map object, 1D int array + """ + self._with_factorization = True + self._factor_prefix = prefix + '_' + + if self._mode == 'memory': + assert component is not None, "please provide a component matrix" + assert component_coef is not None, "please provide a component_coef matrix" + + self.component = component + self.N_component = component.shape[0] + if len(ind) == 0:# read in all data + self.component_coef = component_coef + else:# read in partial data points + self.component_coef = component_coef[ind,:] + + if self._mode == 'hdf5': + self._h5= h5py.File(self._h5_filename,'r') + with self._h5: + self.component = self._h5[self._root + '/data/factorization/' + self._factor_prefix + 'component'][:,:] + self.N_component = self.component.shape[0] + if len(ind) == 0: # read in all data + self.component_coef = self._h5[self._root + '/data/factorization/' + self._factor_prefix + 'component_coef'][:,:] + else: # read in partial data points + self.component_coef = self._h5[self._root + '/data/factorization/' + self._factor_prefix + 'component_coef'][ind,:] + # check the component dimensions match self.data dimensions + assert self.component.shape[1] == self.data.shape[1], "number of wavenumbers in component does not match that of spectra matrix" + assert self.component_coef.shape[0] == self.data.shape[0], "number of rows in component_coef does not match that of spectra matrix" + + def _allocate_space(self): + + self._h5= h5py.File(self._h5_filename,'w') + data_group = self._h5.create_group( self._root ) + data_group.create_dataset( 'data/xy', + (self._N_obs, 2), + dtype='float32') # we just allocate space + data_group.create_dataset('data/wavenumbers', + data = self.wavenumbers, + dtype='float32') # this we can keep in memory + data_group.create_dataset('data/spectra', + (self._N_obs,self.N_w), + dtype='float32') # we just allocate space + + dt = h5py.special_dtype(vlen=str) + data_group.create_dataset('info/sample_id', + data = self.sample_info.sample_id, + dtype= dt ) + + data_group.create_dataset('info/sample_meta_data', + data = self.sample_info.sample_meta_data, + dtype= dt ) + + data_group.create_dataset('info/sample_date', + data = self.sample_info.sample_date, + dtype= dt ) + if self._with_image_cube: + data_group.create_dataset('data/image/image_cube', + (self.N_y, self.N_x, self.N_w), + dtype='float32') # we just allocate space + data_group.create_dataset('data/image/image_mask', + (self.N_y, self.N_x), + dtype='bool') # we just allocate space + data_group.create_dataset('data/image/ind_rc_map', + (self._N_obs, 3), + dtype='int') # we just allocate space + data_group.create_dataset('data/image/image_grid_param', + data = self.image_grid_param, + dtype='float32') # this we keep in memory + + if self._with_factorization: + data_group.create_dataset('data/factorization/' + self._factor_prefix + 'component', + (self.N_component, self.N_w), + dtype='float32') # we just allocate space + data_group.create_dataset('data/factorization/' + self._factor_prefix + 'component_coef', + (self._N_obs, self.N_component), + dtype='float32') # we just allocate space + + def write_as_hdf5(self, filename): + """Save the object out as an hdf5 file. + + Arguments: + + ---------- + filename : The hdf5 filename where data will be written to. + + """ + # prevent overwriting the existing hdf5 files + assert self._h5_filename != filename, \ + "The given hdf5 filename already exists. Please provide a different filename" + + self._h5_filename = filename + self._N_obs = self.data.shape[0] + self._allocate_space( ) + + with self._h5: + self._h5[self._root + '/data/xy'][:,:] = self.xy + self._h5[self._root + '/data/spectra'][:,:] = self.data + + if self._with_image_cube: #save image cube + self._h5[self._root + '/data/image/image_cube'][:,:,:] = self.imageCube + self._h5[self._root + '/data/image/image_mask'][:,:] = self.imageMask + self._h5[self._root + '/data/image/ind_rc_map'][:,:] = self.ind_rc_map + self._h5[self._root + '/data/image/image_grid_param'][:] = self.image_grid_param + + if self._with_factorization: #save factorization + self._h5[self._root + '/data/factorization/' + self._factor_prefix +'component'][:,:] = self.component + self._h5[self._root + '/data/factorization/' + self._factor_prefix +'component_coef'][:,:] = self.component_coef + + print(f'Data is saved as an HDF5 file. Filename : {filename}') + + def to_image_cube(self, N_x=64, N_y=64, x0=0, y0=0, dx=1, dy=1): + """Transform the spectra matrix to 3D image cube. + + The third dimension of the image cube is the spectra data. + + Arguments: + ---------- + (x0, y0) : The starting location of the ir image. + + (N_x, N_y) : The size of the image. + + (dx, dy) : The step size of the image. + + Returns: + -------- + imageCube : The spectral image cube, 3D float array + + imageMask : An image mask where non-blank pixels = True, 2D bool array + + pointCounts : A mask that shows measurement counts in each pixel, 2D int array + """ + + self._with_image_cube = True + + self.N_x = N_x + self.N_y = N_y + self.image_grid_param = np.array([x0, y0, dx, dy], dtype='float32') + + self.imageCube = np.zeros((self.N_y, self.N_x, self.N_w), dtype='float32') + self.pointCounts = np.zeros((self.N_y, self.N_x), dtype='int') + ind_rc_map = np.zeros((self.xy.shape[0], 3), dtype='int') # ind to row-col mapping [i, row, col] + + x = np.arange(self.N_x)*dx + x0 + y = np.arange(self.N_y)*dy + y0 + + for i in range(self.xy.shape[0]): + ind_rc_map[i, 0] = i + ind_rc_map[i, 1] = val2ind(self.xy[i, 1], y) # align y coordinate to get row + ind_rc_map[i, 2] = val2ind(self.xy[i, 0], x) # align x coordinate to get col + self.pointCounts[ind_rc_map[i, 1], ind_rc_map[i, 2]] += 1 # count how many measurements fall in a pixel + self.imageCube[ind_rc_map[i, 1], ind_rc_map[i, 2], :] += self.data[i,:]# add all spectra that fall in a pixel + + self.imageCube /= np.where(self.pointCounts != 0, self.pointCounts,1)[:,:,np.newaxis]# get average spectra per pixel + self.imageMask = self.pointCounts.astype('bool') # convert to boolean matrix + self.ind_rc_map = ind_rc_map + + return self.imageCube, self.imageMask, self.pointCounts + + def flatten_image_cube(self, imageCube, imageMask, image_grid_param): + """Transform a 3D image cube into a spectra matrix using imageMask to filter out blank data points, + and load the matrix into self.data, load the xy positions of the data points into self.xy + + Arguments: + ---------- + imageCube : The spectral image cube, 3D float array + + imageMask : An image mask where non-blank pixels = True, 2D bool array + + image_grid_param : [x0, y0, dx, dy], 1D float list or array + """ + self.N_x = N_x = imageCube.shape[1] + self.N_y = N_y = imageCube.shape[0] + x0 = image_grid_param[0] + y0 = image_grid_param[1] + dx = image_grid_param[2] + dy = image_grid_param[3] + # set up xy grid and use imageMask to pull out non-blank pixel xy-coordinate + x = np.linspace(x0, x0+dx*(N_x-1), N_x) + y = np.linspace(y0, y0+dy*(N_y-1), N_y) + xv, yv = np.meshgrid(x, y) + xy_grid = np.zeros((N_y, N_x, 2)) + xy_grid[:,:,0] = xv + xy_grid[:,:,1] = yv + + # set up image grid and use imageMask to pull out non-blank pixel row, col position + x = np.arange(N_x) + y = np.arange(N_y) + X, Y = np.meshgrid(x,y) + ind_rc_map = np.zeros((len(X[imageMask]), 3), dtype='int') # ind to row-col mapping [i, row, col] + for i, (r,c) in enumerate(zip(Y[imageMask], X[imageMask])): + ind_rc_map[i,:] = [i, r, c] + + self.xy = xy_grid[imageMask,:] + self.data = imageCube[imageMask,:] + self.ind_rc_map = ind_rc_map + +if __name__ == "__main__": + si = sample_info(sample_id = 'C_elegans') + si.show() + #prespare sample data + np.random.seed(3) + N_wav = 100 + N_obs = 100 + waves = np.linspace(500,4000,N_wav) + data = np.random.uniform(0,1, (N_obs, N_wav) ) + xy = np.random.uniform(-5,5, (N_obs, 2) ) + imageCube = data.reshape(-1, 10, N_wav) + imageMask = np.random.random((N_obs//10, 10)) > 0.5 + x0, y0, dx, dy = 0, 0, 1, 1 + image_grid_param = [x0, y0, dx, dy] + component = np.random.random((3, N_wav)) + component_coef = np.random.random((imageMask.sum(), 3)) + # test loading 2d spectra matrix and writing into hdf5 file + ir_data = ir_map( waves, si) + ir_data.add_data( data, xy ) + ir_data.write_as_hdf5('tst_file.h5') + + # test loading 2d spectra matrix from a hdf5 file + ir_data2 = ir_map(filename ='tst_file.h5' ) + ir_data2.add_data() #load full data matrix + print(ir_data2.data.shape) + ir_data2.add_data(ind=np.arange(20)) #load partial data matrix + print(ir_data2.data.shape) + os.remove('tst_file.h5') + + # test loading image cube data + ir_data3 = ir_map( waves, si) + ir_data3.add_image_cube(imageCube, imageMask, image_grid_param) + assert ir_data3.data.shape[0] == imageMask.sum(), "number of rows in ir_data3.data doesn't match non-blank pixels in imageMask" + r , c= np.where(imageMask) + assert np.all(ir_data3.xy[:,0] == c), "x coordinates in ir_data3.xy doesn't match that of non-blank pixels in imageMask" + assert np.all(ir_data3.xy[:,1] == r), "y coordinates in ir_data3.xy doesn't match that of non-blank pixels in imageMask" + + # loading factorization component + ir_data3.add_factorization(component, component_coef) + + # writing into hdf5 file + ir_data3.write_as_hdf5('tst_file2.h5') + # show hdf5 file dataset structure + lst=[] + with h5py.File('tst_file2.h5','r') as f: + root_name = list(f.keys())[0] + h = f[root_name] + f.visit(lst.append) + ind_rc_map = f[root_name + '/data/image/ind_rc_map'][:,:] + print(*lst, sep='\n') + print(ind_rc_map[:20, :]) + plt.imshow(imageMask) + + # test loading image cube and factorization components from a hdf5 file + ir_data4 = ir_map(filename='tst_file2.h5') + ir_data4.add_image_cube() + ir_data4.add_factorization() + print(ir_data4.data.shape) + print(ir_data4.component.shape) + print(ir_data4.component_coef.shape) + + os.remove('tst_file2.h5') + + print('OK') diff --git a/lbl_ir/lbl_ir/gui_tools/__init__.py b/lbl_ir/lbl_ir/gui_tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/gui_tools/ispectrum.py b/lbl_ir/lbl_ir/gui_tools/ispectrum.py new file mode 100644 index 0000000..a0f0bd2 --- /dev/null +++ b/lbl_ir/lbl_ir/gui_tools/ispectrum.py @@ -0,0 +1,85 @@ +# -*- coding: utf-8 -*- +""" +Created on Fri Mar 22 17:34:27 2019 + +@author: lchen43 +""" +import matplotlib.pyplot as plt +from matplotlib.patches import Circle +from lbl_ir.data_objects.ir_map import val2ind + +class ispectrum: + + def __init__(self, wavenumbers, y): + self.f, self.ax = plt.subplots(figsize=(8,4)) + self.wavenumbers, self.y = wavenumbers, y + self.ax.plot(wavenumbers, y) + plt.xlim([4000,500]) + plt.title('Click on the spectrum to select peaks; right click to cancel selections'); + plt.show() + + self.pos = [] + self.connect() + + def connect(self): + '''connect to all the events + ''' + self.cidpress = self.f.canvas.mpl_connect('button_press_event', self.onclick) + self.cidmotion = self.f.canvas.mpl_connect('motion_notify_event', self.hover) + self.cidenter_axes = self.f.canvas.mpl_connect('axes_enter_event', self.in_axes) + self.cidleave_axes = self.f.canvas.mpl_connect('axes_leave_event', self.leave_axes) + + def disconnect(self): + '''disconnect all the stored connection ids + ''' + self.f.canvas.mpl_disconnect(self.cidpress) + self.f.canvas.mpl_disconnect(self.cidmotion) + self.f.canvas.mpl_disconnect(self.cidenter_axes) + self.f.canvas.mpl_disconnect(self.cidleave_axes) + return self.pos + + def onclick(self, event): + ind = val2ind(event.xdata, self.wavenumbers) + if event.button == 1: + self.pos.append([self.wavenumbers[ind], self.y[ind]]) + self.ax.plot(self.wavenumbers[ind], self.y[ind],'ro') + self.ax.text(self.wavenumbers[ind], self.y[ind]+0.03,str(len(self.pos))) + self.ax.texts[-1], self.ax.texts[-2] = self.ax.texts[-2], self.ax.texts[-1] + else: + if len(self.pos) > 0: + self.pos.pop() + self.ax.lines[-1].remove() + self.ax.texts[-2].remove() + + def hover(self, event): + ind = val2ind(event.xdata, self.wavenumbers) + self.ax.patches[-1].set_center((self.wavenumbers[ind],self.y[ind])) + self.ax.texts[-1].set_position((self.wavenumbers[ind],self.y[ind]+0.08)) + self.ax.texts[-1].set_text(str(self.wavenumbers[ind]) + ', ' +str(self.y[ind])) + + + def in_axes(self, event): + self.ax.texts = [] + self.ax.patches = [] + if event.inaxes: + ind = val2ind(event.xdata, self.wavenumbers) + self.ax.add_patch(Circle((self.wavenumbers[ind], self.y[ind]), radius = 0.05, color = 'r')) + if len(self.pos) > 0: + for i in range(len(self.pos)): + self.ax.text(self.pos[i][0], self.pos[i][1]+0.03, str(i+1)) + self.ax.text(self.wavenumbers[ind], self.y[ind], str(len(self.ax.texts))+ '-' + str(self.wavenumbers[ind]) + ', ' +str(self.y[ind])) + + def leave_axes(self, event): + self.ax.texts = [] + self.ax.patches = [] + +if __name__ == "__main__": + + import os + from ..io_tools.map_IO import read_spa + + test_data_home = '../test_irdata/' + + spa_file = os.path.join(test_data_home, 'test_data0001.spa') + wavenumbers, y, _, _ = read_spa(spa_file) + spec = ispectrum(wavenumbers, y) \ No newline at end of file diff --git a/lbl_ir/lbl_ir/gui_tools/rc2ind_mapping.py b/lbl_ir/lbl_ir/gui_tools/rc2ind_mapping.py new file mode 100644 index 0000000..a283ef4 --- /dev/null +++ b/lbl_ir/lbl_ir/gui_tools/rc2ind_mapping.py @@ -0,0 +1,23 @@ +import numpy as np + + +def getRC2Ind(imgShape, imageMask=None): + """ + In a 2D image, get a dictionary mapping from (row, col) to linear index i of flattened image, and vice versa, + :param imgShape: the shape of the image + :param imageMask: if the image is sparse, use imageMask to generate the mapping + :return: + """ + if imageMask == None: + imageMask = np.ones(imgShape) > 0 + N_x, N_y = imgShape[1], imgShape[0] + x = np.arange(N_x) + y = np.arange(N_y) + X, Y = np.meshgrid(x, y) + ind_rc_map = np.zeros((imgShape[0] * imgShape[1], 3), dtype='int') + for i, (r, c) in enumerate(zip(Y[imageMask], X[imageMask])): + ind_rc_map[i, :] = [i, r, c] + # make a dictionary + ind2rc = {x[0]: tuple(x[1:]) for x in ind_rc_map} + rc2ind = {tuple(x[1:]): x[0] for x in ind_rc_map} + return ind2rc, rc2ind \ No newline at end of file diff --git a/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/DataObject.py b/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/DataObject.py new file mode 100644 index 0000000..d330440 --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/DataObject.py @@ -0,0 +1,166 @@ +#/*########################################################################## +# +# The PyMca X-Ray Fluorescence Toolkit +# +# Copyright (c) 2004-2014 European Synchrotron Radiation Facility +# +# This file is part of the PyMca X-ray Fluorescence Toolkit developed at +# the ESRF by the Software group. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +#############################################################################*/ +__author__ = "V. Armando Sole - ESRF Data Analysis" +__contact__ = "sole@esrf.fr" +__license__ = "MIT" +__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" +import numpy + +class DataObject(object): + ''' + Simple container of an array and associated information. + Basically it has the members: + info: A dictionnary + data: An array, usually 2D, 3D, ... + + In the past also incorporated selection methods. + Now each different data source implements its selection methods. + + Plotting routines may add additional members + + x: A list containing arrays to be considered axes + y: A list of data to be considered as signals + m: A list containing the monitor data + ''' + GETINFO_DEPRECATION_WARNING = True + GETDATA_DEPRECATION_WARNING = True + SELECT_DEPRECATION_WARNING = True + + def __init__(self): + ''' + Defaut Constructor + ''' + self.info = {} + self.data = numpy.array([]) + + # all the following methods are here for compatibility purposes + # they are obsolete and bound to disappear. + + def getInfo(self): + """ + Deprecated method + """ + if DataObject.GETINFO_DEPRECATION_WARNING: + print("DEPRECATION WARNING: DataObject.getInfo()") + DataObject.GETINFO_DEPRECATION_WARNING = False + return self.info + + def getData(self): + """ + Deprecated method + """ + if DataObject.GETDATA_DEPRECATION_WARNING: + print("DEPRECATION WARNING: DataObject.getData()") + DataObject.GETDATA_DEPRECATION_WARNING = False + return self.data + + def select(self, selection=None): + """ + Deprecated method + """ + if DataObject.SELECT_DEPRECATION_WARNING: + print("DEPRECATION WARNING: DataObject.select(selection=None)") + DataObject.SELECT_DEPRECATION_WARNING = False + dataObject = DataObject() + dataObject.info = self.info + dataObject.info['selection'] = selection + if selection is None: + dataObject.data = self.data + return dataObject + if type(selection) == dict: + #dataObject.data = self.data #should I set it to none??? + dataObject.data = None + if 'rows' in selection: + dataObject.x = None + dataObject.y = None + dataObject.m = None + if 'x' in selection['rows']: + for rownumber in selection['rows']['x']: + if rownumber is None: + continue + if dataObject.x is None: + dataObject.x = [] + dataObject.x.append(self.data[rownumber, :]) + + if 'y' in selection['rows']: + for rownumber in selection['rows']['y']: + if rownumber is None: + continue + if dataObject.y is None: + dataObject.y = [] + dataObject.y.append(self.data[rownumber, :]) + + if 'm' in selection['rows']: + for rownumber in selection['rows']['m']: + if rownumber is None: + continue + if dataObject.m is None: + dataObject.m = [] + dataObject.m.append(self.data[rownumber, :]) + elif ('cols' in selection) or ('columns' in selection): + if 'cols' in selection: + key = 'cols' + else: + key = 'columns' + dataObject.x = None + dataObject.y = None + dataObject.m = None + if 'x' in selection[key]: + for rownumber in selection[key]['x']: + if rownumber is None: + continue + if dataObject.x is None: + dataObject.x = [] + dataObject.x.append(self.data[:, rownumber]) + + if 'y' in selection[key]: + for rownumber in selection[key]['y']: + if rownumber is None: + continue + if dataObject.y is None: + dataObject.y = [] + dataObject.y.append(self.data[:, rownumber]) + + if 'm' in selection[key]: + for rownumber in selection[key]['m']: + if rownumber is None: + continue + if dataObject.m is None: + dataObject.m = [] + dataObject.m.append(self.data[:, rownumber]) + if dataObject.x is None: + if 'Channel0' in dataObject.info: + ch0 = int(dataObject.info['Channel0']) + else: + ch0 = 0 + dataObject.x = [numpy.arange(ch0, + ch0 + len(dataObject.y[0])).astype(numpy.float)] + if not ("selectiontype" in dataObject.info): + dataObject.info["selectiontype"] = "%dD" % len(dataObject.y) + return dataObject diff --git a/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/OmnicMap.py b/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/OmnicMap.py new file mode 100644 index 0000000..a5bf3b3 --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/OmnicMap.py @@ -0,0 +1,363 @@ +#/*########################################################################## +# +# The PyMca X-Ray Fluorescence Toolkit +# +# Copyright (c) 2004-2014 European Synchrotron Radiation Facility +# +# This file is part of the PyMca X-ray Fluorescence Toolkit developed at +# the ESRF by the Software group. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# Note: Last modified by Liang Chen 5/14/2019 +#############################################################################*/ +__author__ = "V.A. Sole - ESRF Data Analysis" +__contact__ = "sole@esrf.fr" +__license__ = "MIT" +__copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" +import os +import sys +import re +import struct +import numpy +import copy + +from lbl_ir.io_tools.Omnic_PyMca5 import DataObject #modified + +DEBUG = 0 +SOURCE_TYPE = "EdfFileStack" + + +class OmnicMap(DataObject.DataObject): + ''' + Class to read OMNIC .map files + + It reads the spectra into a DataObject instance. + This class info member contains all the parsed information. + This class data member contains the map itself as a 3D array. + ''' + def __init__(self, filename): + ''' + Parameters: + ----------- + filename : str + Name of the .map file. + It is expected to work with OMNIC versions 7.x and 8.x + ''' + DataObject.DataObject.__init__(self) + if sys.platform == 'win32' or 1: #modified, "added or 1" + fid = open(filename, 'rb') + else: + fid = open(filename, 'rb') + data = fid.read() + fid.close() + + try: + omnicInfo = self._getOmnicInfo(data) + except: + omnicInfo = None + self.sourceName = [filename] + if sys.version < '3.0': + searchedChain = "Spectrum " + else: + searchedChain = bytes("Spectrum", 'utf-8') + firstByte = data.index(searchedChain) + s = data[firstByte:(firstByte + 100 - 16)] + if sys.version >= '3.0': + s = str(s) + if DEBUG: + print("firstByte = %d" % firstByte) + print("s1 = %s " % s) + exp = re.compile('(-?[0-9]+\.?[0-9]*)') + tmpValues = exp.findall(s) + spectrumIndex = int(tmpValues[0]) + self.nSpectra = int(tmpValues[1]) + if "X = " in s: + xPosition = float(tmpValues[2]) + yPosition = float(tmpValues[3]) + else: + # I have to calculate them from the scan + xPosition, yPosition = self.getPositionFromIndexAndInfo(0, omnicInfo) + if DEBUG: + print("spectrumIndex, nSpectra, xPosition, yPosition = %d %d %f %f" %\ + (spectrumIndex, self.nSpectra, xPosition, yPosition)) + if sys.version < '3.0': + chain = "Spectrum" + else: + chain = bytes("Spectrum", 'utf-8') + secondByte = data[(firstByte + 1):].index(chain) + secondByte += firstByte + 1 + if DEBUG: + print("secondByte = ", secondByte) + self.nChannels = int((secondByte - firstByte - 100) / 4) + if DEBUG: + print("nChannels = %d" % self.nChannels) + self.firstSpectrumOffset = firstByte - 16 + + #fill the header + self.header = [] + oldXPosition = xPosition + oldYPosition = yPosition + self.nRows = 0 + for i in range(self.nSpectra): + offset = int(firstByte + i * (100 + self.nChannels * 4)) + if sys.version < '3.0': + s = data[offset:(offset + 100 - 16)] + else: + s = str(data[offset:(offset + 100 - 16)]) + tmpValues = exp.findall(s) + spectrumIndex = int(tmpValues[0]) + if "X = " in s: + xPosition = float(tmpValues[2]) + yPosition = float(tmpValues[3]) + else: + #I have to calculate them from the scan + xPosition, yPosition = self.getPositionFromIndexAndInfo(i, omnicInfo) + if (abs(yPosition - oldYPosition) > 1.0e-6) and\ + (abs(xPosition - oldXPosition) < 1.0e-6): + break + self.nRows = self.nRows + 1 + if DEBUG: + print("DIMENSIONS X = %f Y=%d" %\ + ((self.nSpectra * 1.0) / self.nRows, self.nRows)) + + #arrange as an EDF Stack + self.info = {} + self.__nFiles = int(self.nSpectra / self.nRows) + self.data = numpy.zeros((self.__nFiles, self.nRows, self.nChannels), + dtype=numpy.float32) + + self.__nImagesPerFile = 1 + offset = firstByte - 16 + 100 # starting position of the data + delta = 100 + self.nChannels * 4 + fmt = "%df" % self.nChannels + for i in range(self.__nFiles): + for j in range(self.nRows): + # this approach is inneficient when compared to a direct + # data readout, but it allows to deal with nan at the source + tmpData = numpy.zeros((self.nChannels,), dtype=numpy.float32) + tmpData[:] = struct.unpack(fmt,\ + data[offset:(offset + delta - 100)]) + finiteData = numpy.isfinite(tmpData) + self.data[i, j, finiteData] = tmpData[finiteData] + offset = int(offset + delta) + shape = self.data.shape + for i in range(len(shape)): + key = 'Dim_%d' % (i + 1,) + self.info[key] = shape[i] + + self.info["SourceType"] = SOURCE_TYPE + self.info["SourceName"] = self.sourceName + self.info["Size"] = self.__nFiles * self.__nImagesPerFile + self.info["NumberOfFiles"] = self.__nFiles * 1 + self.info["FileIndex"] = 0 + self.info["Channel0"] = 0.0 + if omnicInfo is not None: + self.info['McaCalib'] = [omnicInfo['First X value'] * 1.0, + omnicInfo['Data spacing'] * 1.0, + 0.0] + else: + self.info["McaCalib"] = [0.0, 1.0, 0.0] + self.info['OmnicInfo'] = omnicInfo + + def _getOmnicInfo(self, data): + ''' + Parameters: + ----------- + data : The contents of the .map file + + Returns: + -------- + A dictionnary with acquisition information + ''' + #additional information + fmt = "I" # unsigned long in 32-bit + offset = 372 # 93*4 unsigned integers + infoBlockIndex = (struct.unpack(fmt, data[offset:(offset + 4)])[0] - 204) / 4. + infoBlockIndex = int(infoBlockIndex) + #infoblock is the position of the information block + offset = infoBlockIndex * 4 + #read 13 unsigned integers + nValues = 13 + fmt = "%dI" % nValues + values = struct.unpack(fmt, data[offset:(offset + 4 * nValues)]) + ddict = {} + ddict['Number of points'] = values[0] + ddict['Number of scan points'] = values[6] + ddict['Interferogram peak position'] = values[7] + ddict['Number of sample scans'] = values[8] + ddict['Number of FFT points'] = values[10] + ddict['Number of background scans'] = values[12] + offset = (infoBlockIndex + 3) * 4 + nFloats = 47 + fmt = "%df" % nFloats + vFloats = struct.unpack(fmt, data[offset:(offset + 4 * nFloats)]) + lastX = vFloats[0] + firstX = vFloats[1] + ddict['First X value'] = firstX + ddict['Last X value'] = lastX + ddict['Identifier for start indices of spectra'] = vFloats[14] + ddict['Laser frequency'] = vFloats[16] + ddict['Data spacing'] = (lastX - firstX) / (ddict['Number of points'] - 1.0) + ddict['Background gain'] = vFloats[10] + if DEBUG: + for key in ddict.keys(): + print(key, ddict[key]) + ddict.update(self.getMapInformation(data)) + return ddict + + def getMapInformation(self, data): + ''' + Internal method to help finding spectra coordinates + Parameters: + ----------- + data : Contents of the .map file + + Returns: + -------- + Dictionnary with map gemoetrical acquisition parameters + ''' + #look for the chain 'Position' (this is the old version, modified by Liang Chen 3/11/2019) +# if sys.version < '3.0': +# chain = 'Position' +# else: +# chain = bytes('Position', 'utf-8') +# offset = data.index(chain) +# positions = [offset] +# while True: +# try: +# a = data[(offset + 1):].index(chain) +# offset = a + offset + 1 +# positions.append(offset) +# except ValueError: +# break + + #look for the chain 'micrometers' (this is the new version, modified by Liang Chen 3/11/2019) + if sys.version < '3.0': + chain = 'micrometers' + else: + chain = bytes('micrometers', 'utf-8') + offset = data.index(chain) + x0_trial = struct.unpack('f', data[offset - 88 : offset - 84])[0] + + #look for the chain 'Spectrum ' + if sys.version < '3.0': + searchedChain = "Spectrum " + else: + searchedChain = bytes("Spectrum", 'utf-8') + firstSpectrum = data.index(searchedChain) + s = str(data[firstSpectrum : (firstSpectrum + 100 - 16)]) + exp = re.compile('(-?[0-9]+\.?[0-9]*)') + tmpValues = exp.findall(s) + x0 = float(tmpValues[2]) + + #look for the chain 'GMT' + if sys.version < '3.0': + chain = "GMT" + else: + chain = bytes("GMT", 'utf-8') + offset_year = data.index(chain) + year_collected = int(data[offset_year - 6 :offset_year - 2].decode('utf-8')) + ddict = {} + #map description position (this is the old version, modified by Liang Chen 3/11/2019) +# if (positions[1] - positions[0]) == 66: # reverse engineered magic number :-) +# mapDescriptionOffset = positions[0] - 90 +# mapDescription = struct.unpack('6f', data[mapDescriptionOffset:mapDescriptionOffset + 24]) +# y0, y1, deltaY, x0, x1, deltaX = mapDescription +# ddict['First map location'] = [x0, y0] +# ddict['Last map location'] = [x1, y1] +# ddict['Mapping stage X step size'] = deltaX +# ddict['Mapping stage Y step size'] = deltaY +# ddict['Number of spectra'] = abs((1 + ((y1 - y0) / deltaY)) * (1 + ((x1 - x0) / deltaX))) + + #map description position (this is the new version, modified by Liang Chen 5/14/2019) + if (round(x0_trial) == round(x0)) or (year_collected >= 2018): # if map was collected in 2018 or later, use default: offset - 100 + mapDescriptionOffset = offset - 100 + else: + mapDescriptionOffset = offset - 96 + + mapDescription = struct.unpack('6f', data[mapDescriptionOffset:mapDescriptionOffset + 24]) + y0, y1, deltaY, x0, x1, deltaX = mapDescription + ddict['First map location'] = [x0, y0] + ddict['Last map location'] = [x1, y1] + ddict['Mapping stage X step size'] = deltaX + ddict['Mapping stage Y step size'] = deltaY + ddict['Mapping stage parameters'] = [x0, y0, deltaX, deltaY] + ddict['Number of spectra'] = round(abs((1 + ((y1 - y0) / deltaY)) * (1 + ((x1 - x0) / deltaX)))) + + if DEBUG: + for key in ddict.keys(): + print(key, ddict[key]) + return ddict + + def getOmnicInfo(self): + """ + Returns a dictionnary with the parsed OMNIC information + """ + return copy.deepcopy(self.info['OmnicInfo']) + + def getPositionFromIndexAndInfo(self, index, info=None): + ''' + Internal method to obtain the position at which a spectrum + was acquired + Parameters: + ----------- + index : int + Index of spectrum + info : Dictionnary + Information recovered with _getOmnicInfo + Returns: + -------- + x, y : floats + Position at which the spectrum was acquired. + ''' + if info is None: + return 0.0, 0.0 + ddict = info + #first variation on X and then on Y + try: + x0, y0 = ddict['First map location'] + except KeyError: + return 0.0, 0.0 + x1, y1 = ddict['Last map location'] + deltaX = ddict['Mapping stage X step size'] + deltaY = ddict['Mapping stage Y step size'] + nX = round(1 + ((x1 - x0) / deltaX)) + x = x0 + (index % nX) * deltaX + y = y0 + int(index / nX) * deltaY + return x, y + +if __name__ == "__main__": + filename = None + if len(sys.argv) > 2: + DEBUG = int(sys.argv[2]) + if len(sys.argv) > 1: + filename = sys.argv[1] + elif os.path.exists("SambaPhg_IR.map"): + filename = "SambaPhg_IR.map" + if filename is not None: + w = OmnicMap(filename) + print(type(w)) + print(type(w.data[0:10])) + print(w.data[0:10]) + print("shape = ", w.data.shape) + print(type(w.info)) + print("INFO = ", w.info['OmnicInfo']) + else: + print("Please supply input filename") diff --git a/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/__init__.py b/lbl_ir/lbl_ir/io_tools/Omnic_PyMca5/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/io_tools/__init__.py b/lbl_ir/lbl_ir/io_tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/io_tools/basic_parser.py b/lbl_ir/lbl_ir/io_tools/basic_parser.py new file mode 100644 index 0000000..e61a347 --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/basic_parser.py @@ -0,0 +1,142 @@ +import configparser +import sys +import ast +import io + +""" +I put the output from configparser through some helper classes and create objects +with names and key / value pairs as laid out in the input file. +I find this a lot easier to work with then the raw config parser objects. + +""" + +class section_object(object): + def __init__(self, items): + for item in items: + key = item[0] + val = item[1].strip() + try: + val = ast.literal_eval(val.strip()) + except: pass + setattr(self, key, val) + + def as_txt(self): + txt = """""" + keys = [] + for key in self.__dict__.keys(): + if '__' not in key: + keys.append(key) + keys.sort() + for key in keys: + txt += key+'='+str(self.__dict__[key])+' \n' + return txt + + +class config_object(object): + def __init__(self, config): + for section in config.sections(): + items = config.items(section) + this_section_object = section_object(items) + setattr(self, section, this_section_object ) + + def as_txt(self): + txt = """""" + keys = [] + for key in self.__dict__.keys(): + if '__' not in key: + keys.append(key) + for key in keys: + txt+='[%s]\n'%key + txt+=self.__dict__[key].as_txt()+' \n' + return txt + + def show(self,f=None): + if f is None: + f = sys.stdout + print(self.as_txt(), file=f) + + +def read_and_parse(inputs,defaults=None): + # make config object + config = configparser.ConfigParser() + + # not sure how the defaults work + if defaults is not None: + default_config = None + if type(defaults) is str: + default_config = configparser.ConfigParser() + default_config.read_string( defaults ) + #default_config.readfp(io.BytesIO(defaults)) + else: + default_config = configparser.ConfigParser() + default_config.read_file(defaults) + # if this aint a config object, we're f-ed anyway + config._sections = default_config._sections + + if inputs is None: + co = config_object( default_config ) + co.show() + raise SystemExit('##--- No inputs provide, use template shown above ---##') + + + if type(inputs) is type(""""""): + config.read_string(inputs) #inputs = inputs + else: + # update the config object accoring to the specified input + config.read_file(inputs) + + # build the object. + co = config_object( config ) + return co + +def tst(): + default_instructions = """ +[data] +experiment = None +run = None +index_start = 0 +index_stop = 500 +index_stride = 1 + +[output] +filename = output.h5 +comments = "No comments" +""" + + instructions = """ +[data] +experiment = amox26916 +run = 56 +index_start = 0 +index_stop = 5000 + +[output] +filename = output_59.h5 +comments = "No soup for you!" +ooops = 9 +""" + + obj = read_and_parse(instructions, default_instructions) + + instructions=""" +[stuff] +coordinates = (1,4) +""" + obj = read_and_parse(instructions) + assert obj.stuff.coordinates[0] == 1 + assert obj.stuff.coordinates[1] == 4 + obj.show() + + can_we_do_comments = """ +[breakfast] +eggs = True +bacon = True +spam = False # i don't like spam +""" + obj = read_and_parse(can_we_do_comments) + obj.show() + print('OK') + + +if __name__ == "__main__": + tst() diff --git a/lbl_ir/lbl_ir/io_tools/map_IO.py b/lbl_ir/lbl_ir/io_tools/map_IO.py new file mode 100644 index 0000000..4b588b8 --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/map_IO.py @@ -0,0 +1,249 @@ +""" +Created on Tue Dec 18 16:14:43 2018 + +@author: Liang Chen +""" + +import spectral.io.envi as envi +import numpy as np +import re + + +def read_envi(hdr_file): + """Load an ENVI map from the .hdr header file + + Parameters: + ----------- + hdr_file: string + file path for a .hdr file + + Returns: + -------- + out : object + a spectral.io.bipfile.BipFile object + + Examples: + --------- + >>> hdr_file = os.path.join(test_data_home, 'test_envi.hdr') + >>> img = envi.open(hdr_file) + (17, 32, 1738) + """ + + # read in parameter list in the header file + params = [] + + with open(hdr_file, 'r', encoding='utf-8', errors='ignore') as header: + for line in header: + params.append(line.split('=')[0].strip()) + + # if parameter 'byte order' is not found, append 'byte order = 0' to the header file + if 'byte order' not in params: + with open(hdr_file, 'a', encoding='utf-8', errors='ignore') as header: + header.write('byte order = 0\n') + + img = envi.open(hdr_file) + + return img + + +def read_binary(fileObj, byteType='uint8', size=1): + """A helper function to readin values from a binary file + + Parameters: + ----------- + fileObj : object + a binary file object + + byteType : string, optional, default 'uint8' + the type of readin values + + size : int, optional + the number of bytes to readin. Default is 1. + + Returns: + -------- + out : a value or a tuple of values or a string + the readout value from the bytes + """ + import struct + + typeNames = { + 'int8': ('b', struct.calcsize('b')), + 'uint8': ('B', struct.calcsize('B')), + 'int16': ('h', struct.calcsize('h')), + 'uint16': ('H', struct.calcsize('H')), + 'int32': ('i', struct.calcsize('i')), + 'uint32': ('I', struct.calcsize('I')), + 'int64': ('q', struct.calcsize('q')), + 'uint64': ('Q', struct.calcsize('Q')), + 'float': ('f', struct.calcsize('f')), + 'double': ('d', struct.calcsize('d')), + 'char': ('s', struct.calcsize('s'))} + + if size == 1: + return struct.unpack(typeNames[byteType][0], fileObj.read(typeNames[byteType][1]))[0] + elif size > 1: + return struct.unpack(typeNames[byteType][0] * size, fileObj.read(typeNames[byteType][1] * size)) + else: + return None + + +def read_spa(spa_file): + """Load a spectrum from a .spa file + + Parameters: + ----------- + spa_file: string + file path for a .spa file + + Returns: + -------- + wavenumbers : float array + the wavenumber values of the spectrum (x-axis) + + spectrum : float array + the transmission/reflection/absorption coefficient + at wavenumber of the spectrum (y-axis) + + title : string + the title of the spectrum + + comment : string + the comment section of the spectrum, if it exists + + Examples: + --------- + >>> spa_file = os.path.join(test_data_home, 'test_data0001.spa') + >>> wavenumbers, spectrum, title, comment = read_spa(spa_file) + >>> print(title) + C:\\Users\\lchen43\\Documents\\CDIPS_2017\\lbl-ir\\test_data\\test_data.map - Spectrum #1 + Position (X,Y): 499.51, 5715.69 Thu Apr 22 13:57:44 2010 (GMT-07:00) + >>> print(comment) + Split map from: C:\\Users\\lchen43\\Documents\\CDIPS_2017\\lbl-ir\\test_data\\test_data.map + X Range: 499.51, 654.51 + Y Range: 5715.69, 5795.69 + Position (X,Y): 499.51, 5715.69 + Thu Apr 22 13:57:44 2010 (GMT-07:00) + """ + + with open(spa_file, 'rb') as f: + f.seek(30) + readChar = read_binary(f, 'uint8', 255) + title = ''.join([chr(i) for i in filter(lambda x: x > 0, readChar)]) + + f.seek(564) + spectrumPts = read_binary(f, 'int32') + + f.seek(576) + maxWavenum = read_binary(f, 'float') + minWavenum = read_binary(f, 'float') + wavenumbers = np.linspace(maxWavenum, minWavenum, spectrumPts) + + # The starting byte location of the spectrum data is stored in the + # header. It immediately follows a flag value of 3. + # If there is a comment section, the flag value is 27 and it should be in front of the flag value of 3. + f.seek(338) + Flag = 0 + while (Flag != 3 and Flag != 27): + Flag = read_binary(f, 'uint16') + + if Flag == 3: # no comment section, look for data starting position + dataPosition = read_binary(f, 'uint16') + f.seek(dataPosition) + spectrum = read_binary(f, 'float', spectrumPts) + comment = '' + elif Flag == 27: # there is a comment section, look for comment starting position + commentPosition = read_binary(f, 'uint16') + # move forward 14 bytes, that's the data starting position + f.seek(14, 1) + dataPosition = read_binary(f, 'uint16') + commentLength = dataPosition - commentPosition + + f.seek(commentPosition) + readChar = read_binary(f, 'uint8', commentLength) + comment = ''.join([chr(i) + for i in filter(lambda x: x > 0, readChar)]) + f.seek(dataPosition) + spectrum = read_binary(f, 'float', spectrumPts) + else: + raise Exception('The flag value of 3 or 27 cannot be found') + + spectrum = np.array(spectrum) + return wavenumbers, spectrum, title, comment + + +def read_series(file_name, wavLen=1738): + """ + read Ominc series map + :param file_name: path of minc series map + :param wavLen: the length of the wavenumbers vector + :return: + wav: the wavenumbers vector + spectra: all spectra in the series map + xy: all xy coordinate in the series map + """ + + wav = spectra = xy = None + + with open(file_name, 'rb') as fid: + data = fid.read() + # read out firstWav, lastWav, construct wav + fid.seek(0) + s = [] + for i in range(1000): + s.append((read_binary(fid, 'uint32'))) + offset = s.index(wavLen) * 4 + fid.seek(offset + 12) + val = read_binary(fid, 'float', 2) + firstWav, lastWav = val[1], val[0] + wav = np.linspace(firstWav, lastWav, wavLen) + + # read out num of spectra + Chain = bytes('Spectrum', 'utf-8') + firstByte = data.index(Chain) + s1 = str(data[firstByte:(firstByte + 100 - 16)]) + exp = re.compile('(-?[0-9]+\.?[0-9]*)') + tmpValues = exp.findall(s1) + nSpectra = int(tmpValues[1]) + + # read out all spectra + spectra = np.zeros((nSpectra, wavLen)) + delta = wavLen * 4 + 96 + for i in range(nSpectra): + fid.seek(firstByte + delta * i + 80) + spectra[i, :] = read_binary(fid, 'float', wavLen) + + # find xy positions + chain = bytes('Position', 'utf-8') + firstPos = data.index(chain) + secondPos = data[(firstPos + 1):].index(chain) + secondPos += firstPos + 1 + fid.seek(secondPos + 48) + val = read_binary(fid, 'float', 2 * nSpectra) + xy = np.zeros((nSpectra, 2)) + xy[:, 0], xy[:, 1] = val[::2], val[1::2] + + return wav, spectra, xy + + +if __name__ == "__main__": + import os + + test_data_home = '../../test_irdata/' + + hdr_file = os.path.join(test_data_home, 'test_envi.hdr') + img = read_envi(hdr_file) + print('====Envi file====') + print(img.shape) + + spa_file = os.path.join(test_data_home, 'test_data0001.spa') + wavenumbers, spectrum, title, comment = read_spa(spa_file) + print('====' + title + '====') + print(comment) + + map_file = os.path.join(test_data_home, 'typeII-010_12x9.map') + wavenumbers, spectra, xy = read_series(map_file) + print('====Series map====') + print(spectra.shape) + print(xy[:3,:]) + print(spectra[:4, -3:]) diff --git a/lbl_ir/lbl_ir/io_tools/read_XAS.py b/lbl_ir/lbl_ir/io_tools/read_XAS.py new file mode 100644 index 0000000..71e7aec --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/read_XAS.py @@ -0,0 +1,54 @@ +import os +import numpy as np +import h5py +from lbl_ir.data_objects import ir_map + + +def get_grid_info(coords): + xsorted = sorted(set(coords[:,0])) + ysorted = sorted(set(coords[:,1])) + x0, xmax, y0, ymax = xsorted[0], xsorted[-1], ysorted[0], ysorted[-1] + dx = np.mean(np.diff(xsorted)) + dy = np.mean(np.diff(ysorted)) + if dx > dy: + step = dy / 2 + else: + step = dx / 2 + Nx = int(round((xmax - x0)/step) + 1) + Ny = int(round((ymax - y0)/step) + 1) + return x0, y0, step, Nx, Ny + +def read_xasH5(filePath): + xasTypes = [] + energy = {} + dataSets = {} + coords = {} + xas_maps = {} + + with h5py.File(filePath, 'r') as f: + xasSpectra = f['xas/'] + for k in xasSpectra: + xasTypes.append(k) + for k1 in xasSpectra[k]: + k1 = '/' + k1 + spectra = xasSpectra[k + k1 + '/raw'][:, :, :] + energy[k] = spectra[0, 0, :] + dataSets[k] = spectra[:, 1, :] + dataSets[k] = np.where(dataSets[k] != np.inf, dataSets[k], 0) #filter np.inf + + samples = f['maps/samples/'] + for i, k in enumerate(samples): + coords[xasTypes[i]] = samples[k + '/xas_coords'][:, :] + + for _type in xasTypes: + assert coords[_type].shape[0] == dataSets[_type].shape[0], 'xas and coords sample sequences were mis-aligned.' + + fileName = os.path.basename(filePath) + sample_info = ir_map.sample_info(fileName[:-3]) + xas_maps[_type] = ir_map.ir_map(wavenumbers=energy[_type], sample_info=sample_info) + xas_maps[_type].add_data(spectrum=dataSets[_type], xy=coords[_type]) + x0, y0, step, Nx, Ny = get_grid_info(coords[_type]) + xas_maps[_type].to_image_cube(Nx, Ny, x0, y0, step, step) + + return xas_maps + diff --git a/lbl_ir/lbl_ir/io_tools/read_map.py b/lbl_ir/lbl_ir/io_tools/read_map.py new file mode 100644 index 0000000..0c74394 --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/read_map.py @@ -0,0 +1,47 @@ +import h5py +import sys + +from lbl_ir.io_tools import read_omnic +from lbl_ir.data_objects import ir_map + +def read_all_formats(filename, sample_info=None): + + ok = False + format = None + if not ok: + try: + data = read_omnic.read_and_convert(filename, sample_info=None) + ok= True + format = "Omnic" + except: pass + + if not ok: + try: + data = ir_map.ir_map(filename=filename) + ok = True + format = "hdf5" + + with h5py.File(filename,'r') as f: + root_name = list(f.keys())[0] + # if there is an image group, load imagecube and data, otherwise load data group + if 'image' in f[root_name + '/data']: + data.add_image_cube() + else: + data.add_data() + # if there is an factorization group, load factorization data + if 'factorization' in f[root_name + '/data']: + data.add_factorization() + except: pass + + + + if not ok: + print("Could not read file; Check input or file formats and header integrity.") + else: + return data, format + + + +if __name__ == "__main__": + data,fmt = read_all_formats(sys.argv[1]) + print("Data read in with format", fmt) diff --git a/lbl_ir/lbl_ir/io_tools/read_numpy.py b/lbl_ir/lbl_ir/io_tools/read_numpy.py new file mode 100644 index 0000000..d6d8c34 --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/read_numpy.py @@ -0,0 +1,42 @@ +import numpy as np +from lbl_ir.data_objects import ir_map + + +def read_npy(filename, wavenumbers=None, data_type="absorbance", sample_info=None): + if sample_info is None: + sample_info = ir_map.sample_info() + + data = np.load(filename) + + if wavenumbers is None: + wavenumbers = np.arange(data.shape[2]) + + image_grid_param = [0, 0, 1, 1] + image_mask = np.ones(data.shape[0:2]) > 0.5 + + this_ir_map = ir_map.ir_map(wavenumbers=wavenumbers, + sample_info=sample_info, + data_type=data_type) + this_ir_map.add_image_cube(data, image_mask, image_grid_param) + return this_ir_map + +def read_npz(filename, data_type="absorbance", sample_info=None): + if sample_info is None: + sample_info = ir_map.sample_info() + + npzFile = np.load(filename) + + for k in npzFile.files: + if 'energy' in k: + wavenumbers = npzFile[k] + else: + data = npzFile[k] + + image_grid_param = [0, 0, 1, 1] + image_mask = np.ones(data.shape[0:2]) > 0.5 + + this_ir_map = ir_map.ir_map(wavenumbers=wavenumbers, + sample_info=sample_info, + data_type=data_type) + this_ir_map.add_image_cube(data, image_mask, image_grid_param) + return this_ir_map \ No newline at end of file diff --git a/lbl_ir/lbl_ir/io_tools/read_omnic.py b/lbl_ir/lbl_ir/io_tools/read_omnic.py new file mode 100644 index 0000000..e64f649 --- /dev/null +++ b/lbl_ir/lbl_ir/io_tools/read_omnic.py @@ -0,0 +1,51 @@ +import numpy as np +import sys + +from lbl_ir.io_tools.Omnic_PyMca5 import OmnicMap +from lbl_ir.data_objects import ir_map + + +def read_and_convert(filename, start_wav=None, stop_wav=None, data_type="absorbance", sample_info=None): + if sample_info is None: + sample_info = ir_map.sample_info() + + omnic_object = OmnicMap.OmnicMap( filename ) + wavenumbers = None + if wavenumbers is None: + n_wav = omnic_object.data.shape[2] + if (start_wav is None) or ( stop_wav is None) : + if omnic_object.info['OmnicInfo'] is not None: + start_wav = omnic_object.info['OmnicInfo']['First X value'] + stop_wav = omnic_object.info['OmnicInfo']['Last X value'] + n_wav = omnic_object.info['OmnicInfo']['Number of points'] + else: + raise ValueError('There is an issue with the Ominc file or its parser. Make sure that the meta info from the header is present and parsed correctly.') + + wavenumbers = np.linspace( start_wav, stop_wav, n_wav ) + image_grid_param = omnic_object.info['OmnicInfo']['Mapping stage parameters'] + image_mask = np.ones( omnic_object.data.shape[0:2]) > 0.5 + + # build the basis object + this_ir_map = ir_map.ir_map( wavenumbers = wavenumbers, + sample_info = sample_info, + data_type = data_type + ) + this_ir_map.add_image_cube(omnic_object.data, image_mask, image_grid_param) + return this_ir_map + +if __name__ == "__main__": + + map_name = '190519_N2_L2w1_mp2' + '.map' + file_name = '../../ir_data/' + map_name + sample_id = file_name + sample_id = sample_id.replace("../","") + sample_id = sample_id.replace(".map","") + sample_id = sample_id.replace("/","_") + sample_id = sample_id.replace(" ","_") + print(sample_id) + + sample_info = ir_map.sample_info( sample_id = sample_id, sample_meta_data='Hello World') + data = read_and_convert(file_name, sample_info=sample_info) + data.write_as_hdf5('../../ir_data/' + map_name + '.h5') + + diff --git a/lbl_ir/lbl_ir/math_tools/__init__.py b/lbl_ir/lbl_ir/math_tools/__init__.py new file mode 100644 index 0000000..b28b04f --- /dev/null +++ b/lbl_ir/lbl_ir/math_tools/__init__.py @@ -0,0 +1,3 @@ + + + diff --git a/lbl_ir/lbl_ir/math_tools/batched_SVD.py b/lbl_ir/lbl_ir/math_tools/batched_SVD.py new file mode 100644 index 0000000..70ca0f4 --- /dev/null +++ b/lbl_ir/lbl_ir/math_tools/batched_SVD.py @@ -0,0 +1,467 @@ +from scipy.sparse.linalg import svds, eigsh +from scipy.linalg.interpolative import svd as isvd + + +import os +import numpy as np +import matplotlib.pyplot as plt +import time + +from mpi4py import MPI +import h5py + +from tqdm import tqdm + + +def test_function( N, M , noise=0.001): + """ + Generate some test data we can use. The resulting matrix should have a rank of 4. + """ + + x = np.linspace(-1,1,M) + p0 = x*0+1.0 + p1 = x + p2 = 0.5*(3*x*x-1) + p3 = 0.5*(5*x*x*x-3*x) + + result = [] + for ii in range(N): + tmp = np.random.uniform(-1,1,4) + tmp = tmp[0]*p0 + tmp[1]*p1 + tmp[2]*p2 + tmp[3]*p3 + tmp = tmp + np.random.normal(0,1.0,M)*noise + result.append(tmp) + result = np.vstack(result) + + return result + +def invert_permutation(p): + """Given a permutation, provide an array that undoes the permutation. + """ + s = np.empty(p.size, p.dtype) + s[p] = np.arange(p.size) + return s + + +class batched_SVD(object): + """Compute an SVD of all data, but in small batches to overcome memory issues. + + Parameters: + ---------- + + data: A pointer to a data object, say a N,M matrix. + N experimental observations of dimension M + + N_max: The maximum number of entries in sub block of data + + k_singular: The number of singular values to consider + + randomize : A flag which determines if the data will be split in a random fashion. True by default + + + Attributes: + ----------- + self.order : The order in which the data will be examined + + self.inv_order : The inverse of the above array + + self.N_split : The number of batches of data + + self.parts : A list of selection arrays + + self.partial_svd_u : A list of (truncated) svd matrices (U) from individual batches of data + + self.partial_svd_s : A list of (truncated) svd matrices (S) from individual batches of data + + self.partial_svd_vt : A list of (truncated) svd matrices (V^T) from individual batches of data + + self.partial_bases : A list of (truncated) svd matrices (SV^T) from individual batches of data + + + Examples: + --------- + + data = test_function(10000,3000,1.1) + bSVD = batched_SVD(data, 2000, 5, randomize=True) + u,s,vt = bSVD.go_svd() + + """ + + def __init__(self, data, N_max, k_singular, randomize=True): + self.data = data + self.N_max = N_max + self.k_singular = k_singular + + self.randomize = randomize + + self.order = np.arange( self.data.shape[0] ) + if self.randomize: + np.random.shuffle( self.order ) + + self.N_split = int( np.floor(self.data.shape[0] / self.N_max) ) +1 + self.parts = np.array_split( self.order, self.N_split) + + # if we have these numbers in order, we can use them as slices in a hdf5 setting + # this is only requiered when we randomize the lot + if self.randomize: + tmp = [] + for part in self.parts: + part = np.sort(part) + tmp.append(part) + self.parts = tmp + self.order = np.concatenate(self.parts) + self.inv_order = invert_permutation(self.order) + + # here the partial svds are stored + self.partial_svd_u = [] + self.partial_svd_s = [] + self.partial_svd_vt = [] + self.partial_bases = [] + + + def SVD_on_chunk(self, this_chunk): + """Perform an SVD on a subset of the data + + Parameters: + ----------- + + this_chunk: a list of indices that maps back to the self.data array + """ + + tmp_data = self.data[ this_chunk, : ] + + u,s,v = isvd(tmp_data.astype('float64'), self.k_singular) + vt = v.transpose() + self.partial_svd_u.append( u ) + self.partial_svd_s.append( s ) + self.partial_svd_vt.append( vt ) + self.partial_bases.append( np.diag(s).dot(vt) ) + + + def get_u_given_basis(self, sigma, v_transpose, this_chunk): + inv_bases = v_transpose.transpose().dot( np.diag( 1.0 / sigma ) ) + tmp_data = self.data[ this_chunk, : ] + new_u = tmp_data.dot( inv_bases ) + return new_u + + def go_svd(self): + """ Seperate SVD's for individual data chunks are computed and combined into a single, best estimate + of the matrix S and V^T. The data is subsequently revisited to get a new estimate of the matrix U. + + The estimate of U on the basis of the chunked SVD approach is possible, but not as accurate. + """ + + for this_chunk in self.parts: + self.SVD_on_chunk( this_chunk ) + + # do an SVD on the SVD results of the individual chunks. + tmp_bases = np.vstack( self.partial_bases ) + ub,sb,vb = isvd(tmp_bases.astype('float64'), self.k_singular) + vbt = vb.transpose() + ubs = np.array_split(ub,self.N_split) + new_s = sb + new_vt = vbt + + # revisit the data to get the U matrix again + new_us = [] + for part in self.parts: + this_new_u = self.get_u_given_basis(new_s, new_vt, part) + new_us.append(this_new_u) + + # stack it up and unmix the data + new_us = np.vstack(new_us) + if self.randomize: + new_us = new_us[ self.inv_order ] + return new_us, sb, vbt + + +class parallel_SVD_MPI(object): + """ + THSI NEEDS WORK!!! + An MPI based version of an SVD method, splitting the data among a number of cores. + The outline is a bit different than the batched_SVD version. + + The idea is to first split all data equally across all cores. In each core, we compute + the an SVD using the procedure coded up for the batched_SVD approach, and end up with a + SVD estimate on each core. We subsequently pool all these SVD's and reestimate it on + the root node, and scatter these functions back to all subsequent nodes. Subsequently, + we need to compute U on on each node for all data associated with this node. The final + results are stored in a pointer, which is either a hdf5 file or a numpy array. + + + Parameters: + ---------- + + data: A pointer to a data object, say a N,M matrix. + N experimental observations of dimension M + + N_max: The maximum number of entries in sub block of data + + k_singular: The number of singular values to consider + + MPI_COMM_WORLD: an instance of MPI.COMM_WORLD + + randomize : A flag which determines if the data will be split in a random fashion. True by default + + Attributes: + ----------- + + go_svd() : this function performs the svd and returns the SVD results for each single core, including + an array that allows one to map the data back to the original order in which it was presented. + + Example: + -------- + + + + + + """ + + + def __init__(self, data, N_max, k_singular, MPI_COMM_WORLD, randomize=True, selection = None ): + # randomize the order in which we analyze the data + self.randomize = randomize + + # sort out MPI stuff + self.mpi_comm = MPI_COMM_WORLD + self.mpi_rank = self.mpi_comm.Get_rank() + self.mpi_size = self.mpi_comm.Get_size() + + # data etc + self.data = data # the data + self.k_singular = k_singular # the number of singular vectors + self.N_max = N_max # the maximum number of data points per chunk per core + + # split the data amond cores + self.N_obs, self.N_dim = self.data.shape + if selection is not None: + self.Nobs = len(selection) + self.order = np.arange(self.N_obs) + self.selection = selection + if self.selection is not None: + self.order = self.order[selection] + self.inv_order = None + + if self.randomize: + np.random.shuffle( self.order ) + self.rank_splits = np.array_split( self.order, self.mpi_size ) + + if self.randomize: + tmp = [] + for part in self.rank_splits: + part = np.sort(part) # we want this ordered from low to high to enable slicing an hdf5 array + tmp.append(part) + self.rank_splits = tmp + self.order = np.concatenate(self.rank_splits) + self.inv_order = invert_permutation(self.order) + self.inv_order_split = np.array_split( self.inv_order, self.mpi_size ) + self.mpi_comm.Barrier() + + def go_svd(self): + """Do the SVD ihn each core, on several chunks. + """ + + partial_u = [] + partial_s = [] + partial_vt = [] + partial_bases = [] + + rank_selection = self.rank_splits[ self.mpi_rank ] + N_chunks = int( len(rank_selection) / self.N_max ) + 1 + chunks = np.array_split( rank_selection, N_chunks ) + u = None + s = None + vt = None + this_rank_bases = None + for chunk in tqdm(chunks, position=self.mpi_rank): + partial_data = self.data[ chunk, : ] + u,s,vt = isvd(partial_data.astype('float64'), self.k_singular) + partial_u.append( u ) + partial_s.append( s ) + partial_vt.append( vt ) + + partial_bases.append( np.diag(s).dot(vt) ) + # now that we have the partial svd results, we bnring stuff together + if N_chunks > 1: + all_bases = np.vstack( partial_bases ) + uc,sc,vct = isvd(all_bases.astype('float64'), self.k_singular) + # now we need to pass this guy to the main rank + this_rank_bases = np.diag(sc).dot(vct) + else: + this_rank_bases = np.diag(s).dot(vt) + self.mpi_comm.Barrier() + + + gathered_bases = None + if self.mpi_rank == 0: + gathered_bases = np.empty( [self.mpi_size, self.k_singular, self.N_dim], dtype='d' ) + gathered_bases = self.mpi_comm.gather( this_rank_bases, root=0 ) + + final_sg = np.zeros( [ self.k_singular ], dtype='float32' ) + final_vgt = np.zeros( [ self.k_singular, self.N_dim], dtype='float32' ) + + if self.mpi_rank == 0: + gathered_bases = np.vstack( gathered_bases ) + ug,final_sg,final_vgt = isvd(gathered_bases.astype('float64'), self.k_singular) + # we now need to scatter back the sg and vgt matrices + self.mpi_comm.Barrier() + self.mpi_comm.Bcast( final_sg, root=0 ) + self.mpi_comm.Barrier() + self.mpi_comm.Bcast( final_vgt , root=0 ) + self.mpi_comm.Barrier() + # now that we have the final and best sigma and Vt, we need to go back to the data and + # reestimate the the U matrices + inv_multi = final_vgt.transpose().dot( np.diag(final_sg) ) + chunks_of_u = [] + for chunk in chunks: + partial_data = self.data[ chunk, : ] + this_u = partial_data.dot( inv_multi ) + chunks_of_u.append( this_u) + + chunks_of_u = np.vstack( chunks_of_u ) + # we need to return this, including a placement array + return chunks_of_u, final_sg, final_vgt, self.inv_order_split + + + + + + +def tst_batched(): + N = 10000 + M = 2000 + K = 200 + P = 4 + + data = test_function(N,M,0.0001) + print("Data constructed") + e0 = time.time() + u,s,vt = isvd(data.astype('float64'), P) + vt = vt.transpose() + e1 = time.time() + + bSVD = batched_SVD(data, K, P, randomize=False) + e4 = time.time() + us, ss, vst = bSVD.go_svd() + e5 = time.time() + + assert np.std( (s-ss)/ss ) < 1e-3 + print("Singular values match between batch and full approach") + + # checking the reconstructions + da = us.dot(np.diag(ss).dot( vst )) + dc = u.dot(np.diag(s).dot( vt )) + delta_both = np.std( (da-dc) ) + assert np.abs( delta_both ) < 1e-2 + + + print('Reconstruction Error is similar in batched versus full approach') + print ('Time for full: %4.2f batched: %4.2f'%(e1-e0, e5-e4)) + + # Now we want to do this using a random order or data + + bSVD = batched_SVD(data, K, P, randomize=True) + e4 = time.time() + us, ss, vst = bSVD.go_svd() + e5 = time.time() + + assert np.std( (s-ss)/s ) < 1e-3 + print("Singular values match between randomized batch and full approach") + delta_both = np.std( (dc - da) ) + assert np.abs( delta_both ) < 1e-2 + print('Reconstruction Error is decent') + print ('Time for full: %4.2f batched: %4.2f'%(e1-e0, e5-e4)) + + +def tst_MPI(): + N = 10000 # number of observations + M = 2000 # dimension of an observations + P = 4 # number of singular values + + # make the data + mpi_comm = MPI.COMM_WORLD + if mpi_comm.Get_rank() == 0: + data = test_function(N,M,0.0001) + + e0 = time.time() + u,s,vt = isvd(data.astype('float64'),P) + e1 = time.time() + print('Standard svd takes %12.3f seconds'%(e1-e0)) + print('\n') + + e0 = time.time() + # lets quickly see if this works in the batched setup + bSVD = batched_SVD(data, 1000, P, randomize=True) + ub, sb, vbt = bSVD.go_svd() + e1 = time.time() + print('Single core batched version with data in memory takes %12.3f seconds'%(e1-e0) ) + + + # write this to an hdf5 file + print('Creating h5 data file') + f = h5py.File('test_data.h5','w') + dset = f.create_dataset("data", data=data, dtype='float32') + f.close() + del data + + # now we read the data + f = h5py.File('test_data.h5','r') + data = f['/data'] + print(data.shape) + e0 = time.time() + # lets quickly see if this works in the batched setup + bSVD = batched_SVD(data, 1000, P, randomize=False) + ub, sb, vbt = bSVD.go_svd() + e1 = time.time() + print('Single core batched version while reading data from HDF5 takes %12.3f seconds'%( e1-e0 ) ) + print(sb) + f.close() + + mpi_comm.Barrier() + f = h5py.File('test_data.h5','r' ) # lets see if we can get away with this + data = f['data'] + e2 = time.time() + print('build it') + mSVD = parallel_SVD_MPI( data, 1000, P, mpi_comm, False, None) + print('go') + u,s,v,sel = mSVD.go_svd() + e3 = time.time() + print('Core %i with batches version takes %12.3f seconds, while reading data from hdf5'%( mpi_comm.rank , e3-e2) ) + print(s, mpi_comm.rank ) + + #lets read the data into memory + print('Reading data into memory') + data2 = f['data'].value #[:,:] + print(data2.shape) + print( 'done') + + mpi_comm.Barrier() + e2 = time.time() + mSVD = parallel_SVD_MPI( data2, 500, P, mpi_comm, True) + u,s,v,sel = mSVD.go_svd() + e3 = time.time() + print('Core %i with batches version takes %12.3f seconds, with data in memory'%(mpi_comm.rank , e3-e2) ) + + mpi_comm.Barrier() + selection = np.arange(1000) + print('Testing setup with an included selection array') + data2[1000,:]=0. + mSVD = parallel_SVD_MPI( data2, 50000, P, mpi_comm, False, selection = selection) + SVDs = batched_SVD.batched_SVD( ) + up,sp,vp, order_split = mSVD.go_svd() + uf,sf,vf = isvd(data2[0:1000,:].astype('float64'), P) + assert np.mean( ( np.abs(sp-sf)/sf ) ) < 2e-2 + + mpi_comm.Barrier() + if mpi_comm.Get_rank() == 0: + # now remove this file again + print('Removing h5 data file') + os.remove('test_data.h5') + # done + + + + + +if __name__ == "__main__": + tst_batched() diff --git a/lbl_ir/lbl_ir/simulations/__init__.py b/lbl_ir/lbl_ir/simulations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/simulations/spectra_map_simulator.py b/lbl_ir/lbl_ir/simulations/spectra_map_simulator.py new file mode 100644 index 0000000..091bda6 --- /dev/null +++ b/lbl_ir/lbl_ir/simulations/spectra_map_simulator.py @@ -0,0 +1,287 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Jan 2 16:14:47 2019 + +@author: Liang Chen +""" +import numpy as np +import matplotlib.pyplot as plt +from lbl_ir.data_objects.ir_map import sample_info, ir_map + +def lorentzian(x,x0,gamma=10): + + return 1/(np.power((x-x0)/gamma,2)+1) + +def gaussian(x,x0=0,sigma=10): + + return 1/np.exp(np.power((x-x0)/sigma,2)) + +class spectra_map_simulator: + + """Generate a simulated spectral map + + Parameters: + ----------- + NbaseSpectra: int, optional + The number of basis spectrum. Default is 3. + + Nclusters: int, optional + The number of data point clusters in the spectral map. Default is 4. + + ptsPerCluster: int, optional + The number of data points per cluster. Default is 50. + + Nx: int, optional + The pixel numbers of x-axis. Default is 64. + + Ny: int, optional + The pixel numbers of y-axis. Default is 64. + + cov: int or float matrix, optional + The covariance matrix of 2D gaussian distribution used to generate random data point clusters. + Default is [[20, 10], [10, 25]]. + + sigma: int or float, optional + The standard deviation of 1D gaussian distribution used to generate spectral weights. Default is 10. + + startWavenumber: int or float, optional + The beginning wavenumber of spectral range. Default is 400. + + endWavenumber: int or float, optional + The ending wavenumber of spectral range. Default is 4000. + + Nwavenumber: int, optional + The number of wavenumber values in the spectrum. Default is 1600. + + random_state: int, optional + The seed of the pseudo random number generator to use when generating random numbers. Default to 17. + + Attributes: + -------- + data : float matrix + The final spectral data matrix. Number of rows equals number of non-zero data points; + Number of columns equals number of wavenumbers. + + densityMatCondense : float matrix + The distribution weight matrix of each basis spectrum (only stores non-zero data points, see nonZeroInd). + Number of rows equals number of non-zero data points; + Number of columns equals number of basis spectrum. + + spectraMat : float matrix + The basis spectra matrix. Number of rows equals number of basis spectrum; + Number of columns equals number of wavenumbers. + + wavenumber : float array + The wavenumber values of the spectrum (x-axis). + + nonZeroInd : int array + The linear index of all non-zero data points in the flatterned 2D map. + + Examples: + --------- + >>> s = spectra_map_simulator(random_state=3) + >>> s.spectra_map_gen() + >>> print(s.data.shape) + (446, 1600) + """ + + def __init__(self, NbaseSpectra=3, Nclusters=4, ptsPerCluster=50, Nx=64, cov=[[20, 10], [10, 25]], sigma=10, + startWavenumber=400, endWavenumber=4000, Nwavenumber=1600, random_state=17): + + self.NbaseSpectra = NbaseSpectra + self.Nclusters = Nclusters + self.ptsPerCluster = ptsPerCluster + self.Nx = Nx + self.Ny = Nx + self.cov = cov + self.sigma = sigma + self.startWavenumber = startWavenumber + self.endWavenumber = endWavenumber + self.Nwavenumber = Nwavenumber + self.random_state = random_state + + def cluster_placement(self, random_state=17): + """Generate simulated data point locations and weights in a 2D map + + Returns: + -------- + points : float matrix + The data point location matrix. The first two columns are x-y coordiantes of data points. + The third column are the weight coefficients of data points. + + densityVec : float array + The 1D array generated from flattened 2D weight coefficients matrix (densityMat) + """ + + np.random.seed(seed=random_state) + centroids = np.random.randint(int(self.Nx*0.8), size=(self.Nclusters,2)) + self.points = np.zeros((self.ptsPerCluster*self.Nclusters, 3)) + densityMat = np.zeros((self.Ny, self.Nx)) + + for i in range(self.Nclusters): + self.points[i*self.ptsPerCluster:(i+1)*self.ptsPerCluster, :2] = np.random.multivariate_normal(centroids[i,:], self.cov, self.ptsPerCluster) + self.points[i*self.ptsPerCluster:(i+1)*self.ptsPerCluster, 2] = gaussian(np.sqrt(np.power(self.points[i*self.ptsPerCluster:(i+1)*self.ptsPerCluster, :2] + -centroids[i,:],2).sum(axis = 1)),sigma=self.sigma) + + for i in self.points: + idx = tuple(np.clip(i[1::-1].astype(int), 0, self.Nx-1)) + densityMat[idx] += i[2] + + densityVec = densityMat.flatten() + + return densityVec + + def spectrum_gen(self, Npeaks=3, firstPeakPosition=1200, peakWidth=[30,60,150], random_state=17): + """Generate a simulated spectrum + + Parameters: + ----------- + Npeaks: int, optional + The number of peaks. Default is 3. + + firstPeakPosition: int, optional + The position of the first peak. Default is 1200. + + peakWidth: int or float list, optional + The list of peak widths. Default is [30,60,150]. + + Returns: + -------- + wavenumber : float array + The wavenumber values of the spectrum (x-axis). + + spectrum : float array + The transmission/reflection/absorption coefficients of the spectrum (y-axis) + """ + + if len(peakWidth) != Npeaks: + raise Exception("The number of peak width values doesn't match the number of peaks") + + np.random.seed(seed=random_state) + self.wavenumber = np.linspace(self.startWavenumber,self.endWavenumber,self.Nwavenumber) + peakPositions = np.linspace(firstPeakPosition,self.endWavenumber,Npeaks,endpoint=False) + spectrum = np.zeros(len(self.wavenumber)) + weights = np.random.rand(Npeaks) + + for i in range(Npeaks): + singlePeak = lorentzian(self.wavenumber,peakPositions[i],peakWidth[i]) + spectrum += singlePeak * weights[i] + spectrum /= weights.sum() + + return spectrum + + def spectra_map_gen(self, Npeaks = [3,4,5], positions = [800, 1000, 1200]): + """Generate a spectral map data cube + + Parameters: + ----------- + Npeaks: int list, optional + The list of number of peaks. Default is [3,4,5]. + + positions: int or float list, optional + The list of first peak positions. Default is [800, 1000, 1200]. + + Returns + ------- + self : object + """ + + if len(positions) != len(Npeaks): + raise Exception("The number of first peak positions doesn't match the number of basis spectrum") + + np.random.seed(seed=self.random_state) + random_seeds = np.random.randint(50, size=len(Npeaks)) + + densityVecs = np.zeros((self.Nx*self.Ny,self.NbaseSpectra)) # component coefficients + self.spectraMat = np.zeros((self.NbaseSpectra, self.Nwavenumber)) # components spectra matrix + + for i in range(self.NbaseSpectra): + + densityVecs[:,i] = self.cluster_placement(random_state = random_seeds[i]) + + np.random.seed(seed=random_seeds[i]) + peakWidth = np.random.randint(4,20, Npeaks[i])*10 + self.spectraMat[i,:] = self.spectrum_gen(Npeaks=Npeaks[i], firstPeakPosition = positions[i], + peakWidth=peakWidth, random_state = random_seeds[i]) + + self.nonZeroInd = ~np.all(densityVecs==0, axis=1) + self.densityVecsCondense = densityVecs[self.nonZeroInd] # remove all zero rows + self.data = self.densityVecsCondense.dot(self.spectraMat) # matrix mulplication + + mask = np.zeros((self.Ny, self.Nx), dtype='bool').flatten() + mask[self.nonZeroInd] = True + self.mask = mask.reshape(self.Ny, self.Nx) + + def save(self, sample_id='simulated_dataset'): + """Save the simulated dataset as an hdf5 file. + + Arguments: + + ---------- + sample_id : A string that identifies the sample, spaces will be substituted for underscores. + + """ + si = sample_info(sample_id=sample_id, sample_meta_data=f"This dataset has {self.NbaseSpectra} components and map size is {self.Ny} * {self.Nx}") + si.show() + + self.spectra_map_gen() # generate simulated dataset + y, x = np.where(self.mask) + self.xy = np.c_[x,y] + + ir_data = ir_map(self.wavenumber, si, with_factorization=True) + ir_data.add_data(spectrum=self.data, xy=self.xy) + ir_data.to_image_cube() + ir_data.add_factorization(component=self.spectraMat, component_coef=self.densityVecsCondense, prefix='MCR') + ir_data.write_as_hdf5(f'{sample_id}.h5') + + def load(self, filename='simulated_dataset.h5'): + """load the simulated dataset from an hdf5 file. + + Arguments: + + ---------- + filename : The hdf5 filename where data will be read from. + """ + ir_data = ir_map(filename=filename) + ir_data.add_image_cube() + ir_data.add_factorization(prefix='MCR') + + return ir_data + + def plot_spectra_map(self): + """Plot the spectral distribution map and basis spectra + + """ + + self.spectra_map_gen() # generate simulated dataset + + plt.figure(figsize=(12, 6)) + for i in range(self.NbaseSpectra): + + n_row = 2 + + plt.subplot(n_row,3,i+1) + densityMat = np.zeros((self.Ny, self.Nx)).flatten() + densityMat[self.nonZeroInd] = self.densityVecsCondense[:,i] + densityMat = densityMat.reshape(self.Ny, self.Nx) + plt.imshow(np.flipud(densityMat)) + plt.title(f'Distribution of Component {i+1}') + plt.colorbar() + plt.clim([0, 2]) + + if n_row == 3: + plt.subplot(n_row,3,i+7) + plt.imshow(np.flipud(densityMat>0)) + + plt.subplot(n_row,3,i+4) + plt.subplots_adjust(hspace=0.3) + plt.plot(self.wavenumber, self.spectraMat[i,:]) + plt.title(f'Spectrum of Component {i+1}') + plt.xlim([4000,400]) + + return None + +if __name__ == "__main__": + + s = spectra_map_simulator(random_state=3) + s.plot_spectra_map() \ No newline at end of file diff --git a/lbl_ir/lbl_ir/tasks/NMF/__init__.py b/lbl_ir/lbl_ir/tasks/NMF/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/tasks/NMF/basic_NMF.py b/lbl_ir/lbl_ir/tasks/NMF/basic_NMF.py new file mode 100644 index 0000000..fa9d2cf --- /dev/null +++ b/lbl_ir/lbl_ir/tasks/NMF/basic_NMF.py @@ -0,0 +1,40 @@ +from sklearn.decomposition import NMF +import matplotlib.pyplot as plt +import pyqtgraph as pq + +import sys +import numpy as np +from lbl_ir.io_tools import read_map +from lbl_ir.tasks.preprocessing import data_prep + + +def simple_NMF(ir_map, wmask, smask,components=40): + """ + A tools to do NMF on a selected region in a map + + :param ir_map: Image data cube + :param wmask: wavelength mask + :param smask: spatial mask + :param components: number of components + :return: spatial maps of components and associated spectra + """ + ori_shape = ir_map.imageCube.shape + data = ir_map.imageCube[:,:,wmask] + data = data.reshape( ori_shape[0]*ori_shape[1], data.shape[2] ) + position_selection = np.where(smask.flatten()>0.5)[0] + data = data[ position_selection, : ] + + + NMF_obj = NMF(n_components=components) + W = NMF_obj.fit_transform( data ) + H = NMF_obj.components_ + + maps = [] + for nn in range(components): + this_map = np.zeros(ori_shape[0:2]) + this_map = this_map.flatten() + this_map[position_selection] = W[:,nn] + this_map = this_map.reshape( ori_shape[0:2]) + maps.append(this_map) + + return maps, H diff --git a/lbl_ir/lbl_ir/tasks/NMF/multi_set_analyses.py b/lbl_ir/lbl_ir/tasks/NMF/multi_set_analyses.py new file mode 100644 index 0000000..edbebcf --- /dev/null +++ b/lbl_ir/lbl_ir/tasks/NMF/multi_set_analyses.py @@ -0,0 +1,124 @@ +from sklearn.decomposition import NMF +import matplotlib.pyplot as plt +#import pyqtgraph as pq + + +import sys +import numpy as np +from lbl_ir.io_tools import read_map +from lbl_ir.tasks.preprocessing import data_prep, transform +#from umap import UMAP + + +class aggregate_data(object): + def __init__(self, names, data, wmask, components=40): + self.names = names + self.Nset = len(names) + self.wmask = wmask + self.master_wmask = self.get_wavenumber_intersection() + self.wavenumbers = data[0].wavenumbers[self.master_wmask] + self.data, self.dims, self.labels = self.get_data(data) + del data + self.components = components + print(self.dims) + + + def get_wavenumber_intersection(self): + result = self.wmask[0] + for ii in range(1,self.Nset): + result = np.intersect1d(result,self.wmask[ii]) + return result + + def get_data(self,data): + result = [] + dims = [] + labels = [] + for kk,cube in enumerate(data): + sel_cube = cube.imageCube[:,:, self.master_wmask ] + dim = sel_cube.shape + sel_cube = sel_cube.reshape( dim[0]*dim[1],dim[2] ) + result.append( sel_cube ) + labs = np.zeros( dim[0]*dim[1] ) + kk + labels.append(labs) + dims.append( dim[:2] ) + result = np.vstack( result ) + labels = np.concatenate(labels).flatten() + return transform.to_absorbance(result,False)[0], dims, labels + + def splitter(self,X,to_map=False): + sets = [] + for kk in range( self.Nset ): + sel = self.labels == kk + sel = np.where(sel)[0] + tmp = X[sel,:] + if to_map: + tmp = tmp.reshape( self.dims[kk] ) + sets.append( tmp ) + return sets + + + + +def multi_set_umap(agg_data, fraction=0.25): + umap_object = UMAP(n_components=2, n_neighbors=5) + Nobs = agg_data.data.shape[0] + these_ones = np.arange(Nobs) + np.random.shuffle(these_ones) + these_ones = these_ones[:int(Nobs*fraction)] + these_ones = np.sort(these_ones) + + low_dim = umap_object.fit_transform( agg_data.data[these_ones,:] ) + low_dim_all = umap_object.transform( agg_data.data) + low_dim_all_split = agg_data.splitter(low_dim_all,False) + + for set in low_dim_all_split: + plt.plot(set[:,0],set[:,1],'.' , markersize=1.5 ) + plt.savefig('UMAP.png') + +def multi_set_NMF(agg_data,components=40): + NMF_obj = NMF(n_components=components) + W = NMF_obj.fit_transform( agg_data.data ) + H = NMF_obj.components_ + spectra = [] + maps = [] + for ii in range(components): + Ws = W[:,ii].reshape(-1,1) + Ws_split = agg_data.splitter( Ws,True ) + spectra.append(H[ii,:]) + maps.append( Ws_split ) + return maps, spectra, agg_data.wavenumbers + + +def single_set_NMF(data, wav_mask, components): + A = transform.fix_data( data.data[:,wav_mask] ) + NMF_obj = NMF(n_components=components) + W = NMF_obj.fit_transform( A ) + H = NMF_obj + return data.wavenumbers[wav_mask],W,H + + + +if __name__ == "__main__": + data_files = [] + wav_masks = [] + names = ['../../../ir_data/test_data.map'] + if len(names)>1: + for fname in names: + data,fmt = read_map.read_all_formats( fname ) + data_files.append( data ) + ds = data_prep.data_prepper(data) + wav_masks.append( ds.decent_bands ) + + ad = aggregate_data(names, data_files, wav_masks) + #multi_set_umap( ad ) + multi_set_NMF( ad ) + else: + data,fmt = read_map.read_all_formats( names[0] ) + print(fmt) + wmask = data_prep.data_prepper(data).decent_bands + wavs,W,H = single_set_NMF(data, wmask, 4 ) + for i in range(4): + plt.plot(wavs, H.components_[i], label='NMF'+str(i)) + plt.xlim([4000, 500]) + plt.legend() + diff --git a/lbl_ir/lbl_ir/tasks/Worms/Shai_Hulut.py b/lbl_ir/lbl_ir/tasks/Worms/Shai_Hulut.py new file mode 100644 index 0000000..55d7b1a --- /dev/null +++ b/lbl_ir/lbl_ir/tasks/Worms/Shai_Hulut.py @@ -0,0 +1,227 @@ +""" +Here are some specific worm processing tools. + +""" + +import numpy as np +import matplotlib.pyplot as plt + +# reading an omnic map +from lbl_ir.io_tools.Omnic_PyMca5.OmnicMap import OmnicMap + +# doing SVD +from lbl_ir.math_tools.batched_SVD import batched_SVD + +# for segmentating of the image +from scipy.ndimage.morphology import binary_closing, binary_dilation, binary_fill_holes +from scipy.ndimage import gaussian_filter + +from skimage.morphology import skeletonize +from skimage import draw +import skimage +import pandas +from skan import csr +from scipy.ndimage.morphology import distance_transform_edt + + + +class little_maker( object ): + def __init__(self, filename, k_singular=10, z_threshold =14): + self.filename = filename + self.k_singular = k_singular + self.z_threshold = z_threshold + + self.omnic_object = OmnicMap(filename) + if self.omnic_object.info['OmnicInfo'] is not None: + start_wav = self.omnic_object.info['OmnicInfo']['First X value'] + stop_wav = self.omnic_object.info['OmnicInfo']['Last X value'] + n_wav = self.omnic_object.info['OmnicInfo']['Number of points'] + else: + start_wav = 699 + stop_wav = 3999 + n_wav = self.omnic_object.data.shape[-1] + self.waves = np.linspace(start_wav, stop_wav, n_wav ) # I'm not sure where to find this in the data object! + + self.data_shape = self.omnic_object.data.shape + self.flattened_data = self.omnic_object.data.reshape(-1, self.data_shape[2] ) + + self.full_frame_svd() + self.z_scores = self.get_background_map() + + def full_frame_svd(self,N_max=1000): + svd_obj = batched_SVD( self.flattened_data, + N_max=N_max, + k_singular=self.k_singular, + randomize=True) + self.U,self.S,self.VT = svd_obj.go_svd() + + + def skeletonize(self, threshold): + fin_mask = (self.z_scores > threshold).astype(int) + skel = skeletonize( fin_mask ).astype(int) + sk_obj = csr.Skeleton(skel, spacing=1, keep_images=True ) + + path_lengths = sk_obj.path_lengths() + this_one = np.argmax(path_lengths) + path_coordinates = sk_obj.path_coordinates(this_one).astype(int) + + pruned_skel = np.zeros( fin_mask.shape ) + for pair in path_coordinates: + pruned_skel[ pair[0], pair[1] ] = 1 + return pruned_skel, path_coordinates[::-1,:] + + def blobber(self): + None + + def extract_extrema(self, N_pixels=20, radius=20, threshold=14): + skel, coords = self.skeletonize(threshold) + side_0_coords = coords[ 0:N_pixels ] + dxy = side_0_coords[0,:]- side_0_coords[-1,:] + angle_0 = np.arctan2(dxy[1], dxy[0]) + print(angle_0*180.0/3.14) + print( side_0_coords ) + nimage = skimage.transform.rotate( self.z_scores , -angle_0*180.0/np.pi, clip=False, resize=True ) + plt.imshow(nimage); plt.show() + + side_1_coords = coords[ -(N_pixels): ] + dxy = side_1_coords[0,:]- side_1_coords[-1,:] + angle_1 = np.arctan2(dxy[1], dxy[0]) + print(angle_1*180.0/3.14) + print( side_1_coords ) + nimage = skimage.transform.rotate( self.z_scores , -angle_1*180.0/np.pi, clip=False, resize=True ) + plt.imshow(nimage); plt.show() + + + + + + + + def get_background_map(self, percentile=75.0, safety1=10, safety2=10, window_MM=6): + """ + We first use a local roughness check to determine edges. We do this on the mean images, + but could easly use the full hypercube if need be. + """ + + + # get a mean image + mean_img = self.U[:,0].reshape( self.data_shape[0:2] ) + mean_img = mean_img - np.mean(mean_img) + + # lets padd the image to avoid FFT periodicity issues + X,Y = mean_img.shape + # we need to fill this with some decent values + fill_sigma = np.std(mean_img) + fill_mean = np.median( mean_img ) + new_img = np.random.normal( fill_mean, fill_sigma, (X+2*safety1,Y+2*safety1)) + # blur it a bit + new_img = gaussian_filter( new_img, sigma=10) + + # paste the real image in here + new_img[ safety1:safety1+X,safety1:safety1+Y ] = mean_img + mean_img = new_img+0 + + + # define a windowing function of MM by MM pixels + MM = window_MM + kernel = np.zeros( mean_img.shape ) + kernel[0:MM,0:MM] = 1.0 + + # compute a local mean + FT_img = np.fft.fft2(mean_img) + FT_kernel = np.fft.fft2(kernel) + local_mean= np.fft.ifft2( FT_img* FT_kernel.conjugate() ).real / ( MM*MM) + + # compute a local variance + mean_img_sq = mean_img * mean_img + FT_img_sq = np.fft.fft2(mean_img_sq) + local_var = np.fft.ifft2( FT_img_sq* FT_kernel.conjugate() ).real / (MM*MM) + local_var = local_var - local_mean*local_mean + local_sigma = np.sqrt( local_var ) + + ############################################################## + ## Now we build a rough mask + ############################################################## + threshold = np.percentile( local_sigma.flatten(), percentile ) + sel = local_sigma > threshold + mask = np.zeros( mean_img.shape ) + mask[sel] = 1.0 + + # The morphological operators need some room on the sides + safety2 = 0 + V,W = mask.shape + nV = V+safety2*2 + nW = W+safety2*2 + new_mask = np.zeros( (nV,nW) ) + # place the mask + new_mask[safety2:safety2+V, safety2:safety2+W ] = mask + + BM=5 + structure = np.ones((BM,BM)) + closed = binary_closing(new_mask,structure) + + done=False + BM=5 + while not done: + BM = BM + 1 + structure = np.ones((BM,BM)) + new_closed = binary_closing(closed,structure).astype(int) + delta = np.sum( np.abs(new_closed.astype(int) - closed.astype(int)) ) + if delta == 0: + done = True + if BM >20: + done = True + closed = new_closed+0 + + new_mask = closed+0 + + # for some reason, the whole mask is shifted along one axis. This has likely to do with some + # origin definition of the structuring elements, but lets solve this using an FFT based shift calculation + # The origin option in the scipy morphology toolbox kill my kernel + + mask = new_mask[safety2:safety2+V, safety2:safety2+W] + ft_mask = np.fft.fft2(mask) + ft_mean = np.fft.fft2(np.abs(mean_img) ) + TF = np.fft.ifft2( ft_mean*ft_mask.conjugate() ).real + dX,dY = np.meshgrid( np.arange(mask.shape[1]), np.arange(mask.shape[0]) ) + here = np.argmax( TF ) + dX = dX.flatten()[here] + dY = dY.flatten()[here] + + # no wild shifts please + if dX > 10: + dX = 0 + if dY > 10: + dY = 0 + + mask = np.roll( mask, dX, axis=0) + mask = np.roll( mask, dY, axis=1) + # lift out the section of the mask that we are interested in + mask = mask[safety1:safety1+X, safety1:safety1+Y] + + + ###################################################### + # Here we build a more fine tuned mask / z_score map + ###################################################### + + + # now we use this mask to define the background + bg_sel = mask.flatten() < 0.5 + background = self.U[bg_sel,:] + mean_bg = np.mean( background, axis=0) + var_covar = np.cov( (background-mean_bg).transpose() ) + inv_vcv = np.linalg.pinv( var_covar ) + t = self.U - mean_bg + z_scores = [] + for tt in t: + z = tt.reshape(1,-1) + z_scores.append( np.sqrt( z.dot(inv_vcv).dot(z.transpose()) ) ) + z_scores = np.array(z_scores).reshape( self.data_shape[0:2] ) + return z_scores + + + + + + + diff --git a/lbl_ir/lbl_ir/tasks/Worms/__init__.py b/lbl_ir/lbl_ir/tasks/Worms/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/tasks/__init__.py b/lbl_ir/lbl_ir/tasks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/tasks/baseline/__init__.py b/lbl_ir/lbl_ir/tasks/baseline/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/tasks/baseline/rubberband.py b/lbl_ir/lbl_ir/tasks/baseline/rubberband.py new file mode 100644 index 0000000..5d39c33 --- /dev/null +++ b/lbl_ir/lbl_ir/tasks/baseline/rubberband.py @@ -0,0 +1,29 @@ +import numpy as np +from scipy.spatial import ConvexHull + +def rubberband(wavenumbers, spectrum): + """ + A rubberband baseline is essentially the lower half of tyhe convex hull + of the data. See this discussion for more details and code. + + https://dsp.stackexchange.com/questions/2725/how-to-perform-a-rubberband-correction-on-spectroscopic-data + """ + + # First find the convex hull using scipy.spatial tools + tmp = np.vstack([ wavenumbers.flatten(),spectrum.flatten()]).transpose() + v = ConvexHull(tmp).vertices + + # rool it untill the first point is the first point measured + v = np.roll(v, -v.argmin()) + # We don't care aboput the top half of the convex hull + v = v[:v.argmax()] + + # Use interpolation to get the baseline across the whole + # spectrum + return np.interp(wavenumbers, wavenumbers[v], spectrum[v]) + + + + + + diff --git a/lbl_ir/lbl_ir/tasks/preprocessing/__init__.py b/lbl_ir/lbl_ir/tasks/preprocessing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lbl_ir/lbl_ir/tasks/preprocessing/data_prep.py b/lbl_ir/lbl_ir/tasks/preprocessing/data_prep.py new file mode 100644 index 0000000..afc9901 --- /dev/null +++ b/lbl_ir/lbl_ir/tasks/preprocessing/data_prep.py @@ -0,0 +1,96 @@ +import matplotlib.pyplot as plt +#import pyqtgraph as pq + + +import sys +import numpy as np +from lbl_ir.io_tools import read_map + +from scipy.stats import iqr +import scipy.signal +import scipy.ndimage + +from numba import jit + + +@jit#(nopython=True) +def band_score_numba(map,subsample=1,band=10): + Nx,Ny,Nwav = map.shape + result = np.zeros((Nwav,Nwav)) + norma = np.zeros((Nwav,Nwav)) + for ii in range(Nwav): + for jj in range( ii+1 ,min(ii+band,Nwav)): + slab_0 = map[::subsample,::subsample,ii].flatten() + slab_1 = map[::subsample,::subsample,jj].flatten() + cc = np.corrcoef(slab_0, slab_1)[0][1] + norma[ii,jj]=1.0 + norma[jj,ii]=1.0 + result[ii,jj]=cc + result[jj,ii]=cc + result = np.sum( result, axis=1) + norma = np.sum( norma, axis=1) + return result/norma + + +class data_prepper(object): + """ + Prep the data for further data analyses. + We try to detect systematic issues, such as bad bands and synchortron noise spikes + + + """ + def __init__(self, data_map, band_limit=0.99, threshold=6.0,band=5, additional_selection = None): + self.data_map = data_map + self.waves = self.data_map.wavenumbers + self.threshold = threshold + self.additional_selection = additional_selection + self.band_limit = band_limit + self.band_scores = None + self.bad_bands = None + self.decent_bands = None + self.score_bands(band) + + def score_bands(self,band=10): + # we need to loop over every single frame and detect spikes + self.band_scores = band_score_numba( self.data_map.imageCube,subsample=1,band=band ) + self.bad_bands = np.where( self.band_scores < self.band_limit )[0] + self.decent_bands = np.where( self.band_scores >= self.band_limit)[0] + + def wavenumber_mask(self): + # we have to merge these auto score bands with the manual selection + selections = self.band_scores >= self.band_limit + tmp = np.zeros( len(self.waves) ) > 1.0 + if self.additional_selection is not None: + for this_sel in self.additional_selection: + pair = np.sort( this_sel ) + sel1 = (self.waves > pair[0]) & (self.waves or < + :param delta: selects band size around provided peak values. + :return: + """ + sel1 = (ir_map.wavenumbers > wave1-delta) & (ir_map.wavenumbers < wave1+delta) + sel2 = (ir_map.wavenumbers > wave2-delta) & (ir_map.wavenumbers < wave2+delta) + map1 = np.mean( ir_map.imageCube[:,:,sel1], axis=2 ) + map2 = np.mean( ir_map.imageCube[:,:,sel2], axis=2 ) + + mask1 = map1 > bg_threshold + mask2 = map2 > bg_threshold + bg_mask = mask1*mask2 + + + fin = map1 / map2 + if operator == '<': + fin = fin < peak_threshold + if operator == '>': + fin = fin > peak_threshold + fin = fin & bg_mask + mask = np.zeros( ir_map.imageCube.shape[0:2] ) + mask[fin] = 1.0 + return mask + + + + + + diff --git a/lbl_ir/lbl_ir/tasks/preprocessing/svd_data.py b/lbl_ir/lbl_ir/tasks/preprocessing/svd_data.py new file mode 100644 index 0000000..49ef021 --- /dev/null +++ b/lbl_ir/lbl_ir/tasks/preprocessing/svd_data.py @@ -0,0 +1,16 @@ +import numpy as np + +from lbl_ir.math_tools.batched_SVD import batched_SVD + + + +def svd(data, k_singular, N_max=10000): + svd_obj = batched_SVD( data.data, + N_max=N_max, + k_singular=k_singular, + randomize=True) + U,S,VT = svd_obj.go_svd() + return U,S,VT + + + diff --git a/lbl_ir/lbl_ir/tasks/preprocessing/transform.py b/lbl_ir/lbl_ir/tasks/preprocessing/transform.py new file mode 100644 index 0000000..772e87c --- /dev/null +++ b/lbl_ir/lbl_ir/tasks/preprocessing/transform.py @@ -0,0 +1,22 @@ +import numpy as np +from lbl_ir.tasks.baseline import rubberband + +def to_absorbance(data, wavenumbers, eps=1e-5, rubber_band = False): + tmp = data /100.0 + sel_low = tmp < eps + sel_high = tmp > 1-eps + tmp[sel_low] = eps + tmp[sel_high] = 1.0-eps + result = -np.log(tmp) + bg = result*0 + if rubber_band: + shape = result.shape + for ii in range(shape[0]): + for jj in range(shape[1]): + tmp = result[ii,jj,:] + this_bg = rubberband.rubberband( wavenumbers, tmp ) + bg[ii,jj,:]=this_bg + return result, bg + else: + return result,None + diff --git a/lbl_ir/setup.py b/lbl_ir/setup.py new file mode 100644 index 0000000..322a1b1 --- /dev/null +++ b/lbl_ir/setup.py @@ -0,0 +1,100 @@ +""" +Usage: pip install -e . + python setup.py install + python setup.py bdist_wheel + python setup.py sdist bdist_egg + twine upload dist/* +""" + +from setuptools import setup, find_packages + +setup( + name='lbl_ir', + + # Versions should comply with PEP440. For a discussion on single-sourcing + # the version across setup.py and the project code, see + # https://packaging.python.org/en/latest/single_source_version.html + version='0.1.0', + + description='A toolset to analyze OMNIC map files.', + + # The project's main homepage. + url='https://bitbucket.org/berkeleylab/lbl_ir/src/master/', + + # Author details + author='Liang Chen; Petrus Zwart', + author_email='lchen2@lbl.gov', + + # Choose your license + license='BSD', + + # See https://pypi.python.org/pypi?%3Aaction=list_classifiers + classifiers=[ + # How mature is this project? Common values are + # 3 - Alpha + # 4 - Beta + # 5 - Production/Stable + 'Development Status :: 4 - Beta', + + # Indicate who your project is intended for + 'Intended Audience :: Science/Research', + 'Topic :: Scientific/Engineering :: Physics', + + # Pick your license as you wish (should match "license" above) + 'License :: OSI Approved :: BSD License', + + # Specify the Python versions you support here. In particular, ensure + # that you indicate whether you support Python 2, Python 3 or both. + 'Programming Language :: Python :: 3.6' + ], + + # What does your project relate to? + keywords='Infrared Microscopy Analysis', + + # You can just specify the packages manually here if your project is + # simple. Or you can use find_packages(). + packages=find_packages(), + + package_dir={}, + + # Alternatively, if you want to distribute just a my_module.py, uncomment + # this: + # py_modules=["__init__"], + + # List run-time dependencies here. These will be installed by pip when + # your project is installed. For an analysis of "install_requires" vs pip's + # requirements files see: + # https://packaging.python.org/en/latest/requirements.html + install_requires=['numpy', 'scipy', 'seaborn', 'pandas', 'matplotlib', 'spectral', 'h5py', + 'scikit-learn', 'umap-learn'], + + setup_requires=[], + + # List additional groups of dependencies here (e.g. development + # dependencies). You can install these using the following syntax, + # for example: + # $ pip install -e .[dev,tests] + extras_require={ + # 'dev': ['check-manifest'], + }, + + # If there are data files included in your packages that need to be + # installed, specify them here. If using Python 2.6 or less, then these + # have to be included in MANIFEST.in as well. + package_data={}, + + # Although 'package_data' is the preferred approach, in some case you may + # need to place data files outside of your packages. See: + # http://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files # noqa + # In this case, 'data_file' will be installed into '/my_data' + # data_files=[#('lib/python2.7/site-packages/gui', glob.glob('gui/*')), + # ('lib/python2.7/site-packages/yaml/tomography',glob.glob('yaml/tomography/*'))], + + # To provide executable scripts, use entry points in preference to the + # "scripts" keyword. Entry points provide cross-platform support and allow + # pip to create the appropriate form of executable for the target platform. + entry_points={}, + + ext_modules=[], + include_package_data=True +) From 45615efd6e5c6456bb58723565a3cacf39603f28 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Tue, 2 Jun 2020 18:24:31 -0700 Subject: [PATCH 41/56] add openpyxl dependency --- requirements.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements.txt b/requirements.txt index 934e790..63a273e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,6 @@ seaborn scikit-learn umap-learn pyMCR +xlrd +xlwt +openpyxl \ No newline at end of file From 0650e94498b5c474a007702e2cba105e60a4fc67 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Wed, 3 Jun 2020 16:12:33 -0700 Subject: [PATCH 42/56] add mouseclick to select anchor points --- xicam/BSISB/widgets/preprocesswidget.py | 34 ++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/xicam/BSISB/widgets/preprocesswidget.py b/xicam/BSISB/widgets/preprocesswidget.py index 0f1b490..ed96331 100644 --- a/xicam/BSISB/widgets/preprocesswidget.py +++ b/xicam/BSISB/widgets/preprocesswidget.py @@ -200,6 +200,7 @@ def __init__(self, headermodel, selectionmodel): self.out = None self.reportList = ['preprocess_method', 'wav_anchor', 'interp_method'] self.arrayList = ['rubberDebased', 'deriv2', 'deriv4'] + self.mousePosList = [] # split between spectrum parameters and viewwindow, vertical split self.params_and_specview = QSplitter() @@ -275,6 +276,7 @@ def __init__(self, headermodel, selectionmodel): self.resultSpectra = baselinePlotWidget() # ParameterTree self.parametertree = PreprocessParameters() + self.parameter = self.parametertree.parameter self.processArgs = self.parametertree.processArgs self.argMap = self.parametertree.argMap @@ -300,6 +302,7 @@ def __init__(self, headermodel, selectionmodel): self.specSelectModel.selectionChanged.connect(self.updateSpecPlot) self.normBox.currentIndexChanged.connect(self.updateSpecPlot) self.parametertree.sigParamChanged.connect(self.updateSpecPlot) + self.rawSpectra.scene().sigMouseClicked.connect(self.setAnchors) def setHeader(self, field: str): self.headers = [self.headermodel.item(i).header for i in range(self.headermodel.rowCount())] @@ -333,6 +336,31 @@ def isMapOpen(self): self.selectMapidx = self.mapselectmodel.selectedIndexes()[0].row() return True + def setAnchors(self, event): + # get current map idx and selected spectrum idx + specidx = self.getCurrentSpecid() + plotChoice = self.normBox.currentIndex() + if (not self.isMapOpen()) or (self.specItemModel.rowCount() == 0) or (specidx is None) or (plotChoice != 1): + return + + pos = event.pos() + button = event.button() + parser = Preprocessor(self.wavenumberList[self.selectMapidx], self.dataSets[self.selectMapidx][specidx]) + parser.parse_anchors(self.parameter['Anchor points']) + anchor_low, anchor_high = parser.wav_anchor[0], parser.wav_anchor[-1] + if self.rawSpectra.getViewBox().sceneBoundingRect().contains(pos): + mousePoint = self.rawSpectra.getViewBox().mapToView(pos) + x = mousePoint.x() + if anchor_low < x < anchor_high: + if button == Qt.LeftButton:# left click, add point to mousePosList + self.mousePosList.append(x) + elif (button == Qt.MidButton) and self.mousePosList :# right click, remove last point from mousePosList + self.mousePosList.pop() + # set anchors list + anchors = [anchor_low] + sorted(self.mousePosList) + [anchor_high] + txt = ', '.join([str(int(round(x))) for x in anchors]) + self.parameter.child('Anchor points').setValue(txt) + def getCurrentSpecid(self): # get selected spectrum idx specidx = None # default value @@ -375,13 +403,13 @@ def updateSpecPlot(self): if plotChoice == 0: # plot raw spectrum self.infoBox.setText('') # clear txt self.rawSpectra.plotBase(self.out, plotType='raw') - elif plotChoice == 1: # plot raw, edges, norm + elif plotChoice == 1: # plot raw, rubberband self.rawSpectra.plotBase(self.out, plotType='base') self.resultSpectra.plotBase(self.out, plotType='rubberband') - elif plotChoice == 2: # plot raw, edges, flattened + elif plotChoice == 2: # plot raw, 2nd derivative self.rawSpectra.plotBase(self.out, plotType='base') self.resultSpectra.plotBase(self.out, plotType='deriv2') - elif plotChoice == 3: # plot raw, edges, Mback + poly normalized + elif plotChoice == 3: # plot raw, 4th derivative self.rawSpectra.plotBase(self.out, plotType='base') self.resultSpectra.plotBase(self.out, plotType='deriv4') From e0f8beae86c3403ae84a6d9d90deac4dfcbcc103 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Thu, 4 Jun 2020 16:48:55 -0700 Subject: [PATCH 43/56] add mousePosList to cleanup --- xicam/BSISB/widgets/preprocesswidget.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xicam/BSISB/widgets/preprocesswidget.py b/xicam/BSISB/widgets/preprocesswidget.py index ed96331..c401fa0 100644 --- a/xicam/BSISB/widgets/preprocesswidget.py +++ b/xicam/BSISB/widgets/preprocesswidget.py @@ -475,6 +475,8 @@ def cleanUp(self): self.rawSpectra.clearAll() self.resultSpectra.clearAll() self.infoBox.setText('') + self.mousePosList = [] + self.normBox.setCurrentIndex(0) def batchProcess(self): # get current map idx From 2c82ccd9023243a22352f3163e0534b6791eba6b Mon Sep 17 00:00:00 2001 From: lchen23 Date: Thu, 4 Jun 2020 16:56:34 -0700 Subject: [PATCH 44/56] clear image window in clean up --- xicam/BSISB/widgets/clusteringwidget.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xicam/BSISB/widgets/clusteringwidget.py b/xicam/BSISB/widgets/clusteringwidget.py index c7af578..1c05204 100644 --- a/xicam/BSISB/widgets/clusteringwidget.py +++ b/xicam/BSISB/widgets/clusteringwidget.py @@ -457,8 +457,9 @@ def setImageCross(self, ind): def cleanUp(self): if hasattr(self, 'imgShape'): - img = np.zeros((self.imgShape[0], self.imgShape[1])) - self.clusterImage.setImage(img=img) + self.clusterImage.clear() + # img = np.zeros((self.imgShape[0], self.imgShape[1])) + # self.clusterImage.setImage(img=img) if hasattr(self, 'scatterPlot'): self.clusterScatterPlot.plotItem.clearPlots() self.clusterScatterPlot.scatterData = None From 3339a106b8ad76d9d853e03db780a50a187c1147 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Thu, 4 Jun 2020 16:59:12 -0700 Subject: [PATCH 45/56] restore legend --- xicam/BSISB/widgets/factorizationwidget.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/xicam/BSISB/widgets/factorizationwidget.py b/xicam/BSISB/widgets/factorizationwidget.py index d2873b9..e41e2ed 100644 --- a/xicam/BSISB/widgets/factorizationwidget.py +++ b/xicam/BSISB/widgets/factorizationwidget.py @@ -362,11 +362,10 @@ def showComponents(self, fac_obj): # get map ROI selected region self.selectedPixelsList = [self.headermodel.item(i).selectedPixels for i in range(self.headermodel.rowCount())] # clear plots and legends - # self.componentSpectra.plotItem.clearPlots() - self.componentSpectra.clearAll() + self.componentSpectra.getViewBox().clear() self.componentSpectra.ymax = 0 - # for sample, label in self._plotLegends.items[:]: - # self._plotLegends.removeItem(label.text) + for sample, label in self._plotLegends.items[:]: + self._plotLegends.removeItem(label.text) self.wavenumbers, self._fac, self._data_fac, self._dataRowSplit = fac_obj[0], fac_obj[1], fac_obj[2], fac_obj[3] From 522246452543f6d1c9c0aa73f53ae9f97c7cace6 Mon Sep 17 00:00:00 2001 From: lchen23 Date: Thu, 2 Jul 2020 20:35:20 -0700 Subject: [PATCH 46/56] add installation instructions --- README.md | 108 +++++++++++++++++++----- images/buildtools.png | Bin 0 -> 150534 bytes images/example.png | Bin 0 -> 81775 bytes tests/PC12-NGF-3h.h5 | Bin 0 -> 2736628 bytes tests/__init__.py | 0 xicam/BSISB/widgets/clusteringwidget.py | 2 +- 6 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 images/buildtools.png create mode 100644 images/example.png create mode 100644 tests/PC12-NGF-3h.h5 delete mode 100644 tests/__init__.py diff --git a/README.md b/README.md index c2aec49..b37804c 100644 --- a/README.md +++ b/README.md @@ -1,40 +1,108 @@ -Bsisb (Xi-cam PluginMaker) -=============================== +BSISB (A Xi-cam plugin for FTIR data analysis) +============================================== -version number: 0.1 -author: Liang Chen +Version number: 0.1 -Overview --------- +Author: Liang Chen +## Installation +--------------------- +### Install C++ build tools (Windows OS only): +Download and install "Build Tools for Visual Studio" from [here](https://visualstudio.microsoft.com/downloads/). +See the screenshot below for reference: -Installation / Usage --------------------- -Install Xi-CAM: +![build](images/buildtools.png) -Follow the guide [here](https://xi-cam2.readthedocs.io/en/latest/install.html) +### Install git and python3.7.7: -Install lbl_ir: +You will need to ensure that you have both git and python3 installed on your system for Xi-cam installation. - $ git clone https://lchen2ir@bitbucket.org/berkeleylab/lbl_ir.git - $ cd lbl_ir - $ pip install -e . +**MacOS** + +Open the Terminal application (in Applications/Utilities). In the terminal, check to see if git is installed by typing `git --version`. Either a version number will be printed, indicating git is already installed, or a dialog will open asking The “git” command requires the command line developer tools. Would you like to install the tools now? Click the **Install** button to install the developer tools, which will install git for you. + +You will also need to install python3.7.7. You can download python3.7.7 at [python.org](https://www.python.org/downloads/mac-osx/). You will want to get the macOS 64-bit installer if you are running any macOS version since Mavericks. + +**Windows OS** + +Download git [here](https://git-scm.com/download/win) and follow the installer’s instructions. This will install **Git for Windows**, which provides a **Git Bash** command line interface as well as a **Git GUI** graphical interface for git. + +You will want to go to the python3.7.7 download page at [python.org](https://www.python.org/downloads/release/python-377/). For modern systems, install the **Windows x86-64 executable installer** at the bottom. + +When you run the installer, make sure sure to check the box that says **Add Python 3.x to PATH** to ensure that the interpreter will be placed in your execution path. + +### Create and Activate a Virtual Environment: + +The latest python3 version comes with the venv module, which can be used to create a virtual environment. A virtual environment is a sequestered space where you can install and uninstall packages without modifying your system’s installed packages. + +Create a virtual environment for installing the Xi-cam components and dependencies. You will then want to activate the virtual environment you created so that any packages you install with python’s package manager, **pip**, will be installed into that active virtual environment. In the commands below, create a virtual environment called **venv_xicam** and activate it: + +**Linux/macOS** + + $ python3 -m venv venv_xicam + $ source venv_xicam/bin/actviate + +**Windows OS** + + $ python -m venv venv_xicam + $ venv_xicam\Scripts\activate + +### Install Xi-CAM: +Before installing Xi-cam, run the following commands: + + $ python -m pip install --upgrade pip + $ pip install wheel + $ pip install --upgrade setuptools + $ pip install numcodecs + +Then run the following commands to install Xi-cam: -Clone the repo: + $ pip install xicam + +Run the following commands to install lbl_ir and Xi-cam.BSISB: $ git clone https://github.com/lchen23/Xi-cam.BSISB.git - $ cd Xi-CAM.BSISB + $ cd Xi-cam.BSISB/lbl_ir + $ pip install -e . + $ cd .. $ pip install -e . - $ cd .. + +### Run the Xi-cam.BSISB program: + +Run the following command: + + $ xicam + +### Run the Xi-cam.BSISB GUI from a new terminal: +First, activate the virtual environment, then run xicam: + +**Linux/macOS** + + $ source venv_xicam/bin/actviate $ xicam +**Windows OS** + +In Git bash: + + $ source venv_xicam/Scripts/activate + $ xicam + +In Windows CMD: + + $ venv_xicam\Scripts\activate + $ xicam + +After the Xi-cam GUI program launches, open the +`Xi-cam.BSISB/tests/PC12-NGF-3h.h5` file by double clicking the h5 file +in the file browser as shown below: + +![example](images/example.png) + Contributing ------------ TBD -Example -------- -TBD diff --git a/images/buildtools.png b/images/buildtools.png new file mode 100644 index 0000000000000000000000000000000000000000..6f81aed0c29dcd964fd347a4eb6f9011bde8cdaf GIT binary patch literal 150534 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%0DNKXy5>9Hsfj9}w&wUBjm_?6*v`wn&3% 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
  • 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 literal 0 HcmV?d00001 diff --git a/images/example.png b/images/example.png new file mode 100644 index 0000000000000000000000000000000000000000..34b1478decbf411ce160a34b4fe2d986ad96edd6 GIT binary patch literal 81775 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 z zl74%tXtoD3;8~eKNISlnBqUEYa|s-X*G5IOBRwN16Q&z~s8EPA_B_ZJRGC@gg+&U= zq)H;^)d@!rbL#eRy+SoNBI>W3!@|yc)g0@nIM3?MTQX+loe(zk3g<_~oOy@_uHE4? zHQ~<>6ZDZSLY*0AJU z?-|4L>oFOTf7=KLZR$`jvr)S(8BtQy@?N%oeeTcsd(HC?p1xlA+5H2{{yMOXWwr8` zMx_Rqwnuoxrf$Qh)zNBsu9QNt~?4oQmG7OT(OX*gZ3Fx7M6y2IPX6!pM z%jMeHqqpXnc`Z1fwef7$#um($xmo((B;E#};8hwL8HaB}9}c~~er@9Fg0zwUKd%*> zt60-nx#E~~=e%ZWVjD5(8=QO69Z5L9{xao{!|T9o?(REs3e5TFt@Fc~U+nZ+5R
    `+>9^jtKzUZ8!=H+OVm{fBoSqlfB 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

    w_T2H!j)(H? z*nf+AO1H{YK5V!s#2xG`jf17mwTQ2&Mlug1z)^VWfJ znvU%L&w&AAr!TH_r0ZBm4xa7El5LKB@m2g0H7Bl;G5>aBC!TBJ#K;;)KDgn;ta2yb z9^}lAh0few=gfd7&a{=Wzb3<(L3S<-FmU0bYG$5=@5*I|W&PHbr*FH`<%cUb|8Zp}DHr_9 zl}a(Lyc6llE6v<^W0o7&op&CH1-59yfjm9(GWFGIv=*4bSymjNXFn4y@ z;?9*3?z}zRorj#=>Hol;nuZ=Ut##+imL8n%>cJN6JgD2ogTXEyOv&)zKJB*LyWWG- z&v-C0(u1cHJlHeKgNsX~tZQ3ZMYg5;{xSb>37d z_hyb=2SyL+zy;nNc=C7$c5CUw7Y07;VCchICm$|5;lnwPeAxf64^MUQVNq)zwv6zh zO%q?vOY@;$f)ATj`0(0%UtV?hrFWzcGaC7_=R#i|f9uO*u3)$mc-j*j-voSH>C3_Q zKzCAN@Imu5FiedcWJacsCgawTs+&o_tz_95veA%^)C}lIg;hsxTGo+6-gTsDqfU$& z-HFPw_}%Wr*%6)C;9e(YJ9TD~PG?@0Wvq8+HXPiUrFEToIK49;#dfC02tVep@RQsJ zew?cCqs4VUUYO`ljRUf*_GjsBe+FuG;ftUy48PHZzq)kcpa)%O_@@hlin>rIxGO_L zy8i$AX`^oZrrnK=UApmwb2pxu){SV~oxwl4@%ZL$ykOa#1}nRBj&cC=n+NdkqyYB1 z6u|HM0=P3HfQ`2GV5`18xOYGD`Ea~j9jDdTuJd>nOFjpI_4@vMG5j!wnnnBH+bOJ|Me zLz@YlcXk4`+DzcK-4l4WvuEgzj`Lm70qN?<5{%ZF^g+TXYuTc*$mu0o36`d zQ!{Z6|1F!#R*UCy<=(j*`d}`*oSsKRulbzxXCCX1&8JJ-1zdMw0h?Pbq;7JT1k)2tN1v474Pm_#f(|2>2rEDZ<(&4io;qq>$H~j`s-*HxQ>qJ z*YRcZKn7a`GHi4pPu2(WpXqw$_^jvj5$pMW)_T6w+Q5HPHt^%o4V!#cV*jWGv5Ymru)jx)GXUf2X5hzeOq`>X)9mpZ)N4QtxVdx zmDVQP*zD*wK91VPzp2|e(l&@gP6e^I{&tQp3E~N#?Hsp#JAD^!=fEA?sUEkTdi{6s z(A^z^J?!A|oE=Qh-oYOJJNfa`PIgk+Mb(m>+|gr~@Ql0INF|tSRtIzIg_@zJ|E!#9Mj`i1bPVF=rI58>~xA@nr~WpHi?|J8)hbXF)cw}sMr zRVZ`Dgz{UTP#$|7%B{+K=%KrZS3ZSO?OrHf_us=`_x3Q-eGhHxLz&xg4?BF@!&e$% zoMRZq)S5lKZV@K&3So@*3uBMQVN9_K;~uv#ezFbYhiPH72oK}K{bAxeh4ENn7=QYO zvvNZ?XG{#|=>g$P9uv;^HQ`Lp59j075i%!@;DAmMGPjNp9cTns$nRbr5iARk|DwbB zCO4d$heUAXtq7XFh~VJm5!}!>f^YUju%j&Pk4A7)XoTn?Bl!1u1WWHnF!Fl@o9XOj z=-~){927yNX%ST37{Qt6BRFwK1RW{o%M9nXTj3o3Ih^BD!}(=vs053*zH_ zL44;M#L<_wkzw1IV7HB~2e)#yw7FgLw=lQ+7B0`&%twPav#sT34w<}(=WcCeuSpw) z(~_@0?AyTkJvT7u@p^^~SkJD@0=YSQ9aXrF*HhN8PH7EKbXzU?fL5~CfEC2AWt`P@ z8Cyy}^wn5OKm8@*k1yhn4-1)pd?ELCSiq_C=QHKQJPrt$OU0!*JhyK)-!+}db}wcy zPH6^@Zka~E!l~@vY$}IpP2uf%lUT540&Bb`@Xo369CU3Q&()9RqV8kqxOI%omqxRC z?nnkS8p#)}=baC+>FS9iNVzm`a|TNVYx!?$7gOo|g~%_4MZMG%t1<;mud{;spy&ez?@0Y5MKC zA+jBlYTD9pXj^)TA6FFR#*)8oJk;KuQQ|{>)p6xa@jY#ZyD-Adh4IUs=sw+%n(G`{ z+S-vviyc^e(UIR)Ir5RYBmez$;6Yml{w%fU3rz=R3QjjG!GV6G9Jp+x1D&iLm@GI@ z*W(U6RA^5^woM&*`J>=OJDvFcy(4?nIvQ9Vhi_$HPADdFf4iwzO%_FG20;@9N3M$2_@1#Y?o`o(u@};sJUyCdG@3 z!n{}+=_UBEH_wjpruH}S4I{j1GPwhfr+ahm><$d*=)>e4J~TYy!`wqYtjzLZxW6xJ zYJAvasW1CK^`+xzU-4JLWv$5dA0-_n$emZgVMoC?9^{g}WRsR1`Lm4dCqCQCrXBgT zg0vglk!zega_-cQj6c_r>lbzu?yVDxM|Pt9l1}V1urqVobmkuC&OAEVkKelcF(%Vp8pdX!iV4@%I=KJyUV?U}_`|-(FKYsP|qwZBdo(uEifpkB5*ZXmU{5K%bpE1Y% zS#Rl2S6Oe#^Jlzg7tYcaKhCNP-E4ZHExU6-g8)A0(VZc6-FWarH+CJ>3{BYTF@7XP!mWsnKdt zlg~Gd+U;Z)b>BES^1jFE$kK@8k==*ii|o-YJ2GZ`a%9q~&ygwJ2S>K}*XU8@mo^>7 zs-E;I`?}L7*=)N{;t)sQs|(A0l)Cu)x~0(fRU?0&HHUut99Z1n_svR8U$rw|e4}RO z`CjiE?R&W>()aEZf8Qm^O?~q$zWQD$Fu)^Sdw3n|2AA6{uuH`Y8@qVGGrQKeD$5eX zzPRC4h@s@aKI7|k?167ZYX{h8>~a^_K7$a)lu^1 z2ja@Dov>)K5!E$YaYcPF!Uu0eGq)2MP`(SN3-4j zlkbc?#&(H=x^5}orYOr5?&dopc@TMpCt#(#9|c~U(QK=))YIWD+v{@hdhC&dW+8)5~YsYXhYYoOEkAVH} z&G@t_1g#u5!aHXzlvUQDVZWsqVX_zVb&sH0D-4@H>_Z=ya11`P7b%zaAT;Ix>VNOY z!IItBbafZrxo^kVoqMr7_W~CCpFnla7IfLV8A?m{qh{6#Bu1V=+?#{)t(kpjZgvQV zCLBV+6*0!?7qCd}f_(GgDzpu*pwp=f_^N#g0}ZcXQ|v9gTYMcaX5EL=ib!-GaUU<2 zJwlrGGt7GT1Ujo8;YG>=^y>Hm|JJ?3imo4EbMGS_YJbIuVKMm9LcR}nHWAN`CqlW2 z0>5-}5b*O43?zQRTyibX{6CV;GOVhtYr}ROySobu1Dkc*0V>iVjdUvrqKGso9ny#* zCWs&yC@6~9VqrHPyIYU-jqCk>%xmQiHhZl-$5UhZ2l0-5Q=XUqP{yVIRN5~2t27={ zpMRv6()W6e@D6QEQg~y^E{NtMvl#;(HDi`|{$@Cd*Q8HNR35aV!^zh47VpdF_U)XVKi6w49NLvz_U9B4AV5Ez0|*InMO<x9f8_YtC1`gyWlEF@ zeG^PjLZw!pu!Q^1Ot@^ggxf<*G1zTN>wHtTZ#Ttkk10jZm(YBwDI2etV)U;mii#Oy z=bK@&$PBM7X8cY!(4D7WOFmzF$jWQo-`3!bgFWT2rX zX&)?kwBCvv$97*kdaBuz zFvWrAgB|gWcVuHLCknPYaiGWv?J?37;I=c*-Z(SC&xPwRUAU#{%92;ExSP1~v&4Yqx}lk;c3|XGrtL1|&J?@i0z@(z3-&SJ&cf)Iz?kSwMxFCWB?( zk=}kjW=Zq7;53(4&*xAPIfud&!M7UDreDG={H$ja)L}Nd(KETfcqW^N&SY5fOpec; z&8q0xq^_Jzt9El(T{xS&j&tanGl%IKb8yI&A#OQLfd51TY$^i6Ma{hHO(cqVEbL)*m-Q zd%qE%d=q1AplJDMyfsLOKfXD#Pv%5pppE*Eali^hYz2>!>5w)tM%F!tt) zw>LKgSF-b7L4w8#TCZHeh0Z=q*YzQy%7>}-SE6;$SNxd1)TymxUbr7EO#P&0_QO5L zk7g_VxKZK9=Quy<6Y0mwX{%WAK#o24<6HJB4lP(stHjkf2oCl1-D-Nx@aIHtf6m_Z z=Ut;U^cl5=sWMvjT7&WAHDo#k(B!n>Qn3LzSOl=*aR6<{ujS%`wG1MVKnEE+*W$8l zEr(kMN-Y)0!~8&6C_yyt5Jc6KAOgAt(WqY#?|TK&V0;h*_670!LJ$X51o7i~5W&BL z*#0>Phf6_(oDL#tZZK6T!NU6olb#%mS+HPS4#AAy8O-JCVEPva^UwESa@vGYP%nf& zjYIf8GX#xsAslKD!p=P*a{mh9_2>}FtOXa-3}N)p5RR@6!6-X~r!w|MhoHSKME;*4 z%)10-gi-h?prU%}3jLwVCJOt|eZs@sL3^&=F!>!G}S8%of(P+Hsw<>=5bOb3Ut zczPIb#|x$w8%FrIFg8vM=i$O|y8H~o^==pgn}-vp9WEGEIBQ>q;npFXdXeE=T^ue* zOE|S2;gY``PDMMxLgK>VbvTdQHvFC!^b)-ieeI_g!gL)&c~`IYN%y1R~ZZ`Ki}vR42|W+_E^rZh-KTZSiFD6vh+eMQ@_e+5y$!wacr9w zN73jwHmJwpDC_se#?c`=j@(CaT=)@3@ZUJ{1;3m=D4w%h<9QGqPoJ20wAaV8c1t{~ zvf~+A5KsK`csd`CC(b)w{1^$03QAy{;BTQ>3EYlKU|U%NNv9LoDi~+giv(Og$$H~N z+OJ5YzFi{k)dkbEN@QNoL`)_p(oijtHpz+fxtmC`42{2uSg0pa)F6qkf@^*Z5d88& z64qyuUOGYg$ zqAOB3)FKu4DXGM%rE)7M74MQ%3>K#{M=zDim8qQFkxF((D!UG)V&5%|lReY8H$9D% zkTg2Um~|qJKWEdpnViO#t7#Z@NT<)NbXMx6<2pE6sB$KQgnFI{WqP1EUcI~rhIxCB)FH(N9y z*?h{(=I@bg2Ki;-AwtI&1m)C%r_6&KDC*P`!}=j)n;N}Zl=rVTy$M? zF|o?U>OwBtujJApEf=@RTd=a+!Z@QXaBvIz&u?L0r##-+=W$jqkLNCVET57`7k61+ z&ZFXC9s?$BrIp`S!WM4DC}%6-9$V=Vx)nu#8xxmpqsVC+|0Ql?p6WL0du?M;`Zn4h z+{QzV?F8$|n6n+5E!)YuvmKLZJ7_v!2c!SnPUWxd_;=fZx!w+5tlxoa z9c<{llh$!N+1_g>$N$-hP4rH_E1uJ)v=e`Ty{9O#cvP*dT ze3lyL^EV?O_w)JKX60jdBcC%<3&eL+K&z$&+&q`hD}w@h?=IjU=K{u96p(PKfX=rH z1bg1i@Z{Y%z2A*Cg+$13?omjO#6ntKEadN>LTXm*VU+0}#;EThasD1QI_+Wiw>_ww z+rz;YMJ#YCVy0>lS@VlfQ;PW7y9niE5$&HAq5i7~kA=lFo?OgG?_!$XFXqCHViwNY z%Vzbx+;`Z^ka{J|n@~d3))MqSm(Vb!glFwb$yirP=Dkwh%-zR*m3@?l?PKDZeH<;^ z$7RR;Bwg9hqP_>{9dv+Iss|X5bbu!Q2kBXHkmBZLOejA{=#zs?FDRq@SQ)Oj%9!bK zNO-413>|!!b4v~rfB7)iww0q2QO=~n<@DcO&YZvHBo$Whw9OIvwLOAf$`L}39AU!w zBfBvgXyH(Pluu^`XEAfv##$t`*s60J}*2Lqa)vsd8fGT=SuA*x} z70oqHuyjl{<4vmB_N1Cv-;>N(ev&qOPO`4?DW=7oV#kKleEN8rS2NGxrgMhrHfL~B z&hj|mEXy*^Qt5Jz8?Vn%yY@U6{+!42%6Yo|Juh?H3&Q)?(0{;1lH4z1QgIQ(8y9JD z^CEq>T%ymU%e-81S?Y`{?CElaN$FSU-1{oCJ+3k!@+##|uFCzVmPb9WF?ZTEhIGG% zZSpmqj=he0#~akT-r(iH8$9v7LHVs4%-eC3!=G=`VdqV*O}xcFPj8V?eTz3;Z*ytn zZQAuYOJDH&{MvILji>i{ zTXdh(tsY=9{{f{-9xyTG0Xk_9Sho5Bvzt7mUZ02f_&nt9^M~wc^++_lvh4kczk!b! zR`7^<9*^+Lf5gFUkKp1X8aA%Oy+Ivcr_|B!T^;jk>rknwqikOt;pue@T~vBsC&#Fa}SHV zclkQ{F8v4JW%J8B%*ek@$*SAzk!!-QkZ zFRSG1hNE;#KO+6vkI4J4pvbbEt|o`6oqUKLm*u+cScap;L1s@oK&!_48REQ;uG>rL z7GA=%r+evqvzS5u6=684i2tVS!D>|@`DwfPWm|yeu6!0H@1mpnPTmCVpm*0DaxdLZ z9ouNpcq>VPd7_QnLW)5y`pKJl=d}rs&p8~Lmct(T-K)Bs#r_Ui9Jro=-Nkh73`m#n zdK!(xQt34{g-PWba2zST>W?JaJWk|imqhMYB~UalfvYd#NR_!?;prG6|3>ppc*)8q zQ9P(xk3r}440Kt?_o_&me2QRnw+NI0;T*dX%J4@aY+DgRNoFwGhl99#G>}zuL`X9# zfcmZ0kTAesw9TtTPw2~xCcbz*@}bG>6>ON~&D}%G_^`@@>1H0x-08*%6IV{hxNyzX znQv{JnZLnVv|3J5hdL4KCD??O6X#^KzUn|hBL^;vuA%miU?R62n55!BgEjW(^|ME} z&W=Pwd)COYPJRv~40FV%vm-h8?!7bLCdGE5Dw&(JjV`giGw`8EIMwC9efZUGC1o9a2~qW>$F7w;-o6s!Nq+L#`r&K7 zijOx|@%*VDdB^HwKH1`wtrdWepJbWL7Mr@Lzj7!}A9uR!Lw%l}FxkeP=9 zS=KO!hOYwY_&Jbuw*wigB6X*2FfUYsrREJn#UqHznL*+y2&P__V0u3eVoXU8*UW+# z|1t=>fx+lC3Fe|(Fx_M%cMirhE|{fXgBfHSLKD$gtl1k(Zr2d9`-iYzYEjRYA*eMB zku=sy?caW`7(r|sUb|e6T(-iOMmM&ChbuWhGR__m->a1+f3@uvtgWV9L^TM za58>`ajtbZ?;nJ-aCiiJPsUW7o4T)}L948ab$!=YI41{J{Bt9^qGmuug@u1~#qn{; z6;1zURy=BxR*|a}Ug6rqxgv9{@MNDmR`f{eQPHJA%Zm5M>Q{USI#@m+FsVFsuS@yK zPIt=nBkNVvW}Pmt?Rv62+a;%b#2wqi4Ye8_T0FYZ)E4@$r#d@3sE%MNW!0G_%D9Xm<=oX3%814jr6=NGWyA|jWmaz^ zCHvo{O1is)(olD%;(nu-a_+CH;@@havM?KE;ir+xtf^`0a~=Duuh4FwzPKbz{rTki zin&vc@+vV-=`|@rF?*k=y!q;;B+Zzie9Ic7tTUgdD7wS7GEXd zZHUq&JYJchwMemEQ=lA>eATkX2bCq7JCwq@62&|@OqsbbUhyrwp*#rwsPyi2SLrTU zg^#+%DpePbDD(E5SGo)iQyRcTtN zn9tpzgkLRFCi-nx+}xs+*8S6!Pa4I_5{ootNZV}1duNf-s$;HFPkdoID&B~Q!&0Q{@7gUdsNose_qSHsuoP&Bz)JiHq2_%mM)3n zYp`$2M)8YRN#@_6nVqP4EjoSSxE5r0qxYDeboteTqfL8aVbh!YC;Ku=r9VBk^k?*e zfucnjOz84KWHug*?$aS8e;7*4ITc)ws7Tg;_(fU_L*08ATAhYtzhyXkDrEcKFm{SJ zroq7Bw3c<(+F_!{5$}lgFs2<-VbU!XK3ERtyTJ%ri5}xp+DLk@8cCamqo^J)n&KBD z8NPWW-x6h8w8m;ZRS9mWN~N_b4o<4X^cl_8)X_v99L?OxqWg^-!=&J`w45;xkD+Q@ z>NTEDE)ztiGm&kBCo|x{WJcedLW-(_&S;p^ej16Bg|}Kdjp$d?(axTU+U}Vc8O~x; z{w%uq%;sXFIrul9i=J@%KV9e3tx|(O<_pkOS;&J)i*Q-3#c<(+rnk|?HBTGWIXe6- z&>>rNl9t2t7*MT8@ArB*SL-uh@c2&O^qFzkfKhD(llC;^OLrq8XA7^>)R?g$#)K?2 zrdhEuHa;edN?k(TAXA!`E}_vFQ)}td!{vI1=jqlWyAC@HWWwO@JO)hgCfj%J5+R#PnY7d!WN?}TOQQf zvSX<&YaDG+SF;nHh8?4u3101KFSwNhKVlu&KhTkZb)s)PH4o5!G7-iSmn++H+Kd{xHDjsJDwBWd93A5 zjo{wpTinSz=T72gckv>)Gwqo>XB&BN(8z;~c^)Jsd5{+5!O)`~SniZLhmI$+|9bFx zwkLN-da}3eGJdsO#>S;KS#QKFsdm!?AWg40-Ougfw65Hu&OT?@PjIUnVtLN!u!4iXZu+a^9B?JAB!@ zMdnHKR&qJrkD?W;xRAPv<&9ROd44rMt^IL7?a$)yHQbyXK<8%xWR6>l_MWvE&I{yL zTp(xe2lCZ5h?zfw$XF1}cc);cmIQP6Q!w>=%A90n2yH7uX!%Jrb0Y<})(+)vTqx_S zLfLgn=C&y^XJ`=0fusdTf^2i{ul(y zeC_B;OyB!3$8-e|d0wpBwTw##JeYUQjVGO5$$u|e+op~jQ@7`$gRS&+v!Ts@R#+{N zYpb3m-li64bvCE5ujq@vn*NXPd>68WPZvx?m$rmvajOq##u0LBM zxST25M4!Cxn<HWuw5?$epu357u z#D@LBOF0!~OZY51+I+UdvA~{5y&dR3*O8QAP7Iml#ODuAe1GXo_Fxwxrn?At?1JNJ z7dotTC9ky`^@`mv!=0ll?kum8@BK;-zFzlWT8JmlUwR6Mw2YCfmveuxm-raG_%hxL z9d|EwJ(l&+-n@_V#>9RFcdxDB=OiBr<@+_dOfnE7@w{CtfZ;X0%@=Jme}o3Ra1hZ?$;5Rui1Q8s{edw9@wH<_drI9`|SKz%`sY zB^pS*07C2nu-Ywi=9~b|I|k5r`daQZ3}n!xKzcdK{8;|S0lNbw`$4qBJ%gAyDhRcq zLB!4s!YEm|nVmsQD-5EO@G|N@f|zU`jN8#*x<3r&?44j#Yl9i`A(#@C5JuR@cWqM$ zdxbkW^ik%yqhu~SQNCv~FMSdg%9JCa6f_LufXr9l9tuT$WEfw^2v?%W{4**{yhveu zmiegerZ5U`hS7D3%t@Dq^DH`?J5R##Y#u>$+XyQEhSMlEoLAZ5y!aW;;$aa?-4nsf z(g1^ z;W3VN7p<%C7pI(~7}zz6u&Gh}*HpLoQ;X*Oi45zfzd>yMf1=7 zXaX~%$z2nTTBL9vay;-*G$$@bv*&U&tJlO}E_JJ=Zw#wMFWvh|G%>=5Y_o~s=kOSG z>|^jNj$xymbG;~r=F4KJ&W_>g;TSgEh#~rU3{hS&g1N@fvqLPeI>mDFV+^mq$FS&X z43p(}le!qHUdM3bZVVrzV)(HohA;bKM8_AypBAxFC&sXMdMqx7V(BV8N&O?S3@nMo zI6anxqp=)N6%M6UEL&Y-StuIr+r8sBa6guNe`3Vv9gEeoIGP&9Gi-Lem{H;wnjgox zk)rAD8%OEpINY=2=$#u!-u!r6*2a^zJD#Pc@pOG1$B*A}JpCNUKH*K$&c<_fPdp9o z$MY#VUUV4oOv;PLRrX)5jHjkc0^KJhuw+;Qsr?cN8=k;(C*e(|Bv9Wn0hR0o!j%MC zbWA{JY61mveC>$@TBXW*p9J=1CXn$@BIjEq(pxo=iW!L*v`G|=OCoFC6A9K&q)K$r zs&Z^?aiZjzB+{ZLk)txUw@sq?$|SZ9NusK25`OcOa1^ch3%ewS%Kmm5N!;w1#Oap8 zz1Sp4K1q_`(n+kz5I#mUfVf8zSeeaU!s3h}#WipMXB@^S6%!JTnTI@*XtLVhn z?o7r+c$J?sHV`9AC)Ewi6fJqkhz*>Wy@A?68@Rc817k%;Znbp-m)oY0BwS0*wGGq> z-xB<31A_*qpgt!B-ySKf8J|M6Xvl-?QfPWJg)-q(#y?G=|BDoQW~Wdt>;DPY(szFf z%O0n2?uIN6q!7O~g%{Q-+}V?YXG)5A&xE&Wm`dL-DP#;vrBo*sXVp{!HBSv$joxR{INBwhG4;~vS(+x^!Zc!kq~Y8?9iQ>(wAM@~e7hWr zOQ+eGbX)?`$&8ZyzQXauq~q_L&g#AC3=%x)-}mXv5pE~&Ogb|kr<2|_gP9{UsP@X> zZbSxQ8#1UY7JkP!gP+qf=;N0mISd)R$j;zmd*bgL92&jfNTON}Ep>Bf;E*HNZw~4CIgGuRgVT>3=3UL< zwD3r?YjQaGB?te3!Wn67!Zm&q6G}I+|CFph-bB^YO)Pn_NsMTldC_7s3ubNR^5V@* z)({>kYcpymH`AG&xEZsZn>2fT3e;o*^0%wtqdyJ%E3!A!ne}()K;|5Y~}dq#C6I} z7M_yr4?Af)V;9;HyC_ZH#jqCnEbftyaqoPtRp#@%DxW_!`E=AQV8F-%a+?%TqFO+b zdI5KQ3Ro3XK%`BpGOcAZ_6tUxUk-z(?rrE&Wba$QR(`@9#uo+UidFX6ji36;-E7#~=|Xu+nPJC{;6s+1=trRZ9h zk~O51tLn&$RN-?-zO6sJ2eDT|duFgJ^()QtLw2#e6`zZdtkGVVcvFN67 zT%GqbUSmH`ukObtZ9hT9`|+)JfMzZSM1Oyf^xg+C_;i4T`LdpVkR87d^1``{uS3fS za4VzD*h4IMR)*?~LmXRmh~FCz@%r8&KJPq4V2{K67j_s2o5Q5NJj|%EUn1$S#I$U9R(5J#xD@(5vXj<7xUDD%RO@=t?G`ZcbkQ`S*7 z1y<7hcqNCwR*FXU7{_&vaq8?b%zhq2W5jV*1{}w=>^Lz)s!;K*VqC{6=Id2azorVi zE+@#TJb}Z#6NI&^M)z(t>&{d&@liGDIwxrvbCQ1TPVsNkQw->Siq^ePGtlTX&DNbJ zaKIT7C!S%i+ZnbWKf`?)c7xB7+W9O;a?Y}C?m3z*J;yz(b9^d0hk4aG`g@!gebRYi zZ=R>~xC=accwR8_3&Q!-@TzqUi!Rkro?OG6cQqIYmo`W^wI0hZ65HVtQA;n;@!Tcm zI9|eb!zB_%Tox?kGH+jArufrkOxs=|G4BeWs;^+X`wDU9S4bUyg^A~`aJAu8+HSwX z*>_iPd3l9p^R5zh{3`oDT_wCrEjtZr`T6@Q*VJmM`FxeY@TKf&; z{v@MT>h4-*y{KjT)>_gm<-KdjV-H>BkL6X0{jc(U%vI4hUSVm?6+BX}Ftq0tPJXyd z+V#uK_P)#``Rtotxg`AWB?k7p#M$!~u_?UBnSzT2aKOhmY~5=P^`sEBX2DD5Wt+L<3ks+^KRjeah+NP>xp2 zVe0%2G4OX8Tb#-mA=l>U>VtT-JV>*s16&E)kJj~lq>S3fKhsKi9#z6rU*W@F7LzCU zpI#9~_%PI?dJQTe7XeY6Vo=I$4ho`Ww~ev>ULl`Vh5!Sw{x*# zE0a{WQnoCQPrtShmcNAv&0N~qY{q{3CYs6bW~g-zFQYfor@=<1^vWh^eijBYZx|h$ z!QRSr$&wR2N+NXEKF(DzU{`I_M@ z6Mn!tC5*L)Lm4HUME}WZvq-f+QdI#dwo_+6#lj%cvD^MA*g6zZ;XsNo2>MpB!`Fj;XCsxr-{JT@4 z{VAKchQoaVDD_`Ms<%HAn+7oXOaPbKu4U)R0MdN}n00C`;ep~=oV%9Prh#M&zT+;n zd4+u-{rUtl*d>sx7D3b$1v2rM@K^r{?o%!MHG=r58$?`W5TCmTb76lFJ6i=~@>jOk z2XWz>)b0xf$8iZJ@pLe4OoRFD5lppnFa@!}j1^sE*t8I=v_k0bFWSb1A#4<0Dou2b z>AwGeY^R;n@&iI~oE^rhTcP3)4dvUp5bUppaLO~3Nck>ki+|XmZ5ZZF!g&5~DD6&$ zGUlxCP#;3M@g$T@??PFH&+c3P>hT?HFlxD-i1cwM? zR&JQ&mk94PIh>Ng;jFkH#>vj%y!;!6(eE(I#1pC`{L}-{Q>rcqM|(~~Cu(&#Nsu$jhRi)Q=EeRJ4+PBKTME zh0ZU+x!XDdb<+sS)5Z6k8$s{~Iahe$w-pg=6CbpnPXxazBk1rVf>)xseEBQ_uPRaJ zILoov2)_Iqf!gE|6(tA#D@xXwRdfzmR$=&XZN=)9W)&rSM^qgAJ*;Bd_|X-`t;{PV z$EsrS#ed6hTW6LV{46Y=T;W|F@MJ>y?4{2RfBU+l%(!Cv;W>s4%H7)K9Lfm3fA~?? zq2+7rE>2ynlcrwPDMh`_gahhppEgs*9v-g@PVKHdYu{b@Q+QT=$lGb^k-qQLlN$Y_ z9M)=}40zjK2}^FGX!W#EFMXGxe(-#AWyowN#j|*sGSF^`(z%JIvaZrx$(<3Vyp!Hm zn^&Jv#=pL(w10Cz2~^vwIOS|pDy#P@w^p4|ex#NuHC5Tl=c^$~(^3~DYEX!>d0>j7 zyKkS8viq=d@N<-fNArZd9Za(I#EFqWVnw7kpH@4m_tU9Ga#K ze4MWQQGKI0UTesRS52|#_(X}07GG3ok#c@*W6_4Rr9tC{EZkS8^gMA}x$v!6S!`Y` z8HiVun~qPE!d0$HHwPc3c|<*$e3eWX&v6VsI-2UkpOuVZp^_1)hL?ntCin>rI)(AUZ2*FmDoEMlvl}>%KBOf`FMC$c|Pl= za(4B<%KY{(l)s;EDH_wRDSz)jQuN-}DXl)fRK`j_1g-Wr6a(p%kgWew`BL*j*?qoF zv6sC3CXR2FiW2Fy+2ub)qoed^&3vs`?)j{|5B#N^mwfUCzogHfNqt=AN?z=PhM2ys z&lSmgoinxx0gB|6YBguo*_I4 zJy_qVC#Ot$U{k**8p%ERo!gsT*20lp>r42Le%u;A0R8R*nK*6`t$GilcfdgDA2^8U z@k1r^U>KHa!*DkmO2C+*I4=<1Yrrt_m0|4PI*fi@hO?yqFcyk`>#3FsS#4EVGfaiO z29o&`AUxZ|p>*~bDm=c>HWqKk~J1H z?Q!@BfA+3;JXK*6#D_6~xVVXezfR&^zsYhsmn9HQ`# z88r9>?WRsAXX6Z}N6h4b{wyw@75`VNcx-QrFQnaEE+)+tf0TH_XUt=9**x6i=hOJ# z`B>O%&}f?m7UKE3|3ZWL)f$Yq*Cg$MCRe^|Qdzn{v>^)wdssl`l7$phEF^!+Lav)E zqJ`=r=19&-qt;p+nxVxe7cFKaYSAWeF0&nEfi+jC;437S|V(qp!{IdE)mPqfKa}HUr$W`EXWS@^<7L zQ*E|8YooVGj4*nIhwWZEtT5A|>1`dlT+^Y`6kQx&=;A6K zmYW}RiEN<9>t6Ccs>H`KQJ*h``egPn;MD{J?xcx#Y_9=EHU?a8YACu*Lrg0T8CGY= zlt+d<_+iM2Zbn>EGm;z`BevHXVIw{l#~nt5iVtk)SR<)TjQGdjh>BF%zrjdwZX^C& zmJF6KBh*5S2p?pG(NhBo`x-K2l_58J8InHB5aafS=uR`Bc)S54CmZnhfB{Yo3>jE# zz?A(4AnVNwKE{#jy~61 z4H)Wdz&+tbov!Lj?PVZ-Jp+cT88Ca50ej`OYknH==(@htP5N|_QNBcZ90K96Ve+gES#|QSTmLvnlYrGIRhG)bK<%gPL*c-ePha(tR*~ATf+4( zCU`D1;k%l#)D1?|r5SSBR{quxdOSFw%axWo96G+3K4w~U`gb9%Ll)5Ufd)an=VO^V zm&I9gFx@Db4dThS@R*MA2e3MHi@WPlh}P(@~l#(&@o^t3)fD? z;J+zkw3^D?jH#sFoQj8~I*rFDeDV?vfMgb!%IIFJ&?ybVMGr7aXPV?2O{3gv8Vf&9 z<6!1=vYN~wVzFdL)t`ZAV$ctkWuqB<`!Iv49cK~Ra~589v&cF$3)Oov3}&Njoz0AP zbNIVr4*hiJkZC%H0?#@88$U;K_2)8R_FQ!R=kmTt@&mTYdc%3RI?cl|Zyt6t=3~`o zJ{RZBC%{+M^~9&Qc|J>P=Tq`-KJB+?@ZyUGrEfGaEYP5ClLimQYSKtclRFDFiGQof z4wVHA-7J3Djtfz1ypUmQ7BYlIJnyhbIL<{xCoaPB_aeFv(ULjuB92Ya;(fZ7^rX<@ zR-yO=Z)kBZaxo8XEymh!G404rbzS`p6yKtoG6~vO5tx;nXt0C=rBr6uu~OZ>po*PzcyywNfXrUOnCRgm~r<^ zXfb68$(BnPJ!uJx>z_KFIbKGw!9D(L%265KD8^%giNQ!yK&^ zW@I-tBj}#IW*;-j0Wo8GXEXNtneq9Q8UGfTv3ZC&tLK{&DX-(4XZX+}7KbSILns6j)+&!;+h3;>YZ7$ue(CcFncI=dvYZJ6bZLpCu_N zmb8zw!X(CuK0U4Yt7j!1Wh*v$Td~~7ik73TnEKI*CR40w9AU+aYgYKGSYtE5nxB)c zx!%p1!9Lc~Z`GPDBdv)ZYRzL=Dm$zRHM61NY8%@1wGqF8cszq_D1BtZN<$k~gxZkx zTC_6{ZLo7&%H;=3vCb0D=li9cXerrY6Kxp~V~cq|TMT}R*Z9s-mfu^-ybN2~JKG9w zW{XO-EuGD6@i}G7t(&$){aK2?XmI-H*)luLmbWFg3_EPgvA?!BjIzV?p`2gOj`uHZ znSa%mEq(1MnQAA!RPDHtW=H2KcJ$D(W5g$0EPmT^)!I(_zS`2LyB&3MeuDU&vrgM` z+E^9+8*;&_I%u6&k!ejGDh1| zpywcSEC)6px94;p2fnv=peEFw_`UWVE41f%m}IOa+Y?;h0jmfH_7yr1Exy=j(HQS< z6^=6J}UUd*$)B(%g;;Vh@z|9H=hTnBS z+37%dx%h40IN;UIkzEr-AJW2+=s}J+^>!qnk0b6Sj%+*Q$l!cOn)Y*&9zCLI`p1bQ zK8{R0>?j@uC&7`N&>iHA;U_1_wv%;pCnC(8n4jk){Un?*+wLqG*3Q!N!i9FrU9g@g z`}RArM#CAu*Un^hbK%QRXJX~tjS0?Nd+yAg9xjp><-#u&7uwEpVcuL9=7?5$%5fLT z$aJCecNgJvU5T=FWpbD+0s5}YQgP*rl`HAxt~9*l%BU-@3~l5_rVO_+ZnSUjM$m9K z3I(fr;p;|Y@dy7E3~Q2LS<#I}7uC$2%r5Sv`?!mD$DM{l-3c>xXL_uZcy_mRjIm?bL zXVCyJQV%RAcAgj0BD_d3^PmoX-TyK;pZ>|S;Xrtwa=WIVh+WBE1`_`THBT3JX*)RQY8nKFw`&XfAxf+kb;&EQOnkuK&v>dt` zz3SCe$E?OOWHn>0M0+I|X5%7%o_MUGcgh+H#)}?(L;xT1*GTW#0Q%ls!-ErRI8iSE z+ox;z*C{|anE-MF12B6Kz^ferj8j`nQ>V4q+zw!q=UTQ8T+4LPt@rvRUg@r)Td$FQ zQ$&+qu$C>Qg8lUlq`XTYdH#XuCkA3HV{b+v&C~;la1G?--axM03l#h;kTIQt*wZ?Q z`(1*t7$bW2c|m*=CMZPm&`ul)k}SR;c3aB+(jau#1u-Q%h?UQR7<4j-w}KgdY$iIM zt3k}4_5b)_tmwuLPZhuP(_sFN2;uC&5EhROA?ra1uSSM&Br=!=hl1(*Aeb=mPsc76 zKXtnh{)%qQbySGtu!Qhf{MDr%@*Iw`EDs?eKSXK-(fQ1lyuoIn3~m{UxoFW|7lu;$ z_Wwxw>bNMr@BQ5+mJND=-Gyc8Zd44;W4EBFgx%fUjfEg!`?kBg6}uA*Y?KZIgr)O$ zKELlD^P1g>J9qBP+;h%z;)#VnV}7bD_e`c zr`H1IYw@7>I-J|S4v$LK;rYvTur6E&N7wZjRJjg1`FecRu15jK1Px4Ck6)|T6YkCJfjcM|@6OX3{fBsg=N z&&m}^i0sF4JuQ;3kK=#-HRm{?*d&-;PQs;7{$HEOd>Tm*IwV0ei{pHj^0h+vzi|?7 zKT3oi-|y~?e9YWLv_G7PXZsUzoX4WuvqW@COT_Xwi8#$|v@1+RvssCd4N8Qqdm_?8 z67j(z5l)VYXf-VnSG9?#W&cR(l#OsYz7b=eZ^VvBj&tH1@oir=V&2G&*yOPhc8@ux ziescwI3{Wk=c7;bNx)c90w#qg;CXNY9A?C0sW=`V^?Chh1EkkE4s7cN7-%;z9ubGP zx8gAHMjZY- z>!RUn&`PxiQ_rl%hY=hnw;+~%nz0ypYZa{etilJ5`K%hd3h7@tuVwv8G`qb5r~0v< zpe=v%dzM4beL2boE<@M2rTpD3#fWQ5aq{pIWVcuh+pL9H)MX*S^W?6W1vnD00EgIT zW3zcKYB;X-2FJwq8$TP%Zg5PaXeO?mnE_?WbiDjI4OWk*A!z$lh}dWI_WWezUYLZq zib>eHVj}vfCLo7p`?HzjFktIAM2_ORt=-0=*OxJHZyb$QqesK=2IR2WM>ox?2p9C z!IAjt6N%e?{ZY&~L(Gr9P;uSe8F$%+s_g^!n%?;Ht~cCghGPQTZ1aM{@$Om}t}kRe zZb~n_jO~fDY_I>`z_pS__uw( z{4E4@Y=U&o1%g8Xz1@U(J7Dhs!XF8trYaQ2`-CE_O(J08{1;?fp&QDp*`Xg+M`)~drTeL0Uhl+pdqn69(-%hJce8wP}czl z&pKk?#*RqZ))9AOI-!xVj1KoZ;UL@T@`If)%B3@gTTh|RwZ*;>Iu4VJ_Qg_Vz#&-9AJz)R42U@M=dVKLc&~050^h)W8t$TZ+Q&BHG zx!Vh4ihE(x`CeG72}8!nFg)K8hN~64KFzlHl`yCnv-E8q2DA8ZltlH$z@Xkp3FwXJ zZoRQX)dwf{_Q8bg-U#o;>uY_`qF)~r`9z@ih6t{26M@%x5!k4Sz?Ogryx>|trj8N# z%(a=jE$fT?vwiX6L|>>&BDmI6UwljNivz~}Fp@E!OcCcK{O*SV`jMFWr9bjl^+&mT zf0(}Sht22u<5Y|OjQ4Ua=O_IT8r=`am28`z<@|-Ik(d@5h152YIIrlB?YH~mD%12$=^t%jgNvKMWN--DEx_z z0{KVcPEmgZ)-l#5i9!+Ai4NHqg(uu*^sz{M_m9T@Yh2IjSQIYscT+Ge3b$57Au})< zBko2)`8kR?WumcA$vE1&Xq0w{!Oee4n!`W+>!R0j1 zs(=o@|4q7H6?AU+TUuUtj~*<0L0JV)DO4(8P9qU+XM7`%&floH=?@A`e?Tjg526oB|uFub>kgH9! zDU|s!ciZAlg$btKZJ-&WEm^kMo-bvz$7Eg^S8juzMKn{Wq@?% zFrK~A2s;)iuwc0aNq>te^z$F8duWJA-*Q?TQcf4nnS+5G6pS;$YNZT&GR&~8a}^Ek z`<{+@{G?+G^Qn!)W2#$tmmKczfo- z9+N?Bwr7y#`%LN>_mf6${Yn3w%%Ue(ev)Zp7XAKRKxX@xvzxirCoC_bq;`MkZ_ppg z)-R^@%y(?azRMj8N~zJWly)aE2XQiU6`v`mThl7(i(xHUSJhME#Rj^?brl=4m^b)H z1J#8Jal9+@*Y4Fv+6n^<9xlelD@It~+=#gYjIeB*1l2<3?|dUiPg4_&Y-I)$nFao2 zGe7AQ3oLYCj#RZJ9=x)|>y;Kb)!P!%k=Dq_v%#Md8yt&JV&Y#LEZC~Vmd8ryrmFC5 zG4r{Us4+82jl*$D{OO^>tFg9FKe9!~*|zv6S94s55-$%b@r`ROx>YG*7_H=ZOKX(c zSi`QjHL9<$f7DKiQI71pi?@M%zYQLk+TcV_8z_sc(Lcl*#lx*3+h>i33D&rM(VBU5 zts$RgjgNZP*rv5c`*YSXj<&|Pw{UJmlY)~{YT>FSN{GrVC`>Wz2q zKI{weL5Rv1PpA39Ki(Io#D4Ja;D@q#erU(*l`Z{H^wkgQLOoQe=IWhN0;yZ zh{z1U)usTPoEU(k?E=`(7r=I2AjgCR!gXUHPMZcHFg6Iap266~KEY3?gRrA-5d7@} zF)T6wFRcRL_vQaMKK3a6q3p}Kc}f2G!0X?g{P9@jkLM@+F#oR~*4^;K#UFmCeBg(Y zSAN)R=#P>H?&lXjEK2voyw84EmEec`yMFi=?vJd!{&?NWA3cTs%(>=|u~+>u@R~n1 z=>;HrBj@}L3B=befw1Ti$T41lFy0@C&fK^9=RwG@3N&quYyMJebi89^uWfXlF1w-VDaOd%;*ZD;Rh9Soz{$%wm6pL258mGlEfcC>Xm> zvVWp7h;`5)97_*`zc>izBtfXw3u4(Ch(}8T@u^=RlqP`~`!n4c`c8$6u zlyQ54cAnS{<~a-YM4LXIn0MC`F*Tmd;l$Tgdg1pwPZ*{$cV3bwh6V6q=ZUma9#A`b zV5x}*#?E41zd|?UzzyQju24O2!I68;C`fXG>3@#MyUKh`4O(21YH`8Z9(%$y@K)Ku zN{{EM8ER~sp+faIB_zy)W&P6%pZ_V)M`wu~2j=IRXo1(m%sC$0411!@kUicMXEdfb zrDJ|Em>}|`F?JdlBe0t>?tYe|c$*B3?#zw6TndY!Qnuq|9H%VBkQq{(SStn6nLE)- zilHZ^2s$E#9WP~vrI__ziZerHi0mvwzLSjoureqeWQ@DYaQUDNnY(4ovmwXbPja}v zltZ#wj@f7Am^eeuabR+6G&P3)1Y`7`Y>dbKjM3JXxt-08@g>X{8nrR!q8Kx7Z;Tl3 zuT32v=g2&1Z;Uag$`~UujJZ}FpXbZlyiCxC`PKX~O|bur2|m3t!Nf3ANFJNwE5}>} zJU2xbp&5d0%`oPVDYC50K)z;h3pK-!K`c*tF<;weGi2Upe(GeF-Q&!l9BT&SlV+$P zb94wYM^1woIvOyybusfq`kDX#r8949KZd!zpP6&)BXdWln4@8{IW+bbSk5xa>#{jA zs+bqs%L47XS)gvL1tt%%!1YuMct%=6Zf}V!jU`GImiXM#5>fLlvE_&*zCW|Xms6JP z&$2{7oB|so75Eygz}YA3VEsbD!^h3Xzw(D7OmXodXIR@k-53W3p9 zh+D$-hOMlTxRm+oJ}WS4JoB%~tuW=S0^>>*FiTM2)*A(m&ai?HALF^l3Qw+Dp%=@z z4W`!ku$7PhZiQS2YpBeu@V-HT*QHj7O0vd~Pu6JJmStLdE10EO!RoCwt~}%IUe>T) zZ3SmOXVMmH%x`A{djlnIykzSzrh6*XU zDvk+MV{98W9!S(!%QE8Tp?Td9$DP=(uLR9KR#g7pA3Y%Zwb zY^+9cD;1i`lo&Hph1TCy__*vEbRo}fZatqPJ|Dzv<> zL_KrXgm&gT+epSi!t?dzA3npv0#htdH0zk;FQ~ht*2# z?xRB418%c3>neSe2#;5C?OqkdX;xuC-6kt+Q0Qz4$W ze`~IW;cpeDxvH?!TZLbyD$H5M{k*4wa=8kN98|c*_arh?BcW1-c~?|OG*IJx6W6SE zQp0$%8u2aF7&%Xkh40kNBcR5elWHvQpvI9#?pr6Gv)t53Z>vWCS@m8Ox<}q>vC_`+QPQV7SlS};fmA_lUD< z;N4RV+%9PFe5nRsu50l96d$K&j|tAaFo$13rUvUXG_e1xf#Qt@$NAW+=Jwc}r$KFn z26}wl$xj-LtI{B?QG*D+R^A>BZlBknc(Vp8ax}Qh*J!bu&yCZdyt4+kf;Gsz&aq(; zc2Li=t&=ZMK7lo(7T6?2!J&j_aK8 zSY74g!!)qeFxMcTYX=Qv{WM7LtAU*{_gSRD=7Zdq_k3O-4feOtzk8nPJf}a-GC0Y#Q?K^+kV|%C;Va&;R{E-$b^0avUShAjsJPuVoHct#!awI|p>St%bjt1I9Ct?ocMV=A*-tseug>W3fmG@ z%bZX+(g}`fP8hk>2@5_up_|+ph4#)!9PW$}PR_`5aK_VUXLM`s%zPrut$NiN+t)aw zO-mQJw0FV!AI>;w;KDUGcpEQ$L@pTQyW+go z6?z|BFp{?qk938wt1EEP6-B3AarlNSW<6z&$5*cS=r~aRVIP5z@*XO9bv5ufW`mquud^|6iNr4&_pJEWYT@HT&GL z>#jR?+OiH=>W=o0-4T%H4&h~Y3^e9AOV&F($9Q1<7!SN+-Sb8p4_q1Sf#e_Vm>~1O zkZvAmcg=(O*jT@0ee`^1=28C4|9^QPk@eEPV?B^(<$=OO9_W?mf#UVdGg;!nwKP5O zpPvUt&GLZD66S_{=m9P7Z#&N`F=cM^NA}*)OtXg zNOgt$KLD?y47pZ+pSBxfev+ytr1Y7lL+qAv@j+s+(R|wb2`+YrS#) zI`idh@n-zM8#{)0qj-}ywj5*o^_@5NGw+VOG4o4LWp3uS%)?XQjfO2gSijAO@n;{d zJ?4Y8dwq~5@Wp)xUo3O?ML`1dK9BRoy5+u*?D1v$$QM2ve9=$shwqF1Fsp|j+K%zX z$1}drYscI=L;X-*=7;Is{V|>Gs$o**;BoTjnjQXF*oEU>eVChPCEJ)6{kfj4Ki4hw zNB^zNSIwN2vpWP}SL*<1b^gdK_D8d!0hnAH01exB9bX4v0soE?v7O9(lUAvLh`7p} zl)nS>7^gc1BkMDBFtlWw zlm9PK1Y;uGu*Z4*Eh!j3RKc8&62x3>K^VP12);vt5%@9~f0hN~?ZjXV-WZIL7Qq-$ z#clKpMk(8?2YLnL>_WDI?*}8fAQ-hRIhMCuGdSch&qFc)4`_z&cY`rGD;O*7n_)~~ zGrX${MkkME$me}#!-J7S!I&Bs3?J`cJaPzz{_bEjtqI21bHQ+V9E=ZX!3a4M4F8Z| z#IjxdBrF)Ox&MP0D^NcQLa#SLXySe+jt;`#D7MM_2SGHE`HP+eq1h*n`}-Ay*mpq) zSrCMaj4Rwr4TAmMApGeZjNbV{9CH|i595Pi)-4D}b%9*RIS{5&ZpR{sITHg}7Y)RQ zv4J?oc_~{Q>lRvIi`7^(>KXMt*I79w0*x?7~DnF;*8SRG$ zo&6w?`{8S?4~C5M;rjSKaGdUgs?9!F;_HLDXWno>&hInZ*41oB7p?IIm`iHqSufmQ z=EZg8JaO|5e{=k;Ztm%U`4icOUCDC}&o}*ExpN%@cl1kf$4BP%m}%gSt2I2=&2ocX zOE&J)W|@P#R~COXKVzW1VT~5j(iQvO_yF z4g9_A@Zpjz=gHV2HQp8u92dX8PK~al#?)r4f3vRqeS!*W=d19Hxlg{c9y(p8giNAD z1Y>sp!|g8Q+aQE(f*2DUe0#)p!xC#`Enwbmkqx4HSYyU5E51i7jGCw5m`w%tIw&yh znkA-9WEY#@wQ2IOJsxuW~bdE;ogv%nYM>-Mfb=Qv6ME^_U56-Zz1Zt0@{N%zuA`A$Tr(Qwxt4_snBem3gur_ zh%8h=#qZGQqiU=RutghwxBNe|J;(3XezrT732pInry7F}s&SF+J=4=_{0+3l;c#2b zx?u~|06To`%J1ubJ1pk)JjP@$-?C$lZ95#9Z-+nZpmgSSuV2isb4G*2cC0^JX>hX0 z4ts1hn9Tb9j z*8%Pa9Wg$}31=Lg&@_mmTr0*b&#;Ix$x02ugOu`bI|>@c&W4POLvU zb4@sBbh_z`f#;nu&fgg(51l#2#u;;`JL6uiGuE_m!H+G&L$8hO9lB?I(5=Sm;1r70 z-CEq@?yUhSoo=}1!#jVimo8 z5Kr@l?xaqSj!>N6X?ni)CRzWyM9W$oC;iJ8DJSGM4LSRWrcb;;;iGPm{=!$(eQgRw zJUK`C>38Y!({%dVqL@rFs@dP7qx!!^RM77w&9u5ljeEXQ@WaRw#b`Abckd9L|w z!#o*6oH|uRF(#kra_dqOeK*J2<2+YniSTutCFdVoVBm#nnpc)eZl$m3U&$8=j4Pp4 z0TyV#$PnhyzsdS+Aw4+RNG`Sd7@8wN?BR6EdHj{!AN`_VZC}xvAr;j8wFqk(B%JqB zLldu*(e?HU$o>-}>^~uPuQfsI?G1EjS{B{ZGG^G@7H#>vdoqOQS(PbL`G1I+~kCR~~&N?Z6-O=TQblIAqY76<;Xj)qCpE@dMo! zX3+0W8Kl+ypyPXTXnbQHT{%%mL;C)rs-;DgWnVtUMhgRP=FypLR{wjv+l8aXq}*se-{n#vmNu4<%-ejkQl2T z8!-kaWnYU7?PkajvQCQ1ol<4kX3bUrReDdWQ>hvYbXSB^{5jPdZk z965n8RM`_#q%y>fck1!8mciOPK|zySB*Pni={*D z&~dIEa}L{a?zSBstg^%7&vrOF#}2=?v%KK>KVcnXDjzi%Xm5`yp7%|L*<+p&V<4<2 zt=wdf8E@?&VqD_>0WE}wSvD{(V0hXA9sX%y1TAh%w#SG=8ulSGr`ujTy!N$2j?NZ4 z`rD!0$qsVH#Qe|NB4oKOmN%(6kHQvWAO7wbBb()Bi%45roaJp2mU$K3)!4FL4SA9p z$s^QwykCt^MQRke*up(kjYA2ne?4NHkmco)LdNAf*ust5{x{YR!&n9ilI;+F)DEp# zm#Yk5{H&!03mjO^4PnfuKVw0RV_8hGN8(tSPhr^YP1-n#x=$%=lA4$t5V^vi07Va#xI|%pg79Uk#XVq z^-9iXQ{w$s8w~EE1g0=I-ykJ=SKHvyX&dZ+Y=eo6GcR3bgHMwgpN_JDPTvNfeQhw? zNr``=%K#@H+ai84j~<*Qy)qeRB4b1n~YK_K&b1W&UB-{W!OE)Lv6e zzhVljR;C!yntzWq#gO zu>H>nnO%*r|A-jdeZ(k{8$xMjz&y|TSnaRRJQsRM@2-daX(G7P2{Egc5Yfm*$JLSd-CFY1)sWY_YEmq$rZ&Y@bV8ryqDvLE6;{x;h2@mht(*p( z(9!Z=I*MAUqoad$biA;P8d6IsUtC7!(Pd<2Q%3V_%czp$GsGLqXx9iGt?8;`xl~4q zS7kJX%E%#87-(Uqm_bk%GE0; z!?`+YJpI4+%1GZuM{mM()U~{fUUkq>dJ7#DMe1njSRILDb#!BcjxGsx^zIPHWmxFw z>0TX~^1i9TI?8d-(TKY`YVlJ?>&ED4jJu9TzAq!qFddyesiVKsbX4l3qi*}lXl`a1 zO|mO2W~($UT+9fjwYQSpW{s?(Lx{l+qiZYZTo4@+s~ zuri9_{l@b0|KIjPR~_wBl#~4%9c6vjk#c@H9dY0#hwt^Tjx>{boLCP@^{b$<@5|}A zVFk^tE+@ND6}0nv1-Y{9%%5IK*Y;OX=>2l)Usg_UO3NvzZ3T^7P(clR>~)U{ddJVY zwskoj=4Y~eN(J?NUP0H~E9h9Ca=Lv%N8ekObA9OwTE41+l<&%E+U{~1V^%>@j&E}4 zT|xUhR8i0WD(Qr_g1#7))14#bv}|!D#g3|^8SN{%hI9q3H?AP3gmOAIx13xG%4u$T zB?b9a)7IhDWYxQh{FhWvS5(sBoz?VqOEt}!Tt%;cRnQu$pj~k#qTR< z3Exi`*K6)wQcmj4<@8`lCH3X=Js0vlmsZfw9hG!bUPTR4DrwWf3Oc`|ipGqoA<@uk z3Z7d<*R!g~ymd9jd)H8MdJX+MUPI^aR+HU{v(J7uL}YuX>95Q%Blsb#zcxPfZ8w=s{pT z+1A!kOTRjb?O#XT$JSG*X9EdV)zOlcwPY!%qdVGq@(ih?kMnBjkZCRLUcm8B*J>%+ zu#SeVuBVg}^`sYEM^i4;(fjgxQUujg|IPKZae6&159jla@%6jb(XBys6x6()lG@bM z-^2zQ{I-EgY#V5qvVp=A>ggTFUb&ZYAFJx9hp>U3**4Ov+y?r}_t7xRFMOH`3U^MmjvEiMDKSqO7z=TJ~Qfb+l}v=KY&!rCAddMmEyI zo{bcCzk!~_HBhQY6AchG(eo~iwDm$G-C5g2aoz&-?JB^)5dyZ!1n_;_L>3(cI4u`q z`XvF*uM}YKJpm#T1$Z=3z??AxtlK8QuXh4;_$Yvfkr3mwtdnmSU}#GLx^P=F#tCqP z=f!&`1o)&Apu4pY3k-S572tZj0PVsB7|ZSUoFTxTCjx~26|g^A!1Z2*7}in<{W<~K zxCoKoUx>^NJkRbG;^ko*&%w4D20FMzp1h@W~w+_Mql4fm_f5Fu{)2q9DnvBHe6#p~;z1USjt z9(3pJeBLGrkBx~C8(s^Tw^WEuyzICsz~VCk9O8T4*M-k%A>^EK0Y0}DGLMrGIUfWV ze~_QWRUUutSJ5RQ@)`t4|17}NonhsIQA2u){^ffOn|dr1n_p?ets1|b6Wu2MScb&1-Ko- zeI3N>NCAxb|KvCU$Fm8rdAa}}y}0e(P2|q+oryUgVm~DXH@XS1 z$W{O=KJL%)CR)tx7bZ865g+qBvxz>qG?A`H6U}JTMBPOKt}QLV>hdPaJJCe_4F#y| zBY<=$-;0F+PFYPfr@D!X^#mBk*R1j5``E~1%i|#8-&43hBlwyx=JBx$1c-Izcb$** zLFa@VA0&jqO0M}aLkRH|A-b|| zvHO=0Wq?L9tr^ePeV z*N70{q=!!?dN?>n4_>|XaA&g~WQBULy{Lzu+ju=&4;3kTXm6~K+I4!!P1J*vTpvGg z@$t!euz9A3kB{{*CqoYt-s-`%UJr3%eRPoMBPLlNH%{oI^&EX1*`yDzFnz3>p^tr! z_0brw4;jaBI;_ygwdML~SE7%LrUuYz3{bk-0B+_6*z!alFZ&t5g=^QWykY>nGr*Ap z1~~E80J~+3VQ39;+S3qs^9}I6(Ew%*2H53eh*ykn1k5$WP!mJ6uQ$LB-oL`x5c`4* z!A2KOL>pp{$PhK(3=rpKhz?RiY~cS+g$7uf$8Fab;P62M_^sn>rWoMSX#;H6GsH?5 zq93MU2`-_<~(-57{8{*V{L)2HWJ?te$$L-wCJu%8B@$e&F~V_`1b6&7hIzFFzAYrk z`(T6#krMdqlHlSI2};T(I9DUV$0`Z*U$IU;PJ$jUB(T57+Yd=_$XklpwGzOFIU~ZP znA1{<*ey~Nb9`CiYAM$jkzz4p5pFA_Xlo!tkw%8feNwDkD8-UQDN@I>eb0DBB*&n| z^KlQ@=D)`_|Ep3dWJyw#9Ft=8BPqHV%kXQ63{zUj5X{(wX{n5BddlJaNrpFLWO(^l z27?Ea^{(kVUkpi6>f60JSIaR$GhEsDMPDj8M=DNk!izi6!Y<&@HVau^u}I}b01~s(OM2OKRLE{lVj9qIp^HU86V+s;OprakNF?|lH8n+ z&6V*yF6UfW-p1I>)e~|ImK&qc!x%3ZpZUXmQD(_tG?C-$3gmc_&AxyEa@_LbecayW z%Z%4(xNYty8OmX3B8QOs`)nDH(Jnb+`p8kh_x+CXopc@xGd(^(LdJF7+2_!WWBYiF z&S&!PI3BCfGFb3f4;&}M(!DaYJ;yPCMKZK^m&1+6WkoB-iBxhpUgP^aA%p818Se4# zJ*)VctY*B4+f86Qt}I82G#Y9C0^pWlNnJ@|Qr$zUHK!>IdG3=+tg z15$=EjSSa1$uRq%6hG8b4BjQh{r{wBa+fkj!|y_X6oFm&eX@|EtD6)DCrEKNL4w?2 zyiAs$?ynK1zc6C1AtQXsGlGGc1U5nm(#nj`YO@jU{t)Bs8!^|j7NfdBjM%A0FrUwu zmBt8jcw1M-G_3}R(SD8?x5CBf+(V4N8HRAUVTc92#W3p1=L*DdHxMHs$q*lSp8DT> z*C;eZ)>J;O!T{gm46v3ly4BG|q&l^_&RK zE%adKtA`i4A`I^?LYlD%ckM-(!#b9-oe&mVg?L#g#Me9_{8(ni6brGPW!pKH^QoaM zgTD)4$@+#L>jv@J0$iIfz;G)8LX=JPRKJO$r?9@svU`|VfR;8*G`K?p(e4InIlYl0 z-!#ypyapP<`ti9Z4K#gT1ASOrPvw#IRL{q~bg!q|Q|hVtoq7^at)sXvwe&Tgb@t>s z`t`AnerW5+ctRa*SyV?k4YlMrvyL{J)=@XBKfX*rG|V))zO~kb<~lsnf$DlGWXTc@7w=p zH|-z87y{c5HpO*RonA+Ki)v{J+cEXV_4Ioq+Z=qqO16zYx2`9X?0WKEQBPsFnP11R zp2jzCpk@ymIO?>47EZ0FCv0;}KGs079oe>c-auztHPG^I^sEnvrh<@6C!-K(nEHH9z1zj>8;0nU#t_H z(?cQumOAMpcs|Q^#!XTpSk6z=!{kOiY*ZVd)f59v>ui9(?gn_k@8lkd0p9g8fbCTS zEZ@M}SMhuN!2r=L&s(H(ZMx%zxYU!s1)TxM${WJp*brUr8KTTqj6aO`c5oNtL@MJn z?+tO2Wo#+SORW{lES76c^TgQy%n)n%{C;)(-85tQJ4%c}-bQfWBgWI%q7%%9CyreaH~5Kep~MXXmZeMe}bN4nEiB-t#SO_75G}=9X1h=(>QGq0dbN zLw!x+LKCm-44vcpEi`_e5!K!)3!S>nkXr6=qp2_2lH;a+G`(FHina`)`^&n}>%@U% zczgmKbDv9F+pVH;<;k>f0dsi`+Da1bDT*3#jV$*aqT!N#^lAGUvKf4r-Vc35AG_0{V84Q$2AGPGsws+kL=bJQcqzfB`x?)vWMwZ_dACsyJgd>Zy#y4 z&l|eg@j2c3mQLnPCG;lw4_SosH-AqbNg@NTXP!sX)1Q-j;xopZK9J&FKG}cCCL5=p zR5y_4Ax$lrzJ5&Jy+2Z1#9wmZdW)`|^T@ugkYqI<$mC`^d2o)@p1qBf_f1FFDSy%yro$$HAXT0os2=92%7-}Ja$7TNlLqqcWH(A<_kNk1l+h8+~(zz7N4 zu8Ux`><^nm0EoJPN_3FN38NQ#hpo|F9*_Sxp^9OTJwZ@$)3=U;x{yE z*Lxb-_AND?dPx%xy`<~;FX-!t7j#{iN|%qnpnY4OlQtridJTI|TRXp{Hy7X1FHI_? zFMUaSmc3!_vvk_SKDe8X?@0m$wE3&C9 zuYksm_(k*5f71rNVj6v*lr|5mq^r%V=$dC04RPhUIIfmD ztY&<~r-K0RRcyB<=|jqPi-`66uB8T8c*y`7mfyu^S^pm^Mk&uBrHhSlD8mRV*{7BJ zhUXF1rS%hyFpP{aNGXBIZ6gf1&iZ_`7%nHp$b2A1ma7;Nwi|}CJ=31sQ*35ii0zHQ zg$7u_zOH1pO~$JXuwUN*QUdYaD*8UA#XV-LyMMv!B~Q#oGjU|sVTbG`jDfr#@-{?(Xb(=%e90fkYd8xo?AeXE<-* zhz;DgbKaz(68#1!VckiI+}=vuo2JCI0wo;ot8n9y3e5vl2t1<1_^~$p-dp3+1S|X& zSfQ$u6+9GH$ULDy_-xLn7_LC=00la6?8yLu0y8-d=vaSCxN{7UF2)l7@qNh(EHLPY z1)lY@#MSkd_@uJLf)y5sjk7@KqZT;*lKs^j*U~1>0wR$m*U#Z&KU;8}X3jm`!)@%a z#D?RR==9MNc1i`xy%Z>oSK!WF1-3m=a15sc8B!}`ds(4*FDrB(Y=wSnt&qie8TwnS zusFaP-g#C~F0;bvIaatQv%*?FFYAT^TZbtizwm$l%bU9t2;rQO^wtXevgIX-b0V`X zFyVv+62@C#WS|8W)SKf|9LF)OHb?pvUb>m%MwmI~_c6!3<7Vi*!3?DdW{4cZ{vU-I z`t~%#Lx~ym*`K5KGR4wgCO99#u|b{KhqLT|`8J$)(_jL`v5)_uF-CI?lff)w{Ejz9 z!&zfI^D#zNgPi?e?3d;IoheH8@ubR`Cq#~J?d3@0ch2>d3?GGZ3_Bo0pLsHL{w+n# z1u0Ik?tadkeaS9TI9f`PcU^+f@e=52Yq?wV!D zwH;W031?h_^^pHeSbs_VKOA9A2!Er)`Fk2?0Qa`6n_C&+_8@(@1?giY$05{L>0y+Y zJ~j+xeX2qa@<)0|UBkG`R6RJn)Wg&mJ$T#d;jay2GYyOdalZ3sQ$2jpWBvW12*($S z@Z*>WuXc&BoxktrEg9F07jaED5!!zfVKIN_^Gi5y_MQ;_yM)Zk!}xnsY`!R z?zCL!bd-6%;pHF(_c{I&8pVlwQryJY{yRP}A$*0uP ze46w+pBzv?y;c;EKKJ|kS-wU@KADB*(>c~D{=LYjvogLvO&*PH%B3k|@~BmpJbHjU z`e>0)d&}}D2g zSuTyr|841?b~|f(r0exIA6aR_xDIz4mAtQreI|@O&yd? zgHp0-V^Izb_vZWX&!vdB+4S;a7R~ICP09;dR9=!vznoc@(`HeNG9w8|idK67p7lJezKu&!!D# zIpp^(o0cVH(fs&KTJ>KhHB|hho(F%@mN%JnZ!2GKawe_0o=IbWW>F~X3|;$V(ei{$ zvUoT z1$gDs^tL(l?GKOLV}1s=^Qa(^Yfty*`rS#nG{-HMMsLZX>Z}~HJe5n2yX4X;haC24 zX3@a(YziyPA;HNUnz$^7ES}}im$5nYCMJhkkIbPtr?TnA#%$UVoI~5r<pd5=5`i|erJ+Ol0{#dXVKQiObT3;N%7~hXi!ErwJ^-0(ZxUMKzSyaWoMFo zPp+ALJe&T8<Kh*1zX*h{_@74cWBGHJc7E$fEIMv*}`6-d~eL20Sj;k7QHx zSK0LcNV>|fHkLMuLyJS*-JLp|sk^(o-@3cIJ9T$=r7lp4MSv&-51J4x1pUsv-;aHg zY*uDxXJ%*LBk#k*yqC+9U>TEyzuOYfl5Ig=GZCG6yc3NQu&q2E{mrc3Ur87|Eg6!x ziEv^&zfGRjrJ;#PJ4cW2UWs@#IT5p7C1RtQ^};@|hu5E3H4%Gw-M4-vV)FGwICM-_NzkrmpE;L=Uq_R1IUou0?n(I0<8SmyM*aLG6g*7A>Z{4{ zG;!X4ED1jqNmx>ljN&N1d$13e+)75dBn4Vs3bE!CMC+2F=#vcNHI5yL>~Dr-fMY?z z06o;T^mv}b{(d_J58XLF+)u&x)q1p6=rQS?9t#fXarLzxoqy<2>98I)NgM}%=`rkv z9)0fWDNoenSD+qikEWtst5kSBOohj(R5ZAniifIHSXE5Lub+C9@_0pUQ^{vb#U6_u z-RGy`ZD=Yk^S|-IdfIR4;hV%Uuc;nQ5>pVTNkOX*dNL67SbtiN?;4Jmc6!|6byez~ z0`E#Gs2rPu-!@$TAO)W|F5bA9jOsQinB6l4>%2M6`ss0$#@Ci9=uwo6 z*&LteY~(ppQ?Th!3UYk(=s8u7n)IL8*+LIh_f+)y%z81WAhVwy2M%()ZqDb0zaAwg zSU!%c0TMkL$@NI=tB21&tVb@*C+Klb#qpYT(;_|vR#x2hUMND2n!rC=PNbwk$Z0oF^AA_e_Mrr^-IWW2Y_qj}wP z^l11v1x;C3-J~h_%IC^lKAU#&o>h+0;~DGZhe?kSPN{g^jCFG>1&zAvVJXwYZ)Gad zcN3d3(b79Hes^0po)S>LPKMxJ=2qA~0F!+t%+)lJ3jv#F>zE)~hFzo%Lr zn{94ukRE|-OEJ7gHIH+R?I`PGDmz|bhOr{V{VlUbZ(r1$am@Jb1DP#c4lBZb620| z`U4Nr@sRV7o%1tr?p_9#L}cK|k__A*nt@syGcbNl1_p#=pyIF$G)PbXFX#2xjv27O znSq>^nYhO#d{QP})Xl`^iy64_AOp)=W}vx4CNlSBA(8LKXGdlty&kt)!F<`fGVmcK z1A}Zc5v?T=U67joeJM&dx+Z^DJoRWx~BR z&($Xr<*lG; z8c=7a5iQ;raO0{0y}lT*ri~GeD`aEF2qOj^HllU1k+~I&c(cifZmo@I7;3i=Mi>+ZTxnx~;e-Ku zG7WI(ZN#i85$xGRobtfCH6HV|PZo;>O zY`plGjZJbRhO!J_c>Gtai?v&g7?*3{bJd9Hw~f$^;dvSxQRe{vt7Jf7MI)4~i*b%d zd~IgLv!4dsZ(_tv*30aZ225>W#8Jm=Y^|M*X_c}OHpqxT`seJbn2pR(BjVk%@w{3# z>gMw}L$V?LmW}n7OlWI1;e8cyqvq!z_JRqCE+%}9XIbByQ0uA*edA21`pyK;IXSpo zI|onxn&87xw`f24*Y$G{O>UQ0y&TLOn1lY)b8zZu4mLf?#h+|)wT!vAN8Xq875P^) zb5VmFvm4}FSvSi=^X$MR5nZa(&tEB>)XF6?r0v639Ard#r{?G?FF&+;)YG9Ojl%}6GP zs24d!)yNrY-MfI#sC*b6<|Do|A3qcF(db(Nd<*D<)XWT5A2Y^{H$%6LzCYg!kZ`*I zPsw3&X=28=VTCw)t`O!&W?Y9EnRU(R(#i~rw;3Y50N*B=vG2Yase{d^(4`PN$#)vZ znETg7g?OqeL|J|ziuzj+(y$P%51LUq#f;(23sIlj&OBU*f*1?x{IsC#fCbHo158e{ zU?uk{b+^E4iUq^nitu6wIZW0Tgp%9W-LnYAON%hFLNOdgG2C?I`;cq&_c#+TJ)4dph(d0KRD?$#p^I%NBTBTxy^8bgrBGx_mMu&@Vq+Ky) z5gT|jz8E7Kl^`Xq7@e9GqaAUHStp9{V;Xte@?tEyT8!2x!H4`3^uAw$^Tas@3+-+Ej zZyid}p5K$)O40vuDGtvq#aVd?hH%@jeM)igQ7M+?l;W$IoTdVDrzR3p;5(vwcp1Je zDT67!6dQk*;`C{5H>ec%iP^|E@c)Hn@M=-U`AjJs$+=p#wFGwpO0dVP6rs(?q5M;d z;nI|Ql*H3=sv@vBc*5>i8%iv>O3ZJxM+#w(9-t|({mXxBt ztOQej6~mczO8|11TEdsJEctP&kvj7WLpSPev5-}$7+(PRY zVRtWLMi&cVA?7o6P9fykW;C2&LHqRI(eWH6W2{CL`u~{sA?8sO8-Las$s@@ z@(KUr0rntQFgp*SNAfW>l03ZU`55s#AKhc~vHWyCyyoTM%D#Lw^T~%><2)=olZXD~ zWi}z#as_#YCFFAcYE6Eo4f`pz6AQ@QjODmcc_YVxkvTBOn$Z4i4r+4TSn6-WsO=_9 z+hIbEUk+kQx&71})FZd_quPX-^|EnlT{d!_Wy7P?hz~L&+RV?!+m0sGb0Sx@p$QAA zljx^5;5Wzhh2ygE{!=zCOO4QY8`0It2uXwyJ*-S{weVc2CRCqoLX$2g^n8!|^ef<2?P=W}P=6{e}@4d=|;o*|>Vpgg@lPww`K&=?T{%8;3KD=)h-7 zEuO2vdJ_Vwm@q?-48@J~l4T!;n$ra$d}X=gB-Ykmche`Iir`QwuWG zjHdsX5lx=uf)-{h_-aPueP%=)H=}uw8P%6_{P|`mI~U*{7!eF2(-EWw>WgJg;sk9uXsLw&t zV}lpDf^O_X`cilhC;VQm42!9cS=P236aC8ZV|^K_zUA+k-UtA*YGlH=B1>0&$EbO|uf` zVyr~Ho7T)1L(Uv=;Of7uL?QWQ?&P{HB5y5<+_S*F z|H*#|b1IQ5I8R4xn%iIGex5w$HXiRBk89o9M%4AP5fyjZ2umLu@sx`?+(twb@7(>5 zt!VeoR`h62{F`{@WX9ndrP+!#dA8#D2ODAA%2xEBZ6{L5hjLp@%zUe@K*bsFt^NB4 zjQ)HiU{^v^z@Uy5KHZ$r;8Vxvo}Z3RUmS3E?lIq+egVFZx25?`%=+nD^OW%0w&|wd z#R_SDm&3#TOu_s8(rZ2RyZ*J@@0Y?JBZ6G8CZh_rd3M3}N8Qn4tq)AIX(>~)ABJt4 zgDrJ;WBZj|$V%7;Ny9^^Y_$ysGmfIV@d}QbyNPclWV#K2ZO?dN``YFEOC8*W-Dx?_n=NCN85}aL}g*2_b z2uLc#R`*cyU+Kg6CISD ze`WS3j(h#8n@II?6f+rP4Xn&|MEqqfzdJkU;KI5@)Td`-(>^)ye^id2Dk}%Y;ntTJNDsx}f?WcJztbSEwG{Pp zBk^;B0&iZ(u)!RG(<8$%wNfbjC7~EA4T00?VE8`_$EQpQ)>n~XcB2Svs2YqxW|?Zf4m8=yXIg# zIr|N;duqLG`V+@L>?mYjPQr`$STCc4 z$gaj%`x|>P(8EE5kx%fHxb1fG4tw;l6F;ih3C(6(aq%y4FrBUV_=Z>*zaQRcE37z9 zXr|kU4(mB~Y~}a69A9j0#I!Ru;(3;h&>gZ7OZHid)36qwIZmD2X)XG^v!;(5d6$g8 zA82Yz&oMi3aAc-c{pHqT2~`g@5%x4cBPATQCnk+-N<>Mb5Ott9lp#E;^=MK$VvCheeJ zdO;;|gxd7M#CZPo0tMnNV4L;^#_wbgg|{Sv;c#zT=82 zV#JIp!g9EZC<&uqS9uk3#;c0uiB*J||K~QVEPSaa3QO^#_aT?vUSeBIFY(O9OBgG8 ziT2&SM6j=yIGE=trVa8GITJiZnxm(<(a2Lw^`xeh8hEcW9->n%5AoxehX{Y{A-2KLJJb;k3-S;v+IcdUtfv?_%TuUdc#8aTPm!tc6dg>S zVluqM@;+W-%ug?2ThUw8cJdZOmV1kG;&RTbyy@xSE%KjxGq)76wI|d`ZJ}QOuD5t_ z&s)qn<1JQi^cIhN_+KS&Q9}H#g2aotalORla4#_+z)MsmZWnxnbzaR&bok;)9}7?6 zYxWRZl#v6J{t?6#)DN$B|7 zyue8e{^=;*ta21x$W1*H=pcrrJBWq84x+XLxi?l0;#iKo@bM(4G{{~U&yl0E-d+r$ zM(UlnJw3$igp6M*ND}tjRG2D4$t??WzKV@SXFd#*EjT)0J_3?M?+S@61O)ULKVD zxbXdYCbibHM^bOKA_tr8bMTt;=m0}DM$OB{j?YH)i!xxeIt#8rnK*Jd6RsHg;s1Igo|{O&Iq&!kF4cJ%ZaXR?9fv=sn5M>5>r2n0`OT!$);XgiT5UdO9#p?UV?^ zuXtd895#*7;jT{{<3sc@9;(CYm{@YdVv(>k7W<8{v@ni^|KeEO@`y#SEuSSXVvsmE z7Asw1p*tIc+)gq0G&P1?witY|j>Uc&abFGjM>V=M)Sx_E4Q(9_ z#`1fgL^WE)s&T2M8aGQ-km}XQZK*-(1vQ%4t6@D~jUD&YsD46)vim9|j!?t%h#H@c zsNQDfUL4Xz|>Fs7ac`(4%Oc1DG- z-PKUNS7RCHNAcIyNQ~tEr7X)OH3F4t^naj16}bl8R2n?Is=-3;PvV&YcMcgjhUy_DDhT9 z&7}&zCkLo7tAYwm%}Ug`phUGgN(}Z?Vp*;dMt%?JuE5p%3iQZS;>}t*ai7;cy_*Uz4Jrh%UdFhqQM)a#vw|8&#;Y;<3Gc-S4f=i4 zAas=m^&>T?*<6Ek-m~(y8hCwCqqkm#t7a8?aNVE_8fc3(SawK*omw^i@Sctvpg~bn zEuL^)o8cOSIBRfof*Na$YFK^MKzB!jTRF^?yMT4V`?#O=a!aqoXm=H^e^KE$%QKy2 zc{fmvV?MlxlhkNChIOS<;?g1&&K0ZhIzx?08`bE+_E)!t3g1{K39PqgD^!d}DB&HV zf_F1DrbMU^^P2bisS3_Bl^8Nn0lNnZ?B@EcWHlak)!>a(jab%`YX>D@qeAs`CHfy% zVE7dUicKo?JEX?^aAby7uF1&}{ja87WQeo3W6^621ym3~;YlaGoU#T!jp+d7;DohRJ zy*#Nz*Y`>+YN*0!_M_oz)rd5*tyJc5d#hj@tioiO3a!tn(3bQ1kkx9upQ8S+4{qo0 z<8dmCUBNcbzWC~c3c7VFnEtBJaSr?4I`)wW4Ne}>z?yxpi7o5l6z|V(-V^qPje9hh zd|rdLyoZJDwfN0@eBzM?Rc~oV}0Fb9aM5+oj+8d!T|-m_CzDcRsrYB3M>gx;Fes02VB0%6u9vy8h5gzFtack ztE?4hpC66S2Nl?MSAmpS3Y=f7fM%rvz4(3MQU%TpQNZ?x0!`U|X0y*_&QYSzJOyg! zMx*lgXpC1!WB4-#UU9wdwG#7ND{*Tb&r_nn@^(se*r3E!KP4RNDo}nq8vb1rc<8Bs z9(I~c3An3OOsV+)%EKp$oI0c$y^PQm@%b<(KTIN#r z`Kmw&+i5!+CDO{+7E_|J@ND#d?Yy;)ZOIaiK#n`V0;4fvLo{B@QDDMj1>P4#V@yOe zx^e$1_DZz!Rp9LQXgp7g#)F*-4Bo4NV@WjRKRJHX;`Q^mVf-DkPk|#x6_Bn_;Mr3J zik2zxr6?M0rzxIUaJ1UB~}4?2iMUX)tr627eti z=)09;?;t*dS7_ikMT^PSS{%KoArDi7#vvMXXWyNDPlJUz4e&yX5xcbT-NbwXy|fsw z_lOwbom?+SI; zI9G>Y&gnv?F=xW5IJB!D2j_eAc$uZcc=9WP$R&voBin$ao!UOw_@8rVhg!>ri?%7Hek2VsUgV*5&Hp9TSJ&te4_!u21A~ChPD# zg6p5e!S|C6{ggVm-i$-q#yE@)C8s1c4u+gKnD@sMi;c&YUh!~U6%X$*@hD#uPkbmI zk7~x_O?*7EJ0{QrARb}l*_57$$4HL^bhJ;vo%RW+&^Hm|$?ch(9*@N12?)+hK*q*I zJSXSr;MqjjHcCS2XL6cqC1Ff+azuJ2qT+xgG=7`^H=N*>4Xmnmp0<6NH{fFBcy zos-M3s$7o&Gsw-z)?bofF{I_r++s57q_?SZ=iRT0b7X!|M^Ayk{IgrYRu0ufwA@K zCd_vSe)zeYr%u47O zZ=X`dMoi^>@kF7*DHQ9Bj!E$7oKL=Tf zsWYgX?o3W7%OHPlCGPUQyrj@deBW#({`C=1A1lYd-T~L?JCKq4e=Yd_A?0XUk@fPs z1VtP8eopwiUl`HaPny}E>@yWX;U#OeIg#ZrUX}Ra2>JB zYv+qFgm_7t4Mm8YWE8^fIFXvEP^%{B$kEnv?=4h(+I} zXT`O#1(;%0fWYYmXmTJA*CTTAj#%}(8+n`?=HbNgT*R%)!KhdC9ibj$-nSe+znBka zvI!{7#`vgg%p)%KHJY*Ll_uge)B+G^Y7#;mUv0$HGvo>68?bJV5iXmJ_)E;|%LyY6 zrIPCqX~1T338J=2R*Z}cTpDp*_MSx zN3&3JFbnq^kYlkR6JOo3;PEsI3mnMha510;`5gTXnb?0R6OYbi;ll4sOl_Ej-Dk4! zxJDMfIcH(Cl>Z;fgpo0bc0;l-gy)?%C=2(dWnn^W7W@)2AqMgPqzp9qlz|fGOqBl0 z#L5W<=t~VaF`QhFPAqQ+jsuGf*c+aOCMj9yu%5h!b4L6kSL2Jth->7EeCbF&3G2a% zyoZ~Ndq~TSn7J$)M{KiE&(j10F}K!zb8xJfzlr@d=J-)}dNxjaXJg>j984ibd1nf} zSgdkUJR}GGZswqN^&EV7ZGzZK?;G+I-fhUiELje^(C?<{%N%k)aH~Q)lMknI<0|K?NAFKMz+M=3ym$R`!m`$Eo23 zNGr_8Ro4Q1_)vfuf1ywKAh)9WyR#3ZboML5FfPb_DZ#6APx?F{5VBLVRcJ-?t)l zhWp47m|{VVN5l&+S}@C#+Yv{s6J3bj#1MNnw7{a~F`~^FcDfK3CRs3QE62Mo7F@IC z5^F|Jzd{7uHRI7Lp0_T&Un=o96D`>O!-CtNE!cG2f{A^ILuYWzt6#)CRTk_&P=w_i zGdt_4R}3t|l;g!{ky?zJhdCx@vJa&f;&rD&G;y+E619k{x3b@P6k{BHS3D{g3tuH~3YQ!|v#pv>>6jO-b7ZLj(=Rhx$ zdBiGDDZ599Dt!;v{OTL?>2vq#%?@-g3H%)JaK+<~H{7iJZhq+I=kHg+?`0K>Z_?D^ zem6ef^m{-4s^7Gx7yRz5|K)eJXQW@<487lkeGSpAYdu8nwkMCLBHrw*gtIoaaH3NO z+$-&c`Pavh+qDCO&hLh*^&Sl9dl12^&S1c_^9as4iI_geak<7-G+1<(?^idlf5c7f zy73A-e11Zu`i7ca-($=CcUa`|9WIeS5#l7preMyCw?(0iN`hgfa$Kq)B{w}3P2R^~ ze^>Ivt7-6z?>UxUjBi9HlK)0-@<}a9XBg4t6ul-^*o(J&oW!`uV&ca-jQsrv3wl0> z?UHxs!a38gaYg8pV8p~xQdIq}g8ipN++=()hkDCZ--(+r-gD;dFC^XmipP8P80m*PG#6tm2JY^LfxAM^}dy$>w{v9Tt|-~eJWbNNQcu;a(*h? zh(cFFO_ZTT0b+JR_Z_7k?fb(QG73p#QUlAv|OizYM~ZaI>liWxzDG_hps)C{MdFG zn4=*dk)Ditj_GTtF&uR^7e5B%VSJ4|v@_8EiT$qmX!gGfMQBjJ81q|^2e7{czdx1Z z!Z<6@c%GH;*ICg|jhgJc^tQZY%e)WNFbb(@H&9LE-&Z}v(;K;5i^ciY$Hw(i!=V~G2&n+a;RI|u#HQ! zoj6VGVcUBL;v|k@t;#_xUg9Vc?@<>YNDWQ^bvkn@h(*mR3J2HZo(wo#L3of;vGM`MKI6OYkE4? zcfh~C3$8*zZIr_e7tu{YFK7N=$A|wvaS`5YUBp6-i#U|yBKDS0FSX27+)i;7W%S3p zYNW4ormG0O>?Ybr(j&USP3YUZ3m0#9ai@;E24!MC>kNTJ(DGRnxnH80gb4&f?x%`euBiAH^YOA%E#C_R}X~ zT~I}_gFYT#==)$peV6?e>YN8v6uIgO;^7MF5NlQt7A_s$If*%XwvXpdqMo;tnCa{! zHn=;9+4KwTz@<8I*|yYbCC?>(T-8aa6pq4*TJllUR@T-yh)Q!EMAjq+Q8>*(^ev!% zlkM;ob?Z&u*@=0}>_q=sc4AsHJE5e%%{XGp^T_?Mrna)ko}M@i;bAI+eZ9Jwh?Ej!MyUyM)a6!Bbx0YCx#wDO1>AIrKi&#&iyU)CECt8 z`TL1h!iwYcic{sN7gq*n6S+NBWe`uu?Qt%}h{6)MP?vSit{A=f-V)H8&s{#}H&?b` zPet-0=39`&aeLUFLj2*p!hS#@sy{Wu$CG@eeFbn?Re;rL^tLO`Lrcz!W0_O(pnV?x z_4?~Qi2i&Zb1>S6e9%htBqV2S+-MW>$hn%HoDKEUY^){jHMl`G+KnSWEZ6}55e9UN z$b$THCK?83qQ|jJIDaIU+BE}}hNdI@Xd1`rG&~}2e;4`jh4K^}KAwWX?NU(DL_JIG zB=}@g^Rp%q<*yR(Dli_^{Fp*4B~eb08AqhDM^w#z@@19f{jLBXM3L zhx>gwl3LP3*gq0EB9dJ1NQ{0e#~`xhI&*IFxl$xf?U2K}zZ_OQP zAO7Yu?7~tx<8*Rd=W{dGPKI?$Wcb=dMh`?OmiWlR-y&IoK95P=>6;fN`Vz$vcZ9~X`@(r^U3 zOYrO^44iwGqDjllD};c%`JfwZ$y^w&wz?V=Q!eDf14CripUAtCd1`NGGwinA)})V z{p!o;N6EI(T!z*c*?ykL&{QkMgJ%*%jFsRz+l6g0j~^g~;QhW(Nrr8WWoT0(f!0fc zTfBdbpGy%|RSNk!?zfqG{R9ct_LAYn9~m`_Qp`Fip`L|vt4=cXXPLj>m167%2|Am? zFnCcIrp;zOrG>+MPl_&Stb11pCb&p2c)0|tcS~?aK@QaY2uz+PLEV=u(`P9Z17vVL zD8rZnexE6Y{{$%}?vi5YEeXz@m0<1Czj*(MG4>CBnUk!MbZTs=0tP*CUR6eB8NGK^>|r^m#5{Z^IeX%BjxBZMUF4N za#;S-Kin}A%a_Sfo8Ln$a$-7>2%iy&3mjXf+DE~CX%y6rqp){3mjO{2$lo@$(J1tY z!eV+Ubn=SAhW(M~xFHfN`$uBkD#QAv^b%(?LK6Oq6!`bao1 zn=#L^wLlKHnsO}GvAiGUxIb17^*Z@~Wp!vF!x>i|BUp-fjsq3y$?&}k>uDFqjd&Rp zWz6;bQHu2kr5M3>^n>kYpi+VXK^$MwC75|!f=FvAE*@vwo5*(Yh1-3TLTAryy~#tY z!+yYfA3RHnQEhoo@}*eE`_|=v6v;4gW0fvh{;6UVtyYCL4PQY`!`#V%g!bc+O|8cWe@kQC3jUDu85GZ|8}{VIc7G50&kwim~1 zJukyk)_v87GQ4KrF3ghRFt2?L+g0@;Qsf&rF0ikNGg9nj8}G+?1?Z zv0k4^vEh#tb_>{tSa(kwacoJI;6Cf6H_LoDS&IE@Sq~Zs4sGE*bCKaOk8imtMe|is z>}J1ivtNewa_-A9ViW(b>L~lK?XT@B!^Wl@f5yr%m}8A3_W##7n&8W5xhE z9xssN#%MWau9f3>u^hbu<@mc=j?+r^hg))DG3+bs4Mq$-s z#vCR`VLs;zmO;^|_a+MW?nU9 zdc?2?FH<6N0P*AsN@Q#%kK`~h%^Sq|4=HiCr4sA!DpCGTiDUd+RIJ4Q&MKVcoNB`! z{thROZLP#A6EWly3VfWb#0awzSNbUtZmUFP;;yTC+#3A-h?uKYC~?uTTo)7#Epg_H zmlUW&e0J_oC7yGhHRyeBv1eYBEolQ`}#B~}Cw$0vrngmqK-1UVK*6qu9~g%x+A(L0-U`YQ?-N}}-K z9LLtsC@8|BQSzGi#}JJzItAQVmVWOQ_{#ZWpQq9I&^a3E#ZhS8Nr7nM%xk9dTFD*Q z!TM=PJU*J&Uz_FYyPSMy@<(LE_4Byio8@jEt$@!lash}l7dxpiB~gi~#ENfmE~^@$ zL}TL3dh%6#f|VG^IqW{pf6Zf+*f~;xnHj|3KM~)aq@t&@5vD)|$E#I0R4IIhvac9s_NH<4dO ztU2kc8b1$`ztvxhZa>tp_0r(`77ey^(O}nQ4LZ9q#uiF06ggpI$kREompl>T%~QT= zv87B4De>cJRbz1FU<_`RYH>AEi+GI|KdksJ5u!yyKP}G8*W#t47R`uVFWsxf*&=TL zn>@DW^a}EfK|6Qm+2IUex<`Xe;s4PI;<)o=DSpfy-#D&VFj_vM6KMm#uV z1hHtj4sVy}pm@XgCUY!y@f<1J;xNY$hvso{_;QH;1=AC-cLTZo2jbCB5s#nN#FmM3 z&#uDtDe)*EzFPi19uc4xpW6G|mlLpbaRMIEXJHC`5qvE41h7ej@Aw2rwF&syjGhzp zC8(gHmjE^SFS{h5Uw8u2t0dyj*#sQo|BZ4J@mESu0c!DYXcMuIJ`gp760!7V5<2Wo zMu9)|@J&+Cksb&YH}Su&NtjHn{fqJ>)ccVHw?j$r9z}e1WfFDM$>>duyxck&KZn!% z;z1IY(F4KrP73xUP-kC<`s=28Vo)il+u&aDg!z$b;e^(}go_f19pmh>s1N65Su ze3zx(yqsG5QT0=?khD0n6(&L*;DtT0QlRXmN2XsY zJ;3!yr!R@-D18Ik5{IrypAmYZ91iAnujcyt)Nb=w ziT|WQSuq`pd#53+C>76Fr^84*J+W6RcJ59?I)DG%l!1M*8Hj6@iFiW>a))Okq9hHS z`=_BsK{~GV$V98^{U3|*0qA2TwbdY6GaeKT;zn1N&b9{4OBcgxe!Bai3Z zmyU|x((#6|-5BzG_f^WIrX?K?#O{5nWnk3OOjNp&N&SB&`B#}3)*=gawsRrwUZ1&} zzEb1;&6tI)GqbSvqXBg1fMu`?ME z_Q8Of&!}alUakc-*Y#5jh~qXftBt6OZ2FgE)9>C0r<`o0UCqWAO*ZdkHmr-X5os~O zo>~p7XC|zwWx|p_*=XC}gmpk9<|G3P7HqL<)UxJJQ!Z*;pm}!r2FS1h&ttE1-ZD)ber$n5=OQFOEaV*bgYTX< za^JR3r~5iinj5gZLwLZ*%?ASZRC(GxVYE}g<`ZKAhDW^cUHh}WpVf#g-;f$D{eD?3 z_N%UV=+_3H{Osc&`3*@<^xJM-A4eP1N6J@QD1AcxuGlF2!v3j){MfEI=iV8Sbvxqj z-5H2_zYTHCHo-Y|J-lxoLSXX?xTm^-uA3g9Z{wTT(%=rBZF-O0`LEIJ+#}?!e}K*{ z-lBNxA1t*AqK5lD8a955t&;-jO%sUI$3Gz;=QlOP(I|6fT(1qEt0U>Rc!u*N@?N7O z6A&>l1H(#~7vr4~-N~uh*q&S!-s6%@*^nJzTMRc7*G)sn*EoFmhx{92LL)1sV>taM zMr)`mg9K~JKI7D-2w1r%;p%DXN)>UayX^-$?D&D_xBfE!7JZF6^L&AS(Iqqpi$;D# zkE{UfdsskUdTa41BNqpMP{)2I44H8kv0>FWoF`Y}_GcH-ri>g17i-btJ@H!i3@km8 zhQ>P#=(!;STW`zJlVg1}^S0k(4!Q};3lQ5R2F)GIVSHyVR%SX2?Q3^&y39!|o^SV` zmvF=0C3xwVgN6^7zh!~7@TX_m{-5?D){*%O4wgc}u_(-BM4W{yJ{FPl)BRgKjM7+K;k;B@$hm2EdiT&T$(Qdg zhhK$a9b-1m{!&DThhbLKA1IpyWA2XMFnj&L#Wvqjaqkbr#C${ZZ{IP0jGK=5FhEEC(+=nV02s z0sc`F$39Vn*Tkcjr4=JhPi~2OF)~*c1Jv2>%4Ob=)+PA%sR$k8h{O941OHuwK@TjL zR?`B{^Jcu?R*0>a=s9pMA3Lk$V>S6q8E(1MWiwCC=3HEykP8XNzJJslXA`n9_i;8p z*UrZM^VChhrJuxJBjbby^f^nv3;JiY?w5t2f=molWMa;{Ow<~cg*nHwko2BD8d?MT zUNj(?@${V?O_)S3m4dlv%3qL+kY$ELW#Vh~iqP;iy##{jZG5~0gPWD2?vFCg^_X|V z$yzL>52ZD86^u(_u8HB+q9rx4E7PcLrEb-Gv7K0O*-jjtL4U~B4r0YZ2eGc2qi8?M zQJl4C6z43O z(eM0KPiLW~uljK6nS$mpN7EI0e*bn6DfBY0`hq^+`zwl{FDr;j@lN9Bc6#s*cM|J} z{T2EHP65<3jdl<( z>D&K?`2uL5%P1AmqcCD{kxmeS@Ruxt&X|%~N$9MfO1EgnI2L zn#mo7!qG|Ob$1fd_4LVSot&o!`07+Aak8A)Ql$!FZI24#@UaSF^%HvhMpO_>PgD?^ zOycDM6-2^ZVpQiVh;?VE{iFB&F?tWS{o^G5NO(N@3qi5K(%?ReEmSUb^^_>7~_ zcXkxdDmjW&nS)6DP2W#`exNQZ;DfzTJ*WR?xIHy^_F~<6dr^HIJwT~_?8bY$Ap$fGTRSz>q z3N@|X-S~E?c@#oV-ps9I z)NPR)_~ujr-dHooVUq%Mb}m4V<9wdiq>sWa>bI8UVJZDij@QY>m!7$ZsFaJNk{o<~ zn}dft=~ZBF!j_0^!65&RuzdQUXfVvNe)vqv8}su{H_xTU&iE~FwWeZ zar||RT^>!5p~Wy6s-;Si#oy-|$+7D*V}{*jXyhP+6aNdEBEyzG#H@PC;Q4}a-WgJq zuKqV>&hLj9%a4`d=VoG5b0lb)7=c?KiNkQY+ByOq`!astGXhf$;aGSq0`V&%VDC-L zWoJ0G^I_=tCyahG;W&OS46!Z4@O)?(w2i~DZ3i{lSHhqi8HQD

    UZRN}q~Q_#F*J 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


    !J3i`w{@Ztm`Sk&MXFnqD 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

    >A9^T*L5_*Pv{24MT@s!?Cif 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%0Dec>zPkld|Zf{ zb_vnf143jKBSi0h2$A&+VX|OfdeKY5l(<8f4uuHQfmgy5_*0lFx!)CM=2GYfVM@^z zp*agh=;bQztF%OD{%R4rUm!vrc_MUkzX+v=@SGxFgpB`+kg3uT+TSWdGlNCQ=B@~> z5FA3pWA~1YA{4=W`sywb5^olvdzB(I<)a8``iYQ;j0hcT6DGmYA~b4>2qhSZ(8@t! z%Hz*+K1G<0Ulyj)ox=3bQkY&W5vGO+VG=tpObOeC>FXCEip~c++i*d8GhdKQ-U^U~w*c)d6rky zpg%JN$XZK)d@}zb@A*Ht4G|!z;(v&``44kf{ew%(AnS7mG4bmlhAkb$H-SM2bG$IE z_b>Jp|Hbehe_{UgFHU##<5v40R93LYUaTM2zy0A**&j?D{|7QZeq4Q}pVamei}bjE&#qw5zO==+S`7oV~98(+t# zKSQkh6Gpp!!q@tbIAHRTSz{mY)#?L}Ssyq*{2m7nv3^MYJ<9mrh_!o%<#@;XueWF^ zdyA0dw_JPj7I8P*4pouo ztWj%&9P7TOE#<9z8-hbyQTet77tXg}_p%mv&1u1Q;T9-oG-KzEX8clZhTqd?=veg( zUg=HPy{-v?&Q0*y-voK%CYJIE zkrZ5yddGUma{mW=W&*!^f>Q=h@GSZ<+@?RqB4{Z1 z?o);DPF2`DstWy`l}O62gyPyt^iQrt`(On|v{gVfwgLx_Rv^;6g1NfosQpq7wa4Yy zd7&JewwB|TO*#G;mUGQ|8Om;!q3LKD!giNo!O}AJ{U~FGY#9dDl;N{s8Q0mBF>9|3 z69!8$j@vBe#JQ%I;>F=oB;7BC-k(zRB=Y0jQdqw)g#`a?{Lxal1(xFay;97MFNN_6 zetkFZ%kQ}yS_+qhQfPXWLMN^i_j*e4mfMp4Qsi)(s8j|cl`>=vFN4sgGL-w4!JW5B zm&$M}qKy62%W%bjJ(_gN5j(RSKAX$Y>&!Z+qH>&QF2|F%$M7C}j1KiD z2;BVy-F$tNh16r>&w6OgYd~gX1CFUZ#cl7Wxc7{&ExSg{PilmuS`!X$ZbEir6H=m| zA!^_m=hmAc*TeIffEHvfXvNRER;+MrgY(GeFm`{AlP%AYANv9iG+!dC=q3IfZbysE zD@cERg>xPq5ct)BIOem!C0X_&204`i_4m`Y`nGPguP9i8K3tvd3m0KKJ}U-P0dX|MLSwr2F9brVlUG zf1!NpZ`?2X4f~US*oUwmOOEi^7u^rj&;2;WSEdNk^AcV= zUKFBhJZ4S5CQRFHd2IP5LWg38(7XUq^70U)4`+DY7b`(8o=8$&f)tJGlOi(}X*#Jd zO)EZ1(YJ?EH1(zwrLLEvTLwJu)s~{~a#D0PPm&@^C28Gio@3|oYu!?0&$*n_qlc2J zhz#ZUbG?&{EN%Tymab>Yl6to+Y4yp{(I#2?8ZAp{_hhN9L6%NP$k8fAIeN5~x8-t_ z+b>5M`{ikvmI7Tou0VF56zJe(MQSruqP_Q&$Zqv8s`$utQ#s0Hlr)@XgsRX~?-4Y5 z^GM47I+AY1j3Ucjqp5zz7&3S^hFbTk(pUEQeKlz;Ij>hI9Y+oNGDMReywRlQN-a{Z z)Fy=z9g>RHr4wuQsD7S4omMlTE>S}|p>9N5wv3~->x{{CqX~JsnbJpRGg>`oJpI@* zfjWF9(yh=*B%5eXZ%<98A1+g9`sS%*ym}giY?@BOe(XV1Z9!Khh)#47EzD*=u7R19 zJZUz$9-BkGIde&MqBZ?KGmpMS&Zj-!7tob)He@|$L-vaolaSd`5)HDYb>7S9=|npc z`(aNnXFHO9%nCZQbQQ&Rt)@{c*RTiETH0>6o<99{Chxf}JU`e-D>T_}D`5*&Z{0?J zHo7t+aR*&JvXe&K+Ra{Ednr|ZA8iaiKn6bU6f1Oy-X1(m3D=KOsnT&82s%N>1WwVy zj#Fflb(%z*JxJuRCwZ%Rk-CI8oqp?0_8)yHVaypiFMF0`Kc6M(7w7mIJ5RQwE|7u$ z1rojHM|bM|X^?%gEDZuF{c#{IydOk6js;W1)DSA}3n90NP|8^sM$

  • CCfmx^RH= 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%0D#8VYWK` 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νCc^aI?w?f@&q)^SMT0iMe~z{X7uveCqY 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%0DezF%Q_ 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

    T%*E0`g1N0^NdVksgCr52Y3}0_Xc5UM> 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