4Misc_Start xHH@Rg(HH(dh 4:4IGOR'HHR@@(& com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket com.apple.print.DocumentTicket.PMSpoolFormat com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.DocumentTicket.PMSpoolFormat application/pdf com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorMatchingMode com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorMatchingMode 0 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorSyncProfileID com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorSyncProfileID 1580 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopies com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopies 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMFirstPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMFirstPage 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMLastPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMLastPage 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMPageRange com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMPageRange 1 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PrintSettingsTicket xHH@Rg(HH(dh 4:4IGOR'HHR@@(& com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket com.apple.print.DocumentTicket.PMSpoolFormat com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.DocumentTicket.PMSpoolFormat application/pdf com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorMatchingMode com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorMatchingMode 0 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorSyncProfileID com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorSyncProfileID 1580 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopies com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopies 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMFirstPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMFirstPage 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMLastPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMLastPage 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMPageRange com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMPageRange 1 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PrintSettingsTicket xHH@Rg(HH(dh 4:4IGOR'HHR@@(& com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket com.apple.print.DocumentTicket.PMSpoolFormat com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.DocumentTicket.PMSpoolFormat application/pdf com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorMatchingMode com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorMatchingMode 0 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorSyncProfileID com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorSyncProfileID 1580 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopies com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopies 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMFirstPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMFirstPage 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMLastPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMLastPage 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMPageRange com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMPageRange 1 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PrintSettingsTicket x HH@Rg(HH(dh 4:4 IGOR'HHR@@(& com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 734 576 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -18 -18 774 594 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator com.apple.print.pm.PostScript com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName US Letter com.apple.print.ticket.client com.apple.print.pm.PostScript com.apple.print.ticket.modDate 2003-07-01T17:49:36Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket com.apple.print.DocumentTicket.PMSpoolFormat com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.DocumentTicket.PMSpoolFormat application/pdf com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorMatchingMode com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorMatchingMode 0 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMColorSyncProfileID com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorSyncProfileID 1580 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopies com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopies 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopyCollate com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMFirstPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMFirstPage 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMLastPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMLastPage 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMPageRange com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMPageRange 1 2147483647 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2005-12-13T19:34:09Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PrintSettingsTicket ^Graph*@@?ێ88?ڪWDashSettings#  !0{Normal@ Geneva<HHHH$$0{Normal@ Geneva<HHHH$$4444440 2Normal@ Geneva<HHHH$$4 4 4 4 4 4 homeId Macintosh HD:Users:msailor:Documents:Data:V Macintosh HDH+ Data :D DocumentsU : Qz)Macintosh HD:Users:msailor:Documents:Data Data Macintosh HDUsers/msailor/Documents/Data/tDataFiles@xd+eMacintosh HD:Users:msailor:Documents:Papers:2008 nano-toilet (orosco):SLIM data:CCD data: Macintosh HDH++eCCD data+eęC> SLIM dataU ę+e QzXMacintosh HD:Users:msailor:Documents:Papers:2008 nano-toilet (orosco):SLIM data:CCD dataCCD data Macintosh HDKUsers/msailor/Documents/Papers/2008 nano-toilet (orosco)/SLIM data/CCD data/ 4Misc_EndXOPState_StartANOVASupport Qz8?ڪData Browser :msailor:DocumenGizmoa:@) !|Surface Plotterurces/PrintCore.XLLoadWave0 InterpolateAD4011C44XOPState_EndOlBsEiqD6(FCnticksLastA fps<^tryFPS?U) UĄGCleanUpFilesA_poly0@uXKA_poly1?wx&1A_poly2>`ƌB_poly0@uhr B_poly1?ؘ_GB_poly2ˤicV_Flag?V_npnts?V_numNaNsV_numINFsV_avg@ ~V_sdevV_rms@ ~V_minlocV_min@ ~V_maxlocV_max@ ~V_adevV_skewV_kurtV_minChunkLocV_maxChunkLocV_minLayerLocV_maxLayerLocV_maxRowLocV_minRowLocV_maxColLocV_minColLocV_PeakLoc@V_PeakVal?`8pZV_LeadingEdgeLoc@(kV_TrailingEdgeLoc@V_PeakWidth@HcV_nterms@V_nheldV_chisq?5Q\V_qV_RabV_PrV_sigaV_sigbGPeakWidth@;GStartTimeA GTimeBetweenSpectra@V_period@NV_nextRunA4V_filePosV_logEOF@$GFileSuccessfullyLoaded?V_fitOptions@GCal_NumberGxStart@GxEnd@LGIntensity@YuFactory_poly0@uhr Factory_poly1?ؘ_GFactory_poly2ˤicGCursorAPoint@sGCursorBPoint@GNumber_of_files_to_load@$GNumber_of_files_loadedGNumber_of_Files@$GLoad_all_spectraGNumber_of_files_ignored@"GCursorAPoint_spectrum@sGCursorBPoint_spectrum@xGCursorAPoint_FFT@a@GCursorBPoint_FFT@g GSpectrumBuffer@YGSpectrumBufferSize@9Gheaderlines@3GCurrentSpectrumTimeA'6GLimits?GFFTResolution@GFFTWindowing@GCursorA_FFT@j$ GCursorB_FFT@ټJGPeakWavelength@GEOT@m., V_Sum@ ~V_startRowV_endRowV_LevelX@\hh.V_startColV_endColGThresholdGSlowModeGnmErrorGWavelengthError?GAmplitudeErrorGIntensityError@ GWavelengthErrorThresholdGPeakEOTGFFTWidth@YGEOTError?ۨO DGFFTPeakWidth@@GSpectrumFrequencyGnAir?GnPSi?fffffgGPorosity?) `GThickness@ikGnFill?)^GEOT1@m., GEOT2@ KGmodeTGaussianGCCDT.ScopeGWavelengthTypeT NanometersGFilenamehTypeT3a_eth.Master.ScopeS_pathmehTypeTYMacintosh HD:Users:msailor:Documents:Papers:2008 nano-toilet (orosco):SLIM data:CCD data:S_fileNameTypeT liftoff.txtS_waveNamesypeTwave0;wave1;wave2;wave3;S_valuemesypeT UpdateFPS()+UpdateSpectrum()GSaveSpectrapeTYesS_infoectrapeTPATH:home;WRITEABLE:0;GLabview_VI_NameT "Fringes7.vi"GMonitorPeakShiftTNoGShowFFTeakShiftTSpectrumGDeleteOriginalsTNoGShowSpectraalsT from now onGSpectrumNamelsT3a_ethGFolderNameelsTCCD dataGMonitorSpectrumModeTspectrumGWhatToMonitormModeTpeak intensityGMonitorUnitsmModeT EOT (2nL, nm)GDisplayedSpectrumNameT3a_ethGLoadTypeSpectrumNameT.ScopeGFill_LiquidctrumNameTEthanol KillWaves/A/Z @@~`Wavelength?ğğ@ug =p@umQ@us33333@uyGz@u\(@uGz@u\(@up >@uQ@u@uQ@u@uzH@u\(@u =p@u\(@u =p@uR@u@uR@u@uzG@u(\@uzG@u(\@u=p @vQ@v =p @vQ@vffffg@vzG@v"ffffg@v(zG@v.\(@v4zG@v:\(@v@ =q@vF\(@vL =q@vRQ@vX =q@v^Q@vd@vjQ@vp@vvG{@v|@vG{@v\)@vG{@v\)@v =p@v\)@v =p@vQ@v =p@vQ@v =p@vQ@v33333@vQ@v33333@vQ@v33333@vGz@v33333@vGz@v33333@wGz@w33333@w Gz@w33333@wGz@w\(@w%Gz@w+\(@w1Gz@w7\(@w=Gz@wC\(@wIGz@wO\(@wUGz@w[\(@waGz@wg\(@wmGz@ws\(@wyGz@w\(@wGz@w\(@wGz@w\(@wGz@w\(@wGz@w\(@wGz@w33333@wGz@w33333@wGz@w33333@wGz@w33333@wQ@w33333@wQ@w33333@wQ@x33333@x Q@x =p@xQ@x =p@x \)@x' =p@x,\)@x3 =p@x8\)@x>G{@xD\)@xJG{@xP@xVG{@x\@xbQ@xh@xnQ@xt =q@xzQ@x =q@x\(@x =q@x\(@xzG@xffffg@xzG@xffffg@xQ@xffffg@xQ@x=p @x(\@x=p @x(\@xzG@x@xzG@x@xR@x =p@xR@y =p@y \(@yzH@y\(@yzH@y!@y'Q@y-p >@y3Q@y9p >@y?\(@yEGz@yK33333@yQQ@yW33333@y]Q@yc =p@yh\)@ynG{@yt@yzG{@y@yQ@y =q@y\(@yzG@yffffg@yzG@yffffg@yQ@y=p @y(\@yzG@y@yR@y =p@y\(@y߮zH@y\(@yzH@y񙙙@yQ@yp >@z\(@z Gz@z33333@zQ@z =p@z \)@z&G{@z,@z2Q@z8 =q@z>\(@zDzG@zJffffg@zPQ@zV=p @z\(\@zbzG@zh@zmR@zs =p@zy\(@zzH@z@zQ@zp >@z\(@zGz@z33333@zQ@z =p@z\)@zG{@z =q@zƏ\(@zzG@zffffg@zQ@z=p @z(\@zzG@z@zR@zzH@{@{Q@{ p >@{\(@{Gz@{33333@{%Q@{*G{@{0@{6Q@{< =q@{B\(@{HzG@{N=p @{T(\@{ZzG@{`@{eR@{kzH@{q@{wQ@{}p >@{\(@{Q@{ =p@{\)@{G{@{@{\(@{zG@{ffffg@{Q@{zG@{@{R@{ =p@{ՙ@{ۅQ@{p >@{33333@{Q@{ =p@{\)@{Q@| =q@| \(@|Q@|=p @|(\@|!R@|' =p@|-\(@|3Q@|9p >@|?\(@|EQ@|K =p@|P\)@|VQ@|\ =q@|b\(@|hQ@|n=p @|t@|yR@| =p@|@|Q@|Gz@|33333@|Q@|G{@|@|\(@|zG@|ffffg@|(\@|zG@| =p@|\(@|ׅQ@|p >@|33333@|Q@| =p@|@|Q@}zG@}ffffg@} (\@}zG@} =p@}\(@}#Q@})p >@}/33333@}5Q@}:G{@}@@}F\(@}LQ@}R=p @}X@}]R@}czH@}i@}o\(@}uGz@}{ =p@}@}Q@}zG@}ffffg@}(\@}zG@} =p@}@}Q@}Gz@} =p@}\)@}ƸQ@}̣ =q@}ffffg@}(\@}zG@} =p@}陙@}Q@}Gz@} =p@~\)@~Q@~ zG@~ffffg@~(\@~R@~# =p@~)@~/\(@~5Gz@~; =p@~@@~F\(@~LzG@~R=p @~X@~]R@~czH@~ip >@~o33333@~uQ@~zG{@~ =q@~ffffg@~Q@~zG@~ =p@~@~\(@~Gz@~ =p@~@~\(@~Q@~=p @~@~\(@~ׅQ@~Gz@~ =p@~\)@~Q@~zG@~=p @@\(@ zH@p >@33333@\)@"Q@(zG@.=p @4@9\(@?zH@Ep >@K33333@P\)@VQ@\zG@b=p @h@m\(@sQ@yGz@ =p@@\(@zG@=p @@\(@Q@Gz@ =p@@\(@Q@zG@ =p@ՙ@\(@Q@G{@ =q@ffffg@(\@\(@\(@ =q@Q@ fffff@ Gz@(\@ =p@R@@zH@\(@!p >@$Q@'Q@*@,G{@/\(@2 =q@5Q@8fffff@;Gz@>zG@@\)@C =p@FQ@I@LzG@O\(@R(\@U =p@WR@Z@]zH@`zG@c\(@f=p @iQ@l@n@qzH@t\(@wp >@zQ@}Q@@G{@\(@\(@p >@Q@33333@@G{@\(@\(@p >@Q@33333@@G{@\(@\(@p >@Q@Q@@G{@zH@ď\(@p >@=p @Q@@@ծzH@zG@\(@=p @ =p@R@@陙@zG@Gz@(\@\)@ =p@Q@Q@fffff@33333@zG@G{@ \(@ =q@p >@Q@Q@@@zH@"zG@%\(@((\@+ =p@- =p@0Q@3Q@6ffffg@933333@<zG@>G{@A\(@D\(@G\(@J=p @M =p@OR@RQ@U@Xffffg@[33333@^zG@`G{@c\(@f\(@ip >@l=p @o =p@qR@tQ@wQ@zffffg@}33333@zG@G{@zH@\(@\(@(\@ =p@ =p@ =q@Q@Q@Q@@@@ffffg@Gz@zG@G{@\(@\(@\(@(\@ =p@ =p@ƣ =q@p >@Q@Q@R@ԸQ@י@ffffg@33333@@@zH@zG@Gz@zG@G{@\(@\(@\(@(\@\)@\(@ =q@p >@ =p @ =p@ =p@ =q@p >@Q@Q@R@ Q@#Q@&Q@)Q@+R@.Q@1Q@4Q@733333@:@<@?@Bffffg@E33333@H@J@M@Pffffg@S33333@V@X@[@^ffffg@a33333@d@f@i@lffffg@o33333@r@t@w@zffffg@}33333@@@@ffffg@33333@R@Q@Q@Q@Q@R@Q@Q@Q@Q@R@ =q@p >@=p @ =p@ =p@ =q@p >@(\@\)@\(@ȏ\(@\(@(\@G{@ӮzH@zG@Gz@zG@@ᙙ@ffffg@33333@@Q@Q@Q@Q@ =p@ =q@p >@=p @\)@\(@\(@ \(@zG@G{@zH@ffffg@33333@@Q@!Q@$Q@'Q@) =p@, =q@/p >@2(\@4\)@7zH@:zG@=Gz@@@B@E@HQ@KQ@MR@P =q@Sp >@V(\@X\)@[\(@^zG@aGz@d@f@iQ@lQ@o =p@q =p@t =q@w\(@z(\@|G{@zH@ffffg@33333@R@Q@p >@=p @\)@\(@zG@Gz@@@Q@Q@ =p@ =p@\(@Gz@zG@@@Q@Q@ =p@ď\(@\(@zG@G{@ϙ@Q@Q@ =p@ڣ =q@\(@zG@G{@噙@Q@Q@ =p@\(@\(@zG@@@Q@ =p@ =p@\(@ Gz@ @@Q@=p @ =p@\(@zG@33333@"@$Q@'p >@*(\@,\)@/zH@2ffffg@5Q@7 =p@: =q@=\(@@zG@B@EQ@HQ@K =p@M\(@PzG@S33333@UR@XQ@[p >@^(\@`G{@c@fQ@i =p@k =p@n\(@qGz@t@vQ@yp >@|(\@~G{@@Q@Q@ =p@\(@Gz@@Q@p >@(\@G{@@Q@ =p@\(@zG@33333@R@ =q@\(@zG@@Q@=p @\)@ŮzH@ffffg@Q@ =p@Џ\(@Gz@@ظQ@\(@zG@@Q@=p @\)@zH@ffffg@Q@ =p@zG@33333@R@ =q@\(@zG@@ p >@ (\@G{@@Q@ =p@zH@ffffg@Q@! =p@$\(@'33333@)R@, =q@/\(@2zG@4Q@7p >@:(\@@x(\@zG{@}Q@=p @G{@@Q@\)@zH@ffffg@ =p@\(@ffffg@Q@ =p@zG@33333@ =p@\(@33333@R@\(@Gz@R@ =q@\(@@Q@\(@zG@ȸQ@p >@zG@@p >@(\@@p >@(\@@Q@(\@G{@Q@=p @G{@Q@=p @G{@@=p @G{@@=p @\)@ @=p @\)@@=p @\)@@Q@ \)@#@&Q@(\)@+@.=p @0\)@3@6=p @8\)@;@>=p @@\)@C@F=p @HG{@K@N=p @PG{@SQ@V=p @XG{@[Q@^(\@`@cQ@f(\@h@kp >@nzG@p@sp >@vzG@xQ@{\(@~zG@Q@\(@@ =q@Gz@R@ =q@Gz@R@\(@33333@ =p@zG@Q@\(@zG@Q@\(@ffffg@ =p@zH@Q@\)@@=p @G{@ŅQ@(\@@p >@zG@ҸQ@\(@@ڣ =q@Gz@R@\(@33333@ =p@zG@Q@\(@ffffg@ =p@zH@Q@\)@@(\@@p >@ zG@ Q@\(@@ =q@Gz@ =p@zG@Q@!\(@$ffffg@' =p@)zH@,=p @.G{@1Q@4(\@6@9p >@<@> =q@AGz@CR@FzG@IQ@K\(@Nffffg@Q =p@S@V=p @XG{@[Q@^zG@`Q@c\(@eR@h\(@k33333@m =p@pffffg@s =p@uzH@x=p @zG{@}Q@zG@Q@\(@R@\(@33333@\(@ffffg@ =p@@=p @G{@p >@zG@ =q@Gz@R@zG@Q@zH@Q@G{@Q@(\@Q@\(@R@Ə\(@Q@\(@Q@\)@ӅQ@(\@ظQ@\(@R@\(@Q@\(@Q@\)@Q@(\@Q@Gz@R@zG@Q@zH@Q@G{@p >@ zG@ =q@Gz@ =p@ffffg@ =p@@=p @@!\(@$@&\(@)Q@+\(@.Q@0G{@3Q@6zG@8 =q@;Gz@= =p@@ffffg@B\)@E@H(\@JQ@M\(@OR@RzG@U =p@WzH@Z=p @\@_\(@aR@d\(@gQ@izH@l=p @nG{@qp >@t@v\(@yQ@{zH@~Q@G{@p >@@\(@Q@\(@Q@G{@p >@@\(@Q@zH@=p @G{@p >@@\(@Q@zH@=p @@\(@R@zG@ =p@Ù@(\@ȸQ@Gz@ =p@ffffg@\)@ՅQ@zG@ڣ =q@33333@\(@Q@G{@p >@@\(@Q@zH@=p @@\(@R@zG@\)@Q@zG@ =q@ 33333@ \(@Q@G{@p >@R@zG@ =p@@"(\@$Q@'33333@)\(@,Q@.G{@1p >@3R@6zG@9 =p@;@>(\@@ =q@C33333@E\(@HQ@J@M\(@OR@RzG@T\)@WQ@ZzG@\ =q@_Q@azH@d=p @fQ@iGz@k =p@nQ@pG{@sp >@uR@xzG@{ =p@}Q@zG@ =q@Q@zH@=p @Q@Gz@\(@Q@G{@\(@R@ffffg@\)@Q@@\(@ =p@@zG@ =q@Q@zH@(\@Q@33333@\(@=p @@Gz@ =p@Q@G{@\(@R@ffffg@\)@p >@@zG@\)@Q@@\(@ =p@񙙙@zG@\(@Q@@zG@ =q@Q@zH@(\@ =q@ 33333@zH@(\@Q@33333@zH@=p @Q@!33333@#zH@&=p @(Q@+33333@-\(@0=p @2Q@533333@7\(@:=p @@R@ffffg@G{@\(@ =p@Q@@\(@ =p@Q@@Gz@\(@=p @ =q@Q@@zG@\(@ =p@ŅQ@@zG@\)@p >@R@ffffg@G{@\(@ =p@=p @Q@33333@zH@(\@ =q@Q@@@zG@\)@p >@R@ffffg@@Gz@\(@=p @ Q@ Q@@zG@\(@\)@p >@R@ffffg@ @#Gz@%\(@(=p @* =q@-Q@/@2zG@4zG@6\)@9p >@; =p@>Q@@@C33333@EzH@H(\@J\(@M =p@OQ@QR@Tffffg@V@YGz@[\(@^(\@` =q@cQ@eQ@h@jffffg@lG{@oGz@q\(@t=p @v =q@yQ@{Q@~@ffffg@G{@Gz@\(@(\@ =q@ =p@Q@R@ffffg@@Gz@zH@(\@\(@ =p@p >@ =p@Q@Q@33333@@zG@zG@G{@\(@\(@=p @ģ =q@ =p@ɅQ@R@Q@@33333@ՙ@zG@zG@G{@\(@\(@(\@ =q@ =p@p >@R@Q@Q@Q@@@ffffg@@Gz@zH@zG@zG@ G{@ \(@\(@(\@\(@\)@p >@ =p@=p @ =q@# =p@%p >@'R@*Q@,Q@/Q@1Q@3R@6Q@8@;33333@=@@@Bffffg@D@G33333@I@L@Nffffg@P@S33333@U@X@Zffffg@\G{@_Gz@azH@dzG@fzG@hG{@kGz@mzH@pzG@rzG@t@w33333@y@|@~ffffg@@33333@@@ffffg@@33333@@@Q@Q@Q@Q@R@Q@Q@Q@p >@ =p@=p @ =q@ =p@p >@\(@(\@\(@\)@\(@îzH@zG@zG@G{@33333@ϙ@@ffffg@ָQ@Q@ۅQ@R@=p @ =q@ =p@\(@\(@(\@\(@G{@Gz@zH@@ffffg@@Q@Q@ =p@=p @ =q@ \)@ \(@\(@zG@zG@@33333@Q@R@ Q@" =q@% =p@'\(@)\(@,zG@.zG@0@333333@5Q@7R@:=p @< =q@>\)@A\(@CzH@FzG@Hffffg@J@MQ@OQ@Q =p@T=p @V\(@XG{@[Gz@]@`@bQ@d =q@g =p@i\(@k\(@nzG@pffffg@r@uQ@wp >@y =p@|(\@~zG@G{@33333@Q@R@=p @\(@\)@Gz@@@Q@ =q@\)@\(@zH@@Q@Q@ =p@\(@zH@@ffffg@Q@ =p@\(@zH@zG@ffffg@ĸQ@ =p@\(@ˮzH@@ffffg@ҸQ@ =p@\(@ٮzH@@Q@ =q@\)@\(@zH@@Q@ =q@\)@Gz@@R@=p @\(@G{@33333@Q@ =p@(\@ zG@ @Q@p >@\(@zG@ffffg@Q@ =p@\(@!zH@$@&Q@(\(@*G{@-33333@/Q@1 =p@4(\@6zG@8@;Q@=\(@?zH@B@DQ@F =q@H\)@K33333@MQ@O =p@R(\@TzG@V@Y =p@[\(@]zH@`@b=p @d\(@fG{@i33333@kp >@m\(@pzG@rffffg@t =q@v\)@yGz@{Q@} =p@(\@zG@Q@ =p@\(@@R@=p @zG@@ =p@\(@zH@R@=p @\(@@Q@\(@zH@@=p @\(@@Q@\(@zH@R@=p @zG@@ =p@\(@˙@R@(\@zG@ԸQ@ =p@Gz@ۙ@ =p@(\@ffffg@Q@\)@33333@Q@\(@zG@Q@\(@G{@Q@p >@zH@R@=p @zG@Q@ =p@ Gz@ Q@ =p@zG@Q@ =q@G{@Q@p >@zH@!R@$(\@&zG@(Q@*\)@-33333@/Q@1\(@4@6=p @8\(@:@= =p@?Gz@A@D@Fffffg@H@Jffffg@L@O33334@Q@T@U@X@Zffffg@\@^ffffg@`@c33334@e@h@jffffg@l@nffffg@p@s33334@u@w33334@y@|@~ffffg@@ffffg@@33334@@@@@ffffg@@33334@@33334@@@ffffg@@ffffg@@33334@@33334@@@ffffg@@ffffg@@33334@@33334@ř@@ffffg@@ffffg@@33334@ՙ@@ٙ@@ffffg@@ffffg@@33334@陙Aρ<]*LğHeader0]&????UQ]*4Date: 07-08-2008User: Valued Ocean Optics CustomerSpectrometer Serial Number: UnknownSpectrometer Channel: MasterIntegration Time (msec): 10Spectra Averaged: 100Boxcar Smoothing: 0Correct for Electrical Dark: DisabledTime Normalized: DisabledDual-beam Reference: DisabledReference Channel: MasterTemperature: Not acquiredSpectrometer Type: S2000ADC Type: NONENumber of Pixels in File: 20482Uq(AYgI<]*TğHeader1]&????UQ]*@ 15:35:18  I<]*\Header3]&????c]*P 17:41:04 @@~FbFit_Spectrum?ğլ:Date: 07-08-2008; 15:34:43rTPeak_Lambda?DS3D3D D/DJ0Pixel_Number?D-DB@DT@DDhNPeak_Height??>33>p?= dWMT0IGR0DocsNotebook0Notebook0:DocsF9#HH> Tg(HH(dh $Normal <6666$$`Z  About This Experiment  This program analyzes spectral data residing in a user-designated folder. It is designed to analyze reflectivity data from thin films sitting on a reflective back, such as a porous Si or alumina film. SThe spectra should have been saved as ".Master.Scope", ".Master.Sample", or ".txt" files from the Ocean Optics OOBase32 program or equivalent. It is designed to take a large number of spectra created by the ocean optics spectrometer (via USB) and plot the shift in a spectral peak (or other parameters) in near real-time.  !Controls in "File Loader" Panel:  Source: Choose one of the spectra that have been saved by OOBase32 (ocean optics spectrum). It will be loaded into the "Spectrum" window. You can then set the cursors on the spectrum to identify a region of interest. You can also select "Load all these files" to load everything listed in the pull-down menu. Choose "Select different folder..." to find a different folder containing your spectra.  ]File Descriptor: The extension that the windows program OOBase32 appends to your datafiles.  reset: Delete all spectra not in use, clear out all the data files. Reset deletes the files containing Peak intensity, peak wavelength, the name of the spectrum, and timing data from Igor, then sets the program up to load new files.  Peak fitting: the type of fit to perform on the spectral peak chosen by the cursors in the "Spectrum" or "Fourier Transform" window  Calibrate wavelength scale: you need to have taken a spectrum of the neon lamp and to have saved it to be able to use this routine.  Export data...: Exports the peak intensity or peak wavelength (depending on what the user chose to monitor), the name of the spectrum, and time data to a text file that can be read by IGOR, excel or kaleidagraph.  "Export spectrum: I think it works  @ @In the Specra Loaded window:  Measure: Follow a peak in the spectrum or follow the FFT of the spectrum (either the entire spectrum or a region between cursor A and cursor B). Follows the chosen peak's intensity and its position as it evolves from spectrum to spectrum    How it works:  dLook through the comments in the procedure window. Fourier transforms are applied to the wavelength axis after it has been inverted and the datapoints rescaled such that they are evenly spaced. Note this is intended for reflectivity spectra. If you are processing transmission spectra the pathlength is only nL and so what is called 2nL is actually nL.   Written by Michael J. Sailor Aug 4 2003. Modified for the USB spectrometer system July 21 2004. Further modified and streamlined Dec 14 2005. Modified for loading of multiple files, FFT of selected regions, and lots of other bells and whistles Feb 7 2006.Z`  $  0 8 @ v ~ t | H P XNormal+ Normal+ GenevaSdWMT0IGR0SLIM_helpSLIM_helpSLIM_helpF9HH(Fg(HH(dh 6.Q/6.Q/$Normal <HHHH$$T4zZ  .SLIM-Spectroscopic Liquid Infiltration Method  sSLIM is a nondestructive determination of thickness and porosity of a porous optical film, designed for porous silicon layers. It takes advantage of the fact that the reflectivity spectrum of a film of porous silicon (or porous SiO2) will often display an optical interference pattern (Fabry-Prot fringes) arising from constructive and destructive interference of light from the top and bottom of the porous layer. This occurs when the layer is flat and smooth, with no pores or other features larger than ~500 nm. SLIM determines thickness and porosity using two reflectivity spectra; one obtained from the sample in air and the other from the sample immersed in a liquid of known refractive index (the liquid must infiltrate the pores). Values of nL (effective optical thickness) are fit to a 2 component Bruggeman model of refractive index for the composite layer. The reference for the method is Segal, E.; Perelman, L. A.; Cunin, F.; Renzo, F. D.; Devoisselle, J.-M.; Li, Y. Y.; Sailor, M. J., Confinement of Thermoresponsive Hydrogels in Nanostructured Porous Silicon Dioxide Templates. Adv. Funct. Mater. 2007, 17, 11531162. @ The user has to supply a value of the refractive index of the porous layer. For freshly etched porous Si, a good value is nPSi = 2.1 ?For thermally oxidized porous Si, (900 deg C), use nPSi = 1.46 >For thermally oxidized porous Si, (600 deg C), use nPSi = 1.7  SThe spectra should have been saved as ".Master.Scope", ".Master.Sample", or ".txt" ?files (from the Ocean Optics OOBase32 program or equivalent).  Procedure: a@Load your two spectra (air, ethanol), process by "FFT between cursors" as you normally do, then: @1) In the"Fourier Transform of Spectra" window, select the FFT spectrum of the sample you measured in air by placing the round cursor on the spectrum (bottom left, "A: mpXXX_Mag" for example) @2) depress "fit" button. This should put the blue line on your spectrum and the 2nL value should be displayed in the top bar of the "Fourier Transform of Spectra" window. 0@3) in the >>SLIM pull-down menu (upper right corner of the "Fourier Transform of Spectra" window), select "Air." This will bring up a small panel called "SLIM" and the "EOT (2nL) of layer in air" field should display the value of the "in air" EOT calculated in the "Fourier Transform of Spectra" window. \@4) in that same window, make sure that "ethanol" is selected in the "Liquid used" pull down @5) in the"Fourier Transform of Spectra" window, select the FFT spectrum of the sample you measured in liquid (we have been using ethanol) by placing the round cursor on the spectrum (bottom left, "A: mpYYY_Mag" for example) @6) depress "fit" button. This should put the blue line on your spectrum and the 2nL value should be displayed in the top bar of the "Fourier Transform of Spectra" window. @7)in the >>SLIM pull-down menu, select "Liquid." This will place the liquid value in the "EOT (2nL) of layer in ethanol" field. )@8) depress "calculate" in the SLIM panel.Z"*@H  | D , v(Normal+ Geneva// Platform=Macintosh, IGORVersion=5.050 NewPath/Z DataFiles "::Papers:2008 nano-toilet (orosco):SLIM data:CCD data:" DefaultFont "Arial" OpenNotebook/N=SLIM_help/W=(20,132,582,422)/J=105543/V=0 "SLIM_help" OpenNotebook/N=Notebook0/W=(18,134,582,421)/J=101306/V=0 "Docs" MoveWindow/P 670,240,1470,818 Table0() ProtectedWaves() Table2() Graph0() FileLoader() MoveWindow/C -6,517,794,635 Window FileLoader() : Panel PauseUpdate; Silent 1 // building window... NewPanel /W=(495,44,857,476) SetDrawLayer UserBack SetDrawEnv fsize= 10 SetDrawEnv save SetDrawEnv linefgc= (65535,0,26214) SetDrawEnv save DrawRect 43,125,43,127 SetDrawEnv linethick= 4,dash= 1 DrawLine 6,79,245,79 SetDrawEnv linethick= 4,dash= 1 DrawLine 6,220,245,220 SetDrawEnv linethick= 4,dash= 1 DrawLine 6,317,245,317 SetDrawEnv fsize= 12,fstyle= 1,textrgb= (65535,0,26214) DrawText 7,97,"Peak fitting details" SetDrawEnv fsize= 11,fstyle= 1,textrgb= (65535,0,26214) DrawText 29,137,"peak rejection criteria:" SetDrawEnv fillpat= 0,fillfgc= (56797,56797,56797) DrawRect 23,177,284,124 Button Goto_calibration,pos={8,237},size={184,20},proc=GotoWavelengthCalibration,title="Calibrate wavelength scale..." Button reset,pos={297,4},size={50,20},proc=Reset,title="reset" Button ExportData,pos={51,384},size={200,20},proc=ExportData,title="Export signal vs time data..." Button HelpButton,pos={298,27},size={50,20},proc=GotoAbout,title="help..." PopupMenu FileSource,pos={4,28},size={164,20},proc=ChooseFileType,title="File source:" PopupMenu FileSource,mode=1,popvalue=".Master.Scope",value= #"\".Master.Scope;.Master.Sample;.txt;.txt (spectrasuite);_spectra;from Fringes7 vi\"" ValDisplay source_folder_files,pos={6,51},size={220,14},title="Number of files in current data folder:" ValDisplay source_folder_files,frame=0,limits={0,0,0},barmisc={0,1000} ValDisplay source_folder_files,value= #"GNumber_of_files" PopupMenu DataSource,pos={39,4},size={185,20},proc=ChooseFile,title="Source:" PopupMenu DataSource,mode=8,popvalue="3a_eth.Master.Scope",value= #"\"Select different folder...;\"+\"Load all these files;\"+IndexedFile(DataFiles,-1,GCCD)" CheckBox Slow_mode,pos={11,195},size={65,14},title="slow mode" CheckBox Slow_mode,variable= GSlowMode PopupMenu export_selected,pos={6,331},size={153,20},proc=ExportSelectedPopup,title="export single spectrum:" PopupMenu export_selected,mode=2,popvalue="1a",value= #"WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu ChooseMode,pos={8,98},size={143,20},proc=TypeofFitPopup,title="Type of peak:" PopupMenu ChooseMode,mode=1,popvalue="Gaussian",value= #"\"Gaussian;-none-\"" SetVariable set_threshold,pos={79,139},size={200,15},title="ignore peaks if intensity <" SetVariable set_threshold,value= GThreshold,live= 1 SetVariable set_error_threshold,pos={29,157},size={250,15},title="do not tolerate error in position (nm) >" SetVariable set_error_threshold,value= GWavelengthErrorThreshold Button GotoSLIM,pos={8,262},size={100,20},proc=GoToSLIM,title="go to SLIM..." PopupMenu export_selected_FFT,pos={6,357},size={173,20},proc=ExportSelectedFFTPopup,title="export FFT spectrum:" PopupMenu export_selected_FFT,mode=2,popvalue="1a_Mag",value= #"WaveList(\"!Wavelength\",\";\",\"WIN:Graph2\")" EndMacro Window Graph0() : Graph PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Fit_Spectrum vs Wavelength as "Spectra Loaded" ModifyGraph lSize=2 ModifyGraph rgb=(1,4,52428) ModifyGraph mirror=2 ModifyGraph fSize=14 ModifyGraph lblMargin(left)=4,lblMargin(bottom)=2 ModifyGraph axOffset(left)=0.714286,axOffset(bottom)=0.25 ModifyGraph lblLatPos(bottom)=1 Label left "\\Z18Relative Intensity" Label bottom "\\Z18Wavelength (nm)" Cursor/P/H=1 A Fit_Spectrum 318;Cursor/P/H=1 B Fit_Spectrum 2014 ShowInfo ControlBar 80 Button GotoPlotPeakShift,pos={70,51},size={110,20},proc=GotoPlotSpectralPeakShift,title="Plot peak shift" Button GotoPlotFrequencyShift,pos={50,51},size={130,20},disable=1,proc=GotoPlotSpectrumFrequencyShift,title="Plot frequency shift" PopupMenu Remove_spectrum,pos={264,5},size={187,20},proc=remove_spectrum,title="Remove spectrum:" PopupMenu Remove_spectrum,mode=2,popvalue="Fit_Spectrum",value= #"\"remove all;\"+WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu What_to_measure,pos={18,4},size={200,20},proc=WhatToMeasurePopup,title="Measure:" PopupMenu What_to_measure,mode=1,popvalue="peak between cursors",value= #"\"peak between cursors;cosine between cursors;FFT of entire spectrum;FFT between cursors\"" SetVariable set_peak_width,pos={28,30},size={150,15},proc=SetPeakWidth,title="Width of peak (nm):" SetVariable set_peak_width,value= GPeakWidth ValDisplay Peak_position,pos={188,55},size={150,14},title="Peak wavelength (nm):" ValDisplay Peak_position,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position,value= #"GPeakWavelength" ValDisplay Peak_position_error,pos={343,55},size={50,14},title="" ValDisplay Peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position_error,value= #"GWavelengthError" EndMacro Window Table2() : Table PauseUpdate; Silent 1 // building window... Edit/W=(4,78,529,396) Header0.xy ModifyTable width(Header0.xy)=222 EndMacro Window ProtectedWaves() : Table PauseUpdate; Silent 1 // building window... Edit/W=(0,44,490,150) Header0,Header1,Header3,Peak_Lambda,Pixel_Number,Peak_Height as "ProtectedWaves" EndMacro Window Table0() : Table PauseUpdate; Silent 1 // building window... Edit/W=(492,44,831,278) Peak_Lambda,Pixel_Number,Peak_Height as "Wavelength Calibration" ModifyTable width(Peak_Lambda)=74,width(Pixel_Number)=86 EndMacro #pragma rtGlobals=1 // Use modern global access method. #include #include Menu "Macros" "Initialize" "-" "Pick Peak/1" "-" End Macro SimulateSpectrum() variable layer2nL=60474.7 Pure=250+200*cos(2*pi*layer2nL/Wavelength) EndMacro Macro Initialize() //Declare all global variables in one place so you can keep track of them... //Variable/G globalSpectrum_Length,GNumber_of_Files, GCursorAPoint //Variable/G GWavelength, GWavelengthSlice, Gnumber_of_points //Variable/G GNumber_of_Spectra, GFirstPoint, GLastPoint //variables for peak fitting routine: //used to find peak in Spectrum or FFT: Variable/G TryFPS, FPS, nticksLast, Variable/G GPeakWidth, GPeakWavelength,GFFTPeakWidth, GEOT,GCursorAPoint_spectrum, GCursorBPoint_spectrum ,GCursorA_FFT,GCursorB_FFT//width of the peak, in points and the position of the cursors in "spectrum" and in "FFT" windows Variable/G GThreshold=0,GWavelengthErrorThreshold=inf,GWavelengthError,GIntensityError, GEOTError Variable/G GSlowMode Variable/G GStartTime,GCurrentSpectrumTime //Time the first spectrum was acquired //Variable/G GTimeBetweenSpectra //how long to wait before acquiring more spectra from the disk //Variable/G GSpectrumBufferSize //how many spectra to keep in the display String/G GShowFFT, GShowSpectra, GMonitorSpectrumMode,GWhatToMonitor Variable/G GLimits,GFFTResolution,GFFTWindowing String/G Gmode //How to determine the peak position or intensity: Gaussian fit, follow peak, etc. String/G GLoadType String/G GMonitorUnits //String/G GLabview_VI_Name="\"Fringes7.vi\"" //The name of the Labview VI that is controlling the ocean optics spectrometer Variable/G V_fitOptions=4 //do not show the information window for Gaussian curve fits. To speed up the fit routine Variable/G GxStart=2500,GxEnd=120000 //Where the FFT display should start and end Variable/G GIntensity //Max y value in the display Variable/G GSpectrumFrequency //the frequency of oscillations in the spectrum ROI Make/O/N=2048 Fit_Spectrum Fit_Spectrum=0 //Variables for File loader: String/G GFolderName //for convenience to tell the user what folder they are currently monitoring String/G GFilename,GSpectrumName,GDisplayedSpectrumName,GCCD, GWavelengthType //The filename being loaded, the type of CCD spectrum being used, the wavelength scale Variable/G GFileSuccessfullyLoaded, GNumber_of_Files, GNumber_of_files_to_load, GNumber_of_files_loaded, GNumber_of_files_ignored, GLoad_all_spectra//, Gheaderlines //Variables used to calibrate the wavelength axis: Variable/G Factory_poly0=337.088, Factory_poly1=0.3843, Factory_poly2=-2.4534e-5 //calibration data from Ocean Optics for CCD. These are the factory values using a polynomial fit, of the form: Wavelength = A_poly0+x*A_poly1+x*x*A_poly2 Variable/G B_poly0=Factory_poly0, B_poly1=Factory_poly1, B_poly2=Factory_poly2 //these can be changed by the user when the "calibrate wavelength routines are used. Variable/G GCal_Number NewPath/O DataFiles //set the path to find the data files Killwaves/A/Z //Kill all waves not in use or not protected //Variables used by SLIM: Variable/G GnAir=1, GnPSi=2.1 //the values of refractive index for air and for porous Si used by all the procedures Variable/G GPorosity=0, GThickness=0, GnFill, GEOT1, GEOT2 //variables used to calculate porosity, thickness. EOT is 2nL String/G GFill_Liquid EndMacro Function UpdateFileLoaderPanel() SVAR GSourceFolder=GSourceFolder SVAR GFolderName=GFolderName SVAR GDisplayedSpectrumName=GDisplayedSpectrumName ValDisplay source_folder title="Source folder: "+GFolderName+" Number of files:",win=FileLoader //ValDisplay current_spectrum title="Current spectrum: "+GDisplayedSpectrumName+", age (min):",win=MonitorSpectrum End Function UpdateSpectrumDisplay() NVAR GCursorAPoint_spectrum NVAR GCursorBPoint_spectrum SVAR GSpectrumName //this would be the most recently loaded spectrum String SpectrumName SpectrumName=StringFromList(1,TraceNameList("Graph0",";",1)) //get name of first wave in the series (the one after "Fit_spectrum") Cursor/P/W=Graph0 A, $SpectrumName GCursorAPoint_spectrum Cursor/P/W=Graph0 B, $SpectrumName GCursorBPoint_spectrum RemoveFromGraph/W=Graph0/Z Wave0 //housekeeping; if this wave is present it should be removed //TextBox/W=Graph1/C/N=Spectrum_Name GDisplayedSpectrumName End Function UpdateFFTDisplay() NVAR GCursorAPoint_FFT NVAR GCursorBPoint_FFT SVAR GSpectrumName //this would be the most recently loaded spectrum String FFTSpectrum_name=GSpectrumName+"_MAG" if (Wintype("Graph2")==1) //is "Fourier Transform" plot up? If so, update it Cursor/P/W=Graph2 A $FFTSpectrum_name GCursorAPoint_FFT Cursor/P/W=Graph2 B $FFTSpectrum_name GCursorBPoint_FFT endif End //******************PLOTS********************************** Window Graph0() : Graph //this is the main window for viewing and processing all spectra //PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Fit_Spectrum vs Wavelength as "Spectra Loaded" ModifyGraph lsize(Fit_Spectrum)=2,rgb(Fit_Spectrum)=(0,0,65535) Fit_Spectrum=NaN //Display /W=(0,44,493,493) "Spectra Loaded" ModifyGraph rgb=(65535,65535,65535) ModifyGraph mirror=2 ModifyGraph fSize=14 ModifyGraph lblMargin(left)=4,lblMargin(bottom)=2 ModifyGraph axOffset(left)=0.714286,axOffset(bottom)=0.25 ModifyGraph lblLatPos(bottom)=1 Label left "\\Z18Relative Intensity" Label bottom "\\Z18Wavelength (nm)" Cursor/P/H=1 A, Fit_Spectrum GCursorAPoint_spectrum Cursor/P/H=1 B, Fit_Spectrum GCursorBPoint_spectrum ModifyGraph rgb(Fit_Spectrum)=(1,4,52428) ModifyGraph lsize(Fit_Spectrum)=2.00 ShowInfo ControlBar 80 Button GotoPlotPeakShift,pos={70,51},size={110,20},proc=GotoPlotSpectralPeakShift,title="Plot peak shift" Button GotoPlotFrequencyShift,pos={50,51},size={130,20},proc=GotoPlotSpectrumFrequencyShift,title="Plot frequency shift" Button GotoPlotFrequencyShift disable=1 //hide the "plot frequency shift" button PopupMenu Remove_spectrum,pos={264,5},size={187,20},proc=remove_spectrum,title="Remove spectrum:" PopupMenu Remove_spectrum,mode=2,popvalue="Fit_Spectrum",value= #"\"remove all;\"+WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu What_to_measure,pos={18,4},size={200,20},proc=WhatToMeasurePopup,title="Measure:" PopupMenu What_to_measure,mode=1,popvalue="peak between cursors",value= #"\"peak between cursors;cosine between cursors;FFT of entire spectrum;FFT between cursors\"" GMonitorSpectrumMode="spectrum" //reset this back to spectrum so that we don't take a bunch of FFTs for no reason SetVariable set_peak_width,pos={28,30},size={150,15},proc=SetPeakWidth,title="Width of peak (nm):" SetVariable set_peak_width,value= GPeakWidth ValDisplay Peak_position,pos={188,55},size={150,14},title="Peak wavelength (nm):" ValDisplay Peak_position,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position,value=#"GPeakWavelength" ValDisplay Peak_position_error,pos={343,55},size={50,14},title="" ValDisplay Peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position_error,value= #"GWavelengthError" EndMacro Window Graph1() : Graph PauseUpdate; Silent 1 // building window... Display /W=(2.25,42.5,487.5,339.5) Spectrum vs Wavelength as "Spectrum" ModifyGraph mirror=2 ModifyGraph lblMargin(left)=6,lblMargin(bottom)=13 ModifyGraph axOffset(bottom)=0.866667 ModifyGraph lblLatPos(left)=-5,lblLatPos(bottom)=12 Label left "\\Z14Intensity" Label bottom "\\Z14Wavelength, nm" Cursor/P A Spectrum GCursorAPoint_spectrum;Cursor/P B Spectrum GCursorBPoint_spectrum ShowInfo TextBox/N=Spectrum_Name/G=(0,0,65535)/B=(49151,60031,65535)/A=LT/X=-11.00/Y=112 GDisplayedSpectrumName EndMacro Window Graph2() : Graph PauseUpdate; Silent 1 // building window... Display/W=(0,513,580,787) Fit_FFT as "Fourier transform of spectra" ModifyGraph lsize(Fit_FFT)=2,rgb(Fit_FFT)=(0,0,65535) Fit_FFT=NaN SetAxis bottom gxStart,gxEnd Label left "Intensity" Label bottom "2 x Optical thickness (nm)" Cursor/P/H=1 A Fit_FFT GCursorAPoint_FFT;Cursor/P/H=1 B Fit_FFT GCursorBPoint_FFT ShowInfo ControlBar 40 Button GotoPlotFFTPeakShift,pos={5,8},size={110,20},proc=GotoPlotFFTPeakShift,title="Plot peak shift" SetVariable set_FFT_peak_width,pos={123,11},size={150,15},proc=SetFFTPeakWidth,title="Width of peak (nm):" SetVariable set_FFT_peak_width,limits={100,inf,500},value= GFFTPeakWidth ValDisplay FFT_peak_position,pos={309,11},size={120,14},title="2nL (nm):" ValDisplay FFT_peak_position,limits={0,0,0},barmisc={0,1000},value= #"GEOT" ValDisplay FFT_peak_position_error,pos={434,11},size={50,14},title="" ValDisplay FFT_peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay FFT_peak_position_error,value= #"GEOTError" PopupMenu exportToSlim,pos={489,8},size={77,20},proc=SendValueToSlim,title=">>SLIM" PopupMenu exportToSlim,mode=1,popvalue="air",value= #"\"air;liquid\"" Button doFit,pos={278,9},size={22,20},proc=PerformFit,title="fit" EndMacro Window Graph3() : Graph PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Wavelength vs Wavelength as "Neon Lamp Spectrum" ModifyGraph mirror=2 Label left "Relative Intensity" Label bottom "Nanometers" ShowInfo ControlBar 50 Button GotoCalibrate,pos={74,25},size={90,20},proc=CalibrateWavelength,title="Calibrate" Button RevertToFactory,pos={262,25},size={220,20},proc=RevertToFactory,title="revert to factory wavelength scale" PopupMenu NeFile,pos={0,0},size={206,20},proc=ChooseNeFileName,title="Ne Lamp File:" PopupMenu NeFile,mode=24,popvalue="",value= #"WaveList(\"*\", \";\", \"\")" EndMacro Window PeakShiftPlot() : Graph //First decide if we are following the peak in the FFT or in the Spectrum: if (cmpstr(GMonitorSpectrumMode,"Spectrum")==0) GMonitorUnits="Wavelength (nm)" endif if (cmpstr(GMonitorSpectrumMode,"FFT")==0) GMonitorUnits="EOT (2nL, nm)" endif PauseUpdate; Silent 1 // building window... Display/W=(495,144,1047,419) PeakPosition vs TimePoint as GMonitorUnits+" vs. time" ErrorBars PeakPosition Y,wave=(PositionError,PositionError) ModifyGraph grid=1,mode=4,mrkThick=0.3,rgb=(2,39321,1), lsize=2 ModifyGraph rgb(PeakPosition)=(1,26214,0) //ModifyGraph grid=1, mode=4,marker=19 ModifyGraph mirror(bottom)=2,mirror(left)=2,mode(PeakPosition)=0 Label left "\\Z14"+ GMonitorUnits Label bottom "\\Z14Time (sec)" //Put up the cursors: cursor/P A, PeakPosition,0 // put cursor A on first point of PeakPosition Cursor/P B, PeakPosition,numpnts(PeakPosition)-1 // put cursor B on last point of PeakPosition DoUpdate // erase any old A or B cursors EndMacro Window PeakAmplitudePlot() : Graph //First decide if we are following the peak in the FFT or in the Spectrum: String MonitorUnits if (cmpstr(GMonitorSpectrumMode,"Spectrum")==0) MonitorUnits="Spectral peak amplitude" endif if (cmpstr(GMonitorSpectrumMode,"FFT")==0) MonitorUnits="Amplitude of FFT peak" endif PauseUpdate; Silent 1 // building window... Display/W=(495,444,1047,719) PeakIntensity vs TimePoint as MonitorUnits+" vs. time" ErrorBars PeakIntensity Y,wave=(IntensityError,IntensityError) ModifyGraph grid=1,mode=4,mrkThick=0.3,rgb=(2,39321,1), lsize=2 ModifyGraph rgb(PeakIntensity)=(1,26214,0) //ModifyGraph grid=1, mode=4,marker=19 ModifyGraph mirror(bottom)=2,mirror(left)=2,mode(PeakIntensity)=0 Label left "\\Z14"+ MonitorUnits Label bottom "\\Z14Time (sec)" EndMacro Window PeakShiftTable() : Table PauseUpdate; Silent 1 // building window... Edit/W=(3,44,257,585) ResultWave,TimePoint EndMacro //*****************Data Loading routines*************************** Window MonitorSpectrum() : Panel PauseUpdate; Silent 1 // building window... NewPanel /W=(522,44,884,476) SetDrawLayer UserBack SetDrawEnv fsize= 10 SetDrawEnv save SetDrawEnv linefgc= (65535,0,26214) SetDrawEnv save SetDrawEnv linethick= 2,fillpat= 3,fillfgc= (65535,0,52428) DrawRRect 77,114,15,144 DrawRect 43,125,43,127 SetDrawEnv linethick= 4,dash= 1 DrawLine 6,105,245,105 SetDrawEnv fillpat= 0 DrawRect 90,113,309,196 SetDrawEnv linethick= 4,dash= 1 DrawLine 6,248,245,248 SetDrawEnv linethick= 4,dash= 1 DrawLine 6,333,245,333 Button StartButton,pos={21,119},size={50,20},proc=StartButton,title="live..." Button Goto_calibration,pos={7,395},size={184,20},proc=GotoWavelengthCalibration,title="Calibrate wavelength scale..." Button reset,pos={21,175},size={50,20},proc=Reset,title="reset" SetVariable setPeriod,pos={93,207},size={143,15},proc=SetTimeBetweenSpectra,title="Update every (sec)" SetVariable setPeriod,limits={1,Inf,1},value= GTimeBetweenSpectra ValDisplay vd1,pos={98,224},size={137,14},title="Actual secs/frame" ValDisplay vd1,limits={0,0,0},barmisc={0,1000},value= #"1/fps" PopupMenu ChooseMode,pos={11,306},size={244,20},proc=SetMode,title="Peak fitting:" PopupMenu ChooseMode,mode=1,popvalue="Gaussian between cursors",value= #"\"Gaussian between cursors;Gaussian between cursors, follow peak\"" Button ExportData,pos={7,339},size={110,20},proc=ExportData,title="Export data..." Button HelpButton,pos={298,27},size={50,20},proc=GotoAbout,title="help..." Button ExportSpectrum,pos={7,367},size={190,20},proc=ExportSpectrum,title="Export displayed Spectrum..." PopupMenu Monitor_mode,pos={3,256},size={155,20},proc=MonitorSpectrumModePop,title="Post-process:" PopupMenu Monitor_mode,mode=2,popvalue="spectrum",value= #"\"none;spectrum;FFT of entire spectrum;FFT between cursors\"" Button ResetCursors,pos={274,306},size={80,20},proc=SetCursorPositions,title="set cursors" PopupMenu FileDescriptor,pos={4,28},size={190,20},proc=ChooseFileDescriptor,title="File descriptor:" PopupMenu FileDescriptor,mode=1,popvalue=".Master.Scope",value= #"\".Master.Scope;.Master.Sample;.txt\"" ValDisplay source_folder,pos={7,51},size={351,14},title="Monitoring folder: e_IPA10mg-1 Number of files:" ValDisplay source_folder,frame=0,limits={0,0,0},barmisc={0,1000} ValDisplay source_folder,value= #"GNumber_of_files" PopupMenu DataSource,pos={4,4},size={274,20},proc=ChooseFolder,title="Source:" PopupMenu DataSource,mode=2,popvalue="e_IPA10mg-1.00000.Master.Scope",value= #"\"New folder...;\"+IndexedFile(DataFiles,-1,GCCD)" CheckBox load_all_spectra,pos={94,116},size={163,14},proc=ProcessSpectraCheckBox,title="Process all spectra in folder?" CheckBox load_all_spectra,value= 1 ValDisplay To_load,pos={206,149},size={93,14},title="Pending:" ValDisplay To_load,limits={0,0,0},barmisc={0,1000} ValDisplay To_load,value= #"GNumber_of_files-GNumber_of_files_ignored-Gnumber_of_files_loaded" ValDisplay Loaded,pos={183,162},size={116,14},title="Spectra read:" ValDisplay Loaded,limits={0,0,0},barmisc={0,1000} ValDisplay Loaded,value= #"GNumber_of_files_loaded" ValDisplay Loaded01,pos={168,175},size={131,14},title="Spectra ignored:" ValDisplay Loaded01,limits={0,0,0},barmisc={0,1000} ValDisplay Loaded01,value= #"GNumber_of_files_ignored" ValDisplay current_spectrum,pos={7,65},size={351,14},title="Current spectrum: e_IPA10mg-1.00320" ValDisplay current_spectrum,frame=0,limits={0,0,0},barmisc={0,1000} ValDisplay current_spectrum,value= #"GCurrentSpectrumTime" SetVariable Buffer_spectra,pos={94,131},size={206,15},title="Number of spectra in buffer:" SetVariable Buffer_spectra,limits={1,Inf,1},value= GSpectrumBufferSize Button refresh_button,pos={20,149},size={50,20},proc=Update,title="update" PopupMenu What_to_monitor,pos={29,281},size={155,20},proc=WhatToMonitorPopup,title="Monitor:" PopupMenu What_to_monitor,mode=1,popvalue="peak intensity",value= #"\"peak intensity;peak position\"" EndMacro Function IsStringinWave(text_string,text_wave) //this searches text_wave for the string text_string. If there, it returns 1. If not, it returns 0 String text_string Wave/T text_wave Variable i=0 Variable answer=0 Do if (cmpstr(text_wave[i],text_string)==0) //then we have a match answer=1 endif i+=1 while (i86400) Beep DoAlert 0, "Error: cannot load more than 86,400 spectra at one time" endif Time_spectrum_acquired_string=secs2time(GCurrentSpectrumTime,3) // this has the format "13:07:29" Date_spectrum_acquired_string="Date: 01-01-1904" //this has the format "Date: 07-21-2004" //put the time spectrum was acquired into a wave note: Note $SpectrumName,Date_spectrum_acquired_string+"; "+Time_spectrum_acquired_string //this will have the format "Date: 01-18-2006;16:47:44 CheckDisplayed/W=Graph0 $SpectrumName //has this spectrum already been put on display? if (V_Flag==0) //not yet displayed, put it up AppendToGraph/W=Graph0 $SpectrumName vs Wavelength endif i+=1 while (i86400) Beep Print "Error: the number of spectra processed at one time cannot exceed 86,400" endif Time_spectrum_acquired_string=secs2time(GCurrentSpectrumTime,3) // this has the format "13:07:29" Date_spectrum_acquired_string="Date: 01-01-1904" //this has the format "Date: 07-21-2004" //put the time spectrum was acquired into a wave note: Note $GSpectrumName,Date_spectrum_acquired_string+"; "+Time_spectrum_acquired_string //this will have the format "Date: 01-18-2006;16:47:44 CheckDisplayed/W=Graph0 $SpectrumName //has this spectrum already been put on display? if (V_Flag==0) //not yet displayed, put it up AppendToGraph/W=Graph0 $GSpectrumName vs Wavelength endif endif if(cmpstr(GLoadType,".txt")==0) //No header, don't know when this file was created...ideally you need to get the file modification date. //Instead, try to extract the spectrum number, assuming they were numbered sequentially. This will work fine unless there are more than 86,400 spectra (number of secs in 24 hr) GCurrentSpectrumTime=ExtractSpectrumNumber(GSpectrumName) //just increment this by the spectrum number. if (GCurrentSpectrumTime>86400) Beep Print "Error: number of spectra cannot exceed 86,400" endif Time_spectrum_acquired_string=secs2time(GCurrentSpectrumTime,3) // this has the format "13:07:29" Date_spectrum_acquired_string="Date: 01-01-1904" //this has the format "Date: 07-21-2004" //put the time spectrum was acquired into a wave note: Note $GSpectrumName,Date_spectrum_acquired_string+"; "+Time_spectrum_acquired_string //this will have the format "Date: 01-18-2006;16:47:44 CheckDisplayed/W=Graph0 $SpectrumName //has this spectrum already been put on display? if (V_Flag==0) //not yet displayed, put it up AppendToGraph/W=Graph0 $GSpectrumName vs Wavelength endif endif if(cmpstr(GLoadType,".Sample")==0) LoadWave/Q/N=Header/J/K=2/L={0,2,15,0,0}/P=DataFiles Filename //this loads the header information from the file Time_spectrum_acquired_string=Header3[0] //Date_spectrum_acquired_string=Header0[0] //this has the format "Date: 07-21-2004" //this converts to seconds from 1904: GCurrentSpectrumTime=ExtractTime(Date_spectrum_acquired_string,Time_spectrum_acquired_string) //put the time spectrum was acquired into a wave note: Note $GSpectrumName,Date_spectrum_acquired_string+";"+Time_spectrum_acquired_string //this will have the format "Date: 01-18-2006;16:47:44 CheckDisplayed/W=Graph0 $SpectrumName //has this spectrum already been put on display? if (V_Flag==0) //not yet displayed, put it up AppendToGraph/W=Graph0 $GSpectrumName vs Wavelength endif endif checkdisplayed/W=Graph0 Wave0 if (V_Flag) //remove wave0 if it was put there RemoveFromGraph/W=Graph0 Wave0 endif //UpdateMonitorSpectrumPanel() UpdateSpectrumDisplay() End Function LoadAllSpectraInFolder() //loads all the spectra in the current folder with the file descriptor defined by GCCD into Graph0 String AllFileNames,FileName, SpectrumName,Time_spectrum_acquired_string, Date_spectrum_acquired_string SVAR GCCD=GCCD NVAR GNumber_of_Files=GNumber_of_Files //Make a list of the filenames that need to be loaded: AllFileNames=IndexedFile(DataFiles,-1,GCCD) //String containing the names of all the files in the folder that end with the string GCCD, separated by semicolons. GNumber_of_files=ItemsInList(AllFileNames) //how many of these itmes there are variable i=0 //Now load all of the files in the list, if any: if (GNumber_of_files>0) Filename=StringFromList(0, AllFileNames) //get the name of the first file in the list (that would correspond to the oldest spectrum) //Print Filename do //print "loading "+Filename LoadSpectrum(FileName) i+=1 //count how many spectra are being loaded AllFileNames=RemoveListItem(0,AllFileNames) //delete this file name from the list Filename=StringFromList(0, AllFileNames) //get the name of the next file in the list //print "next to load "+Filename if (cmpstr(Filename,"")==0) //there are no more files to load Break endif while(1) //continue until there are no more files. endif //print (num2str(i)+" spectra loaded") EndMacro Function ExtractTime(DateString, TimeString) //This converts the date and time strings such as "Date: 07-21-2004" and 13:02:22 to seconds from 1904. //These are the time and date formats provided in the header information of the ocean optics OOBase32 software. //If the information is not present, the File loading program will default to numbering the spectra sequentially String DateString, TimeString variable Date_spectrum_acquired_numeric, Time_spectrum_acquired_numeric, secs_from_1904 Date_spectrum_acquired_numeric=date2secs(str2num(DateString[12,15]),str2num(DateString[6,7]),str2num(DateString[9,10])) Time_spectrum_acquired_numeric=(str2num(TimeString[1,2])*3600+str2num(TimeString[4,5])*60+str2num(TimeString[7,8])) secs_from_1904=Date_spectrum_acquired_numeric+Time_spectrum_acquired_numeric return (secs_from_1904) end Function ExtractSpectrumNumber(SpectrumName) String SpectrumName Variable Digit Variable Number=0,i=0 do Digit=Str2Num(SpectrumName[strlen(SpectrumName)-1]) //start with the last character in the name and go down if (Digit<10) // if this is NaN, the expression will evaluate as false. else Break //no more numbers, get out of the routine endif SpectrumName=SpectrumName[0,strlen(SpectrumName)-2] //Blank the last character in the string and go to the next one Number+=Digit*10^i i+=1 While(1) Return(Number) End Function GetSpectrumName(FileName) //convert this filename to a spectrum name by stripping off the ".Master.Scope" or other file descriptors //and sets "GSpectrumName" to the name of the spectrum in Filename String FileName SVAR GCCD=GCCD SVAR GSpectrumName=GSpectrumName SVAR GFileName=GFileName GFileName=Filename if(cmpstr(GCCD,".Scope")==0) //Set up the appropriate loading parameters GSpectrumName=Filename[0,strlen(Filename)-14] //strip off the ".Master.Scope" file descriptor endif if(cmpstr(GCCD,".Sample")==0) GSpectrumName=Filename[0,strlen(Filename)-15] //strip off the ".Master.Sample" file descriptor endif if(cmpstr(GCCD,".txt")==0) //a text file: GSpectrumName=Filename[0,strlen(Filename)-5] //strip off the ".txt" file descriptor endif End Function/S GetBaseName(FileName) //convert this filename to the base spectrum name by stripping off anything past a period in FileName //returns the base name of the spectrum String FileName String BaseName variable i=strsearch(FileName,".",0) BaseName=Filename[0,strsearch(FileName,".",0)-1] //strip off anything past a period in FileName; should give the base name of the spectrum // do // if(cmpstr(FileName[i,i+1],".")==0) //we found a period, exit loop // Break // endif // BaseName+=Filename[i,i+1] // i+=1 // while (iIntensity_threshold) //then there is a peak above the threshold noise level in this range, do the fit //print "limits for "+NameofWave(Spectrum)+" are "+num2str(V_maxloc-range/2)+", "+num2str(V_maxloc+range/2) CurveFit/Q/N gauss Spectrum[V_maxloc-range/2,V_maxloc+range/2]/X=Wavelength/D=Fit_Spectrum/F={0.950000, 4} WAVE W_coef //these 2 waves (W_coef and W_ParamConfidenceInterval) are generated by CurveFit; declare them or you can't access them WAVE W_ParamConfidenceInterval //the wavelength scaling is taken into account with this type of fit; assumes peak is symmetrical wrt wavelength GPeakWavelength=NaN GIntensity=NaN GWavelengthError=NaN GIntensityError=NaN //assume no peak found, unless it passes the following tests: if(W_ParamConfidenceInterval[2]Low_Wavelength_Limit)) //then the peak found lies within the user-defined limits (set by the cursors) if ((W_coef[0]+W_coef[1])>(W_ParamConfidenceInterval[0]+W_ParamConfidenceInterval[1])) //is the peak intensity above the 95% confidence interval (is it greater than 2 sigma of the noise)? GPeakWavelength=W_coef[2] GIntensity=W_coef[0]+W_coef[1] //this is peak intensity (W_coef[1]) + baseline offset (W_coef[0]) GWavelengthError=W_ParamConfidenceInterval[2] GIntensityError=W_ParamConfidenceInterval[0]+W_ParamConfidenceInterval[1] endif endif endif else GPeakWavelength=NaN //no peak found above threshold levels specified GIntensity=NaN endif endif if (GSlowMode) //then update all plots so user can view the process. This slows things down A LOT DoUpdate endif end Function GetFFTPeakPosition(Spectrum) //This this subroutine finds the position of a peak located within a specified range in an FFT spectrum. //the cursors (point positions defined by global variables) are used to define the region of the spectrum in which to look for a peak. "Range" is the number of datapoints in the spectrum to fit. //it places the result in the global variables GEOT and GIntensity //Designed for Fourier transforms of Fabry-Perot films. If you have a well-defined waveform with little to no frequency dispersion (like a sound wave), //you should use a Lorenzian fit rather than a Gaussian. WAVE Spectrum SVAR Gmode //NVAR GThreshold,GEOTErrorThreshold //thresholds used to determine whether or not a peak is real NVAR GSlowMode //to allow user to watch fit process spectrum by spectrum NVAR GFFTPeakWidth, GEOT, GIntensity, GEOTError, GIntensityError NVAR GCursorAPoint_FFT, GCursorBPoint_FFT // WAVE W_coef // WAVE W_ParamConfidenceInterval WAVE Fit_FFT Variable range,p_min,p_max //Variable Intensity_threshold,EOT_threshold //Find out where the cursors are: GCursorAPoint_FFT=pcsr(A,"Graph2") GCursorBPoint_FFT=pcsr(B,"Graph2") Wavestats/Q/R=[GCursorAPoint_FFT,GCursorBPoint_FFT] Spectrum //V_Maxloc will be the x value at which the peak max is located. Range=GFFTPeakWidth p_min=x2pnt(Spectrum, (V_maxloc-range/2)) p_max=x2pnt(Spectrum,( V_maxloc+range/2)) Duplicate/O Spectrum Fit_FFT Fit_FFT=NaN //put fit_FFT in front so it is easy to see: CheckDisplayed/W=Graph2 Fit_FFT if(V_Flag) RemoveFromGraph/W=Graph2 Fit_FFT endif AppendToGraph/W=Graph2 Fit_FFT ModifyGraph/W=Graph2 rgb(Fit_FFT)=(1,4,52428) ModifyGraph/W=Graph2 lsize(Fit_FFT)=2.00 if (cmpstr(Gmode,"Gaussian")==0) //find the peak in the range designated by the user (between cursor A and B, don't move the window) // the maximum x value in the user's specified window (V_max) was found with the "wavestats" command a few lines above CurveFit/Q/N gauss Spectrum[p_min,p_max]/D=Fit_FFT/F={0.950000, 4} WAVE W_coef //these 2 waves (W_coef and W_ParamConfidenceInterval) are generated by CurveFit; declare them or you can't access them in this function WAVE W_ParamConfidenceInterval GEOT=NaN GIntensity=NaN GEOTError=NaN GIntensityError=NaN //assume no peak found, unless it passes the following tests: Variable High_EOT_Limit=hcsr(B,"Graph2"),Low_EOT_Limit=hcsr(A,"Graph2") if (High_EOT_LimitLow_EOT_Limit)) //then the peak found lies within the user-defined limits (set by the cursors) //print "peak found lies within the user-defined limits (set by the cursors)" //if ((W_coef[0]+W_coef[1])>(W_ParamConfidenceInterval[0]+W_ParamConfidenceInterval[1])) //is the peak intensity above the 95% confidence interval (is it greater than 2 sigma of the noise)? if ((W_coef[0]+W_coef[1])>GThreshold) //user defined threshold (See "File Loader" panel) If peak is too small ignore it if (W_ParamConfidenceInterval[2]Intensity_threshold) //then there is a peak above the threshold noise level in this range, do the fit //print "limits for "+NameofWave(Spectrum)+" are "+num2str(V_maxloc-range/2)+", "+num2str(V_maxloc+range/2) //CurveFit/Q/N gauss Spectrum[V_maxloc-range/2,V_maxloc+range/2]/X=Wavelength/D=Fit_Spectrum/F={0.950000, 4} WAVE W_coef //these 2 waves (W_coef and W_ParamConfidenceInterval) are generated by CurveFit; declare them or you can't access them WAVE W_ParamConfidenceInterval //GPeakWavelength=NaN GIntensity=NaN //GWavelengthError=NaN GIntensityError=NaN GEOT=W_coef[2]/2/pi //this will be 2nL GEOTError=W_ParamConfidenceInterval[2] //assume no peak found, unless it passes the following tests: //if(W_ParamConfidenceInterval[2]Low_Wavelength_Limit)) //then the peak found lies within the user-defined limits (set by the cursors) // if ((W_coef[0]+W_coef[1])>(W_ParamConfidenceInterval[0]+W_ParamConfidenceInterval[1])) //is the peak intensity above the 95% confidence interval (is it greater than 2 sigma of the noise)? // GPeakWavelength=W_coef[2] // GIntensity=W_coef[0]+W_coef[1] //this is peak intensity (W_coef[1]) + baseline offset (W_coef[0]) // GWavelengthError=W_ParamConfidenceInterval[2] // GIntensityError=W_ParamConfidenceInterval[0]+W_ParamConfidenceInterval[1] // endif // endif //endif //else //GPeakWavelength=NaN //no peak found above threshold levels specified //GIntensity=NaN //endif //endif if (GSlowMode) //then update all plots so user can view the process. This slows things down A LOT DoUpdate endif end Function SetCursorPositions(ctrlName) : ButtonControl //this resets the cursor positions in the spectrum window if they lose lock during a run. String ctrlName String PlotName SVAR GShowFFT NVAR GCursorAPoint_spectrum, GCursorBPoint_spectrum if (cmpstr(GShowFFT,"FFT")==0) //then monitor the FFT peak in Graph2. Otherwise do it to the spectrum in Graph1 PlotName="Graph2" Dowindow/F Graph2 else PlotName="Graph1" Dowindow/F Graph1 endif GCursorAPoint_spectrum=pcsr(A,PlotName) //memorize the new peak positions GCursorBPoint_spectrum=pcsr(B,PlotName) End Macro GotoAbout(ctrlName) : ButtonControl String ctrlName DoWindow/F Notebook0 EndMacro //**********************Fourier Transform Routines*********************************************** //Macro ShowFFT(ctrlName,popNum,popStr) : PopupMenuControl // String ctrlName // Variable popNum // String popStr, SpectrumName, filelist, FTFilename // GShowFFT=popstr // DisplayFFT() //EndMacro Macro DisplayFFT() //puts up the FFT plot and takes the FFT of the spectra loaded in Graph0 String SpectrumName, filelist, FTFilename, FFTSpectrumName PauseUpdate;Silent 1 Variable i=0 Variable x_AxisMin, x_AxisMax, Scale_X_axis=0 Make/O/N=4096 Fit_FFT fit_FFT=NaN FTFilename="Fit_FFT" // if no spectra are loaded in the main spectral window, default to the Fit_FFT spectrum if (cmpstr(GMonitorSpectrumMode,"FFT")==0) //Show the FFT if (Wintype("Graph2")==1) //put away old "Fourier Analysis" plot, put up new one //first memorize where the cursors are in this plot GCursorA_FFT=hcsr(A,"Graph2") GCursorB_FFT=hcsr(B,"Graph2") //now memorize the x-axis start and stop points GetAxis/W=Graph2/Q bottom x_AxisMin=V_min x_AxisMax=V_max Scale_X_axis=1 //to tell the program that it needs to keep these axis values DoWindow/K Graph2 endif Graph2() do //bounce through all the spectra in Graph0, take and display the FFT SpectrumName=NameofWave(WaveRefIndexed("Graph0",i,1)) if(cmpstr(SpectrumName,"Fit_Spectrum")==0) //Skip this spectrum i+=1 SpectrumName=NameofWave(WaveRefIndexed("Graph0",i,1)) //go to next spectrum endif if(cmpstr(SpectrumName,"")==0) //no more spectra, get out of here Break endif RealTimeFFT(SpectrumName,GFFTWindowing,GFFTResolution,GLimits) FTFilename=SpectrumName+"_Mag" AppendToGraph/W=Graph2 $FTFilename i+=1 while(1) wavestats/Q/R=(x_AxisMin, x_AxisMax) $FTFilename //find a peak in the FFT window if(V_npnts>0) SetAxis left 0,V_Max //Ensure the cursors are still on the plot in the right place: doUpdate FFTSpectrumName=StringFromList(1,TraceNameList("Graph2",";",1)) //get name of first real wave in the series //FFTSpectrumName=NameofWave(WaveRefIndexed("Graph2",1,1)) cursor/H=1/L=1/W=Graph2 A, $FFTSpectrumName,GCursorA_FFT cursor/H=1/L=1/W=Graph2 B, $FFTSpectrumName,GCursorB_FFT endif if(Scale_X_axis) //retain the previous x axis range SetAxis/W=Graph2 bottom x_AxisMin,x_AxisMax endif Label left "Intensity" Label bottom "2nL (nm)" else //user has not requested a Fourier transform if (Wintype("Graph2")==0) //the "Fourier Analysis" plot is already put away else //put away the "Fourier Analysis" plot //memorize the cursor positions first GCursorA_FFT=hcsr(A,"Graph2") GCursorB_FFT=hcsr(B,"Graph2") DoWindow/k Graph2 endif endif EndMacro Function RealTimeFFT(w,windowing,resolution,limits) //designed to do a fast FFT of wave named "w" //w is considered to be an optical spectrum from the ocean optics CCD. The routine takes the wavelength x-axis from //"Wavelength" and converts it to the proper frequency scaling before FFT. string w variable windowing //This is the windowing: 1= None; 2=Hanning variable resolution //Resolution enhancement: 1, 2, 3, 4, 5, 6 are: none;2;4;8;16;32 respectively. Actually just determines how many data points are in the FFT variable limits //Modified from Wavemetrics Library //Given an input wave ( doesn't have to be a power of two), creates a new wave //with the suffix "_Mag" that contains the normalized frequency response //Several levels of resolution enhancement (really just sin x/x interpolation) are provided. //Options include windowing (Hann) vs no windowing. string destw=w+"_Mag" Variable n //= numpnts($w) variable start_point, end_point if (limits) //want to do FFT only on portion of spectrum selected between the cursors in the spectrum window NVAR GCursorAPoint_spectrum=GCursorAPoint_spectrum NVAR GCursorBPoint_spectrum=GCursorBPoint_spectrum GCursorAPoint_spectrum=pcsr(A,"Graph0") GCursorBPoint_spectrum=pcsr(B,"Graph0") start_point=GCursorAPoint_spectrum end_point=GCursorBPoint_spectrum else //do FFT on entire spectrum start_point=0 end_point=numpnts($w)-1 endif if( (resolution<1) %| (resolution>6) ) Abort "resolution out of range" endif resolution=2^resolution //convert this resolution value to the appropriate binary number (if file length is 2^n, it speeds up the FFT algorithm) //resolution -= 1 Duplicate/O/R=[start_point,end_point] Wavelength, xData xData=1/xData //X axis will be 1/nm so FT will be in nm Duplicate/O/R=[start_point,end_point] $w, yData Sort xData, xData, yData // sort by increasing X Duplicate/O yData, tempFFT // make tempFFT file to contain properly scaled waveform SetScale/I x xData[0], xData[(numpnts(xData)-1)], tempFFT // set the range of X values tempFFT = interp(x, xData, yData) if(windowing==2) Hanning tempFFT; tempFFT *= 2 //assumes continuous rather than pulsed data endif n= numpnts(yData) Redimension/N=(CeilPwr2(n)*2^resolution) tempFFT //pad with zeros to power of 2 //print "resolution is " +num2str(resolution) //print "Ceilpwr2(n) is " +num2str(CeilPwr2(n)) //print "number of new data points is " +num2str(CeilPwr2(n)*2^resolution) fft tempFFT Wave/C tempFFTC= tempFFT //this resets the complex part of FTspectrum, which was generated in the fft tempFFTC=r2polar(tempFFT) Redimension/R tempFFTC //NOTE: depending on your application you may want to un-comment the next line // $destw[0] /= 2 //dc is special tempFFT /= n/2 SetScale y,0,0,"Cts",tempFFT Redimension/R tempFFT Duplicate/O tempFFT $destw end //************************Wavelength calibration routines******************************************** Macro GotoWavelengthCalibration(ctrlName) : ButtonControl //Button that brings up the Wavelength Calibration graph String ctrlName if (Wintype("Graph3")==0) //put up "Wavelength Calibration" plot. It should be on the front anyway, since this macro will be called from a pull-down window Graph3() else DoWindow/F Graph3 endif EndMacro Macro ChooseNeFileName(ctrlName,popNum,popStr) : PopupMenuControl //Selects the spectrum and sends the name to LoadNeonSpectrum routine to load it into the window Graph3 String ctrlName Variable popNum String popStr LoadNeonSpectrum(popStr) EndMacro Macro LoadNeonSpectrum(SpectrumName) //This loads the Neon spectrum into Graph3 prior to performing a wavelength calibration String SpectrumName String CCD, filelist if (Wintype("Graph3")==0) //put up "Wavelength Calibration" plot. It should be on the front anyway, since this macro will be called from a pull-down window Graph3() else DoWindow/F Graph3 endif PauseUpdate;Silent 1 //Clear all spectra from the window: do filelist=WaveName("Graph3",0,1) if ((CmpStr("",filelist))== 0) Break endif RemoveFromGraph $filelist //KillWaves $filelist //delete any spectra previously loaded into this window from the experiment (original file is NOT deleted). while (1) //Now load the file GCCD="none" Append $SpectrumName vs Wavelength print ("Ocean Optics spectrum "+S_Filename+" loaded as "+SpectrumName) //This loads the most recently calibrated wavelength scale Wavelength=B_poly0+x*B_poly1+x*x*B_poly2 //calibration data from Ocean Optics for USB CCD wavestats/Q $SpectrumName cursor/H=1/L=1 A $SpectrumName,V_maxloc Label Bottom "Nanometers" Label Left "Relative Intensity" Modify mirror=2 EndMacro Window Table0() : Table PauseUpdate; Silent 1 // building window... Edit/W=(492,44,733,249) Peak_Lambda,Pixel_Number, Peak_Height as "Wavelength Calibration" ModifyTable width(Peak_Lambda)=74,width(Pixel_Number)=86 EndMacro Macro RevertToFactory(ctrlName) : ButtonControl //Button that resets the wavelength scale to the factory settings String ctrlName String CCD, spectrum Variable Poly0, Poly1, Poly2 spectrum=(WaveName("",0, 1)) Poly0=Factory_poly0; Poly1=Factory_poly1; Poly2=Factory_poly2 //these global variables are set with the "initialize" macro Wavelength=Poly0+Poly1*(x)+Poly2*(x^2) make/O/n=5 Peak_Lambda,Pixel_Number, Peak_Height //set up the files for wavelength calibration Peak_Height={1,0.35,0.37,0.52,0.08} Peak_Lambda={585.3,614.3,640.2,703.2,811.5} Pixel_Number={693.408,521.871,581.719,733.941,995.78} EndMacro Macro CalibrateWavelength(ctrlName) : ButtonControl //Button that initiates the automated Wavelength Calibration routines String ctrlName String CCD, spectrum variable poly0, poly1, poly2, Number_of_Peaks, pp Silent 1 //Note: This assumes a slope for each spectrum calibration, //sets the calibration as close as it can get, then does a peak pick to get the exact values for the 5 points for the fit. //It is more automatic and requires no input from the operator unless the spectrum is not recognised. if (Wintype("Graph3")==0) //put up Neon Lamp plot Graph3() else DoWindow/F Graph3 endif if (Wintype("Table0")==0) //put up Table with calibration values Table0() else DoWindow/F Table0 endif //put the Ne scan up, stick cursor on highest peak (assumed to be the 585.3 nm one) spectrum=(WaveName("",0, 1)) if ((CmpStr("",spectrum))== 0) Doalert 0, "There is no spectrum loaded in the window. Choose your neon lamp spectrum in the popup window first." Abort endif wavestats/Q $spectrum cursor A $spectrum,V_maxloc $Spectrum=$Spectrum/V_max //Normalize the spectrum so that the largest peak has a y value of 1. This is for the peak recognition routine. //Find the peaks automatically: //Set the parameters for the CCD type, based on the letter code at the beginning of the spectrum name, then apply that with the "factory" settings for the CCD poly0=B_poly0; poly1=B_poly1; poly2=B_poly2 //calibration data from "Initialize" macro. Uses polynomial fit, of the form: Wavelength = A_poly0+x*A_poly1+x*x*A_poly2. These are the factory values Duplicate/O Wavelength TempWavelength //in case you need to restore the spectrum to original //for most neon lamps, the largest emission line is at 585.3 nm Wavelength=poly0+x*poly1+x*x*poly2 //approximate the wavelength scale //We have just made a quick approximation as to where the peaks should be. //Now go find the peaks and apply the calibration pp=0 do FindLevel/Q/P Wavelength, Peak_Lambda[pp] //get the point number corresponding to the predicted wavelength of the peak Pixel_Number[pp]=V_LevelX Cursor A $spectrum,Pixel_Number[pp] //Places cursor A on the spectrum where the next peak is expected FindPeak/Q/M=(Peak_Height[pp]/2.5)/R=[pcsr(a)-20,pcsr(a)+20]$spectrum //this finds the peak max if it is w/in +/-20 points and within 1/2.5 of the intensity of the standard spectrum. Optimized for Ocean Optics CCDs Cursor A $spectrum,Pixel_Number[pp] //Places cursor A on the found peak if (V_Flag>0) //Peak was not found Wavelength=TempWavelength //restore the original spectrum DoAlert 0, "Peak not found at "+num2str(hcsr(A))+" nm. Calibrate spectrum manually using 'Pick peak' macro." DoWindow/F Graph3 GCal_Number=pp Print("Place Cursor on the peak at "+num2str(Peak_Lambda[pp])+" nanometers, then Press apple 1") Abort //This bombs you out of the loop. endif Pixel_Number[pp]=V_PeakLoc //Set Pixel_Number to the point of max (note this isn't an integer) Print ("Calibration peak number "+num2str(pp)+" found") pp+=1 while (pp" SetVariable set_error_threshold,value= GWavelengthErrorThreshold EndMacro Window ProtectedWaves() : Table PauseUpdate; Silent 1 // building window... Edit/W=(0,44,490,150) Header0,Header1,Header3,Peak_Lambda,Pixel_Number,Peak_Height as "ProtectedWaves" EndMacro Function PlotSpectralPeakShift() String SpectrumName Variable i=0, Datapoint=0 NVAR GPeakWavelength, GIntensity, GCursorAPoint_spectrum, GCursorBPoint_spectrum,GStartTime NVAR GWavelengthError,GIntensityError WAVE/T LoadedSpectra WAVE PeakPosition,PositionError,PeakIntensity,IntensityError,TimePoint //This function goes through all the spectra in Graph0 and plots the wavelength and intensity of a peak in a specified range do //bounce through all the spectra in Graph0, Measure the peak position SpectrumName=NameofWave(WaveRefIndexed("Graph0",i,1)) if(cmpstr(SpectrumName,"")==0) //no more spectra, get out of here Break endif if(cmpstr(SpectrumName,"Fit_Spectrum")==0) //don't want to monitor this one, skip it else //print("looking at "+Spectrumname) //LoadSpectrum(FileName) //extract requested information about the spectrum and place it in the appropriate waves: DataPoint=numpnts(LoadedSpectra) //the data point number that you are adding to the files //Redimension/N=(DataPoint+1) PeakMaxWavelength //add one extra data row to all waves used in the routine Redimension/N=(DataPoint+1) PeakPosition Redimension/N=(DataPoint+1) PositionError Redimension/N=(DataPoint+1) PeakIntensity Redimension/N=(DataPoint+1) IntensityError Redimension/N=(DataPoint+1) LoadedSpectra Redimension/N=(DataPoint+1) Timepoint LoadedSpectra[DataPoint]=Spectrumname GetSpectrumPeakPosition($SpectrumName) //DoUpdate //so the user can watch the progress of the fitting. Remove this if the program runs too slow. PeakPosition[datapoint]=GPeakWavelength PositionError[datapoint]=GWavelengthError PeakIntensity[datapoint]=GIntensity IntensityError[datapoint]=GIntensityError if (DataPoint==0) //this is this first spectrum being loaded, we should take GStartTime from the first spectrum GStartTime=ExtractTime(StringFromList(0, note($Spectrumname)),StringFromList(1, note($Spectrumname))) // [, listSepStr ])DateString, TimeString)(note($Spectrumname)) endif Timepoint[Datapoint]=ExtractTime(StringFromList(0, note($Spectrumname)),StringFromList(1, note($Spectrumname)))-GStartTime endif i+=1 while(1) End Function PlotFFTPeakShift() String SpectrumName, FFTSpectrumName Variable i=0, Datapoint=0 NVAR GEOT,GFFTPeakWidth, GIntensity, GCursorAPoint_spectrum, GCursorBPoint_spectrum,GStartTime NVAR GEOTError,GIntensityError WAVE/T LoadedSpectra WAVE PeakPosition,PositionError,PeakIntensity,IntensityError,TimePoint //This function goes through all the spectra in Graph2 and plots the EOT and intensity of a peak in a range specified by the cursors do //bounce through all the spectra in Graph2, Measure the peak position FFTSpectrumName=NameofWave(WaveRefIndexed("Graph2",i,1)) SpectrumName=FFTSpectrumName[0,strlen(FFTSpectrumName)-5] //strip off the "_MAG" ending if(cmpstr(FFTSpectrumName,"")==0) //no more spectra, get out of here Break endif if(cmpstr(FFTSpectrumName,"Fit_FFT")==0) //don't want to monitor this one, skip it else //print("looking at "+Spectrumname) //LoadSpectrum(FileName) //extract requested information about the spectrum and place it in the appropriate waves: DataPoint=numpnts(LoadedSpectra) //the data point number that you are adding to the files //Redimension/N=(DataPoint+1) PeakMaxWavelength //add one extra data row to all waves used in the routine Redimension/N=(DataPoint+1) PeakPosition Redimension/N=(DataPoint+1) PositionError Redimension/N=(DataPoint+1) PeakIntensity Redimension/N=(DataPoint+1) IntensityError Redimension/N=(DataPoint+1) LoadedSpectra Redimension/N=(DataPoint+1) Timepoint LoadedSpectra[DataPoint]=FFTSpectrumName GetFFTPeakPosition($FFTSpectrumName) //DoUpdate //so the programmer could watch the progress of the fitting routine. PeakPosition[datapoint]=GEOT PositionError[datapoint]=GEOTError PeakIntensity[datapoint]=GIntensity IntensityError[datapoint]=GIntensityError //generate the original spectrum name from this FFT spectrum, which has "_MAG" appended on the end if (DataPoint==0) //this is this first spectrum being loaded, we should take GStartTime from the first spectrum GStartTime=ExtractTime(StringFromList(0, note($Spectrumname)),StringFromList(1, note($Spectrumname)))// [, listSepStr ])DateString, TimeString)(note($Spectrumname)) endif Timepoint[Datapoint]=ExtractTime(StringFromList(0, note($Spectrumname)),StringFromList(1, note($Spectrumname)))-GStartTime endif i+=1 while(1) End Function PlotSpectrumFrequencyShift() String SpectrumName Variable i=0, Datapoint=0 NVAR GEOT, GIntensity, GCursorAPoint_spectrum, GCursorBPoint_spectrum,GStartTime NVAR GEOTError,GIntensityError WAVE/T LoadedSpectra WAVE PeakPosition,PositionError,PeakIntensity,IntensityError,TimePoint //This function goes through all the spectra in Graph0 and plots the wavelength and intensity of a peak in a specified range do //bounce through all the spectra in Graph0, Measure the peak position SpectrumName=NameofWave(WaveRefIndexed("Graph0",i,1)) if(cmpstr(SpectrumName,"")==0) //no more spectra, get out of here Break endif if(cmpstr(SpectrumName,"Fit_Spectrum")==0) //don't want to monitor this one, skip it else //print("looking at "+Spectrumname) //LoadSpectrum(FileName) //extract requested information about the spectrum and place it in the appropriate waves: DataPoint=numpnts(LoadedSpectra) //the data point number that you are adding to the files //Redimension/N=(DataPoint+1) PeakMaxWavelength //add one extra data row to all waves used in the routine Redimension/N=(DataPoint+1) PeakPosition Redimension/N=(DataPoint+1) PositionError Redimension/N=(DataPoint+1) PeakIntensity Redimension/N=(DataPoint+1) IntensityError Redimension/N=(DataPoint+1) LoadedSpectra Redimension/N=(DataPoint+1) Timepoint LoadedSpectra[DataPoint]=Spectrumname GetSpectrumFrequency($SpectrumName) //DoUpdate //so the user can watch the progress of the fitting. Remove this if the program runs too slow. PeakPosition[datapoint]=GEOT PositionError[datapoint]=GEOTError PeakIntensity[datapoint]=GIntensity IntensityError[datapoint]=GIntensityError if (DataPoint==0) //this is this first spectrum being loaded, we should take GStartTime from the first spectrum GStartTime=ExtractTime(StringFromList(0, note($Spectrumname)),StringFromList(1, note($Spectrumname))) // [, listSepStr ])DateString, TimeString)(note($Spectrumname)) endif Timepoint[Datapoint]=ExtractTime(StringFromList(0, note($Spectrumname)),StringFromList(1, note($Spectrumname)))-GStartTime endif i+=1 while(1) End Window Graph0_1() : Graph PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Fit_Spectrum vs Wavelength as "Spectra Loaded" AppendToGraph A_mjs1_eth1 vs Wavelength ModifyGraph lSize(Fit_Spectrum)=2 ModifyGraph rgb(Fit_Spectrum)=(1,4,52428) ModifyGraph mirror=2 ModifyGraph fSize=14 ModifyGraph lblMargin(left)=4,lblMargin(bottom)=2 ModifyGraph axOffset(left)=0.714286,axOffset(bottom)=0.25 ModifyGraph lblLatPos(bottom)=1 Label left "\\Z18Relative Intensity" Label bottom "\\Z18Wavelength (nm)" Cursor/P/H=1 A A_mjs1_eth1 403;Cursor/P/H=1 B A_mjs1_eth1 1832 ShowInfo ControlBar 80 Button GotoPlotPeakShift,pos={70,51},size={110,20},proc=GotoPlotSpectralPeakShift,title="Plot peak shift" Button GotoPlotFrequencyShift,pos={50,51},size={130,20},disable=1,proc=GotoPlotSpectrumFrequencyShift,title="Plot frequency shift" PopupMenu Remove_spectrum,pos={264,5},size={187,20},proc=remove_spectrum,title="Remove spectrum:" PopupMenu Remove_spectrum,mode=2,popvalue="Fit_Spectrum",value= #"\"remove all;\"+WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu What_to_measure,pos={18,4},size={200,20},proc=WhatToMeasurePopup,title="Measure:" PopupMenu What_to_measure,mode=1,popvalue="peak between cursors",value= #"\"peak between cursors;cosine between cursors;FFT of entire spectrum;FFT between cursors\"" SetVariable set_peak_width,pos={28,30},size={150,15},proc=SetPeakWidth,title="Width of peak (nm):" SetVariable set_peak_width,value= GPeakWidth ValDisplay Peak_position,pos={188,55},size={150,14},title="Peak wavelength (nm):" ValDisplay Peak_position,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position,value= #"GPeakWavelength" ValDisplay Peak_position_error,pos={343,55},size={50,14},title="" ValDisplay Peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position_error,value= #"GWavelengthError" EndMacro Window Graph6() : Graph PauseUpdate; Silent 1 // building window... Display /W=(495,144,1047,419) PeakPosition vs TimePoint ModifyGraph lSize=2 ModifyGraph fSize=14 Label left "\\Z16Wavelength maximum, nm" Label bottom "\\Z16Time, sec" Cursor/P A PeakPosition 29;Cursor/P B PeakPosition 3 ShowInfo EndMacro Proc ExportSelectedPopup(ctrlName,popNum,popStr) : PopupMenuControl String ctrlName Variable popNum String popStr GSpectrumName=popStr ExportSelectedSpectrum() End Proc ExportSelectedFFTPopup(ctrlName,popNum,popStr) : PopupMenuControl String ctrlName Variable popNum String popStr GSpectrumName=popStr ExportSelectedFFT() End Macro ExportSelectedSpectrum(Type_of_save) String Type_of_save Prompt Type_of_save,"save spectrum "+GSpectrumName+" as: ",popup,"tab-delimited text;IGOR binary" String Spectrum_name String Name_to_save_as,Name_of_all_spectra print V_Flag //if (V_flag==1)//continue was clicked Spectrum_name=GSpectrumName print "saving "+Spectrum_name+" as "+Type_of_save if (cmpstr(Type_of_save,"tab-delimited text")==0) //save as tab-delimited Name_to_save_as=GSpectrumName+".txt" Name_of_all_spectra="Wavelength;"+Spectrum_name Save/B/J/W/I Name_of_all_spectra as Name_to_save_as endif if (cmpstr(Type_of_save,"IGOR binary")==0) //save as IGOR binary Name_to_save_as=GSpectrumName+".ibw" Name_of_all_spectra="Wavelength;"+Spectrum_name Save/B/C Name_of_all_spectra as Name_to_save_as endif //endif End Macro ExportSelectedFFT(Type_of_save) String Type_of_save Prompt Type_of_save,"save spectrum "+GSpectrumName+" as: ",popup,"tab-delimited text;IGOR binary" String Spectrum_name String Name_to_save_as,Name_of_all_spectra print V_Flag //if (V_flag==1)//continue was clicked Spectrum_name=GSpectrumName print "saving "+Spectrum_name+" as "+Type_of_save if (cmpstr(Type_of_save,"tab-delimited text")==0) //save as tab-delimited. In this case you need to make an x-axis Name_to_save_as=GSpectrumName+".txt" Duplicate/O $Spectrum_name nL nL=x/2 Name_of_all_spectra="nL;"+Spectrum_name Save/B/J/W/I Name_of_all_spectra as Name_to_save_as endif if (cmpstr(Type_of_save,"IGOR binary")==0) //save as IGOR binary Name_to_save_as=GSpectrumName+".ibw" Name_of_all_spectra=Spectrum_name Save/B/C Name_of_all_spectra as Name_to_save_as endif //endif End Macro ExportSpectraToIGOR(ctrlName) : ButtonControl String ctrlName String Name_of_all_spectra="Wavelength" String Name_to_save_as=GSpectrumName[0,strlen(GSpectrumName)-5]+"_spectra" Variable w=0 do Name_of_all_spectra=Name_of_all_spectra+";"+LoadedSpectra[w] //this gets the name of all spectra to save from the list in wave "Spectra" w+=1 while(w>SLIM" PopupMenu exportToSlim,mode=1,popvalue="air",value= #"\"air;liquid\"" Button doFit,pos={278,9},size={22,20},proc=PerformFit,title="fit" EndMacro Macro ChooseFile(ctrlName,popNum,popStr) : PopupMenuControl //Selects the folder and (if already chosen) loads the selected spectrum in chosen data folder String ctrlName Variable popNum String popStr if (cmpstr(popStr,"Select different folder...")==0) //user wants to select a new path NewPath/O DataFiles //set the path to find the data files PathInfo DataFiles GFolderName=StringFromList((ItemsInList(S_path, ":")-1), S_path,":") GNumber_of_Files=ItemsInList(IndexedFile(DataFiles,-1,GCCD)) else if (cmpstr(popStr,"Load all these files")==0) //user wants to load all files in the current folder with file descriptor defined by the "File descriptor" pulldown resetDisplays() //if we are loading a bunch of files, the old ones in the display window will be purged LoadAllSpectraInFolder() else //load the selected spectrum or spectra if (cmpstr(GLoadType,"SpectraSuite")==0) //then it is a delimited text file from the Ocean Optics program "SpectraSuite" Need to reset all the windows so the timing information isn't messed up resetDisplays() //if we are loading a bunch of files, the old ones in the display window will be purged LoadSpectrum(popStr) else if (cmpstr(GLoadType,"_spectra")==0) //then it is from the old "LiveSuck" program, many individual spectra are all saved in one file. resetDisplays() //if we are loading a bunch of files, the old ones in the display window will be purged LoadSpectrum(popStr) else //Default to load just one spectrum. if (Wintype("Graph0")==0) // Check to make sure Graph0 is up Graph0() endif LoadSpectrum(popStr) endif endif endif DisplayFFT() endif EndMacro Macro ChooseFileDescriptor(ctrlName,popNum,popStr) : PopupMenuControl //Selects the type of spectrum (what appears at the end of the file name) String ctrlName Variable popNum String popStr if (cmpstr(popStr,".Master.Scope")==0) //then it is from Ocean Optics OObase32 software GCCD=".Scope" GLoadType=".Scope" endif if (cmpstr(popStr,".Master.Sample")==0) //then it is from Ocean Optics OObase32 software GCCD=".Sample" GLoadType=".Sample" endif if (cmpstr(popStr,".txt")==0) //then it is a delimited text file, generic GCCD=".txt" GLoadType=".txt" endif if (cmpstr(popStr,".txt (spectrasuite)")==0) //then it is a delimited text file from the Ocean Optics program "SpectraSuite" GCCD=".txt" GLoadType="SpectraSuite" endif if (cmpstr(popStr,"_spectra")==0) //then it is from the old "LiveSuck" program, individual spectra all saved in one file. GCCD="????" GLoadType="_spectra" endif GNumber_of_Files=ItemsInList(IndexedFile(DataFiles,-1,GCCD)) EndMacro Macro ChooseFileType(ctrlName,popNum,popStr) : PopupMenuControl //Selects the type of spectrum (and what appears at the end of the file name) String ctrlName Variable popNum String popStr if (cmpstr(popStr,".Master.Scope")==0) //then it is from Ocean Optics OObase32 software GCCD=".Scope" GLoadType=".Scope" endif if (cmpstr(popStr,".Master.Sample")==0) //then it is from Ocean Optics OObase32 software GCCD=".Sample" GLoadType=".Sample" endif if (cmpstr(popStr,".txt")==0) //then it is a delimited text file, generic GCCD=".txt" GLoadType=".txt" endif if (cmpstr(popStr,".txt (spectrasuite)")==0) //then it is a delimited text file from the Ocean Optics program "SpectraSuite" GCCD=".txt" GLoadType="SpectraSuite" endif if (cmpstr(popStr,"from Fringes7 vi")==0) //then it is a delimited text file (single column) from the National Instruments program "Fringes7" that acquires data from the Ocean Optics spectrometer GCCD=".txt" GLoadType="Fringes7" GCurrentSpectrumTime=1 //timing information not included in this type of file endif if (cmpstr(popStr,"_spectra")==0) //then it is from the old "LiveSuck" program, individual spectra all saved in one file. GCCD="????" GLoadType="_spectra" endif GNumber_of_Files=ItemsInList(IndexedFile(DataFiles,-1,GCCD)) EndMacro Window ms6() : Graph PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Fit_Spectrum vs Wavelength as "Spectra Loaded" AppendToGraph A_msIV_6 vs Wavelength ModifyGraph lSize(Fit_Spectrum)=2 ModifyGraph rgb(Fit_Spectrum)=(1,4,52428) ModifyGraph mirror=2 Label left "Relative Intensity" Label bottom "Wavelength (nm)" Cursor/P/H=1 A A_msIV_6 887;Cursor/P/H=1 B A_msIV_6 433 ShowInfo ControlBar 80 Button GotoPlotPeakShift,pos={70,51},size={110,20},proc=GotoPlotSpectralPeakShift,title="Plot peak shift" Button GotoPlotFrequencyShift,pos={50,51},size={130,20},disable=1,proc=GotoPlotSpectrumFrequencyShift,title="Plot frequency shift" PopupMenu Remove_spectrum,pos={264,5},size={187,20},proc=remove_spectrum,title="Remove spectrum:" PopupMenu Remove_spectrum,mode=2,popvalue="Fit_Spectrum",value= #"\"remove all;\"+WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu What_to_measure,pos={18,4},size={200,20},proc=WhatToMeasurePopup,title="Measure:" PopupMenu What_to_measure,mode=1,popvalue="peak between cursors",value= #"\"peak between cursors;cosine between cursors;FFT of entire spectrum;FFT between cursors\"" SetVariable set_peak_width,pos={28,30},size={150,15},proc=SetPeakWidth,title="Width of peak (nm):" SetVariable set_peak_width,value= GPeakWidth ValDisplay Peak_position,pos={188,55},size={150,14},title="Peak wavelength (nm):" ValDisplay Peak_position,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position,value= #"GPeakWavelength" ValDisplay Peak_position_error,pos={343,55},size={50,14},title="" ValDisplay Peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position_error,value= #"GWavelengthError" EndMacro Window ms7() : Graph PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Fit_Spectrum vs Wavelength as "Spectra Loaded" AppendToGraph A_msIV_7 vs Wavelength ModifyGraph lSize(Fit_Spectrum)=2 ModifyGraph rgb(Fit_Spectrum)=(1,4,52428) ModifyGraph mirror=2 Label left "Relative Intensity" Label bottom "Wavelength (nm)" Cursor/P/H=1 A A_msIV_7 887;Cursor/P/H=1 B A_msIV_7 433 ShowInfo ControlBar 80 Button GotoPlotPeakShift,pos={70,51},size={110,20},proc=GotoPlotSpectralPeakShift,title="Plot peak shift" Button GotoPlotFrequencyShift,pos={50,51},size={130,20},disable=1,proc=GotoPlotSpectrumFrequencyShift,title="Plot frequency shift" PopupMenu Remove_spectrum,pos={264,5},size={187,20},proc=remove_spectrum,title="Remove spectrum:" PopupMenu Remove_spectrum,mode=2,popvalue="Fit_Spectrum",value= #"\"remove all;\"+WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu What_to_measure,pos={18,4},size={200,20},proc=WhatToMeasurePopup,title="Measure:" PopupMenu What_to_measure,mode=1,popvalue="peak between cursors",value= #"\"peak between cursors;cosine between cursors;FFT of entire spectrum;FFT between cursors\"" SetVariable set_peak_width,pos={28,30},size={150,15},proc=SetPeakWidth,title="Width of peak (nm):" SetVariable set_peak_width,value= GPeakWidth ValDisplay Peak_position,pos={188,55},size={150,14},title="Peak wavelength (nm):" ValDisplay Peak_position,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position,value= #"GPeakWavelength" ValDisplay Peak_position_error,pos={343,55},size={50,14},title="" ValDisplay Peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position_error,value= #"GWavelengthError" EndMacro Window ms8() : Graph PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Fit_Spectrum vs Wavelength as "Spectra Loaded" AppendToGraph A_msIV_8 vs Wavelength ModifyGraph lSize(Fit_Spectrum)=2 ModifyGraph rgb(Fit_Spectrum)=(1,4,52428) ModifyGraph mirror=2 Label left "Relative Intensity" Label bottom "Wavelength (nm)" Cursor/P/H=1 A A_msIV_8 887;Cursor/P/H=1 B A_msIV_8 433 ShowInfo ControlBar 80 Button GotoPlotPeakShift,pos={70,51},size={110,20},proc=GotoPlotSpectralPeakShift,title="Plot peak shift" Button GotoPlotFrequencyShift,pos={50,51},size={130,20},disable=1,proc=GotoPlotSpectrumFrequencyShift,title="Plot frequency shift" PopupMenu Remove_spectrum,pos={264,5},size={187,20},proc=remove_spectrum,title="Remove spectrum:" PopupMenu Remove_spectrum,mode=2,popvalue="Fit_Spectrum",value= #"\"remove all;\"+WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu What_to_measure,pos={18,4},size={200,20},proc=WhatToMeasurePopup,title="Measure:" PopupMenu What_to_measure,mode=1,popvalue="peak between cursors",value= #"\"peak between cursors;cosine between cursors;FFT of entire spectrum;FFT between cursors\"" SetVariable set_peak_width,pos={28,30},size={150,15},proc=SetPeakWidth,title="Width of peak (nm):" SetVariable set_peak_width,value= GPeakWidth ValDisplay Peak_position,pos={188,55},size={150,14},title="Peak wavelength (nm):" ValDisplay Peak_position,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position,value= #"GPeakWavelength" ValDisplay Peak_position_error,pos={343,55},size={50,14},title="" ValDisplay Peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position_error,value= #"GWavelengthError" EndMacro Window ms6_8_compare() : Graph PauseUpdate; Silent 1 // building window... Display /W=(0,44,493,493) Fit_Spectrum vs Wavelength as "Spectra Loaded" AppendToGraph A_msIV_8 vs Wavelength AppendToGraph A_msIV_6 vs Wavelength ModifyGraph lSize(Fit_Spectrum)=2 ModifyGraph rgb(Fit_Spectrum)=(1,4,52428),rgb(A_msIV_8)=(1,12815,52428) ModifyGraph mirror=2 Label left "Relative Intensity" Label bottom "Wavelength (nm)" Cursor/P/H=1 A A_msIV_6 887;Cursor/P/H=1 B A_msIV_6 433 ShowInfo ControlBar 80 Button GotoPlotPeakShift,pos={70,51},size={110,20},proc=GotoPlotSpectralPeakShift,title="Plot peak shift" Button GotoPlotFrequencyShift,pos={50,51},size={130,20},disable=1,proc=GotoPlotSpectrumFrequencyShift,title="Plot frequency shift" PopupMenu Remove_spectrum,pos={264,5},size={170,20},proc=remove_spectrum,title="Remove spectrum:" PopupMenu Remove_spectrum,mode=3,popvalue="A_msIV_6",value= #"\"remove all;\"+WaveList(\"!Wavelength\",\";\",\"WIN:Graph0\")" PopupMenu What_to_measure,pos={18,4},size={200,20},proc=WhatToMeasurePopup,title="Measure:" PopupMenu What_to_measure,mode=1,popvalue="peak between cursors",value= #"\"peak between cursors;cosine between cursors;FFT of entire spectrum;FFT between cursors\"" SetVariable set_peak_width,pos={28,30},size={150,15},proc=SetPeakWidth,title="Width of peak (nm):" SetVariable set_peak_width,value= GPeakWidth ValDisplay Peak_position,pos={188,55},size={150,14},title="Peak wavelength (nm):" ValDisplay Peak_position,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position,value= #"GPeakWavelength" ValDisplay Peak_position_error,pos={343,55},size={50,14},title="" ValDisplay Peak_position_error,limits={0,0,0},barmisc={0,1000} ValDisplay Peak_position_error,value= #"GWavelengthError" EndMacro Window Table5() : Table PauseUpdate; Silent 1 // building window... Edit/W=(497,44,826,526) Wavelength,SpectrumIntensity EndMacro //***************************SLIM Routines ************************************** Macro SLIMhelp() //Put up help dialog //NOTE: in this program, EOT is the thickness of the film times the refractive index. If a porous Si film on a Si substrate is measured in reflectivity mode, //the value of optical thickness obtained by Fourier transform or by fit will be 2nL, because the path of light reflecting from the film is //down and back, or twice the film thickness. DoWindow/F AboutSLIM EndMacro EndMacro Function SelectLiquid(ctrlName,popNum,popStr) : PopupMenuControl //sets the values of refractive index for all the liquids used in the fits String ctrlName Variable popNum String popStr NVAR GnFill=GnFill SVAR GFill_Liquid=GFill_Liquid GFill_Liquid=popStr //these are values from the CRC (76th ed), for the liquids at 20 deg C, 589 nm (sodium D line) if (cmpstr(popStr,"Air")==0) GnFill=1.000272 endif if (cmpstr(popStr,"Ethanol")==0) GnFill=1.3611 endif if (cmpstr(popStr,"Water")==0) GnFill=1.333 endif if (cmpstr(popStr,"Toluene")==0) GnFill=1.497 endif if (cmpstr(popStr,"Hexane")==0) GnFill=1.375 endif if (cmpstr(popStr,"Methanol")==0) GnFill=1.328 endif if (cmpstr(popStr,"Acetone")==0) GnFill=1.3588 endif if (cmpstr(popStr,"Dichloromethane")==0) GnFill=1.424 endif if (cmpstr(popStr,"Buffer")==0) Variable BufferIndex=1.3365 //Value Claudia Pacholski measured for our PBS buffer solutions Prompt BufferIndex,"enter the refractive index of your buffer:" DoPrompt "enter the refractive index of your buffer:",BufferIndex GnFill=BufferIndex endif UpdateSLIMPanel() End Macro GotoCalculatePorosity(ctrlName) : ButtonControl String ctrlName UpdateSlimPanel() CalculatePorosityFit("") EndMacro Function CalculatePorosityFit(ctrlName) : ButtonControl //This uses the Bruggeman effective medium model, approximates the value of the porosity and the thickness //of a Fabry-Perot film using the values of the EOT (product of 2nL) taken from the reflectivity spectra taken in air and under //a liquid of refractive index nFill. Assumes that the film is completely filled with the liquid. String ctrlName NVAR GnFill=GnFill NVAR GEOT1=GEOT1 NVAR GEOT2=GEOT2 NVAR GnAir=GnAir NVAR GnPSi=GnPSi NVAR GPorosity=GPorosity NVAR GThickness=GThickness Variable nFill=GnFill, OT1=GEOT1/2, OT2=GEOT2/2, nAir=GnAir, nPSi=GnPSi Make/O/N=1024/D Porosity1,Porosity2,Thickness, PorosityDifference //Used to numerically estimate thickness, porosity. this should give answers precise to 4 sig figs. Thickness=OT2*(1/nAir-1/nPSi)*x/numpnts(Thickness)+OT1/nPSi Porosity1=(((OT1/Thickness)^2-nAir^2)*(2*(OT1/Thickness)^2+nPSi^2))/((3*(OT1/Thickness)^2)*(nPSi^2-nAir^2)) Porosity2=(((OT2/Thickness)^2-nFill^2)*(2*(OT2/Thickness)^2+nPSi^2))/((3*(OT2/Thickness)^2)*(nPSi^2-nFill^2)) PorosityDifference=(Porosity1-Porosity2) FindLevel/Q/P PorosityDifference,0 if (V_Flag==0) //a zero crossing was found GPorosity=1-Porosity1[V_LevelX] GThickness=Thickness[V_LevelX] else ABORT "No combination of thickness and porosity can yield these EOT values for the liquid used. Check values and try again" endif EndMacro Function UpdateSLIMPanel() SVAR GFill_Liquid=GFill_Liquid SetVariable SetEOT2, title="EOT(2nL) of layer in "+GFill_Liquid End Function Bruggeman(nPSi, nfill,P) //for a given porosity, porous Si index, and index of the filling medium, provides the value of the refractive index of the layer, based on the two-component Bruggeman effective medium model //uses the exact solution variable P, nPSi, nfill return (0.5*sqrt(2*nPSi^2-nfill^2-3*P*nPSi^2+3*P*nfill^2+sqrt(8*nPSi^2*nfill^2+(-2*nPSi^2+nfill^2+3*P*nPSi^2-3*P*nfill^2)^2))) End Window SLIM() : Panel PauseUpdate; Silent 1 // building window... NewPanel /W=(4,44,301,234) SetDrawLayer UserBack SetDrawEnv linethick= 4,linefgc= (65535,0,0) DrawLine 22,131,264,131 SetDrawEnv fstyle= 1 DrawText 5,19,"Spectroscopic Liquid Infiltration Method" PopupMenu Liquid,pos={20,48},size={125,20},proc=SelectLiquid,title="Liquid used:" PopupMenu Liquid,mode=1,popvalue="Ethanol",value= #"\"Ethanol;Water;Toluene;Hexane;Methanol;Acetone;Buffer\"" ValDisplay GnFill,pos={157,51},size={88,14},title="index:" ValDisplay GnFill,limits={0,0,0},barmisc={0,1000},value= #"GnFill" SetVariable SetEOT2,pos={21,93},size={239,15},title="EOT(2nL) of layer in Ethanol" SetVariable SetEOT2,limits={1,inf,1},value= GEOT2 SetVariable SetEOT1,pos={21,75},size={239,15},title="EOT(2nL) of layer in Air" SetVariable SetEOT1,limits={1,inf,1},value= GEOT1 Button CalculatePorosity,pos={23,139},size={64,20},proc=GotoCalculatePorosity,title="calculate" ValDisplay GThickness,pos={98,139},size={150,14},title="Thickness (nm):" ValDisplay GThickness,format="%d",limits={0,0,0},barmisc={0,1000} ValDisplay GThickness,value= #"GThickness" ValDisplay GPorosity,pos={108,157},size={120,14},title="Porosity (%):" ValDisplay GPorosity,format="%g",limits={0,0,0},barmisc={0,1000} ValDisplay GPorosity,value= #"round((GPorosity)*1000)/10" SetVariable set_Si_index,pos={21,109},size={146,15},title="porous Si index" SetVariable set_Si_index,limits={1,inf,0.01},value= GnPSi Button helpButton,pos={239,21},size={50,20},proc=GoToAboutSLIM,title="help..." EndMacro Macro GoToSLIM(ctrlName) : ButtonControl String ctrlName if (Wintype("SLIM")==0) //put up "SLIM" panel, if it isn't already up SLIM() else DoWindow/F SLIM endif //if it is up, put the values in window "EOT (2nL, nm) vs. time" (that is, "PeakShiftPlot") into the global variables GEOT1 and GEOT2. The user has to place the cursors on the right points in the plot if (Wintype("PeakShiftPlot")==1) //this window is up, use values from it GEOT1=vcsr(A,"PeakShiftPlot") GEOT2=vcsr(B,"PeakShiftPlot") if (GEOT1>GEOT2) //then we got it backwards. GEOT1 is always the EOT of the sample in air variable swapme=GEOT2 GEOT2=GEOT1 GEOT1=swapme endif endif End Macro SendValueToSlim(ctrlName,popNum,popStr) : PopupMenuControl String ctrlName Variable popNum String popStr if (popNum==1) GEOT1=GEOT endif if (popNum==2) GEOT2=GEOT endif if (Wintype("SLIM")==0) //put up "SLIM" panel, if it isn't already up SLIM() else DoWindow/F SLIM endif End Function PerformFit(ctrlName) : ButtonControl String ctrlName WAVE Spectrum=CsrWaveRef(A,"Graph2") GetFFTPeakPosition(Spectrum) End Function GoToAboutSLIM(ctrlName) : ButtonControl String ctrlName DoWindow/F SLIM_help End Macro ExportData(ctrlName) : ButtonControl //Saves the waves "PeakIntensity" "PeakPosition" "Timepoint" and the names of all the spectra as a tab delimited text file String ctrlName String Name_to_save_as if (strsearch(GSpectrumName,".",0)>0) //then there is a period in the file, get rid of it Name_to_save_as=GSpectrumName[0,strsearch(GSpectrumName,".",0)-1]+".txt" //strip off anything past a period in GSpectrumName; should yield the base name of the data file(s) else Name_to_save_as=GSpectrumName+".txt" endif String Column_title=GMonitorUnits if (Exists("PeakPosition")) Duplicate/O PeakPosition $Column_title //this gives the wave "PeakPosition" a more descriptive name, so you can tell whether it came from a FFT or a intensity-wavelength spectrum Save/J/W/I LoadedSpectra,TimePoint,$Column_title,PeakIntensity as Name_to_save_as Killwaves $Column_title else DoAlert 0 "Cannot find wave 'PeakPosition'. Make sure you have run 'plot peak shift' in the 'Spectra Loaded' or 'Fourier Transform of Spectra' windows..." endif EndMacro