%% Lopap Template % Uses data from 20211115_1431 % %% Info: How to use this % % # Make a copy of this file for each Lopap measurement. Name it % "Lopap"_date_time.m and store it in the folder with the Lopap data. % % Remove all the general text and comments in your file and add notes and % observations about the experiment. % % # You can run this script, publish it, or evaluate it section wise. For % new data run it section wise to carefully update the settings and to % observe the results. % # Once the data is loaded, you can also run individual sections only. % # You may use the LabBook :: Chrono Notes section as lab book. % # All sections that can be modified are marked with the word ":". % # You also need to give time regions such as for the background fit, as % well as to calculate means. There are several options how to do this % % * While running the experiments and observing the signal in the Lopap % software, you can enter the date and times directly in the LabBook : % Select data ranges section. % * You can manually select the regions in a plot. A window will pop up to % select the region to modify. To modify several regions, re-run this % section of the script. This overwrites the current settings. % * The times of the regions are stored in the "TimeRanges.mat" file. If it % exists, this is read; the LabBook : Select data ranges section is then % ignored. %% Info: Output & Variables % % * *lopapReferenceWavelength*: This _string variable_ holds text with % stating the reference wavelength for channel 1 and 2 used to process the % data by the Lopap software. % * *LopapDataCh1 & LopapDataCh2*: These _time tables_ hold the data that % have been processed by the Lopap Software during the data acquisition. It % contains the absorption for a number % of selected wavelength. The absorption is the log of the intensity at the % reference wavelength relative to the intensity at each wavelength of % interest. The timetables hold the time in each row and the wavelength in % the columns. The content is thus identical to that shown in the % "measurement window" of the Lopap software. % * *LopapSpecCh1,LopapSpecCh2*: The _time tables_ hold the full spectrum % for each time. Time is in the rows, wavelength in the columns. The % wavelength are read from the *.prj file, the spectra data from the *.spec % file. The information is identical to that shown in the "spectrum window" % of the Lopap software. % * *LopapTimeT* This is the main results table: % % * time % * raw signal channel 1 % * raw signal channel 2 % * background subtracted channel 1 % * background subtracted channel 2 % * calibrated signal channel 1 in ppt % * calibrated signal channel 2 in ppt % * HONO in ppt (channel 2 -channel 1) % % % * *TimeRanges.mat*: Time ranges after they have been manually modified. If % this file exists, the time range definitions in this script are ignored. % * *LopapMatlabDataDATE_TIME.mat*: Raw data and experimental settings. % Background subtraction and calibration are not saved in this file. When % this file exists, data will not be read from the windows server. % * *LopapDATE_TIME.mat*: Processed data - absorption with time (column 1 % and 2: 'Ch #1' and 'Ch #2') after background (columns 3 and 4: 'Ch #1 % Bkgrd' and 'Ch #2 Bkgrd') subtraction and calibration (columns 5 and 6: % 'Ch #1 Calib' and 'Ch #2 Calib') for one wavelength - that can be used % for further comparison with other experiments and discussion. Also % exported is HONO in ppt (channel2-channel1 after calibration). % %% Matlab: Initialise % % This starts Matlab and defines some common settings such as the path to % the Lopap data. Any modifications can be done at the end of this file in % where the local function _localInitializeMatlab_ is stored. % clear variables in workspace, clear text in command window clearvars clc % set the path to the data and define some custom colours for plotting [fileLocation, myColorMap] = localInitializeMatlab; % : Date when Lopap recording was started. Defines names of Lopap % files and folders. Seconds are irrelevant, but format is important. LopapParameters.MeasurementDate = datenum('15-Nov-2021 14:31:00'); % : Date when Lopap calibration for this measurement was started. % Defines names of Lopap files and folders. Seconds are irrelevant, but % format is important. LopapParameters.CalibrationDate = datenum('11-March-2021 09:51:00'); %% % Print info to command window disp('The data is read from:'); disp(fullfile(fileLocation.server,fileLocation.dataPath,datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM'))); disp(' ') disp('Date of experiment:') disp(datestr(LopapParameters.MeasurementDate)); try disp(' ') disp('Date of calibration:') disp(datestr(LopapParameters.CalibrationDate)); catch end disp(' ') disp('Date of analyis:') disp(datestr(today)); %% Process: Import data % % Reads and imports data from Lopap *.dat, *.spec, and *.prj files and the % calibration results and settings from a *.mat file (*.mat file needs to % be in same folder as this file). % % * *lopapReferenceWavelength*: This _string variable_ holds text with % stating the reference wavelength for channel 1 and 2 used to process the % data by the Lopap software. % * *LopapDataCh1 & LopapDataCh2*: These _time tables_ hold the data that % have been processed by the Lopap Software during the data acquisition. It % contains the absorption for a number % of selected wavelength. The absorption is the log of the intensity at the % reference wavelength relative to the intensity at each wavelength of % interest. The timetables hold the time in each row and the wavelength in % the columns. The content is thus identical to that shown in the % "measurement window" of the Lopap software. % * *LopapSpecCh1,LopapSpecCh2*: The _time tables_ hold the full spectrum % for each time. Time is in the rows, wavelength in the columns. The % wavelength are read from the *.prj file, the spectra data from the *.spec % file. The information is identical to that shown in the "spectrum window" % of the Lopap software. % * *LopapParametersCalibration*: Holds the date, wavelength, % concentrations, flows, temperature & pressure of the calibration % measurement. % * *LopapCalibCalibration* holds the mean, standard deviation, mixing ratio % and fit results of the calibration. The fit results can be used to % calibrate this data-set. It's a linear fit via 0 of signal intensity vs. % HONO in ppt. if isfile(['LopapMatlabData' datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM') '.mat']) load(['LopapMatlabData' datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM') '.mat']) disp('Lopap data loaded from mat file') else [LopapParameters.instrumentReferenceWavelength, LopapDataCh1,LopapDataCh2,LopapSpecCh1,LopapSpecCh2] ... = importLopap(LopapParameters.MeasurementDate,fileLocation); disp('Lopap data imported from intrument') save(['LopapMatlabData' datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM') '.mat'],'LopapDataCh1','LopapDataCh2','LopapParameters','LopapSpecCh1','LopapSpecCh2') end % if the calibration file exist, it will read the results and the % reference wavelength and signal wavelength from that file if isfile(['LopapMatlabData' datestr(LopapParameters.CalibrationDate,'yyyymmdd_HHMM') 'Calib.mat']) LopapParametersCalibration = load(['LopapMatlabData' datestr(LopapParameters.CalibrationDate,'yyyymmdd_HHMM') 'Calib.mat'],'LopapParameters'); LopapCalibCalibration = load(['LopapMatlabData' datestr(LopapParameters.CalibrationDate,'yyyymmdd_HHMM') 'Calib.mat'],'calib'); LopapParameters.wavelengthR = LopapParametersCalibration.LopapParameters.wavelengthR; LopapParameters.wavelengthS = LopapParametersCalibration.LopapParameters.wavelengthS; disp('Calibration data loaded from mat file') else % otherwise, you can choose these wavelength here disp('No calibration done yet!') % : Choose a reference wavelength. Default is 650 nm. LopapParameters.wavelengthR = 650; %nm, reference intensity % : Choose a signal wavelength to calculate the absorption with time % from the spectra LopapParameters.wavelengthS = 530; %nm, signal intensity end %% Matlab: Run mode % % : % % * runs without user interaction and without ability to modify data % ranges, when set to 0; use this to publish. % * if set to 1: stops for user interaction, % modify data ranges is enabled.Use this to run. LopapParameters.Interactive = 1; %% LabBook : Define data ranges %% % These settings can be modified by selecting data ranges in a plot later. % So, you do not necessarily need to type the dates and times here. % (Optional - comment if no needed) state the start and end % time of the time that you want to look at (to exclude very noisy % signal in the beginning and at the end of the data) TimeRange.dataRange = [datenum('15-Nov-2021 16:30:00') datenum('15-Nov-2021 17:20:00')]; % : State the time for the first spectrum that you like to % compare (to confirm nitrite) TimeRange.specCompareOne = datenum('15-Nov-2021 16:49:30'); % : State the time for one spectrum of the second spectrum that % you like to compare (to confirm nitrite) TimeRange.specCompareTwo = datenum('15-Nov-2021 17:02:00'); % : Choose a start and end time for one as many intervals that can % be used to fit the background. Background is the signal when R1&R2 was % attached to the Lopap with zero air entering the sampling coil. TimeRange.backgroundFit = [datenum('15-Nov-2021 15:10:00') datenum('15-Nov-2021 15:50:00')];% ;... % datenum('16-Sep-2020 15:40:50') datenum('16-Sep-2020 15:51:06')]; % confirm that all dates are reasonable tmp = fieldnames(TimeRange); for ii = 1:length(tmp) mustBeLopapReasonableDate(TimeRange.(tmp{ii})) end clearvars tmp* %% Process: Modify data ranges % % Select the range to modify in the pop-up window and the number of fit % ranges for the background fit in the 2nd pop-up window. Then, a figure % will show, select the data ranges in the figure: % % * a line for calibration range, mean zero air and mean % nitrite standard. Select the range by keeping the mouse pushed while % moving from start to end time. % * a line for each background region, default is 2. Select the range by % keeping the mouse pushed while moving from start to end time. % * a point for spectrum with reagents and spectrum with nitrite. Click % once to select a specific time. % % * LopapParameters.Interactive needs to be 1 for this to run. % % # Run this section several times to modify several time regions % # Press cancel in the pop-up window if you do not want to modify any % region. TimeRange = modifyLopapTimeRanges(TimeRange, LopapParameters, LopapDataCh1, LopapDataCh2); clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* %% Process: Find closest match of selected dates in data set % % The data is sampled at specific times with a certain interval. The % selected or chosen dates might not necessarily exactly match the data. % Here, closest match to the given dates are selected. tmp.d1 = TimeRange.specCompareOne; tmp.d2 = LopapSpecCh1.Time; [~,ind1] = min(abs(bsxfun(@minus,datenum(tmp.d2),datenum(tmp.d1)'))); TimeRange.specCompareOne = tmp.d2(ind1,:); tmp.d1 = TimeRange.specCompareTwo ; tmp.d2 = LopapSpecCh1.Time; [~,ind1] = min(abs(bsxfun(@minus,datenum(tmp.d2),datenum(tmp.d1)'))); TimeRange.specCompareTwo = tmp.d2(ind1,:); % save current state of clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* save(['LopapMatlabData' datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM') '.mat'],'LopapDataCh1','LopapDataCh2','LopapParameters','LopapSpecCh1','LopapSpecCh2') %% LabBook: Data ranges used in this work % % This plots the for ii=1:size(TimeRange.backgroundFit,1) fprintf('Background range: %s to %s \n',datestr(TimeRange.backgroundFit(ii,1)), datestr(TimeRange.backgroundFit(ii,2))) end fprintf('Comparision Spectrum 1: %s \n',datestr(TimeRange.specCompareOne(1))) fprintf('Comparision Spectrum 2: %s \n',datestr(TimeRange.specCompareTwo(1))) %% Plot all data % % Here, we plot the data as shown in the "Measurement window" of the Lopap % software. That is, the processed $I^{*}_{i}$ data for all wavelength as % defined in the settings of the Lopap software. % % % For every measurement wavelength I_i the program calculates the % measurement (absorption) value I_i^* from the spectral intensity on the % measurement wavelength I_i and a reference wavelength I_r with the % following operation: % % % $$I^{*}_{i} = log_{10} (\frac{I_r}{I_i})$$ % % % % The plots show time on the x-axis and the ABS intensity on the y axis for % each wavelength in separate graphs. One Figure for each Channel. figure( 'Name', 'LopapChannel1','NumberTitle','off','Position',[10 100 550 700]); ch1s=stackedplot(LopapDataCh1); title(LopapParameters.instrumentReferenceWavelength(1)) for ii = 1:width(LopapDataCh1) % : The numbers in the brackets give the lower and upper limit % of the y-axis. Adapt these to fit your data and remove the % sign. % ch1s.AxesProperties(ii).YLimits = [-0.4 -0.1]; end grid ON % Add title and axis labels xlabel('Lab Time') figure( 'Name', 'LopapChannel2','NumberTitle','off','Position',[600 100 550 700]); ch2s=stackedplot(LopapDataCh2); title(LopapParameters.instrumentReferenceWavelength(2)) for ii = 1:width(LopapDataCh2) % : The numbers in the brackets give the lower and upper limit % of the y-axis. Adapt these to fit your data and remove the % sign. % ch2s.AxesProperties(ii).YLimits = [-0.2 0.3]; end grid ON % Add title and axis labels xlabel('Lab Time') clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end %% Plot all data :: selected time range % if isfield(TimeRange,'dataRange') TR = timerange(datestr(TimeRange.dataRange(1)),datestr(TimeRange.dataRange(2))); figure( 'Name', 'LopapChannel1','NumberTitle','off','Position',[10 100 550 700]); ch1s=stackedplot(LopapDataCh1(TR,:)); title(LopapParameters.instrumentReferenceWavelength(1)) for ii = 1:width(LopapDataCh1) % : The numbers in the brackets give the lower and upper limit % of the y-axis. Adapt these to fit your data and remove the % sign. % ch1s.AxesProperties(ii).YLimits = [-0.4 -0.1]; end grid ON % Add title and axis labels xlabel('Lab Time') figure( 'Name', 'LopapChannel2','NumberTitle','off','Position',[600 100 550 700]); ch2s=stackedplot(LopapDataCh2(TR,:)); title(LopapParameters.instrumentReferenceWavelength(2)) for ii = 1:width(LopapDataCh2) % : The numbers in the brackets give the lower and upper limit % of the y-axis. Adapt these to fit your data and remove the % sign. % ch2s.AxesProperties(ii).YLimits = [-0.2 0.3]; end grid ON % Add title and axis labels xlabel('Lab Time') clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end end %% Plot selected data with Notes % % Here we plot the $I^{*}_{i}$ data for one wavelength only. if isfield(TimeRange,'dataRange') TR = timerange(datestr(TimeRange.dataRange(1)),datestr(TimeRange.dataRange(2))); end ch1f = figure( 'Name', 'LopapChannel1 550','NumberTitle','off','Position',[10 100 550 800]); % : The numbers in the curled brackets give wavelength for which you'd % like to display the data. The numbers need to be exactly match the % labels in the previous figure. if isfield(TimeRange,'dataRange') ch1ax=plot(LopapDataCh1(TR,:).Time,LopapDataCh1(TR,:).('550.7')); else ch1ax=plot(LopapDataCh1.Time,LopapDataCh1.('550.7')); end title(LopapParameters.instrumentReferenceWavelength(1)) % : The numbers in the brackets give the lower and upper limit % of the y-axis. Adapt these to fit your data and remove the % sign. %ch1s.AxesProperties.YLimits = [-0.4 -0.1]; grid ON % Add title and axis labels xlabel('Lab Time') ch2f = figure( 'Name', 'LopapChannel2 550','NumberTitle','off','Position',[600 100 550 800]); % : The numbers in the curled brackets give wavelength for which you'd % like to display the data. The numbers need to be exactly match the % labels in the previous figure if isfield(TimeRange,'dataRange') ch2ax=plot(LopapDataCh2(TR,:).Time,LopapDataCh2(TR,:).('550.5')); else ch2ax=plot(LopapDataCh2.Time,LopapDataCh2.('550.5')); end title(LopapParameters.instrumentReferenceWavelength(2)) % : The numbers in the brackets give the lower and upper limit % of the y-axis. Adapt these to fit your data and remove the % sign. % ch2s.AxesProperties.YLimits = [-0.2 0.3]; grid ON % Add title and axis labels xlabel('Lab Time') clearvars -except Lopap* fileLocation myColorMap lopap* TimeRange* ch1f ch2f if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end %% LabBook :: Annotate Figure % % % * 16:07 N2+water % * 16:23 N2+R1+R2 % * 16:37 bubbles in the system % * 16:46 N2/O2/RH(78%)+NO2+ flow tube in line + LIGHT % * 17:05 N2/O2/RH(78%)+NO2+ flow tube in line è switch off light % * 17:15 Close ABS channel and switch the tubes of R1+R2 to the water % * 17:21 N2/O2/RH(78%) è open the ABS channel, bypass the reactor and close NO2 supply % * 17:30 N2 è switch off O2 supply and the humidifier % * 17:32 stop recording % clc % ax = ch1f.CurrentAxes; % deltaT = 6; % eTime = datetime("25-Feb-2021 16:07:00")+minutes(deltaT); % xPos = find(LopapDataCh1.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh1(xPos,:).('550.7'),... % '\leftarrow N2+water'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 16:23:00")+minutes(deltaT); % xPos = find(LopapDataCh1.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh1(xPos,:).('550.7'),... % '\leftarrow N2+R1&R2'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 16:37:00")+minutes(deltaT); % xPos = find(LopapDataCh1.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh1(xPos,:).('550.7'),... % '\leftarrow Bubbles!'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 16:46:00")+minutes(deltaT); % xPos = find(LopapDataCh1.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh1(xPos,:).('550.7'),... % {['\leftarrow N2/O2/RH(78%)+NO2+'],[' flow tube in line + LIGHT']}); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 17:05:00")+minutes(deltaT); % xPos = find(LopapDataCh1.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh1(xPos,:).('550.7'),... % '\leftarrow light off'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 17:15:00")+minutes(deltaT); % xPos = find(LopapDataCh1.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh1(xPos,:).('550.7'),... % '\leftarrow close ABS, water'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 17:21:00")+minutes(deltaT); % xPos = find(LopapDataCh1.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh1(xPos,:).('550.7'),... % '\leftarrow N2/O2/RH(78%) ABS open'); % set(ht,'Rotation',90); % % ax = ch2f.CurrentAxes; % deltaT = 6; % eTime = datetime("25-Feb-2021 16:07:00")+minutes(deltaT); % xPos = find(LopapDataCh2.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh2(xPos,:).('550.5'),... % '\leftarrow N2+water'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 16:23:00")+minutes(deltaT); % xPos = find(LopapDataCh2.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh2(xPos,:).('550.5'),... % '\leftarrow N2+R1&R2'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 16:37:00")+minutes(deltaT); % xPos = find(LopapDataCh2.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh2(xPos,:).('550.5'),... % '\leftarrow Bubbles!'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 16:46:00")+minutes(deltaT); % xPos = find(LopapDataCh2.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh2(xPos,:).('550.5'),... % {['\leftarrow N2/O2/RH(78%)+NO2+'],[' flow tube in line + LIGHT']}); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 17:05:00")+minutes(deltaT); % xPos = find(LopapDataCh2.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh2(xPos,:).('550.5'),... % '\leftarrow light off'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 17:15:00")+minutes(deltaT); % xPos = find(LopapDataCh2.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh2(xPos,:).('550.5'),... % '\leftarrow close ABS, water'); % set(ht,'Rotation',90); % % eTime = datetime("25-Feb-2021 17:21:00")+minutes(deltaT); % xPos = find(LopapDataCh2.Time >= eTime,1); % ht = text(ax,eTime,LopapDataCh2(xPos,:).('550.5'),... % '\leftarrow N2/O2/RH(78%) ABS open'); % set(ht,'Rotation',90); %% Plot selected spectra % % Compare to spectra to see if change is over whole wavelength or just % where nitrite absorbs. clc close all figure('Name', 'LopapSelectedSpectra') plot(str2double(LopapSpecCh1.Properties.VariableNames),LopapSpecCh1{datestr(TimeRange.specCompareOne),:},... 'DisplayName',['#1 ' datestr(TimeRange.specCompareOne) ]) % a time where only R1&R2 was connected to the Lopap hold on plot(str2double(LopapSpecCh2.Properties.VariableNames),LopapSpecCh2{datestr(TimeRange.specCompareOne),:},... 'DisplayName',['#2 ' datestr(TimeRange.specCompareOne)],'LineStyle','--') % a time where only R1&R2 was connected to the Lopap plot(str2double(LopapSpecCh1.Properties.VariableNames),LopapSpecCh1{datestr(TimeRange.specCompareTwo),:},... 'DisplayName',['#1 ' datestr(TimeRange.specCompareTwo)]) % a time where nitrite in R1 was connected to the Lopap plot(str2double(LopapSpecCh2.Properties.VariableNames),LopapSpecCh2{datestr(TimeRange.specCompareTwo),:},... 'DisplayName',['#2 ' datestr(TimeRange.specCompareTwo)],'LineStyle','--') % a time where nitrite in R1 was connected to the Lopap legend box ON grid ON % Add title and axis labels xlabel('wavelength [nm]') ylabel('Intensity') clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end %% Process: Absorption spectrum % % Here, we reprocess the data to derive an absorption spectrum. This should % match the spectra shown for nitrite in the Lopap manual. clc close all indexR(1) = find(str2double(LopapSpecCh1.Properties.VariableNames) >= LopapParameters.wavelengthR,1); indexR(2) = find(str2double(LopapSpecCh2.Properties.VariableNames) >= LopapParameters.wavelengthR,1); figure('Name', 'LopapAbsorbtionSpectra') plot(str2double(LopapSpecCh1.Properties.VariableNames),log10(LopapSpecCh1{datestr(TimeRange.specCompareTwo),... indexR(1)}./LopapSpecCh1{datestr(TimeRange.specCompareTwo),:})-log10(LopapSpecCh1{datestr(TimeRange.specCompareOne),... indexR(1)}./LopapSpecCh1{datestr(TimeRange.specCompareOne),:}),'DisplayName','#1') hold on plot(str2double(LopapSpecCh2.Properties.VariableNames),log10(LopapSpecCh2{datestr(TimeRange.specCompareTwo),... indexR(2)}./LopapSpecCh2{datestr(TimeRange.specCompareTwo),:})-log10(LopapSpecCh2{datestr(TimeRange.specCompareOne),... indexR(2)}./LopapSpecCh2{datestr(TimeRange.specCompareOne),:}),'DisplayName','#2','LineStyle','--') legend box ON grid ON % Add title and axis labels xlabel('wavelength [nm]') ylabel('ABS (log I_{r}/I_{i}') title([datestr(TimeRange.specCompareOne) ' & ' datestr(TimeRange.specCompareTwo)]) clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end %% Process :: Absorption with time % % Here, we reprocess the data to get the intensity with time for 1 chosen % signal wavelength and 1 reference wavelength. The data is identical to that % shown in the "measurement window" of the Lopap software. % % *The signal and the reference wavelength need to be identical to those % used for the calibration* and are therefore taken from the calibration % result file if present. % % The data is written to the _LopapTimeT_ time table. Rows hold the time, % columns hold the processed signal for channel 1 and channel 2. Did I % mention that it is important that the same signal wavelength and % reference wavelength are taken for the calibration and for the % experimental data. clc close all indexS(1) = find(str2double(LopapSpecCh1.Properties.VariableNames) >= LopapParameters.wavelengthS,1); indexS(2) = find(str2double(LopapSpecCh2.Properties.VariableNames) >= LopapParameters.wavelengthS,1); indexR(1) = find(str2double(LopapSpecCh1.Properties.VariableNames) >= LopapParameters.wavelengthR,1); indexR(2) = find(str2double(LopapSpecCh2.Properties.VariableNames) >= LopapParameters.wavelengthR,1); LopapTimeT = timetable(LopapSpecCh1.Time,log10(LopapSpecCh1{:,indexR(1)}./LopapSpecCh1{:,indexS(1)}),... log10(LopapSpecCh2{:,indexR(2)}./LopapSpecCh2{:,indexS(2)})); LopapTimeT.Properties.VariableNames ={'Ch #1','Ch #2'}; TR = timerange(datestr(TimeRange.dataRange(1)),datestr(TimeRange.dataRange(2))); figure('Name', 'Lopap TimeTable') stackedplot(LopapTimeT(TR,:),{{'Ch #1','Ch #2'}}); title(['Lopap' datestr(LopapParameters.MeasurementDate)]) clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end %% Process :: Background % % A linear background is fitted and subtracted (may be changed to % higher order). Background MUST be measured at the beginning % and at the end of the experiment for at least 30 minutes, ideally every % few hours. Background is R1&R2 with zero-air (or N2) entering the % stripping coil. clc close all LopapTimeT = fitLopapBkgrd(LopapTimeT,'BkgrdPeriod',TimeRange.backgroundFit,'TimeRangeToPlot',TimeRange.dataRange); clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end %% Plot bkgrd corrected data % clc close all % Plot TR = timerange(datestr(TimeRange.dataRange(1)),datestr(TimeRange.dataRange(2))); figure('Name', 'Lopap TimeTable Bkgrd') s=stackedplot(LopapTimeT(TR,:),{{'Ch #1 Bkgrd','Ch #2 Bkgrd'}}); title(['Lopap' datestr(LopapParameters.MeasurementDate)]) s.AxesProperties.YLimits = [-0.01 0.6]; clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end %% Process :: Calibrate % % The results from the calibration fits are used here to calibrate the % signal (intensity -> HONO in ppt). clc close all if exist('LopapCalibCalibration','var') LopapTimeT.('Ch #1 Calib') = LopapCalibCalibration.calib.fitresult.calibChannel1(LopapTimeT.('Ch #1 Bkgrd')); LopapTimeT.('Ch #2 Calib') = LopapCalibCalibration.calib.fitresult.calibChannel2(LopapTimeT.('Ch #2 Bkgrd')); disp('Settings of the calibration:') disp(' ') fprintf('Flow Reagents: %.2f and %.2f ml/min \n',... LopapParametersCalibration.LopapParameters.flowReagents(1),... LopapParametersCalibration.LopapParameters.flowReagents(2)); fprintf('Flow Gas: %.0f ml/min \n',... LopapParametersCalibration.LopapParameters.flowGas(1)); fprintf('Temperature: %.0f K \n',LopapParametersCalibration.LopapParameters.temperature); fprintf('Pressure: %.0f mbar \n',LopapParametersCalibration.LopapParameters.pressure); fprintf('Reference Wavelength: %.0f nm \n',LopapParametersCalibration.LopapParameters.wavelengthR); fprintf('Sample Wavelength: %.0f nm \n',LopapParametersCalibration.LopapParameters.wavelengthS); disp('Settings of this measurement') disp('') fprintf('Reference Wavelength: %.0f nm \n',LopapParameters.wavelengthR); fprintf('Sample Wavelength: %.0f nm \n',LopapParameters.wavelengthS); % Plot TR = timerange(datestr(TimeRange.dataRange(1)),datestr(TimeRange.dataRange(2))); figure('Name', 'Lopap TimeTable Calibrated') s=stackedplot(LopapTimeT(TR,:),{{'Ch #1 Calib','Ch #2 Calib'}}); title(['Lopap' datestr(LopapParameters.MeasurementDate)]) s.AxesProperties.YLimits = [-100 2500]; clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* fitresult calib if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end end %% And Finally :: HONO % % * Channel 1 is from stripping coil 2. Its signal comes from NO2 and other % nitrogen oxides that yield nitrite in the stripping solution and/or dye % * Channel 2 is from stripping coil 1. Its signal comes from HONO plus % the impurities that are also collected in coil 2. % % HONO is thus calibrated signal coil 2 (Channel 1) - that of coil 1 % (channel 2). close all if exist('LopapCalibCalibration','var') LopapTimeT.('HONO') = LopapTimeT.('Ch #1 Calib')-LopapTimeT.('Ch #2 Calib'); % Plot TR = timerange(datestr(TimeRange.dataRange(1)),datestr(TimeRange.dataRange(2))); figure('Name', 'HONO') s=stackedplot(LopapTimeT(TR,:),{'HONO'}); s.Title=['HONO in ppt with time ' datestr(LopapParameters.MeasurementDate)]; s.AxesProperties.YLimits = [-10 2500]; clearvars -except Lopap* fileLocation myColorMap LopapParameters TimeRange* fitresult calib if LopapParameters.Interactive == 1 distFig fprintf('press any key if you want to proceed\n') pause %% % close all end end %% Save the data % save(['LopapMatlabData' datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM') '.mat'],'LopapDataCh1','LopapDataCh2','LopapParameters','LopapSpecCh1','LopapSpecCh2') save(['Lopap' datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM') '.mat'],'LopapParameters','LopapTimeT','TimeRange') % export to csv TT = LopapTimeT(:,{'HONO'}); writetimetable(TT,['Lopap' datestr(LopapParameters.MeasurementDate,'yyyymmdd_HHMM') '.csv']) clearvars TT %% Local functions function [fileLocation, myColorMap] = localInitializeMatlab %INITIALIZEMATLAB Sets Lopap specific settings % Adds processing functions to path and defines file locations for mac, windows, % and Matlab online (which runs on unix) % change working directory path = matlab.desktop.editor.getActiveFilename; [filepath,~,~] = fileparts(path); cd(filepath); % Data Server Address if ismac fileLocation.server = '/Volumes/'; fileLocation.dataPath = 'data_2411/Lopap'; % add Lopap functions and general add-ons to path addpath('/Users/bartels-rausch/SwitchDrive/PSI_Matlab/Add-Ons'); addpath('/Users/bartels-rausch/SwitchDrive/PSI_Matlab/Lopap/1.LOPAP_Restliche Daten'); elseif ispc fileLocation.server = '\\fs00\'; %UNC name for file server that hosts Napp shared drive fileLocation.dataPath = 'data_2411\Lopap'; % add Lopap functions and general add-ons to path addpath('C:\Users\iezzi_l\switchdrive\Add-Ons'); addpath('C:\Users\bletry_c\switchdrive\Add-Ons'); addpath('C:\Users\vieill_l\switchdrive\Add-Ons'); addpath('C:\Users\iezzi_l\switchdrive\Lopap\1.LOPAP_Restliche Daten'); addpath('C:\Users\bletry_c\switchdrive\Lopap\1.LOPAP_Restliche Daten'); addpath('C:\Users\vieill_l\switchdrive\Lopap\1.LOPAP_Restliche Daten'); % addpath('\\fs02\5601_surface_chemistry\People\Marc\Switchdrive\PSI_Matlab\Add-Ons'); % addpath('\\fs02\5601_surface_chemistry\People\Marc\Switchdrive\PSI_Matlab\Lopap\1.LOPAP_Restliche Daten'); elseif isunix fileLocation.server = '/'; fileLocation.dataPath = 'Lopap/'; end % Color maps myColorMap.red = colormap(autumn(7)); myColorMap.blue = colormap(winter(7)); close all end