~ubuntu-branches/ubuntu/trusty/mricron/trusty

« back to all changes in this revision

Viewing changes to nifti_img_view.pas

  • Committer: Bazaar Package Importer
  • Author(s): Michael Hanke
  • Date: 2010-08-22 08:32:25 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20100822083225-lt6kc7smjq5hexmp
Tags: 0.20100820.1~dfsg.1-1
* New upstream code.
* Add patch to identify the Debian package version as such in the 'About'
  dialog.
* Bumped Standards-version to 3.9.1, no changes necessary.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
unit nifti_img_view;
2
2
 
3
3
interface
4
 
{$IFDEF Unix}
5
 
  {$DEFINE noCOMPILEYOKE}
6
 
{$ENDIF}
 
4
 
 
5
{$DEFINE COMPILEYOKE}
 
6
 
7
7
uses
8
8
{$H+}
9
 
{$IFDEF Darwin}
10
 
CarbonOpenDoc,
11
 
 
12
 
{$ENDIF}
 
9
{$IFDEF Darwin}CarbonOpenDoc,{$ENDIF}
13
10
{$IFDEF Unix}
14
 
lclintf,LCLType,//gettickcount ,LMessages
15
 
{$ELSE}
16
 
Windows,ShellAPI,
17
 
{$ENDIF}
18
 
{$IFNDEF FPC} E_memmap,RXSpin,capmenu,Math,ToolWin,Messages,
19
 
{$ELSE}
20
 
LResources,
21
 
{$ENDIF}
22
 
 fx8,cpucount,
23
 
SysUtils, Classes, Graphics, Controls, Forms, Dialogs,Menus,ComCtrls, ExtCtrls,
24
 
 StdCtrls, GraphicsMathLibrary,ClipBrd,define_types, Spin,Buttons,
25
 
nifti_hdr,nifti_hdr_view,nifti_img,     voismooth,
26
 
IniFiles,ReadInt,registry,stat,Distr,bet,mni,prefs,CropEdges,userdir,graphx,
27
 
GraphType,IntfGraphics, landmarks;
28
 
 
29
 
{$IFDEF UNIX}
30
 
type
 
11
  lclintf,LCLType,//gettickcount ,LMessages
 
12
{$ELSE}
 
13
  Windows,ShellAPI,
 
14
{$ENDIF}
 
15
{$IFDEF COMPILEYOKE}
 
16
yokeipc,
 
17
{$ENDIF}
 
18
 
 
19
LResources, fx8, cpucount, SysUtils, Classes, Graphics, Controls, Forms,
 
20
Dialogs, Menus, ComCtrls, ExtCtrls, StdCtrls, GraphicsMathLibrary, ClipBrd,
 
21
define_types, Spin, Buttons, nifti_hdr, nifti_hdr_view, nifti_img, voismooth,
 
22
IniFiles, ReadInt, registry, simpleipc, stat, Distr, bet, mni, prefs, CropEdges,
 
23
userdir, graphx, GraphType, IntfGraphics, landmarks;
 
24
 
 
25
{$IFDEF COMPILEYOKE}
 
26
{type
31
27
  PINtBuffer = ^TIntBuffer;
32
 
  TIntBuffer = Array[0..6] of single;
 
28
  TIntBuffer = Array[0..6] of single;}
33
29
{$ENDIF}
34
30
type
35
31
 
90
86
        Pen1: TMenuItem;
91
87
        Penautoclose1: TMenuItem;
92
88
        CircleSquare1: TMenuItem;
 
89
SimpleIPCClient1: TSimpleIPCClient;
 
90
SimpleIPCServer1: TSimpleIPCServer;
93
91
        YokeTimer: TTimer;
94
92
        XViewEdit: TSpinEdit;
95
93
        YViewEdit: TSpinEdit;
134
132
        N100transparent1: TMenuItem;
135
133
        Layerrange1: TMenuItem;
136
134
        Noneopen2: TMenuItem;
137
 
 
138
135
        BGAdditive: TMenuItem;
139
136
        OverlayAdditive: TMenuItem;
140
 
 
141
137
        ShowRender: TMenuItem;
142
138
        DrawMenu: TMenuItem;
143
139
        OpenVOI: TMenuItem;
146
142
        VOIColor: TMenuItem;
147
143
        TriplePanel: TScrollBox;
148
144
        PGImageCor: TImage;
149
 
 
150
 
 
151
 
 
152
 
 
153
 
 
154
 
 
155
145
        Undo1: TMenuItem;
156
146
        Paste1: TMenuItem;
157
147
        Applyintensityfiltertovolume1: TMenuItem;
172
162
        Chisquare1: TMenuItem;
173
163
        Convert1: TMenuItem;
174
164
        ROIVOI1: TMenuItem;
175
 
 
176
165
        Statistics1: TMenuItem;
177
166
        ShowMultislice: TMenuItem;
178
167
        DescriptiveMenuItem: TMenuItem;
179
 
 
180
 
 
181
168
        N1: TMenuItem;
182
169
        HideROIBtn: TSpeedButton;
183
170
        XBarBtn: TSpeedButton;
230
217
procedure MNIMenuClick(Sender: TObject);
231
218
procedure N4DTraces1Click(Sender: TObject);
232
219
procedure NIIVOIClick(Sender: TObject);
233
 
//procedure OptimizeViewClick(Sender: TObject);
234
220
procedure PGImageCorDblClick(Sender: TObject);
235
221
procedure Preferences1Click(Sender: TObject);
236
222
procedure RescaleMenuClick(Sender: TObject);
237
223
procedure Resliceimage1Click(Sender: TObject);
238
224
procedure SaveasNIfTI1Click(Sender: TObject);
239
225
procedure SaveDialog1Close(Sender: TObject);
 
226
procedure SimpleIPCServer1Message(Sender: TObject);
240
227
procedure UpdateColorSchemes;
241
228
        procedure UpdateTemplates;
242
229
        procedure UpdateMRU;
259
246
        procedure FormClose(Sender: TObject);
260
247
 
261
248
 {$ENDIF}
262
 
procedure MagnifyTimerTimer(Sender: TObject);
 
249
         procedure MagnifyTimerTimer(Sender: TObject);
263
250
        procedure MagnifyPanelResize(Sender: TObject);
264
251
        procedure PGImageMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
265
252
        procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
272
259
          Shift: TShiftState; X, Y: Integer);
273
260
        procedure LUTdropLoad(var lLayer: integer);
274
261
        procedure LUTdropSelect(Sender: TObject);
275
 
procedure ZoomDropChange(Sender: TObject);
 
262
        procedure ZoomDropChange(Sender: TObject);
276
263
        procedure ZoomDropSelect(Sender: TObject);
277
264
        procedure ColorBarBtnMouseDown(Sender: TObject; Button: TMouseButton;
278
265
          Shift: TShiftState; X, Y: Integer);
279
 
        //procedure OptimizeViewMenuItemClick(Sender: TObject);
280
266
        procedure Saveaspicture1Click(Sender: TObject);
281
267
        procedure XBarBtnClick(Sender: TObject);
282
268
        procedure XBarBtnMouseUp(Sender: TObject; Button: TMouseButton;
283
269
          Shift: TShiftState; X, Y: Integer);
284
 
 procedure XBarBtnMouseDown(Sender: TObject; Button: TMouseButton;
 
270
        procedure XBarBtnMouseDown(Sender: TObject; Button: TMouseButton;
285
271
          Shift: TShiftState; X, Y: Integer);
286
272
        procedure AutoContrastBtnClick(Sender: TObject);
287
273
        procedure RefreshImagesTimerTimer(Sender: TObject);
349
335
        procedure SaveOrCopyImages(lCopy: boolean);
350
336
 private
351
337
        { Private declarations }
352
 
{$IFNDEF FPC}
353
 
    EMemMap : TEMemMap;
354
 
        procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
355
 
        procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
356
 
{$ENDIF}
357
338
{$IFDEF COMPILEYOKE}
358
 
    FShmId : Integer;
359
 
    FSharePtr : Pointer;
360
 
    gShareIntBuf: PIntBuffer;
 
339
 //   gShareIntBuf: PIntBuffer;
361
340
{$ENDIF}
362
341
{$IFDEF FPC} function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;MousePos: TPoint): Boolean; override;{$ENDIF}
363
342
  public
457
436
 
458
437
 
459
438
procedure TImgForm.CloseShareMem;
460
 
var
461
 
   lInstances: single;
462
439
begin
463
 
{$IFNDEF FPC}
464
 
  EMemMap.Free;
465
 
{$ENDIF}
466
440
{$IFDEF COMPILEYOKE}
467
 
  //shared memory release START
468
 
  gShareIntBuf^[0] := gShareIntBuf^[0] -1;
469
 
  lInstances := gShareIntBuf^[0];
470
 
  if Assigned (FSharePtr) then
471
 
    shmdt (FSharePtr);
472
 
  //if FOwnShm then      zssss
473
 
  if lInstances = 0 then begin
474
 
    //last running instance - close shared memory
475
 
    if shmctl (FShmId, IPC_RMID, nil) = -1 then
476
 
      raise Exception.Create (strerror (errno));
477
 
  end;
478
 
  //shared memory release END
 
441
  SimpleIPCServer1.active := false;
 
442
  SimpleIPCClient1.active := false;
479
443
{$ENDIF}
480
444
end;
481
445
 
482
446
procedure TImgForm.SetShareMem (lXmm,lYmm,lZmm: single);
483
447
begin
484
 
{$IFNDEF FPC}
485
 
  if not gYoke then exit;
486
 
        EMemMap.EnterCriticalSection;
487
 
        Try
488
 
          SingleArrPtr(EMemMap.MemMap)^[1]:=(lXmm);
489
 
          SingleArrPtr(EMemMap.MemMap)^[2]:=(lYmm);
490
 
          SingleArrPtr(EMemMap.MemMap)^[3]:=(lZmm);
491
 
        Finally
492
 
          EMemMap.LeaveCriticalSection;
493
 
        end;
494
 
{$ENDIF}
495
448
{$IFDEF COMPILEYOKE}
496
 
  begin
497
 
    gShareIntBuf^[1] := (lXmm);
498
 
    gShareIntBuf^[2] := (lYmm);
499
 
    gShareIntBuf^[3] := (lZmm);
500
 
end;
 
449
  if not gYoke then
 
450
         exit;
 
451
        SendIPCFloats(SimpleIPCClient1,lXmm,lYmm,lZmm);
501
452
{$ENDIF}
502
453
end;
503
454
 
504
455
procedure TImgForm.CreateShareMem;
505
 
{$IFDEF FPC}
506
 
{$IFDEF COMPILEYOKE}
507
 
begin
508
 
  //shared memory acquire START
509
 
  // create key
510
 
  Key := getUID;
511
 
  Key := ftok (PChar(GetModuleName(0)),Key  {1}); //use UserID so each user gets separate pool of shared memory
512
 
  // try to open existing shared memory
513
 
  FShmId := shmget (Key, 0, 0);
514
 
  if FShmId = -1 then
515
 
  begin
516
 
    // doesn't exist, create it
517
 
    FShmId := shmget (Key, kShareSegmentSize,
518
 
      IPC_CREAT or IPC_EXCL or AccessMode);
519
 
    if FShmId = -1 then
520
 
      raise Exception.Create (strerror (errno));
521
 
    lFOwnShm := true;
522
 
  end
523
 
  else
524
 
    lFOwnShm := false;
525
 
  // attach to shared memory
526
 
  FSharePtr := shmat (FShmId, nil, 0);
527
 
  if Integer(FSharePtr) = -1 then
528
 
  begin
529
 
    FSharePtr := nil;
530
 
    raise Exception.Create (strerror (errno));
531
 
  end;
532
 
  gShareIntBuf := FSharePtr;
533
 
  if lFOwnShm then
534
 
       gShareIntBuf^[0] := 0;
535
 
  gShareIntBuf^[0] := gShareIntBuf^[0]+1;
536
 
  SetShareMem (gXProj,gYProj,gZProj);
537
 
 
538
 
end;
539
 
{$ELSE}
540
 
begin
541
 
    //CompileYoke not set
542
 
end;
543
 
{$ENDIF}
544
 
{$ELSE}//not FPC - must be Delphi
545
 
var
546
 
 IArr    : SingleArrPtr;
547
 
 I: integer;
548
 
begin
549
 
  EMemMap:=TEMemMap.Create(Self);
550
 
  EMemMap.CreateMutex('MRICROMUTEX2');
551
 
  If NOT EMemMap.MapExisting('MRICROMAP2',SizeOf(SingleArr)) then begin
552
 
        New(IArr);
553
 
        For I:=1 To kYokeItems do
554
 
          IArr^[I]:=0;
555
 
        Try
556
 
          If NOT EMemMap.CreateMemMap('MRICROMAP2',SizeOf(SingleArr),IArr^) then
557
 
                EMemMap.RaiseMappingException;
558
 
        Finally
559
 
          Dispose(IArr);
560
 
        end;
561
 
         SetShareMem (0,0,0)
562
 
  end;
563
 
end;
564
 
{$ENDIF} //Delphi
 
456
begin
 
457
     {$IFDEF COMPILEYOKE}
 
458
             startipcserver(SimpleIPCServer1,SimpleIPCClient1);
 
459
             SetShareMem (0,0,0);
 
460
     {$ENDIF}
 
461
end;
565
462
 
566
463
procedure TImgForm.YokeTimerTimer(Sender: TObject);
567
 
var
 
464
begin
 
465
  if not gYoke then
 
466
     YokeTimer.Enabled := false;
 
467
  {$IFDEF UNIX}
 
468
      if SimpleIPCServer1.Active then SimpleIPCServer1.PeekMessage(1,true);
 
469
  {$ENDIF}
 
470
end;
 
471
 
 
472
(*var
568
473
lXmm,lYmm,lZmm: single;
569
474
lX,lY,lZ: integer;
570
475
begin
571
 
caption := inttostr(888);
572
476
        if not gYoke then begin
573
477
                YokeTimer.Enabled := false;
574
478
                exit;
600
504
        if lY <> YViewEdit.value then YViewEdit.value := lY;
601
505
        if lZ <> ZViewEdit.value then ZViewEdit.value := lZ;
602
506
    YokeTimer.Enabled := false;
603
 
end;
 
507
end;  *)
604
508
 
605
509
{$IFNDEF FPC}
606
510
procedure TImgForm.WMSysCommand;
1238
1142
  ApplySaveDlgFilter(SaveDialog1);
1239
1143
end;
1240
1144
 
 
1145
procedure TImgForm.SimpleIPCServer1Message(Sender: TObject);
 
1146
var
 
1147
   lX,lY,lZ: integer;
 
1148
   lXmm,lYmm,lZmm: single;
 
1149
begin
 
1150
  if not gYoke then
 
1151
     exit;
 
1152
  if not GetIPCFloats(SimpleIPCServer1.StringMessage, lXmm,lYmm,lZmm) then
 
1153
     exit;
 
1154
  MMToImgCoord(lX,lY,lZ,lXmm,lYmm,lZmm);
 
1155
  if lX <> XViewEdit.value then XViewEdit.value := lX;
 
1156
  if lY <> YViewEdit.value then YViewEdit.value := lY;
 
1157
  if lZ <> ZViewEdit.value then ZViewEdit.value := lZ;
 
1158
  XViewEditChange(nil);
 
1159
    {$IFDEF UNIX}
 
1160
      if SimpleIPCServer1.Active then SimpleIPCServer1.PeekMessage(1,true);
 
1161
  {$ENDIF}
 
1162
end;
 
1163
 
1241
1164
procedure Add2MRU (var lNewFilename: string); //add new file to most-recent list
1242
1165
var
1243
1166
  lStr: string;
1770
1693
                lIntenStr[lLen-1] := ' ';
1771
1694
        //StatusLabel.Caption := realtostr(lXmm,0)+'x'+realtostr(lYmm,0)+'x'+realtostr(lZmm,0)+'= '+lIntenStr;
1772
1695
        Caption := realtostr(lXmm,0)+'x'+realtostr(lYmm,0)+'x'+realtostr(lZmm,0)+'= '+lIntenStr;
1773
 
 
1774
 
//      SetShareMem (lXmm,lYmm,lZmm);
 
1696
        SetShareMem (lXmm,lYmm,lZmm);
1775
1697
end;
1776
1698
 
1777
1699
procedure TImgForm.XViewEditChange(Sender: TObject);
1965
1887
end; //sortLTRB
1966
1888
 
1967
1889
procedure DrawEllipse (lImage: TImage;lRect: TRect; lShift: TShiftState; lPanel: integer);
 
1890
var
 
1891
   i: integer;
1968
1892
begin
1969
1893
   ScaleBMP2Draw(gBGImg.VOIInvZoom, lRect.Left,lRect.Top,lPanel,Limage);
1970
1894
   ScaleBMP2Draw(gBGImg.VOIInvZoom, lRect.Right,lRect.Bottom,lPanel,lImage);
 
1895
   if ssShift in lShift then
 
1896
      i := 0
 
1897
   else
 
1898
       i := kVOI8bit;
1971
1899
   if (ssCtrl in lShift) then
1972
 
      FillRectFX8(gDrawImg,lRect.Left,lRect.Top,lRect.Right,lRect.Bottom,kVOI8bit)
 
1900
      FillRectFX8(gDrawImg,lRect.Left,lRect.Top,lRect.Right,lRect.Bottom,i)
1973
1901
   else
1974
 
        FillEllipseFX8(gDrawImg,lRect.Left,lRect.Top,lRect.Right,lRect.Bottom,kVOI8bit);
 
1902
        FillEllipseFX8(gDrawImg,lRect.Left,lRect.Top,lRect.Right,lRect.Bottom,i);
1975
1903
end; //DrawEllipse
1976
1904
 
1977
1905
 
2528
2456
     end;
2529
2457
     if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then
2530
2458
        exit;
2531
 
     TextForm.Memo1.Lines.add(' Custom Region Analysis');
2532
 
     TextForm.Memo1.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label');
 
2459
     TextForm.MemoT.Lines.add(' Custom Region Analysis');
 
2460
     TextForm.MemoT.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label');
2533
2461
     lVOI := IsVOIROIExt(gMRIcroOverlay[lOverlayNum].HdrFileName);
2534
2462
     if (not lVOI) and (lOverlayNum = kVOIOverlayNum) then
2535
2463
        lVOI := true;
2539
2467
     else
2540
2468
         lLabelStr := ' ';
2541
2469
     if lVOI then //intensity min/max position are not important
2542
 
        TextForm.Memo1.Lines.add(lLabelStr+'Area,N>0,%N>0')
 
2470
        TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0')
2543
2471
     else
2544
 
         TextForm.Memo1.Lines.add(lLabelStr+'Area,N>0,%N>0,Sum>0,Mean>0,Max,MaxX,MaxY,MaxZ');
 
2472
         TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0'+kTextSep+'Sum>0'+kTextSep+'Mean>0'+kTextSep+'Max'+kTextSep+'MaxX'+kTextSep+'MaxY'+kTextSep+'MaxZ');
2545
2473
   //next initialize
2546
2474
   if lShowFilename then
2547
 
      lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+','
 
2475
      lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+kTextSep
2548
2476
   else
2549
2477
       lLabelStr := '';
2550
2478
     for lInc := 0 to kHistoBins do begin
2589
2517
            lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]);
2590
2518
            lLocalSum[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalSum[lInc]);
2591
2519
            ImgPosToMM(lLocalMaxPos[lInc], lXmm,lYmm,lZmm);
2592
 
            TextForm.Memo1.Lines.Add(lLabelStr+ lLabelStr20[lInc] + ', ' + inttostr(lHisto[lInc])+','+floattostr( lHisto[lInc]/lRegionVol[lInc])
2593
 
               +','+floattostr( lLocalSum[lInc])+','+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0
2594
 
               +', ' + floattostr(lLocalMax[lInc])+','+floattostr(lXmm)+','+floattostr(lYmm)+','+floattostr(lZmm) );
 
2520
            TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] + kTextSep + inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])
 
2521
               +kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0
 
2522
               +kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) );
2595
2523
         end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then
2596
 
                        TextForm.Memo1.Lines.Add(lLabelStr+ lLabelStr20[lInc] + ', ' + inttostr(lHisto[lInc])+','+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
 
2524
                        TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
2597
2525
     end; //for each row
2598
2526
end;
2599
2527
 
2647
2575
           else
2648
2576
               lStr := 'Overlay #'+inttostr(lOverlayNum);
2649
2577
        if not lShowFilename then begin
2650
 
           TextForm.Memo1.Lines.Add(lStr+'  '+gMRIcroOverlay[lOverlayNum].HdrFileName);
 
2578
           TextForm.MemoT.Lines.Add(lStr+'  '+gMRIcroOverlay[lOverlayNum].HdrFileName);
2651
2579
        end;
2652
2580
        //TextForm.Memo1.Lines.Add('CoM');
2653
2581
        if  CenterOfMass (lOverlayNum, lCenterOfMass[1],lCenterOfMass[2],lCenterOfMass[3]) > 0 then
2654
 
            TextForm.Memo1.Lines.Add(' '+lLabelStr+' Center of mass XYZ '+RealToStr(lCenterOfMass[1],2)+'x'+RealToStr(lCenterOfMass[2],2)+'x'+RealToStr(lCenterOfMass[3],2));
 
2582
            TextForm.MemoT.Lines.Add(' '+lLabelStr+' Center of mass XYZ '+RealToStr(lCenterOfMass[1],2)+'x'+RealToStr(lCenterOfMass[2],2)+'x'+RealToStr(lCenterOfMass[3],2));
2655
2583
        for lInc := 1 to 3 do begin
2656
2584
                if lROIVol[lInc] > 1 then begin
2657
2585
                        lSD := (lROISumSqr[lInc] - ((Sqr(lROISum[lInc]))/lROIVol[lInc]));
2681
2609
                        2: lStr := 'VOI <>0 ';
2682
2610
                        else lStr := 'VOI     ';
2683
2611
                end;
2684
 
                lStr := lStr+' n=min/mean/max=SD: '+inttostr(round(lROIVol[lInc]))+'['+RealToStr(lCC,2)+'cc]='+RealToStr(lROIMin[lInc],4)+'/'+realToStr(lROIMean,4)+'/'+realToStr(lROIMax[lInc],4)+'='+realtostr(lSD,4);
2685
 
                TextForm.Memo1.Lines.Add(lLabelStr+ lStr);
 
2612
                lStr := lStr+' nvox(cc)=min/mean/max=SD: '+inttostr(round(lROIVol[lInc]))+kTextSep+RealToStr(lCC,2)+kTextSep+'='+kTextSep+RealToStr(lROIMin[lInc],4)+kTextSep+realToStr(lROIMean,4)+kTextSep+realToStr(lROIMax[lInc],4)+kTextSep+'='+kTextSep+realtostr(lSD,4);
 
2613
                TextForm.MemoT.Lines.Add(lLabelStr+ lStr);
2686
2614
        end;
2687
2615
        //June07 if (gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette) or (lShowFilename) then
2688
2616
                DescribeVOIonLabels(lOverlayNum,lShowfilename);
2689
 
        TextForm.Memo1.Lines.Add('');
 
2617
        TextForm.MemoT.Lines.Add('');
2690
2618
        ImgForm.SaveDialog1.Filename := ExtractFileDirWithPathDelim(gMRIcroOverlay[lOverlayNum].HdrFileName)+'desc.csv';
2691
2619
end;
2692
2620
 
2707
2635
        lNumberofFiles:= HdrForm.OpenHdrDlg.Files.Count;
2708
2636
        if  lNumberofFiles < 1 then
2709
2637
                exit;
2710
 
        TextForm.Memo1.Lines.Clear;
 
2638
        TextForm.MemoT.Lines.Clear;
2711
2639
        for lInc:= 1 to lNumberofFiles do begin
2712
2640
                lFilename := HdrForm.OpenHdrDlg.Files[lInc-1];
2713
2641
                OverlayOpenCore ( lFilename, 2);
2723
2651
 
2724
2652
procedure TImgForm.Batchprobmaps1Click(Sender: TObject);
2725
2653
begin
2726
 
       BatchVOI;
 
2654
 
 
2655
  BatchVOI;
2727
2656
end;
2728
2657
 
2729
2658
procedure TImgForm.Batchclusterprobmaps1Batchclusterprobmaps1ClickClick(
3914
3843
     end;
3915
3844
     if (gMRIcroOverlay[lOverlayNum].ScrnBufferItems <> gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems) or (gMRIcroOverlay[kBGOverlayNum].ImgBufferBPP <> 1) or (gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems < 2) then
3916
3845
        exit;
3917
 
     TextForm.Memo1.Lines.add(' Custom Region Analysis');
3918
 
     TextForm.Memo1.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label');
 
3846
     TextForm.MemoT.Lines.add(' Custom Region Analysis');
 
3847
     TextForm.MemoT.Lines.add(' For Speculative Brodmann Map: 0=not cortical and 48=no Brodmann label');
3919
3848
     lVOI := IsVOIROIExt(gMRIcroOverlay[lOverlayNum].HdrFileName);
3920
3849
     if (not lVOI) and (lOverlayNum = kVOIOverlayNum) then
3921
3850
        lVOI := true;
3925
3854
     else
3926
3855
         lLabelStr := ' ';
3927
3856
     if lVOI then //intensity min/max position are not important
3928
 
        TextForm.Memo1.Lines.add(lLabelStr+'Area,N>0,%N>0')
 
3857
        TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0')
3929
3858
     else
3930
 
         TextForm.Memo1.Lines.add(lLabelStr+'Area,N>0,%N>0,Sum>0,Mean>0,Max,MaxX,MaxY,MaxZ');
 
3859
         TextForm.MemoT.Lines.add(lLabelStr+'Area'+kTextSep+'N>0'+kTextSep+'%N>0'+kTextSep+'Sum>0'+kTextSep+'Mean>0'+kTextSep+'Max'+kTextSep+'MaxX'+kTextSep+'MaxY'+kTextSep+'MaxZ');
3931
3860
   //next initialize
3932
3861
   if lShowFilename then
3933
3862
      lLabelStr := gMRIcroOverlay[lOverlayNum].HdrFileName+','
3975
3904
            lLocalMax[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalMax[lInc]);
3976
3905
            lLocalSum[lInc] := Raw2ScaledIntensity (gMRIcroOverlay[lOverlayNum],lLocalSum[lInc]);
3977
3906
            ImgPosToMM(lLocalMaxPos[lInc], lXmm,lYmm,lZmm);
3978
 
            TextForm.Memo1.Lines.Add(lLabelStr+ lLabelStr20[lInc] + ', ' + inttostr(lHisto[lInc])+','+floattostr( lHisto[lInc]/lRegionVol[lInc])
3979
 
               +','+floattostr( lLocalSum[lInc])+','+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0
3980
 
               +', ' + floattostr(lLocalMax[lInc])+','+floattostr(lXmm)+','+floattostr(lYmm)+','+floattostr(lZmm) );
 
3907
            TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] +kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])
 
3908
               +kTextSep+floattostr( lLocalSum[lInc])+kTextSep+floattostr( lLocalSum[lInc]/lRegionVol[lInc]) //Sum>0, mean>0
 
3909
               +kTextSep + floattostr(lLocalMax[lInc])+kTextSep+floattostr(lXmm)+kTextSep+floattostr(lYmm)+kTextSep+floattostr(lZmm) );
3981
3910
         end else if (lHisto[lInc] > 0) {necessarily also and (lRegionVol[lInc] > 0)} then
3982
 
                        TextForm.Memo1.Lines.Add(lLabelStr+ lLabelStr20[lInc] + ', ' + inttostr(lHisto[lInc])+','+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
 
3911
                        TextForm.MemoT.Lines.Add(lLabelStr+ lLabelStr20[lInc] + kTextSep+ inttostr(lHisto[lInc])+kTextSep+floattostr( lHisto[lInc]/lRegionVol[lInc])) ;
3983
3912
     end; //for each row
3984
3913
end;
3985
3914
 
4031
3960
                Showmessage('You need to create or load an overlay (Overlay/Open or Draw/OpenVOI) to get overlay statistics.');
4032
3961
                exit;
4033
3962
        end;
4034
 
 TextForm.Memo1.Lines.Clear;
 
3963
 TextForm.MemoT.Lines.Clear;
4035
3964
 for lOverlayNum := 1 to knMaxOverlay do begin
4036
3965
   if gMRIcroOverlay[lOverlayNum].ScrnBufferItems = gMRIcroOverlay[kBGOverlayNum].ScrnBufferItems then begin
4037
3966
        for lInc := 1 to 3 do begin
4054
3983
        end; //for each voxel
4055
3984
        //next - compute StDev
4056
3985
        //compute descriptives for each set of values
4057
 
        TextForm.Memo1.Lines.Add('Overlay '+gMRIcroOverlay[lOverlayNum].HdrFileName);
 
3986
        TextForm.MemoT.Lines.Add('Overlay '+gMRIcroOverlay[lOverlayNum].HdrFileName);
4058
3987
        if  CenterOfMass (lOverlayNum, lCenterOfMass[1],lCenterOfMass[2],lCenterOfMass[3]) > 0 then
4059
 
            TextForm.Memo1.Lines.Add(' Center of mass XYZ '+RealToStr(lCenterOfMass[1],2)+'x'+RealToStr(lCenterOfMass[2],2)+'x'+RealToStr(lCenterOfMass[3],2));
 
3988
            TextForm.MemoT.Lines.Add(' Center of mass XYZ '+RealToStr(lCenterOfMass[1],2)+'x'+RealToStr(lCenterOfMass[2],2)+'x'+RealToStr(lCenterOfMass[3],2));
4060
3989
        for lInc := 1 to 3 do begin
4061
3990
                if lROIVol[lInc] > 1 then begin
4062
3991
                        lSD := (lROISumSqr[lInc] - ((Sqr(lROISum[lInc]))/lROIVol[lInc]));
4082
4011
                        2: lStr := 'VOI <>0 ';
4083
4012
                        else lStr := 'VOI     ';
4084
4013
                end;
4085
 
                lStr := lStr+' n=min/mean/max=SD: '+inttostr(round(lROIVol[lInc]))+'['+RealToStr(lCC,2)+'cc]='+RealToStr(lROIMin[lInc],4)+'/'+realToStr(lROIMean,4)+'/'+realToStr(lROIMax[lInc],4)+'='+realtostr(lSD,4);
4086
 
                TextForm.Memo1.Lines.Add(lStr);
 
4014
                lStr := lStr+' nvox(cc)=min/mean/max=SD: '+inttostr(round(lROIVol[lInc]))+kTextSep+RealToStr(lCC,2)+kTextSep+'='+RealToStr(lROIMin[lInc],4)+kTextSep+realToStr(lROIMean,4)+kTextSep+realToStr(lROIMax[lInc],4)+kTextSep+'='+kTextSep+realtostr(lSD,4);
 
4015
                TextForm.MemoT.Lines.Add(lStr);
4087
4016
        end;
4088
4017
        if      gMRIcroOverlay[kBGOverlayNum].UsesCustomPalette then
4089
4018
                DescribeVOIonLabels(lOverlayNum);
4090
 
        TextForm.Memo1.Lines.Add('');
 
4019
        TextForm.MemoT.Lines.Add('');
4091
4020
   end; //overlaynum loaded
4092
4021
 end; //for each overlay
4093
4022
        TextForm.Show;
4482
4411
begin
4483
4412
        (sender as TMenuItem).checked := not (sender as TMenuItem).checked;
4484
4413
         gYoke := (sender as TMenuItem).checked ;
4485
 
         YokeTimer.Enabled := gYoke;
 
4414
         if gYoke then
 
4415
            CreateShareMem
 
4416
         else
 
4417
             CloseShareMem;
 
4418
         YokeTimer.Enabled := gYoke;
4486
4419
end;
4487
4420
 
4488
4421
procedure TImgForm.About1Click(Sender: TObject);