Random updates
This commit is contained in:
parent
d2b5eb2b43
commit
c5c4ae61ee
10 changed files with 262 additions and 25 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,6 +1,8 @@
|
||||||
# Figures directory
|
# Figures directory
|
||||||
figures*
|
figures*
|
||||||
from*
|
from*
|
||||||
|
.vscode/
|
||||||
|
revisedData
|
||||||
|
|
||||||
# Byte-compiled / optimized / DLL files
|
# Byte-compiled / optimized / DLL files
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
|
|
@ -14,7 +14,13 @@ from cycler import cycler
|
||||||
|
|
||||||
POLAR_YLIM_CONST=(-18,-6)
|
POLAR_YLIM_CONST=(-18,-6)
|
||||||
POLAR_YLIM_CONST_MEAS=(-22,-10)
|
POLAR_YLIM_CONST_MEAS=(-22,-10)
|
||||||
|
POLAR_YLIM_CONST_MEAS=(-15,-3)
|
||||||
POLAR_YLIM_CONST_ALT=(-32,-6)
|
POLAR_YLIM_CONST_ALT=(-32,-6)
|
||||||
|
GAIN_FIXED_YLIM1=(-20,-0)
|
||||||
|
GAIN_FIXED_YLIM2=(-30,-0)
|
||||||
|
GAIN_FIXED_YLIM3=(-10,10)
|
||||||
|
GAIN_FIXED_YLIM4=(-0,20)
|
||||||
|
GAIN_FIXED_YLIM5=(-20,0)
|
||||||
|
|
||||||
fcFontList = FM.get_fontconfig_fonts()
|
fcFontList = FM.get_fontconfig_fonts()
|
||||||
# Search only for fonts that have name matches similar to this
|
# Search only for fonts that have name matches similar to this
|
||||||
|
|
|
@ -36,7 +36,7 @@ class ampSystem:
|
||||||
# Configuration Of Hardware
|
# Configuration Of Hardware
|
||||||
#####
|
#####
|
||||||
self.q1_L = 25
|
self.q1_L = 25
|
||||||
self.q1_C = 8
|
self.q1_C = 6
|
||||||
self.l1 = 140e-3 # nH
|
self.l1 = 140e-3 # nH
|
||||||
self.gm1 = 2.5e-3 # S
|
self.gm1 = 2.5e-3 # S
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ class ampSystem:
|
||||||
if not quiet:
|
if not quiet:
|
||||||
## Report System Descrption
|
## Report System Descrption
|
||||||
print(' L1 = %.3fpH, C1 = %.3ffF' % (1e3*self.l1, 1e6*self.c1))
|
print(' L1 = %.3fpH, C1 = %.3ffF' % (1e3*self.l1, 1e6*self.c1))
|
||||||
print(' Rp = %.3f Ohm' % (1/self.g1))
|
print(' Rp = %.3f Ohm (Gp = %.3f mS)' % (1/self.g1, 1e3*self.g1))
|
||||||
print(' Q = %.1f' % (self.Q1))
|
print(' Q = %.1f' % (self.Q1))
|
||||||
self._gamma_warn = False
|
self._gamma_warn = False
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ class ampSystem:
|
||||||
@property
|
@property
|
||||||
def alpha_swp(self):
|
def alpha_swp(self):
|
||||||
range_partial = np.ceil(self.gamma_len/2)
|
range_partial = np.ceil(self.gamma_len/2)
|
||||||
rhs = np.power(np.linspace(0,1,range_partial),2)*(self.alpha_min-1)+1
|
rhs = np.power(np.linspace(0,1,range_partial),1)*(self.alpha_min-1)+1
|
||||||
lhs = np.flip(rhs,0)
|
lhs = np.flip(rhs,0)
|
||||||
#lhs = np.linspace(np.sqrt(self.alpha_min),1, range_partial)
|
#lhs = np.linspace(np.sqrt(self.alpha_min),1, range_partial)
|
||||||
#rhs = np.flip(lhs,0)
|
#rhs = np.flip(lhs,0)
|
||||||
|
|
|
@ -71,7 +71,7 @@ f=FreqClass(freq_pts, S1.f0, S1.bw_plt)
|
||||||
|
|
||||||
S1.q1_L = 15
|
S1.q1_L = 15
|
||||||
S2 = copy.deepcopy(S1)
|
S2 = copy.deepcopy(S1)
|
||||||
gain_variation = +5 # dB
|
gain_variation = -2 # dB
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
96
parsePy.py
96
parsePy.py
|
@ -17,6 +17,8 @@ args_parser.add_argument('--headless','-q', action='store_true',
|
||||||
help='Remain neadless even if we aren\'t saving files.')
|
help='Remain neadless even if we aren\'t saving files.')
|
||||||
args_parser.add_argument('-n', type=int, default=4,
|
args_parser.add_argument('-n', type=int, default=4,
|
||||||
help='plot testing number')
|
help='plot testing number')
|
||||||
|
args_parser.add_argument('-c', type=int, default=16,
|
||||||
|
help='number of phase states [16,32,64]')
|
||||||
args = args_parser.parse_args()
|
args = args_parser.parse_args()
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -65,6 +67,8 @@ if args.polar:
|
||||||
else:
|
else:
|
||||||
FILE_PAT = '%s-trunk.s2p';
|
FILE_PAT = '%s-trunk.s2p';
|
||||||
figdir = 'figures-measured'
|
figdir = 'figures-measured'
|
||||||
|
if args.c != 16:
|
||||||
|
figdir=figdir+('-%d' % args.c)
|
||||||
|
|
||||||
class MeasurementConfig(namedtuple('config', ['r','c','inv','bias'])):
|
class MeasurementConfig(namedtuple('config', ['r','c','inv','bias'])):
|
||||||
__slots__ = ()
|
__slots__ = ()
|
||||||
|
@ -87,13 +91,14 @@ def ang(x):
|
||||||
|
|
||||||
BDE=namedtuple('BufferDeEmbed',['mstr','PolyGain','PolyPhase','PhiFix','test'])
|
BDE=namedtuple('BufferDeEmbed',['mstr','PolyGain','PolyPhase','PhiFix','test'])
|
||||||
BDE_list=[]
|
BDE_list=[]
|
||||||
|
|
||||||
# 2018-05-15
|
# 2018-05-15
|
||||||
BDE_list.append(BDE(
|
BDE_list.append(BDE(
|
||||||
'2018-05-15',
|
'2018-05-15',
|
||||||
np.array([ 4.06488853e-03, -5.11527396e-01, 2.53053550e+01]),
|
np.array([ 4.06488853e-03, -5.11527396e-01, 2.53053550e+01]),
|
||||||
np.array([-1.62202706e-03, 6.94343608e-01, -1.80381551e+02]),
|
np.array([-1.62202706e-03, 6.94343608e-01, -1.80381551e+02]),
|
||||||
-60,
|
-60,
|
||||||
'S02bB_C+00dB_M0'
|
'S02bB_C+01dB_M0'
|
||||||
))
|
))
|
||||||
# 2018-05-16
|
# 2018-05-16
|
||||||
BDE_list.append(BDE(
|
BDE_list.append(BDE(
|
||||||
|
@ -124,7 +129,7 @@ BDE_list.append(BDE(
|
||||||
'S02bB_C+00dB_M0'
|
'S02bB_C+00dB_M0'
|
||||||
))
|
))
|
||||||
|
|
||||||
source_directory='fromMat/%s_mat/' % SRC_DATA_NAME
|
source_directory='fromMat/figures-%d/%s_mat/' % (args.c, SRC_DATA_NAME)
|
||||||
for BDEx in BDE_list:
|
for BDEx in BDE_list:
|
||||||
if re.search(BDEx.mstr, source_directory) != None:
|
if re.search(BDEx.mstr, source_directory) != None:
|
||||||
PolyGain=BDEx.PolyGain
|
PolyGain=BDEx.PolyGain
|
||||||
|
@ -134,6 +139,26 @@ for BDEx in BDE_list:
|
||||||
FamStr=BDEx.mstr
|
FamStr=BDEx.mstr
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
# FIXME ########################################################################
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
PolyGain_balun=np.array([0, 0, -7])
|
||||||
|
PolyPhase_balun=np.array([0, 0, 0])
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
if args.c == 64:
|
||||||
|
StopTestString='S05bB_C+05dB_M0_-64'
|
||||||
|
elif args.c == 32:
|
||||||
|
StopTestString='S03bB_C+00dB_M0_-32'
|
||||||
|
|
||||||
with open(SRC_DATA_SUMMARY, 'r') as h_sumDat:
|
with open(SRC_DATA_SUMMARY, 'r') as h_sumDat:
|
||||||
sumDat = json.load(h_sumDat)
|
sumDat = json.load(h_sumDat)
|
||||||
|
|
||||||
|
@ -186,7 +211,12 @@ for filename in os.listdir(source_directory):
|
||||||
PhaseFixedRotationFactor*np.pi/180
|
PhaseFixedRotationFactor*np.pi/180
|
||||||
buffer_sdat = np.power(10,buffer_gain/20)*np.exp(1j*buffer_phase)
|
buffer_sdat = np.power(10,buffer_gain/20)*np.exp(1j*buffer_phase)
|
||||||
|
|
||||||
sdat = sdat_raw/buffer_sdat
|
balun_gain = np.polyval(PolyGain_balun,freq)
|
||||||
|
balun_phase = np.polyval(PolyPhase_balun,freq)
|
||||||
|
balun_phase = balun_phase - np.mean(balun_phase)
|
||||||
|
balun_sdat = np.power(10,balun_gain/20)*np.exp(1j*balun_phase)
|
||||||
|
|
||||||
|
sdat = sdat_raw/buffer_sdat/balun_sdat
|
||||||
|
|
||||||
slope_valid_inds = np.where(np.all((freq >= slopeBandwidthFreq[0],
|
slope_valid_inds = np.where(np.all((freq >= slopeBandwidthFreq[0],
|
||||||
freq <= slopeBandwidthFreq[1]),0))
|
freq <= slopeBandwidthFreq[1]),0))
|
||||||
|
@ -213,17 +243,20 @@ for filename in os.listdir(source_directory):
|
||||||
ax=h.add_subplot(1,1,1, projection='polar')
|
ax=h.add_subplot(1,1,1, projection='polar')
|
||||||
else:
|
else:
|
||||||
h=pp.figure(figsize=(3.4*figScaleSize, 4.5*figScaleSize))
|
h=pp.figure(figsize=(3.4*figScaleSize, 4.5*figScaleSize))
|
||||||
h2=pp.figure(figsize=(3.4*figScaleSize, 2.8*figScaleSize))
|
h2=pp.figure(figsize=(3.4*figScaleSize, 2.3*figScaleSize))
|
||||||
ax=h.subplots(2,1)
|
ax=h.subplots(2,1)
|
||||||
ax = np.append(ax, h2.subplots(1,1))
|
ax = np.append(ax, h2.subplots(1,1))
|
||||||
ax = np.append(ax, ax[1].twinx())
|
ax = np.append(ax, ax[1].twinx())
|
||||||
ax = np.append(ax, ax[2].twinx())
|
ax = np.append(ax, ax[2].twinx())
|
||||||
|
ax = np.append(ax, ax[0].twinx())
|
||||||
summary_msg = \
|
summary_msg = \
|
||||||
"/---------------------\/----------------------------------------\\\n"\
|
"/---------------------\/----------------------------------------\\\n"\
|
||||||
"| _C R I _Bias_ || Gain Phase Power |\n"\
|
"| _C R I _Bias_ || Gain Phase Power |\n"\
|
||||||
"|---------------------||----------------------------------------|\n"
|
"|---------------------||----------------------------------------|\n"
|
||||||
all_sdat = np.column_stack([imeas.s21 for imeas in collectedData])
|
all_sdat = np.column_stack([imeas.s21 for imeas in collectedData])
|
||||||
ang_rms = delta_rms(np.angle(all_sdat), 2*np.pi/16)*180/np.pi
|
ang_rms = delta_rms(np.angle(all_sdat), 2*np.pi/args.c)*180/np.pi
|
||||||
|
gain_pm = gain_error(dB20(all_sdat), index_f0)
|
||||||
|
gain_rms = rms(dB20(all_sdat), index_f0)
|
||||||
for imeas in collectedData:
|
for imeas in collectedData:
|
||||||
if args.polar:
|
if args.polar:
|
||||||
#ax.plot(ang(imeas.s21)-buffer_phase, dB20(imeas.s21)-buffer_gain)
|
#ax.plot(ang(imeas.s21)-buffer_phase, dB20(imeas.s21)-buffer_gain)
|
||||||
|
@ -258,6 +291,7 @@ for filename in os.listdir(source_directory):
|
||||||
"|===> RMS: %6.1f deg (%6.1f deg - %6.1f deg) | \n" \
|
"|===> RMS: %6.1f deg (%6.1f deg - %6.1f deg) | \n" \
|
||||||
"\_______________________________________________________________/" % \
|
"\_______________________________________________________________/" % \
|
||||||
(sumTuple_avgMinMax([pwr_list, gain_list, ang_rms]))
|
(sumTuple_avgMinMax([pwr_list, gain_list, ang_rms]))
|
||||||
|
print(group_filename_string, sumTuple_avgMinMax([ang_rms]))
|
||||||
if args.polar:
|
if args.polar:
|
||||||
ax.set_ylim(LPRDefaultPlotting.POLAR_YLIM_CONST_MEAS)
|
ax.set_ylim(LPRDefaultPlotting.POLAR_YLIM_CONST_MEAS)
|
||||||
|
|
||||||
|
@ -269,9 +303,43 @@ for filename in os.listdir(source_directory):
|
||||||
np.min([np.min(line.get_ydata()) for line in ax[2].get_lines()])
|
np.min([np.min(line.get_ydata()) for line in ax[2].get_lines()])
|
||||||
ax[0].set_title('Measured Performance')
|
ax[0].set_title('Measured Performance')
|
||||||
ax[0].set_ylabel('Gain (dB)')
|
ax[0].set_ylabel('Gain (dB)')
|
||||||
|
######### FIXME ########################################################
|
||||||
|
#ax[0].set_ylim(np.array([-17.5, 2.5]))
|
||||||
|
ax[0].set_ylim(np.array([-20, 0]))
|
||||||
ax[1].set_ylabel('Relative Phase (deg)')
|
ax[1].set_ylabel('Relative Phase (deg)')
|
||||||
ax[2].set_ylabel('Relative Phase (deg)')
|
ax[2].set_ylabel('Relative Phase (deg)')
|
||||||
ax[2].set_title('Relative Phase')
|
ax[2].set_title('Relative Phase')
|
||||||
|
ax[1].set_ylim(np.array([-100, 360]))
|
||||||
|
ax[2].set_ylim(np.array([-100, 360]))
|
||||||
|
|
||||||
|
marker_freq = 28.1
|
||||||
|
LPRDefaultPlotting.annotateArrow(ax[0], -4, \
|
||||||
|
[marker_freq+0.05+0.02, marker_freq+0.15+0.02], direction='left')
|
||||||
|
|
||||||
|
for i in [5]:
|
||||||
|
aT=ax[i]
|
||||||
|
aR=ax[0]
|
||||||
|
#aT.plot(imeas.f, gain_pm)
|
||||||
|
aT.plot(imeas.f, gain_rms)
|
||||||
|
for axTLi,axTL in enumerate(aT.get_lines()):
|
||||||
|
axTL.set_linewidth(2.0)
|
||||||
|
axTL.set_color('black')
|
||||||
|
if axTLi == 0:
|
||||||
|
axTL.set_linestyle('-.')
|
||||||
|
else:
|
||||||
|
axTL.set_linestyle(':')
|
||||||
|
aT.set_ylabel('RMS Gain Variation (dB)')
|
||||||
|
|
||||||
|
marker_freq = 27.7
|
||||||
|
marker_point = np.argmin(np.abs(imeas.f-marker_freq))
|
||||||
|
marker_height = gain_pm[marker_point]
|
||||||
|
marker_height = gain_rms[marker_point]
|
||||||
|
LPRDefaultPlotting.annotateArrow(aT, marker_height+0.5, \
|
||||||
|
[marker_freq+0.05+0.02, marker_freq+0.15+0.02])
|
||||||
|
aT.set_ylim(aR.get_ylim()/np.array(1)+20)
|
||||||
|
aT.grid()
|
||||||
|
######### FIXME ########################################################
|
||||||
|
|
||||||
for i in range(3,5):
|
for i in range(3,5):
|
||||||
aT=ax[i]
|
aT=ax[i]
|
||||||
aR=ax[i-2]
|
aR=ax[i-2]
|
||||||
|
@ -279,7 +347,8 @@ for filename in os.listdir(source_directory):
|
||||||
# Recall that the ylimits should be 0-360 basically.
|
# Recall that the ylimits should be 0-360 basically.
|
||||||
aT.set_ylabel('RMS Error (deg)')
|
aT.set_ylabel('RMS Error (deg)')
|
||||||
aT.plot(imeas.f, ang_rms)
|
aT.plot(imeas.f, ang_rms)
|
||||||
marker_freq = 27.5
|
#marker_freq = 27.5
|
||||||
|
marker_freq = 28.3
|
||||||
marker_point = np.argmin(np.abs(imeas.f-marker_freq))
|
marker_point = np.argmin(np.abs(imeas.f-marker_freq))
|
||||||
marker_height = ang_rms[marker_point]
|
marker_height = ang_rms[marker_point]
|
||||||
|
|
||||||
|
@ -301,19 +370,26 @@ for filename in os.listdir(source_directory):
|
||||||
yXover = np.array([np.min(yRTover[:,0]), np.max(yRTover[:,1])])
|
yXover = np.array([np.min(yRTover[:,0]), np.max(yRTover[:,1])])
|
||||||
aR.set_ylim(yRscl*yXover + yRmrks)
|
aR.set_ylim(yRscl*yXover + yRmrks)
|
||||||
aT.set_ylim(yTscl*yXover + yTmrks)
|
aT.set_ylim(yTscl*yXover + yTmrks)
|
||||||
aT.set_ylim(aR.get_ylim()/np.array(50)+3)
|
#aT.set_ylim(aR.get_ylim()/np.array(20)+9)
|
||||||
|
aT.set_ylim((0,20))
|
||||||
aT.grid()
|
aT.grid()
|
||||||
|
|
||||||
aT.get_lines()[0].set_linewidth(2.0)
|
aT.get_lines()[0].set_linewidth(2.0)
|
||||||
aT.get_lines()[0].set_linestyle('-.')
|
aT.get_lines()[0].set_linestyle('-.')
|
||||||
aT.get_lines()[0].set_color('black')
|
aT.get_lines()[0].set_color('black')
|
||||||
LPRDefaultPlotting.annotateArrow(aT, marker_height, \
|
LPRDefaultPlotting.annotateArrow(aT, marker_height-0.5, \
|
||||||
[marker_freq+0.05, marker_freq+0.25])
|
[marker_freq+0.05, marker_freq+0.15])
|
||||||
|
|
||||||
|
ax[5].set_ylim(np.array([0, 20]))
|
||||||
|
#ax[3].set_ylim(np.array([0, 42]))
|
||||||
|
ax[3].set_ylim(np.array([0, 23]))
|
||||||
|
|
||||||
for aT in ax:
|
for aT in ax:
|
||||||
aT.set_xlabel('Frequency (GHz)')
|
aT.set_xlabel('Frequency (GHz)')
|
||||||
aT.grid()
|
aT.grid()
|
||||||
#aT.set_xlim((np.min(imeas.f), np.max(imeas.f)))
|
#aT.set_xlim((np.min(imeas.f), np.max(imeas.f)))
|
||||||
aT.set_xlim((28-1.0, 28+1.0))
|
#aT.set_xlim((28-1.0, 28+1.0))
|
||||||
|
aT.set_xlim((28-0.5, 28+0.5))
|
||||||
|
|
||||||
if args.polar:
|
if args.polar:
|
||||||
old_pos = ax.title.get_position()
|
old_pos = ax.title.get_position()
|
||||||
|
|
|
@ -19,7 +19,7 @@ for n in 5 6; do
|
||||||
echo " 止 end $n"
|
echo " 止 end $n"
|
||||||
) &
|
) &
|
||||||
done
|
done
|
||||||
for n in 1 2 3 4 11 12 13 14; do
|
for n in 7 1 2 3 4 11 12 13 14; do
|
||||||
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
(
|
(
|
||||||
echo " start $n →"
|
echo " start $n →"
|
||||||
|
|
28
runParse.sh
28
runParse.sh
|
@ -2,19 +2,37 @@
|
||||||
|
|
||||||
MAX_JOBS=4
|
MAX_JOBS=4
|
||||||
|
|
||||||
|
#for n in $(seq 1 4); do
|
||||||
|
for n in 4; do
|
||||||
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
|
echo " start $n →"
|
||||||
|
( ./parsePy.py -rpq -n $n 1>/dev/null ) &
|
||||||
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
|
( ./parsePy.py -rq -n $n 1>/dev/null ) &
|
||||||
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
|
( ./parsePy.py -spq -n $n 1>/dev/null ) &
|
||||||
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
|
( ./parsePy.py -sq -n $n 1>/dev/null ) &
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ 1 -eq 2 ]]; then
|
||||||
|
NC=32
|
||||||
for n in $(seq 1 4); do
|
for n in $(seq 1 4); do
|
||||||
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
echo " start $n →"
|
echo " start $n →"
|
||||||
( ./parsePy.py -rq -n $n 1>/dev/null ) &
|
( ./parsePy.py -rpq -n $n -c "$NC" 1>/dev/null ) &
|
||||||
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
( ./parsePy.py -rpq -n $n 1>/dev/null ) &
|
( ./parsePy.py -rq -n $n -c "$NC" 1>/dev/null ) &
|
||||||
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
( ./parsePy.py -sq -n $n 1>/dev/null ) &
|
( ./parsePy.py -spq -n $n -c "$NC" 1>/dev/null ) &
|
||||||
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
( ./parsePy.py -spq -n $n 1>/dev/null ) &
|
( ./parsePy.py -sq -n $n -c "$NC" 1>/dev/null ) &
|
||||||
done
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
while [[ $(jobs -lr | wc -l) -gt 0 ]]; do sleep 0.1; done
|
while [[ $(jobs -lr | wc -l) -gt 0 ]]; do sleep 0.1; done
|
||||||
SELECT_STRING="S02bB_C+00dB"
|
SELECT_STRING="S02bB_C+00dB"
|
||||||
rsync -aPv "figures-measured/"*"${SELECT_STRING}"* ../tex/figures-measured/
|
cp -v "figures-measured/"*"${SELECT_STRING}"* ../tex/figures-measured/
|
||||||
|
SELECT_STRING="S03bB_C+00dB"
|
||||||
|
cp -v "figures-measured-32/"*"${SELECT_STRING}"* ../tex/figures-measured-32/
|
||||||
|
|
||||||
|
|
28
runSome.sh
Executable file
28
runSome.sh
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
MAX_JOBS=4
|
||||||
|
|
||||||
|
for n in 2 12; do
|
||||||
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
|
(
|
||||||
|
echo " start $n →"
|
||||||
|
./tankPlot.py -n $n --subplot -sq 1>/dev/null
|
||||||
|
./tankPlot.py -n $n --subplot -rq 1>/dev/null
|
||||||
|
echo " 止 end $n"
|
||||||
|
) &
|
||||||
|
while [[ $MAX_JOBS -le $(jobs -l | wc -l) ]]; do sleep 0.1; done
|
||||||
|
(
|
||||||
|
echo " start $n →"
|
||||||
|
./tankPlot.py -n $n -sq 1>/dev/null
|
||||||
|
./tankPlot.py -n $n -rq 1>/dev/null
|
||||||
|
echo " 止 end $n"
|
||||||
|
) &
|
||||||
|
done
|
||||||
|
|
||||||
|
#bash ./runParse.sh &
|
||||||
|
|
||||||
|
while [[ $(jobs -lr | wc -l) -gt 0 ]]; do sleep 0.1; done
|
||||||
|
#mkdir -p figures-png
|
||||||
|
#rm figures-png/*.png &>/dev/null
|
||||||
|
mv figures/*.png figures-png/
|
||||||
|
echo "DONE!"
|
|
@ -79,3 +79,22 @@ def delta_rms(signal, reference_delta, wrap_point=2*np.pi):
|
||||||
signal_rms = np.sqrt(np.mean(np.power(signal_error,2),1))
|
signal_rms = np.sqrt(np.mean(np.power(signal_error,2),1))
|
||||||
|
|
||||||
return signal_rms
|
return signal_rms
|
||||||
|
|
||||||
|
def gain_error(signal, ref_freq_ind):
|
||||||
|
"""compute the gain variation relative to a mean computed at ref_freq_ind"""
|
||||||
|
# First compute the matrix difference including folding
|
||||||
|
inband_gain = np.mean(signal[ref_freq_ind,:])
|
||||||
|
signal_off = signal-inband_gain
|
||||||
|
range = np.max(signal_off,1)-np.min(signal_off,1)
|
||||||
|
|
||||||
|
return range
|
||||||
|
|
||||||
|
def rms(signal, ref_freq_ind=None):
|
||||||
|
"""compute raw RMS"""
|
||||||
|
if ref_freq_ind == None:
|
||||||
|
offset_signal = signal-np.transpose(\
|
||||||
|
np.ones((signal.shape[1],1))*np.mean(signal,1)\
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
offset_signal = signal-np.mean(signal[ref_freq_ind,:])
|
||||||
|
return np.sqrt(np.mean(np.power(offset_signal,2),1))
|
||||||
|
|
98
tankPlot.py
98
tankPlot.py
|
@ -57,7 +57,7 @@ figScaleSize = 1.0 if args.save else 1.6
|
||||||
if args.subplot:
|
if args.subplot:
|
||||||
rcParams['figure.figsize'] = [3.4*figScaleSize,4*figScaleSize]
|
rcParams['figure.figsize'] = [3.4*figScaleSize,4*figScaleSize]
|
||||||
else:
|
else:
|
||||||
rcParams['figure.figsize'] = [3.4*figScaleSize,2.25*figScaleSize]
|
rcParams['figure.figsize'] = [3.4*figScaleSize,2*figScaleSize]
|
||||||
default_window_position=['+20+80', '+120+80']
|
default_window_position=['+20+80', '+120+80']
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -68,11 +68,12 @@ from tankComputers import *
|
||||||
freq_pts = 501
|
freq_pts = 501
|
||||||
|
|
||||||
S=TankGlobals.ampSystem()
|
S=TankGlobals.ampSystem()
|
||||||
|
#S.bw_plt=2
|
||||||
B=TankGlobals.bufferSystem()
|
B=TankGlobals.bufferSystem()
|
||||||
|
|
||||||
S.q1_L = 15
|
S.q1_L = 15
|
||||||
if plot_list[0] in [11, 12, 13, 14]:
|
if plot_list[0] in [11, 12, 13, 14]:
|
||||||
gain_variation = +4 # dB
|
gain_variation = -2 # dB
|
||||||
else:
|
else:
|
||||||
gain_variation = 0 # dB
|
gain_variation = 0 # dB
|
||||||
|
|
||||||
|
@ -80,10 +81,11 @@ if plot_list[0] in [14, 4, 5]:
|
||||||
S.bw_plt = 0.5
|
S.bw_plt = 0.5
|
||||||
B.bw_plt = S.bw_plt
|
B.bw_plt = S.bw_plt
|
||||||
freq_pts = 51
|
freq_pts = 51
|
||||||
if plot_list[0] == 5:
|
if plot_list[0] in [5, 7]:
|
||||||
S.set_g1_swp(TankGlobals.g1_map_flat)
|
S.set_g1_swp(TankGlobals.g1_map_flat)
|
||||||
S.set_gamma_swp(TankGlobals.gamma_map_flat)
|
S.set_gamma_swp(TankGlobals.gamma_map_flat)
|
||||||
|
|
||||||
|
S.bw_plt = 2;
|
||||||
f=FreqClass(freq_pts, S.f0, S.bw_plt)
|
f=FreqClass(freq_pts, S.f0, S.bw_plt)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -129,6 +131,11 @@ y_tank = y_tank.T
|
||||||
# Compute RMS phase error relative to ideal reference across plotting bandwidth
|
# Compute RMS phase error relative to ideal reference across plotting bandwidth
|
||||||
(bw_ang, rms_ang_swp)=rms_v_bw(tf_r_ang-tf_r_ang_ideal, S.bw_plt)
|
(bw_ang, rms_ang_swp)=rms_v_bw(tf_r_ang-tf_r_ang_ideal, S.bw_plt)
|
||||||
(bw_mag, rms_gain_swp)=rms_v_bw(tf_r, S.bw_plt)
|
(bw_mag, rms_gain_swp)=rms_v_bw(tf_r, S.bw_plt)
|
||||||
|
tf_ang_rms=delta_rms(tf_r_ang, 2*np.pi/16)*180/np.pi
|
||||||
|
index_f0 = np.squeeze(np.argwhere(f.hz==28))
|
||||||
|
tf_gain_pm = gain_error(dB20(tf_r),index_f0)
|
||||||
|
tf_gain_rms = rms(dB20(tf_r), index_f0)
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
################################################################################
|
################################################################################
|
||||||
|
@ -181,9 +188,9 @@ if 1 in plot_list or 11 in plot_list:
|
||||||
ax1[0].plot(f.hz,dB20(tf))
|
ax1[0].plot(f.hz,dB20(tf))
|
||||||
ax1[1].plot(f.hz,ang_unwrap(tf))
|
ax1[1].plot(f.hz,ang_unwrap(tf))
|
||||||
|
|
||||||
ax1[0].set_title('Stage Gain Response')
|
ax1[0].set_title('Enhanced Gain Response')
|
||||||
ax1[0].set_ylabel('Gain (dB)')
|
ax1[0].set_ylabel('Gain (dB)')
|
||||||
ax1[1].set_title('Stage Phase Response')
|
ax1[1].set_title('Enhanced Phase Response')
|
||||||
ax1[1].set_ylabel('Phase (deg)')
|
ax1[1].set_ylabel('Phase (deg)')
|
||||||
|
|
||||||
for axT in ax1:
|
for axT in ax1:
|
||||||
|
@ -191,6 +198,9 @@ if 1 in plot_list or 11 in plot_list:
|
||||||
axT.set_xlabel('Freq (GHz)')
|
axT.set_xlabel('Freq (GHz)')
|
||||||
axT.set_xlim(f.hz_range)
|
axT.set_xlim(f.hz_range)
|
||||||
|
|
||||||
|
ax1[0].set_ylim(LPRDefaultPlotting.GAIN_FIXED_YLIM1)
|
||||||
|
|
||||||
|
|
||||||
[hT.tight_layout() for hT in h1]
|
[hT.tight_layout() for hT in h1]
|
||||||
if 11 in plot_list:
|
if 11 in plot_list:
|
||||||
for hT in h1:
|
for hT in h1:
|
||||||
|
@ -304,6 +314,49 @@ if 5 in plot_list:
|
||||||
#mgr.window.geometry(default_window_position[0])
|
#mgr.window.geometry(default_window_position[0])
|
||||||
[hT.show() for hT in h5]
|
[hT.show() for hT in h5]
|
||||||
|
|
||||||
|
if 7 in plot_list:
|
||||||
|
if not args.subplot:
|
||||||
|
h1 = [pp.figure() for x in range(2)]
|
||||||
|
ax1 = [hT.add_subplot(1,1,1) for hT in h1]
|
||||||
|
else:
|
||||||
|
h1 = [pp.figure() for x in range(1)]
|
||||||
|
ax1 = h1[0].subplots(2,1)
|
||||||
|
|
||||||
|
ax1[0].plot(f.hz,dB20(tf))
|
||||||
|
ax1[1].plot(f.hz,ang_unwrap(tf))
|
||||||
|
|
||||||
|
ax1[0].set_title('Non-Enhanced Gain Response')
|
||||||
|
ax1[0].set_ylabel('Gain (dB)')
|
||||||
|
ax1[1].set_title('Non-Enhanced Phase Response')
|
||||||
|
ax1[1].set_ylabel('Phase (deg)')
|
||||||
|
ax1[0].set_ylim(LPRDefaultPlotting.GAIN_FIXED_YLIM2)
|
||||||
|
|
||||||
|
for axT in ax1:
|
||||||
|
axT.grid()
|
||||||
|
axT.set_xlabel('Freq (GHz)')
|
||||||
|
axT.set_xlim(f.hz_range)
|
||||||
|
|
||||||
|
[hT.tight_layout() for hT in h1]
|
||||||
|
if 11 in plot_list:
|
||||||
|
for hT in h1:
|
||||||
|
LPRDefaultPlotting.figAnnotateCorner(hT,
|
||||||
|
'%g dB gain variation' % (gain_variation))
|
||||||
|
|
||||||
|
if args.save:
|
||||||
|
if args.subplot:
|
||||||
|
h1[0].savefig('%s/%s.%s' % (figdir,
|
||||||
|
'07d-ideal-AbsGainPhase', fig_ext))
|
||||||
|
else:
|
||||||
|
h1[0].savefig('%s/%s.%s' % (figdir,
|
||||||
|
'070-AbsGain', fig_ext))
|
||||||
|
h1[1].savefig('%s/%s.%s' % (figdir,
|
||||||
|
'071-AbsPhase', fig_ext))
|
||||||
|
if HEADLESS:
|
||||||
|
pp.close()
|
||||||
|
else:
|
||||||
|
#mgr.window.geometry(default_window_position[0])
|
||||||
|
[hT.show() for hT in h1]
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
if 2 in plot_list or 12 in plot_list:
|
if 2 in plot_list or 12 in plot_list:
|
||||||
if not args.subplot:
|
if not args.subplot:
|
||||||
|
@ -312,16 +365,51 @@ if 2 in plot_list or 12 in plot_list:
|
||||||
else:
|
else:
|
||||||
h2 = [pp.figure() for x in range(1)]
|
h2 = [pp.figure() for x in range(1)]
|
||||||
ax2 = h2[0].subplots(2,1)
|
ax2 = h2[0].subplots(2,1)
|
||||||
|
ax2 = np.append(ax2, ax2[0].twinx())
|
||||||
|
ax2 = np.append(ax2, ax2[1].twinx())
|
||||||
|
|
||||||
ax2[0].plot(f.hz,dB20(tf_r))
|
ax2[0].plot(f.hz,dB20(tf_r))
|
||||||
setLimitsTicks(ax2[0], dB20(tf_r), 6)
|
setLimitsTicks(ax2[0], dB20(tf_r), 6)
|
||||||
|
#ax2[2].plot(f.hz,tf_gain_pm)
|
||||||
|
ax2[2].plot(f.hz,tf_gain_rms)
|
||||||
|
|
||||||
ax2[1].plot(f.hz,ang_unwrap(tf_r.T).T)
|
ax2[1].plot(f.hz,ang_unwrap(tf_r.T).T)
|
||||||
|
ax2[3].plot(f.hz,tf_ang_rms)
|
||||||
setLimitsTicks(ax2[1], ang_unwrap(tf_r.T), 6)
|
setLimitsTicks(ax2[1], ang_unwrap(tf_r.T), 6)
|
||||||
|
|
||||||
ax2[0].set_title('Relative Gain')
|
ax2[0].set_title('Relative Gain')
|
||||||
ax2[0].set_ylabel('Gain (dB)')
|
ax2[0].set_ylabel('Gain (dB)')
|
||||||
|
ax2[2].set_ylabel('RMS Gain Error (dB)')
|
||||||
ax2[1].set_title('Relative Phase')
|
ax2[1].set_title('Relative Phase')
|
||||||
ax2[1].set_ylabel('Phase (deg)')
|
ax2[1].set_ylabel('Phase (deg)')
|
||||||
|
ax2[3].set_ylabel('RMS Error (deg)')
|
||||||
|
for axT in ax2[[2,3]]:
|
||||||
|
for axTLi,axTL in enumerate(axT.get_lines()):
|
||||||
|
axTL.set_linewidth(2.0)
|
||||||
|
axTL.set_color('black')
|
||||||
|
if axTLi == 0:
|
||||||
|
axTL.set_linestyle('-.')
|
||||||
|
else:
|
||||||
|
axTL.set_linestyle(':')
|
||||||
|
axT.grid()
|
||||||
|
|
||||||
|
ax2[0].set_ylim(LPRDefaultPlotting.GAIN_FIXED_YLIM3)
|
||||||
|
ax2[2].set_ylim(LPRDefaultPlotting.GAIN_FIXED_YLIM4)
|
||||||
|
|
||||||
|
ax2[2].set_ylim(ax2[0].get_ylim()/np.array(1)+4)
|
||||||
|
ax2[3].set_ylim((0,20))
|
||||||
|
|
||||||
|
marker_freq = 28.2
|
||||||
|
marker_point = np.argmin(np.abs(f.hz-marker_freq))
|
||||||
|
marker_height = tf_gain_pm[marker_point]
|
||||||
|
LPRDefaultPlotting.annotateArrow(ax2[2], marker_height, \
|
||||||
|
[marker_freq+0.05, marker_freq+0.25])
|
||||||
|
|
||||||
|
marker_freq = 28.39
|
||||||
|
marker_point = np.argmin(np.abs(f.hz-marker_freq))
|
||||||
|
marker_height = tf_ang_rms[marker_point]
|
||||||
|
LPRDefaultPlotting.annotateArrow(ax2[3], marker_height, \
|
||||||
|
[marker_freq+0.05, marker_freq+0.25])
|
||||||
|
|
||||||
for axT in ax2:
|
for axT in ax2:
|
||||||
axT.grid()
|
axT.grid()
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue