#pragma rtGlobals=1 // Use modern global access method. // This procedure is based on the File Access Demo in Matlab script written by Peter Kapusta, PicoQuant GmbH, September 2006 // Ported to IGOR Pro v.4+ by Matthew Sfeir, Brookhaven National Laboratory, August 2009 // This script reads the contents of a *.phd file and write all relevant information to the IGOR history area // It stores the data from each channel 0 - 7 in a separate wave, scaled appropriately to the instrument resolution // By default is produces a graph containing all waves with a log y scale // If using IGOR v. 6 and up, upgrade to new version of this procedure Function/S DoOpenPhdOldIGOR() Variable refNum String Ident, FormatVersion, CreatorName, CreatorVersion, FileTime String CRLF, Comment Variable NumberOfCurves, BitsPerHhistoBin, RoutingChannels, NumberOfBoards, ActiveCurve Variable MeasurementMode, SubMode, RangeNo, OffSet, Tacq, StopAt, StopOnOvfl Variable Restart, DispLinLog, DispTimeAxisFrom, DispTimeAxisTo, DispCountAxisFrom, DispCountAxisTo String message = "Select a file" String outputPath, fileHandle Open /D /R /T=".phd" /M=message refNum outputPath = S_fileName printf "%s\r" outputPath Open /R refNum as outputPath fileHandle = ParseFilePath(5, outputPath, ":", 0,0) fileHandle = ParseFilePath(3, outputPath, ":", 0,0) printf "%s\r" fileHandle // fileHandle = fileHandle + "_info" // NewNotebook /F=-1 /K=3 as fileHandle // DoWindow /K to kill notebook windows // Ascii file header FReadLine /N=16 refNum , Ident FreadLine /N=6 refNum, FormatVersion FreadLine /N=18 refNum, CreatorName FreadLine /N=12 refNum, CreatorVersion FreadLine /N=18 refNum, FileTime FreadLine /N=2 refNum, CRLF FreadLine /N=256 refNum, Comment printf " Ident: %s\r" Ident if (cmpstr(FormatVersion, "2.0")) printf "\r Warning: This program is for version 2.0 only. Aborted."; return outputPath else printf " Format verison: %s\r" FormatVersion endif printf " Creator Name: %s\r" CreatorName printf " Creator Version: %s\r" CreatorVersion printf " Time of Creation: %s\r" FileTime printf " Comment: %s\r" Comment printf "\r " // Binary file header FBinRead /F=3 refNum, NumberOfCurves FBinRead /F=3 refNum, BitsPerHhistoBin FBinRead /F=3 refNum, RoutingChannels FBinRead /F=3 refNum, NumberOfBoards FBinRead /F=3 refNum, ActiveCurve FBinRead /F=3 refNum, MeasurementMode FBinRead /F=3 refNum, SubMode FBinRead /F=3 refNum, RangeNo FBinRead /F=3 refNum, OffSet FBinRead /F=3 refNum, Tacq FBinRead /F=3 refNum, StopAt FBinRead /F=3 refNum, StopOnOvfl FBinRead /F=3 refNum, Restart FBinRead /F=3 refNum, DispLinLog FBinRead /F=3 refNum, DispTimeAxisFrom FBinRead /F=3 refNum, DispTimeAxisTo FBinRead /F=3 refNum, DispCountAxisFrom FBinRead /F=3 refNum, DispCountAxisTo printf " Number of Curves: %d\r" NumberOfCurves printf " Bits / HistoBin: %d\r" BitsPerHhistoBin printf " Routing Channels: %d\r" RoutingChannels printf " Number of Boards: %d\r" NumberOfBoards printf " Active Curve: %d\r" ActiveCurve printf " Measurement Mode: %d\r" MeasurementMode printf " Sub-Mode: %d\r" SubMode printf " Range No: %d\r" RangeNo printf " Offset: %d\r" OffSet printf " Acquisition Time: %d ms\r" Tacq printf " Stop At: %d\r" StopAt printf " Stop On Overflow: %d\r" StopOnOvfl printf " Restart: %d\r" Restart printf " Display Lin / Log: %d\r" DispLinLog printf " Time Axis From: %d\r" DispTimeAxisFrom printf " Time Axis To: %d\r" DispTimeAxisTo printf " Count Axis From: %d\r" DispCountAxisFrom printf " Count Axis To: %d\r" DispCountAxisTo ///////////// Variable i, DispCurveMapTo, DispCurveShow for(i=1;i<=8;i+=1) FBinRead /F=3 refNum, DispCurveMapTo FBinRead /F=3 refNum, DispCurveShow printf "-----------------------------------------\r" printf " Curve No: %d\r" i-1 printf " Map To: %d\r" DispCurveMapTo printf " Show: %d\r" DispCurveShow endfor ////////////// Variable j, ParamStart, ParamStep, ParamEnd for(j=1;j<=3;j+=1) FBinRead /F=3 refNum, ParamStart FBinRead /F=3 refNum, ParamStep FBinRead /F=3 refNum, ParamEnd printf "-----------------------------------------\r" printf " Parameter No: %d\r" j-1 printf " Start: %d\r" ParamStart printf " Step: %d\r" ParamStep printf " End: %d\r" ParamEnd endfor printf "-----------------------------------------\r" ////////////// Variable RepeatMode, RepeatsPerCurve, RepeatTIme, RepeatWaitTime String ScriptName FBinRead /F=3 refNum, RepeatMode printf " Repeat Mode: %d\r" RepeatMode FBinRead /F=3 refNum, RepeatsPerCurve printf " Repeat / Curve: %d\r" RepeatsPerCurve FBinRead /F=3 refNum, RepeatTIme printf " Repeat Time: %d\r" RepeatTIme FBinRead /F=3 refNum, RepeatWaitTime printf " Repeat Wait Time: %d\r" RepeatWaitTime FReadLine /N=20 refNum, ScriptName printf " Script Name: %s\r" ScriptName ////////////// Variable k String HardwareIdent, HardwareVersion Variable HardwareSerial, SyncDivider, CFDZeroCross0, CFDLevel0, CFDZeroCross1, CFDLevel1, Resolution Variable RouterModelCode, RouterEnabled, RtChan1_InputType, RtChan1_InputLevel, RtChan1_InputEdge Variable RtChan1_CFDPresent, RtChan1_CFDLevel, RtChan1_CFDZeroCross Variable RtChan2_InputType, RtChan2_InputLevel, RtChan2_InputEdge Variable RtChan2_CFDPresent, RtChan2_CFDLevel, RtChan2_CFDZeroCross Variable RtChan3_InputType, RtChan3_InputLevel, RtChan3_InputEdge Variable RtChan3_CFDPresent, RtChan3_CFDLevel, RtChan3_CFDZeroCross Variable RtChan4_InputType, RtChan4_InputLevel, RtChan4_InputEdge Variable RtChan4_CFDPresent, RtChan4_CFDLevel, RtChan4_CFDZeroCross for(k=1;k<=NumberOfBoards;k+=1) printf "-----------------------------------------\r" printf " Board No: %d\r" k-1 FReadLine /N=16 refNum, HardwareIdent printf " Hardware Indentifier: %s\r" HardwareIdent FReadLine /N=8 refNum, HardwareVersion printf " Hardware Indentifier: %s\r" HardwareVersion FBinRead /F=3 refNum, HardwareSerial printf " HW Serial Number: %d\r" HardwareSerial FBinRead /F=3 refNum, SyncDivider printf " Sync Divider: %d\r" SyncDivider FBinRead /F=3 refNum, CFDZeroCross0 printf " CFD 0 ZeroCross: %3d mV\r" CFDZeroCross0 FBinRead /F=3 refNum, CFDLevel0 printf " CFD 0 Discr: %3d mV\r" CFDLevel0 FBinRead /F=3 refNum, CFDZeroCross1 printf " CFD 1 Zero Cross: %3d mV\r" CFDZeroCross1 FBinRead /F=3 refNum, CFDLevel1 printf " CFD 1 Level: %3d mV\r" CFDLevel1 FBinRead /F=4 refNum, Resolution printf " Resolution: %2.6g ns\r" Resolution // below is in new format version 2.0 FBinRead /F=3 refNum, RouterModelCode FBinRead /F=3 refNum, RouterEnabled //Router Ch1 FBinRead /F=3 refNum, RtChan1_InputType FBinRead /F=3 refNum, RtChan1_InputLevel FBinRead /F=3 refNum, RtChan1_InputEdge FBinRead /F=3 refNum, RtChan1_CFDPresent FBinRead /F=3 refNum, RtChan1_CFDLevel FBinRead /F=3 refNum, RtChan1_CFDZeroCross //Router Ch1 FBinRead /F=3 refNum, RtChan2_InputType FBinRead /F=3 refNum, RtChan2_InputLevel FBinRead /F=3 refNum, RtChan2_InputEdge FBinRead /F=3 refNum, RtChan2_CFDPresent FBinRead /F=3 refNum, RtChan2_CFDLevel FBinRead /F=3 refNum, RtChan2_CFDZeroCross //Router Ch1 FBinRead /F=3 refNum, RtChan3_InputType FBinRead /F=3 refNum, RtChan3_InputLevel FBinRead /F=3 refNum, RtChan3_InputEdge FBinRead /F=3 refNum, RtChan3_CFDPresent FBinRead /F=3 refNum, RtChan3_CFDLevel FBinRead /F=3 refNum, RtChan3_CFDZeroCross //Router Ch4 FBinRead /F=3 refNum, RtChan4_InputType FBinRead /F=3 refNum, RtChan4_InputLevel FBinRead /F=3 refNum, RtChan4_InputEdge FBinRead /F=3 refNum, RtChan4_CFDPresent FBinRead /F=3 refNum, RtChan4_CFDLevel FBinRead /F=3 refNum, RtChan4_CFDZeroCross // Router settings are only meaningful for an existing router if (RouterModelCode > 0) printf "-----------------------------------------\r" printf " Router Model Code: %d\r" RouterModelCode printf " Router Enabled: %d\r" RouterEnabled printf "-----------------------------------------\r" // Router Ch1 printf " RtChan1 Input Type: %d\r" RtChan1_InputType printf " RtChan1 Input Level: %4d mV\r"RtChan1_InputLevel printf " RtChan1 Input Edge: %d\r" RtChan1_InputEdge printf " RtChan1 CFDPresent: %d\r" RtChan1_CFDPresent printf " RtChan1 CFDLevel: %4d mV\r" RtChan1_CFDLevel printf " RtChan1 CFDZeroCross: %4d mV\r" RtChan1_CFDZeroCross printf "-----------------------------------------\r" // Router Ch1 printf " RtChan1 Input Type: %d\r" RtChan2_InputType printf " RtChan1 Input Level: %4d mV\r"RtChan2_InputLevel printf " RtChan1 Input Edge: %d\r" RtChan2_InputEdge printf " RtChan1 CFDPresent: %d\r" RtChan2_CFDPresent printf " RtChan1 CFDLevel: %4d mV\r" RtChan2_CFDLevel printf " RtChan1 CFDZeroCross: %4d mV\r" RtChan2_CFDZeroCross printf "-----------------------------------------\r" // Router Ch1 printf " RtChan1 Input Type: %d\r" RtChan3_InputType printf " RtChan1 Input Level: %4d mV\r"RtChan3_InputLevel printf " RtChan1 Input Edge: %d\r" RtChan3_InputEdge printf " RtChan1 CFDPresent: %d\r" RtChan3_CFDPresent printf " RtChan1 CFDLevel: %4d mV\r" RtChan3_CFDLevel printf " RtChan1 CFDZeroCross: %4d mV\r" RtChan3_CFDZeroCross printf "-----------------------------------------\r" // Router Ch4 printf " RtChan4 Input Type: %d\r" RtChan4_InputType printf " RtChan4 Input Level: %4d mV\r"RtChan4_InputLevel printf " RtChan4 Input Edge: %d\r" RtChan4_InputEdge printf " RtChan4 CFDPresent: %d\r" RtChan4_CFDPresent printf " RtChan4 CFDLevel: %4d mV\r" RtChan4_CFDLevel printf " RtChan4 CFDZeroCross: %4d mV\r" RtChan4_CFDZeroCross printf "-----------------------------------------\r" endif endfor ////////////// // Headers for each histogram (curve) // Intialize temporary arrays (waves) ////////////// Make /D /N=(NumberOfCurves) /O CurveIndexWave Make /D /N=(NumberOfCurves) /O ResolutionWave Make /D /N=(NumberOfCurves) /O ChannelsWave Make /D /N=(NumberOfCurves) /O IntegralCountWave Make /D /N=(NumberOfCurves) /O DataOffsetWave Make /D /N=(NumberOfCurves) /O PeakWave Variable l Variable CurveIndex, TimeOfRecording, RoutingChannel, ExtDevices, MeasMode Variable P1, P2, P3, Channels, StopAfter, StopReason, InpRate0, InpRate1, HistCountRate Variable IntegralCount, IntegralCount2, Reserved, DataOffset, RtChan_InputType, RtChan_InputLevel, RtChan_InputEdge Variable RtChan_CFDPresent, RtChan_CFDLevel, RtChan_CFDZeroCross for(l=1;l<= NumberOfCurves;l+=1) FBinRead /F=3 refNum, CurveIndex printf "\r Curve Index: %d\r" CurveIndex CurveIndexWave[l-1] = CurveIndex FBinRead /F=3 /U refNum, TimeOfRecording /// The picoharp software saves the time of recording /// in a 32 bit serial time value a defined in all C libraries /// This equals the number of seconds elapsed since midnight /// (00:00:00) January 1, 1970, coordinated universal time. /// The conversion to normal date and time strings is tricky . . . /// Matlab uses days elapsed since Jan 1 0000 (719529 days to 1970) /// Igor uses seconds since 1/1/1904 (2082844800 to 1970) TimeOfRecording = TimeOfRecording+2082844800 printf " Time Of Recording: %s %s\r" Secs2Date(TimeOfRecording,-2), Secs2Time(TimeOfRecording,1) FReadLine /N=16 refNum, HardwareIdent printf " Hardware Identifier: %s\r" HardwareIdent FReadLine /N=8 refNum, HardwareVersion printf " Hardware Version: %s\r" HardwareVersion FBinRead /F=3 refNum, HardwareSerial printf " HW Serial Number: %d\r" HardwareSerial FBinRead /F=3 refNum, SyncDivider printf " Sync Divider: %d\r" SyncDivider FBinRead /F=3 refNum, CFDZeroCross0 printf " CFD 0 ZeroCross: %3d mV\r" CFDZeroCross0 FBinRead /F=3 refNum, CFDLevel0 printf " CFD 0 Discr: %3d mV\r" CFDLevel0 FBinRead /F=3 refNum, CFDZeroCross1 printf " CFD 1 Zero Cross: %3d mV\r" CFDZeroCross1 FBinRead /F=3 refNum, CFDLevel1 printf " CFD 1 Level: %3d mV\r" CFDLevel1 FBinRead /F=3 refNum, Offset printf " Offset: %d\r" Offset FBinRead /F=3 refNum, RoutingChannel printf " Routing Channel: %d\r" RoutingChannel FBinRead /F=3 refNum, ExtDevices printf " External Devices: %d\r" ExtDevices FBinRead /F=3 refNum, MeasMode printf " Measurement Mode: %d\r" MeasMode FBinRead /F=3 refNum, SubMode printf " Sub-Mode: %d\r" SubMode FBinRead /F=4 refNum, P1 printf " P1: %d\r" P1 FBinRead /F=4 refNum, P2 printf " P2: %d\r" P2 FBinRead /F=4 refNum, P3 printf " P3: %d\r" P3 FBinRead /F=3 refNum, RangeNo printf " Range No: %d\r" RangeNo FBinRead /F=4 refNum, Resolution printf " Resolution: %2.6g ns\r" Resolution ResolutionWave[l-1] = Resolution FBinRead /F=3 refNum, Channels printf " Channels: %d\r" Channels ChannelsWave[l-1] = Channels FBinRead /F=3 refNum, Tacq printf " Aquisition Time: %d ms\r" Tacq FBinRead /F=3 refNum, StopAfter printf " Stop After: %d ms\r" StopAfter FBinRead /F=3 refNum, StopReason printf " Stop Reason: %d\r" StopReason FBinRead /F=3 refNum, InpRate0 printf " Input Rate 0: %d Hz\r" InpRate0 FBinRead /F=3 refNum, InpRate1 printf " Input Rate 1: %d Hz\r" InpRate1 FBinRead /F=3 refNum, HistCountRate printf " Hist. Count Rate: %d cps\r" HistCountRate // IGOR doesn't support 64 bit integers // Provide workaround using 64 bit floating point // With an assist from John Weeks, WaveMetrics FBinRead /F=3/U refNum, IntegralCount FBinRead /F=3/U refNum, IntegralCount2 if(IntegralCount2 == 0) printf " Integral Count: %5.0f\r" IntegralCount IntegralCountWave[l-1] = IntegralCount else IntegralCount2 = IntegralCount2 * (2.^32) + IntegralCount printf " Integral Count: %5.0f\r" IntegralCount2 IntegralCountWave[l-1] = IntegralCount2 endif FBinRead /F=3 refNum, Reserved printf " Reserved: %d\r" Reserved FBinRead /F=3 refNum, DataOffset printf " Data Offset: %d\r" DataOffset DataOffsetWave[l-1] = DataOffset // below is new in format version 2.0 FBinRead /F=3 refNum, RouterModelCode FBinRead /F=3 refNum, RouterEnabled FBinRead /F=3 refNum, RtChan_InputType FBinRead /F=3 refNum, RtChan_InputLevel FBinRead /F=3 refNum, RtChan_InputEdge FBinRead /F=3 refNum, RtChan_CFDPresent FBinRead /F=3 refNum, RtChan_CFDLevel FBinRead /F=3 refNum, RtChan_CFDZeroCross if (RouterModelCode > 0) printf " Router Model Code: %d\r" RouterModelCode printf " Router Enabled: %d\r" RouterEnabled printf " RtChan1 Input Type: %d\r" RtChan_InputType printf " RtChan1 Input Level: %4d mV\r"RtChan_InputLevel printf " RtChan1 Input Edge: %d\r" RtChan_InputEdge printf " RtChan1 CFDPresent: %d\r" RtChan_CFDPresent printf " RtChan1 CFDLevel: %4d mV\r" RtChan_CFDLevel printf " RtChan1 CFDZeroCross: %4d mV\r" RtChan_CFDZeroCross endif endfor /////// Variable m, dumCount String dummy for(m=1; m <= NumberOfCurves; m+= 1) dummy = fileHandle + "_ch"+ num2str(m-1) dumCount = ChannelsWave[m-1] Make /D /O /N=(dumCount) $dummy SetScale /P x, 0, ResolutionWave[m-1], "Time (ns)", $dummy FSetPos refNum, DataOffsetWave[m-1] FBinRead /U /F=3 refNum, $dummy if(m-1 == 0) Display $dummy as fileHandle else AppendToGraph $dummy endif WaveStats $dummy PeakWave[m-1] = V_max endfor ModifyGraph log(left)=1 Legend/C/N=text0/F=0/S=1/A=MC /////// // Summary /////// Variable n printf "\r\r" printf "============================================\r" printf " SUMMARY \r" printf "============================================\r" printf " Curve Channel Number Of Peak Integral \r" printf " index resolution channels count count \r" printf "============================================\r" for(n=1; n<=NumberOfCurves; n+=1) printf " %3d %2.6g %10d %10d %10.0f \r" CurveIndexWave[n-1], ResolutionWave[n-1], ChannelsWave[n-1], PeakWave[n-1], IntegralCountWave[n-1] endfor printf "============================================\r" // Clean up temporary waves. Uncomment for debugging purposes KillWaves /Z CurveIndexWave, ResolutionWave, ChannelsWave, IntegralCountWave, DataOffsetWave, PeakWave // Close refNum return outputPath // End Menu "Load Waves" "Load PicoHarp *.phd Data...", DoOpenPhdOldIGOR() End