I have an question
How the INL test performed?
- startup time / stabilization etc.
- steps sequence
- measurement equipment settings
- PC post processing.
- timing
- logging information - temperature , at which point to sense temeprature, humidity, atmospheric pressure
To many questions. Isn't it? :-) 
To answer the last question first: no

startup time: ~220s
stabilization: 45s settling of 4th order LPF (postprocessed), ~400s measurement / ~4500 values for each step (as 3458A is slower than ADC, only every 2nd ADC cycle is captured quasi isochronously)
steps sequence for +-11V (see attached charts): 500mV steps (~440mV @ input), 4x ramp down & ramp up (8 ramps), +-1.1V/-300mV: 10mV/1mV steps 1x ramp down & ramp up (2 ramps)
Settings 3458A (connected to the input of ADC):
PRESET FAST
DCV {int(range)} #10V or 1V, depending on range of source (constant over one run)
AZERO ON
TARM HOLD
TRIG SYN # only capture data on read
NPLC {int(nplc)}
FIXEDZ OFF
ARANGE OFF
NRDGS 1,SYN
MEM OFF
END ALWAYS
DELAY 0
TARM SYN # only capture data on read
Settings K236/7/8:
F0,0XB{float(Source.start_value)/1000:7f},{Source.range_set},0X # Function: F0,0 = source V, B: Range setting 0 = Auto, 1 = 1V/nA, 2 = 10V/nA, 3 = 100V/nA, delay = 0 in ms
H0X # only with immediate trigger it sets the output
N1X # N1 = operate
O0P0Z0S3W0L10E-3,8X # other settings O0 = local, O1= remote sense, P5 = Filter 5 = 32 readings, Z0 = suppression disabled, S3 = 50Hz 20ms integration time, W0 = disable default delay, L compliance 0=auto range
Settings ADC:
[init()] #reset, initialise & gain corrections (k factors)
A # mode: A=AZ
[run-up] # run-up version W, Q, ...
[input_ch] # input channel of mux (0..7)
Post-processsing for one staircase is as follows (excerpt):
- Linear regression for dmm & adc
- Scaling adc from slope ratio of both regressions (gain normalization)
- Offset correction for adc
- Diffs between adc & dmm on a per sample basis gives INL (correlated)
- Aggregation of n Diffs to one point for INL
From the results of the single staircases (e.g. 8 ), the outliers are sorted out and the remaining good staircases are aggregated for final chart
Timing between 3458A and ADC is quasi isochronously, so we get correlated value pairs (triples for ADC AZ), see
details in former post.
Side-note: this was a major development task, with all the oddities of UART-to-USB-adapters, incorporating a PLL and much more little things you never dreamed of and gets you nightmares...
Temperature (humidity, atmospheric pressure) is usually stable enough for one staircase (usually <0.1°C - lab is in basement), limiting is probably most the drift/LF noise of the LM399.
excerpt of the python code to generate staircase e.g. +-11V:
src_set_values = collections.deque() # list of values for voltage source (K236/7/8), each value for one ADC cycle
# +-11V
range_set = int(2) # range of K236/7/8 - 1: 1V, 2: 10V, 3: 100V, 4: 1000V
factor = int(10**(int(2-range_set))) # multiply start/stop value for stepping in range: 1: *10, 2: *1, 3: *0.1 = *10^(2-[range])
stop_value = int(12500) # gives ~11V on ADC input due to 4th order LPF (4x2x1kΩ, 4x220µF)
stop_value_range = int(stop_value*factor) # max value in range-steps of K236/7/8, for 10V range: factor = 1 (see factor)
#Staircase +-11V
for _ in range(5000): # 5000 * ADC cycletime initial value (~220s +11V)
src_set_values.append(stop_value_range/(1000*factor))
step = int(500)
repeats = 2
for _ in range(4): # generate staircase with steps of 500mV with 2x500 values for each step (440s) going from +11V .. -11V .. +11V repeated 4 times
for i in range(stop_value_range - step, - (stop_value_range + 1), -step):
for _ in range(repeats*step): src_set_values.append(i/(1000*factor))
for i in range(-(stop_value_range - step), stop_value_range + 1, step):
for _ in range(repeats*step): src_set_values.append(i/(1000*factor))
src_set_values.append(0) # set source to 0V
Test-Setup (old picture, cable to 3458A not installed):
