0001 function simState=gravenframes(gpsStart,gpsDur,frConfig,varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050 if(nargin ~= 5 && nargin ~=6 && nargin ~=7 && nargin ~=9)
0051 msgId = 'gravenframes:wrongInput';
0052 error(msgId,'%s: wrong number of inputs',msgId);
0053 end
0054 if(~isnumeric(gpsStart) || gpsStart < 0)
0055 msgId = 'gravenframes:badInput';
0056 error(msgId,'%s: gpsStart input is bad',msgId);
0057 end
0058 gpsStart = floor(gpsStart);
0059 if(~isnumeric(gpsDur) || gpsDur < 1)
0060 msgId = 'gravenframes:badInput';
0061 error(msgId,'%s: gpsDur input is bad',msgId);
0062 end
0063 gpsDur = floor(gpsDur);
0064 [frparms,detList,sigList,nameList] = checkframeconfig(frConfig);
0065 gravenInput = varargin;
0066 numGrPar = nargin - 3;
0067 numChan = numel(sigList);
0068
0069 fprintf('GRAVENFRAMES: Run GravEn starting at GPS %09d for %d seconds\n',...
0070 gpsStart,gpsDur);
0071
0072
0073
0074
0075
0076 if(isempty(frparms.instrument))
0077 newInst = getinstrument(numChan,detList);
0078 frparms.instrument = newInst;
0079 end
0080 prframeconfig(frparms);
0081
0082
0083
0084
0085 if(frparms.frameDirFlag == true)
0086 if(exist(frparms.frameDir,'dir') > 0)
0087 [gpsTimes,frameFiles,frameDurs]=...
0088 dir2framelist(frparms.frameDir);
0089 nFrames = numel(frameFiles);
0090 if(nFrames > 0)
0091 fprintf(1,'gravenframes: Use %d frame files in local directory\n',nFrames);
0092 else
0093 msgId = 'gravenframes:frameDirEmpty';
0094 error(msgId,'%s - no frame files in directory %s\n',...
0095 msgId,frparms.frameDir);
0096 end
0097 else
0098 msgId = 'gravenframes:noFrameDir';
0099 error(msgId,'%s - frame directory %s not found\n',...
0100 msgId,frparms.frameDir);
0101 end
0102 end
0103
0104
0105 [numIfo,ifoList,detMatch] = getifolist(numChan,detList);
0106
0107
0108
0109
0110
0111
0112
0113
0114 permSeed = gravenInput{numGrPar};
0115 SIM_OFFSET_SEC = 1;
0116 timeData = cell(1,numChan);
0117 for kIfo = 1:numIfo
0118 detId = char(ifoList{kIfo});
0119 sampRate = getdetrate(detId);
0120 gravenGps = gpsStart;
0121
0122
0123
0124
0125
0126
0127
0128
0129
0130
0131
0132
0133 switch frparms.bkgd
0134 case 'wn'
0135 fprintf(1,' Get white-noise data vector\n');
0136 dataError = 0;
0137 randnState = floor(abs(permSeed(1,1)*100));
0138 [hVector,tmpState] = wnseries(gpsDur,sampRate,1,...
0139 randnState);
0140 case 'asq'
0141 if(frparms.altChannelFlag)
0142 sigChanStr = frparms.altChannel;
0143 sigChan = chanstruct(sigChanStr);
0144 else
0145 sigChanStr = sprintf('%s:LSC-AS_Q',detId);
0146 sigChan = chanstruct(sigChanStr);
0147 end
0148 fprintf(1,' Get raw data vector\n');
0149 if(frparms.frameDirFlag)
0150 [hVector,sampRate,dataError] =...
0151 chanvector(sigChan,gpsStart,gpsDur,...
0152 gpsTimes,frameFiles,frameDurs);
0153 else
0154 [hVector,sampRate,dataError] = ...
0155 chanvector(sigChan,gpsStart,gpsDur);
0156 end
0157 if(dataError)
0158 msgId = 'gravenframes:badData';
0159 error(msgId,'%s: error %d in reading background data',msgId,dataError);
0160 end
0161 case 'none'
0162 hVector = zeros(sampRate*gpsDur,1);
0163 otherwise
0164 hVector = zeros(sampRate*gpsDur,1);
0165 end
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181 dataDurSamples = length(hVector);
0182 if (gpsDur*sampRate ~= dataDurSamples)
0183 msgId = 'gravenframes:badData';
0184 fmt = '%s:Raw data at GPS %d Dur %d sample rate %d has wrong # of samples %d - should be %d';
0185 error(msgId,fmt,msgId,gpsStart, gpsDur, sampRate,...
0186 dataDurSamples, gpsDur*sampRate);
0187 end
0188 logFileName=sprintf('Sims-%s-%09d-%d-%s.txt',frparms.type,...
0189 gpsStart,gpsDur,detId);
0190 if(exist(logFileName,'file') > 0)
0191 delete(logFileName);
0192 end
0193
0194 simOffsetSamples = SIM_OFFSET_SEC * sampRate;
0195 simSampleRange = [simOffsetSamples,(dataDurSamples-2*simOffsetSamples)];
0196 if(kIfo == 1)
0197 [grVars,numVars] = mkgrvars(logFileName,gravenGps,...
0198 detId,sampRate,simSampleRange,gravenInput);
0199 rerunInput = cell(1,2);
0200 rerunInput{1,1} = logFileName;
0201 rerunInput{1,2} = 0;
0202 else
0203 [grVars,numVars] = mkgrvars(logFileName,gravenGps,...
0204 detId,sampRate,simSampleRange,rerunInput);
0205 end
0206 fprintf(1,'GRAVENFRAMES: run GravEn for detector %s\n',detId);
0207 fprintf(1,' GravEn logfile: %s\n',logFileName);
0208 [sims, simState] = graven(grVars{:});
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 numSims = numel(sims);
0221 asqVector = hVector;
0222 darmVector = hVector;
0223 for ksim = 1:numSims
0224 simIndexVector = (sims(ksim).startSamp - 1) + (1:length(sims(ksim).h));
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234 simAndH = hVector(simIndexVector) + sims(ksim).h;
0235 hVector(simIndexVector) = simAndH;
0236
0237 simAndAsq = asqVector(simIndexVector) + sims(ksim).AS_Q;
0238 asqVector(simIndexVector) = simAndAsq;
0239
0240 simAndDarm = darmVector(simIndexVector) + sims(ksim).DARM_ERR;
0241 darmVector(simIndexVector) = simAndDarm;
0242 end
0243 clear simAndH;
0244 clear simAndAsq;
0245 clear simAndDarm;
0246 clear sims;
0247 for iChan = 1:numChan
0248 if(detMatch(iChan) == kIfo)
0249 sigId = char(sigList{iChan});
0250 switch sigId
0251 case 'AS_Q'
0252 timeData{iChan} = asqVector;
0253 case 'DARM_ERR'
0254 timeData{iChan} = darmVector;
0255 otherwise
0256 timeData{iChan} = hVector;
0257 end
0258 chName = char(nameList{1,iChan});
0259 frData(iChan) = struct('channel',chName,...
0260 'data',[],...
0261 'type','d',...
0262 'mode','a');
0263 end
0264 end
0265 clear hVector;
0266 clear asqVector;
0267 clear darmVector;
0268 end
0269
0270
0271
0272
0273
0274
0275
0276
0277 numFrames = ceil(gpsDur / frparms.duration);
0278 fprintf('GRAVENFRAMES: create %d frame files\n',numFrames);
0279 newFrameFlag = zeros(1,numFrames);
0280 frameBegGps = zeros(1,numFrames);
0281 frameEndGps = zeros(1,numFrames);
0282 frameFile = cell(1,numFrames);
0283 for iFr = 1:numFrames
0284 newFrameFlag(1,iFr) = true;
0285 frameBegGps(1,iFr) = gpsStart + (iFr-1)*frparms.duration;
0286 frameEndGps(1,iFr) = min((gpsStart+gpsDur),...
0287 (frameBegGps(1,iFr) + frparms.duration));
0288 frameDur(1,iFr) = frameEndGps(1,iFr) - frameBegGps(1,iFr);
0289 frStr = sprintf('%s-%s-%09d-%d.gwf',...
0290 frparms.instrument,frparms.type,...
0291 frameBegGps(1,iFr),frameDur(1,iFr));
0292 frameFile{1,iFr} = frStr;
0293 end
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303 for iFr = 1:numFrames
0304 myFrame = frameFile{1,iFr};
0305 for iChan = 1:numChan
0306 detId = char(detList{iChan});
0307 sampRate = getdetrate(detId);
0308
0309 begSamp = (frameBegGps(1,iFr) - gpsStart)*sampRate + 1;
0310 endSamp = (begSamp - 1) + frameDur(1,iFr)*sampRate;
0311 begSamp = max(begSamp,1);
0312 endSamp = min(endSamp,numel(timeData{iChan}));
0313
0314 frData(iChan).data = timeData{iChan}(begSamp:endSamp);
0315 if(iFr == numFrames)
0316 timeData{iChan} = [];
0317 end
0318 end
0319 if(iFr == numFrames)
0320 clear timeData;
0321 end
0322 if(exist(myFrame,'file') > 0)
0323 delete(myFrame);
0324 end
0325 fprintf(1,'GRAVENFRAMES: Create frame file %s\n',myFrame);
0326 mkframe(myFrame,frData,'n',frameDur(1,iFr),...
0327 frameBegGps(1,iFr));
0328 end
0329 return
0330
0331 function [grVars,numVars] = mkgrvars(logFileName,gps,detId,sampFreq,startSamp,grInput)
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357 numSpec = numel(grInput);
0358 if(numSpec == 2)
0359 grVars = cell(1,6);
0360 grVars{1} = logFileName;
0361 grVars{2} = gps;
0362 grVars{3} = detId;
0363 grVars{4} = grInput{1};
0364 grVars{5} = sampFreq;
0365 grVars{6} = grInput{2};
0366 elseif(numSpec == 3)
0367 grVars = cell(1,7);
0368 grVars{1} = grInput{1};
0369 grVars{2} = logFileName;
0370 grVars{3} = gps;
0371 grVars{4} = detId;
0372 grVars{5} = grInput{2};
0373 grVars{6} = sampFreq;
0374 grVars{7} = grInput{3};
0375 elseif(numSpec == 4)
0376 grVars = cell(1,9);
0377 grVars{1} = grInput{1};
0378 grVars{2} = logFileName;
0379 grVars{3} = gps;
0380 grVars{4} = detId;
0381 grVars{5} = grInput{2};
0382 grVars{6} = startSamp;
0383 grVars{7} = grInput{3};
0384 grVars{8} = sampFreq;
0385 grVars{9} = grInput{4};
0386 elseif(numSpec == 6)
0387 grVars = cell(1,11);
0388 grVars{1} = grInput{1};
0389 grVars{2} = logFileName;
0390 grVars{3} = gps;
0391 grVars{4} = detId;
0392 grVars{5} = grInput{2};
0393 grVars{6} = grInput{3};
0394 grVars{7} = startSamp;
0395 grVars{8} = grInput{4};
0396 grVars{9} = grInput{5};
0397 grVars{10} = sampFreq;
0398 grVars{11} = grInput{6};
0399 else
0400 error('gravenframes - bad GravEn input');
0401 end
0402 numVars = numel(grVars);
0403 return
0404
0405 function instName = getinstrument(numChan,detList)
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426 newInst = [];
0427 for iChan = 1:numChan
0428 detId = char(detList{iChan});
0429 firstChar = upper(detId(1:1));
0430 if(isempty(newInst))
0431 newInst(1:1) = firstChar;
0432 lenInst = numel(newInst);
0433 else
0434 if( isempty(strfind(newInst,firstChar)))
0435 newInst(lenInst+1:lenInst+1) = firstChar;
0436 lenInst = numel(newInst);
0437 end
0438 end
0439 end
0440 newInst = char(newInst);
0441 instName = sort(newInst);
0442 return
0443
0444 function [numIfo,ifoList,detMatch] = getifolist(numChan,detList)
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470 numIfo = 0;
0471 detMatch = zeros(1,numChan);
0472 for iChan = 1:numChan
0473 detId = detList{iChan};
0474 if(numIfo < 1)
0475 ifoList = cell(1,1);
0476 numIfo = 1;
0477 ifoList{numIfo} = detId;
0478 detMatch(iChan) = numIfo;
0479 else
0480 matchIfo = false;
0481 for iChk = 1:numIfo
0482 if(strcmp(detId,ifoList{iChk}) == true)
0483 detMatch(iChan) = iChk;
0484 matchIfo = true;
0485 break
0486 end
0487 end
0488 if(matchIfo == false)
0489 numIfo = numIfo + 1;
0490 ifoList{numIfo} = detId;
0491 detMatch(iChan) = numIfo;
0492 end
0493 end
0494 end
0495 return