b@0: function tstDat=readPairComp(testFile) b@0: b@0: % pair comparison specifications b@0: % b@0: % NAME b@0: % pair comparison test #1 b@0: % b@0: % NBSOUNDS: 3 b@0: % RANDOM?: 0 b@0: % REPETITIONS?: 0 b@0: % b@0: % NBCOMBINATIONS: 3 b@0: % COMBINATIONS b@0: % 2 3 b@0: % 2 1 b@0: % 3 1 b@0: % b@0: % NBSCALES: 1 b@0: % SCALES b@0: % SCALE: b@0: % Global difference b@0: % LEVEL b@0: % min 1 A & B are the same b@0: % max 7 A & B are very different b@0: % step 1 b@0: % b@0: % NBQUESTIONS: 2 b@0: % QUESTIONS b@0: % 2 I prefer A b@0: % 1 I prefer B b@0: % 0 I think they are both very annoying % the index in front show if the questions are linked to others (mutually exclusive) b@0: % b@0: % COMMENTS?: 1 % ask if a comment field should be displayed (1=yes 0=no) b@0: % b@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% b@0: % b@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% b@0: b@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% b@0: %Initialization b@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% b@0: b@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% b@0: % file parsing b@0: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% b@0: b@0: tstDat.name=[]; b@0: tstDat.COM=1; b@0: tstDat.RAN=0; b@0: tstDat.REP=0; b@0: tstDat.scale=[]; b@0: b@0: fid=fopen(testFile,'r'); b@0: while ~feof(fid) b@0: lin=fgetl(fid); b@0: [word1,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin,'%s',1); b@0: b@2: if (~COUNT || ~strcmp(word1,'%')) b@0: switch upper(word1) b@0: case 'NAME' b@0: tstDat.name=fgetl(fid); b@0: b@0: case 'NBSOUNDS:' b@0: [nbSnd,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%d',1); b@0: tstDat.nbSnd=nbSnd; b@0: b@0: % only if specific combinations need to be tested (as opposed to b@0: % all possible combinations) b@0: % case 'NBCOMBINATIONS:' b@0: % [nbComb,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%d',1); b@0: % tstDat.nbComb=nbComb; b@0: % b@0: % case 'COMBINATIONS' b@0: % for noComb=1:nbComb b@0: % lin=fgetl(fid); b@0: % if ~isempty(lin) b@0: % if lin(1)~='%' b@0: % [comb,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin,'%d',2); b@0: % tstDat.comb(noComb,:)=comb; b@0: % end b@0: % end b@0: % end b@0: b@0: case 'NBSCALES:' b@0: [nbScale,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%d',1); b@0: tstDat.nbScale=nbScale; b@0: case 'SCALES' b@0: for noScale=1:nbScale b@0: while ~feof(fid) b@0: lin=fgetl(fid); b@0: [header,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin,'%s',1); b@0: switch firstWord(header) b@0: case 'SCALE:' b@0: name=fgetl(fid); b@0: case 'min' b@0: lin=lin(NEXTINDEX:end); b@0: [minn,COUNT,ERRMSG,NEXTINDEX]=sscanf(lin,'%d',1); %% b@0: level{1}=lin(NEXTINDEX:end); %% b@0: case 'max' b@0: lin=lin(NEXTINDEX:end); b@0: [maxx,COUNT,ERRMSG,NEXTINDEX]=sscanf(lin,'%d',1); %% b@0: level{3}=lin(NEXTINDEX:end); %% b@0: b@0: case 'step' b@0: lin=lin(NEXTINDEX:end); b@0: [stepp,COUNT,ERRMSG,NEXTINDEX]=sscanf(lin,'%d',1); %% b@0: level{2}=lin(NEXTINDEX:end); %% b@0: break b@0: end b@0: b@0: end b@0: tstDat.scale(noScale).name=name; b@0: tstDat.scale(noScale).maxx=maxx; b@0: tstDat.scale(noScale).minn=minn; b@0: tstDat.scale(noScale).stepp=stepp; b@0: tstDat.scale(noScale).level=level; b@0: end b@0: b@0: case 'NBQUESTIONS:' b@0: [nbQuest,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%d',1); b@0: tstDat.nbQuest=nbQuest; b@0: case 'QUESTIONS' b@0: for noQuest=1:nbQuest b@0: lin=fgetl(fid); b@0: [tstDat.link(noQuest),COUNT,ERRMSG,NEXTINDEX] = sscanf(lin,'%d',1); b@0: tstDat.quest{noQuest}=lin(NEXTINDEX:end); b@0: end b@0: case 'COMMENTS?:' b@0: [COM,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%d',1); b@0: tstDat.COM=COM; b@0: b@0: % assume random order is desired for now b@0: % case 'RANDOM?:' b@0: % [RAN,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%d',1); b@0: % tstDat.RAN=RAN; b@0: b@0: case 'REPETITIONS?:' % number of times samples should be repeated b@0: [REP,COUNT,ERRMSG,NEXTINDEX] = sscanf(lin(NEXTINDEX:end),'%d',1); b@0: tstDat.REP=REP; b@0: b@0: end b@0: end b@0: end b@0: b@0: b@0: comb = combnk(1:nbSnd,2); b@0: nbComb = length(comb(:,1)); b@0: b@0: % repeat comparisons a number of times throughout test b@0: if REP b@0: comb = repmat(comb,tstDat.REP+1,1); b@0: end b@0: b@0: % randomise order b@0: comb = comb(randperm(nbComb),:); b@0: b@0: % randomly flip left and right column numbers b@0: flipsides = ceil(2*rand(nbComb,1))-1; % random string of nbComb 0's and 1's b@0: comb = [comb((1:nbComb)'+ flipsides*nbComb) comb((1:nbComb)' + nbComb - flipsides*nbComb)]; b@0: b@0: %save('lastComb','comb'); b@0: % TO DO: Add recall in case of crash/interruption. b@0: b@0: tstDat.comb = comb; b@0: tstDat.nbComb = nbComb; b@0: b@0: fclose(fid); b@0: b@0: function word=firstWord(word) b@0: b@0: if ~isempty(word) b@0: if word(1)=='%' b@0: word=''; b@0: end b@0: else b@0: word=''; b@0: end