##// END OF EJS Templates
Cambio en la lectura de archivos, se incluyó detección de cambio de experimento
Cambio en la lectura de archivos, se incluyó detección de cambio de experimento

File last commit:

r1338:317db0cd9a09
r1373:fa4c334951aa
Show More
jroIO_simulator.py
519 lines | 24.2 KiB | text/x-python | PythonLexer
import numpy,math,random,time
#---------------1 Heredamos JRODatareader
from schainpy.model.io.jroIO_base import *
#---------------2 Heredamos las propiedades de ProcessingUnit
from schainpy.model.proc.jroproc_base import ProcessingUnit,Operation,MPDecorator
#---------------3 Importaremos las clases BascicHeader, SystemHeader, RadarControlHeader, ProcessingHeader
from schainpy.model.data.jroheaderIO import PROCFLAG, BasicHeader,SystemHeader,RadarControllerHeader, ProcessingHeader
#---------------4 Importaremos el objeto Voltge
from schainpy.model.data.jrodata import Voltage
class SimulatorReader(JRODataReader, ProcessingUnit):
incIntFactor = 1
nFFTPoints = 0
FixPP_IncInt = 1
FixRCP_IPP = 1000
FixPP_CohInt = 1
Tau_0 = 250
AcqH0_0 = 70
H0 = AcqH0_0
AcqDH_0 = 1.25
DH0 = AcqDH_0
Bauds = 32
BaudWidth = None
FixRCP_TXA = 40
FixRCP_TXB = 70
fAngle = 2.0*math.pi*(1/16)
DC_level = 500
stdev = 8
Num_Codes = 2
#code0 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1])
#code1 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0])
#Dyn_snCode = numpy.array([Num_Codes,Bauds])
Dyn_snCode = None
Samples = 200
channels = 2
pulses = None
Reference = None
pulse_size = None
prof_gen = None
Fdoppler = 100
Hdoppler = 36
Adoppler = 300
frequency = 9345
nTotalReadFiles = 1000
def __init__(self):
"""
Inicializador de la clases SimulatorReader para
generar datos de voltage simulados.
Input:
dataOut: Objeto de la clase Voltage.
Este Objeto sera utilizado apra almacenar
un perfil de datos cada vez qe se haga
un requerimiento (getData)
"""
ProcessingUnit.__init__(self)
print(" [ START ] init - Metodo Simulator Reader")
self.isConfig = False
self.basicHeaderObj = BasicHeader(LOCALTIME)
self.systemHeaderObj = SystemHeader()
self.radarControllerHeaderObj = RadarControllerHeader()
self.processingHeaderObj = ProcessingHeader()
self.profileIndex = 2**32-1
self.dataOut = Voltage()
#code0 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,1])
code0 = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,1,1,1,-1,1,1,-1,1,-1,-1,-1,1,1,1,-1,1])
#code1 = numpy.array([1,1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,1,1,0,0,0,1,0])
code1 = numpy.array([1,1,1,-1,1,1,-1,1,1,1,1,-1,-1,-1,1,-1,-1,-1,-1,1,-1,-1,1,-1,1,1,1,-1,-1,-1,1,-1])
#self.Dyn_snCode = numpy.array([code0,code1])
self.Dyn_snCode = None
def set_kwargs(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
def __hasNotDataInBuffer(self):
if self.profileIndex >= self.processingHeaderObj.profilesPerBlock* self.nTxs:
if self.nReadBlocks>0:
tmp = self.dataOut.utctime
tmp_utc = int(self.dataOut.utctime)
tmp_milisecond = int((tmp-tmp_utc)*1000)
self.basicHeaderObj.utc = tmp_utc
self.basicHeaderObj.miliSecond= tmp_milisecond
return 1
return 0
def setNextFile(self):
"""Set the next file to be readed open it and parse de file header"""
if (self.nReadBlocks >= self.processingHeaderObj.dataBlocksPerFile):
self.nReadFiles=self.nReadFiles+1
if self.nReadFiles > self.nTotalReadFiles:
self.flagNoMoreFiles=1
raise schainpy.admin.SchainWarning('No more files to read')
print('------------------- [Opening file] ------------------------------',self.nReadFiles)
self.nReadBlocks = 0
#if self.nReadBlocks==0:
# self.readFirstHeader()
def __setNewBlock(self):
self.setNextFile()
if self.flagIsNewFile:
return 1
def readNextBlock(self):
while True:
self.__setNewBlock()
if not(self.readBlock()):
return 0
self.getBasicHeader()
break
if self.verbose:
print("[Reading] Block No. %d/%d -> %s" %(self.nReadBlocks,
self.processingHeaderObj.dataBlocksPerFile,
self.dataOut.datatime.ctime()) )
return 1
def getFirstHeader(self):
self.getBasicHeader()
self.dataOut.processingHeaderObj = self.processingHeaderObj.copy()
self.dataOut.systemHeaderObj = self.systemHeaderObj.copy()
self.dataOut.radarControllerHeaderObj = self.radarControllerHeaderObj.copy()
self.dataOut.dtype = self.dtype
self.dataOut.nProfiles = self.processingHeaderObj.profilesPerBlock
self.dataOut.heightList = numpy.arange(self.processingHeaderObj.nHeights) * self.processingHeaderObj.deltaHeight + self.processingHeaderObj.firstHeight
self.dataOut.channelList = list(range(self.systemHeaderObj.nChannels))
self.dataOut.nCohInt = self.processingHeaderObj.nCohInt
# asumo q la data no esta decodificada
self.dataOut.flagDecodeData = self.processingHeaderObj.flag_decode
# asumo q la data no esta sin flip
self.dataOut.flagDeflipData = self.processingHeaderObj.flag_deflip
self.dataOut.flagShiftFFT = self.processingHeaderObj.shif_fft
self.dataOut.frequency = self.frequency
def getBasicHeader(self):
self.dataOut.utctime = self.basicHeaderObj.utc + self.basicHeaderObj.miliSecond / \
1000. + self.profileIndex * self.radarControllerHeaderObj.ippSeconds
self.dataOut.flagDiscontinuousBlock = self.flagDiscontinuousBlock
self.dataOut.timeZone = self.basicHeaderObj.timeZone
self.dataOut.dstFlag = self.basicHeaderObj.dstFlag
self.dataOut.errorCount = self.basicHeaderObj.errorCount
self.dataOut.useLocalTime = self.basicHeaderObj.useLocalTime
self.dataOut.ippSeconds = self.radarControllerHeaderObj.ippSeconds / self.nTxs
def readFirstHeader(self):
datatype = int(numpy.log2((self.processingHeaderObj.processFlags &
PROCFLAG.DATATYPE_MASK)) - numpy.log2(PROCFLAG.DATATYPE_CHAR))
if datatype == 0:
datatype_str = numpy.dtype([('real', '<i1'), ('imag', '<i1')])
elif datatype == 1:
datatype_str = numpy.dtype([('real', '<i2'), ('imag', '<i2')])
elif datatype == 2:
datatype_str = numpy.dtype([('real', '<i4'), ('imag', '<i4')])
elif datatype == 3:
datatype_str = numpy.dtype([('real', '<i8'), ('imag', '<i8')])
elif datatype == 4:
datatype_str = numpy.dtype([('real', '<f4'), ('imag', '<f4')])
elif datatype == 5:
datatype_str = numpy.dtype([('real', '<f8'), ('imag', '<f8')])
else:
raise ValueError('Data type was not defined')
self.dtype = datatype_str
def set_RCH(self, expType=2, nTx=1,ipp=None, txA=0, txB=0,
nWindows=None, nHeights=None, firstHeight=None, deltaHeight=None,
numTaus=0, line6Function=0, line5Function=0, fClock=None,
prePulseBefore=0, prePulseAfter=0,
codeType=0, nCode=0, nBaud=0, code=None,
flip1=0, flip2=0,Taus=0):
self.radarControllerHeaderObj.expType = expType
self.radarControllerHeaderObj.nTx = nTx
self.radarControllerHeaderObj.ipp = float(ipp)
self.radarControllerHeaderObj.txA = float(txA)
self.radarControllerHeaderObj.txB = float(txB)
self.radarControllerHeaderObj.rangeIpp = b'A\n'#ipp
self.radarControllerHeaderObj.rangeTxA = b''
self.radarControllerHeaderObj.rangeTxB = b''
self.radarControllerHeaderObj.nHeights = int(nHeights)
self.radarControllerHeaderObj.firstHeight = numpy.array([firstHeight])
self.radarControllerHeaderObj.deltaHeight = numpy.array([deltaHeight])
self.radarControllerHeaderObj.samplesWin = numpy.array([nHeights])
self.radarControllerHeaderObj.nWindows = nWindows
self.radarControllerHeaderObj.numTaus = numTaus
self.radarControllerHeaderObj.codeType = codeType
self.radarControllerHeaderObj.line6Function = line6Function
self.radarControllerHeaderObj.line5Function = line5Function
#self.radarControllerHeaderObj.fClock = fClock
self.radarControllerHeaderObj.prePulseBefore= prePulseBefore
self.radarControllerHeaderObj.prePulseAfter = prePulseAfter
self.radarControllerHeaderObj.flip1 = flip1
self.radarControllerHeaderObj.flip2 = flip2
self.radarControllerHeaderObj.code_size = 0
if self.radarControllerHeaderObj.codeType != 0:
self.radarControllerHeaderObj.nCode = nCode
self.radarControllerHeaderObj.nBaud = nBaud
self.radarControllerHeaderObj.code = code
self.radarControllerHeaderObj.code_size = int(numpy.ceil(nBaud / 32.)) * nCode * 4
if fClock is None and deltaHeight is not None:
self.fClock = 0.15 / (deltaHeight * 1e-6)
self.radarControllerHeaderObj.fClock = self.fClock
if numTaus==0:
self.radarControllerHeaderObj.Taus = numpy.array(0,'<f4')
else:
self.radarControllerHeaderObj.Taus = numpy.array(Taus,'<f4')
def set_PH(self, dtype=0, blockSize=0, profilesPerBlock=0,
dataBlocksPerFile=0, nWindows=0, processFlags=0, nCohInt=0,
nIncohInt=0, totalSpectra=0, nHeights=0, firstHeight=0,
deltaHeight=0, samplesWin=0, spectraComb=0, nCode=0,
code=0, nBaud=None, shif_fft=False, flag_dc=False,
flag_cspc=False, flag_decode=False, flag_deflip=False):
self.processingHeaderObj.dtype = dtype
self.processingHeaderObj.profilesPerBlock = profilesPerBlock
self.processingHeaderObj.dataBlocksPerFile = dataBlocksPerFile
self.processingHeaderObj.nWindows = nWindows
self.processingHeaderObj.processFlags = processFlags
self.processingHeaderObj.nCohInt = nCohInt
self.processingHeaderObj.nIncohInt = nIncohInt
self.processingHeaderObj.totalSpectra = totalSpectra
self.processingHeaderObj.nHeights = int(nHeights)
self.processingHeaderObj.firstHeight = firstHeight#numpy.array([firstHeight])#firstHeight
self.processingHeaderObj.deltaHeight = deltaHeight#numpy.array([deltaHeight])#deltaHeight
self.processingHeaderObj.samplesWin = nHeights#numpy.array([nHeights])#nHeights
def set_BH(self, utc = 0, miliSecond = 0, timeZone = 0):
self.basicHeaderObj.utc = utc
self.basicHeaderObj.miliSecond = miliSecond
self.basicHeaderObj.timeZone = timeZone
def set_SH(self, nSamples=0, nProfiles=0, nChannels=0, adcResolution=14, pciDioBusWidth=32):
#self.systemHeaderObj.size = size
self.systemHeaderObj.nSamples = nSamples
self.systemHeaderObj.nProfiles = nProfiles
self.systemHeaderObj.nChannels = nChannels
self.systemHeaderObj.adcResolution = adcResolution
self.systemHeaderObj.pciDioBusWidth = pciDioBusWidth
def init_acquisition(self):
if self.nFFTPoints != 0:
self.incIntFactor = m_nProfilesperBlock/self.nFFTPoints
if (self.FixPP_IncInt > self.incIntFactor):
self.incIntFactor = self.FixPP_IncInt/ self.incIntFactor
elif(self.FixPP_IncInt< self.incIntFactor):
print("False alert...")
ProfilesperBlock = self.processingHeaderObj.profilesPerBlock
self.timeperblock =int(((self.FixRCP_IPP
*ProfilesperBlock
*self.FixPP_CohInt
*self.incIntFactor)
/150.0)
*0.9
+0.5)
# para cada canal
self.profiles = ProfilesperBlock*self.FixPP_CohInt
self.profiles = ProfilesperBlock
self.Reference = int((self.Tau_0-self.AcqH0_0)/(self.AcqDH_0)+0.5)
self.BaudWidth = int((self.FixRCP_TXA/self.AcqDH_0)/self.Bauds + 0.5 )
if (self.BaudWidth==0):
self.BaudWidth=1
def init_pulse(self,Num_Codes=Num_Codes,Bauds=Bauds,BaudWidth=BaudWidth,Dyn_snCode=Dyn_snCode):
Num_Codes = Num_Codes
Bauds = Bauds
BaudWidth = BaudWidth
Dyn_snCode = Dyn_snCode
if Dyn_snCode:
print("EXISTE")
else:
print("No existe")
if Dyn_snCode: # if Bauds:
pulses = list(range(0,Num_Codes))
num_codes = Num_Codes
for i in range(num_codes):
pulse_size = Bauds*BaudWidth
pulses[i] = numpy.zeros(pulse_size)
for j in range(Bauds):
for k in range(BaudWidth):
pulses[i][j*BaudWidth+k] = int(Dyn_snCode[i][j]*600)
else:
print("sin code")
pulses = list(range(1))
if self.AcqDH_0>0.149:
pulse_size = int(self.FixRCP_TXB/0.15+0.5)
else:
pulse_size = int((self.FixRCP_TXB/self.AcqDH_0)+0.5) #0.0375
pulses[0] = numpy.ones(pulse_size)
pulses = 600*pulses[0]
return pulses,pulse_size
def jro_GenerateBlockOfData(self,Samples=Samples,DC_level= DC_level,stdev=stdev,
Reference= Reference,pulses= pulses,
Num_Codes= Num_Codes,pulse_size=pulse_size,
prof_gen= prof_gen,H0 = H0,DH0=DH0,
Adoppler=Adoppler,Fdoppler= Fdoppler,Hdoppler=Hdoppler):
Samples = Samples
DC_level = DC_level
stdev = stdev
m_nR = Reference
pulses = pulses
num_codes = Num_Codes
ps = pulse_size
prof_gen = prof_gen
channels = self.channels
H0 = H0
DH0 = DH0
ippSec = self.radarControllerHeaderObj.ippSeconds
Fdoppler = self.Fdoppler
Hdoppler = self.Hdoppler
Adoppler = self.Adoppler
self.datablock = numpy.zeros([channels,prof_gen,Samples],dtype= numpy.complex64)
for i in range(channels):
for k in range(prof_gen):
#-----------------------NOISE---------------
Noise_r = numpy.random.normal(DC_level,stdev,Samples)
Noise_i = numpy.random.normal(DC_level,stdev,Samples)
Noise = numpy.zeros(Samples,dtype=complex)
Noise.real = Noise_r
Noise.imag = Noise_i
#-----------------------PULSOS--------------
Pulso = numpy.zeros(pulse_size,dtype=complex)
Pulso.real = pulses[k%num_codes]
Pulso.imag = pulses[k%num_codes]
#--------------------- PULSES+NOISE----------
InBuffer = numpy.zeros(Samples,dtype=complex)
InBuffer[m_nR:m_nR+ps] = Pulso
InBuffer = InBuffer+Noise
#--------------------- ANGLE -------------------------------
InBuffer.real[m_nR:m_nR+ps] = InBuffer.real[m_nR:m_nR+ps]*(math.cos( self.fAngle)*5)
InBuffer.imag[m_nR:m_nR+ps] = InBuffer.imag[m_nR:m_nR+ps]*(math.sin( self.fAngle)*5)
InBuffer=InBuffer
self.datablock[i][k]= InBuffer
#----------------DOPPLER SIGNAL...............................................
time_vec = numpy.linspace(0,(prof_gen-1)*ippSec,int(prof_gen))+self.nReadBlocks*ippSec*prof_gen+(self.nReadFiles-1)*ippSec*prof_gen
fd = Fdoppler #+(600.0/120)*self.nReadBlocks
d_signal = Adoppler*numpy.array(numpy.exp(1.0j*2.0*math.pi*fd*time_vec),dtype=numpy.complex64)
#-------------Senal con ancho espectral--------------------
if prof_gen%2==0:
min = int(prof_gen/2.0-1.0)
max = int(prof_gen/2.0)
else:
min = int(prof_gen/2.0)
max = int(prof_gen/2.0)
specw_sig = numpy.linspace(-min,max,prof_gen)
w = 4
A = 20
specw_sig = specw_sig/w
specw_sig = numpy.sinc(specw_sig)
specw_sig = A*numpy.array(specw_sig,dtype=numpy.complex64)
#------------------ DATABLOCK + DOPPLER--------------------
HD=int(Hdoppler/self.AcqDH_0)
for i in range(12):
self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ d_signal# RESULT
#------------------ DATABLOCK + DOPPLER*Sinc(x)--------------------
HD=int(Hdoppler/self.AcqDH_0)
HD=int(HD/2)
for i in range(12):
self.datablock[0,:,HD+i]=self.datablock[0,:,HD+i]+ specw_sig*d_signal# RESULT
def readBlock(self):
self.jro_GenerateBlockOfData(Samples= self.samples,DC_level=self.DC_level,
stdev=self.stdev,Reference= self.Reference,
pulses = self.pulses,Num_Codes=self.Num_Codes,
pulse_size=self.pulse_size,prof_gen=self.profiles,
H0=self.H0,DH0=self.DH0)
self.profileIndex = 0
self.flagIsNewFile = 0
self.flagIsNewBlock = 1
self.nTotalBlocks += 1
self.nReadBlocks += 1
return 1
def getData(self):
if self.flagNoMoreFiles:
self.dataOut.flagNodata = True
return 0
self.flagDiscontinuousBlock = 0
self.flagIsNewBlock = 0
if self.__hasNotDataInBuffer(): # aqui es verdad
if not(self.readNextBlock()): # return 1 y por eso el if not salta a getBasic Header
return 0
self.getFirstHeader() # atributo
if not self.getByBlock:
self.dataOut.flagDataAsBlock = False
self.dataOut.data = self.datablock[:, self.profileIndex, :]
self.dataOut.profileIndex = self.profileIndex
self.profileIndex += 1
else:
pass
self.dataOut.flagNoData = False
self.getBasicHeader()
self.dataOut.realtime = self.online
return self.dataOut.data
def setup(self,frequency=49.92e6,incIntFactor= 1, nFFTPoints = 0, FixPP_IncInt=1,FixRCP_IPP=1000,
FixPP_CohInt= 1,Tau_0= 250,AcqH0_0 = 70 ,AcqDH_0=1.25, Bauds= 32,
FixRCP_TXA = 40, FixRCP_TXB = 50, fAngle = 2.0*math.pi*(1/16),DC_level= 50,
stdev= 8,Num_Codes = 1 , Dyn_snCode = None, samples=200,
channels=2,Fdoppler=20,Hdoppler=36,Adoppler=500,
profilesPerBlock=300,dataBlocksPerFile=120,nTotalReadFiles=10000,
**kwargs):
self.set_kwargs(**kwargs)
self.nReadBlocks = 0
self.nReadFiles = 1
print('------------------- [Opening file: ] ------------------------------',self.nReadFiles)
tmp = time.time()
tmp_utc = int(tmp)
tmp_milisecond = int((tmp-tmp_utc)*1000)
print(" SETUP -basicHeaderObj.utc",datetime.datetime.utcfromtimestamp(tmp))
if Dyn_snCode is None:
Num_Codes=1
Bauds =1
self.set_BH(utc= tmp_utc,miliSecond= tmp_milisecond,timeZone=300 )
self.set_RCH( expType=0, nTx=150,ipp=FixRCP_IPP, txA=FixRCP_TXA, txB= FixRCP_TXB,
nWindows=1 , nHeights=samples, firstHeight=AcqH0_0, deltaHeight=AcqDH_0,
numTaus=1, line6Function=0, line5Function=0, fClock=None,
prePulseBefore=0, prePulseAfter=0,
codeType=0, nCode=Num_Codes, nBaud=32, code=Dyn_snCode,
flip1=0, flip2=0,Taus=Tau_0)
self.set_PH(dtype=0, blockSize=0, profilesPerBlock=profilesPerBlock,
dataBlocksPerFile=dataBlocksPerFile, nWindows=1, processFlags=numpy.array([1024]), nCohInt=1,
nIncohInt=1, totalSpectra=0, nHeights=samples, firstHeight=AcqH0_0,
deltaHeight=AcqDH_0, samplesWin=samples, spectraComb=0, nCode=0,
code=0, nBaud=None, shif_fft=False, flag_dc=False,
flag_cspc=False, flag_decode=False, flag_deflip=False)
self.set_SH(nSamples=samples, nProfiles=profilesPerBlock, nChannels=channels)
self.readFirstHeader()
self.frequency = frequency
self.incIntFactor = incIntFactor
self.nFFTPoints = nFFTPoints
self.FixPP_IncInt = FixPP_IncInt
self.FixRCP_IPP = FixRCP_IPP
self.FixPP_CohInt = FixPP_CohInt
self.Tau_0 = Tau_0
self.AcqH0_0 = AcqH0_0
self.H0 = AcqH0_0
self.AcqDH_0 = AcqDH_0
self.DH0 = AcqDH_0
self.Bauds = Bauds
self.FixRCP_TXA = FixRCP_TXA
self.FixRCP_TXB = FixRCP_TXB
self.fAngle = fAngle
self.DC_level = DC_level
self.stdev = stdev
self.Num_Codes = Num_Codes
self.Dyn_snCode = Dyn_snCode
self.samples = samples
self.channels = channels
self.profiles = None
self.m_nReference = None
self.Baudwidth = None
self.Fdoppler = Fdoppler
self.Hdoppler = Hdoppler
self.Adoppler = Adoppler
self.nTotalReadFiles = int(nTotalReadFiles)
print("IPP ", self.FixRCP_IPP)
print("Tau_0 ",self.Tau_0)
print("AcqH0_0",self.AcqH0_0)
print("samples,window ",self.samples)
print("AcqDH_0",AcqDH_0)
print("FixRCP_TXA",self.FixRCP_TXA)
print("FixRCP_TXB",self.FixRCP_TXB)
print("Dyn_snCode",Dyn_snCode)
print("Fdoppler", Fdoppler)
print("Hdoppler",Hdoppler)
print("Vdopplermax",Fdoppler*(3.0e8/self.frequency)/2.0)
print("nTotalReadFiles", nTotalReadFiles)
self.init_acquisition()
self.pulses,self.pulse_size=self.init_pulse(Num_Codes=self.Num_Codes,Bauds=self.Bauds,BaudWidth=self.BaudWidth,Dyn_snCode=Dyn_snCode)
print(" [ END ] - SETUP metodo")
return
def run(self,**kwargs): # metodo propio
if not(self.isConfig):
self.setup(**kwargs)
self.isConfig = True
self.getData()