LongRec.py 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Jul 5 09:21:49 2019
  4. @author: rgarcia1
  5. """
  6. from PhyREC.NeoInterface import NeoSegment#, ReadMCSFile
  7. import PhyREC.SignalAnalysis as Ran
  8. import PhyREC.PlotWaves as Rplt
  9. import quantities as pq
  10. import matplotlib.pyplot as plt
  11. import numpy as np
  12. import neo
  13. import PhyREC.SignalProcess as RPro
  14. import deepdish as dd
  15. import csv
  16. from datetime import datetime
  17. def ReadMCSFile(McsFile, OutSeg=None, SigNamePrefix=''):
  18. import McsPy.McsData as McsData
  19. Dat = McsData.RawData(McsFile)
  20. Rec = Dat.recordings[0]
  21. NSamps = Rec.duration
  22. if OutSeg is None:
  23. OutSeg = NeoSegment()
  24. for AnaStrn, AnaStr in Rec.analog_streams.iteritems():
  25. if len(AnaStr.channel_infos) == 1:
  26. continue
  27. for Chn, Chinfo in AnaStr.channel_infos.iteritems():
  28. print 'Analog Stream ', Chinfo.label, Chinfo.sampling_frequency
  29. ChName = str(SigNamePrefix + Chinfo.label)
  30. print ChName
  31. Fs = Chinfo.sampling_frequency
  32. Var, Unit = AnaStr.get_channel_in_range(Chn, 0, NSamps)
  33. sig = neo.AnalogSignal(pq.Quantity(Var, Chinfo.info['Unit']),
  34. t_start=0*pq.s,
  35. sampling_rate=Fs.magnitude*pq.Hz,
  36. name=ChName)
  37. OutSeg.AddSignal(sig)
  38. return OutSeg
  39. def ReadLogFile(File):
  40. Fin = open(File)
  41. reader = csv.reader(Fin, delimiter='\t')
  42. LogVals = {}
  43. ValsPos = {}
  44. for il, e in enumerate(reader):
  45. if il == 0:
  46. for ih, v in enumerate(e):
  47. ValsPos[ih] = v
  48. LogVals[v] = []
  49. else:
  50. for ih, v in enumerate(e):
  51. par = ValsPos[ih]
  52. if (par=='Vgs') or (par=='Vds') or (par=='Vref'):
  53. LogVals[par].append(float(v.replace(',','.')))
  54. elif par == 'Date/Time':
  55. LogVals[par].append(datetime.strptime(v, '%d/%m/%Y %H:%M:%S'))
  56. else:
  57. LogVals[par].append(v)
  58. deltas = np.array(LogVals['Date/Time'])[:]-LogVals['Date/Time'][0]
  59. LogVals['Time'] = []
  60. for d in deltas:
  61. LogVals['Time'].append(d.total_seconds())
  62. Fin.close()
  63. return LogVals
  64. def MeanStd(Data):
  65. Arr = np.zeros([len(Data.keys()),len(Data[Data.keys()[0]]['psd'])])
  66. for iT,TrtName in enumerate(Data.keys()):
  67. Arr[iT,:] = Data[TrtName]['psd'][:,0]
  68. return np.mean(Arr,0), np.std(Arr,0)
  69. Path = '23072019/B12784O18-T3/'
  70. InFileM = Path + '2019-07-23T16-59-52B12784O18-T3-ACDC-PostEth-LowFreqNoise-0.25V.h5' ############
  71. InFileS = Path + '2019-07-23T16-59-52B12784O18-T3-ACDC-PostEth-LowFreqNoise-0.25V_2.h5' ##########
  72. Gm = dd.io.load(Path + 'GM-B12784O18-T3')
  73. BW = 100
  74. ivgainDC = 118.8*pq.V
  75. ivgainAC = 1188*pq.V
  76. TWind = (140*pq.s, 2350*pq.s)
  77. DCch = ('ME5', 'ME7', 'ME29', 'ME31', 'SE5', 'SE7', 'SE29', 'SE31')
  78. Rec = ReadMCSFile(InFileM,
  79. OutSeg=None,
  80. SigNamePrefix='M')
  81. Rec = ReadMCSFile(InFileS,
  82. OutSeg=Rec,
  83. SigNamePrefix='S')
  84. #plt.close('all')
  85. #%% Plot Sig High Freq
  86. plt.close('all')
  87. SlotsAC= []
  88. for sig in Rec.Signals():
  89. SigProDC = [{'function': RPro.Gain, 'args': {'Gain': pq.A/(Gm[sig.name][8]*(pq.A/pq.V)*ivgainAC)}},
  90. {'function': RPro.SetZero, 'args' : {'TWind' :TWind}},
  91. {'function': RPro.Filter, 'args': {'Type':'bandpass',
  92. 'Order':2,
  93. 'Freqs':(20,200)}},
  94. ]
  95. if sig.name in DCch+('SE30',):
  96. continue
  97. sig.ProcessChain = SigProDC
  98. sig = sig.GetSignal(TWind)
  99. SlotsAC.append(Rplt.WaveSlot(sig,
  100. Position=0,
  101. Alpha=0.5))
  102. Splots = Rplt.PlotSlots(SlotsAC)
  103. Splots.PlotChannels(Time=TWind,
  104. Units='V')
  105. plt.xlabel('time (s)')
  106. plt.ylabel('Sig (uV)')
  107. #%% Plot PSD
  108. fig, AxPs = plt.subplots()
  109. PSD = Ran.PlotPSD((s for s in SlotsAC),
  110. Time = TWind,
  111. Ax=AxPs,
  112. FMin=1,
  113. scaling='density',
  114. Units = 'V',
  115. label = '20-200Hz',
  116. color='orange')
  117. MeanPSDhigh, StdPSDhigh = MeanStd(PSD)
  118. FpsdHigh = PSD[PSD.keys()[0]]['ff']
  119. #%%Plot hystogram
  120. HistData = NeoSegment()
  121. plt.figure(5)
  122. signal = np.array([])
  123. for iSl, sl in enumerate(SlotsAC):
  124. signal = np.append(signal,np.array(sl.GetSignal(TWind))[:,0]*1000000)
  125. hist, vect = np.histogram(signal, bins=1000 , range = (np.min(signal),np.max(signal)))
  126. plt.hist(signal, bins =1000, density = True, range = (np.min(signal),np.max(signal)),alpha=0.3,color='orange',label = '1-100Hz')
  127. plt.legend()
  128. #%% Plot Sig
  129. Slots= []
  130. for sig in Rec.Signals():
  131. SigProAC = [{'function': RPro.Gain, 'args': {'Gain': pq.A/(Gm[sig.name][8]*(pq.A/pq.V)*ivgainDC)}},
  132. {'function': RPro.SetZero, 'args' : {'TWind' :TWind}},
  133. {'function': RPro.Filter, 'args': {'Type':'bandpass',
  134. 'Order':2,
  135. 'Freqs':(0.05,0.5)}},
  136. ]
  137. if sig.name not in DCch:
  138. continue
  139. sig.ProcessChain = SigProAC
  140. sig = sig.GetSignal(TWind)
  141. Slots.append(Rplt.WaveSlot(sig,
  142. Position=0,
  143. Alpha=0.5))
  144. Splots = Rplt.PlotSlots(Slots)
  145. Splots.PlotChannels(Time=TWind,
  146. Units='V')
  147. plt.xlabel('time (s)')
  148. plt.ylabel('Sig (uV)')
  149. #%% Plot PSD
  150. #fig, (AxPs, Axt) = plt.subplots(2,1)
  151. PSD = Ran.PlotPSD((s for s in Slots),
  152. Time = TWind,
  153. Ax=AxPs,
  154. FMin=0.01,
  155. scaling='density',
  156. Units = 'V',
  157. label = '0.05-0.5Hz',
  158. color= 'k')
  159. MeanPSDlow, StdPSDlow = MeanStd(PSD)
  160. FpsdLow = PSD[PSD.keys()[0]]['ff']
  161. #%%Plot hystogram
  162. HistData = NeoSegment()
  163. plt.figure(5)
  164. signal = np.array([])
  165. for iSl, sl in enumerate(Slots):
  166. signal = np.append(signal,np.array(sl.GetSignal(TWind))[:,0]*1000000)
  167. hist, vect = np.histogram(signal, bins=1000 , range = (np.min(signal),np.max(signal)))
  168. plt.hist(signal, bins =1000, density = True, range = (np.min(signal),np.max(signal)),alpha=0.3,color='k', label = '0.01-1Hz')
  169. plt.xlabel('Signal amplitude ($\mu$V)')
  170. plt.ylabel('Probability density')
  171. #%%Plot PSD average
  172. plt.figure()
  173. plt.loglog(FpsdLow,MeanPSDlow,'k')
  174. plt.fill_between(FpsdLow,MeanPSDlow+StdPSDlow,MeanPSDlow-StdPSDlow, color ='k',alpha=0.3)
  175. plt.loglog(FpsdHigh,MeanPSDhigh,'orange')
  176. plt.fill_between(FpsdHigh,MeanPSDhigh+StdPSDhigh,MeanPSDhigh-StdPSDhigh, color ='orange',alpha=0.3)