123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- from regmaxsn.core.SWCTransforms import SWCRotate, ArgGenIterator, objFun
- import multiprocessing as mp
- import numpy as np
- from itertools import product
- import json
- from matplotlib import pyplot as plt
- import seaborn as sns
- plt.ion()
- import os
- from regmaxsn.core.matplotlibRCParams import mplPars
- sns.set(rc=mplPars)
- # ----------------------------------------------------------------------------------------------------------------------
- homeFolder = "/home/aj"
- dirPath = os.path.join(homeFolder,'DataAndResults/morphology/OriginalData/borstHSN2D/')
- #
- expNames = [
- 'HSN-fluoro01.CNG2D',
- 'HSN-fluoro01.CNG2DRandRot',
- # 'HSN-fluoro01.CNG2DRandRot1',
- # 'HSN-fluoro01.CNG2DRandRot2',
- # 'HSN-fluoro01.CNG2DRandRot3',
- # 'HSN-fluoro01.CNG2DRandRot4',
- # 'HSN-fluoro01.CNG2DRandRot5',
- # 'HSN-fluoro01.CNGNoiseStd42DRandRot',
- # 'HSN-fluoro01.CNGNoiseStd42DRandRot1',
- # 'HSN-fluoro01.CNGNoiseStd42DRandRot2',
- # 'HSN-fluoro01.CNGNoiseStd42DRandRot3',
- # 'HSN-fluoro01.CNGNoiseStd42DRandRot4',
- # 'HSN-fluoro01.CNGNoiseStd42DRandRot5',
- # 'HSN-fluoro02.CNG2D',
- # 'HSN-fluoro03.CNG',
- # 'HSN-fluoro04.CNG',
- # 'HSN-fluoro05.CNG2D',
- # 'HSN-fluoro06.CNG',
- # 'HSN-fluoro07.CNG',
- # 'HSN-fluoro08.CNG',
- # 'HSN-fluoro09.CNG',
- # 'HSN-fluoro10.CNG',
- ]
- refInd = 0
- resDir = os.path.join(homeFolder,'DataAndResults/morphology/directPixelBased/rotProfile2D/')
- if not os.path.isdir(resDir):
- os.mkdir(resDir)
- # ----------------------------------------------------------------------------------------------------------------------
- # gridSizes = [40.0, 20.0, 10.0]
- gridSizes = [40.0]
- # gridSizes = [20.0]
- # gridSizes = [10.0]
- bounds = [[0, 0], [0, 0], [-np.pi / 6, np.pi / 6]]
- # bounds = [[0, 0], [-np.pi / 3, np.pi / 3], [-np.pi / 3, np.pi / 3]]
- rotMinRes = np.deg2rad(1).round(4)
- nCPU = 7
- refSWC = os.path.join(dirPath, expNames[refInd] + '.swc')
- SWC2Align = os.path.join(dirPath, expNames[1] + '.swc')
- SWCRotCenter = np.loadtxt(SWC2Align)[:, 2:5].mean(axis=0)
- data = np.loadtxt(SWC2Align)[:, 2:5] - SWCRotCenter
- maxDist = np.linalg.norm(data, axis=1).max()
- pool = mp.Pool(processes=nCPU)
- with sns.axes_style('whitegrid'):
- # fig, ax = plt.subplots(nrows=3, ncols=1, figsize=(10, 8))
- fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(7, 5.6))
- with open(os.path.join(dirPath, expNames[1] + '.json')) as fle:
- pars = json.load(fle)
- actualSol = -np.rad2deg(pars['angles'][2])
- SWCDatas = [SWCRotate(refSWC, SWC2Align, x) for x in gridSizes]
- noChangeVals = [objFun(([0, 0, 0], data)) for data in SWCDatas]
- stepSizes = [2 * x / maxDist for x in gridSizes]
- for gridInd, gridSize in enumerate(gridSizes):
- # print('Gridsize:' + str(gridSize))
- stepSize = stepSizes[gridInd]
- # print('Stepsize: ' + str(np.rad2deg(stepSize)))
- bounds = np.array(bounds)
- boundsRoundedUp = np.sign(bounds) * np.ceil(np.abs(bounds) / stepSize) * stepSize
- possiblePts1D = [np.round(np.arange(x[0], x[1] + 0.9 * stepSize, stepSize), 3).tolist() for x in boundsRoundedUp]
- possiblePts3D = np.round(list(product(*possiblePts1D)), 3).tolist()
- argGen = ArgGenIterator(possiblePts3D, SWCDatas[gridInd])
- funcVals = pool.map(objFun, argGen)
- outFile = os.path.join(resDir, expNames[refInd] + expNames[1] + str(int(gridSize)) + 'rot.json')
- with open(outFile, 'w') as fle:
- json.dump({'possiblePoints3D': possiblePts3D, 'funcVals': funcVals}, fle)
- with sns.axes_style('whitegrid'):
- # ax1 = ax[gridInd]
- ax1 = ax
- ax1.plot(np.rad2deg(possiblePts1D[2]), funcVals, 'b-o', lw=6, ms=12)
- ybounds = (0.1 * np.floor(min(funcVals)*10), 0.1 * np.ceil(max(funcVals)*10))
- ax1.set_ylim(ybounds)
- ax1.plot([actualSol] * 2, ybounds, 'r-', lw=6)
- ax1.set_ylabel(r'Dissimilarity')
- # ax1.set_title(r'GridSize=' + str(int(gridSize)) + '$\mu$m')
- if not gridInd:
- bestSol = possiblePts3D[np.argmin(funcVals)]
- else:
- minimum = min(funcVals)
- if minimum > noChangeVals[gridInd]:
- bestSol = [0, 0, 0]
- else:
- # if True:
- minimzers = [y for x, y in enumerate(possiblePts3D) if funcVals[x] == minimum]
- prevVals = [objFun((x, SWCDatas[gridInd - 1])) for x in minimzers]
- bestSol = minimzers[np.argmin(prevVals)]
- bestVal = objFun((bestSol, SWCDatas[gridInd]))
- print(bestSol)
- ax1.set_xlabel(r'rotation about Z in degrees')
- fig.tight_layout()
- fig.canvas.draw()
|