1function [err, Contr] = ContrVec(order, n, NF, group, dmat, Contr, FL, num_col)
2%
3%   [err,] = ContrVec.m ()
4%
5%Purpose:
6%
7%   Obtain a vector for each contrast so that effect size is calculated in SumsOfSquares.m
8%
9%Input Parameters:
10%
11%
12%
13%Output Parameters:
14%   err : 0 No Problem
15%       : 1  Problems
16%
17%
18%
19%Key Terms:
20%
21%More Info :
22%
23%
24%
25%
26%     Author : Gang Chen
27%     Date : Wed Dec 1 10:15:29 EST 2004
28%     SSCC/NIMH/ National Institutes of Health, Bethesda MD 20892
29
30
31%Define the function name for easy referencing
32FuncName = 'ContrVec.m';
33
34%Debug Flag
35DBG = 1;
36
37%initialize return variables
38err = 1;
39
40switch order
41
42case 1,   % dmat(:, num_col0+1:num_col0+num_col(1)) is the matrix for 1st order contrasts
43
44   for (i = 1:1:Contr.ord1.tot),
45      Contr.ord1.cnt(i).vec = zeros(1, n);  % n = ntot in anovan.m: total number of files, and no. of arrows in dmat
46		Contr.ord1.cnt(i).scalar = 0;
47      for (j = 1:1:Contr.ord1.cnt(i).NT),   % for each term in a contrast
48         first = 0;
49         Contr.ord1.cnt(i).code(j).pos = 0;
50			shift = 1;   % Grand mean
51	      for (k = 1:1:NF),
52            if (Contr.ord1.cnt(i).code(j).str(k) >= 'a' & Contr.ord1.cnt(i).code(j).str(k) <= 'z'),
53				   tmpv = 10 + Contr.ord1.cnt(i).code(j).str(k) - 'a';
54				else tmpv = Contr.ord1.cnt(i).code(j).str(k) - '0'; end  % tmpv = level #
55
56				if (tmpv ~= 0),
57	            first = first + 1;  % the first non-zero index backward! For 1st-roder, it is the only nonzero index.
58			      if (first == 1),
59			         Contr.ord1.cnt(i).idx1 = k;
60%				      tmp = FL(k).N_level;
61	            elseif (first > 1),
62	               fprintf('\nError in contrast coding: more than one non-zero index in 1st order constrasts!\n');
63	               fprintf(2,'Halted: Ctrl+c to exit'); pause;
64			      end  % if (first == 1)
65	         end   % if (tmpv ~= 0)
66         end   % for (k = 1:1:NF)
67			if (Contr.ord1.cnt(i).idx1 > 1),
68			   for (k = 1:1:Contr.ord1.cnt(i).idx1-1),
69			      shift = shift + FL(k).N_level;
70				end
71			end
72			if (Contr.ord1.cnt(i).code(j).str(Contr.ord1.cnt(i).idx1) >= 'a' & Contr.ord1.cnt(i).code(j).str(Contr.ord1.cnt(i).idx1) <= 'z'),
73			   tmpv = 10 + Contr.ord1.cnt(i).code(j).str(Contr.ord1.cnt(i).idx1) - 'a';
74			else tmpv = Contr.ord1.cnt(i).code(j).str(Contr.ord1.cnt(i).idx1) - '0'; end
75
76         Contr.ord1.cnt(i).code(j).pos = shift + tmpv;
77
78%        tmp = FL(Contr.ord1.cnt(i).idx1).N_level/n;
79%         Contr.ord1.cnt(i).scalar = tmp * Contr.ord1.cnt(i).coef*Contr.ord1.cnt(i).coef';
80%         Contr.ord1.cnt(i).vec = Contr.ord1.cnt(i).vec + Contr.ord1.cnt(i).coef(j) * dmat(:, Contr.ord1.cnt(i).code(j).pos)';
81
82			count=0;   % The part should be valid for both balanced and unbalanced designs
83%			tmpstr = char (group{Contr.ord1.cnt(i).idx1});
84         for (ll = 1:1:n) % Should have a more decent way to do this in a matrix fashion instead of a lenthy loop?
85            tmpstr = char (group{Contr.ord1.cnt(i).idx1}(ll));
86				if strcmp(tmpstr, FL(Contr.ord1.cnt(i).idx1).level(tmpv).expr)
87	            count = count + 1;   % total number of occurences at tmpv-th level
88	         end
89         end
90			Contr.ord1.cnt(i).vec = Contr.ord1.cnt(i).vec + Contr.ord1.cnt(i).coef(j) * dmat(:, Contr.ord1.cnt(i).code(j).pos)'/count;
91			Contr.ord1.cnt(i).scalar = Contr.ord1.cnt(i).scalar + Contr.ord1.cnt(i).coef(j)*Contr.ord1.cnt(i).coef(j)/count;    % For variance coef: j-th term in i-th 1st-order contrast.
92
93      end	% for (j = 1:1:Contr.ord1.cnt(i).NT)
94%      Contr.ord1.cnt(i).vec = Contr.ord1.cnt(i).vec*tmp;   % assuming balanced design!!!
95   end   %for (i = 1:1:Contr1.tot)
96
97case 2,  % dmat(:, num_col0+num_col(1)+1:num_col0+num_col(1)+num_col(2)) is the matrix for 2nd order contrasts
98
99   % when the 1st factor is collapsed
100   %   shift1 = (FL(1).N_level*(FL(2).N_level + FL(3).N_level + FL(4).N_level))*(str2num(Contr2.cnt(i).code(1).str(1)) == 0);
101   % when the 2nd factor is collapsed
102   %   shift2 = (FL(2).N_level*(FL(3).N_level + FL(4).N_level))*(str2num(Contr2.cnt(i).code(1).str(2)) == 0);
103   % when the 3rd factor is collapsed
104   %   shift3 = (FL(3).N_level*FL(4).N_level)*(str2num(Contr2.cnt(i).code(1).str(3)) == 0);
105   %
106   % when the 4th factor is collapsed
107   %   shift4 = FL(4).N_level*(str2num(Contr2.cnt(i).code(1).str(4)) == 0);
108   %
109   %   Contr2.cnt(i).shift = num_col0 + num_col(1) + 1 + shift1 + shift2 + shift3 + shift4;  % position shifting for the two collapsed indices
110
111   shift = 1 + num_col(1);   % Grand mean plus factor means
112   for (i = 1:1:Contr.ord2.tot),
113
114   % for the two non-zero indices
115	Contr.ord2.cnt(i).vec = zeros(1, n);  % n = ntot in anovan.m: total number of files, and no. of arrows in dmat
116	Contr.ord2.cnt(i).scalar = 0;
117	for (j = 1:1:Contr.ord2.cnt(i).NT),   % For each term in this 2nd-order contrast
118      first = 0;
119	   Contr.ord2.cnt(i).code(j).pos = 0;
120		for (k = 1:1:NF),
121         if (Contr.ord2.cnt(i).code(j).str(k) >= 'a' & Contr.ord2.cnt(i).code(j).str(k) <= 'z'),
122			   tmpv = 10 + Contr.ord2.cnt(i).code(j).str(k) - 'a';
123			else tmpv = Contr.ord2.cnt(i).code(j).str(k) - '0'; end
124
125			if (tmpv ~= 0),
126            first = first + 1;  % the first non-zero index backward!
127	        	if (first == 1),
128		         Contr.ord2.cnt(i).idx1 = k;
129%       			tmp = FL(k).N_level;
130		      elseif (first == 2), Contr.ord2.cnt(i).idx2 = k; end
131		   end
132      end  %for (k = 1:1:NF)
133		sec_fctr = Contr.ord2.cnt(i).idx2;
134      switch Contr.ord2.cnt(i).idx1
135      case 1,   % 2nd-order contrasts: Ax
136%         sec_fctr = Contr.ord2.cnt(i).idx2;
137			if (Contr.ord2.cnt(i).code(j).str(1) >= 'a' & Contr.ord2.cnt(i).code(j).str(1) <= 'z'),
138			   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(1) - 'a';
139			else tmpv1 = Contr.ord2.cnt(i).code(j).str(1) - '0'; end
140			if (Contr.ord2.cnt(i).code(j).str(sec_fctr) >= 'a' & Contr.ord2.cnt(i).code(j).str(sec_fctr) <= 'z'),
141			   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(sec_fctr) - 'a';
142         else tmpv2 = Contr.ord2.cnt(i).code(j).str(sec_fctr) - '0'; end % tmpv = level #
143
144			Contr.ord2.cnt(i).code(j).pos = shift + (tmpv1 - 1) * FL(sec_fctr).N_level + tmpv2;
145			if (sec_fctr > 2),
146			for (ll = 2:1:(sec_fctr-1)),  % shift over AB, AC, ...
147			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(1).N_level*FL(ll).N_level;
148			end % for (ll = 2:1:(sec_fctr-1))
149			end % if (sec_fctr > 2)
150
151%			switch Contr.ord2.cnt(i).idx2
152%         case 2,
153%            if (Contr.ord2.cnt(i).code(j).str(1) >= 'a' & Contr.ord2.cnt(i).code(j).str(1) <= 'z'),
154%				   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(1) - 'a';
155%            else tmpv1 = Contr.ord2.cnt(i).code(j).str(1) - '0'; end
156%				if (Contr.ord2.cnt(i).code(j).str(2) >= 'a' & Contr.ord2.cnt(i).code(j).str(2) <= 'z'),
157%				   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(2) - 'a';
158%            else tmpv2 = Contr.ord2.cnt(i).code(j).str(2) - '0'; end % tmpv = level #
159
160%				Contr.ord2.cnt(i).code(j).pos = shift + (tmpv1 - 1) * FL(2).N_level + tmpv2; % AB
161%         case 3,
162%            if (Contr.ord2.cnt(i).code(j).str(1) >= 'a' & Contr.ord2.cnt(i).code(j).str(1) <= 'z'),
163%				   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(1) - 'a';
164%            else tmpv1 = Contr.ord2.cnt(i).code(j).str(1) - '0'; end
165%				if (Contr.ord2.cnt(i).code(j).str(3) >= 'a' & Contr.ord2.cnt(i).code(j).str(3) <= 'z'),
166%				   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(3) - 'a';
167%            else tmpv2 = Contr.ord2.cnt(i).code(j).str(3) - '0'; end
168
169%				Contr.ord2.cnt(i).code(j).pos = shift + FL(1).N_level*FL(2).N_level+ ...
170%               (tmpv1 - 1) * FL(3).N_level + tmpv2; % AC
171
172%			case 4,   % AD
173%			   if (Contr.ord2.cnt(i).code(j).str(1) >= 'a' & Contr.ord2.cnt(i).code(j).str(1) <= 'z'),
174%				   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(1) - 'a';
175%            else tmpv1 = Contr.ord2.cnt(i).code(j).str(1) - '0'; end
176%				if (Contr.ord2.cnt(i).code(j).str(4) >= 'a' & Contr.ord2.cnt(i).code(j).str(4) <= 'z'),
177%				   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(4) - 'a';
178%            else tmpv2 = Contr.ord2.cnt(i).code(j).str(4) - '0'; end
179
180%				Contr.ord2.cnt(i).code(j).pos = shift + FL(1).N_level*FL(2).N_level+ FL(1).N_level*FL(3).N_level+...
181%               (tmpv1 - 1) * FL(4).N_level + tmpv2; % AD
182%	      end
183      case 2,  % 2nd-order contrasts Bx
184%         sec_fctr = Contr.ord2.cnt(i).idx2;
185			if (Contr.ord2.cnt(i).code(j).str(2) >= 'a' & Contr.ord2.cnt(i).code(j).str(2) <= 'z')
186			   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(2) - 'a';
187		   else tmpv1 = Contr.ord2.cnt(i).code(j).str(2) - '0'; end
188			if (Contr.ord2.cnt(i).code(j).str(sec_fctr) >= 'a' & Contr.ord2.cnt(i).code(j).str(sec_fctr) <= 'z'),
189			   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(sec_fctr) - 'a';
190		   else tmpv2 = Contr.ord2.cnt(i).code(j).str(sec_fctr) - '0'; end
191
192			Contr.ord2.cnt(i).code(j).pos = shift + (tmpv1 - 1) * FL(sec_fctr).N_level + tmpv2;
193			for (ll = 2:1:NF), % shift over all those Ax's
194			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(1).N_level*FL(ll).N_level;
195			end
196
197			if (sec_fctr > 3),
198			for (ll = 3:1:(sec_fctr-1)),  % shift over Bx's
199			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(2).N_level*FL(ll).N_level;
200			end % for (ll = 3:1:(sec_fctr-1))
201			end % if (sec_fctr > 3)
202
203%			if (Contr.ord2.cnt(i).idx2 == 3),
204%            if (Contr.ord2.cnt(i).code(j).str(2) >= 'a' & Contr.ord2.cnt(i).code(j).str(2) <= 'z'),
205%   			   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(2) - 'a';
206%		      else tmpv1 = Contr.ord2.cnt(i).code(j).str(2) - '0'; end
207%				if (Contr.ord2.cnt(i).code(j).str(3) >= 'a' & Contr.ord2.cnt(i).code(j).str(3) <= 'z'),
208%				   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(3) - 'a';
209%		      else tmpv2 = Contr.ord2.cnt(i).code(j).str(3) - '0'; end
210
211%				if (NF == 3), Contr.ord2.cnt(i).code(j).pos = shift + FL(1).N_level*(FL(2).N_level + FL(3).N_level) + ...
212%		          (tmpv1 - 1) * FL(3).N_level + tmpv2; % BC
213%				else Contr.ord2.cnt(i).code(j).pos = shift + FL(1).N_level*(FL(2).N_level + FL(3).N_level + FL(4).N_level) + ...
214%		          (tmpv1 - 1) * FL(3).N_level + tmpv2; % BC
215%				end
216%		      tmp = FL(2).N_level*FL(3).N_level/n;
217%			else fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause; end
218
219		case 3,  % 2nd-order contrasts Cx
220		   if (Contr.ord2.cnt(i).code(j).str(3) >= 'a' & Contr.ord2.cnt(i).code(j).str(3) <= 'z')
221			   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(3) - 'a';
222		   else tmpv1 = Contr.ord2.cnt(i).code(j).str(3) - '0'; end
223			if (Contr.ord2.cnt(i).code(j).str(sec_fctr) >= 'a' & Contr.ord2.cnt(i).code(j).str(sec_fctr) <= 'z'),
224			   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(sec_fctr) - 'a';
225		   else tmpv2 = Contr.ord2.cnt(i).code(j).str(sec_fctr) - '0'; end
226
227			Contr.ord2.cnt(i).code(j).pos = shift + (tmpv1 - 1) * FL(sec_fctr).N_level + tmpv2;
228			for (ll = 2:1:NF), % shift over all those Ax's
229			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(1).N_level*FL(ll).N_level;
230			end
231
232			for (ll = 3:1:NF), % shift over all those Bx's
233			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(2).N_level*FL(ll).N_level;
234			end
235
236			if (sec_fctr > 4),
237			for (ll = 4:1:(sec_fctr-1)),  % shift over Bx's
238			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(3).N_level*FL(ll).N_level;
239			end % for (ll = 4:1:(sec_fctr-1))
240			end % if (sec_fctr > 4)
241
242		case 4,  % 2nd-order contrasts Dx
243		   if (Contr.ord2.cnt(i).code(j).str(4) >= 'a' & Contr.ord2.cnt(i).code(j).str(4) <= 'z')
244			   tmpv1 = 10 + Contr.ord2.cnt(i).code(j).str(4) - 'a';
245		   else tmpv1 = Contr.ord2.cnt(i).code(j).str(4) - '0'; end
246			if (Contr.ord2.cnt(i).code(j).str(sec_fctr) >= 'a' & Contr.ord2.cnt(i).code(j).str(sec_fctr) <= 'z'),
247			   tmpv2 = 10 + Contr.ord2.cnt(i).code(j).str(sec_fctr) - 'a';
248		   else tmpv2 = Contr.ord2.cnt(i).code(j).str(sec_fctr) - '0'; end
249
250			Contr.ord2.cnt(i).code(j).pos = shift + (tmpv1 - 1) * FL(sec_fctr).N_level + tmpv2;
251			for (ll = 2:1:NF), % shift over all those Ax's
252			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(1).N_level*FL(ll).N_level;
253			end
254
255			for (ll = 3:1:NF), % shift over all those Bx's
256			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(2).N_level*FL(ll).N_level;
257			end
258
259			for (ll = 4:1:NF), % shift over all those Cx's
260			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(3).N_level*FL(ll).N_level;
261			end
262
263			if (sec_fctr > 5),
264			for (ll = 5:1:(sec_fctr-1)),  % shift over Bx's
265			   Contr.ord2.cnt(i).code(j).pos = Contr.ord2.cnt(i).code(j).pos + FL(4).N_level*FL(ll).N_level;
266			end % for (ll = 5:1:(sec_fctr-1))
267			end % if (sec_fctr > 5)
268
269
270%			fprintf('\nSomething is wrong in the contrast coding!\n');
271%		   fprintf(2,'Halted: Ctrl+c to exit'); pause;
272		end  %switch Contr.ord2.cnt(i).idx1
273
274		count = 0;
275		for (ll = 1:1:n)
276			tmpstr1 = char (group{Contr.ord2.cnt(i).idx1}(ll));
277			tmpstr2 = char (group{Contr.ord2.cnt(i).idx2}(ll));
278			if strcmp(tmpstr1, FL(Contr.ord2.cnt(i).idx1).level(tmpv1).expr) & strcmp(tmpstr2, FL(Contr.ord2.cnt(i).idx2).level(tmpv2).expr)
279			   count = count + 1;   % total number of occurences at tmpv-th level
280			end
281		end
282		Contr.ord2.cnt(i).vec = Contr.ord2.cnt(i).vec + Contr.ord2.cnt(i).coef(j) * dmat(:, Contr.ord2.cnt(i).code(j).pos)'/count;
283		Contr.ord2.cnt(i).scalar = Contr.ord2.cnt(i).scalar + Contr.ord2.cnt(i).coef(j)*Contr.ord2.cnt(i).coef(j)/count;    % For variance coef: j-th term in i-th 1st-order contrast.
284
285%		Contr.ord2.cnt(i).scalar = tmp * Contr.ord2.cnt(i).coef*Contr.ord2.cnt(i).coef';
286%		Contr.ord2.cnt(i).vec = Contr.ord2.cnt(i).vec + Contr.ord2.cnt(i).coef(j) * dmat(:, Contr.ord2.cnt(i).code(j).pos)';
287   end	 %for (j = 1:1:Contr.ord2.cnt(i).NT),
288%	Contr.ord2.cnt(i).vec = Contr.ord2.cnt(i).vec*tmp;   % assuming balanced design!!!
289   end   %for (i = 1:1:Contr2.tot)
290
291case 3,
292
293   shift = 1 + num_col(1) + num_col(2);   % skip grand mean, factor means and 2nd-roder terms
294   for (i = 1:1:Contr.ord3.tot),
295   % for the  non-zero indices
296	   Contr.ord3.cnt(i).vec = zeros(1, n);  % n = ntot in anovan.m: total number of files, and no. of arrows in dmat
297	   Contr.ord3.cnt(i).scalar = 0;
298		for (j = 1:1:Contr.ord3.cnt(i).NT),   % for each term in a contrast
299         first = 0;
300		   Contr.ord3.cnt(i).code(j).pos = 0;
301
302		   for (k = 1:1:NF),
303            if (Contr.ord3.cnt(i).code(j).str(k) >= 'a' & Contr.ord3.cnt(i).code(j).str(k) <= 'z'),
304				   tmpv = 10 + Contr.ord3.cnt(i).code(j).str(k) - 'a';
305			   else tmpv = Contr.ord3.cnt(i).code(j).str(k) - '0'; end
306
307			   if (tmpv ~= 0),
308	            first = first + 1;  % the first non-zero index backward!
309		         % if (first == 1), tmp = str2num(Contr3.cnt(i).code(j).str(k)) - 1;	  % (level# - 1) for the first collapsed index
310				   % elseif (first == 2), Contr3.cnt(i).code(j).shift = Contr3.cnt(i).code(j).shift + tmp * FL(k).N_level str2num(Contr3.cnt(i).code(j).str(k);
311				   if (first == 1),
312				      Contr.ord3.cnt(i).idx1 = k;
313					   %Contr3.cnt(i).code(j).pos = Contr3.cnt(i).shift + str2num(Contr3.cnt(i).code(j).str(k)) - 1;
314%					   tmp = FL(k).N_level;
315		         elseif (first == 2),
316				      Contr.ord3.cnt(i).idx2 = k;
317					   %Contr3.cnt(i).code(j).pos = Contr3.cnt(i).code(j).pos + (str2num(Contr3.cnt(i).code(j).str(k)) - 1) * tmp;
318		            %else fprintf('\nError in contrast coding: more than two non-zero indices!\n');
319		            %   fprintf(2,'Halted: Ctrl+c to exit'); pause;
320				   end
321				   if (first == 3), Contr.ord3.cnt(i).idx3 = k; end
322		      end
323	      end  % for (k = 1:1:NF)
324		   switch Contr.ord3.cnt(i).idx1
325		   case 1,
326			   switch Contr.ord3.cnt(i).idx2
327				   case 2,
328					   switch Contr.ord3.cnt(i).idx3
329						   case 3, % ABC
330
331							if (Contr.ord3.cnt(i).code(j).str(1) >= 'a' & Contr.ord3.cnt(i).code(j).str(1) <= 'z'),
332								tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(1) - 'a';
333					      else tmpv1 = Contr.ord3.cnt(i).code(j).str(1) - '0'; end
334							if (Contr.ord3.cnt(i).code(j).str(2) >= 'a' & Contr.ord3.cnt(i).code(j).str(2) <= 'z'),
335							   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(2) - 'a';
336					      else tmpv2 = Contr.ord3.cnt(i).code(j).str(2) - '0'; end
337							if (Contr.ord3.cnt(i).code(j).str(3) >= 'a' & Contr.ord3.cnt(i).code(j).str(3) <= 'z'),
338							   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(3) - 'a';
339					      else tmpv3 = Contr.ord3.cnt(i).code(j).str(3) - '0'; end
340
341							Contr.ord3.cnt(i).code(j).pos = shift + (tmpv1 - 1) * FL(2).N_level * FL(3).N_level + ...
342					         (tmpv2 - 1) * FL(3).N_level + tmpv3; % ABC
343%							tmp = FL(1).N_level*FL(2).N_level*FL(3).N_level/n;
344
345							case 4, % ABD
346
347							if (Contr.ord3.cnt(i).code(j).str(1) >= 'a' & Contr.ord3.cnt(i).code(j).str(1) <= 'z'),
348								tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(1) - 'a';
349					      else tmpv1 = Contr.ord3.cnt(i).code(j).str(1) - '0'; end
350							if (Contr.ord3.cnt(i).code(j).str(2) >= 'a' & Contr.ord3.cnt(i).code(j).str(2) <= 'z'),
351							   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(2) - 'a';
352					      else tmpv2 = Contr.ord3.cnt(i).code(j).str(2) - '0'; end
353							if (Contr.ord3.cnt(i).code(j).str(4) >= 'a' & Contr.ord3.cnt(i).code(j).str(4) <= 'z'),
354							   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(4) - 'a';
355					      else tmpv3 = Contr.ord3.cnt(i).code(j).str(4) - '0'; end
356
357							% shift the columns for ABC and part of ABD
358							Contr.ord3.cnt(i).code(j).pos = shift + FL(1).N_level * FL(2).N_level * FL(3).N_level + ...
359							   (tmpv1 - 1) * FL(2).N_level * FL(4).N_level + (tmpv2 - 1) * FL(4).N_level + tmpv3; % ABD
360%							   tmp = FL(1).N_level*FL(2).N_level*FL(4).N_level/n;
361
362							case 5, % ABE
363
364							if (Contr.ord3.cnt(i).code(j).str(1) >= 'a' & Contr.ord3.cnt(i).code(j).str(1) <= 'z'),
365								tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(1) - 'a';
366					      else tmpv1 = Contr.ord3.cnt(i).code(j).str(1) - '0'; end
367							if (Contr.ord3.cnt(i).code(j).str(2) >= 'a' & Contr.ord3.cnt(i).code(j).str(2) <= 'z'),
368							   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(2) - 'a';
369					      else tmpv2 = Contr.ord3.cnt(i).code(j).str(2) - '0'; end
370							if (Contr.ord3.cnt(i).code(j).str(5) >= 'a' & Contr.ord3.cnt(i).code(j).str(5) <= 'z'),
371							   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(5) - 'a';
372					      else tmpv3 = Contr.ord3.cnt(i).code(j).str(5) - '0'; end
373
374							% shift the columns for ABC, ABD and part of ABE
375							Contr.ord3.cnt(i).code(j).pos = shift + FL(1).N_level * FL(2).N_level * FL(3).N_level + ...
376							   + FL(1).N_level * FL(2).N_level * FL(4).N_level + ...
377								(tmpv1 - 1) * FL(2).N_level * FL(5).N_level + (tmpv2 - 1) * FL(5).N_level + tmpv3; % ABE
378
379						end   % switch Contr.ord3.cnt(i).idx3
380					case 3,
381					   if (Contr.ord3.cnt(i).idx3 == 4),  % ACD
382						   if (Contr.ord3.cnt(i).code(j).str(1) >= 'a' & Contr.ord3.cnt(i).code(j).str(1) <= 'z'),
383								tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(1) - 'a';
384					      else tmpv1 = Contr.ord3.cnt(i).code(j).str(1) - '0'; end
385							if (Contr.ord3.cnt(i).code(j).str(3) >= 'a' & Contr.ord3.cnt(i).code(j).str(3) <= 'z'),
386							   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(3) - 'a';
387					      else tmpv2 = Contr.ord3.cnt(i).code(j).str(3) - '0'; end
388							if (Contr.ord3.cnt(i).code(j).str(4) >= 'a' & Contr.ord3.cnt(i).code(j).str(4) <= 'z'),
389							   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(4) - 'a';
390					      else tmpv3 = Contr.ord3.cnt(i).code(j).str(4) - '0'; end
391
392							Contr.ord3.cnt(i).code(j).pos = shift + FL(1).N_level * FL(2).N_level * FL(3).N_level + FL(1).N_level * FL(2).N_level * FL(4).N_level + ...
393							   FL(1).N_level * FL(2).N_level * FL(5).N_level + (tmpv1 - 1) * FL(3).N_level * FL(4).N_level + (tmpv2 - 1) * FL(4).N_level + tmpv3; % ACD
394%							tmp = FL(1).N_level*FL(3).N_level*FL(4).N_level/n;
395						else fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause;
396						end
397					case 4, fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause;
398				end
399			case 2,
400			   switch Contr.ord3.cnt(i).idx2
401				   case 3,
402					   switch Contr.ord3.cnt(i).idx3
403
404							case 4,  % BCD
405							if (Contr.ord3.cnt(i).code(j).str(2) >= 'a' & Contr.ord3.cnt(i).code(j).str(2) <= 'z'),
406								tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(2) - 'a';
407					      else tmpv1 = Contr.ord3.cnt(i).code(j).str(2) - '0'; end
408							if (Contr.ord3.cnt(i).code(j).str(3) >= 'a' & Contr.ord3.cnt(i).code(j).str(3) <= 'z'),
409							   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(3) - 'a';
410					      else tmpv2 = Contr.ord3.cnt(i).code(j).str(3) - '0'; end
411							if (Contr.ord3.cnt(i).code(j).str(4) >= 'a' & Contr.ord3.cnt(i).code(j).str(4) <= 'z'),
412							   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(4) - 'a';
413					      else tmpv3 = Contr.ord3.cnt(i).code(j).str(4) - '0'; end
414
415							Contr.ord3.cnt(i).code(j).pos = shift + FL(1).N_level*FL(2).N_level*FL(3).N_level + FL(1).N_level*FL(2).N_level*FL(4).N_level + ...
416						      FL(1).N_level * FL(2).N_level * FL(5).N_level + FL(1).N_level*FL(3).N_level*FL(4).N_level + FL(1).N_level * FL(3).N_level * FL(5).N_level + ...
417								FL(1).N_level * FL(4).N_level * FL(5).N_level + (tmpv1 - 1) * FL(3).N_level * FL(4).N_level + (tmpv2 - 1)* FL(4).N_level + tmpv3;
418
419							case 5, % BCE
420							if (Contr.ord3.cnt(i).code(j).str(2) >= 'a' & Contr.ord3.cnt(i).code(j).str(2) <= 'z'),
421								tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(2) - 'a';
422					      else tmpv1 = Contr.ord3.cnt(i).code(j).str(2) - '0'; end
423							if (Contr.ord3.cnt(i).code(j).str(3) >= 'a' & Contr.ord3.cnt(i).code(j).str(3) <= 'z'),
424							   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(3) - 'a';
425					      else tmpv2 = Contr.ord3.cnt(i).code(j).str(3) - '0'; end
426							if (Contr.ord3.cnt(i).code(j).str(5) >= 'a' & Contr.ord3.cnt(i).code(j).str(5) <= 'z'),
427							   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(5) - 'a';
428					      else tmpv3 = Contr.ord3.cnt(i).code(j).str(5) - '0'; end
429
430							Contr.ord3.cnt(i).code(j).pos = shift + FL(1).N_level*FL(2).N_level*FL(3).N_level + FL(1).N_level*FL(2).N_level*FL(4).N_level + ...
431						      FL(1).N_level*FL(2).N_level*FL(5).N_level + FL(1).N_level*FL(3).N_level*FL(4).N_level + ...
432								FL(1).N_level*FL(3).N_level*FL(5).N_level + FL(1).N_level*FL(4).N_level*FL(5).N_level + FL(2).N_level * FL(3).N_level * FL(4).N_level + ...
433								(tmpv1 - 1) * FL(3).N_level * FL(5).N_level + (tmpv2 - 1)* FL(5).N_level + tmpv3;
434
435					end	% switch Contr.ord3.cnt(i).idx3
436
437					case 4, % Do I want BDE here?
438					   if (Contr.ord3.cnt(i).idx3 == 5),
439						   if (Contr.ord3.cnt(i).code(j).str(2) >= 'a' & Contr.ord3.cnt(i).code(j).str(2) <= 'z'),
440								tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(2) - 'a';
441					      else tmpv1 = Contr.ord3.cnt(i).code(j).str(2) - '0'; end
442							if (Contr.ord3.cnt(i).code(j).str(4) >= 'a' & Contr.ord3.cnt(i).code(j).str(4) <= 'z'),
443							   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(4) - 'a';
444					      else tmpv2 = Contr.ord3.cnt(i).code(j).str(4) - '0'; end
445							if (Contr.ord3.cnt(i).code(j).str(5) >= 'a' & Contr.ord3.cnt(i).code(j).str(4) <= 'z'),
446							   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(5) - 'a';
447					      else tmpv3 = Contr.ord3.cnt(i).code(j).str(5) - '0'; end
448
449							Contr.ord3.cnt(i).code(j).pos = shift + FL(1).N_level*FL(2).N_level*FL(3).N_level + FL(1).N_level*FL(2).N_level*FL(4).N_level + ...
450						         FL(1).N_level*FL(2).N_level*FL(5).N_level + FL(1).N_level*FL(3).N_level*FL(4).N_level + ...
451								   FL(1).N_level*FL(3).N_level*FL(5).N_level + FL(1).N_level*FL(4).N_level*FL(5).N_level + ...
452									FL(2).N_level*FL(3).N_level*FL(4).N_level + FL(2).N_level*FL(3).N_level*FL(5).N_level + ...
453									(tmpv1 - 1) * FL(4).N_level * FL(5).N_level + (tmpv2 - 1)* FL(5).N_level + tmpv3;
454						else fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause;	end
455
456				end	% switch Contr.ord3.cnt(i).idx2
457			case 3,  % Do I want CDE here?
458			   if (Contr.ord3.cnt(i).idx1 == 3 & Contr.ord3.cnt(i).idx2 == 4 & Contr.ord3.cnt(i).idx3 == 5),
459				   if (Contr.ord3.cnt(i).code(j).str(3) >= 'a' & Contr.ord3.cnt(i).code(j).str(3) <= 'z'),
460						tmpv1 = 10 + Contr.ord3.cnt(i).code(j).str(3) - 'a';
461					else tmpv1 = Contr.ord3.cnt(i).code(j).str(2) - '0'; end
462					if (Contr.ord3.cnt(i).code(j).str(4) >= 'a' & Contr.ord3.cnt(i).code(j).str(4) <= 'z'),
463					   tmpv2 = 10 + Contr.ord3.cnt(i).code(j).str(4) - 'a';
464					else tmpv2 = Contr.ord3.cnt(i).code(j).str(4) - '0'; end
465					if (Contr.ord3.cnt(i).code(j).str(5) >= 'a' & Contr.ord3.cnt(i).code(j).str(4) <= 'z'),
466					   tmpv3 = 10 + Contr.ord3.cnt(i).code(j).str(5) - 'a';
467					else tmpv3 = Contr.ord3.cnt(i).code(j).str(5) - '0'; end
468
469					Contr.ord3.cnt(i).code(j).pos = shift + FL(1).N_level*FL(2).N_level*FL(3).N_level + FL(1).N_level*FL(2).N_level*FL(4).N_level + ...
470					   FL(1).N_level*FL(2).N_level*FL(5).N_level + FL(1).N_level*FL(3).N_level*FL(4).N_level + ...
471					   FL(1).N_level*FL(3).N_level*FL(5).N_level + FL(1).N_level*FL(4).N_level*FL(5).N_level + ...
472						FL(2).N_level*FL(3).N_level*FL(4).N_level + FL(2).N_level*FL(3).N_level*FL(5).N_level + ...
473							+ FL(2).N_level*FL(4).N_level*FL(5).N_level + (tmpv1 - 1) * FL(4).N_level * FL(5).N_level + (tmpv2 - 1)* FL(5).N_level + tmpv3;
474				else fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause;	end
475
476			case 4,
477			   fprintf('\nSomething is wrong in the contrast coding!\n');
478		      fprintf(2,'Halted: Ctrl+c to exit'); pause;
479		   end   % switch Contr.ord3.cnt(i).idx1
480
481			count = 0;
482		   for (ll = 1:1:n)  % Should have a more decent way to do this in a matrix fashion instead of a lenthy loop?
483		      tmpstr1 = char (group{Contr.ord3.cnt(i).idx1}(ll));
484				tmpstr2 = char (group{Contr.ord3.cnt(i).idx2}(ll));
485				tmpstr3 = char (group{Contr.ord3.cnt(i).idx3}(ll));
486				if strcmp(tmpstr1, FL(Contr.ord3.cnt(i).idx1).level(tmpv1).expr) & strcmp(tmpstr2, FL(Contr.ord3.cnt(i).idx2).level(tmpv2).expr) ...
487				   & strcmp(tmpstr3, FL(Contr.ord3.cnt(i).idx3).level(tmpv3).expr)
488			      count = count + 1;   % total number of occurences at tmpv-th level
489			   end
490			end
491		   Contr.ord3.cnt(i).vec = Contr.ord3.cnt(i).vec + Contr.ord3.cnt(i).coef(j) * dmat(:, Contr.ord3.cnt(i).code(j).pos)'/count;
492		   Contr.ord3.cnt(i).scalar = Contr.ord3.cnt(i).scalar + Contr.ord3.cnt(i).coef(j)*Contr.ord3.cnt(i).coef(j)/count;    % For variance coef: j-th term in i-th 3rd-order contrast.
493
494%		   Contr.ord3.cnt(i).scalar = tmp * Contr.ord3.cnt(i).coef*Contr.ord3.cnt(i).coef';
495%		   Contr.ord3.cnt(i).vec = Contr.ord3.cnt(i).vec + Contr.ord3.cnt(i).coef(j) * dmat(:, Contr.ord3.cnt(i).code(j).pos)';
496      end	% for (j = 1:1:Contr.ord3.cnt(i).NT)
497%	   Contr.ord3.cnt(i).vec = Contr.ord3.cnt(i).vec*tmp;   % assuming balanced design!!!
498   end   %for (i = 1:1:Contr3.tot)
499
500case 4,
501
502   shift = 1 + num_col(1) + num_col(2) + num_col(3);   % skip grand mean, factor means and 2nd-roder terms
503   for (i = 1:1:Contr.ord4.tot),
504   % for the  non-zero indices
505	   Contr.ord4.cnt(i).vec = zeros(1, n);  % n = ntot in anovan.m: total number of input files, and no. of arrows in dmat
506	   Contr.ord4.cnt(i).scalar = 0;
507		for (j = 1:1:Contr.ord4.cnt(i).NT),   % for each term in a contrast
508         first = 0;
509		   Contr.ord4.cnt(i).code(j).pos = 0;
510
511		   for (k = 1:1:NF),
512            if (Contr.ord4.cnt(i).code(j).str(k) >= 'a' & Contr.ord4.cnt(i).code(j).str(k) <= 'z'),
513				   tmpv = 10 + Contr.ord4.cnt(i).code(j).str(k) - 'a';
514			   else tmpv = Contr.ord4.cnt(i).code(j).str(k) - '0'; end
515
516			   if (tmpv ~= 0),
517	            first = first + 1;  % the first non-zero index
518					% Maybe I should replace all idx with idx() in *.m and Contr.ord4.cnt(i).idx(first) = k when first ~= 0 later?
519				   switch first
520					case 1,
521				      Contr.ord4.cnt(i).idx1 = k;
522		         case 2,
523				      Contr.ord4.cnt(i).idx2 = k;
524				   case 3,
525				      Contr.ord4.cnt(i).idx3 = k;
526					case 4,
527					   Contr.ord4.cnt(i).idx4 = k;
528					end
529		      end  % if (tmpv ~= 0)
530	      end  % for (k = 1:1:NF)
531		   switch Contr.ord4.cnt(i).idx1
532		   case 1,
533			   switch Contr.ord4.cnt(i).idx2
534				case 2,
535				   switch Contr.ord4.cnt(i).idx3
536					case 3,
537						switch Contr.ord4.cnt(i).idx4
538						case 4,	% ABCD
539
540							if (Contr.ord4.cnt(i).code(j).str(1) >= 'a' & Contr.ord4.cnt(i).code(j).str(1) <= 'z'),
541								tmpv1 = 10 + Contr.ord4.cnt(i).code(j).str(1) - 'a';
542					      else tmpv1 = Contr.ord4.cnt(i).code(j).str(1) - '0'; end
543							if (Contr.ord4.cnt(i).code(j).str(2) >= 'a' & Contr.ord4.cnt(i).code(j).str(2) <= 'z'),
544							   tmpv2 = 10 + Contr.ord4.cnt(i).code(j).str(2) - 'a';
545					      else tmpv2 = Contr.ord4.cnt(i).code(j).str(2) - '0'; end
546							if (Contr.ord4.cnt(i).code(j).str(3) >= 'a' & Contr.ord4.cnt(i).code(j).str(3) <= 'z'),
547							   tmpv3 = 10 + Contr.ord4.cnt(i).code(j).str(3) - 'a';
548					      else tmpv3 = Contr.ord4.cnt(i).code(j).str(3) - '0'; end
549							if (Contr.ord4.cnt(i).code(j).str(4) >= 'a' & Contr.ord4.cnt(i).code(j).str(4) <= 'z'),
550							   tmpv4 = 10 + Contr.ord4.cnt(i).code(j).str(4) - 'a';
551					      else tmpv4 = Contr.ord4.cnt(i).code(j).str(4) - '0'; end
552
553							Contr.ord4.cnt(i).code(j).pos = shift + (tmpv1 - 1) * FL(2).N_level * FL(3).N_level * FL(4).N_level + ...
554					         (tmpv2 - 1) * FL(3).N_level * FL(4).N_level + (tmpv3 - 1) * FL(4).N_level + tmpv4;
555
556						case 5, % ABCE
557						   if (Contr.ord4.cnt(i).code(j).str(1) >= 'a' & Contr.ord4.cnt(i).code(j).str(1) <= 'z'),
558								tmpv1 = 10 + Contr.ord4.cnt(i).code(j).str(1) - 'a';
559					      else tmpv1 = Contr.ord4.cnt(i).code(j).str(1) - '0'; end
560							if (Contr.ord4.cnt(i).code(j).str(2) >= 'a' & Contr.ord4.cnt(i).code(j).str(2) <= 'z'),
561							   tmpv2 = 10 + Contr.ord4.cnt(i).code(j).str(2) - 'a';
562					      else tmpv2 = Contr.ord4.cnt(i).code(j).str(2) - '0'; end
563							if (Contr.ord4.cnt(i).code(j).str(3) >= 'a' & Contr.ord4.cnt(i).code(j).str(3) <= 'z'),
564							   tmpv3 = 10 + Contr.ord4.cnt(i).code(j).str(3) - 'a';
565					      else tmpv3 = Contr.ord4.cnt(i).code(j).str(3) - '0'; end
566							if (Contr.ord4.cnt(i).code(j).str(5) >= 'a' & Contr.ord4.cnt(i).code(j).str(5) <= 'z'),
567							   tmpv4 = 10 + Contr.ord4.cnt(i).code(j).str(5) - 'a';
568					      else tmpv4 = Contr.ord4.cnt(i).code(j).str(5) - '0'; end
569
570							Contr.ord4.cnt(i).code(j).pos = shift + FL(1).N_level * FL(2).N_level * FL(3).N_level * FL(4).N_level + ...
571					         (tmpv1 - 1) * FL(2).N_level * FL(3).N_level * FL(5).N_level + (tmpv2 - 1) * FL(3).N_level * FL(5).N_level + ...
572								(tmpv3 - 1) * FL(5).N_level + tmpv4; % ABCD
573						end  % switch Contr.ord4.cnt(i).idx4
574					case 4,
575					   if (Contr.ord4.cnt(i).idx4 == 5)
576						   if (Contr.ord4.cnt(i).code(j).str(1) >= 'a' & Contr.ord4.cnt(i).code(j).str(1) <= 'z'),
577								tmpv1 = 10 + Contr.ord4.cnt(i).code(j).str(1) - 'a';
578					      else tmpv1 = Contr.ord4.cnt(i).code(j).str(1) - '0'; end
579							if (Contr.ord4.cnt(i).code(j).str(2) >= 'a' & Contr.ord4.cnt(i).code(j).str(2) <= 'z'),
580							   tmpv2 = 10 + Contr.ord4.cnt(i).code(j).str(2) - 'a';
581					      else tmpv2 = Contr.ord4.cnt(i).code(j).str(2) - '0'; end
582							if (Contr.ord4.cnt(i).code(j).str(4) >= 'a' & Contr.ord4.cnt(i).code(j).str(4) <= 'z'),
583							   tmpv3 = 10 + Contr.ord4.cnt(i).code(j).str(4) - 'a';
584					      else tmpv3 = Contr.ord4.cnt(i).code(j).str(4) - '0'; end
585							if (Contr.ord4.cnt(i).code(j).str(5) >= 'a' & Contr.ord4.cnt(i).code(j).str(5) <= 'z'),
586							   tmpv4 = 10 + Contr.ord4.cnt(i).code(j).str(5) - 'a';
587					      else tmpv4 = Contr.ord4.cnt(i).code(j).str(5) - '0'; end
588
589							Contr.ord4.cnt(i).code(j).pos = shift + FL(1).N_level * FL(2).N_level * FL(3).N_level * FL(4).N_level + ...
590					         FL(1).N_level * FL(2).N_level * FL(3).N_level * FL(5).N_level + ...
591								(tmpv1 - 1) * FL(2).N_level * FL(4).N_level * FL(5).N_level + (tmpv2 - 1) * FL(4).N_level * FL(5).N_level + ...
592								(tmpv3 - 1) * FL(5).N_level + tmpv4; % ABCD
593						else fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause;	end  % if (Contr.ord4.cnt(i).idx4 == 5)
594					end	% switch Contr.ord4.cnt(i).idx3
595				case 3,
596				   if (Contr.ord4.cnt(i).idx3 == 4 &  Contr.ord4.cnt(i).idx4 == 5), % ACDE
597						   if (Contr.ord4.cnt(i).code(j).str(1) >= 'a' & Contr.ord4.cnt(i).code(j).str(1) <= 'z'),
598								tmpv1 = 10 + Contr.ord4.cnt(i).code(j).str(1) - 'a';
599					      else tmpv1 = Contr.ord4.cnt(i).code(j).str(1) - '0'; end
600							if (Contr.ord4.cnt(i).code(j).str(3) >= 'a' & Contr.ord4.cnt(i).code(j).str(3) <= 'z'),
601							   tmpv2 = 10 + Contr.ord4.cnt(i).code(j).str(3) - 'a';
602					      else tmpv2 = Contr.ord4.cnt(i).code(j).str(3) - '0'; end
603							if (Contr.ord4.cnt(i).code(j).str(4) >= 'a' & Contr.ord4.cnt(i).code(j).str(4) <= 'z'),
604							   tmpv3 = 10 + Contr.ord4.cnt(i).code(j).str(4) - 'a';
605					      else tmpv3 = Contr.ord4.cnt(i).code(j).str(4) - '0'; end
606							if (Contr.ord4.cnt(i).code(j).str(5) >= 'a' & Contr.ord4.cnt(i).code(j).str(5) <= 'z'),
607							   tmpv4 = 10 + Contr.ord4.cnt(i).code(j).str(5) - 'a';
608					      else tmpv4 = Contr.ord4.cnt(i).code(j).str(5) - '0'; end
609
610							Contr.ord4.cnt(i).code(j).pos = shift + FL(1).N_level * FL(2).N_level * FL(3).N_level * FL(4).N_level + ...
611					         FL(1).N_level * FL(2).N_level * FL(3).N_level * FL(5).N_level + FL(1).N_level * FL(2).N_level * FL(4).N_level * FL(5).N_level + ...
612								(tmpv1 - 1) * FL(3).N_level * FL(4).N_level * FL(5).N_level + (tmpv2 - 1) * FL(4).N_level * FL(5).N_level + ...
613								(tmpv3 - 1) * FL(5).N_level + tmpv4; % ABCD
614					else fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause;	end
615				end  % switch Contr.ord4.cnt(i).idx2
616			case 2,
617			   if (Contr.ord4.cnt(i).idx2 == 3 & Contr.ord4.cnt(i).idx3 == 4 & Contr.ord4.cnt(i).idx4 == 5),  % BCDE
618						   if (Contr.ord4.cnt(i).code(j).str(2) >= 'a' & Contr.ord4.cnt(i).code(j).str(2) <= 'z'),
619								tmpv1 = 10 + Contr.ord4.cnt(i).code(j).str(2) - 'a';
620					      else tmpv1 = Contr.ord4.cnt(i).code(j).str(2) - '0'; end
621							if (Contr.ord4.cnt(i).code(j).str(3) >= 'a' & Contr.ord4.cnt(i).code(j).str(3) <= 'z'),
622							   tmpv2 = 10 + Contr.ord4.cnt(i).code(j).str(3) - 'a';
623					      else tmpv2 = Contr.ord4.cnt(i).code(j).str(3) - '0'; end
624							if (Contr.ord4.cnt(i).code(j).str(4) >= 'a' & Contr.ord4.cnt(i).code(j).str(4) <= 'z'),
625							   tmpv3 = 10 + Contr.ord4.cnt(i).code(j).str(4) - 'a';
626					      else tmpv3 = Contr.ord4.cnt(i).code(j).str(4) - '0'; end
627							if (Contr.ord4.cnt(i).code(j).str(5) >= 'a' & Contr.ord4.cnt(i).code(j).str(5) <= 'z'),
628							   tmpv4 = 10 + Contr.ord4.cnt(i).code(j).str(5) - 'a';
629					      else tmpv4 = Contr.ord4.cnt(i).code(j).str(5) - '0'; end
630
631							Contr.ord4.cnt(i).code(j).pos = shift + FL(1).N_level * FL(2).N_level * FL(3).N_level * FL(4).N_level + ...
632					         FL(1).N_level * FL(2).N_level * FL(3).N_level * FL(5).N_level + FL(1).N_level * FL(2).N_level * FL(4).N_level * FL(5).N_level + ...
633								FL(1).N_level * FL(3).N_level * FL(4).N_level * FL(5).N_level + (tmpv1 - 1) * FL(3).N_level * FL(4).N_level * FL(5).N_level + ...
634								(tmpv2 - 1) * FL(4).N_level * FL(5).N_level + (tmpv3 - 1) * FL(5).N_level + tmpv4; % ABCD
635				else fprintf('\nSomething is wrong in the contrast coding!\n'); fprintf(2,'Halted: Ctrl+c to exit'); pause;	end
636			case {3,4,}
637			   fprintf('\nSomething is wrong in the contrast coding!\n');
638		      fprintf(2,'Halted: Ctrl+c to exit'); pause;
639		   end   % switch Contr.ord4.cnt(i).idx1
640
641			count = 0;
642		   for (ll = 1:1:n)  % Should have a more decent way to do this in a matrix fashion instead of a lenthy loop?
643		      tmpstr1 = char (group{Contr.ord4.cnt(i).idx1}(ll));
644				tmpstr2 = char (group{Contr.ord4.cnt(i).idx2}(ll));
645				tmpstr3 = char (group{Contr.ord4.cnt(i).idx3}(ll));
646				tmpstr4 = char (group{Contr.ord4.cnt(i).idx4}(ll));
647				if strcmp(tmpstr1, FL(Contr.ord4.cnt(i).idx1).level(tmpv1).expr) & strcmp(tmpstr2, FL(Contr.ord4.cnt(i).idx2).level(tmpv2).expr) ...
648				   & strcmp(tmpstr3, FL(Contr.ord4.cnt(i).idx3).level(tmpv3).expr) & strcmp(tmpstr4, FL(Contr.ord4.cnt(i).idx4).level(tmpv4).expr)
649			      count = count + 1;   % total number of occurences at tmpv-th level
650			   end
651			end % for (ll = 1:1:n)
652		   Contr.ord4.cnt(i).vec = Contr.ord4.cnt(i).vec + Contr.ord4.cnt(i).coef(j) * dmat(:, Contr.ord4.cnt(i).code(j).pos)'/count;
653		   Contr.ord4.cnt(i).scalar = Contr.ord4.cnt(i).scalar + Contr.ord4.cnt(i).coef(j)*Contr.ord4.cnt(i).coef(j)/count;    % For variance coef: j-th term in i-th 4th-order contrast.
654      end	% for (j = 1:1:Contr.ord4.cnt(i).NT)
655   end   %for (i = 1:1:Contr4.tot)
656
657end % switch order
658
659err = 0;
660return;
661