0001 function [allflags newFlag]=flagplot(d,allflags,xy,bs,bn)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 for m=1:size(allflags,2)
0017 newFlag{m} = logical(zeros(size(allflags{1,m})));
0018 orgFlag{m} = allflags{1,m};
0019 oldFlag{m} = allflags{2,m};
0020 end
0021
0022
0023 for m=1:size(xy,2)
0024 x{m} = xy{1,m};
0025 y{m} = xy{2,m};
0026 end
0027 clear xy;
0028
0029
0030 dcm=toggleCursor;
0031 hold on
0032
0033
0034 x_axis=get(gca,'xlim');
0035 y_axis=get(gca,'ylim');
0036
0037
0038
0039 fmode='s';
0040
0041 gmode='a';
0042
0043 emode='f';
0044
0045
0046 ccnt=1;
0047
0048 disp('Entering flagging mode')
0049
0050 while(1)
0051 w=waitforbuttonpress;
0052
0053 if (w)
0054
0055
0056 ch=get(gcf,'CurrentCharacter');
0057 gbuf=gmode;
0058 ebuf=emode;
0059 if (strcmp(ch,'g'))
0060 grid
0061 else
0062 [fmode,emode,gmode]=setmodes(ch,fmode,emode,gmode);
0063 if (fmode=='q')
0064 break;
0065 elseif (fmode=='c' | emode=='i' | fmode=='t' | emode=='z' | ...
0066 emode=='y' | emode=='x')
0067 datacursormode off
0068 [ptx,pty]=ginput(2);
0069 pts(1).Position(1)=ptx(1);
0070 pts(1).Position(2)=pty(1);
0071 pts(2).Position(1)=ptx(2);
0072 pts(2).Position(2)=pty(2);
0073 [newFlag]=flagpts(newFlag,orgFlag,oldFlag,x,y,bs,bn,...
0074 fmode,emode,gmode,pts);
0075 pts=[];
0076
0077 fmode='a';
0078 emode=ebuf;
0079 gmode=gbuf;
0080 disp('Returning to all channels mode');
0081 datacursormode on
0082 elseif (fmode=='-' | fmode=='=')
0083 datacursormode off
0084 [ptx,pty]=ginput(1);
0085 pts.Position(1)=ptx;
0086 pts.Position(2)=pty;
0087 [newFlag]=flagpts(newFlag,orgFlag,oldFlag,x,y,bs,bn,...
0088 fmode,emode,gmode,pts);
0089 pts=[];
0090 fmode='a';
0091 emode=ebuf;
0092 gmode=gbuf;
0093 disp('Returning to all channels mode');
0094 datacursormode on
0095 elseif (gmode=='e')
0096 disp('Erasing new flags')
0097 flag=orgFlag;
0098 scriptflag=orgScriptflag;
0099 if (exist('pts'))
0100 [newFlag]=flagpts(newFlag,orgFlag,oldFlag,x,y,bs,bn,...
0101 fmode,emode,gmode,pts);
0102 else
0103 disp('No new flags to erase!')
0104 end
0105 gmode=gbuf;
0106 elseif (emode=='o')
0107 emode=ebuf;
0108 xlim([x_axis(1) x_axis(2)])
0109 ylim([y_axis(1) y_axis(2)])
0110 end
0111 end
0112 else
0113 pts=getCursorInfo(dcm);
0114 if (isempty(pts))
0115 disp(' ')
0116 disp('Please click closer to the desired point')
0117 else
0118 [newFlag]=flagpts(newFlag,orgFlag,oldFlag,x,y,bs,bn,...
0119 fmode,emode,gmode,pts);
0120 pts=[];
0121 dcm=toggleCursor;
0122 end
0123 end
0124 end
0125
0126
0127
0128 for m=1:size(allflags,2)
0129 allflags{1,m} = allflags{1,m} | newFlag{m};
0130 end
0131
0132 hold off
0133 datacursormode off
0134 return;
0135
0136
0137
0138
0139 function [newFlag]=flagpts(newFlag,orgFlag, oldFlag,x,y,...
0140 bs,bn,fmode,emode,gmode,pt)
0141
0142
0143
0144 switch gmode
0145
0146 case 's'
0147 ind=getindex(fmode,pt,x,y,bs,bn);
0148 if(iscell(ind))
0149
0150 for m=1:length(ind)
0151 newFlag{m}(ind{m},bn) = 1;
0152 end
0153 else
0154 newFlag{bs}(ind,bn)=1;
0155 end
0156
0157
0158
0159
0160 case 'a'
0161 for i=1:size(newFlag{bs},2);
0162 ind=getindex(fmode,pt,x,y,bs,bn);
0163 if(iscell(ind))
0164
0165 for m=1:length(ind)
0166 newFlag{m}(ind{m},bn) = 1;
0167 end
0168 else
0169 newFlag{bs}(ind,i)=1;
0170 end
0171 end
0172
0173 case 'e'
0174 plot(x{bs},y{bs}(:,bn),'b.');
0175 f=find(newFlag{bs}(:,bn)==1);
0176 plot(x{bs}(f),y{bs}(f,bn),'r.');
0177 if (~isempty(autoflag))
0178 f=find(autoflag{bs}(:,bn)~=0);
0179 plot(x{bs}(f),y{bs}(f,bn),'m.');
0180 end
0181 return
0182 for m=1:length(newFlag)
0183 newFlag{m} = logical(zeros(size(newFlag{m})));
0184 end
0185
0186
0187 end
0188
0189
0190 ind=getindex(fmode,pt,x,y,bs,bn);
0191 if(iscell(ind))
0192 ind = ind{bs};
0193 end
0194
0195
0196 switch emode
0197 case 'f'
0198
0199 plot(x{bs}(ind),y{bs}(ind,bn),'r.');
0200
0201 case 'u'
0202 disp(' unflagging')
0203
0204 newFlag{bs} = -newFlag{bs};
0205 plot(x{bs}(ind),y{bs}(ind,bn),'b.');
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225
0226
0227
0228
0229 case 'z'
0230 xlimit=sort([pt(1).Position(1) pt(2).Position(1)]);
0231 ylimit=sort([pt(1).Position(2) pt(2).Position(2)]);
0232 if (any(isnan(xlimit)) | any(isnan(ylimit)))
0233 disp('x/y limit cannot contain NaN values')
0234 return
0235 elseif (xlimit(1)==xlimit(2) | ylimit(1)==ylimit(2))
0236 disp('x/y limits cannot have the same values')
0237 return
0238 end
0239 xlim([xlimit(1) xlimit(2)]);
0240 ylim([ylimit(1) ylimit(2)]);
0241
0242 case 'x'
0243 xlim(sort([pt(1).Position(1) pt(2).Position(1)]))
0244
0245 case 'y'
0246 ylimit=[pt(1).Position(2) pt(2).Position(2)];
0247 ylimit=sort(ylimit);
0248 ylim([ylimit(1) ylimit(2)])
0249
0250 end
0251
0252 return;
0253
0254
0255
0256 function ind=getindex(fmode,pts,x,y,bs,bn)
0257
0258
0259 if (size(x)~=size(y))
0260 error('can not getindex');
0261 end
0262
0263 for i=1:length(pts)
0264 xval(i)=pts(i).Position(1);
0265 yval(i)=pts(i).Position(2);
0266 end
0267
0268 if (length(xval)==1)
0269 if (fmode=='-')
0270
0271
0272 for m=1:length(y)
0273 ind{m} = y{m}(:,bn)<=yval;
0274 end
0275 elseif (fmode=='=')
0276 for m=1:length(y)
0277 ind{m} = y{m}(:,bn)>=yval;
0278 end
0279 else
0280 ind=x{bs}==xval;
0281 end
0282 else
0283 xval=sort(xval);
0284 yval=sort(yval);
0285 if (fmode=='t')
0286 ind=(x{bs}>=xval(1) & x{bs}<=xval(2));
0287 else
0288 ind=(x{bs}>=xval(1) & x{bs}<=xval(2) & y{bs}(:,bn)>=yval(1) & y{bs}(:,bn)<=yval(2));
0289 end
0290 end
0291
0292
0293 return;
0294
0295
0296 function [fmode,emode,gmode]=setmodes(mode,fmode,emode,gmode)
0297
0298 switch mode
0299 case 's'
0300 disp('Single channel mode')
0301 gmode=mode;
0302 fmode=mode;
0303
0304 case 'a'
0305 disp('All Channels mode')
0306 gmode=mode;
0307
0308 case 'c'
0309 disp('Data chunk - Please choose two points')
0310 fmode=mode;
0311 gmode='s';
0312
0313 case 't'
0314 disp('Time chunk - Please choose two points')
0315 fmode=mode;
0316
0317 case '-'
0318 disp('Y limit - below')
0319 fmode=mode;
0320
0321 case '='
0322 disp('Y limit - above')
0323 fmode=mode;
0324
0325 case 'f'
0326 disp('Flag mode ')
0327 emode=mode;
0328
0329 case 'u'
0330 disp('Unflag mode')
0331 emode=mode;
0332
0333 case 'q'
0334 disp('exitting flagging')
0335 fmode=mode;
0336
0337 case 'e'
0338 gmode=mode;
0339
0340 case 'z'
0341 emode=mode;
0342 disp('Box zoom')
0343
0344 case 'x'
0345 emode=mode;
0346 disp('Zoom x-axis')
0347
0348 case 'y'
0349 emode=mode;
0350 disp('Zoom y-axis')
0351
0352 case 'o'
0353 emode=mode;
0354 disp('Unzooming')
0355
0356 case 'h'
0357 printhelp;
0358
0359 otherwise
0360 disp('Invalid Command');
0361
0362 end
0363
0364
0365
0366 function ind=unflagged(ind,flag,autoflag)
0367
0368 f=flag(ind)==1;
0369 ff=autoflag(ind)~=0;
0370 f=f|ff;
0371
0372 s=find(ind==1);
0373 ind(s(find(f==1)))=0;
0374
0375
0376
0377
0378 function dcm=toggleCursor
0379
0380 datacursormode off
0381 dcm=datacursormode(gcf);
0382 set(dcm,'Enable','on','DisplayStyle','window','SnapToDataVertex','on');
0383
0384 return;
0385
0386
0387
0388 function allflags=updateflags(allflags,flag,orgFlag,...
0389 scriptflag,orgScriptflag, newFlag)
0390
0391
0392 for m=1:length(flag)
0393 flag{m}=uint8(flag{m});
0394 scriptflag{m} = uint8(scriptflag{m});
0395 allflags{m} = bitor(uint8(allflags{m}),bitshift(uint8(newFlag{m}),2));
0396
0397
0398 allflags{m} = bitor(uint8(allflags{m}),bitshift(scriptflag{m},4));
0399
0400 end
0401
0402 return;
0403
0404
0405
0406 function allflags=compareflags(allflags,flag,orgFlag,bitnum)
0407
0408
0409
0410 f = find(orgFlag==0);
0411 flag = bitshift(flag, bitnum);
0412 flag(f) = sum(bitset(0,[1:8]));
0413 allflags = bitand(allflags,flag);
0414
0415 return;
0416
0417
0418
0419
0420 function printhelp()
0421
0422 disp(' ')
0423 disp('**Flagging**')
0424 disp(' ')
0425 disp('GLOBAL TYPE COMMANDS')
0426 disp('s - flag single channel');
0427 disp('a - all channels for this timestamp');
0428 disp(' ')
0429 disp('LOCAL TYPE COMMANDS')
0430 disp('c - chunk of data. click 2 corners of a rectangle')
0431 disp('t - time chunk. like ''c'' but only uses x-axis as constraint')
0432 disp('- - flags everything below y-value for all times of this channel only')
0433 disp('= - flags everything above y-value for all times of this channel only')
0434 disp('m - flags specific bands')
0435 disp('n - flags specific baselines/antennas')
0436 disp(' ')
0437 disp('EDIT TYPE COMMANDS')
0438 disp('f - flag mode')
0439 disp('u - unflag mode')
0440 disp('e - erases all new flags')
0441 disp(' ')
0442 disp('**Zoom**')
0443 disp('z - box zoom')
0444 disp('x - zoom x axis')
0445 disp('y - zoom y axis')
0446 disp('o - original plot (unzoom)')
0447 disp(' ')
0448 disp('**Misc Display**')
0449 disp('g - toggle grid on/off')
0450 disp('q - exit flag mode')
0451 disp('h - help')
0452 disp(' ')
0453
0454
0455