0001
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
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086 function [ProjData,errormsg]=proj_field(FieldData,ObjectData,IndexObj)
0087
0088 if isfield(ObjectData,'ProjMode') && (isequal(ObjectData.ProjMode,'none')||isequal(ObjectData.ProjMode,'mask_inside')||isequal(ObjectData.ProjMode,'mask_outside'))
0089 ProjData=[];
0090 return
0091 end
0092
0093 if ~isfield(ObjectData,'Style')||~isfield(ObjectData,'Coord')||~isfield(ObjectData,'ProjMode')
0094 ProjData=FieldData;
0095 return
0096 end
0097
0098
0099 if isfield(ObjectData,'XMax') && ~isempty(ObjectData.XMax)
0100 ObjectData.RangeX(1)=ObjectData.XMax;
0101 end
0102 if isfield(ObjectData,'XMin') && ~isempty(ObjectData.XMin)
0103 ObjectData.RangeX(2)=ObjectData.XMin;
0104 end
0105 if isfield(ObjectData,'YMax') && ~isempty(ObjectData.YMax)
0106 ObjectData.RangeY(1)=ObjectData.YMax;
0107 end
0108 if isfield(ObjectData,'YMin') && ~isempty(ObjectData.YMin)
0109 ObjectData.RangeY(2)=ObjectData.YMin;
0110 end
0111 if isfield(ObjectData,'ZMax') && ~isempty(ObjectData.ZMax)
0112 ObjectData.RangeZ(1)=ObjectData.ZMax;
0113 end
0114 if isfield(ObjectData,'ZMin') && ~isempty(ObjectData.ZMin)
0115 ObjectData.RangeZ(2)=ObjectData.ZMin;
0116 end
0117
0118
0119
0120
0121
0122
0123
0124 if isequal(ObjectData.Style,'points')
0125 [ProjData,errormsg]=proj_points(FieldData,ObjectData);
0126 elseif isequal(ObjectData.Style,'line')|isequal(ObjectData.Style,'polyline')
0127 [ProjData,errormsg] = proj_line(FieldData,ObjectData);
0128 elseif isequal(ObjectData.Style,'polygon')|isequal(ObjectData.Style,'rectangle')|isequal(ObjectData.Style,'ellipse')
0129 if isequal(ObjectData.ProjMode,'inside')|isequal(ObjectData.ProjMode,'outside')
0130 [ProjData,errormsg] = proj_patch(FieldData,ObjectData);
0131 else
0132 [ProjData,errormsg] = proj_line(FieldData,ObjectData);
0133 end
0134
0135 elseif isequal(ObjectData.Style,'plane')
0136
0137
0138
0139 [ProjData,errormsg] = proj_plane(FieldData,ObjectData);
0140
0141 end
0142 if exist('IndexObj','var')
0143 ProjData.IndexObj=IndexObj;
0144 end
0145
0146
0147
0148 function [ProjData,errormsg]=proj_points(FieldData,ObjectData)
0149
0150
0151 siz=size(ObjectData.Coord);
0152 width=0;
0153 if isfield(ObjectData,'Range')
0154 width=ObjectData.Range(1,2);
0155 end
0156 if isfield(ObjectData,'RangeX')&~isempty(ObjectData.RangeX)
0157 width=max(ObjectData.RangeX);
0158 end
0159 if isfield(ObjectData,'RangeY')&~isempty(ObjectData.RangeY)
0160 width=max(width,max(ObjectData.RangeY));
0161 end
0162 if isfield(ObjectData,'RangeZ')&~isempty(ObjectData.RangeZ)
0163 width=max(width,max(ObjectData.RangeZ));
0164 end
0165 if isequal(ObjectData.ProjMode,'projection')
0166 if width==0
0167 errormsg='projection range around points needed';
0168 return
0169 end
0170 elseif ~isequal(ObjectData.ProjMode,'interp')
0171 errormsg=(['ProjMode option ' ObjectData.ProjMode ' not available in proj_field']);
0172 return
0173 end
0174 ProjData=proj_heading(FieldData,ObjectData);
0175 ProjData.NbDim=0;
0176 ProjData.ListDimName= {'nb_points'};
0177 ProjData.DimValue=siz(1);
0178
0179
0180
0181 [CellVarIndex,NbDim,VarTypeCell,errormsg]=find_field_indices(FieldData);
0182 if ~isempty(errormsg)
0183 errormsg=['error in proj_field/proj_points:' errormsg];
0184 return
0185 end
0186
0187
0188
0189
0190 for icell=1:length(CellVarIndex)
0191 if NbDim(icell)==1
0192 continue
0193 end
0194 VarIndex=CellVarIndex{icell};
0195 VarType=VarTypeCell{icell};
0196 ivar_X=VarType.coord_x;
0197 ivar_Y=VarType.coord_y;
0198 ivar_Z=VarType.coord_z;
0199
0200
0201
0202
0203 ivar_Anc=VarType.ancillary;
0204
0205 test_anc(ivar_Anc)=ones(size(ivar_Anc));
0206 ivar_F=VarType.warnflag;
0207 ivar_FF=VarType.errorflag;
0208 VarIndex([ivar_X ivar_Y ivar_Z ivar_Anc ivar_F ivar_FF])=[];
0209 if isempty(ivar_X)
0210 test_grid=1;
0211
0212 else
0213 if length(ivar_X)>1 | length(ivar_Y)>1 | length(ivar_Z)>1
0214 warndlg_uvmat('multiple coordinate input in proj_field.m','ERROR')
0215 return
0216 end
0217 if length(ivar_Y)~=1
0218 warndlg_uvmat('y coordinate not defined in proj_field.m','ERROR')
0219 return
0220 end
0221 test_grid=0;
0222 end
0223 ProjData.ListVarName={'Y','X','NbVal'};
0224 ProjData.VarDimIndex={[1],[1],[1]};
0225 ProjData.VarAttribute{1}.Role='ancillary';
0226 ProjData.VarAttribute{2}.Role='ancillary';
0227 ProjData.VarAttribute{3}.Role='ancillary';
0228 for ivar=VarIndex
0229 VarName=FieldData.ListVarName{ivar};
0230 ProjData.ListVarName=[ProjData.ListVarName {VarName}];
0231 ProjData.VarDimIndex=[ProjData.VarDimIndex {[1]}];
0232 end
0233 if ~test_grid
0234 eval(['coord_x=FieldData.' FieldData.ListVarName{ivar_X} ';'])
0235 eval(['coord_y=FieldData.' FieldData.ListVarName{ivar_Y} ';'])
0236 test3D=0;
0237 if length(ivar_Z)==1
0238 eval(['coord_z=FieldData.' FieldData.ListVarName{ivar_Z} ';'])
0239 test3D=1;
0240 end
0241
0242
0243
0244
0245 if length(ivar_F)>1 | length(ivar_FF)>1
0246 warndlg_uvmat('multiple flag input in proj_field.m','ERROR')
0247 return
0248 end
0249
0250 for ipoint=1:siz(1)
0251 Xpoint=ObjectData.Coord(ipoint,:);
0252 distX=coord_x-Xpoint(1);
0253 distY=coord_y-Xpoint(2);
0254 dist=distX.*distX+distY.*distY;
0255 indsel=find(dist<width*width);
0256 ProjData.X(ipoint,1)=Xpoint(1);
0257 ProjData.Y(ipoint,1)=Xpoint(2);
0258 if isequal(length(ivar_FF),1)
0259 FFName=FieldData.ListVarName{ivar_FF};
0260 eval(['FF=FieldData.' FFName '(indsel);'])
0261 ind_indsel=find(~FF);
0262 indsel=indsel(ind_indsel);
0263 end
0264 ProjData.NbVal(ipoint,1)=length(indsel);
0265 for ivar=VarIndex
0266 VarName=FieldData.ListVarName{ivar};
0267 if isempty(indsel)
0268 eval(['ProjData.' VarName '(ipoint,1)=NaN;'])
0269 else
0270 eval(['Var=FieldData.' VarName '(indsel);'])
0271 eval(['ProjData.' VarName '(ipoint,1)=mean(Var);'])
0272 if isequal(ObjectData.ProjMode,'interp')
0273 eval(['ProjData.' VarName '(ipoint,1)=griddata_uvmat(coord_x(indsel),coord_y(indsel),Var,Xpoint(1),Xpoint(2)))';])
0274 end
0275 end
0276 end
0277 end
0278 else
0279 DimIndices=FieldData.VarDimIndex{VarIndex(1)};
0280
0281 if ~isempty(find(DimIndices))
0282 DimValue=FieldData.DimValue(DimIndices);
0283 ListDimName=FieldData.ListDimName(DimIndices);
0284
0285 for idim=1:length(ListDimName)
0286 DimName=ListDimName{idim};
0287 if isequal(DimName,'rgb')|isequal(DimName,'nb_coord')|isequal(DimName,'nb_coord_i')
0288 nbcolor=DimValue(idim);
0289 DimIndices(idim)=[];
0290 DimValue(idim)=[];
0291 end
0292 if isequal(DimName,'nb_coord_j')
0293 DimIndices(idim)=[];
0294 DimValue(idim)=[];
0295 end
0296 end
0297 ind_1=find(DimValue==1);
0298 DimIndices(ind_1)=[];
0299 indxy=find(DimVarIndex(DimIndices));
0300 nb_dim=length(DimIndices);
0301 Coord_z=[];
0302 Coord_y=[];
0303 Coord_x=[];
0304 for idim=1:nb_dim
0305 test_interp(idim)=0;
0306 test_coord(idim)=0;
0307 ivar=DimVarIndex(DimIndices(idim));
0308 if ~isequal(ivar,0)
0309 eval(['Coord{idim}=FieldData.' FieldData.ListVarName{ivar} ';']) ;
0310 DCoord=diff(Coord{idim});
0311 DCoord_min(idim)=min(DCoord);
0312 DCoord_max=max(DCoord);
0313 test_direct(idim)=DCoord_max>0;
0314 test_direct_min=DCoord_min(idim)>0;
0315 if ~isequal(test_direct(idim),test_direct_min)
0316 warndlg_uvmat(['non monotonic dimension variable # ' num2str(idim) ' in proj_field.m'],'ERROR')
0317 return
0318 end
0319 test_interp(idim)=(DCoord_max-DCoord_min(idim))> 0.0001*abs(DCoord_max);
0320 test_coord(idim)=1;
0321
0322 else
0323 Coord_i_str=['Coord_' num2str(idim)];
0324 DCoord_min(idim)=1;
0325 Coord{idim}=[0.5 DimValue(idim)];
0326 test_direct(idim)=1;
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340
0341
0342
0343
0344
0345
0346 end
0347 end
0348 DX=DCoord_min(2);
0349 DY=DCoord_min(1);
0350 for ipoint=1:siz(1)
0351 xwidth=width/(abs(DX));
0352 ywidth=width/(abs(DY));
0353 i_min=round((ObjectData.Coord(ipoint,1)-Coord{2}(1))/DX+0.5-xwidth);
0354 i_min=max(1,i_min);
0355 i_plus=round((ObjectData.Coord(ipoint,1)-Coord{2}(1))/DX+0.5+xwidth);
0356 i_plus=min(DimValue(2),i_plus);
0357 j_min=round((ObjectData.Coord(ipoint,2)-Coord{1}(1))/DY-ywidth+0.5);
0358 j_min=max(1,j_min);
0359 j_plus=round((ObjectData.Coord(ipoint,2)-Coord{1}(1))/DY+ywidth+0.5);
0360 j_plus=min(DimValue(1),j_plus);
0361 ProjData.X(ipoint,1)=ObjectData.Coord(ipoint,1);
0362 ProjData.Y(ipoint,1)=ObjectData.Coord(ipoint,2);
0363 i_int=[i_min:i_plus];
0364 j_int=[j_min:j_plus];
0365 ProjData.NbVal(ipoint,1)=length(j_int)*length(i_int);
0366 if isempty(i_int) | isempty(j_int)
0367 for ivar=VarIndex
0368 eval(['ProjData.' FieldData.ListVarName{ivar} '(ipoint,:)=NaN;']);
0369 end
0370 errormsg=['no data points in the selected projection range ' num2str(width) ];
0371 else
0372
0373
0374 for ivar=VarIndex
0375 eval(['Avalue=FieldData.' FieldData.ListVarName{ivar} '(j_int,i_int,:);']);
0376 eval(['ProjData.' FieldData.ListVarName{ivar} '(ipoint,:)=mean(mean(Avalue));']);
0377 end
0378 end
0379 end
0380 end
0381 end
0382 end
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
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
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507 function [ProjData,errormsg]=proj_patch(FieldData,ObjectData)
0508
0509 ProjData=proj_heading(FieldData,ObjectData);
0510
0511 objectfield=fieldnames(ObjectData);
0512 widthx=0;
0513 widthy=0;
0514 if isfield(ObjectData,'RangeX')&~isempty(ObjectData.RangeX)
0515 widthx=max(ObjectData.RangeX);
0516 end
0517 if isfield(ObjectData,'RangeY')&~isempty(ObjectData.RangeY)
0518 widthy=max(ObjectData.RangeY);
0519 end
0520
0521
0522 ProjData.NbDim=0;
0523 ProjData.ListDimName={};
0524 ProjData.DimValue=[];
0525 ProjData.ListVarName={};
0526
0527 ProjData.VarDimName={};
0528 if isfield (FieldData,'ListVarAttribute')
0529 ProjData.ListVarAttribute=FieldData.ListVarAttribute;
0530 for iattr=1:length(ProjData.ListVarAttribute)
0531 AttrName=ProjData.ListVarAttribute{iattr};
0532 eval(['ProjData.' AttrName '={};'])
0533 end;
0534 end
0535
0536
0537 testfalse=0;
0538 ListIndex={};
0539
0540 idimvar=0;
0541 [CellVarIndex,NbDim,VarTypeCell,errormsg]=find_field_indices(FieldData);
0542 if ~isempty(errormsg)
0543 errormsg=['error in proj_field/proj_patch:' errormsg];
0544 return
0545 end
0546
0547
0548 dimcounter=0;
0549 for icell=1:length(CellVarIndex)
0550 testX=0;
0551 testY=0;
0552 test_Amat=0;
0553 testfalse=0;
0554 VarIndex=CellVarIndex{icell};
0555 VarType=VarTypeCell{icell};
0556 DimIndices=FieldData.VarDimIndex{VarIndex(1)};
0557 if NbDim(icell)~=2
0558 continue
0559 end
0560 testX=~isempty(VarType.coord_x) && ~isempty(VarType.coord_y);
0561 testfalse=~isempty(VarType.errorflag);
0562 testproj(VarIndex)=zeros(size(VarIndex));
0563 testproj(VarType.scalar)=1;
0564 testproj(VarType.vector_x)=1;
0565 testproj(VarType.vector_y)=1;
0566 testproj(VarType.vector_z)=1;
0567 testproj(VarType.image)=1;
0568 testproj(VarType.color)=1;
0569 VarIndex=VarIndex(find(testproj(VarIndex)));
0570 if testX
0571 eval(['nbpoint=numel(FieldData.' FieldData.ListVarName{VarIndex(1)} ');'])
0572 for ivar=[VarIndex VarType.coord_x VarType.coord_y VarType.errorflag]
0573 VarName=FieldData.ListVarName{ivar};
0574 eval(['FieldData.' VarName '=reshape(FieldData.' VarName ',nbpoint,1);'])
0575 end
0576 XName=FieldData.ListVarName{VarType.coord_x};
0577 YName=FieldData.ListVarName{VarType.coord_y};
0578 eval(['coord_x=FieldData.' XName ';'])
0579 eval(['coord_y=FieldData.' YName ';'])
0580 end
0581 if testfalse
0582 FFName=FieldData.ListVarName{VarType.errorflag};
0583 eval(['errorflag=FieldData.' FFName ';'])
0584 end
0585
0586 if numel(VarType.coord)>=2 & VarType.coord(1:2) > 0;
0587 test_Amat=1;
0588 AYName=FieldData.ListVarName{VarType.coord(1)};
0589 AXName=FieldData.ListVarName{VarType.coord(2)};
0590 eval(['AX=FieldData.' AXName ';'])
0591 eval(['AY=FieldData.' AYName ';'])
0592 VarName=FieldData.ListVarName{VarIndex(1)};
0593 eval(['DimValue=size(FieldData.' VarName ');'])
0594 testcolor=find(numel(DimValue)==3);
0595
0596
0597 for idim=1:length(DimIndices)
0598 Coord_i_str=['Coord_' num2str(idim)];
0599 DCoord_min(idim)=1;
0600 Coord{idim}=[0.5 DimValue(idim)];
0601 test_direct(idim)=1;
0602 if isfield(FieldData,'VarAttribute')
0603 for ivar=VarIndex
0604 if length(FieldData.VarAttribute)>=ivar & isfield(FieldData.VarAttribute{ivar},Coord_i_str)
0605 eval(['Coord_i=FieldData.VarAttribute{ivar}.' Coord_i_str ';']);
0606 if isnumeric(Coord_i)
0607 if length(Coord_i)>=2
0608 Coord{idim}=[Coord_i(1) Coord_i(end)];
0609
0610 else
0611 warndlg_uvmat(['two values needed for ' Coord_i_str 'in proj_field.m'],'ERROR')
0612 return
0613 end
0614 else
0615 warndlg_uvmat(['non numerical coordinate attributes' Coord_i_str 'in proj_field.m'],'ERROR')
0616 return
0617 end
0618
0619 DCoord_min(idim)=(Coord{idim}(end)-Coord{idim}(1))/(DimValue(idim)-1);
0620 end
0621 end
0622 end
0623 end
0624 AX=linspace(Coord{2}(1),Coord{2}(2),DimValue(2));
0625 AY=linspace(Coord{1}(1),Coord{1}(2),DimValue(1));
0626 if length(DimValue)==3
0627 testcolor=1;
0628 npxy(3)=3;
0629 else
0630 testcolor=0;
0631 end
0632 [Xi,Yi]=meshgrid(AX,AY);
0633 npxy(1)=length(AY);
0634 npxy(2)=length(AX);
0635 Xi=reshape(Xi,npxy(1)*npxy(2),1);
0636 Yi=reshape(Yi,npxy(1)*npxy(2),1);
0637 for ivar=1:length(VarIndex)
0638 VarName=FieldData.ListVarName{VarIndex(ivar)};
0639 eval(['FieldData.' VarName '=reshape(FieldData.' VarName ',npxy(1)*npxy(2),npxy(3));']);
0640 end
0641 end
0642
0643 testin=[];
0644 if isequal(ObjectData.Style,'rectangle')
0645
0646
0647
0648
0649 if testX
0650 distX=abs(coord_x-ObjectData.Coord(1,1));
0651 distY=abs(coord_y-ObjectData.Coord(1,2));
0652 testin=distX<widthx & distY<widthy;
0653 elseif test_Amat
0654 distX=abs(Xi-ObjectData.Coord(1,1));
0655 distY=abs(Yi-ObjectData.Coord(1,2));
0656 testin=distX<widthx & distY<widthy;
0657 end
0658 elseif isequal(ObjectData.Style,'polygon')
0659 if testX
0660 testin=inpolygon(coord_x,coord_y,ObjectData.Coord(:,1),ObjectData.Coord(:,2));
0661 elseif test_Amat
0662 testin=inpolygon(Xi,Yi,ObjectData.Coord(:,1),ObjectData.Coord(:,2));
0663 else
0664 testin=[];
0665 end
0666 elseif isequal(ObjectData.Style,'ellipse')
0667 X2Max=widthx*widthx;
0668 Y2Max=(widthy)*(widthy);
0669 if testX
0670 distX=(coord_x-ObjectData.Coord(1,1));
0671 distY=(coord_y-ObjectData.Coord(1,2));
0672 testin=(distX.*distX/X2Max+distY.*distY/Y2Max)<1;
0673 elseif test_Amat
0674 distX=(Xi-ObjectData.Coord(1,1));
0675 distY=(Yi-ObjectData.Coord(1,2));
0676 testin=(distX.*distX/X2Max+distY.*distY/Y2Max)<1;
0677 end
0678 end
0679
0680 if isequal(ObjectData.ProjMode,'outside')
0681 testin=~testin;
0682 end
0683 if testfalse
0684 testin=testin & (errorflag==0);
0685 end
0686 indsel=find(testin);
0687 if length(DimIndices)==1
0688 ProjDimName=FieldData.ListDimName(DimIndices);
0689 elseif dimcounter==0
0690 ProjDimName={'nb_point'};
0691 dimcounter=dimcounter+1;
0692 else
0693 ProjDimName={['nb_point_' num2str(dimcounter)]};
0694 end
0695
0696
0697 for ivar=VarIndex
0698 if testproj(ivar)
0699 VarName=FieldData.ListVarName{ivar};
0700 eval(['ProjData.' VarName '=FieldData.' VarName '(indsel,:);']);
0701 ProjData.ListVarName=[ProjData.ListVarName {VarName}];
0702
0703 ProjData.VarDimName=[ProjData.VarDimName ProjDimName];
0704 end
0705 end
0706 if test_Amat & testcolor
0707
0708
0709
0710 ProjData.VarDimName={{'nb_point','rgb'}};
0711 end
0712 end
0713
0714
0715
0716
0717
0718
0719 function [ProjData,errormsg] = proj_line(FieldData, ObjectData)
0720
0721 ProjData=proj_heading(FieldData,ObjectData);
0722 ProjData.NbDim=1;
0723
0724
0725 ProjMode='projection';
0726 if isfield(ObjectData,'ProjMode'),ProjMode=ObjectData.ProjMode; end;
0727 ProjAngle=90;
0728 if isfield(FieldData,'ProjAngle'),ProjAngle=ObjectData.ProjAngle; end;
0729 width=0;
0730
0731 if isfield(ObjectData,'Range')&size(ObjectData.Range,2)>=2
0732 width=abs(ObjectData.Range(1,2));
0733 end
0734 if isfield(ObjectData,'RangeY')
0735 width=max(ObjectData.RangeY);
0736 end
0737 error=0;
0738 Xline=[];
0739
0740 flux=0;
0741 circul=0;
0742 liny=ObjectData.Coord(:,2);
0743 siz_line=size(ObjectData.Coord);
0744 if siz_line(1)<2
0745 return
0746 end
0747 testfalse=0;
0748 ListIndex={};
0749
0750
0751 dlinx=diff(ObjectData.Coord(:,1));
0752 dliny=diff(ObjectData.Coord(:,2));
0753 theta=angle(dlinx+i*dliny);
0754 theta(siz_line(1))=theta(siz_line(1)-1);
0755
0756 if isequal(ProjMode,'projection') || isequal(ProjMode,'filter')
0757 xsup(1)=ObjectData.Coord(1,1)-width*sin(theta(1));
0758 xinf(1)=ObjectData.Coord(1,1)+width*sin(theta(1));
0759 ysup(1)=ObjectData.Coord(1,2)+width*cos(theta(1));
0760 yinf(1)=ObjectData.Coord(1,2)-width*cos(theta(1));
0761 for ip=2:siz_line(1)
0762 xsup(ip)=ObjectData.Coord(ip,1)-width*sin((theta(ip)+theta(ip-1))/2)/cos((theta(ip-1)-theta(ip))/2);
0763 xinf(ip)=ObjectData.Coord(ip,1)+width*sin((theta(ip)+theta(ip-1))/2)/cos((theta(ip-1)-theta(ip))/2);
0764 ysup(ip)=ObjectData.Coord(ip,2)+width*cos((theta(ip)+theta(ip-1))/2)/cos((theta(ip-1)-theta(ip))/2);
0765 yinf(ip)=ObjectData.Coord(ip,2)-width*cos((theta(ip)+theta(ip-1))/2)/cos((theta(ip-1)-theta(ip))/2);
0766 end
0767 end
0768
0769
0770 [CellVarIndex,NbDim,VarTypeCell,errormsg]=find_field_indices(FieldData);
0771 if ~isempty(errormsg)
0772 errormsg=['error in proj_field/proj_line:' errormsg];
0773 return
0774 end
0775
0776 ProjData.ListVarName={};
0777 ProjData.VarDimName={};
0778 for icell=1:length(CellVarIndex)
0779 VarIndex=CellVarIndex{icell};
0780 VarType=VarTypeCell{icell};
0781
0782 if NbDim(icell)~=2
0783 continue
0784 end
0785 testX=~isempty(VarType.coord_x) && ~isempty(VarType.coord_y);
0786 testU=~isempty(VarType.vector_x) && ~isempty(VarType.vector_y);
0787 testfalse=~isempty(VarType.errorflag);
0788 testproj(VarIndex)=zeros(size(VarIndex));
0789 testproj(VarType.scalar)=1;
0790
0791
0792 testproj(VarType.vector_z)=1;
0793 testproj(VarType.image)=1;
0794 testproj(VarType.color)=1;
0795 VarIndex=VarIndex(find(testproj(VarIndex)));
0796 if testU
0797 VarIndex=[VarIndex VarType.vector_x VarType.vector_y];
0798 end
0799
0800 if testU
0801 UName=FieldData.ListVarName{VarType.vector_x};
0802 VName=FieldData.ListVarName{VarType.vector_y};
0803 eval(['vector_x=FieldData.' UName ';'])
0804 eval(['vector_y=FieldData.' VName ';'])
0805 end
0806
0807
0808 if testfalse
0809 FFName=FieldData.ListVarName{VarType.errorflag};
0810 eval(['errorflag=FieldData.' FFName ';'])
0811 end
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821 if testX
0822 if ~isequal(ProjMode,'interp')
0823 if width==0
0824 errormsg='range of the projection object is missing';
0825 return
0826 else
0827 lambda=2/(width*width);
0828 end
0829 end
0830 if ~isequal(ProjMode,'projection')
0831 if isfield(ObjectData,'DX')&~isempty(ObjectData.DX)
0832 DX=abs(ObjectData.DX);
0833 else
0834 errormsg='DX missing';
0835 return
0836 end
0837 end
0838 XName= FieldData.ListVarName{VarType.coord_x};
0839 YName= FieldData.ListVarName{VarType.coord_y};
0840 eval(['coord_x=FieldData.' XName ';'])
0841 eval(['coord_y=FieldData.' YName ';'])
0842 end
0843
0844
0845 for ivar=1:length(VarIndex)
0846 ProjLine{ivar}=[];
0847 end
0848 XLine=[];
0849 linelengthtot=0;
0850
0851
0852
0853
0854
0855 if testX
0856 for ip=1:siz_line(1)-1
0857 linelength=sqrt(dlinx(ip)*dlinx(ip)+dliny(ip)*dliny(ip));
0858
0859 if testfalse
0860 flagsel=(errorflag==0);
0861 else
0862 flagsel=ones(size(coord_x));
0863 end
0864 if isequal(ProjMode,'projection') | isequal(ProjMode,'filter')
0865 flagsel=flagsel & ((coord_y -yinf(ip))*(xinf(ip+1)-xinf(ip))>(coord_x-xinf(ip))*(yinf(ip+1)-yinf(ip))) ...
0866 & ((coord_y -ysup(ip))*(xsup(ip+1)-xsup(ip))<(coord_x-xsup(ip))*(ysup(ip+1)-ysup(ip))) ...
0867 & ((coord_y -yinf(ip+1))*(xsup(ip+1)-xinf(ip+1))>(coord_x-xinf(ip+1))*(ysup(ip+1)-yinf(ip+1))) ...
0868 & ((coord_y -yinf(ip))*(xsup(ip)-xinf(ip))<(coord_x-xinf(ip))*(ysup(ip)-yinf(ip)));
0869 end
0870 indsel=find(flagsel);
0871 X_sel=coord_x(indsel);
0872 Y_sel=coord_y(indsel);
0873 nbvar=0;
0874 for iselect=1:numel(VarIndex)-2*testU
0875 VarName=FieldData.ListVarName{VarIndex(iselect)};
0876 eval(['ProjVar{iselect}=FieldData.' VarName '(indsel);']);
0877 end
0878 if testU
0879 ProjVar{numel(VarIndex)-1}=cos(theta(ip))*vector_x(indsel)+sin(theta(ip))*vector_y(indsel);
0880 ProjVar{numel(VarIndex)}=-sin(theta(ip))*vector_x(indsel)+cos(theta(ip))*vector_y(indsel);
0881 end
0882 if isequal(ProjMode,'projection')
0883 sintheta=sin(theta(ip));
0884 costheta=cos(theta(ip));
0885 Xproj=(X_sel-ObjectData.Coord(ip,1))*costheta + (Y_sel-ObjectData.Coord(ip,2))*sintheta;
0886 [Xproj,indsort]=sort(Xproj);
0887 for ivar=1:numel(ProjVar)
0888 if ~isempty(ProjVar{ivar})
0889 ProjVar{ivar}=ProjVar{ivar}(indsort);
0890 end
0891 end
0892 elseif isequal(ProjMode,'interp')
0893 npoint=floor(linelength/DX)+1;
0894 Xproj=[linelength/(2*npoint):linelength/npoint:linelength-linelength/(2*npoint)];
0895 xreg=cos(theta(ip))*Xproj+ObjectData.Coord(ip,1);
0896 yreg=sin(theta(ip))*Xproj+ObjectData.Coord(ip,2);
0897 for ivar=1:numel(ProjVar)
0898 if ~isempty(ProjVar{ivar})
0899 ProjVar{ivar}=griddata_uvmat(X_sel,Y_sel,ProjVar{ivar},xreg,yreg);
0900 end
0901 end
0902 elseif isequal(ProjMode,'filter')
0903 npoint=floor(linelength/DX)+1;
0904 Xproj=[linelength/(2*npoint):linelength/npoint:linelength-linelength/(2*npoint)];
0905 siz=size(X_sel);
0906 xregij=cos(theta(ip))*Xproj'*ones(1,siz(2))+ObjectData.Coord(ip,1);
0907 yregij=sin(theta(ip))*Xproj'*ones(1,siz(2))+ObjectData.Coord(ip,2);
0908 xij=ones(npoint,1)*X_sel;
0909 yij=ones(npoint,1)*Y_sel;
0910 Aij=exp(-lambda*((xij-xregij).*(xij-xregij)+(yij-yregij).*(yij-yregij)));
0911 norm=ones(1,siz(2))*Aij';
0912 for ivar=1:numel(ProjVar)
0913 if ~isempty(ProjVar{ivar})
0914 ProjVar{ivar}=ProjVar{ivar}*Aij'./norm;
0915 end
0916 end
0917 end
0918
0919 for ivar=1:numel(ProjVar)
0920 if ~isempty(ProjVar{ivar})
0921 ProjLine{ivar}=[ProjLine{ivar}; ProjVar{ivar}];
0922 end
0923 end
0924 XLine=[XLine ;(Xproj+linelengthtot)];
0925 linelengthtot=linelengthtot+linelength;
0926
0927
0928 end
0929 ProjData.X=XLine';
0930
0931
0932
0933 cur_index=1;
0934 ProjData.ListVarName=[ProjData.ListVarName {XName}];
0935 ProjData.VarDimName=[ProjData.VarDimName {XName}];
0936
0937 ProjData.VarAttribute{1}.long_name='abscissa along line';
0938
0939
0940 for iselect=1:numel(VarIndex)
0941 VarName=FieldData.ListVarName{VarIndex(iselect)};
0942 eval(['ProjData.' VarName '=ProjLine{iselect};'])
0943 ProjData.ListVarName=[ProjData.ListVarName {VarName}];
0944 ProjData.VarDimName=[ProjData.VarDimName {XName}];
0945
0946 ProjData.VarAttribute{iselect}=FieldData.VarAttribute{VarIndex(iselect)};
0947 end
0948
0949
0950 elseif numel(VarType.coord)>=2 & VarType.coord(1:2) > 0;
0951 if ~isequal(ObjectData.Style,'line')
0952 errormsg=['no projection available on ' ObjectData.Style 'for structured coordinates'];
0953 else
0954 test_Amat=1;
0955 test_interp2=0;
0956
0957 AYName=FieldData.ListVarName{VarType.coord(1)};
0958 AXName=FieldData.ListVarName{VarType.coord(2)};
0959 eval(['AX=FieldData.' AXName ';']);
0960 eval(['AY=FieldData.' AYName ';']);
0961 AName=FieldData.ListVarName{VarType.scalar};
0962 eval(['A=FieldData.' AName ';']);
0963 npxy=size(A);
0964 npx=npxy(2);
0965 npy=npxy(1);
0966 if numel(AX)==2
0967 DX=(AX(2)-AX(1))/(npx-1);
0968 else
0969 DX_vec=diff(AX);
0970 DX=max(DX_vec);
0971 DX_min=min(DX_vec);
0972 if (DX-DX_min)>0.0001*abs(DX)
0973 test_interp2=1;
0974 DX=DX_min;
0975 end
0976 end
0977 if numel(AY)==2
0978 DY=(AY(2)-AY(1))/(npy-1);
0979 else
0980 DY_vec=diff(AY);
0981 DY=max(DY_vec);
0982 DY_min=min(DY_vec);
0983 if (DY-DY_min)>0.0001*abs(DY)
0984 test_interp2=1;
0985 DY=DY_min;
0986 end
0987 end
0988 AXI=linspace(AX(1),AX(end), npx);
0989 AYI=linspace(AY(1),AY(end), npy);
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003 if isfield(ObjectData,'DX')
1004 DXY_line=ObjectData.DX;
1005 else
1006 DXY_line=sqrt(abs(DX*DY));
1007 end
1008 dlinx=ObjectData.Coord(2,1)-ObjectData.Coord(1,1);
1009 dliny=ObjectData.Coord(2,2)-ObjectData.Coord(1,2);
1010 linelength=sqrt(dlinx*dlinx+dliny*dliny);
1011 theta=angle(dlinx+i*dliny);
1012 if isfield(FieldData,'RangeX')
1013 XMin=min(FieldData.RangeX);
1014 else
1015 XMin=0;
1016 end
1017 ProjData.AX=linspace(XMin,XMin+linelength,linelength/DXY_line+1);
1018 y=linspace(-width,width,2*width/DXY_line+1);
1019 npX=length(ProjData.AX);
1020 npY=length(y);
1021 [X,Y]=meshgrid(ProjData.AX,y);
1022 XIMA=ObjectData.Coord(1,1)+(X-XMin)*cos(theta)-Y*sin(theta);
1023 YIMA=ObjectData.Coord(1,2)+(X-XMin)*sin(theta)+Y*cos(theta);
1024 XIMA=(XIMA-AX(1))/DX+1;
1025 YIMA=(YIMA-AY(1))/DY+1;
1026 XIMA=reshape(round(XIMA),1,npX*npY);
1027 YIMA=reshape(round(YIMA),1,npX*npY);
1028 flagin=XIMA>=1 & XIMA<=npx & YIMA >=1 & YIMA<=npy;
1029 ind_in=find(flagin);
1030 ind_out=find(~flagin);
1031 ICOMB=(XIMA-1)*npy+YIMA;
1032 ICOMB=ICOMB(flagin);
1033 nbcolor=1;
1034 if numel(npxy)==2
1035 nbcolor=1;
1036 elseif length(npxy)==3
1037 nbcolor=npxy(3);
1038 else
1039 errormsg='multicomponent field not projected';
1040 display(errormsg)
1041 return
1042 end
1043 nbvar=length(ProjData.ListVarName);
1044
1045 ProjData.ListVarName=[ProjData.ListVarName {AXName}];
1046 ProjData.VarDimName=[ProjData.VarDimName {AXName}];
1047 for ivar=VarIndex
1048 VarName{ivar}=FieldData.ListVarName{ivar};
1049 if test_interp2
1050 eval(['FieldData.' VarName{ivar} '=interp2(FieldData.' AXName ',FieldData.' AYName ',FieldData.' VarName{ivar} ',AXI,AYI'');'])
1051 end
1052 eval(['vec_A=reshape(squeeze(FieldData.' VarName{ivar} '),npx*npy,nbcolor);'])
1053 if nbcolor==1
1054 vec_B(ind_in)=vec_A(ICOMB);
1055 vec_B(ind_out)=zeros(size(ind_out));
1056 A_out=reshape(vec_B,npY,npX);
1057 eval(['ProjData.' VarName{ivar} '=((sum(A_out,1)/npY))'';']);
1058 elseif nbcolor==3
1059 vec_B(ind_in,[1:3])=vec_A(ICOMB,:);
1060 vec_B(ind_out,1)=zeros(size(ind_out));
1061 vec_B(ind_out,2)=zeros(size(ind_out));
1062 vec_B(ind_out,3)=zeros(size(ind_out));
1063 A_out=reshape(vec_B,npY,npX,nbcolor);
1064 eval(['ProjData.' VarName{ivar} '=squeeze(sum(A_out,1)/npY);']);
1065 end
1066 ProjData.ListVarName=[ProjData.ListVarName VarName{ivar} ];
1067 ProjData.VarDimName=[ProjData.VarDimName {AXName}];
1068
1069 end
1070 if testU
1071 eval(['vector_x =ProjData.' VarName{ivar_u} ';'])
1072 eval(['vector_y =ProjData.' VarName{ivar_v} ';'])
1073 eval(['ProjData.' VarName{ivar_u} '=cos(theta)*vector_x+sin(theta)*vector_y;'])
1074 eval(['ProjData.' VarName{ivar_v} '=-sin(theta)*vector_x+cos(theta)*vector_y;'])
1075 end
1076
1077
1078
1079
1080 ProjData.VarAttribute{nbvar+1}.long_name='abscissa along line';
1081
1082 if nbcolor==3
1083
1084
1085
1086 ProjData.VarDimName{end}={XName,'rgb'};
1087 end
1088 end
1089 end
1090 end
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109 function [ProjData,errormsg] = proj_plane(FieldData, ObjectData)
1110
1111
1112
1113
1114 ProjMode='projection';
1115 if isfield(ObjectData,'ProjMode'),ProjMode=ObjectData.ProjMode; end;
1116
1117
1118 if isempty(ObjectData.Coord)
1119 ObjectData.Coord(1,1)=0;
1120 ObjectData.Coord(1,2)=0;
1121 ObjectData.Coord(1,3)=0;
1122 end
1123
1124
1125 Phi=0;
1126 Theta=0;
1127 Psi=0;
1128 if isfield(ObjectData,'Phi')&& ~isempty(ObjectData.Phi)
1129 Phi=(pi/180)*ObjectData.Phi;
1130 end
1131 if isfield(ObjectData,'Theta')&& ~isempty(ObjectData.Theta)
1132 Theta=(pi/180)*ObjectData.Theta;
1133 end
1134 if isfield(ObjectData,'Psi')&& ~isempty(ObjectData.Psi)
1135 Psi=(pi/180)*ObjectData.Psi;
1136 end
1137
1138
1139 NormVec_X=-sin(Phi)*sin(Theta);
1140 NormVec_Y=cos(Phi)*sin(Theta);
1141 NormVec_Z=cos(Theta);
1142
1143
1144 test3D=0;
1145 if isfield(FieldData,'NbDim')
1146 test3D=isequal(FieldData.NbDim,3);
1147 end
1148 test3C=test3D;
1149
1150
1151 DX=0;
1152 DY=0;
1153 if isfield(ObjectData,'DX')&~isempty(ObjectData.DX)
1154 DX=abs(ObjectData.DX);
1155 end
1156 if isfield(ObjectData,'DY')&~isempty(ObjectData.DY)
1157 DY=abs(ObjectData.DY);
1158 end
1159 if ~isequal(ProjMode,'projection') & (DX==0|DY==0)
1160 errormsg='DX or DY missing';
1161 display(errormsg)
1162 return
1163 end
1164
1165
1166 testXMin=0;
1167 testXMax=0;
1168 testYMin=0;
1169 testYMax=0;
1170 if isfield(ObjectData,'RangeX')
1171 XMin=min(ObjectData.RangeX);
1172 XMax=max(ObjectData.RangeX);
1173 testXMin=XMax>XMin;
1174 testXMax=1;
1175 end
1176 if isfield(ObjectData,'RangeY')
1177 YMin=min(ObjectData.RangeY);
1178 YMax=max(ObjectData.RangeY);
1179 testYMin=YMax>YMin;
1180 testYMax=1;
1181 end
1182 width=0;
1183 if isfield(ObjectData,'RangeZ')
1184 width=max(ObjectData.RangeZ);
1185 end
1186
1187
1188 ProjData=proj_heading(FieldData,ObjectData);
1189 ProjData.NbDim=2;
1190 ProjData.ListDimName={};
1191 ProjData.DimValue=[];
1192 ProjData.ListVarName={};
1193 ProjData.VarDimIndex={};
1194
1195 error=0;
1196 flux=0;
1197 testfalse=0;
1198 ListIndex={};
1199
1200
1201
1202
1203 idimvar=0;
1204 [CellVarIndex,NbDim,VarTypeCell,errormsg]=find_field_indices(FieldData);
1205 if ~isempty(errormsg)
1206 errormsg=['error in proj_field/proj_plane:' errormsg];
1207 return
1208 end
1209
1210
1211 ivar_new=0;
1212 icoord=0;
1213 for icell=1:length(CellVarIndex)
1214 if NbDim(icell)==1
1215 continue
1216 end
1217 VarIndex=CellVarIndex{icell};
1218 VarType=VarTypeCell{icell};
1219 ivar_X=VarType.coord_x;
1220 ivar_Y=VarType.coord_y;
1221 ivar_Z=VarType.coord_z;
1222 ivar_U=VarType.vector_x;
1223 ivar_V=VarType.vector_y;
1224 ivar_W=VarType.vector_z;
1225 ivar_C=VarType.scalar ;
1226 ivar_Anc=VarType.ancillary;
1227 test_anc=zeros(size(VarIndex));
1228 test_anc(ivar_Anc)=ones(size(ivar_Anc));
1229 ivar_F=VarType.warnflag;
1230 ivar_FF=VarType.errorflag;
1231 if isempty(ivar_X)
1232 test_grid=1;
1233 else
1234 if length(ivar_Y)~=1
1235 warndlg_uvmat('y coordinate missing in proj_field.m','ERROR')
1236 return
1237 end
1238 test_grid=0;
1239 end
1240 DimIndices=FieldData.VarDimIndex{VarIndex(1)};
1241
1242
1243 if ~test_grid
1244 if length(ivar_X)==1
1245 eval(['coord_x=FieldData.' FieldData.ListVarName{ivar_X} ';'])
1246 end
1247 if length(ivar_Y)==1
1248 eval(['coord_y=FieldData.' FieldData.ListVarName{ivar_Y} ';'])
1249 end
1250 if length(ivar_Z)==1
1251 eval(['coord_z=FieldData.' FieldData.ListVarName{ivar_Z} ';'])
1252 end
1253 if length(ivar_U)>1 | length(ivar_V)>1 | length(ivar_W)>1
1254 warndlg_uvmat('multiple vector input in proj_field.m','ERROR')
1255 return
1256 end
1257 if length(ivar_X)>1 | length(ivar_Y)>1 | length(ivar_Z)>1
1258 warndlg_uvmat('multiple coordinate input in proj_field.m','ERROR')
1259 return
1260 end
1261 if length(ivar_F)>1 | length(ivar_FF)>1
1262 warndlg_uvmat('multiple flag input in proj_field.m','ERROR')
1263 return
1264 end
1265 if length(ivar_Y)~=1
1266 warndlg_uvmat('y coordinate missing in proj_field.m','ERROR')
1267 return
1268 end
1269
1270 coord_x=coord_x-ObjectData.Coord(1,1);
1271 coord_y=coord_y-ObjectData.Coord(1,2);
1272 if ~isempty(ivar_Z)
1273 coord_z=coord_z-ObjectData.Coord(1,3);
1274 end
1275
1276 if length(ivar_Z)==1 & width > 0
1277
1278 fieldZ=NormVec_X*coord_x + NormVec_Y*coord_y+ NormVec_Z*coord_z;
1279 indcut=find(abs(fieldZ) <= width);
1280 for ivar=VarIndex
1281 VarName=FieldData.ListVarName{ivar};
1282 eval(['FieldData.' VarName '=FieldData.' VarName '(indcut);'])
1283
1284
1285 end
1286 coord_x=coord_x(indcut);
1287 coord_y=coord_y(indcut);
1288 coord_z=coord_z(indcut);
1289 end
1290
1291
1292 if isequal(Phi,0)
1293 coord_X=coord_x;
1294 coord_Y=coord_y;
1295 if ~isequal(Theta,0)
1296 coord_Y=coord_Y *cos(Theta);
1297 end
1298 else
1299 coord_X=(coord_x *cos(Phi) + coord_y* sin(Phi));
1300 coord_Y=(-coord_x *sin(Phi) + coord_y *cos(Phi))*cos(Theta);
1301 end
1302 if ~isempty(ivar_Z)
1303 coord_Y=coord_Y+coord_z *sin(Theta);
1304 end
1305 if ~isequal(Psi,0)
1306 coord_X=(coord_X *cos(Psi) - coord_Y* sin(Psi));
1307 coord_Y=(coord_X *sin(Psi) + coord_Y* cos(Psi));
1308 end
1309
1310
1311 testin=ones(size(coord_X));
1312 testbound=0;
1313 if testXMin
1314 testin=testin & (coord_X >= XMin);
1315 testbound=1;
1316 end
1317 if testXMax
1318 testin=testin & (coord_X <= XMax);
1319 testbound=1;
1320 end
1321 if testYMin
1322 testin=testin & (coord_Y >= YMin);
1323 testbound=1;
1324 end
1325 if testYMin
1326 testin=testin & (coord_Y <= YMax);
1327 testbound=1;
1328 end
1329 if testbound
1330 indcut=find(testin);
1331 for ivar=VarIndex
1332 VarName=FieldData.ListVarName{ivar};
1333 eval(['FieldData.' VarName '=FieldData.' VarName '(indcut);'])
1334 end
1335 coord_X=coord_X(indcut);
1336 coord_Y=coord_Y(indcut);
1337 if length(ivar_Z)==1
1338 coord_Z=coord_Z(indcut);
1339 end
1340 end
1341
1342 if isequal(ObjectData.ProjMode,'projection')
1343 ProjData.ListDimName=[ProjData.ListDimName FieldData.ListDimName(DimIndices(1))];
1344 ProjData.DimValue=[ProjData.DimValue length(coord_X)];
1345 nbvar=0;
1346 for ivar=VarIndex
1347 VarName=FieldData.ListVarName{ivar};
1348 if ivar==ivar_X
1349 eval(['ProjData.' VarName '=coord_X;'])
1350 elseif ivar==ivar_Y
1351 eval(['ProjData.' VarName '=coord_Y;'])
1352 elseif isempty(ivar_Z) || ivar~=ivar_Z
1353 eval(['ProjData.' VarName '=FieldData.' VarName ';'])
1354 end
1355 if isempty(ivar_Z) || ivar~=ivar_Z
1356 ProjData.ListVarName=[ProjData.ListVarName VarName];
1357 ProjData.VarDimIndex=[ProjData.VarDimIndex DimIndices(1)];
1358 nbvar=nbvar+1;
1359 if isfield(FieldData,'VarAttribute') & length(FieldData.VarAttribute) >=ivar
1360 ProjData.VarAttribute{nbvar}=FieldData.VarAttribute{ivar};
1361 end
1362 end
1363 end
1364 elseif isequal(ObjectData.ProjMode,'interp')||isequal(ObjectData.ProjMode,'filter')
1365 coord_x_proj=[XMin:DX:XMax];
1366 coord_y_proj=[YMin:DY:YMax];
1367 ProjData.ListDimName={'coord_y','coord_x'};
1368 ProjData.DimValue=[length(coord_y_proj) length(coord_x_proj)];
1369 ProjData.ListVarName={};
1370 ProjData.VarDimIndex={};
1371 if isempty(ivar_X), ivar_X=0; end;
1372 if isempty(ivar_Y), ivar_Y=0; end;
1373 if isempty(ivar_Z), ivar_Z=0; end;
1374 if isempty(ivar_U), ivar_U=0; end;
1375 if isempty(ivar_V), ivar_V=0; end;
1376 if isempty(ivar_W), ivar_W=0; end;
1377 if isempty(ivar_F), ivar_F=0; end;
1378 if isempty(ivar_FF), ivar_FF=0; end;
1379 if ~isequal(ivar_FF,0)
1380 VarName_FF=FieldData.ListVarName{ivar_FF};
1381 eval(['indsel=find(FieldData.' VarName_FF '==0);'])
1382 coord_X=coord_X(indsel);
1383 coord_Y=coord_Y(indsel);
1384 end
1385 FF=zeros(1,length(coord_y_proj)*length(coord_x_proj));
1386 testFF=0;
1387 for ivar=VarIndex
1388 VarName=FieldData.ListVarName{ivar};
1389 if ~( ivar==ivar_X | ivar==ivar_Y | ivar==ivar_Z | ivar==ivar_F | ivar==ivar_FF | test_anc(ivar)==1)
1390 ivar_new=ivar_new+1;
1391 ProjData.ListVarName=[ProjData.ListVarName {VarName}];
1392 ProjData.VarDimIndex=[ProjData.VarDimIndex {[1 2]}];
1393 if isfield(FieldData,'VarAttribute') & length(FieldData.VarAttribute) >=ivar
1394 ProjData.VarAttribute{ivar_new}=FieldData.VarAttribute{ivar};
1395 end
1396 ProjData.VarAttribute{ivar_new}.Coord_2=[XMin XMax];
1397 ProjData.VarAttribute{ivar_new}.Coord_1=[YMin YMax];
1398 if ~isequal(ivar_FF,0)
1399 eval(['FieldData.' VarName '=FieldData.' VarName '(indsel);'])
1400 end
1401 eval(['ProjData.' VarName '=griddata_uvmat(coord_X,coord_Y,FieldData.' VarName ',coord_x_proj,coord_y_proj'');'])
1402 eval(['varline=reshape(ProjData.' VarName ',1,length(coord_y_proj)*length(coord_x_proj));'])
1403 FFlag= isnan(varline);
1404 indnan=find(FFlag);
1405 if~isempty(indnan)
1406 varline(indnan)=zeros(size(indnan));
1407 eval(['ProjData.' VarName '=reshape(varline,length(coord_y_proj),length(coord_x_proj));'])
1408 FF(indnan)=ones(size(indnan));
1409
1410
1411 testFF=1;
1412 end
1413 if ivar==ivar_U
1414 ivar_U=ivar_new;
1415 end
1416 if ivar==ivar_V
1417 ivar_V=ivar_new;
1418 end
1419 if ivar==ivar_W
1420 ivar_W=ivar_new;
1421 end
1422 end
1423 end
1424 if testFF
1425 ProjData.FF=reshape(FF,length(coord_y_proj),length(coord_x_proj));
1426 ProjData.ListVarName=[ProjData.ListVarName {'FF'}];
1427 ProjData.VarDimIndex=[ProjData.VarDimIndex {[1 2]}];
1428 ProjData.VarAttribute{ivar_new+1}.Role='errorflag';
1429 end
1430 end
1431
1432 else
1433 DimValue=FieldData.DimValue(DimIndices);
1434 ListDimName=FieldData.ListDimName(DimIndices);
1435 nbcolor=1;
1436 for idim=1:length(ListDimName)
1437 DimName=ListDimName{idim};
1438 if isequal(DimName,'rgb')|isequal(DimName,'nb_coord')|isequal(DimName,'nb_coord_i')
1439 nbcolor=DimValue(idim);
1440 DimIndices(idim)=[];
1441 DimValue(idim)=[];
1442 end
1443 if isequal(DimName,'nb_coord_j')
1444 DimIndices(idim)=[];
1445 DimValue(idim)=[];
1446 end
1447 end
1448 ind_1=find(DimValue==1);
1449 DimIndices(ind_1)=[];
1450 indxy=find(DimVarIndex(DimIndices));
1451 nb_dim=length(DimIndices);
1452 Coord_z=[];
1453 Coord_y=[];
1454 Coord_x=[];
1455
1456 for idim=1:nb_dim
1457 test_interp(idim)=0;
1458 test_coord(idim)=0;
1459 ivar=DimVarIndex(DimIndices(idim));
1460 if ~isequal(ivar,0)
1461 eval(['Coord{idim}=FieldData.' FieldData.ListVarName{ivar} ';']) ;
1462 DCoord=diff(Coord{idim});
1463 DCoord_min(idim)=min(DCoord);
1464 DCoord_max=max(DCoord);
1465 test_direct(idim)=DCoord_max>0;
1466 test_direct_min=DCoord_min(idim)>0;
1467 if ~isequal(test_direct(idim),test_direct_min)
1468 warndlg_uvmat(['non monotonic dimension variable # ' num2str(idim) ' in proj_field.m'],'ERROR')
1469 return
1470 end
1471 test_interp(idim)=(DCoord_max-DCoord_min(idim))> 0.0001*abs(DCoord_max);
1472 test_coord(idim)=1;
1473
1474 else
1475 Coord_i_str=['Coord_' num2str(idim)];
1476 DCoord_min(idim)=1;
1477 Coord{idim}=[0.5 DimValue(idim)-0.5];
1478 test_direct(idim)=1;
1479 for ivar=VarIndex
1480 if isfield(FieldData.VarAttribute{ivar},Coord_i_str)
1481 eval(['Coord{idim}=FieldData.VarAttribute{ivar}.' Coord_i_str ';']);
1482 if isnumeric(Coord{idim})
1483 if length(Coord{idim})>=2
1484 test_direct(idim)=(Coord{idim}(2)>Coord{idim}(1));
1485 else
1486 warndlg_uvmat(['two values needed for ' Coord_i_str 'in proj_field.m'],'ERROR')
1487 return
1488 end
1489 else
1490 warndlg_uvmat(['non numerical coordinate attributes' Coord_i_str 'in proj_field.m'],'ERROR')
1491 return
1492 end
1493 DCoord_min(idim)=(Coord{idim}(end)-Coord{idim}(1))/(DimValue(idim)-1);
1494 end
1495 end
1496 end
1497 end
1498 if nb_dim==2
1499 if DY==0
1500 DY=abs(DCoord_min(1));
1501 end
1502 npY=1+round(abs(Coord{1}(end)-Coord{1}(1))/DY);
1503 npy=1+round(abs(Coord{1}(end)-Coord{1}(1))/abs(DCoord_min(1)));
1504 if DX==0
1505 DX=abs(DCoord_min(2));
1506 end
1507 npX=1+round(abs(Coord{2}(end)-Coord{2}(1))/DX);
1508 npx=1+round(abs(Coord{2}(end)-Coord{2}(1))/abs(DCoord_min(2)));
1509 Coord_y=linspace(Coord{1}(1),Coord{1}(end),npY);
1510 test_direct_y=test_direct(1);
1511 Coord_x=linspace(Coord{2}(1),Coord{2}(end),npX);
1512 test_direct_x=test_direct(2);
1513 DAX=DCoord_min(2);
1514 DAY=DCoord_min(1);
1515 elseif nb_dim==3
1516 DZ=abs(DCoord_min(1));
1517 npz=1+round(abs(Coord{1}(end)-Coord{1}(1))/DZ);
1518 if DY==0
1519 DY=abs(DCoord_min(2));
1520 end
1521 npY=1+round(abs(Coord{2}(end)-Coord{2}(1))/DY);
1522 npy=1+round(abs(Coord{2}(end)-Coord{2}(1))/abs(DCoord_min(2)));
1523 if DX==0
1524 DX=abs(DCoord_min(3));
1525 end
1526 npX=1+round(abs(Coord{3}(end)-Coord{3}(1))/DX);
1527 npx=1+round(abs(Coord{3}(end)-Coord{3}(1))/abs(DCoord_min(3)));
1528 Coord_z=linspace(Coord{1}(1),Coord{1}(end),npz);
1529 test_direct_z=test_direct(1);
1530 Coord_y=linspace(Coord{2}(1),Coord{2}(end),npY);
1531 test_direct_y=test_direct(2);
1532 Coord_x=linspace(Coord{3}(1),Coord{3}(end),npX);
1533 test_direct_x=test_direct(3);
1534 end
1535 minAX=min(Coord_x);
1536 maxAX=max(Coord_x);
1537 minAY=min(Coord_y);
1538 maxAY=max(Coord_y);
1539 xcorner=[minAX maxAX minAX maxAX]-ObjectData.Coord(1,1);
1540 ycorner=[maxAY maxAY minAY minAY]-ObjectData.Coord(1,2);
1541 xcor_new=xcorner*cos(Phi)+ycorner*sin(Phi);
1542 ycor_new=-xcorner*sin(Phi)+ycorner*cos(Phi);
1543 if ~testXMax
1544 XMax=max(xcor_new);
1545 end
1546 if ~testXMin
1547 XMin=min(xcor_new);
1548 end
1549 if ~testYMax
1550 YMax=max(ycor_new);
1551 end
1552 if ~testYMin
1553 YMin=min(ycor_new);
1554 end
1555 DXinit=(maxAX-minAX)/(npx-1);
1556 DYinit=(maxAY-minAY)/(npy-1);
1557 if DX==0
1558 DX=DXinit;
1559 end
1560 if DY==0
1561 DY=DYinit;
1562 end
1563 npX=floor((XMax-XMin)/DX+1);
1564 npY=floor((YMax-YMin)/DY+1);
1565 if test_direct_y
1566 coord_y_proj=linspace(YMin,YMax,npY);
1567 else
1568 coord_y_proj=linspace(YMax,YMin,npY);
1569 end
1570 if test_direct_x
1571 coord_x_proj=linspace(XMin,XMax,npX);
1572 else
1573 coord_x_proj=linspace(XMax,XMin,npX);
1574 end
1575
1576
1577 if isequal(ProjMode,'projection') && isequal(Phi,0) && isequal(Theta,0) && isequal(Psi,0)
1578 if test_direct(1)
1579 min_ind1=ceil((YMin-Coord{1}(1))/DYinit)+1;
1580 max_ind1=floor((YMax-Coord{1}(1))/DYinit)+1;
1581 Ybound(1)=Coord{1}(1)+DYinit*(min_ind1-1);
1582 Ybound(2)=Coord{1}(1)+DYinit*(max_ind1-1);
1583 else
1584 min_ind1=ceil((Coord{1}(1)-YMax)/DYinit)+1;
1585 max_ind1=floor((Coord{1}(1)-YMin)/DYinit)+1;
1586 Ybound(2)=Coord{1}(1)-DYinit*(max_ind1-1);
1587 Ybound(1)=Coord{1}(1)-DYinit*(min_ind1-1);
1588 end
1589 if test_direct(2)==1
1590 min_ind2=ceil((XMin-Coord{2}(1))/DXinit)+1;
1591 max_ind2=floor((XMax-Coord{2}(1))/DXinit)+1;
1592 Xbound(1)=Coord{2}(1)+DXinit*(min_ind2-1);
1593 Xbound(2)=Coord{2}(1)+DXinit*(max_ind2-1);
1594 else
1595 min_ind2=ceil((Coord{2}(1)-XMax)/DXinit)+1;
1596 max_ind2=floor((Coord{2}(1)-XMin)/DXinit)+1;
1597 Xbound(2)=Coord{2}(1)+DXinit*(max_ind2-1);
1598 Xbound(1)=Coord{2}(1)+DXinit*(min_ind2-1);
1599 end
1600 min_ind1=max(min_ind1,1);
1601 min_ind2=max(min_ind2,1);
1602 max_ind1=min(max_ind1,npy);
1603 max_ind2=min(max_ind2,npx);
1604 for ivar=VarIndex
1605 VarName=FieldData.ListVarName{ivar};
1606 if isequal(ObjectData.ProjMode,'interp')||isequal(ObjectData.ProjMode,'filter')
1607 ProjData.ListDimName={'coord_y','coord_x'};
1608 ProjData.DimValue=[length(coord_y_proj) length(coord_x_proj)];
1609 else
1610 icoord=icoord+1;
1611 ProjData.ListDimName=[ProjData.ListDimName {['coord_y_' num2str(icoord)],['coord_x_' num2str(icoord)]}];
1612 ProjData.DimValue=[ProjData.DimValue length(coord_y_proj) length(coord_x_proj)];
1613 end
1614 ProjData.ListVarName=[ProjData.ListVarName VarName];
1615 ProjData.VarDimIndex=[ProjData.VarDimIndex [nb_dim-1 nb_dim]];
1616 if length(FieldData.VarAttribute)>=ivar
1617 ProjData.VarAttribute{length(ProjData.ListVarName)}=FieldData.VarAttribute{ivar};
1618 end
1619 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_2=Xbound;
1620 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_1=Ybound;
1621 eval(['ProjData.' VarName '=FieldData.' VarName '(min_ind1:max_ind1,min_ind2:max_ind2) ;']);
1622 end
1623 else
1624
1625 if isempty(Coord_z)
1626 [X,Y]=meshgrid(coord_x_proj,coord_y_proj);
1627 XIMA=ObjectData.Coord(1,1)+(X)*cos(Phi)-Y*sin(Phi);
1628 YIMA=ObjectData.Coord(1,2)+(X)*sin(Phi)+Y*cos(Phi);
1629 XIMA=(XIMA-minAX)/DXinit+1;
1630 YIMA=(-YIMA+maxAY)/DYinit+1;
1631 XIMA=reshape(round(XIMA),1,npX*npY);
1632 YIMA=reshape(round(YIMA),1,npX*npY);
1633 flagin=XIMA>=1 & XIMA<=npx & YIMA >=1 & YIMA<=npy;
1634 if isequal(ObjectData.ProjMode,'filter')
1635 npx_filter=ceil(abs(DX/DAX));
1636 npy_filter=ceil(abs(DY/DAY));
1637 Mfilter=ones(npy_filter,npx_filter)/(npx_filter*npy_filter);
1638 test_filter=1;
1639 else
1640 test_filter=0;
1641 end
1642 for ivar=VarIndex
1643 VarName=FieldData.ListVarName{ivar} ;
1644 if test_interp(1) | test_interp(2)
1645 eval(['FieldData.' VarName '=interp2(Coord{2},Coord{1},FieldData.' VarName ',Coord_x,Coord_y'');'])
1646 end
1647
1648 if test_filter
1649 Aclass=class(FieldData.A);
1650 eval(['FieldData.' VarName '=filter2(Mfilter,FieldData.' VarName ',''valid'');'])
1651 if ~isequal(Aclass,'double')
1652 eval(['FieldData.' VarName '=' Aclass '(FieldData.' VarName ');'])
1653 end
1654 end
1655 eval(['vec_A=reshape(FieldData.' VarName ',npx*npy,nbcolor);'])
1656 ind_in=find(flagin);
1657 ind_out=find(~flagin);
1658 ICOMB=(XIMA-1)*npy+YIMA;
1659 ICOMB=ICOMB(flagin);
1660 vec_B(ind_in,[1:nbcolor])=vec_A(ICOMB,:);
1661 for icolor=1:nbcolor
1662 vec_B(ind_out,icolor)=zeros(size(ind_out));
1663 end
1664 if isequal(ObjectData.ProjMode,'interp') || isequal(ObjectData.ProjMode,'filter')
1665 ProjData.ListDimName={'coord_y','coord_x'};
1666 ProjData.DimValue=[length(coord_y_proj) length(coord_x_proj)];
1667 else
1668 icoord=icoord+1;
1669 ProjData.ListDimName=[ProjData.ListDimName {['coord_y_' num2str(icoord)],['coord_x_' num2str(icoord)]}];
1670 ProjData.DimValue=[ProjData.DimValue length(coord_y_proj) length(coord_x_proj)];
1671 end
1672 ProjData.ListVarName=[ProjData.ListVarName VarName];
1673 ProjData.VarDimIndex=[ProjData.VarDimIndex [nb_dim-1 nb_dim]];
1674 if length(FieldData.VarAttribute)>=ivar
1675 ProjData.VarAttribute{length(ProjData.ListVarName)}=FieldData.VarAttribute{ivar};
1676 end
1677 if test_direct(2)==1
1678 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_2=[XMin XMax];
1679 else
1680 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_2=[XMax XMin];
1681 end
1682 if test_direct(1)==1
1683 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_1=[YMin YMax];
1684 else
1685 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_1=[YMax YMin];
1686 end
1687 eval(['ProjData.' VarName '=reshape(vec_B,npY,npX,nbcolor);']);
1688 end
1689 ProjData.FF=reshape(~flagin,npY,npX);
1690 ProjData.ListVarName=[ProjData.ListVarName 'FF'];
1691 ProjData.VarDimIndex=[ProjData.VarDimIndex [nb_dim-1 nb_dim]];
1692 ProjData.VarAttribute{length(ProjData.ListVarName)}.Role='errorflag';
1693 else
1694 if isequal(Theta,0) & isequal(Phi,0)
1695 test_sup=(Coord{1}>=ObjectData.Coord(1,3));
1696 iz_sup=find(test_sup);
1697 iz=iz_sup(1);
1698 if iz>=1 & iz<=npz
1699 ProjData.ListDimName=[ProjData.ListDimName ListDimName(2:end)];
1700 ProjData.DimValue=[ProjData.DimValue npY npX];
1701 for ivar=VarIndex
1702 VarName=FieldData.ListVarName{ivar};
1703 ProjData.ListVarName=[ProjData.ListVarName VarName];
1704 ProjData.VarDimIndex=[ProjData.VarDimIndex [nb_dim-2 nb_dim-1]];
1705 ProjData.VarAttribute{length(ProjData.ListVarName)}=FieldData.VarAttribute{ivar};
1706 if test_direct_x==1
1707 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_2=[XMin XMax];
1708 else
1709 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_2=[XMax XMin];
1710 end
1711 if test_direct_y==1
1712 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_1=[YMin YMax];
1713 else
1714 ProjData.VarAttribute{length(ProjData.ListVarName)}.Coord_1=[YMax YMin];
1715 end
1716 eval(['ProjData.' VarName '=squeeze(FieldData.' VarName '(iz,:,:));'])
1717
1718 if test_interp(2) | test_interp(3)
1719 eval(['ProjData.' VarName '=interp2(Coord{3},Coord{2},ProjData.' VarName ',Coord_x,Coord_y'');'])
1720 end
1721 end
1722 end
1723 else
1724 warndlg_uvmat('projection of structured coordinates on oblique plane not yet implemented','ERROR')
1725
1726 return
1727 end
1728 end
1729 end
1730 end
1731
1732 if ~isequal(Phi,0) & length(ivar_U)==1
1733 if isempty(ivar_V)
1734 warndlg_uvmat('v velocity component missing in proj_field.m','ERROR')
1735 return
1736 end
1737 UName=FieldData.ListVarName{ivar_U};
1738 VName=FieldData.ListVarName{ivar_V};
1739 eval(['ProjData.' UName '=cos(Phi)*ProjData.' UName '+ sin(Phi)*ProjData.' VName ';'])
1740 eval(['ProjData.' VName '=cos(Theta)*(-sin(Phi)*ProjData.' UName '+ cos(Phi)*ProjData.' VName ');'])
1741 if ~isempty(ivar_W)
1742 WName=FieldData.ListVarName{ivar_W};
1743 eval(['ProjData.' VName '=ProjData.' VName '+ ProjData.' WName '*sin(Theta);'])
1744 eval(['ProjData.' WName '=NormVec_X*ProjData.' UName '+ NormVec_Y*ProjData.' VName '+ NormVec_Z* ProjData.' WName ';']);
1745 end
1746 if ~isequal(Psi,0)
1747 eval(['ProjData.' UName '=cos(Psi)* ProjData.' UName '- sin(Psi)*ProjData.' VName ';']);
1748 eval(['ProjData.' VName '=sin(Psi)* ProjData.' UName '+ cos(Psi)*ProjData.' VName ';']);
1749 end
1750 end
1751 end
1752
1753
1754
1755 function [ProjData,errormsg]=proj_heading(FieldData,ObjectData)
1756
1757
1758 ProjData=[];
1759 if ~isfield(FieldData,'ListGlobalAttribute')
1760 ProjData.ListGlobalAttribute={};
1761 else
1762 ProjData.ListGlobalAttribute=FieldData.ListGlobalAttribute;
1763 end
1764 if isfield(FieldData,'Txt')
1765 errormsg=FieldData.Txt;
1766 return;
1767 end
1768 for iattr=1:length(ProjData.ListGlobalAttribute)
1769 AttrName=ProjData.ListGlobalAttribute{iattr};
1770 if isfield(FieldData,AttrName)
1771 eval(['ProjData.' AttrName '=FieldData.' AttrName ';']);
1772 end
1773 end
1774 if isfield(FieldData,'CoordType')
1775 if isfield(ObjectData,'CoordType')&~isequal(FieldData.CoordType,ObjectData.CoordType)
1776 errormsg=[ObjectData.Style ' in ' ObjectData.CoordType ' coordinates, while field in ' FieldData.CoordType ' coordinates'];
1777 return
1778 else
1779 ProjData.CoordType=FieldData.CoordType;
1780 end
1781 end
1782
1783 ListObject={'Style','ProjMode','RangeX','RangeY','RangeZ','Phi','Theta','Psi','Coord'};
1784 for ilist=1:length(ListObject)
1785 if isfield(ObjectData,ListObject{ilist})
1786 eval(['val=ObjectData.' ListObject{ilist} ';'])
1787 if ~isempty(val)
1788 eval(['ProjData.Object' ListObject{ilist} '=val;']);
1789 ProjData.ListGlobalAttribute=[ProjData.ListGlobalAttribute {['Object' ListObject{ilist}]}];
1790 end
1791 end
1792 end