Skip to content

Commit 716f021

Browse files
committed
changes
1 parent 09ba5cb commit 716f021

8 files changed

+425
-245
lines changed

Packages/MIES/MIES_Constants.ipf

+7
Original file line numberDiff line numberDiff line change
@@ -2311,3 +2311,10 @@ Constant SUTTER_MAX_MAX_TP_PULSES = 10000
23112311
Constant INVALID_SWEEP_NUMBER = -1
23122312

23132313
StrConstant PERCENT_F_MAX_PREC = "%.15f"
2314+
2315+
// If this constant with dimLabels is changed the following functions should be verified:
2316+
//
2317+
// TP_TSAnalysis
2318+
// GetTPResultAsyncBuffer
2319+
// GetTPResults (reuses same dimlabels partially)
2320+
StrConstant TP_ANALYSIS_DATA_LABELS = "BASELINE;STEADYSTATERES;INSTANTRES;ELEVATED_SS;ELEVATED_INST;NOW;HEADSTAGE;MARKER;NUMBER_OF_TP_CHANNELS;TIMESTAMP;TIMESTAMPUTC;CLAMPMODE;CLAMPAMP;BASELINEFRAC;CYCLEID;TPLENGTHPOINTSADC;PULSELENGTHPOINTSADC;PULSESTARTPOINTSADC;SAMPLINGINTERVALADC;TPLENGTHPOINTSDAC;PULSELENGTHPOINTSDAC;PULSESTARTPOINTSDAC;SAMPLINGINTERVALDAC;"

Packages/MIES/MIES_MiesUtilities_Conversion.ipf

+12
Original file line numberDiff line numberDiff line change
@@ -270,3 +270,15 @@ Function MapAnaFuncToConstant(anaFunc)
270270
#endif
271271
endswitch
272272
End
273+
274+
/// @brief returns the unit string for the AD channel depending in clampmode
275+
Function/S GetADChannelUnit(variable clampMode)
276+
277+
return SelectString(clampMode == V_CLAMP_MODE, "mV", "pA")
278+
End
279+
280+
/// @brief returns the unit string for the DA channel depending in clampmode
281+
Function/S GetDAChannelUnit(variable clampMode)
282+
283+
return SelectString(clampMode == V_CLAMP_MODE, "pA", "mV")
284+
End

Packages/MIES/MIES_Oscilloscope.ipf

+24-17
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ Function SCOPE_UpdateOscilloscopeData(device, dataAcqOrTP, [chunk, fifoPos, devi
479479

480480
STRUCT TPAnalysisInput tpInput
481481
variable i, j
482-
variable tpChannels, numADCs, numDACs, tpLengthPoints, tpStart, tpEnd, tpStartPos
482+
variable tpChannels, numADCs, numDACs, tpLengthPointsADC, tpStart, tpEnd, tpStartPos
483483
variable TPChanIndex, saveTP, clampAmp
484484
variable headstage, fifoLatest, channelIndex
485485
string hsList
@@ -530,10 +530,10 @@ Function SCOPE_UpdateOscilloscopeData(device, dataAcqOrTP, [chunk, fifoPos, devi
530530
WAVE TPSettings = GetTPSettings(device)
531531
WAVE TPSettingsCalc = GetTPSettingsCalculated(device)
532532

533-
tpLengthPoints = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%totalLengthPointsTP_ADC] : TPSettingsCalc[%totalLengthPointsDAQ_ADC]
533+
tpLengthPointsADC = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%totalLengthPointsTP_ADC] : TPSettingsCalc[%totalLengthPointsDAQ_ADC]
534534

535535
// use a 'virtual' end position for fifoLatest for TP Mode since the input data contains one TP only
536-
fifoLatest = (dataAcqOrTP == TEST_PULSE_MODE) ? tpLengthPoints : fifoPos
536+
fifoLatest = (dataAcqOrTP == TEST_PULSE_MODE) ? tpLengthPointsADC : fifoPos
537537

538538
WAVE ADCs = GetADCListFromConfig(config)
539539
WAVE DACs = GetDACListFromConfig(config)
@@ -544,33 +544,40 @@ Function SCOPE_UpdateOscilloscopeData(device, dataAcqOrTP, [chunk, fifoPos, devi
544544
numADCs = DimSize(ADCs, ROWS)
545545

546546
// note: currently this works for multiplier = 1 only, see DC_PlaceDataInDAQDataWave
547-
Make/FREE/N=(tpLengthPoints) channelData
547+
Make/FREE/N=(tpLengthPointsADC) channelData
548548
WAVE tpInput.data = channelData
549549

550-
tpInput.device = device
551-
tpInput.duration = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%pulseLengthPointsTP_ADC] : TPSettingsCalc[%pulseLengthPointsDAQ_ADC]
552-
tpInput.baselineFrac = TPSettingsCalc[%baselineFrac]
553-
tpInput.tpLengthPoints = tpLengthPoints
554-
tpInput.readTimeStamp = ticks * TICKS_TO_SECONDS
555-
tpInput.activeADCs = tpChannels
556-
557-
tpStart = trunc(fifoPosGlobal / tpLengthPoints)
558-
tpEnd = trunc(fifoLatest / tpLengthPoints)
550+
tpInput.device = device
551+
tpInput.tpLengthPointsADC = tpLengthPointsADC
552+
tpInput.pulseLengthPointsADC = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%pulseLengthPointsTP_ADC] : TPSettingsCalc[%pulseLengthPointsDAQ_ADC]
553+
tpInput.pulseStartPointsADC = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%pulseStartPointsTP_ADC] : TPSettingsCalc[%pulseStartPointsDAQ_ADC]
554+
tpInput.samplingIntervalADC = DimDelta(scaledDataWave[numDACs], ROWS)
555+
tpInput.tpLengthPointsDAC = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%totalLengthPointsTP] : TPSettingsCalc[%totalLengthPointsDAQ]
556+
tpInput.pulseLengthPointsDAC = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%pulseLengthPointsTP] : TPSettingsCalc[%pulseLengthPointsDAQ]
557+
tpInput.pulseStartPointsDAC = (dataAcqOrTP == TEST_PULSE_MODE) ? TPSettingsCalc[%pulseStartPointsTP] : TPSettingsCalc[%pulseStartPointsDAQ]
558+
tpInput.samplingIntervalDAC = DimDelta(scaledDataWave[0], ROWS)
559+
tpInput.baselineFrac = TPSettingsCalc[%baselineFrac]
560+
tpInput.readTimeStamp = ticks * TICKS_TO_SECONDS
561+
tpInput.activeADCs = tpChannels
562+
tpInput.cycleId = ROVAR(GetTestpulseCycleID(device))
563+
564+
tpStart = trunc(fifoPosGlobal / tpLengthPointsADC)
565+
tpEnd = trunc(fifoLatest / tpLengthPointsADC)
559566
ASSERT(tpStart <= tpEnd, "New fifopos is smaller than previous fifopos")
560567
Make/FREE/D/N=(tpEnd - tpStart) tpMarker
561568
NewRandomSeed()
562569
tpMarker[] = GetUniqueInteger()
563570

564571
DEBUGPRINT("tpChannels: ", var = tpChannels)
565-
DEBUGPRINT("tpLength: ", var = tpLengthPoints)
572+
DEBUGPRINT("tpLength: ", var = tpLengthPointsADC)
566573

567574
for(i = tpStart; i < tpEnd; i += 1)
568575

569576
tpInput.measurementMarker = tpMarker[i - tpStart]
570-
tpStartPos = i * tpLengthPoints
577+
tpStartPos = i * tpLengthPointsADC
571578

572579
if(saveTP)
573-
Make/FREE/N=(tpLengthPoints, tpChannels) StoreTPWave
580+
Make/FREE/N=(tpLengthPointsADC, tpChannels) StoreTPWave
574581
for(j = 0; j < tpChannels; j += 1)
575582
WAVE scaledChannel = scaledDataWave[numDACs + j]
576583
Multithread StoreTPWave[][j] = scaledChannel[tpStartPos + p]
@@ -626,7 +633,7 @@ Function SCOPE_UpdateOscilloscopeData(device, dataAcqOrTP, [chunk, fifoPos, devi
626633
endfor
627634

628635
if(dataAcqOrTP == DATA_ACQUISITION_MODE && tpEnd > tpStart)
629-
tpStartPos = (tpEnd - 1) * tpLengthPoints
636+
tpStartPos = (tpEnd - 1) * tpLengthPointsADC
630637
if(DAG_GetNumericalValue(device, "check_settings_show_power"))
631638
WAVE tpOsciForPowerSpectrum = GetScaledTPTempWave(device)
632639
Make/FREE/D/N=(numADCs) tpColumns

Packages/MIES/MIES_Publish.ipf

+84
Original file line numberDiff line numberDiff line change
@@ -645,3 +645,87 @@ Function PUB_AccessResistanceSmoke(string device, variable sweepNo, variable hea
645645

646646
PUB_Publish(jsonID, ANALYSIS_FUNCTION_AR)
647647
End
648+
649+
threadsafe static Function PUB_AddTPResultEntry(variable jsonId, string path, variable value, string unit)
650+
651+
JSON_AddTreeObject(jsonID, path)
652+
JSON_AddVariable(jsonID, path + "/value", value)
653+
if(!IsEmpty(unit))
654+
JSON_AddString(jsonID, path + "/unit", unit)
655+
endif
656+
End
657+
658+
threadsafe Function PUB_TPResult(STRUCT TPZMQData &tpzmq)
659+
660+
string path
661+
variable jsonId = JSON_New()
662+
string adUnit = GetADChannelUnit(tpzmq.clampMode)
663+
string daUnit = GetDAChannelUnit(tpzmq.clampMode)
664+
665+
path = "properties"
666+
JSON_AddTreeObject(jsonID, path)
667+
JSON_AddVariable(jsonID, path + "/tp marker", tpzmq.marker)
668+
JSON_AddString(jsonID, path + "/device", tpzmq.device)
669+
JSON_AddVariable(jsonID, path + "/headstage", tpzmq.headstage)
670+
JSON_AddVariable(jsonID, path + "/clamp mode", tpzmq.clampMode)
671+
672+
PUB_AddTPResultEntry(jsonId, path + "/time of tp acquisition", tpzmq.now, "s")
673+
PUB_AddTPResultEntry(jsonId, path + "/clamp amplitude", tpzmq.clampAmp, daUnit)
674+
PUB_AddTPResultEntry(jsonId, path + "/tp length ADC", tpzmq.tpLengthPointsADC, "points")
675+
PUB_AddTPResultEntry(jsonId, path + "/pulse duration ADC", tpzmq.pulseLengthPointsADC, "points")
676+
PUB_AddTPResultEntry(jsonId, path + "/pulse start point ADC", tpzmq.pulseStartPointsADC, "point")
677+
PUB_AddTPResultEntry(jsonId, path + "/sample interval ADC", tpzmq.samplingIntervalADC, "ms")
678+
PUB_AddTPResultEntry(jsonId, path + "/tp length DAC", tpzmq.tpLengthPointsDAC, "points")
679+
PUB_AddTPResultEntry(jsonId, path + "/pulse duration DAC", tpzmq.pulseLengthPointsDAC, "points")
680+
PUB_AddTPResultEntry(jsonId, path + "/pulse start point DAC", tpzmq.pulseStartPointsDAC, "point")
681+
PUB_AddTPResultEntry(jsonId, path + "/sample interval DAC", tpzmq.samplingIntervalDAC, "ms")
682+
PUB_AddTPResultEntry(jsonId, path + "/baseline fraction", tpzmq.baselineFrac * ONE_TO_PERCENT, "%")
683+
PUB_AddTPResultEntry(jsonId, path + "/timestamp", tpzmq.timeStamp, "s")
684+
PUB_AddTPResultEntry(jsonId, path + "/timestampUTC", tpzmq.timeStampUTC, "s")
685+
PUB_AddTPResultEntry(jsonId, path + "/tp cycle id", tpzmq.cycleId, "")
686+
687+
path = "results"
688+
JSON_AddTreeObject(jsonID, path)
689+
PUB_AddTPResultEntry(jsonId, path + "/average baseline steady state", tpzmq.avgBaselineSS, adUnit)
690+
PUB_AddTPResultEntry(jsonId, path + "/average tp steady state", tpzmq.avgTPSS, adUnit)
691+
PUB_AddTPResultEntry(jsonId, path + "/instantaneous", tpzmq.instVal, adUnit)
692+
PUB_AddTPResultEntry(jsonId, path + "/steady state resistance", tpzmq.resistanceSS, "MΩ")
693+
PUB_AddTPResultEntry(jsonId, path + "/instantaneous resistance", tpzmq.resistanceInst, "MΩ")
694+
695+
PUB_Publish(jsonID, ZMQ_FILTER_TPRESULT_NOW, releaseJSON = 0)
696+
if(PUB_CheckPublishingTime(ZMQ_FILTER_TPRESULT_1S, 1))
697+
PUB_Publish(jsonID, ZMQ_FILTER_TPRESULT_1S, releaseJSON = 0)
698+
endif
699+
if(PUB_CheckPublishingTime(ZMQ_FILTER_TPRESULT_5S, 5))
700+
PUB_Publish(jsonID, ZMQ_FILTER_TPRESULT_5S, releaseJSON = 0)
701+
endif
702+
if(PUB_CheckPublishingTime(ZMQ_FILTER_TPRESULT_10S, 10))
703+
PUB_Publish(jsonID, ZMQ_FILTER_TPRESULT_10S, releaseJSON = 0)
704+
endif
705+
JSON_Release(jsonID)
706+
End
707+
708+
/// @brief Updates the publishing timestamp in the TUFXOP storage and returns 1 if an update is due (0 otherwise)
709+
threadsafe static Function PUB_CheckPublishingTime(string pubFilter, variable period)
710+
711+
variable curTime
712+
713+
TUFXOP_AcquireLock/N=(pubFilter)
714+
TUFXOP_GetStorage/Z/Q/N=(pubFilter) lastUpdated
715+
if(V_flag)
716+
TUFXOP_Init/N=(pubFilter)
717+
TUFXOP_GetStorage/Z/N=(pubFilter) lastUpdated
718+
Make/FREE/D dTime = {DateTime}
719+
lastUpdated[0] = dTime
720+
endif
721+
curTime = DateTime
722+
WAVE lastTime = lastUpdated[0]
723+
if(lastTime[0] + period > curTime)
724+
lastTime[0] = curTime + period
725+
TUFXOP_ReleaseLock/N=(pubFilter)
726+
return 1
727+
endif
728+
TUFXOP_ReleaseLock/N=(pubFilter)
729+
730+
return 0
731+
End

Packages/MIES/MIES_Structures.ipf

+36-2
Original file line numberDiff line numberDiff line change
@@ -306,16 +306,50 @@ Structure TPAnalysisInput
306306
WAVE data
307307
variable clampAmp
308308
variable clampMode
309-
variable duration // [points]
309+
variable tpLengthPointsADC
310+
variable pulseLengthPointsADC
311+
variable pulseStartPointsADC
312+
variable samplingIntervalADC
313+
variable tpLengthPointsDAC
314+
variable pulseLengthPointsDAC
315+
variable pulseStartPointsDAC
316+
variable samplingIntervalDAC
310317
variable baselineFrac
311-
variable tpLengthPoints
312318
variable readTimeStamp
313319
variable hsIndex
314320
string device
315321
variable measurementMarker
316322
variable activeADCs
317323
variable timeStamp
318324
variable timeStampUTC
325+
variable cycleId
326+
EndStructure
327+
328+
/// @brief Helper structure for TP data transfer to zeromq
329+
Structure TPZMQData
330+
variable marker
331+
string device
332+
variable headstage
333+
variable now
334+
variable clampMode
335+
variable clampAmp
336+
variable tpLengthPointsADC
337+
variable pulseLengthPointsADC
338+
variable pulseStartPointsADC
339+
variable samplingIntervalADC
340+
variable tpLengthPointsDAC
341+
variable pulseLengthPointsDAC
342+
variable pulseStartPointsDAC
343+
variable samplingIntervalDAC
344+
variable baselineFrac
345+
variable timeStamp
346+
variable timeStampUTC
347+
variable cycleId
348+
variable avgBaselineSS
349+
variable avgTPSS
350+
variable instVal
351+
variable resistanceSS
352+
variable resistanceInst
319353
EndStructure
320354

321355
/// @brief Helper structure for GetPlotArea()

Packages/MIES/MIES_SweepFormula.ipf

+3-3
Original file line numberDiff line numberDiff line change
@@ -3027,9 +3027,9 @@ static Function/WAVE SF_OperationTPImpl(string graph, WAVE/WAVE mode, WAVE/Z sel
30273027

30283028
// Assemble TP data
30293029
WAVE tpInput.data = SF_AverageTPFromSweep(epochMatches, sweepData)
3030-
tpInput.tpLengthPoints = DimSize(tpInput.data, ROWS)
3031-
tpInput.duration = (str2num(epochTPPulse[0][EPOCH_COL_ENDTIME]) - str2num(epochTPPulse[0][EPOCH_COL_STARTTIME])) * ONE_TO_MILLI / DimDelta(sweepData, ROWS)
3032-
tpInput.baselineFrac = TP_CalculateBaselineFraction(tpInput.duration, tpInput.duration + 2 * tpBaseLinePoints)
3030+
tpInput.tpLengthPointsADC = DimSize(tpInput.data, ROWS)
3031+
tpInput.pulseLengthPointsADC = (str2num(epochTPPulse[0][EPOCH_COL_ENDTIME]) - str2num(epochTPPulse[0][EPOCH_COL_STARTTIME])) * ONE_TO_MILLI / DimDelta(sweepData, ROWS)
3032+
tpInput.baselineFrac = TP_CalculateBaselineFraction(tpInput.pulseLengthPointsADC, tpInput.pulseLengthPointsADC + 2 * tpBaseLinePoints)
30333033

30343034
[WAVE settings, settingsIndex] = GetLastSettingChannel(numericalValues, textualValues, sweepNo, CLAMPMODE_ENTRY_KEY, dacChannelNr, XOP_CHANNEL_TYPE_DAC, DATA_ACQUISITION_MODE)
30353035
SFH_ASSERT(WaveExists(settings), "Failed to retrieve TP Clamp Mode from LBN")

0 commit comments

Comments
 (0)