Ignore:
Timestamp:
May 21, 2018, 7:06:45 PM (6 years ago)
Author:
sommeria
Message:

find field cells improved

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/read_field.m

    r1041 r1045  
    88%        .FieldName; field name
    99%        .VelType
    10 %        .CivStage: stage of civx processing (=0, not Civx, =1 (civ1), =2  (fix1)....     
     10%        .CivStage: stage of civx processing (=0, not Civx, =1 (civ1), =2  (fix1)....
    1111%        .Npx,.Npy: for images, nbre of pixels in x and y
    1212% errormsg: error message, ='' by default
     
    2020%     .ColorVar: variable used for vector color
    2121%     .Npx, .Npy: nbre of pixels along x and y (used for .vol input files)
    22 %     .TimeDimName: name of the dimension considered as 'time', selected index value then set by input 'num'   
     22%     .TimeDimName: name of the dimension considered as 'time', selected index value then set by input 'num'
    2323% num: frame number for movies
    2424%
     
    9494        ParamOut.CivStage=Field.CivStage;
    9595    case 'netcdf'% general netcdf file (not recognized as civ)
    96         ListVar={};
     96        ListVarName={};
    9797        Role={};
    9898        ProjModeRequest={};
    99         ListInputField={};
    100         ListOperator={};
    101         checkU=0;
    102         checkV=0;
     99        %ListInputField={};
     100        %checkU=0;
     101        %checkV=0;
    103102        % scan the list InputField
     103        Operator=cell(1,numel(InputField));
     104        InputVar=cell(1,numel(InputField));
    104105        for ilist=1:numel(InputField)
    105106            % look for input variables to read
    106107            r=regexp(InputField{ilist},'(?<Operator>(^vec|^norm))\((?<UName>.+),(?<VName>.+)\)$','names');
    107108            if isempty(r)%  no operator used
    108                 if isempty(find(strcmp(InputField{ilist},ListVar),1))
    109                     ListVar=[ListVar InputField(ilist)];%append the variable name if not already in the list
    110                     ListInputField=[ListInputField InputField(ilist)];
    111                     ListOperator=[ListOperator {''}];
    112                 end
    113                 if check_colorvar(ilist)
    114                     if isempty(find(strcmp(InputField{ilist},ListVar),1))
    115                     Role{numel(ListVar)}='ancillary';% not projected with interpolation
    116                     ProjModeRequest{numel(ListVar)}='';
     109                ListVarName=[ListVarName InputField(ilist)];%append the variable name
     110                %InputVar{ilist}=InputField(ilist);
     111                %ListInputField=[ListInputField InputField(ilist)];
     112                if check_colorvar(ilist)% case of field used for vector color
     113                    Role{numel(ListVarName)}='ancillary';% not projected with interpolation
     114                    ProjModeRequest{numel(ListVarName)}='';
     115                else
     116                    Role{numel(ListVarName)}='scalar';
     117                    ProjModeRequest{numel(ListVarName)}='interp_lin';%scalar field (requires interpolation for plot)
     118                end
     119                Operator{numel(ListVarName)}='';
     120            else  % an operator 'vec' or 'norm' is used
     121                ListVarName=[ListVarName {r.UName}]; % append the variable in the list if not previously listed
     122                if  strcmp(r.Operator,'norm')
     123                    if check_colorvar(ilist)
     124                    Role=[Role {'ancillary'}];
     125                    else
     126                       Role=[Role {'scalar'}];
    117127                    end
    118128                else
    119                     Role{numel(ListVar)}='scalar';
    120                     ProjModeRequest{numel(ListVar)}='interp_lin';%scalar field (requires interpolation for plot)
    121                 end
    122                 if isfield(ParamIn,'Coord_y')
    123                     if ~isempty(strcmp(InputField{ilist},ParamIn.Coord_y))
    124                         Role{numel(ListVar)}='coord_y';
    125                     end
    126                 end
    127             else  % an operator 'vec' or 'norm' is used
     129                     Role=[Role {'vector_x'}];
     130                end
     131                %ListInputField=[ListInputField InputField(ilist)];
     132                ListVarName=[ListVarName {r.VName}];% append the variable in the list if not previously listed
     133                Role=[Role {'vector_y'}];
     134                %ListInputField=[ListInputField InputField(ilist)];
     135                Operator{numel(ListVarName)-1}=r.Operator;
     136                Operator{numel(ListVarName)}='';           
    128137                if ~check_colorvar(ilist) && strcmp(r.Operator,'norm')
    129                     ProjModeRequestVar='interp_lin';%scalar field (requires interpolation for plot)
     138                    ProjModeRequest{numel(ListVarName)}='interp_lin';%scalar field (requires interpolation for plot)
     139                    ProjModeRequest{numel(ListVarName)-1}='interp_lin';%scalar field (requires interpolation for plot)
    130140                else
    131                     ProjModeRequestVar='';
    132                 end
    133                 ind_var_U=find(strcmp(r.UName,ListVar));%check previous listing of variable r.UName
    134                 ind_var_V=find(strcmp(r.VName,ListVar));%check previous listing of variable r.VName
    135                 if isempty(ind_var_U)
    136                     ListVar=[ListVar {r.UName}]; % append the variable in the list if not previously listed
    137                     Role=[Role {'vector_x'}];
    138                     ProjModeRequest=[ProjModeRequest {ProjModeRequestVar}];
    139                     ListInputField=[ListInputField InputField(ilist)];
    140                 else
    141                     checkU=1;
    142                 end
    143                 if isempty(ind_var_V)
    144                     ListVar=[ListVar {r.VName}];% append the variable in the list if not previously listed
    145                     Role=[Role {'vector_y'}];
    146                     ProjModeRequest=[ProjModeRequest {ProjModeRequestVar}];
    147                     ListInputField=[ListInputField InputField(ilist)];               
    148                 else
    149                     checkV=1;
     141                    ProjModeRequest{numel(ListVarName)}='';
     142                    ProjModeRequest{numel(ListVarName)-1}='';
    150143                end
    151144            end
     
    156149        NbCoord=~isempty(ParamIn.Coord_x)+~isempty(ParamIn.Coord_y)+~isempty(ParamIn.Coord_z);
    157150        if isfield(ParamIn,'TimeDimName')% case of reading of a single time index in a multidimensional array
    158             [Field,var_detect,ichoice,errormsg]=nc2struct(FileName,'TimeDimName',ParamIn.TimeDimName,num,[ParamIn.Coord_x ParamIn.Coord_y ParamIn.Coord_z ListVar]);
     151            [Field,var_detect,ichoice,errormsg]=nc2struct(FileName,'TimeDimName',ParamIn.TimeDimName,num,[ParamIn.Coord_x ParamIn.Coord_y ParamIn.Coord_z ListVarName]);
    159152        elseif isfield(ParamIn,'TimeVarName')% case of reading of a single time  in a multidimensional array
    160             [Field,var_detect,ichoice,errormsg]=nc2struct(FileName,'TimeVarName',ParamIn.TimeVarName,num,[ParamIn.Coord_x ParamIn.Coord_y ParamIn.Coord_z ListVar]);
     153            [Field,var_detect,ichoice,errormsg]=nc2struct(FileName,'TimeVarName',ParamIn.TimeVarName,num,[ParamIn.Coord_x ParamIn.Coord_y ParamIn.Coord_z ListVarName]);
    161154            if numel(num)~=1
    162155                NbCoord=NbCoord+1;% adds time coordinate, except if a single time has been selected
    163156            end
    164157        else
    165             [Field,var_detect,ichoice,errormsg]=nc2struct(FileName,[ParamIn.Coord_x ParamIn.Coord_y ParamIn.Coord_z ListVar]);
     158            [Field,var_detect,ichoice,errormsg]=nc2struct(FileName,[ParamIn.Coord_x ParamIn.Coord_y ParamIn.Coord_z ListVarName]);
    166159        end
    167160        if ~isempty(errormsg)
     
    169162        end
    170163        CheckStructured=1;
    171         %scan all the variables beyond the two first NbCoord ones describing the coordinates.
    172         for ilist=NbCoord+1:numel(Field.VarDimName)
    173             if isequal(Field.VarDimName{1},Field.VarDimName{ilist}) % if a variable has the same dimension as the coordinate, it denotes a field with unstructured coordinates
    174                 Field.VarAttribute{1}.Role='coord_x';%unstructured coordinates
    175                 Field.VarAttribute{2}.Role='coord_y';
    176                 if NbCoord>=3
    177                     Field.VarAttribute{3}.Role='coord_z';
    178                 end
    179                 CheckUnstructured=0;
    180                 break
    181             end
    182         end
    183         if CheckStructured
    184             for ilist=NbCoord+1:numel(Field.VarDimName)
    185                 if numel(Field.VarDimName{ilist})==NbCoord
    186                     rank(1)=find(strcmp(ParamIn.Coord_x,Field.VarDimName{ilist}));
    187                     rank(2)=find(strcmp(ParamIn.Coord_y,Field.VarDimName{ilist}));
    188                     if NbCoord==3
    189                         rank(3)=find(strcmp(ParamIn.Coord_z,Field.VarDimName{ilist}));
    190                     end
    191                     rank=rank(end:-1:1);
    192                     VarName=Field.ListVarName{ilist};
    193                     Field.(VarName)=permute(Field.(VarName),rank);
    194                     Field.VarDimName{ilist}=Field.VarDimName{ilist}(rank);% permute the order of dimensions
    195                 end
    196             end
     164        %scan all the variables
     165        NbCoord=0;
     166        if ~isempty(ParamIn.Coord_x)
     167            index_Coord_x=find(strcmp(ParamIn.Coord_x,Field.ListVarName));
     168            Field.VarAttribute{index_Coord_x}.Role='coord_x';%
     169            NbCoord=NbCoord+1;
     170        end
     171        if ~isempty(ParamIn.Coord_y)
     172            if ischar(ParamIn.Coord_y)
     173                index_Coord_y=find(strcmp(ParamIn.Coord_y,Field.ListVarName));
     174                Field.VarAttribute{index_Coord_y}.Role='coord_y';%
     175                NbCoord=NbCoord+1;
     176            else
     177                for icoord_y=1:numel(ParamIn.Coord_y)
     178                    index_Coord_y=find(strcmp(ParamIn.Coord_y{icoord_y},Field.ListVarName));
     179                    Field.VarAttribute{index_Coord_y}.Role='coord_y';%
     180                    NbCoord=NbCoord+1;
     181                end
     182            end
     183        end
     184        NbDim=1;
     185        if ~isempty(ParamIn.Coord_z)
     186            index_Coord_z=find(strcmp(ParamIn.Coord_z,Field.ListVarName));
     187            Field.VarAttribute{index_Coord_z}.Role='coord_z';%
     188            NbCoord=NbCoord+1;
     189            NbDim=3;
     190        elseif ~isempty(ParamIn.FieldName)
     191            NbDim=2;
    197192        end
    198193        NormName='';
    199194        UName='';
    200195        VName='';
    201         if numel(Field.ListVarName)>NbCoord % if there are variables beyond coord (1 D plots)
    202             for ilist=1:numel(ListVar)
    203                 Field.VarAttribute{ilist+NbCoord}.Role=Role{ilist};
    204                 Field.VarAttribute{ilist+NbCoord}.ProjModeRequest=ProjModeRequest{ilist};
     196        if numel(Field.ListVarName)>NbCoord % if there are variables beyond coord (exclude 1 D plots)
     197            VarAttribute=cell(1,numel(ListVarName));
     198            for ilist=1:numel(ListVarName)
     199                index_var=find(strcmp(ListVarName{ilist},Field.ListVarName),1);
     200                VarDimName{ilist}=Field.VarDimName{index_var};
     201                DimOrder=[];
     202                if NbDim ==2
     203                    DimOrder=[find(strcmp(ParamIn.Coord_y,VarDimName{ilist})) find(strcmp(ParamIn.Coord_x,VarDimName{ilist}))];
     204                elseif NbDim ==3
     205                    DimOrder=[find(strcmp(ParamIn.Coord_z,VarDimName{ilist}))...
     206                        find(strcmp(ParamIn.Coord_y,VarDimName{ilist}))...
     207                        find(strcmp(ParamIn.Coord_x,VarDimName{ilist}))];
     208                end
     209                if ~isempty(DimOrder)
     210                    Field.(ListVarName{ilist})=permute(Field.(ListVarName{ilist}),DimOrder);
     211                    VarDimName{ilist}=VarDimName{ilist}(DimOrder);
     212                end
     213                if numel(Field.VarAttribute)>=index_var
     214                VarAttribute{ilist}=Field.VarAttribute{index_var};% read var attributes from input if exist
     215                end
     216            end
     217            check_remove=false(1,numel(Field.ListVarName));
     218            for ilist=1:numel(ListVarName)
     219                VarAttribute{ilist}.Role=Role{ilist};
     220                VarAttribute{ilist}.ProjModeRequest=ProjModeRequest{ilist};
    205221                if isfield(ParamIn,'FieldName')
    206                     Field.VarAttribute{ilist+NbCoord}.FieldName=ListInputField{ilist};
    207                 end
    208                 r=regexp(ListInputField{ilist},'(?<Operator>(^vec|^norm))\((?<UName>.+),(?<VName>.+)\)$','names');
    209                 if ~isempty(r)&& strcmp(r.Operator,'norm')
    210                     NormName='norm';
    211                     if ~isempty(find(strcmp(ListVar,'norm')))
    212                         NormName='norm_1';
    213                     end
    214                     Field.ListVarName=[Field.ListVarName {NormName}];
    215                     ilistmax=numel(Field.ListVarName);
    216                     Field.VarDimName{ilistmax}=Field.VarDimName{ilist+2};
    217                     Field.VarAttribute{ilistmax}.Role='scalar';
    218                     Field.(NormName)=Field.(r.UName).*Field.(r.UName)+Field.(r.VName).*Field.(r.VName);
    219                     Field.(NormName)=sqrt(Field.(NormName));
    220                     UName=r.UName;
    221                     VName=r.VName;
    222                 end
    223             end
    224            
    225             if ~isempty(NormName)% remove U and V if norm has been calculated and U and V are not needed as variables
    226                 ind_var_U=find(strcmp(UName,ListVar));%check previous listing of variable r.UName
    227                 ind_var_V=find(strcmp(VName,ListVar));%check previous listing of variable r.VName
    228                 if ~checkU && ~checkV
    229                     Field.ListVarName([ind_var_U+2 ind_var_V+2])=[];
    230                     Field.VarDimName([ind_var_U+2 ind_var_V+2])=[];
    231                     Field.VarAttribute([ind_var_U+2 ind_var_V+2])=[];
    232                 elseif ~checkU
    233                     Field.ListVarName(ind_var_U+2)=[];
    234                     Field.VarDimName(ind_var_U+2)=[];
    235                     Field.VarAttribute(ind_var_U+2 )=[];
    236                 elseif ~checkV
    237                     Field.ListVarName(ind_var_V+2)=[];
    238                     Field.VarDimName(ind_var_V+2)=[];
    239                     Field.VarAttribute(ind_var_V+2 )=[];
    240                 end
    241             end
    242             % insert coordinates as indices in case of plots vs matrix index
    243             if isfield(ParamIn,'CheckCoordIndex') && ParamIn.CheckCoordIndex
    244                 Field.ListVarName=[Field.ListDimName Field.ListVarName];
    245                 Field.VarDimName=[Field.ListDimName Field.VarDimName];
    246                 for idim=1:numel(Field.ListDimName)
    247                     CoordName=Field.ListDimName{idim};
    248                     Field.(CoordName)=1:Field.DimValue(idim);
    249                 end
    250                 Field.VarAttribute=[cell(1,numel(Field.ListDimName)) Field.VarAttribute];
    251             end
    252            
    253         end
     222                    VarAttribute{ilist}.Operator=Operator{ilist};
     223                end
     224                if strcmp(Operator{ilist},'norm')
     225                    UName=ListVarName{ilist};
     226                    VName=ListVarName{ilist+1};
     227                    ListVarName{ilist}='norm';
     228                    Field.norm=Field.(UName).*Field.(UName)+Field.(VName).*Field.(VName);
     229                    Field.norm=sqrt(Field.norm);
     230                    check_remove(ilist+1)=true;
     231                    VarAttribute{ilist}.Operator='';
     232                end
     233            end
     234            ListVarName(check_remove)=[];
     235            VarDimName(check_remove)=[];
     236            VarAttribute(check_remove)=[];
     237            Field.ListVarName=[Field.ListVarName(1:NbCoord) ListVarName];% complement the list of vqriables, which may be listed twice
     238            Field.VarDimName=[Field.VarDimName(1:NbCoord) VarDimName];
     239            Field.VarAttribute=[Field.VarAttribute(1:NbCoord) VarAttribute];
     240        end
     241       
    254242    case 'video'
    255243        if strcmp(class(ParamIn),'VideoReader')
     
    286274        for ilist=1:numel(Input.Frames{1}.Attributes)
    287275            if strcmp(Input.Frames{1}.Attributes{ilist}.Name,'AcqTimeSeries')
    288         timestamps=str2num(Input.Frames{1}.Attributes{ilist}.Value(1:end-3))/1000000;
    289         break
     276                timestamps=str2num(Input.Frames{1}.Attributes{ilist}.Value(1:end-3))/1000000;
     277                break
    290278            end
    291279        end
     
    294282    otherwise
    295283        errormsg=[ FileType ': invalid input file type for uvmat'];
     284       
    296285end
    297286
     
    311300    Field.VarAttribute{1}.Unit='pixel';
    312301    Field.VarAttribute{2}.Unit='pixel';
     302    Field.VarAttribute{1}.Role='coord_y';
     303    Field.VarAttribute{2}.Role='coord_x';
    313304    Field.VarAttribute{3}.Role='scalar';
    314305    if ndims(A)==3
Note: See TracChangeset for help on using the changeset viewer.