view private/EDB1diffISESx.m @ 18:2d5f50205527 jabuilder_int tip

Escape the trailing backslash as well
author Chris Cannam
date Tue, 30 Sep 2014 16:23:00 +0100
parents 90220f7249fc
children
line wrap: on
line source
function [edgedifflist,startandendpoints,prespeclist,postspeclist,validIScoords,validIRcoords,listguide,listoforders,...
        bigedgeweightlist] = EDB1diffISESx(eddatafile,S,R,...
        ivsinglediff,singlediffcol,startindicessinglediff,endindicessinglediff,...
        specorder,visplanesfromR,vispartedgesfromS,vispartedgesfromR,nedgesubs,ndecimaldivider,...
        PointertoIRcombs,IRoriginsfrom)
% EDB1diffISESx - Gives list of paths that includes a 1st-order diff. combination.
% Gives the list of possible first-order diffraction paths, possibly with specular
% reflections before and after.
%
% Input parameters:
%   eddatafile      The name of the file that contains all edge related data.
%                   This file will be loaded.
%   S,R,ivsinglediff,...
%    singlediffcol,startindicessinglediff,endindicessinglediff,specorder,visplanesfromR,...
%   vispartedgesfromS,vispartedgesfromR,nedgesubs,ndecimaldivider,PointertoIRcombs,IRoriginsfrom
%                   Data that should have been passed from the srdatafile
%                   (S,R,visplanesfromR,vispartedgesfromS,vispartedgesfromR
%                   )
%                   from the ISEStreefile
%                   (ivsinglediff
%                   singlediffcol,startindicessinglediff,endindicessinglediff
%                   ndecimaldivider,PointertoIRcombs,IRoriginsfrom)
%                   and from the setupfile
%                   (specorder,nedgesubs)
%   POTENTIALISES (global)
%   ISCOORDS (global)
%   ORIGINSFROM (global)
%   ISESVISIBILITY (global)   
%   REFLORDER (global)
%
% Global parameters:
%   SHOWTEXT,JJ,JJnumbofchars     See EDB1mainISES
%   POTENTIALISES,ISCOORDS
%
% Output parameters:
%   edgedifflist        List [ncombs,1] of the edge number involved in each
%                       spec-diff-spec combination.
%   startandendpoints   Matrix [ncombs,2] of the relative start and end
%                       points of each edge. The values, [0,1], indicate
%                       which part of the edge that is visible.
%   prespeclist         Matrix [ncombs,specorder-1] of the specular
%                       reflections that precede every diffraction.
%   postspeclist        Matrix [ncombs,specorder-1] 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-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-spec comb.
%   bigedgeweightlist   List [ncombs,1] of the visibility of each edge
%                       expressed as a number 0 to 2^nedgesubs-1.
%
% 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) 20061118
%
% [edgedifflist,startandendpoints,prespeclist,postspeclist,validIScoords,validIRcoords,listguide,listoforders,...
%   bigedgeweightlist] = EDB1diffISESx(eddatafile,S,R,...
%   ivsinglediff,singlediffcol,startindicessinglediff,endindicessinglediff,...
%   specorder,visplanesfromR,vispartedgesfromS,vispartedgesfromR,nedgesubs,ndecimaldivider,...
%   PointertoIRcombs,IRoriginsfrom)

global SHOWTEXT JJ JJnumbofchars
global POTENTIALISES ISCOORDS ORIGINSFROM REFLORDER ISESVISIBILITY

eval(['load ',eddatafile])
clear edgeseesplane cornerinfrontofplane

[nedges,slask] = size(planesatedge);
[nplanes,slask] = size(planecorners);

edgedifflist = [];
prespeclist = [];
postspeclist = [];
startandendpoints = [];
bigedgeweightlist = [];
validIScoords = [];
validIRcoords = [];

[n1,n2] = size(POTENTIALISES);
if n2 < specorder
    specorder = n2;    
end

maxvisibilityvalue = 2^nedgesubs-1;
zerosvec1 = zeros(1,max([specorder-1 1]));
zerosvec2 = zeros(1,3);
listguide = zeros(specorder*2-1,3);
listoforders = zeros(specorder*2-1,2);

obstructtestneeded = (sum(canplaneobstruct)~=0);
onesvec = ones(1,nedgesubs);
onesvec3 = ones(1,3);

%   ###########################################
%   #                                         #
%   #         S - spec-spec- edge - R cases   #
%   #                                         #
%   #         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 this was done in the
% ISEStree.

% The vector masterivlist will always refer to the original data vector
% i.e. POTENTIALISES, ORIGINSFROM, REFLORDER 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 last in the sequence
% of reflections.

for ii = 1:specorder,       % NB!!! ii = 1 corresponds to zero spec. refl before the diff.
                            %       ii = 2 corresponds to one spec refl.
                            %       before the diff etc

    if SHOWTEXT >= 3
        if ii > 1
            disp(['      Checking for ',JJ(ii-1,1:JJnumbofchars(ii-1)),' spec refl before the edge diff'])    
        else
            disp(['      Checking for 0 spec refl before the edge diff'])    
        end
    end

    iv = uint32(startindicessinglediff(ii):endindicessinglediff(ii));
        
    if ~isempty(iv)
                
        ivkeep = find(singlediffcol(iv)==ii);
        iv = iv(ivkeep);
        masterivlist = ivsinglediff(iv);
        possibleedges = double(POTENTIALISES(masterivlist,ii)) - nplanes;

        % Keep only combinations for which the receiver can see the edge
            
        ivnotvisiblefromr = find(vispartedgesfromR(possibleedges)==0);
        if ~isempty(ivnotvisiblefromr)
            masterivlist(ivnotvisiblefromr) = [];
            possibleedges(ivnotvisiblefromr) = [];
        end        
        % Pick out the pre-specs

        nposs = length(masterivlist);

        if nposs > 0
        
            if ii > 1
                possiblecombs = POTENTIALISES(masterivlist,1:ii-1);
                reftoIScoords = ORIGINSFROM(masterivlist);
                edgeweightlist = bitand((ISESVISIBILITY(masterivlist)),(vispartedgesfromR(possibleedges)));
                prespeclist = [prespeclist;[possiblecombs zeros(nposs,specorder-ii)]];
                % NB! It is correct below that the indices for the IScoords should be
                % ORIGINSFROM(masterivlist), rather than masterivlist.
                % The combinations in POTENTIALISES(masterivlist,:) all have
                % spec-spec-...-diff combinations and then
                % ISCOORDS(masterivlist,:) are zeros since a comb. that
                % ends with a diff has no image source. 
                 validIScoords = [validIScoords;ISCOORDS(ORIGINSFROM(masterivlist),:)];
            else            
                edgeweightlist = bitand((vispartedgesfromS(possibleedges)),(vispartedgesfromR(possibleedges)));
                prespeclist = [prespeclist;[zeros(nposs,max([specorder-1 1]))]];       
                % For the case of no spec refl before the diffraction, we
                % let the IS get the S coordinates.
                validIScoords = [validIScoords;S(ones(nposs,1),:)];
            end
            
            if SHOWTEXT >= 3
         		disp(['         ',int2str(nposs),' IS+edges valid'])
            end
		
            edgedifflist = [edgedifflist;possibleedges];
            postspeclist = [postspeclist;zerosvec1(ones(nposs,1),:)];
            bigedgeweightlist = [bigedgeweightlist;edgeweightlist];   
            validIRcoords = [validIRcoords;R(ones(nposs,1),:)];
        
        end
        
    end
end

iv = uint32(find(bigedgeweightlist==0));
if ~isempty(iv)
    edgedifflist(iv) = [];
    bigedgeweightlist(iv) = [];
    prespeclist(iv,:) = [];
    postspeclist(iv,:) = [];
    validIScoords(iv,:) = [];
    validIRcoords(iv,:) = [];
end

%   #######################################################################
%   #######################################################################
%   #######################################################################
%   #######################################################################
%   #######################################################################

%   #############################################
%   #                                           #
%   #         Build an IR tree                 #
%   #                                           #
%   #############################################
%
% For all cases with a specular reflection after an edge diffraction
% we build an IR tree, analogous to the IS tree

if specorder > 1

    if SHOWTEXT >= 3
            disp(['      For the edge+spec combs, an IR tree is built'])    
	end

    % Select all combinations with a single diffraction, anywhere except in
    % the last column, and store the useful data for these (which column
    % is the diffraction, what reflection order, how many specular
    % reflections?)
   
    ivselect = uint32(find( singlediffcol~=REFLORDER(ivsinglediff) ));
    masterivlistorig = ivsinglediff(ivselect);
    singlediffcol_select = singlediffcol(ivselect);
    reflorder_select = REFLORDER(ivsinglediff(ivselect));
    clear ivsinglediff
    nspecular_select = uint32(double(reflorder_select) - double(singlediffcol_select));
    nspecular_select_not_empty = 1;
    
    % Now we remove all those with a last reflection plane which can not be
    % seen by the receiver
    
    if nplanes + nedges < 65536
        lastreflplane = uint16(zeros(length(ivselect),1));
    else
        lastreflplane = uint32(zeros(length(ivselect),1));        
    end
    clear ivselect
    for ii = 2:specorder
        iv = find(reflorder_select==ii);
        lastreflplane(iv) = POTENTIALISES(masterivlistorig(iv),ii);
    end
    ivremove = uint32(find(visplanesfromR(lastreflplane)~=2 & visplanesfromR(lastreflplane)~=4 & visplanesfromR(lastreflplane)~=5));
    if ~isempty(ivremove)
        masterivlistorig(ivremove) = [];
        singlediffcol_select(ivremove) = [];
        reflorder_select(ivremove) = [];
        nspecular_select(ivremove) = [];
        lastreflplane(ivremove) = [];
        clear ivremove
    end  
    	
    % Start by calculating all the first-order IR coordinates for
    % all the planes that are visible from the receiver
	IRcoordsstart = zeros(nplanes,3);
	iv = uint32(find(visplanesfromR==2 | visplanesfromR==4 | visplanesfromR==5));
	IRcoordsstart(iv,:) = EDB1findis(R,iv,planeeqs,1,onesvec3);
		
	bigIRcoords = (zeros(size(ISCOORDS)));
	IRreflist = zeros(size(iv));
	
	% IMPROVE: Not necessary to calculate the IR coordinates for all
	% combinations since many are the same!

    % Now we make a temporary copy of POTENTIALISES which is displaced to
    % the right since this will make it easier to align the postspec
    % combos.
    
    PotentialISESshift = POTENTIALISES;
    for ii = 2:specorder-1
        iv = uint32(find(reflorder_select==ii));    
        PotentialISESshift(masterivlistorig(iv),:) = [zeros(length(iv),specorder-ii) PotentialISESshift(masterivlistorig(iv),1:ii)];
    end
    
    % Go through ii, which is the number of specular reflections after
    % the diffraction.

    if ~isempty(nspecular_select)
		for ii = 1:specorder-1
			if SHOWTEXT >= 3
                    disp(['         order ',int2str(ii)])    
			end
		
            % We save the index vectors from the different orders so they can
            % be reused in the next stage.
			
             iv = uint32(find(nspecular_select == ii));
             listselect = masterivlistorig(iv);
             nlist = length(listselect);
             eval(['iv',JJ(ii,1:JJnumbofchars(ii)),' = iv;']) 
                 
            if ii == 1
                bigIRcoords(listselect,:) = IRcoordsstart( PotentialISESshift(listselect,specorder),:);
        
            elseif ii == 2
                bigIRcoords(listselect,:) = EDB1findis(IRcoordsstart(PotentialISESshift(listselect,specorder),:),...
                                                               PotentialISESshift(listselect,specorder-1),planeeqs,nlist,onesvec3);
	
             elseif ii >= 3
                ivcombo = double(PotentialISESshift(listselect,specorder));
                for jj = 1:ii-2
                    ivcombo = ivcombo + double(PotentialISESshift(listselect,specorder-jj))*ndecimaldivider^(jj);              
                end
                IRreflist = PointertoIRcombs(ivcombo);
                ivsimple    = find(IRreflist~=0);
                ivnotsimple = find(IRreflist==0);
                newIRcoordssimple    = EDB1findis(bigIRcoords(IRreflist(ivsimple),:),...
                                                  PotentialISESshift(listselect(ivsimple),specorder-(ii-1)),planeeqs,size(ivsimple,1),onesvec3);
                newIRcoordsnotsimple = EDB1findis(IRcoordsstart(PotentialISESshift(listselect(ivnotsimple),specorder),:),...
                                                  PotentialISESshift(listselect(ivnotsimple),specorder-1),planeeqs,size(ivnotsimple,1),onesvec3);
                for jj = 2:ii-1
                    newIRcoordsnotsimple = EDB1findis(newIRcoordsnotsimple,...
                                                  PotentialISESshift(listselect(ivnotsimple),specorder-jj),planeeqs,size(ivnotsimple,1),onesvec3);
                end
                newIRcoordstoadd = zeros(length(listselect),3);
                newIRcoordstoadd(ivsimple,:) = newIRcoordssimple;
                newIRcoordstoadd(ivnotsimple,:) = newIRcoordsnotsimple;
                bigIRcoords(listselect,:) = newIRcoordstoadd;
	
            end
		
		end
        clear nspecular_select
    else
        nspecular_select_not_empty = 0;
    end
end

%   #######################################################################
%   #######################################################################
%   #######################################################################
%   #######################################################################
%   #######################################################################

%   ##################################################
%   #                                                #
%   #  S - (spec) - edge - spec - spec - R cases     #
%   #                                                #
%   #   (Pre- and) Postspec cases                    #
%   #                                                #
%   ##################################################
%
% Possible edges for S-E-spec-spec-R are seen (at least partly) by the receiver.
%
% The visibility must be checked, and also obstructions, but only
% for the paths between the edge and the receiver

% 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, 
% which wasn't last in the sequence 

if specorder > 1 & nspecular_select_not_empty == 1

    % The ii-value refers to the number of specular reflections after the
    % diffraction

	for ii = 1:specorder-1
        
        if SHOWTEXT >= 3
            disp(['      Checking for ',JJ(ii,1:JJnumbofchars(ii)),' spec refl after the edge diff'])    
        end
	
        % The selection of cases with ii specular reflection after one
        % diffraction have already been done, in the IR-building process.
	
        eval(['masterivlist = masterivlistorig(iv',JJ(ii,1:JJnumbofchars(ii)),');'])
        
        if nedges < 256
            possibleedges = uint8(double(PotentialISESshift(masterivlist,specorder-ii)) - nplanes);
        elseif nedges < 65536
            possibleedges = uint16(double(PotentialISESshift(masterivlist,specorder-ii)) - nplanes);
        else
            possibleedges = uint32(double(PotentialISESshift(masterivlist,specorder-ii)) - nplanes);
        end
        
        % NB! possiblecombs will contain the specular sequences after the
        % diffraction but they appear in reversed order!
        possiblecombs = PotentialISESshift(masterivlist,specorder-ii+1:specorder);   

        % Specular combinations before the diffraction
        nmaxprespecs = specorder-1-ii;
        if nmaxprespecs == 0
            if nedges+nplanes < 256
                prespeccombs = uint8(zeros(length(masterivlist),1));
            elseif nedges+nplanes < 65536
                prespeccombs = uint16(zeros(length(masterivlist),1));
            else
                prespeccombs = uint32(zeros(length(masterivlist),1));                
            end
            nmaxprespecs = 1;
        else
            prespeccombs = PotentialISESshift(masterivlist,1:nmaxprespecs);
        end
       % Visibility of the edge in each sequence, seen from the source
        edgeweightsfromsou = ISESVISIBILITY(masterivlist);
        
        %--------------------------------------------------------------
        % Expand to take the edge subdivisions into account - 
        % treat all the edge subdivisions as separate edges for the
        % visibility and obstruction test.
        
        nposs = length(masterivlist);
        nposs = nposs*nedgesubs;
       
        expandedposscombs = repmat(possiblecombs,[1,nedgesubs]);
        expandedposscombs = reshape(expandedposscombs.',ii,nposs).';
  
        expandedprespecs = repmat(prespeccombs,[1,nedgesubs]);
        expandedprespecs = reshape(expandedprespecs.',nmaxprespecs,nposs).';
                        
        expandededgeweightsfromsou = repmat(edgeweightsfromsou,[1,nedgesubs]);
        expandededgeweightsfromsou = reshape(expandededgeweightsfromsou.',1,nposs).';
        
        expandedpossedges = repmat(possibleedges,[1,nedgesubs]);
        expandedpossedges = reshape(expandedpossedges.',1,nposs).';

        expandedmasterivlist = repmat(masterivlist,[1,nedgesubs]);
        expandedmasterivlist = reshape(expandedmasterivlist.',1,nposs).';

        if SHOWTEXT >= 3
			disp(['         ',int2str(nposs),' Edge+IR segments found initially '])
        end
	        
        % Go through, iteratively, and check if the path from edge to R passes
        % through all reflection planes along the way
    
       for jj = ii:-1:1
	
            if nposs > 0
	
                if jj == ii
                    fromcoords = full(bigIRcoords(expandedmasterivlist,:));
                    [toedgecoords,edgeweightlist,edgenumberlist] = EDB1getedgepoints(edgestartcoords(possibleedges,:),edgeendcoords(possibleedges,:),edgelengthvec(possibleedges,:),nedgesubs);
                    tocoords = toedgecoords;
                else
                    eval(['tocoords = reflpoints',JJ(jj+1,1:JJnumbofchars(jj+1)),';'])    
                    startlistvec = [1:length(expandedmasterivlist)];                    
                    ivref = IRoriginsfrom(expandedmasterivlist);
                    for kk = jj:ii-2
                        ivnoIRexist = find(ivref==0);
                        if ~isempty(ivnoIRexist)
                            ivIRexist = startlistvec;
                            ivIRexist(ivnoIRexist) = [];
                            ivref(ivIRexist) = IRoriginsfrom(ivref(ivIRexist));
                        else
                            ivref = IRoriginsfrom(ivref);                            
                        end
                    end
                    ivnoIRexist = find(ivref==0);                   
                    if isempty(ivnoIRexist)
                        fromcoords = full(bigIRcoords(ivref,:)); 
                    else
                        ivIRexist = startlistvec;
                        ivIRexist(ivnoIRexist) = [];
                        fromcoords = zeros(length(ivref),3);
                        fromcoords(ivIRexist,:) = full(bigIRcoords(ivref(ivIRexist),:));

                        ISEScutout = PotentialISESshift(expandedmasterivlist(ivnoIRexist),specorder-ii+1:specorder);
                        newIRcoords = EDB1findis(R,ISEScutout(:,ii),planeeqs,1,onesvec3);
                        for kk = 2:jj
                            newIRcoords = EDB1findis(newIRcoords,ISEScutout(:,ii-kk+1),planeeqs,size(newIRcoords,1),onesvec3);
                        end
                        fromcoords(ivnoIRexist,:) = newIRcoords;
                        
                    end
                    
                 end
                
                colno = ii-jj+1;
	
                [hitplanes,reflpoints,edgehits,edgehitpoints,cornerhits,cornerhitpoints] = EDB1chkISvisible(fromcoords,tocoords,planeeqs(expandedposscombs(:,colno),4),planenvecs(expandedposscombs(:,colno),:),minvals(expandedposscombs(:,colno),:),...
				    maxvals(expandedposscombs(:,colno),:),planecorners(expandedposscombs(:,colno),:),corners,ncornersperplanevec(expandedposscombs(:,colno)));
                if ~isempty(edgehits) | ~isempty(cornerhits)
                    disp('WARNING! An edgehit or cornerhit occurred during the visibility test but this is not')
                    disp('         handled correctly yet.')
                end
                eval(['reflpoints',JJ(jj,1:JJnumbofchars(jj)),' = reflpoints;'])
              
                expandedmasterivlist  = expandedmasterivlist(hitplanes);
                expandedposscombs     = expandedposscombs(hitplanes,:);
                expandedpossedges     = expandedpossedges(hitplanes);
                expandedprespecs      = expandedprespecs(hitplanes,:);
                edgeweightlist        = edgeweightlist(hitplanes);
                expandededgeweightsfromsou = expandededgeweightsfromsou(hitplanes); 
                toedgecoords = toedgecoords(hitplanes,:);
	
                if jj < ii
                    for kk = jj+1:ii
                       eval(['reflpoints',JJ(kk,1:JJnumbofchars(kk)),' = reflpoints',JJ(kk,1:JJnumbofchars(kk)),'(hitplanes,:);'])
                    end
                end
	
                nposs = length(expandedmasterivlist);
                
            end
            if SHOWTEXT >= 3
			    disp(['         ',int2str(nposs),' Edge+IR segments survived the visibility test in refl plane ',JJ(jj,1:JJnumbofchars(jj))])               
                if SHOWTEXT >= 5
                   POTENTIALISES(expandedmasterivlist,:)
                end
            end
            
        end
        
        if obstructtestneeded & nposs > 0
        
            % Check obstructions for all the paths: edge -> plane1 -> plane2 -> ...
            % -> edge   (S to edge is not needed!)
            for jj = 1:ii+1
                if nposs > 0
                    if jj==1
                        fromcoords = R;    
                        startplanes = [];    
                    else
                        startplanes = expandedposscombs(:,ii-jj+2);
                        eval(['fromcoords = reflpoints',JJ(jj-1,1:JJnumbofchars(jj-1)),';'])
                    end
                    if jj == ii+1
                        tocoords = toedgecoords;
                        endplanes = [planesatedge(expandedpossedges,1) planesatedge(expandedpossedges,2)];
                    else
                        eval(['tocoords = reflpoints',JJ(jj,1:JJnumbofchars(jj)),';'])    
                        endplanes = expandedposscombs(:,ii-jj+1);    
                    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('         handled correctly yet.')
                    end
	
                    if nobstructions > 0
                        expandedmasterivlist  = expandedmasterivlist(nonobstructedpaths);
                        expandedposscombs     = expandedposscombs(nonobstructedpaths,:);
                        expandedpossedges     = expandedpossedges(nonobstructedpaths);
                        expandedprespecs      = expandedprespecs(nonobstructedpaths,:);
                        edgeweightlist        = edgeweightlist(nonobstructedpaths);
                        expandededgeweightsfromsou = expandededgeweightsfromsou(nonobstructedpaths); 
                        toedgecoords          = toedgecoords(nonobstructedpaths,:);
                        nposs = length(expandedmasterivlist);
                        
                        for kk = 1:ii
                            eval(['reflpoints',JJ(kk,1:JJnumbofchars(kk)),' = reflpoints',JJ(kk,1:JJnumbofchars(kk)),'(nonobstructedpaths,:);'])    
                        end
                        
                    end
	
                end
                if SHOWTEXT >= 3
			       disp(['         ',int2str(nposs),' Edge+IR segments survived the obstruction test for path segment ',int2str(jj)])
                    if SHOWTEXT >= 5
                        POTENTIALISES(expandedmasterivlist,:)
                    end
                end
           end      
 
        end
        
        if nposs > 0

            % Visibility of edge segments is given by bitand-ing the
            % edge visibility from the (image) source and from the receiver

            edgeweightlist = bitand(edgeweightlist,expandededgeweightsfromsou);
            iv = find(edgeweightlist==0);

            if ~isempty(iv)
                expandedpossedges(iv) = [];
                expandedposscombs(iv,:) = [];
                expandedprespecs(iv,:) = [];
                edgeweightlist(iv) = [];
                expandedmasterivlist(iv) = [];
                nposs = length(edgeweightlist);
                
            end
             
            % Add the newly found combinations to the outdata list
            
            [nnew,slask] = size(expandedprespecs);
            if nnew == 1
                colstoclear = find( expandedprespecs==0 );
            else
                colstoclear = find(sum(expandedprespecs>0)==0);
            end
            if ~isempty(colstoclear)
                expandedprespecs(:,colstoclear) = [];    
            end

            [slask,ncolsexist] = size(prespeclist);
            [slask,ncolsnew] = size(expandedprespecs);
            ncolstoadd = ncolsexist - ncolsnew;
            if ncolstoadd > 0
                prespeclist =  [prespeclist; [expandedprespecs zeros(nposs,ncolstoadd)]];
            else
                prespeclist =  [prespeclist; expandedprespecs];                
            end
            edgedifflist = [edgedifflist;expandedpossedges];
            postspeclist = [postspeclist;[expandedposscombs zeros(nposs,specorder-1-ii)]];
            bigedgeweightlist = [bigedgeweightlist;edgeweightlist];
            validIRcoords = [validIRcoords;bigIRcoords(expandedmasterivlist,:)];
            % NB! It is correct below that the indices for the ISCOORDS should be
            % ORIGINSFROM(masterivlist), rather than masterivlist.
            % The combinations in POTENTIALISES(masterivlist,:) all have
            % spec-spec-...-diff combinations and then
            % ISCOORDS(masterivlist,:) are zeros since a comb. that
            % ends with a diff has no image source. 
            % If we have a spec-spec-...-diff-spec comb., then we must
            % use ORIGINSFROM(ORIGINSFROM(masterivlist)) etc.
            ivref = ORIGINSFROM(expandedmasterivlist);
            for kk = 1:ii
                ivref = ORIGINSFROM(ivref);
            end
            validIScoords = [validIScoords;ISCOORDS(ivref,:)];

        end
	end

%    clear PotentialISESshift IScoords bigIRcoords
    clear PotentialISESshift bigIRcoords
end

%   #######################################################################
%   #
%   #   Pack the edge segments together because every little edge segment
%   #   is present as a separate edge
%   #   This can be done for all combinations at once.
%   #
%   #######################################################################

test = [prespeclist edgedifflist postspeclist];

if ~isempty(test)

	ncombs = length(edgedifflist);
	dtest = diff([0;prod(   double(test(1:ncombs-1,:)==test(2:ncombs,:)).'  ).']);
	ivremove = find(dtest==1);
	
	while ~isempty(ivremove)
        bigedgeweightlist(ivremove+1) = double(bigedgeweightlist(ivremove+1)) + double(bigedgeweightlist(ivremove));
        bigedgeweightlist(ivremove) = [];
        edgedifflist(ivremove) = [];
        prespeclist(ivremove,:) = [];
        postspeclist(ivremove,:) = [];
        validIScoords(ivremove,:) = [];
        validIRcoords(ivremove,:) = [];
	
        test = [prespeclist edgedifflist postspeclist];
        ncombs = length(edgedifflist);
        dtest = diff([0;prod(   double(test(1:ncombs-1,:)==test(2:ncombs,:)).'  ).']);
        ivremove = find(dtest==1);
	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.

if specorder >= 1 & ~isempty(edgedifflist)
	startandendpoints = [startandendpoints;[zeros(length(edgedifflist),1) ones(length(edgedifflist),1)]];
	
    totvisibility = bigedgeweightlist;

	ivnovisibility = find(totvisibility==0);
	if ~isempty(ivnovisibility)
        disp('Clearing some cases.')
        edgedifflist(ivnovisibility) = [];
        prespeclist(ivnovisibility,:) = [];
        postspeclist(ivnovisibility,:) = [];
        bigedgeweightlist(ivnovisibility) = [];
        totvisibility(ivnovisibility) = [];
        validIScoords(ivnovisibility,:) = [];
        validIRcoords(ivnovisibility,:) = [];
	end    
	
	ivtoaccountfor = [1:length(totvisibility)].';
	
	% If there are edges with full visibility we don't need to do anything to
	% the start and end values, but we remove the edges from the list to
	% process.
	
	ivwholeedges = find( totvisibility == maxvisibilityvalue);
	if ~isempty(ivwholeedges)
        ivtoaccountfor(ivwholeedges) = [];
	end
	
	if ~isempty(ivtoaccountfor)
        ncombs = length(ivtoaccountfor);
        bitpattern = zeros(ncombs,nedgesubs);
        for ii=1:nedgesubs
            bitpattern(:,ii) = bitget(totvisibility(ivtoaccountfor),ii); 
        end
        dbit1 = diff([zeros(ncombs,1) bitpattern].').';
        dbit2 = [dbit1 -bitpattern(:,nedgesubs)]; 
        
        nsegments = ceil((sum(abs(dbit1.')).')/2);
	
        ivonesegments = find(nsegments==1);
        if ~isempty(ivonesegments)

            nonesegments = length(ivonesegments);
            multvec = 2.^[0:nedgesubs];
            segstartpos = round(log(sum( ((dbit2(ivonesegments,:)== 1).*multvec(ones(nonesegments,1),:)).').')/log(2))+1;
            segendpos   = round(log(sum( ((dbit2(ivonesegments,:)==-1).*multvec(ones(nonesegments,1),:)).').')/log(2))+1;
	
            ivmodify = find(segstartpos==1);
            segstartpos(ivmodify) = ones(size(ivmodify))*1.5;
            ivmodify = find(segendpos>nedgesubs);
            segendpos(ivmodify) = ones(size(ivmodify))*(nedgesubs+0.5);
	
            startandendpoints(ivtoaccountfor(ivonesegments),1) = (segstartpos-1.5)/(nedgesubs-1);
            startandendpoints(ivtoaccountfor(ivonesegments),2) = (segendpos-1.5)/(nedgesubs-1);
                    
        end    
        
        % If we have some two-or-more-subsegments cases, they will be
        % discovered by the if-condition below
        
        if length(ivonesegments) < ncombs
            for nsegmentstocheck = 2:ceil(nedgesubs/2)
     
                ivNsegments = find(nsegments==nsegmentstocheck);
                if ~isempty(ivNsegments)
                    [n1,n2] = size(startandendpoints);
                    if n2 < 2*nsegmentstocheck
                        startandendpoints = [startandendpoints zeros(n1,2*nsegmentstocheck-n2)];    
                    end
                    for jj = 1:length(ivNsegments)
                        ivstartbits = find(dbit2(ivNsegments(jj),:) == 1);
                        ivstartbits = (ivstartbits==1)*1.5 + (ivstartbits~=1).*ivstartbits;
                        ivendbits = find(dbit2(ivNsegments(jj),:) == -1);
                        ivendbits = (ivendbits>nedgesubs)*(nedgesubs+0.5) + (ivendbits<=nedgesubs).*ivendbits;
                        
                        for kk = 1:nsegmentstocheck,                                                        
                            startandendpoints(ivtoaccountfor(ivNsegments(jj)),(kk-1)*2+1) = (ivstartbits(kk)-1.5)/(nedgesubs-1);
                            startandendpoints(ivtoaccountfor(ivNsegments(jj)),(kk-1)*2+2) = (ivendbits(kk)-1.5)/(nedgesubs-1);
                        end
                    end                
                end
                
            end
        end        
	end
end

%   #######################################################################
%   #
%   #   Construct a list guide, which will tell which rows have only
%   #   d, which rows have sd etc
%   #   
%   #######################################################################

[n1,n2] = size(prespeclist);
if n1 ~= 0
	if n2 == 0
        prespeclist = zeros(n1,1);    
	end
	
	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;
	
	[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,:);
	bigedgeweightlist = bigedgeweightlist(sortvec,:);
    
    % The prespeclist needs to be shifted back to the left because it is
    % "right-aligned"
    
    [ncombs,ncols] = size(prespeclist);
    if ncols > 1
        if ncombs > 1
            iv = find( ( prespeclist(:,1)==0 ) & ( prespeclist(:,2)~=0 ) );
            if ~isempty(iv)
               prespeclist(iv,1:ncols-1) = prespeclist(iv,2:ncols);
               prespeclist(iv,ncols) = 0;
            end

            for jj = 3:ncols
                iv = find( ( sum(prespeclist(:,1:jj-1).').' == 0 ) & ( prespeclist(:,jj)~=0 ) );
                if ~isempty(iv)
                   prespeclist(iv,1:ncols-(jj-1)) = prespeclist(iv,jj:ncols);
                   prespeclist(iv,ncols-(jj-2):ncols) = 0;
                end
            end    
        else
           if prespeclist(1,1) == 0,               
                ninitialzeros =  find(diff(cumsum(prespeclist)));
                if ~isempty(ninitialzeros)
                    ninitialzeros = ninitialzeros(1);
                    prespeclist(1:ncols-ninitialzeros) = prespeclist(ninitialzeros+1:ncols);
                    prespeclist(ncols-ninitialzeros+1:ncols) = 0;
                end
           end
        end
    end
    
else
    prespeclist = [];
    postspeclist = [];
    validIScoords = [];
    validIRcoords = [];
    edgedifflist = [];
    startandendpoints = [];
    bigedgeweightlist = [];
    listguide = [];
    
end