diff private/EDB1diffNISES.m @ 0:90220f7249fc

Initial commit
author Timos Papadopoulos <tp@isvr.soton.ac.uk>
date Sat, 16 Nov 2013 18:25:24 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/private/EDB1diffNISES.m	Sat Nov 16 18:25:24 2013 +0000
@@ -0,0 +1,747 @@
+function [edgedifflist,startandendpoints,prespeclist,postspeclist,validIScoords,validIRcoords,listguide,...
+    listoforders] = EDB1diffNISES(eddatafile,S,R,...
+    ivNdiffmatrix,lengthNdiffmatrix,Ndifforder,specorder,visplanesfromR,vispartedgesfromS,...
+    vispartedgesfromR,nedgesubs,ndecimaldivider,edgedifflistin,postspeclistin,bigedgeweightlistin,validEDIRcoords)
+% EDB1diffNISES - Gives a list of paths that includes an N-order diffraction path.
+% Gives the list of visible N-diffraction paths, possibly with specular reflections before and after.
+%
+% Input parameters:
+%    eddatafile,S,R,ivsinglediff,...
+%    singlediffcol,startindicessinglediff,endindicessinglediff,specorder,visplanesfromR,...
+%    vispartedgesfromS,vispartedgesfromR,nedgesubs,ndecimaldivider,PointertoIRcombs,IRoriginsfrom;
+%
+% GLOBAL parameters:
+%   SHOWTEXT JJ JJnumbofchars   See EDB1mainISES
+%   POTENTIALISES,ISCOORDS,ORIGINSFROM,ISESVISIBILITY,REFLORDER   See EDB1findISEStree
+%
+% Output parameters:
+%   edgedifflist        List [ncombs,N] of the edge numbers involved in each
+%                       spec-diff-...-diff-spec combination.
+%   startandendpoints   Matrix [ncombs,4] of the relative start and end
+%                       points of each edge. The values, [0,1], indicate
+%                       which part of the two edges that are visible.
+%   prespeclist         Matrix [ncombs,specorder-N] of the specular
+%                       reflections that precede every diffraction.
+%   postspeclist        Matrix [ncombs,specorder-N] of the specular
+%                       reflections that follow every diffraction.
+%   validIScoords       Matrix [ncombs,3] of the image source for each
+%                       multiple-spec that precedes the diffraction. If
+%                       there is no spec refl before the diffraction, the
+%                       value [0 0 0] is given.
+%   validIRcoords       Matrix [ncombs,3] of the image receiver for each
+%                       multiple-spec that follows the diffraction. If
+%                       there is no spec refl after the diffraction, the
+%                       value [0 0 0] is given.
+%   listguide           Matrix [nuniquecombs,3] which for each row gives
+%                       1. The number of examples in edgefdifflist etc that
+%                          are the same type of spec-diff-...-diff-spec comb.
+%                       2. The first row number and 3. The last row number.
+%   listoforders        Matrix [nuniquecombs,2] which for each row gives
+%                       1. The reflection order for the spec-diff-spec comb
+%                          in the same row in listguide.
+%                       2. The order of the diffraction in the
+%                          spec-diff-...-diff-spec comb.
+%
+% Uses functions  EDB1findis EDB1getedgepoints EDB1chkISvisible EDB1checkobstrpaths
+%
+% ----------------------------------------------------------------------------------------------
+%   This file is part of the Edge Diffraction Toolbox by Peter Svensson.                       
+%                                                                                              
+%   The Edge Diffraction Toolbox is free software: you can redistribute it and/or modify       
+%   it under the terms of the GNU General Public License as published by the Free Software     
+%   Foundation, either version 3 of the License, or (at your option) any later version.        
+%                                                                                              
+%   The Edge Diffraction Toolbox is distributed in the hope that it will be useful,       
+%   but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  
+%   FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.             
+%                                                                                              
+%   You should have received a copy of the GNU General Public License along with the           
+%   Edge Diffraction Toolbox. If not, see <http://www.gnu.org/licenses/>.                 
+% ----------------------------------------------------------------------------------------------
+% Peter Svensson (svensson@iet.ntnu.no) 20031018
+%
+% [edgedifflist,startandendpoints,prespeclist,postspeclist,validIScoords,validIRcoords,...
+%   listguide] = EDB1diff3ISES(eddatafile,S,R,...
+%   ivNdiffmatrix,lengthNdiffmatrix,Ndifforder,specorder,visplanesfromR,vispartedgesfromS,...
+%   vispartedgesfromR,nedgesubs,ndecimaldivider,edgedifflistin,postspeclistin,bigedgeweightlist,validEDIRcoords);
+
+global SHOWTEXT JJ JJnumbofchars
+global POTENTIALISES ISCOORDS ORIGINSFROM ISESVISIBILITY REFLORDER
+
+eval(['load ',eddatafile])
+
+[nedges,slask] = size(planesatedge);
+[nplanes,slask] = size(planecorners);
+multfac = 10^(ceil(log10(max([nedges nplanes]))));
+
+edgedifflist = [];
+prespeclist = [];
+postspeclist = [];
+startandendpoints = [];
+bigedgeweightlist = [];
+validIScoords = [];
+validIRcoords = [];
+
+[n1,n2] = size(POTENTIALISES);
+if n2 < specorder
+    specorder = n2;    
+end
+
+maxvisibilityvalue = 2^nedgesubs-1;
+zerosvec1 = zeros(1,specorder-Ndifforder);
+zerosvec2 = zeros(1,3);
+listguide = zeros(specorder*2-1,3);
+
+obstructtestneeded = (sum(canplaneobstruct)~=0);
+onesvec = ones(1,nedgesubs);
+onesvec3 = ones(1,3);
+
+npostspecs = sum(double(postspeclistin.'>0)).';
+
+%   ###########################################
+%   #                                         #
+%   #   S - edge - edge - edge -R cases       #
+%   #                                         #
+%   ###########################################
+%
+% Possible edges for S-E-E-E-R are seen (at least partly) by the source and by the receiver.
+%
+% The visibility by the source is taken care of by the findISEStree
+% so we must check which ones are visible by the receiver.
+% Also, the active edge segment(s) must be selected but this is done
+% further down together with the S-spec-spec-edge-R cases
+
+ivNdiff = ivNdiffmatrix(1:lengthNdiffmatrix(Ndifforder),Ndifforder);
+ivsinglediff = ivNdiffmatrix(1:lengthNdiffmatrix(1),1);
+
+ivSEEER = ivNdiff(find(REFLORDER(ivNdiff)==Ndifforder));
+
+possibleedgecombs = double(POTENTIALISES(ivSEEER,1:Ndifforder))-nplanes;
+ivnotvisiblefromr = find(vispartedgesfromR(possibleedgecombs(:,Ndifforder))==0);
+if ~isempty(ivnotvisiblefromr)
+    possibleedgecombs(ivnotvisiblefromr,:) = [];
+end
+
+edgedifflist      = [edgedifflist;possibleedgecombs];
+bigedgeweightlist = [bigedgeweightlist;[vispartedgesfromS(edgedifflist(:,1)) vispartedgesfromR(edgedifflist(:,Ndifforder))]];
+
+[nedgesadded,slask] = size(edgedifflist);
+zerosvec3 = zeros(nedgesadded,1);
+ndiffonly = nedgesadded;
+
+prespeclist =  [prespeclist;zerosvec3(:,ones(1,max(specorder-Ndifforder,1)))];
+postspeclist = [postspeclist;zerosvec3(:,ones(1,max(specorder-Ndifforder,1)))];
+validIScoords = [validIScoords;S(ones(nedgesadded,1),:)];
+validIRcoords = [validIRcoords;R(ones(nedgesadded,1),:)];
+
+if SHOWTEXT >= 3
+	disp(['         ',int2str(nedgesadded),' Nth diff valid'])
+end
+
+%   ###########################################
+%   ###########################################
+%   ###########################################
+%   ###########################################
+%   #                                         #
+%   #         Prespec cases                   #
+%   #                                         #
+%   ###########################################
+%
+% Possible edges for S-spec-spec-E-R are seen (at least partly) by the receiver.
+%
+% The visibility doesn't need to be checked since the source-to-edge paths
+% were checked in the ISEStree, and the visibility from the receiver also
+% has been checked.
+
+% The vector ivmultidiff will always refer to the original data vector
+% i.e. POTENTIALISES, ORIGINSFROM, REFLORDER etc
+%
+% We should remove the combinations which involve an edge that the
+% receiver can not see, but since the edge number is in different columns
+% we do that in the for loop.
+
+% The ii-loop will go through: spec-diff, spec-spec-diff
+% spec-spec-spec-diff etc
+
+for ii = 1:specorder-Ndifforder
+    
+    if SHOWTEXT >= 3
+        disp(['      Checking for ',JJ(ii,1:JJnumbofchars(ii)),' spec refl before the  Nth edge diff'])    
+    end
+
+    % Select the combinations where the reflection order == ii+Ndifforder
+    % (which means ii specular reflections in addition to the diffraction)
+    % and where the last Ndifforder columns contain edges.
+    
+    iv = find((REFLORDER(ivNdiff)==ii+Ndifforder) & prod(   double( POTENTIALISES(ivNdiff,ii+1:ii+Ndifforder)>nplanes).'  ).'   );
+    masterivlist = ivNdiff(iv);
+    possibleedgecombs = double(POTENTIALISES(masterivlist,ii+1:ii+Ndifforder)) - nplanes;
+    
+    % Keep only combinations for which the receiver can see the edge
+    
+    ivnotvisiblefromr = find(vispartedgesfromR(possibleedgecombs(:,Ndifforder))==0);
+    if ~isempty(ivnotvisiblefromr)
+        masterivlist(ivnotvisiblefromr) = [];
+        possibleedgecombs = double(POTENTIALISES(masterivlist,ii+1:ii+Ndifforder)) - nplanes;
+    end        
+
+    possibleprespecs = POTENTIALISES(masterivlist,1:ii);
+    
+    reftoIScoords = ORIGINSFROM(masterivlist);
+    edgeweightlist = [ISESVISIBILITY(masterivlist) vispartedgesfromR(possibleedgecombs(:,Ndifforder))];
+        
+    nposs = length(masterivlist);
+
+    if SHOWTEXT >= 3
+ 		disp(['         ',int2str(nposs),' IS+edge multiples valid'])
+    end
+
+    edgedifflist = [edgedifflist;possibleedgecombs];
+    prespeclist = [prespeclist;[possibleprespecs zeros(nposs,specorder-Ndifforder-ii)]];        
+    postspeclist = [postspeclist;zeros(nposs,specorder-Ndifforder)];
+    bigedgeweightlist = [bigedgeweightlist;edgeweightlist];    
+    % The ref. to ISCOORDS must be nested the correct number of time to
+    % come back to the image source coords of the last spec. refl.
+    ivref = ORIGINSFROM(ORIGINSFROM(ORIGINSFROM(masterivlist)));
+    for jj = 4:Ndifforder
+        ivref = ORIGINSFROM(ivref);    
+    end
+    validIScoords = [validIScoords;ISCOORDS(ivref,:)];
+    validIRcoords = [validIRcoords;R(ones(nposs,1),:)];
+    
+end
+
+%   #######################################################################
+%   #######################################################################
+%   #######################################################################
+%   #######################################################################
+%   #######################################################################
+
+%   #############################################
+%   #                                           #
+%   #         S - edge - edge -spec - R cases   #
+%   #                                           #
+%   #         Postspec cases                    #
+%   #                                           #
+%   #############################################
+%
+% Possible edges for S-E-E-spec-spec-R are seen (at least partly) by the receiver.
+%
+% For some of the combos, we have the IR coords and the edge visibility
+% from the single-diffraction run. For potential combos that were not
+% included there, they are either invisible/obstructed or were not tested.
+% We can figure out which ones were tested because they can be found in the
+% POTENTIALISES under edge-spec-spec but not in the final valid list.
+
+% The vector masterivlist will always refer to the original data vector
+% i.e. PotentialIR, ORIGINSFROMIR, reflorderIR etc
+%
+% First we pick out those indices where there was a single diffraction, but
+% skip those with only diffraction (because we dealt with them already).
+% Also, select only those where the diffraction is the first in the sequence
+% of reflections.
+
+for ii = 1:specorder-Ndifforder
+
+    if SHOWTEXT >= 3
+        disp(['      Checking for ',JJ(ii,1:JJnumbofchars(ii)),' spec refl after the multiple edge diff'])    
+    end
+
+    % Select the combinations where the reflection order == ii+Ndifforder
+    % (which means ii specular reflections in addition to the diffraction)
+    % and where the first Ndifforder columns contain edges.
+   
+    iv = find((REFLORDER(ivNdiff)==ii+Ndifforder) & prod(   double( POTENTIALISES(ivNdiff,1:Ndifforder)>nplanes).'  ).'   );
+    masterivlist = ivNdiff(iv);
+    possibleedgecombs = double(POTENTIALISES(masterivlist,1:Ndifforder)) - nplanes;
+    possiblepostspecs = POTENTIALISES(masterivlist,Ndifforder+1:specorder);
+    possibleweights = ISESVISIBILITY(masterivlist);
+    
+    % Compare with those that have already been found OK
+    ivOK = find(npostspecs==ii);
+    if ~isempty(ivOK)
+        patternOK = [edgedifflistin(ivOK) postspeclistin(ivOK,1:ii)];
+    else
+        patternOK = [];    
+    end
+    % Find out which ones have been checked and found invisible/obstructed
+    ivallcombs = ivsinglediff(find( POTENTIALISES(ivsinglediff,1)>nplanes & REFLORDER(ivsinglediff) == ii+1));
+    patternALL = [double(POTENTIALISES(ivallcombs,1))-nplanes double(POTENTIALISES(ivallcombs,2:1+ii))];
+    if ~isempty(patternOK)
+        patternNOTOK = setdiff(patternALL,patternOK,'rows');
+    else
+        patternNOTOK = patternALL; 
+    end
+    patterntocompare = [possibleedgecombs(:,Ndifforder) possiblepostspecs(:,1:ii)];
+    
+    ivtocancel = find(ismember(patterntocompare,patternNOTOK,'rows'));
+    masterivlist(ivtocancel) = [];
+    possibleedgecombs(ivtocancel,:) = [];
+    possiblepostspecs(ivtocancel,:) = [];
+    possibleweights(ivtocancel,:) = [];
+    patterntocompare(ivtocancel,:) = [];
+
+    [ivcompletelyOK,ivreftoindata] = ismember(patterntocompare,patternOK,'rows');
+    ivmustbechecked = find(ivcompletelyOK==0);
+    ivcompletelyOK = find(ivcompletelyOK);
+    if ~isempty(ivmustbechecked)
+        masterlisttocheckmore = masterivlist(ivmustbechecked);
+        ntocheckmore = length(masterlisttocheckmore);
+        
+        %----------------------------------------------
+        % Must carry out a visibility and obstruction check for the special
+        % combinations here.
+        % These combinations have a postspec-combination that hasn't been
+        % encountered in the single diffraction cases, so no visibility
+        % test has been made for these.
+        
+        lastedgenumbers = double(POTENTIALISES(masterlisttocheckmore,Ndifforder))-nplanes;
+        newIRcoords = R;
+        reflplanesexpand = zeros(ntocheckmore*nedgesubs,ii);
+        for jj = 1:ii
+            reflplanes = POTENTIALISES(masterlisttocheckmore,Ndifforder+1+ii-jj);
+            reflplanesexpand(:,jj) = reshape(reflplanes(:,onesvec).',ntocheckmore*nedgesubs,1);
+            newIRcoords = EDB1findis(newIRcoords,reflplanes,planeeqs,size(newIRcoords,1),onesvec3);
+            newIRcoordsexpand = reshape(repmat(newIRcoords.',nedgesubs,1),3,ntocheckmore*nedgesubs).';
+            eval(['newIRcoords',JJ(jj,1:JJnumbofchars(jj)),' = newIRcoordsexpand;'])                    
+        end
+        [toedgecoords,edgeweightlist,edgenumberlist] = EDB1getedgepoints(edgestartcoords(lastedgenumbers,:),edgeendcoords(lastedgenumbers,:),edgelengthvec(lastedgenumbers,:),nedgesubs);
+        tocoords = toedgecoords;
+        lastedgenumbers = lastedgenumbers(:,onesvec);
+        lastedgenumbers = reshape(lastedgenumbers.',ntocheckmore*nedgesubs,1);
+        masterlisttocheckmore = masterlisttocheckmore(:,onesvec);
+        masterlisttocheckmore = reshape(masterlisttocheckmore.',ntocheckmore*nedgesubs,1);
+        
+        ntocheckmore = length(masterlisttocheckmore);
+        if SHOWTEXT >= 3
+            disp(['         ',int2str(ntocheckmore),' special N-edge - IR combinations to check'])    
+        end
+        
+        for jj = ii:-1:1
+            if length(masterlisttocheckmore) > 0
+                eval(['fromcoords = newIRcoords',JJ(jj,1:JJnumbofchars(jj)),';']);
+                if jj < ii
+                    eval(['tocoords = reflpoints',JJ(jj+1,1:JJnumbofchars(jj+1)),';'])    
+                end
+                
+                [hitplanes,reflpoints,edgehits,edgehitpoints,cornerhits,cornerhitpoints] = EDB1chkISvisible(fromcoords,tocoords,planeeqs(reflplanesexpand(:,jj),4),planenvecs(reflplanesexpand(:,jj),:),minvals(reflplanesexpand(:,jj),:),...
+				    maxvals(reflplanesexpand(:,jj),:),planecorners(reflplanesexpand(:,jj),:),corners,ncornersperplanevec(reflplanesexpand(:,jj)));
+                if ~isempty(edgehits) | ~isempty(cornerhits)
+                    disp('WARNING! An edgehit or cornerhit occurred during the visibility test but this is not')
+                    disp('         implemented.')
+                end
+                eval(['reflpoints',JJ(jj,1:JJnumbofchars(jj)),' = reflpoints;'])
+
+                masterlisttocheckmore = masterlisttocheckmore(hitplanes);
+                edgeweightlist = edgeweightlist(hitplanes);
+                lastedgenumbers = lastedgenumbers(hitplanes);
+                reflplanesexpand = reflplanesexpand(hitplanes,:);
+                toedgecoords = toedgecoords(hitplanes,:);
+
+                for kk = 1:ii
+                    eval(['newIRcoords',JJ(kk,1:JJnumbofchars(kk)),' = newIRcoords',JJ(kk,1:JJnumbofchars(kk)),'(hitplanes,:);']);
+                    if kk > jj
+                        eval(['reflpoints',JJ(kk,1:JJnumbofchars(kk)),' = reflpoints',JJ(kk,1:JJnumbofchars(kk)),'(hitplanes,:);']);
+                    end
+                end
+                ntocheckmore = length(masterlisttocheckmore);
+            
+            end
+            
+            if SHOWTEXT >= 3
+                disp(['         ',int2str(ntocheckmore),' of the special N-edge - IR combinations survived the visibility test in refl plane ',int2str(jj)])
+            end
+        end
+
+        if obstructtestneeded & ntocheckmore > 0
+
+            for jj = 1:ii+1
+                if ntocheckmore > 0
+                    if jj == 1
+                        fromcoords = R;
+                        startplanes = [];
+                    else
+                        eval(['fromcoords = reflpoints',JJ(jj-1,1:JJnumbofchars(jj-1)),';']) 
+                        startplanes = reflplanesexpand(:,jj-1);
+                    end
+                    if jj == ii+1,                    
+                        tocoords = toedgecoords;
+                        endplanes = [planesatedge(lastedgenumbers,1) planesatedge(lastedgenumbers,2)];
+                    else
+                        eval(['tocoords = reflpoints',JJ(jj,1:JJnumbofchars(jj)),';'])    
+                        endplanes = reflplanesexpand(:,jj);    
+                    end
+                    
+                    [nonobstructedpaths,nobstructions,edgehits,cornerhits] = EDB1checkobstrpaths(fromcoords,tocoords,startplanes,endplanes,canplaneobstruct,planeseesplane,...
+                        planeeqs,planenvecs,minvals,maxvals,planecorners,corners,ncornersperplanevec,rearsideplane);
+                    if ~isempty(edgehits) | ~isempty(cornerhits)
+                        disp('WARNING! An edgehit or cornerhit occurred during the obstruction test but this is not')
+                        disp('         implemented.')
+                    end
+
+                    if nobstructions > 0
+                        masterlisttocheckmore = masterlisttocheckmore(nonobstructedpaths);
+                        edgeweightlist = edgeweightlist(nonobstructedpaths);
+                        lastedgenumbers = lastedgenumbers(nonobstructedpaths);
+                        reflplanesexpand = reflplanesexpand(nonobstructedpaths,:);
+                        toedgecoords = toedgecoords(nonobstructedpaths,:);
+                        for kk = 1:ii
+                            eval(['reflpoints',JJ(kk,1:JJnumbofchars(kk)),' = reflpoints',JJ(kk,1:JJnumbofchars(kk)),'(nonobstructedpaths,:);']);
+                            eval(['newIRcoords',JJ(kk,1:JJnumbofchars(kk)),' = newIRcoords',JJ(kk,1:JJnumbofchars(kk)),'(nonobstructedpaths,:);']);
+                        end
+                        
+                    end
+                    ntocheckmore = length(masterlisttocheckmore);
+                    
+                end
+                
+            end
+            if SHOWTEXT >= 3
+                disp(['         ',int2str(ntocheckmore),' of the special N-edge - IR combinations survived the obstruction test'])
+            end
+            
+        end
+
+        % Add the found special combinations to the outdata list
+    
+        edgedifflist = [edgedifflist;double(POTENTIALISES(masterlisttocheckmore,1:Ndifforder))-nplanes];
+        prespeclist = [prespeclist;zerosvec1(ones(ntocheckmore,1),:)];
+        postspeclist = [postspeclist;[reflplanesexpand zeros(ntocheckmore,specorder-Ndifforder-ii)]];
+        bigedgeweightlist = [bigedgeweightlist;[ ISESVISIBILITY(masterlisttocheckmore) edgeweightlist]];    
+        eval(['validIRcoords = [validIRcoords;newIRcoords',JJ(ii,1:JJnumbofchars(ii)),'];']);
+        validIScoords = [validIScoords;S(ones(ntocheckmore,1),:)];
+        
+    end
+    
+    masterivlist = masterivlist(ivcompletelyOK);    
+    possibleedgecombs = possibleedgecombs(ivcompletelyOK,:);
+    possiblepostspecs = possiblepostspecs(ivcompletelyOK,:);
+    possibleweights = possibleweights(ivcompletelyOK,:);
+        
+    nposs = length(ivcompletelyOK);
+
+    if SHOWTEXT >= 3
+		disp(['         ',int2str(nposs),' Edge,Nth-order + IR segments (non-special) survived the obstruction test'])
+    end
+    
+    % Add the found "standard" combinations to the outdata list
+
+    edgedifflist = [edgedifflist;possibleedgecombs];
+    prespeclist = [prespeclist;zeros(nposs,specorder-Ndifforder)];
+    postspeclist = [postspeclist;possiblepostspecs ];
+    bigedgeweightlist = [bigedgeweightlist;[possibleweights bigedgeweightlistin(ivOK(ivreftoindata(ivcompletelyOK)))]];    
+    validIRcoords = [validIRcoords;validEDIRcoords(ivOK(ivreftoindata(ivcompletelyOK)),:)];
+    validIScoords = [validIScoords;S(ones(nposs,1),:)];
+    
+end
+
+
+%   #######################################################################
+%   #######################################################################
+%   #######################################################################
+%   #######################################################################
+%   #######################################################################
+
+%   #############################################
+%   #                                           #
+%   #         S - spec - edge - spec - R cases  #
+%   #                                           #s
+%   #         Pre and postspec cases            #
+%   #                                           #
+%   #############################################
+
+% The ii- and jj-loops will go through all combinations of spec before and after
+% the Ndifforder diffractions.
+%
+% Unlike before, we will look in the list of already found combinations
+% (edgedifflist etc)
+
+
+for ii = 1:specorder-Ndifforder-1
+
+    for jj = 1:specorder-ii-Ndifforder
+    
+        if SHOWTEXT >= 3
+            disp(['      Checking for ',JJ(ii,1:JJnumbofchars(ii)),' spec refl before and ',JJ(jj,1:JJnumbofchars(jj)),' spec refl after the N-order edge diff'])    
+        end
+	
+        % Select the combinations where the reflection order ==
+        % ii+jj+Ndifforder
+        % (which means ii+jj specular reflections in addition to the
+        % diffraction), and where columns ii+1:ii+Ndifforder of POTENTIALISES
+        % contain edges.
+	
+        iv = find((REFLORDER(ivNdiff) == ii+jj+Ndifforder) & prod(   double( POTENTIALISES(ivNdiff,ii+1:ii+Ndifforder)>nplanes).'  ).'      );
+        masterivlist = ivNdiff(iv);
+        possibleedgecombs = double(POTENTIALISES(masterivlist,ii+1:ii+Ndifforder)) - nplanes;
+        possibleprespecs  = POTENTIALISES(masterivlist,1:ii);
+        possiblepostspecs = POTENTIALISES(masterivlist,ii+Ndifforder+1:ii+Ndifforder+jj);
+        possibleweights   = ISESVISIBILITY(masterivlist);
+
+        % Compare with those that have already been found OK
+        ivOK = find(npostspecs==jj);
+        if ~isempty(ivOK)
+            patternOK = [edgedifflistin(ivOK) postspeclistin(ivOK,1:jj)];
+        else
+            patternOK = [];
+        end
+        
+        % Find out which ones have been checked and found invisible/obstructed
+        ivallcombs = ivsinglediff(find( POTENTIALISES(ivsinglediff,1)>nplanes & REFLORDER(ivsinglediff) == jj+1));
+        patternALL = [double(POTENTIALISES(ivallcombs,1))-nplanes double(POTENTIALISES(ivallcombs,2:1+jj))];
+        if (   (~isempty(patternOK)) &  (~isempty(patternALL)) )
+            patternNOTOK = setdiff(patternALL,patternOK,'rows');
+        else
+            if (   (~isempty(patternOK)) )
+                patternNOTOK = patternOK;
+            else
+                patternNOTOK = patternALL;
+            end
+        end
+        patterntocompare = [possibleedgecombs(:,Ndifforder) possiblepostspecs(:,1:jj)];
+
+        ivtocancel = find(ismember(patterntocompare,patternNOTOK,'rows'));
+        masterivlist(ivtocancel) = [];
+        possibleedgecombs(ivtocancel,:) = [];
+        possibleprespecs(ivtocancel,:) = [];
+        possiblepostspecs(ivtocancel,:) = [];
+        possibleweights(ivtocancel,:) = [];
+        patterntocompare(ivtocancel,:) = [];
+	
+        [ivcompletelyOK,ivreftoindata] = ismember(patterntocompare,patternOK,'rows');
+        ivmustbechecked = find(ivcompletelyOK==0);
+        ivcompletelyOK = find(ivcompletelyOK);
+        if ~isempty(ivmustbechecked)
+            masterlisttocheckmore = masterivlist(ivmustbechecked);
+            ntocheckmore = length(masterlisttocheckmore);
+        
+            %----------------------------------------------
+            % Must carry out a visibility and obstruction check for the special
+            % combinations here.
+
+            lastedgenumbers = double(POTENTIALISES(masterlisttocheckmore,ii+Ndifforder))-nplanes;
+            newIRcoords = R;
+            reflplanesexpand = zeros(ntocheckmore*nedgesubs,ii);
+            for kk = 1:jj
+                reflplanes = POTENTIALISES(masterlisttocheckmore,Ndifforder+1+ii+jj-kk);
+                reflplanesexpand(:,kk) = reshape(reflplanes(:,onesvec).',ntocheckmore*nedgesubs,1);
+                newIRcoords = EDB1findis(newIRcoords,reflplanes,planeeqs,size(newIRcoords,1),onesvec3);
+                newIRcoordsexpand = reshape(repmat(newIRcoords.',nedgesubs,1),3,ntocheckmore*nedgesubs).';
+                eval(['newIRcoords',JJ(kk,1:JJnumbofchars(kk)),' = newIRcoordsexpand;'])                    
+            end
+            [toedgecoords,edgeweightlist,edgenumberlist] = EDB1getedgepoints(edgestartcoords(lastedgenumbers,:),edgeendcoords(lastedgenumbers,:),edgelengthvec(lastedgenumbers,:),nedgesubs);
+            tocoords = toedgecoords;
+            lastedgenumbers = lastedgenumbers(:,onesvec);
+            lastedgenumbers = reshape(lastedgenumbers.',ntocheckmore*nedgesubs,1);
+            masterlisttocheckmore = masterlisttocheckmore(:,onesvec);
+            masterlisttocheckmore = reshape(masterlisttocheckmore.',ntocheckmore*nedgesubs,1);
+            
+            ntocheckmore = length(masterlisttocheckmore);
+            if SHOWTEXT >= 3
+                disp(['         ',int2str(ntocheckmore),' special IS - N-edge - IR combinations to check'])    
+            end
+            
+            for kk = jj:-1:1
+                if length(masterlisttocheckmore) > 0
+                    eval(['fromcoords = newIRcoords',JJ(kk,1:JJnumbofchars(kk)),';']);
+                    if kk < jj
+                        eval(['tocoords = reflpoints',JJ(kk+1,1:JJnumbofchars(kk+1)),';'])    
+                    end
+                    
+                    [hitplanes,reflpoints,edgehits,edgehitpoints,cornerhits,cornerhitpoints] = EDB1chkISvisible(fromcoords,tocoords,planeeqs(reflplanesexpand(:,kk),4),planenvecs(reflplanesexpand(:,kk),:),minvals(reflplanesexpand(:,kk),:),...
+					    maxvals(reflplanesexpand(:,kk),:),planecorners(reflplanesexpand(:,kk),:),corners,ncornersperplanevec(reflplanesexpand(:,kk)));
+                    if ~isempty(edgehits) | ~isempty(cornerhits)
+                        disp('WARNING! An edgehit or cornerhit occurred during the visibility test but this is not')
+                        disp('         implemented.')
+                    end
+                    eval(['reflpoints',JJ(kk,1:JJnumbofchars(kk)),' = reflpoints;'])
+
+                    masterlisttocheckmore = masterlisttocheckmore(hitplanes);
+                    edgeweightlist = edgeweightlist(hitplanes);
+                    lastedgenumbers = lastedgenumbers(hitplanes);
+                    reflplanesexpand = reflplanesexpand(hitplanes,:);
+                    toedgecoords = toedgecoords(hitplanes,:);
+	
+                    for ll = 1:jj
+                        eval(['newIRcoords',JJ(ll,1:JJnumbofchars(ll)),' = newIRcoords',JJ(ll,1:JJnumbofchars(ll)),'(hitplanes,:);']);
+                        if ll > kk
+                            eval(['reflpoints',JJ(ll,1:JJnumbofchars(ll)),' = reflpoints',JJ(ll,1:JJnumbofchars(ll)),'(hitplanes,:);']);
+                        end
+                    end
+                    ntocheckmore = length(masterlisttocheckmore);
+            
+                end
+                
+                if SHOWTEXT >= 3
+                    disp(['         ',int2str(ntocheckmore),' of the special IS - N-edge - IR combinations survived the visibility test in refl plane ',int2str(kk)])
+                end
+                
+            end
+            
+            % Obstruction test of all the involved paths: R ->
+            % reflplane1 -> reflplane2 -> ... -> last edge
+            
+            if obstructtestneeded & ntocheckmore > 0
+	
+                for kk = 1:jj+1
+                    if ntocheckmore > 0
+                        if kk == 1
+                            fromcoords = R;
+                            startplanes = [];
+                        else
+                            eval(['fromcoords = reflpoints',JJ(kk-1,1:JJnumbofchars(kk-1)),';']) 
+                            startplanes = reflplanesexpand(:,kk-1);
+                        end
+                        if kk == jj+1,                    
+                            tocoords = toedgecoords;
+                            endplanes = [planesatedge(lastedgenumbers,1) planesatedge(lastedgenumbers,2)];
+                        else
+                            eval(['tocoords = reflpoints',JJ(kk,1:JJnumbofchars(kk)),';'])    
+                            endplanes = reflplanesexpand(:,kk);    
+                        end
+                        
+                        [nonobstructedpaths,nobstructions] = EDB1checkobstrpaths(fromcoords,tocoords,startplanes,endplanes,canplaneobstruct,planeseesplane,...
+                            planeeqs,planenvecs,minvals,maxvals,planecorners,corners,ncornersperplanevec,rearsideplane);
+	
+                        if nobstructions > 0
+                            masterlisttocheckmore = masterlisttocheckmore(nonobstructedpaths);
+                            edgeweightlist = edgeweightlist(nonobstructedpaths);
+                            lastedgenumbers = lastedgenumbers(nonobstructedpaths);
+                            reflplanesexpand = reflplanesexpand(nonobstructedpaths,:);
+                            toedgecoords = toedgecoords(nonobstructedpaths,:);
+                            for ll = 1:jj
+                                eval(['reflpoints',JJ(ll,1:JJnumbofchars(ll)),' = reflpoints',JJ(ll,1:JJnumbofchars(ll)),'(nonobstructedpaths,:);']);
+                                eval(['newIRcoords',JJ(ll,1:JJnumbofchars(ll)),' = newIRcoords',JJ(ll,1:JJnumbofchars(ll)),'(nonobstructedpaths,:);']);
+                            end
+                            
+                        end
+                        ntocheckmore = length(masterlisttocheckmore);
+                        
+                    end
+                    
+                end
+                if SHOWTEXT >= 3
+                    disp(['         ',int2str(ntocheckmore),' of the special IS - N-edge - IR combinations survived the obstruction test'])
+                end
+                
+            end
+            
+            % Add the found special combinations to the outdata list
+        
+            edgedifflist = [edgedifflist;double(POTENTIALISES(masterlisttocheckmore,ii+1:ii+Ndifforder))-nplanes];
+            prespeclist = [prespeclist;[double(POTENTIALISES(masterlisttocheckmore,1:ii)) zeros(ntocheckmore,specorder-Ndifforder-ii)]];
+            postspeclist = [postspeclist;[reflplanesexpand zeros(ntocheckmore,specorder-Ndifforder-ii)]];
+            bigedgeweightlist = [bigedgeweightlist;[ ISESVISIBILITY(masterlisttocheckmore) edgeweightlist]];    
+            eval(['validIRcoords = [validIRcoords;newIRcoords',JJ(jj,1:JJnumbofchars(jj)),'];']);
+            % NB!! In the same way as earlier, we must a recursive reference
+            % method to find the image source of the last specular reflection.
+            ivref = ORIGINSFROM(ORIGINSFROM(ORIGINSFROM(masterlisttocheckmore)));
+            for kk = 2:jj
+                ivref = ORIGINSFROM(ivref);
+            end
+            validIScoords = [validIScoords;ISCOORDS(ivref,:)];
+            
+        end
+        
+        masterivlist = masterivlist(ivcompletelyOK);    
+        possibleedgecombs = possibleedgecombs(ivcompletelyOK,:);
+        possibleprespecs = possibleprespecs(ivcompletelyOK,:);
+        possiblepostspecs = possiblepostspecs(ivcompletelyOK,:);
+        possibleweights = possibleweights(ivcompletelyOK,:);
+            
+        nposs = length(ivcompletelyOK);
+	
+        if SHOWTEXT >= 3
+			disp(['         ',int2str(nposs),' IS + Edge (Nth-order) + IR segments (non-special combinations) survived the obstruction test'])
+        end
+
+        % Add the found "standard" combinations to the outdata list
+    
+        edgedifflist = [edgedifflist;possibleedgecombs];
+        prespeclist = [prespeclist;  [possibleprespecs  zeros(nposs,specorder-Ndifforder-ii)]];
+        postspeclist = [postspeclist;[possiblepostspecs zeros(nposs,specorder-Ndifforder-jj)]];
+        bigedgeweightlist = [bigedgeweightlist;[possibleweights bigedgeweightlistin(ivOK(ivreftoindata(ivcompletelyOK)))]];    
+        validIRcoords = [validIRcoords;validEDIRcoords(ivOK(ivreftoindata(ivcompletelyOK)),:)];
+        % NB!! In the same way as earlier, we must a recursive reference
+        % method to find the image source of the last specular reflection.
+        ivref = ORIGINSFROM(ORIGINSFROM(ORIGINSFROM(ORIGINSFROM(ORIGINSFROM(masterivlist)))));
+        for kk = 6:jj+Ndifforder
+            ivref = ORIGINSFROM(ivref);
+        end
+        validIScoords = [validIScoords;ISCOORDS(ivref,:)];
+        
+    end
+end
+
+
+%   #######################################################################
+%   #
+%   #   The weights of the visible edge segments should be
+%   #   translated into start and end points, together with the visibility
+%   #   weights from the receiver.
+%   #   This can be done for all combinations at once!
+%   #
+%   #######################################################################
+
+% As a start we set the start and end values to 0 and 1, i.e. assuming full
+% visibility.
+
+addvec = [];
+for ii = 1:Ndifforder
+    addvec = [addvec,zeros(length(edgedifflist),1),ones(length(edgedifflist),1)];
+end
+startandendpoints = [startandendpoints addvec];
+
+%   #######################################################################
+%   #
+%   #   Construct a list guide, which will tell which rows have only
+%   #   dd, which rows have sdd etc
+%   #   Syntax:        dd,sdd,ssdd,sssdd,...,dds,ddss,ddsss,...
+%   #       (should also continue with sdds, sddss,...
+%   #   
+%   #######################################################################
+
+[n1,n2] = size(prespeclist);
+if n2 > 1
+    nprespecs  = sum(prespeclist.' > 0).';
+else
+    nprespecs = (prespeclist>0);    
+end
+[n1,n2] = size(postspeclist);
+if n2 > 1
+    npostspecs  = sum(postspeclist.' > 0).';
+else
+    npostspecs = (postspeclist>0);    
+end
+
+listofdiffcol   = 1 + nprespecs;
+listofreflorder = listofdiffcol + npostspecs + Ndifforder - 1;
+
+[B,ivec,jvec] = unique([listofreflorder listofdiffcol],'rows');
+nuniquecombs = length(ivec);
+ntotcombs = length(jvec);
+
+listguide = zeros(nuniquecombs,3);
+listoforders = zeros(nuniquecombs,2);
+sortvec = zeros(ntotcombs,1);
+for ii = 1:length(ivec)
+    ivfindcombs = find(jvec==ii);
+    listguide(ii,1) = length(ivfindcombs);
+    if ii > 1
+        listguide(ii,2) = listguide(ii-1,3)+1;
+    else
+        listguide(ii,2) = 1;    
+    end
+    listguide(ii,3) = listguide(ii,2)+listguide(ii,1)-1;
+    listoforders(ii,:) = [B(ii,1) B(ii,2)]; 
+
+    sortvec(listguide(ii,2):listguide(ii,3)) = ivfindcombs;
+    
+end
+
+prespeclist = prespeclist(sortvec,:);
+postspeclist = postspeclist(sortvec,:);
+validIScoords = validIScoords(sortvec,:);
+validIRcoords = validIRcoords(sortvec,:);
+edgedifflist = edgedifflist(sortvec,:);
+startandendpoints = startandendpoints(sortvec,:);