1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
|
unit prefs;
{$H+}
interface
uses
inifiles, define_types,SysUtils,classes;
type
TPrefs = record
UnusedBool: boolean;
Test, Permutations,CritPct: integer;
end;
const
knotest = 0; //no test specified
kltest = 1;//binomial Liebermeister test
kttest = 2; //t-test
kbmtest = 4;//Bruneer-Mnuzel test
klrtest = 8; //logisitic regression test
//procedure ReadIni(var lIniName: string; var lPrefs: TPrefs);
procedure SetDefaultPrefs (var lPrefs: TPrefs);
//procedure SaveIni (var lIniName: string; var lPrefs: TPrefs);
//procedure CorrectPrefs (var lPrefs: TPrefs); //ensures only usable file types are created
procedure ReadParamStr;
implementation
uses nifti_img, hdr,nifti_hdr;
procedure Msg(lStr: string);
begin
//
end;
procedure SetDefaultPrefs (var lPrefs: TPrefs);
begin
lPrefs.unusedbool := true;
lPrefs.Test := knotest;
lPrefs.Permutations := 0;
lPrefs.CritPct := 0;
end;
function CheckBool (lPref, lFlag: integer): boolean;
//check if Flag is ni lPref. For example, if Flag is 1 then returns true for all odd lPrefs
begin
result := (lPref and lFlag) = lFlag;
end;
function DoLesion (lPrefs: TPrefs): boolean;
label
666;
const
kSimSampleSize = 64;
knSim = 100;
kCrit = 3;
var
//lBinomial: boolean;
lSim,lFact,lnFactors,lSubj,lnSubj,lnSubjAll,lMaskVoxels,lnCrit,lnControlObservations: integer;
lPartImageNames,lImageNames,lImageNamesAll: TStrings;
lPredictorList: TStringList;
lTemp4D,lMaskname,lOutName,lFactname,lOutNameSim: string;
lMaskHdr: TMRIcroHdr;
lMultiSymptomRA,lSymptomRA,lPartSymptomRA,lControlSymptomRA: singleP;
begin
result := false;
//lBinomial := not odd( (Sender as tMenuItem).tag);
if (not CheckBool(lPrefs.test ,kltest)) and (not CheckBool(lPrefs.test, kttest)) and (not CheckBool(lPrefs.test, kbmtest)) then begin
Msg('Error: you need to compute at least on test [options/test menu]');
exit;
end;
lImageNamesAll:= TStringList.Create; //not sure why TStrings.Create does not work???
lImageNames:= TStringList.Create; //not sure why TStrings.Create does not work???
lPartImageNames := TStringList.Create;
getmem(lPartSymptomRA,kSimSampleSize*sizeof(single));
lnControlObservations := 20;
getmem(lControlSymptomRA,lnControlObservations*sizeof(single));
for lSim := 1 to lnControlObservations do
lControlSymptomRA[lSim] := 5;
//next, get 1st group
if not MainForm.GetVal(lnSubjAll,lnFactors,lMultiSymptomRA,lImageNamesAll,lnCrit,lBinomial,lPredictorList) then begin
showmessage('Error with VAL file');
goto 666;
end;
lTemp4D := MainForm.CreateDecompressed4D(lImageNamesAll);
if (lnSubjAll < 1) or (lnFactors < 1) then begin
Showmessage('Not enough subjects ('+inttostr(lnSubjAll)+') or factors ('+inttostr(lnFactors)+').');
goto 666;
end;
lMaskname := lImageNamesAll[0];
if not NIFTIhdr_LoadHdr(lMaskname,lMaskHdr) then begin
showmessage('Error reading 1st mask.');
goto 666;
end;
lMaskVoxels := ComputeImageDataBytes8bpp(lMaskHdr);
if (lMaskVoxels < 2) or (not MainForm.CheckVoxels(lMaskname,lMaskVoxels,0)){make sure there is uncompressed .img file} then begin
showmessage('Mask file size too small.');
goto 666;
end;
lOutName := ExtractFileDirWithPathDelim(lMaskName)+'results';
MainForm.SaveHdrDlg.Filename := loutname;
lOutName := lOutName+'.nii.gz';
if not MainForm.SaveHdrName ('Base Statistical Map', lOutName) then goto 666;
for lFact := 1 to lnFactors do begin
lImageNames.clear;
for lSubj := 1 to lnSubjAll do
{$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then {$ENDIF}
lImageNames.Add(lImageNamesAll[lSubj-1]);
lnSubj := lImageNames.Count;
if lnSubj > 1 then begin
getmem(lSymptomRA,lnSubj * sizeof(single));
lnSubj := 0;
for lSubj := 1 to lnSubjAll do
{$IFNDEF FPC}if lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)] <> NaN then begin
{$ELSE} begin{$ENDIF}
inc(lnSubj);
lSymptomRA^[lnSubj] := lMultiSymptomRA^[lSubj+((lFact-1)*lnSubjAll)];
end;
//randomization loop....
for lSim := 1 to knSim do begin
RandomGroup(kSimSampleSize, lImageNames,lSymptomRA, lPartImageNames, lPartSymptomRA);
lOutNameSim := AddIndexToFilename(lOutName,lSim);
lnCrit := kCrit;
MainForm.NPMMsgClear;
//Msg(GetKVers);
MainForm.NPMMsg('Threads: '+inttostr(gnCPUThreads));
lFactName := lPredictorList.Strings[lFact-1];
lFactName := MainForm.LegitFilename(lFactName,lFact);
MainForm.NPMMsg('Factor = '+lFactname);
For lSubj := 1 to kSimSampleSize do
MainForm.NPMMsg (lPartImageNames.Strings[lSubj-1] + ' = '+realtostr(lPartSymptomRA^[lSubj],2) );
MainForm.NPMMsg('Total voxels = '+inttostr(lMaskVoxels));
MainForm.NPMMsg('Only testing voxels damaged in at least '+inttostr(lnCrit)+' individual[s]');
MainForm.NPMMsg('Number of Lesion maps = '+inttostr(kSimSampleSize));
if not MainForm.CheckVoxelsGroup(lPartImageNames,lMaskVoxels) then begin
showmessage('File dimensions differ from mask.');
goto 666;
end;
if lBinomial then
MainForm.LesionNPMAnalyzeBinomial(lPartImageNames,lMaskHdr,lnCrit,lPartSymptomRA,lFactname,lOutNameSim)
else begin
MainForm.ReportDescriptives(lPartSymptomRA,lnSubj);
//LesionNPMAnalyze2(lImageNames,lMaskHdr,lnCrit,-1,lSymptomRA,lFactName,lOutname);
LesionNPMAnalyze2(lPartImageNames,lMaskHdr,lnCrit,lSim{-1},MainForm.ReadPermute,lPartSymptomRA,lFactName,lOutNameSim,lTTest,lBM);
end;
end; //for each simulation...
Freemem(lSymptomRA);
end; //lnsubj > 1
end; //for each factor
if lnSubjAll > 0 then begin
Freemem(lMultiSymptomRA);
end;
result := true;
666:
lPartImageNames.free;
lImageNames.Free;
lImageNamesAll.Free;
lPredictorList.Free;
freemem(lPartSymptomRA);
MainForm.DeleteDecompressed4D(lTemp4D);
end;
procedure ReadParamStr;
var
lStr: String;
I,lError: integer;
//lResult,lHelpShown : boolean;
lCommandChar: Char;
//I,lError: integer;
lSingle: single;
//lOrigWinWid,lOrigWinCen: Integer;*)
lPrefs: TPrefs;
begin
SetDefaultPrefs(lPrefs);
lStr := paramstr(0);
lStr := extractfilename(lStr);
lStr := string(StrUpper(PChar(lStr))) ;
{$IFDEF PNG}
if (lStr = 'DCM2PNG.EXE') then
gOutputFormat := kPNG;
{$ENDIF}
if (ParamCount > 0) then begin
I := 0;
repeat
lStr := '';
repeat
inc(I);
if I = 1 then
lStr := ParamStr(I)
else begin
if lStr <> '' then
lStr := lStr +' '+ ParamStr(I)
else
lStr := ParamStr(I);
end;
if (length(lStr)>1) and (lStr[1] = '-') and (ParamCount > I) then begin //special command
//-z= zoom, -f= format [png,jpeg,bmp], -o= output directory
lCommandChar := UpCase(lStr[2]);
inc(I);
lStr := ParamStr(I);
lStr := string(StrUpper(PChar(lStr))) ;
case lCommandChar of
'C','P','T': begin //CritPct
Val(lStr,lSingle,lError);
if lError = 0 then begin
if lCommandChar = 'C' then
lPrefs.CritPct := round(lSingle)
else if lCOmmandChar = 'P' then
lPrefs.Permutations := round(lSingle)
else if lCOmmandChar = 'T' then
lPrefs.Test := round(lSingle);
end; //not lError
end; //C= CritPct
end; //case lStr[2]
lStr := '';
end; //special command
until (I=ParamCount) or (fileexists(lStr)) {or (gAbort)};
if fileexists(lStr) then begin
//lStr := GetLongFileName(lStr);
xxx
end else if not (gSilent) then begin
MyWriteln('0 dcm2jpg ERROR: unable to find '+lStr);
if lHelpShown then
MyReadln
else
Showhelp;
lHelpShown := true;
end;
until I >= ParamCount;
end else begin
//begin test routines....
(*
lStr := 'D:\yuv2.dcm';
ResetDCMvalues;
lOrigWinWid := gWinWid;
lOrigWinCen := gWinCen;
LoadData(lStr);
gWinWid := lOrigWinWid;
gWinCen := lOrigWinCen;
//...end test routines(**)
ShowHelp;
end;{param count > 0}
end;
end.
|