~ubuntu-branches/ubuntu/utopic/mricron/utopic

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.