In [ ]:
import tensorflow as tf
import numpy
import scipy.io
from tensorflow.python.client import timeline
import time
import glob
# PREPARO FUNZIONI
#TODO STUDIARE FATTIBILITÀ DI USARE TUTTO A 32BYTES
# calcola la correzione doppler per ogni punto del cielo
def doppcorr(i):
quadratoNP = quadrato[i]
indicesOpt = indices-1
inizi = indicesOpt[:-1]
fini = indicesOpt[1:]
velocitas = numpy.zeros((3,frequenze.size))
for i in numpy.arange(0,nTempi-1):
velocitas[:,inizi[i]:fini[i]+1] = veloc[:,i:i+1]
velPerPosIndex = numpy.dot(quadratoNP,velocitas)
divisoreIndex = 1+velPerPosIndex
freqCorr = frequenze / divisoreIndex
##print(freqCorr)
#mi ricavo l'header per le frequenze
freqMin = numpy.amin(freqCorr)
#freqMax = tf.reduce_max(freqCorr)
freqIniz = freqMin- stepFreq/2 - stepFreqRaffinato
freqFinal = freqCorr-freqIniz
freqFinal = (freqFinal/stepFreqRaffinato)-round(enhancement/2+0.001)
#freqs = tf.concat([[freqIniz], freqCorr], 0)
return freqIniz, freqCorr, freqFinal#, nstepFrequenze
def noncorr():
freqMin = numpy.amin(frequenze)
freqIniz = freqMin - stepFreq/2 -stepFreqRaffinato
freqNonCor = (frequenze -freqIniz)/stepFreqRaffinato-round(enhancement/2+0.001)
freqNonCor = tf.constant(freqNonCor, dtype = tf.float64)
return freqNonCor
# calcola la hough per ogni punto del cielo (per ogni spindown)
def inDaHough(i, freqHM):
def houghizza(stepIesimo):
sdTimed = tf.multiply(spindownsTF[stepIesimo], tempiHM, name = "Tdotpert")
#sdTimed = tf.cast(sdTimed, dtype=tf.float32)
appoggio = tf.round(freqHM-sdTimed+securbelt/2, name = "appoggioperindici")
appoggio = tf.cast(appoggio, dtype=tf.int32)
#pesi32 = tf.cast(pesiHM, dtype = tf.float32)
valorisx = tf.unsorted_segment_sum(pesiHM, appoggio, nColumns)
valorisx = tf.cast(valorisx, dtype=tf.float32)
return valorisx
houghDiff = tf.map_fn(houghizza, tf.range(0, nRows), dtype=tf.float32, parallel_iterations=8)
def sliceInt():
#faccio integrazione finale (vecchia versione senza conv)
semiLarghezza = tf.round(enhancement/2+0.001)
semiLarghezza = tf.cast(semiLarghezza, tf.int64)
houghInt = houghDiff[:,enhancement:nColumns]-houghDiff[:,0:nColumns - enhancement]
houghInt = tf.concat([houghDiff[:,0:enhancement],houghInt],1)
return houghInt
hough = sliceInt()
houghinal = tf.cumsum(hough, axis = 1)
return houghinal
def manchurian_candidates(numCand, freqIniz, image, coord):
candidati = numpy.zeros((numCand*2,9))
minDistance = enhancement*4
primaFreq = freqIniz-(securbelt/2)*stepFreqRaffinato
freqIniziale = struttura['basic_info'][0,0]['frin'][0,0][0,0]
freqFinale = struttura['basic_info'][0,0]['frfi'][0,0][0,0]
#QUI ANALOGO FUNZIONE CUT GD2
#%time indexInizialewh = numpy.where(freqniu>freqIniziale)[0][0]
#%time indexFinalewh = numpy.where(freqniu>freqFinale)[0][0]
indexIniziale = ((freqIniziale-primaFreq)/stepFreqRaffinato).astype(numpy.int64)
indexFinale = ((freqFinale-primaFreq)/stepFreqRaffinato+1).astype(numpy.int64)
imageCand = image[:,indexIniziale:indexFinale].astype(numpy.int64)
#imageCand = numpy.flip(imageCand,0)
size = numpy.shape(imageCand)[1]
freqniu = numpy.arange(0,size)*stepFreqRaffinato+freqIniziale
maxPerColumn = numpy.amax(imageCand, axis = 0)
rigaMax = numpy.argmax(imageCand, axis = 0)
#######################
stepFrequenzaNiu = maxPerColumn.size/numCand
indiciFreq = numpy.arange(0,maxPerColumn.size,stepFrequenzaNiu)
indiciFreq = numpy.append(indiciFreq, maxPerColumn.size)
indiciFreq = numpy.round(indiciFreq).astype(numpy.int64)
#print(indiciFreq)
def statistics(ndArray):
mediana = numpy.median(ndArray)
sigmana = numpy.median(numpy.absolute(ndArray-mediana))/0.6745
return mediana, sigmana
stats = statistics(imageCand)
medianaTot = stats[0]
sigmanaTot = stats[1]
##print(medianaTot, sigmanaTot)
iniziali = numpy.concatenate(([indiciFreq[0]],indiciFreq[0:numCand-2],[indiciFreq[indiciFreq.size-3]]),0)
finali = numpy.concatenate(([indiciFreq[2]],indiciFreq[3:numCand+1],[indiciFreq[indiciFreq.size-1]]),0)
def statsPerCand(i):
stat = statistics(maxPerColumn[iniziali[i]:finali[i]])#[0]
return stat
statPerCand = numpy.array(list(map(statsPerCand, numpy.arange(numCand))))
#statPerCand = numpy.zeros((numCand,2))
#for i in numpy.arange(numCand):
#statPerCand[i] = statsPerCand(i)
##print(statPerCand)
medianaPerCand = statPerCand[:,0]
sigmanaPerCand = statPerCand[:,1]
#percorsoRob = ("/home/protoss/Documenti/TESI/HWITest/mioRob%d.mat" % inputFreq)
#scipy.io.savemat(percorsoRob,{"stat": statPerCand,
#"maxs": maxPerColumn,
#"imax": rigaMax,
#"imageCand": imageCand})
filtro = numpy.where(medianaPerCand > 0)[0]
counter = -1
for i in filtro:
inizio = indiciFreq[i]
fine = indiciFreq[i+1]
porzioneMaxPerColumn = maxPerColumn[inizio:fine]
localMax = numpy.amax(porzioneMaxPerColumn)
localInd = numpy.argmax(porzioneMaxPerColumn)
if localMax > medianaPerCand[i] and localMax > medianaTot/2:
counter = counter + 1
index = indiciFreq[i] + localInd
riga = rigaMax[index]
candidati[counter,0] = freqniu[index]
candidati[counter,1] = coord[0]
candidati[counter,2] = coord[1]
candidati[counter,3] = spindowns[riga]
candidati[counter,4] = localMax
candidati[counter,5] = (localMax-medianaPerCand[i])/sigmanaPerCand[i]
candidati[counter,6] = coord[2]/2
candidati[counter,7] = numpy.abs(coord[3]-coord[4])/4
candidati[counter,8] = 1
limite1 = numpy.amax([localInd-minDistance,0]).astype(numpy.int64)
limite2 = numpy.amin([localInd+minDistance+1,porzioneMaxPerColumn.size]).astype(numpy.int64)
porzioneMaxPerColumn[limite1:limite2] = 0
secondLocMax = numpy.amax(porzioneMaxPerColumn)
secondLocInd = numpy.argmax(porzioneMaxPerColumn)
if numpy.absolute(secondLocInd-localInd) > 2 * minDistance and secondLocMax > medianaPerCand[i]:
counter = counter + 1
index = indiciFreq[i] + secondLocInd
riga = rigaMax[index]
candidati[counter,0] = freqniu[index]
candidati[counter,1] = coord[0]
candidati[counter,2] = coord[1]
candidati[counter,3] = spindowns[riga]
candidati[counter,4] = secondLocMax
candidati[counter,5] = (secondLocMax-medianaPerCand[i])/sigmanaPerCand[i]
candidati[counter,6] = coord[2]/2
candidati[counter,7] = numpy.abs(coord[3]-coord[4])/4
candidati[counter,8] = 2
candidati[3,:]=numpy.round(candidati[3,:] / stepSpindown) * stepSpindown
return candidati
#config = tf.ConfigProto()
#config.gpu_options.allow_growth=True
#sessione = tf.Session(config=config)
#sessione = tf.Session()
# CARICO DATI
tFft = 8192
#tFft = 4096
tObs = 9 #mesi
tObs = tObs*30*24*60*60
cands = 100
primaFreq = 108
percorsoQuad = ("quadHWI%d.mat" % primaFreq)
percorsoPatch = ("quadHWI%dEclNew.mat" % primaFreq)
#carico file per dopp corr
quadrato = scipy.io.loadmat(percorsoQuad)['quad'].astype(numpy.float64)
nPunti = quadrato.shape[0]
print(nPunti)
patch = scipy.io.loadmat(percorsoPatch)['quadratoEclNew'].astype(numpy.float64)
percorsoFile = 'dati/H/in_O2LH_01_0108_.mat'
#nPunti = 10
#nFiles = 2
allCands = numpy.zeros((1,nPunti,cands*2,9))
print(patch.shape, quadrato.shape)
print("\n\n\n")
struttura = scipy.io.loadmat(percorsoFile)['job_pack_0']
tempi = struttura['peaks'][0,0][0]#.astype(numpy.float32)
frequenze = struttura['peaks'][0,0][1]#.astype(numpy.float32)
pesi = (struttura['peaks'][0,0][4]+1)#.astype(numpy.float32)
#nb: picchi ha 0-tempi
# 1-frequenze
# 2-pesi
#headers vari
securbelt = 4000
#securbelt = 4000*3
#frequenze
stepFreq = 1/tFft
enhancement = 10
stepFreqRaffinato = stepFreq/enhancement
#tempi
#epoca definita come mediana di tempi di tutto il run #WARNING da ridefinire con durata dati che prendo
epoca = (57722+57990)/2
#spindowns
spindownMin = -1e-9
spindownMax = 1e-10
#spindownMin = -2e-9
#spindownMax = 1e-9
stepSpindown = stepFreq/tObs
nstepSpindown = numpy.round((spindownMax-spindownMin)/stepSpindown).astype(numpy.int64)
spindowns = numpy.arange(0, nstepSpindown)
spindowns = numpy.multiply(spindowns,stepSpindown)
spindowns = numpy.add(spindowns, spindownMin)
#per doppler corr
veloc = struttura['basic_info'][0,0]['velpos'][0,0][0:3,:].astype(numpy.float64)
nTempi = struttura['basic_info'][0,0]['ntim'][0,0][0,0]
primoTempo = struttura['basic_info'][0,0]['tim0'][0,0][0,0]
indices = struttura['basic_info'][0,0]['index'][0,0][0]
#mettere un for
#start = time.time()
#for punto in numpy.arange(0,nPunti):
sessione = tf.Session()
freqInCorr,freqCorr, freqPerHough = doppcorr(punto)
nstepsFreq = numpy.ceil(securbelt+(numpy.amax(freqCorr)-numpy.amin(freqCorr) + stepFreq + 2*stepFreqRaffinato)/stepFreqRaffinato)
##print(nstepsFreq)
nColumns = tf.cast(nstepsFreq, dtype=tf.int32)
#da qui si usa tensorflow
#definisco tutte le costanti necessarie
tempiTF = tf.constant(tempi,dtype=tf.float64)
pesiTF = tf.constant(pesi,dtype=tf.float32)
spindownsTF = tf.constant(spindowns, dtype=tf.float64)
tempiHM = tempiTF-epoca
tempiHM = ((tempiHM)*3600*24/stepFreqRaffinato)
tempiHM = tf.cast(tempiHM, tf.float64)
pesiHM = tf.reshape(pesiTF,(1,tf.size(pesiTF)))
pesiHM = pesiHM[0]
nRows = tf.constant(nstepSpindown, dtype=tf.int64)
#freqTF = noncorr()
freqTF = tf.constant(freqPerHough, dtype = tf.float64)
houghmap = inDaHough(punto,freqTF)
hough = sessione.run(houghmap)
#allCands[ifile,punto] = manchurian_candidates(cands, freqInCorr, hough, patch[punto])
#tf.reset_default_graph()
#sessione.close()
#numCands = numpy.
#stop = time.time()
numAllCands = numpy.int64(allCands.size/9)
allCands = allCands.reshape(numAllCands,9)
nonzeri = numpy.nonzero(allCands[:,0])
finallCands = allCands[nonzeri]
finallCands = numpy.transpose(finallCands)
percorsoOut = ('candHWI%d.mat' % primaFreq)
#percorsoOut = 'provacand'
scipy.io.savemat(percorsoOut,{'cand' : finallCands})