diff --git a/Data.m b/Data.m index e9d882787cca32e774d7c873797b90c4dcd1c87a..7383f4a1cd297884e184157eef77b417e41eac1d 100644 --- a/Data.m +++ b/Data.m @@ -63,7 +63,7 @@ classdef Data < handle % made into the oddFrameWarning flag. % These errors only seem to occur in specific cases, so this fix % is also quite specific - for ii = length(addenda.oddFrameWarning) + for ii = 1:length(addenda.oddFrameWarning) if str2num(addenda.oddFrameWarning(ii).DUR) ~= addenda.s if str2num(addenda.oddFrameWarning(ii).GPS) == channels.t(1) channels.tau1 @@ -74,7 +74,7 @@ classdef Data < handle str2num(addenda.oddFrameWarning(ii).DUR)... == channels.t(2) channels.tau2 - channels.tau2 = t(2); + channels.tau2 = channels.t(2); channels.tau2 end end diff --git a/HoftEditor.m b/HoftEditor.m index 425f69dfc49847fb1baf2eb69b6f859187280566..47ba9cde8edf7629a5f0f50bd9e2b87b6eaecc38 100644 --- a/HoftEditor.m +++ b/HoftEditor.m @@ -329,15 +329,24 @@ classdef HoftEditor < handle % If we will continue, clear the first 512 seconds of frames % and add whitespace to their ends if necessary + % If the first frame is odd, then shorten the 512 s as needed + firstAddTime = 512; + if length(Hoft.oddFrameWarning) > 0 + if Hoft.gpsStart ==... + str2num(Hoft.oddFrameWarning(1).GPS) + firstAddTime = firstAddTime -... + (128 - str2num(Hoft.oddFrameWarning(1).DUR)); + end + end if length(tSub.tStart) > 1 Hoft.isFirstSubFlag = 0; - Hoft.data(1:(16384*512)) = []; - Hoft.baseline(1:(16384*512)) = []; + Hoft.data(1:(16384*firstAddTime)) = []; + Hoft.baseline(1:(16384*firstAddTime)) = []; if T.pipe == 1 - Hoft.dqFlag(1:(1*512)) = []; - Hoft.stateVector(1:(16*512)) = []; + Hoft.dqFlag(1:(1*firstAddTime)) = []; + Hoft.stateVector(1:(16*firstAddTime)) = []; end - Hoft.gpsStart = Hoft.gpsStart + 512; + Hoft.gpsStart = Hoft.gpsStart + firstAddTime; if length(tSub.tStart) > 2 nextSubWhitespace = constructWhitespace(T, tSub, 1); @@ -796,6 +805,11 @@ classdef HoftEditor < handle % If this another segment follows, only write 512 s if Hoft.anticipateFlag == 1 numberOfFrames = (512 / Hoft.T.s); + % If there are odd frames, then this number needs to be rounded + if length(Hoft.oddFrameWarning) > 0 + disp('Rounding up number of frames due to odd frame length') + numberOfFrames = ceil(numberOfFrames); + end else numberOfFrames = ceil(secondsDuration / Hoft.T.s); end @@ -820,6 +834,17 @@ classdef HoftEditor < handle if Hoft.anticipateFlag == 1 Hoft.r = (16384*512 - 1); + % Again, this could be problematic if there + % happen to be odd frames, so we adjust it + if length(Hoft.oddFrameWarning) > 0 + if Hoft.tEnd == str2num(Hoft.oddFrameWarning(end).GPS) + % If we meet these conditionals, then the length of + % Hoft.r must be shortened by the difference in length of + % the odd frame (oddFrame.DUR) from a standard 128 s frame + Hoft.r = Hoft.r - 16384*(128 -... + str2num(Hoft.oddFrameWarning(end).DUR)); + end + end end if Hoft.anticipateFlag == 0 if Hoft.isFirstSubFlag == 0 @@ -831,6 +856,8 @@ classdef HoftEditor < handle % Generate names startNameBasic = strcat('-', num2str(Hoft.gpsStart + (1-1)*Hoft.T.s) ); + % Note that the stop name will not be correct if a frame is an unusual length, + % but the stopName variable is never used anyway. stopNameBasic = strcat('-', num2str(Hoft.gpsStart + (numberOfFrames)*Hoft.T.s) ); % Uncomment the mkframe commands below to write output @@ -1303,13 +1330,46 @@ classdef HoftEditor < handle % Generate names startName = strcat('-', num2str(Hoft.gpsStart + (kk-1)*Hoft.T.s) ); + % Again, stopName is never used. stopName = strcat('-', num2str(Hoft.gpsStart + (kk)*Hoft.T.s) ); gpsStartFrame = Hoft.gpsStart + (kk-1)*Hoft.T.s; - % Uncomment the mkframe commands below to write output - + % In the event of odd frames, this too needs to be modified + oddOffset = []; + if length(Hoft.oddFrameWarning) > 0 + % Let us first deal with the case where the starting + % frame needs its name adjusted + if Hoft.gpsStart ==... + str2num(Hoft.oddFrameWarning(1).GPS) + if kk > 1 + oddOffset = (kk-1)*Hoft.T.s -... + (128 - str2num(Hoft.oddFrameWarning(1).DUR)); + startName = strcat('-', num2str(Hoft.gpsStart + oddOffset)); + gpsStartFrame = Hoft.gpsStart + oddOffset; + end + end + end - HoftSub.data = Hoft.data( ((kk-1)*Hoft.T.s*16384 + 1):(kk*Hoft.T.s*16384) ); + % Uncomment the mkframe commands below to write output + if length(Hoft.oddFrameWarning) == 0 + HoftSub.data = Hoft.data( ((kk-1)*Hoft.T.s*16384 + 1):(kk*Hoft.T.s*16384) ); + % Adjust for odd frames at the start + elseif length(oddOffset) > 0 + HoftSub.data = Hoft.data( (oddOffset*16384+1):((oddOffset+Hoft.T.s)*16384)); + elseif Hoft.tStart == str2num(Hoft.oddFrameWarning(1).GPS) + HoftSub.data = Hoft.data( ((kk-1)*Hoft.T.s*16384 + 1):... + (str2num(Hoft.oddFrameWarning(1).DUR)*16384)); + elseif Hoft.tEnd == str2num(Hoft.oddFrameWarning(end).GPS) +... + str2num(Hoft.oddFrameWarning(end).DUR) + if kk == numberOfFrames & Hoft.isLastSubFlag == 1 + HoftSub.data = Hoft.data( ((kk-1)*Hoft.T.s*16384 + 1):... + ((kk-1)*Hoft.T.s*16384+str2num(Hoft.oddFrameWarning(end).DUR)*16384)); + else + HoftSub.data = Hoft.data( ((kk-1)*Hoft.T.s*16384 + 1):(kk*Hoft.T.s*16384) ); + end + else + HoftSub.data = Hoft.data( ((kk-1)*Hoft.T.s*16384 + 1):(kk*Hoft.T.s*16384) ); + end HoftSub.data = double(HoftSub.data); disp('HoftSub.data is this long') length(HoftSub.data) @@ -1321,7 +1381,16 @@ classdef HoftEditor < handle HoftSub.channel = strcat(site, '1:AMPS-STRAIN'); HoftSub.type = 'd'; HoftSub.mode = 'a'; - individualFrameName = strcat(site, '-', site, '1_AMPS_C02_L2',startName,'-', num2str(Hoft.T.s), '.gwf'); + if length(Hoft.oddFrameWarning) == 0 + frameDuration = Hoft.T.s; + elseif startName(2:10) == Hoft.oddFrameWarning(1).GPS + frameDuration = str2num(Hoft.oddFrameWarning(1).DUR); + elseif startName(2:10) == Hoft.oddFrameWarning(end).GPS + frameDuration = str2num(Hoft.oddFrameWarning(end).DUR); + else + frameDuration = Hoft.T.s; + end + individualFrameName = strcat(site, '-', site, '1_AMPS_C02_L2',startName,'-', num2str(frameDuration), '.gwf'); directoryDataFrameName = strcat('/archive/frames/S6/pulsar/feedforward/', siteFull, '/', individualFrameName(1:21)); %directoryDiagnosticsFrameName = strcat('/home/pulsar/public_html/feedforward/diagnostics/', individualFrameName(1:21)); setenv('systemDirectoryDataFrameName', directoryDataFrameName); @@ -1331,13 +1400,13 @@ classdef HoftEditor < handle frameName = strcat(directoryDataFrameName, '/', individualFrameName); try if containsNonEmptyData - mkframe(frameName, HoftSub, 'n', Hoft.T.s, gpsStartFrame); + mkframe(frameName, HoftSub, 'n', frameDuration, gpsStartFrame); end catch err if strcmp(err.identifier, 'mkframe:frameFail') disp('Trying to write frame file after one failure') if containsNonEmptyData - mkframe(frameName, HoftSub, 'n', Hoft.T.s, gpsStartFrame); + mkframe(frameName, HoftSub, 'n', frameDuration, gpsStartFrame); end else rethrow(err) @@ -1345,7 +1414,24 @@ classdef HoftEditor < handle end if Hoft.T.pipe == 1 % Write data quality and state vector - stateVectorSub.data = Hoft.stateVector( ((kk-1)*Hoft.T.s*16 + 1):(kk*Hoft.T.s*16) ); + if length(Hoft.oddFrameWarning) == 0 + stateVectorSub.data = Hoft.stateVector( ((kk-1)*Hoft.T.s*16 + 1):(kk*Hoft.T.s*16) ); + elseif length(oddOffset) > 0 + stateVectorSub.data = Hoft.stateVector( (oddOffset*16+1):((oddOffset+Hoft.T.s)*16)); + elseif Hoft.tStart == str2num(Hoft.oddFrameWarning(1).GPS) + stateVectorSub.data = Hoft.stateVector( ((kk-1)*Hoft.T.s*16 + 1):... + (str2num(Hoft.oddFrameWarning(1).DUR)*16)); + elseif Hoft.tEnd == str2num(Hoft.oddFrameWarning(end).GPS) +... + str2num(Hoft.oddFrameWarning(end).DUR) + if kk == numberOfFrames & Hoft.isLastSubFlag == 1 + stateVectorSub.data = Hoft.stateVector( ((kk-1)*Hoft.T.s*16 + 1):... + ((kk-1)*Hoft.T.s*16 + str2num(Hoft.oddFrameWarning(end).DUR)*16)); + else + stateVectorSub.data = Hoft.stateVector( ((kk-1)*Hoft.T.s*16 + 1):(kk*Hoft.T.s*16) ); + end + else + stateVectorSub.data = Hoft.stateVector( ((kk-1)*Hoft.T.s*16 + 1):(kk*Hoft.T.s*16) ); + end stateVectorSub.data = double(stateVectorSub.data); disp('stateVectorSub.data is this long') length(stateVectorSub.data) @@ -1354,20 +1440,37 @@ classdef HoftEditor < handle stateVectorSub.mode = 'a'; try if containsNonEmptyData - mkframe(frameName, stateVectorSub, 'a', Hoft.T.s, gpsStartFrame); + mkframe(frameName, stateVectorSub, 'a', frameDuration, gpsStartFrame); end catch err if strcmp(err.identifier, 'mkframe:frameFail') disp('Trying to write frame file after one failure') if containsNonEmptyData - mkframe(frameName, stateVectorSub, 'a', Hoft.T.s, gpsStartFrame); + mkframe(frameName, stateVectorSub, 'a', frameDuration, gpsStartFrame); end else rethrow(err) end end clear stateVectorSub - dqFlagSub.data = Hoft.dqFlag( ((kk-1)*Hoft.T.s*1 + 1):(kk*Hoft.T.s*1) ); + if length(Hoft.oddFrameWarning) == 0 + dqFlagSub.data = Hoft.dqFlag( ((kk-1)*Hoft.T.s*1 + 1):(kk*Hoft.T.s*1) ); + elseif length(oddOffset) > 0 + dqFlagSub.data = Hoft.dqFlag( (oddOffset*1+1):((oddOffset+Hoft.T.s)*1)); + elseif Hoft.tStart == str2num(Hoft.oddFrameWarning(1).GPS) + dqFlagSub.data = Hoft.dqFlag( ((kk-1)*Hoft.T.s*1 + 1):... + (str2num(Hoft.oddFrameWarning(1).DUR)*1)); + elseif Hoft.tEnd == str2num(Hoft.oddFrameWarning(end).GPS) +... + str2num(Hoft.oddFrameWarning(end).DUR) + if kk == numberOfFrames & Hoft.isLastSubFlag == 1 + dqFlagSub.data = Hoft.dqFlag( ((kk-1)*Hoft.T.s*1 + 1):... + ((kk-1)*Hoft.T.s*1 + str2num(Hoft.oddFrameWarning(end).DUR)*1)); + else + dqFlagSub.data = Hoft.dqFlag( ((kk-1)*Hoft.T.s*1 + 1):(kk*Hoft.T.s*1) ); + end + else + dqFlagSub.data = Hoft.dqFlag( ((kk-1)*Hoft.T.s*1 + 1):(kk*Hoft.T.s*1) ); + end dqFlagSub.data = double(dqFlagSub.data); disp('dqFlagSub.data is this long') length(dqFlagSub.data) @@ -1376,13 +1479,13 @@ classdef HoftEditor < handle dqFlagSub.mode = 'a'; try if containsNonEmptyData - mkframe(frameName, dqFlagSub, 'a', Hoft.T.s, gpsStartFrame); + mkframe(frameName, dqFlagSub, 'a', frameDuration, gpsStartFrame); end catch err if strcmp(err.identifier, 'mkframe:frameFail') disp('Trying to write frame file after one failure') if containsNonEmptyData - mkframe(frameName, dqFlagSub, 'a', Hoft.T.s, gpsStartFrame); + mkframe(frameName, dqFlagSub, 'a', frameDuration, gpsStartFrame); end else rethrow(err)