-
Notifications
You must be signed in to change notification settings - Fork 13
/
cbctrecon.h
566 lines (406 loc) · 22.8 KB
/
cbctrecon.h
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
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
#ifndef CBCTRECON_H
#define CBCTRECON_H
#include <QtGui/QMainWindow>
//#include <QTimer>
#include "ui_cbctrecon.h"
#include "YK16GrayImage.h"
//#include "itkImage.h"
#include "itk_image_type.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
//#include "DlgRegistration.h"
//#include "itkDerivativeImageFilter.h"
//#include "itkSmoothingRecursiveGaussianImageFilter.h"
//#include "itkIntensityWindowingImageFilter.h"
//#include "itkMedianImageFilter.h"
//
////class YK16GrayImage;
////
////#define BLACK_VALUE 0
////#define NORMAL_VALUE 1000
////#define WHITE_VALUE 4095
////#define CENTERLINE_VALUE 30000
////
////#define DEFAULT_CROSSHAIR_MARGIN 20
////#define DEFAULT_SAMPLING_PIXELS 3
////#define DEFAULT_ROI_RATIO_X 0.5
////#define DEFAULT_ROI_RATIO_Y 0.5
//#define DEFAULT_PERCENT_BADPIX_ON_COLUMN 30
//#define DEFAULT_PERCENT_BADPIX_ON_ROW 30
//
//typedef itk::Image<float,2> FloatImageType;
//typedef itk::Image<unsigned short, 2> UnsignedShortImageType;
//typedef itk::ImageFileReader<UnsignedShortImageType> readerType;
//typedef itk::DerivativeImageFilter<UnsignedShortImageType, FloatImageType> DerivativeFilterType;
//typedef itk::SmoothingRecursiveGaussianImageFilter<UnsignedShortImageType, UnsignedShortImageType> SmoothingFilterType;
//typedef itk::IntensityWindowingImageFilter<UnsignedShortImageType, UnsignedShortImageType> WindowingFilterType;
//typedef itk::MedianImageFilter<UnsignedShortImageType,UnsignedShortImageType> MedianFilterType;
// RTK includes
#include <rtkHisImageIO.h>
#include <rtkElektaSynergyGeometryReader.h>
#include <rtkThreeDCircularProjectionGeometryXMLFile.h>
#include <rtkThreeDCircularProjectionGeometry.h>
#include <rtkConfiguration.h>
#include <rtkFDKBackProjectionImageFilter.h>
#include <rtkFDKConeBeamReconstructionFilter.h>
#include <rtkConstantImageSource.h>
#include <rtkDisplacedDetectorImageFilter.h>
#include <rtkParkerShortScanImageFilter.h>
#include <rtkProjectionsReader.h>
#if CUDA_FOUND
# include "rtkCudaFDKConeBeamReconstructionFilter.h"
# include "rtkCudaForwardProjectionImageFilter.h"
#endif
#if OPENCL_FOUND
//# include "rtkOpenCLFDKConeBeamReconstructionFilter.h"
#endif
// ITK includes
#include <itkStreamingImageFilter.h>
#include <itkRegularExpressionSeriesFileNames.h>
#include <itkMemoryProbesCollectorBase.h>
#include <itkEuler3DTransform.h>
#include <itkResampleImageFilter.h>
#include <itkFlipImageFilter.h>
#include <itkMultiplyImageFilter.h>
#include "itkCastImageFilter.h"
#include "itkAbsImageFilter.h"
typedef float FloatPixelType;
//typedef itk::Image< FloatPixelType, 3 > FloatImageType;
//typedef itk::Image< FloatPixelType, 2 > FloatImage2DType;
typedef itk::ImageFileReader< FloatImageType > ReaderType;
typedef itk::ImageFileWriter< FloatImageType > WriterType;
typedef rtk::ThreeDCircularProjectionGeometry GeometryType;
typedef unsigned short USHORT_PixelType;
//typedef itk::Image< USHORT_PixelType, 3 > UShortImageType;
//typedef itk::Image< USHORT_PixelType, 2 > UShortImage2DType;
typedef signed short SHORT_PixelType;
//typedef itk::Image< SHORT_PixelType, 3 > ShortImageType;
//typedef itk::Image< SHORT_PixelType, 2 > ShortImage2DType;
#define DEFAULT_ELEKTA_PROJ_WIDTH 1024
#define DEFAULT_ELEKTA_PROJ_HEIGHT 1024
#define MAX_LINE_LENGTH 1024
//lineEdit_scaMedian, when downsampling =1.0
#define DEFAULT_SCA_MEDIAN 25.0
//lineEdit_scaGaussian, when downsampling =1.0
#define DEFAULT_SCA_GAUSSIAN 3.0
//lineEdit_sca, when downsampling =1.0
#define DEFAULT_SCA_POST_PROJ_MEDIAN 6.0
enum enPLANE{
PLANE_AXIAL = 0,
PLANE_FRONTAL,
PLANE_SAGITTAL,
};
enum enREGI_IMAGES{
REGISTER_RAW_CBCT = 0,
REGISTER_REF_CT, //manual moving image
REGISTER_MANUAL_RIGID, //manual moving image
REGISTER_AUTO_RIGID,
REGISTER_DEFORM1,
REGISTER_DEFORM2,
REGISTER_DEFORM3,
REGISTER_DEFORM_FINAL,
REGISTER_COR_CBCT,
REGISTER_DEFORM_SKIP_AUTORIGID,
};
enum enMachineType{
MACHINE_ELEKTA = 0,
MACHINE_VARIAN,
};
enum FWD_METHOD{
en_Joseph = 0,
en_CudaRayCast,
en_RayCastInterpolator,
};
struct WEPLData{
double fWEPL;
int ptIndex;
double fGanAngle;
};
struct VEC3D{
double x;
double y;
double z;
};
//
struct FLEXDATA{
float fGanAngle; //MV beam gantry angle
float fPanelOffsetX; //MV beam gantry angle
float fPanelOffsetY; //MV beam gantry angle
bool bKV_On;
bool bMV_On;
};
class QStandardItemModel;
class DlgRegistration;
class DlgExternalCommand;
class QTimer;
class QXmlStreamReader;
using namespace std;
class CbctRecon : public QMainWindow
{
Q_OBJECT
public:
CbctRecon(QWidget *parent = 0, Qt::WFlags flags = 0);
~CbctRecon();
//void DoRecon();
void ReleaseMemory();
void RenameFromHexToDecimal(QStringList& filenameList);
QString HexStr2IntStr(QString& strHex);
QString CorrectSingleFile(const char* filePath);
void CorrectSingleFile(YK16GrayImage* pYKRawImg);
void LoadBadPixelMap(const char* filePath);
void BadPixReplacement(YK16GrayImage* targetImg);
void LoadRTKGeometryFile(const char* filePath);
//void GetSelectedIndices(const vector<double>& vFullAngles, vector<double>& vNormAngles, vector<int>& vTargetIdx, bool bCW);
void GetExcludeIndexByNames(QString outlierListPath, vector<string>& vProjFileFullPath, vector<int>& vExcludeIdx);
void GetSelectedIndices(const vector<double>& vFullAngles, vector<double>& vNormAngles, vector<int>& vTargetIdx, bool bCW, vector<int>& vExcludingIdx);
void SetMaxAndMinValueOfProjectionImage(); // scan m_spProjImg3D and update m_fProjImgValueMin, max
void GetMaxAndMinValueOfProjectionImage(double& fProjImgValueMax, double& fProjImgValueMin, FloatImageType::Pointer projImage);
double GetValueFrom3DImageFloat(int reqX, int reqY, int reqZ, FloatImageType::Pointer& sp3DFloatImage);
double GetValueFrom3DImageUshort(int reqX, int reqY, int reqZ, UShortImageType::Pointer& sp3DUshortImage);
bool IsFileNameOrderCorrect(vector<string>& vFileNames);
void PostApplyFOVDispParam();
//void ExportDICOM_SHORT(SHORT_ImageType::Pointer& sp3DshortImage);//NOT COMPLETED YET!! Export DICOM without Source DICOM is not possible
void CopyDictionary (itk::MetaDataDictionary &fromDict, itk::MetaDataDictionary &toDict);//NOT COMPLETED YET!! Export DICOM without Source DICOM is not possible
void DoBeamHardeningCorrection();
void Draw2DFrom3D(UShortImageType::Pointer& pImg, enPLANE direction, double pos, YK16GrayImage& pOutput2D);
void Draw2DFrom3DDouble(UShortImageType::Pointer& spFixedImg, UShortImageType::Pointer& spMovingImg, enPLANE direction, double pos, YK16GrayImage& YKFixed, YK16GrayImage& YKMoving);
void RegisterImgDuplication(enREGI_IMAGES src, enREGI_IMAGES target);
//plastimatch skin / bubble-remover
//QString getPathCTDir(enMachineType enType);//DICOM Dir
//QString getPathRS(enMachineType enType);//RS path
//bool loadPlanCTFromDCM(QString& strCTDirPath, QString& strRSPath);//using plastimatch, prepare m_spRefCTImg. Remove air, RS is needed
//Skin will be removed, bubble will be filled
void FindAllRelevantPaths(QString pathProjHisDir);
QString MakeElektaXML(QString filePath_ImageDBF, QString filePath_FrameDBF, QString DICOM_UID);
bool LoadShortImageToUshort(QString& strPath, UShortImageType::Pointer& pUshortImage);
void init_DlgRegistration(QString& strDCM_UID);
//using RTK forward projection algorithm, generate 2D projection image files (as line integral, mu_t)
void ForwardProjection (UShortImageType::Pointer& spVolImg3D, GeometryType::Pointer& spGeometry, UShortImageType::Pointer& spProjCT3D, bool bSave);
//to be implemented: Save projection3D to *.his files
//void GenScatterMap_PriorCT(USHORT_ImageType::Pointer& spProjRaw3D, USHORT_ImageType::Pointer& spProjCT3D, USHORT_ImageType::Pointer& spProjScat3D, bool bSave); //void GenScatterMap2D_PriorCT()
//void GenScatterMap_PriorCT(USHORT_ImageType::Pointer& spProjRaw3D, USHORT_ImageType::Pointer& spProjCT3D, USHORT_ImageType::Pointer& spProjScat3D, double resF2D, double medianRadius, double gaussianSigma, bool bSave);
void GenScatterMap_PriorCT(UShortImageType::Pointer& spProjRaw3D, UShortImageType::Pointer& spProjCT3D, UShortImageType::Pointer& spProjScat3D, double medianRadius, double gaussianSigma, int nonNegativeScatOffset, bool bSave);
//void ScatterCorr_PrioriCT(USHORT_ImageType::Pointer& spProjRaw3D, USHORT_ImageType::Pointer& spProjScat3D, USHORT_ImageType::Pointer& m_spProjCorr3D, int nonNegativeScatOffset, bool bSave);
void ScatterCorr_PrioriCT(UShortImageType::Pointer& spProjRaw3D, UShortImageType::Pointer& spProjScat3D, UShortImageType::Pointer& m_spProjCorr3D, int nonNegativeScatOffset, int postMedian, bool bSave);
void AfterScatCorrectionMacro();
//His file export from 3D proj file
void SaveProjImageAsHIS(UShortImageType::Pointer& m_spProj3D, YK16GrayImage* arrYKImage, QString& strSavingFolder, int iCnt, double resampleF); //arrYKImage include HIS header and original file name
void ConvertLineInt2Intensity( FloatImageType::Pointer& spProjLineInt3D, UShortImageType::Pointer& spProjIntensity3D, int bkIntensity );
void ConvertIntensity2LineInt(UShortImageType::Pointer& spProjIntensity3D, FloatImageType::Pointer& spProjLineInt3D, int bkIntensity);
void Get2DFrom3D( UShortImageType::Pointer& spSrcImg3D, FloatImage2DType::Pointer& spTargetImg2D, int idx, enPLANE iDirection);
void Set2DTo3D( FloatImage2DType::Pointer& spSrcImg2D, UShortImageType::Pointer& spTargetImg3D, int idx, enPLANE iDirection);
void AllocateByRef( UShortImageType::Pointer& spRefImg3D, UShortImageType::Pointer& spTarImg3D );
void AllocateByRef(FloatImage2DType::Pointer& spRefImg2D, FloatImage2DType::Pointer& spTarImg2D);
void AllocateByRef( FloatImageType::Pointer& spRefImg3D, FloatImageType::Pointer& spTarImg3D );
void AllocateByRef(UShortImageType::Pointer& spRefImg3D, FloatImageType::Pointer& spTarImg3D);
void AllocateByRef(FloatImageType::Pointer& spRefImg3D, UShortImageType::Pointer& spTarImg3D);
//void ResampleItkImage(OutputImageType::Pointer& spImgFloat, double resampleF);
//Resample proj images
void ResampleItkImage( FloatImageType::Pointer& spSrcImg, FloatImageType::Pointer& spTarImg, double resampleF );
void ResampleItkImage( UShortImageType::Pointer& spSrcImg, UShortImageType::Pointer& spTarImg, double resFactor );
void ResampleItkImage2D(FloatImage2DType::Pointer& spSrcImg2D, FloatImage2DType::Pointer& spTarImg2D, double resFactor); //using slice iterator
void DoReconstructionFDK(enREGI_IMAGES target);
void UpdateReconImage(UShortImageType::Pointer& spNewImg, QString& fileName);
//void SaveUSHORTAsSHORT_DICOM (USHORT_ImageType::Pointer& spImg, QString& strPatientID, QString& strPatientName);//ushort image --> short image -->
void SaveUSHORTAsSHORT_DICOM( UShortImageType::Pointer& spImg, QString& strPatientID, QString& strPatientName, QString& strPathTargetDir);
void ConvertUshort2Short(UShortImageType::Pointer& spImgUshort, ShortImageType::Pointer& spImgShort);
double GetRawIntensityScaleFactor();
//void GetAngularWEPL_SinglePoint(USHORT_ImageType::Pointer& spImage, int angleGap, VEC3D calcPt, int curPtIdx, vector<WEPLData>& vOutputWEPLData, bool bAppend);//output vector: append
void GetAngularWEPL_SinglePoint( UShortImageType::Pointer& spUshortImage, float fAngleGap, VEC3D calcPt, int curPtIdx, vector<WEPLData>& vOutputWEPLData, bool bAppend );
// void UpdateUIAfterLoading(QString& imgName);
void LoadExternalFloatImage(QString& strPath, bool bConversion);
void TransformationRTK2IEC(FloatImageType::Pointer& spSrc);
void MedianFilterByGUI(); //params are given at the UI
void FileExportByGUI();//params are given at the UI
/*Temporary implementation for XVI5 xml*/
void LoadXVIGeometryFile(const char* filePath); //temporary implenetation using QT XML. This is for XVI v >5.0.2. _Frames.xml is in every projection folder
FLEXDATA XML_parseFrameForXVI5(QXmlStreamReader& xml);
QString XML_GetSingleItemString(QXmlStreamReader& xml);
bool GetXrayParamFromINI(QString& strPathINI, float& kVp, float& mA, float& ms);
void SetProjDir(QString& strProjPath);
bool FullScatterCorrectionMacroSingle(QString& outputDirPath, enREGI_IMAGES enFwdRefImg, bool bFullResolRecon, bool bExportImages = false, bool bCBCT_IntensityShift = false);
void ExportAngularWEPL_byFile(QString& strPathOutput);
void ExportReconSHORT_HU(UShortImageType::Pointer& spUsImage, QString& outputFilePath);
/*Temporary implementation for XVI5 xml*/
//using itkimage and cuda do median filter faster. Output will be overwritten
// void cudaMedianFilter2DITK(OutputImageType2D::Pointer& spUshortImage, int wndSizeX, int wndSizeY);
//double CropSkinUsingRS(USHORT_ImageType::Pointer& spImgUshort, QString& strPathRS, double cropMargin);
//void AuditMemory();
void CropSupInf(UShortImageType::Pointer& sp_Img, float physPosInfCut, float physPosSupCut);
void CropFOV3D(UShortImageType::Pointer& sp_Img, float physPosX, float physPosY, float physRadius, float physTablePosY);
void GenerateCylinderMask(UShortImageType::Pointer& spImgCanvas, float fDcmPosX, float fDcmPosY, float fRadius);
float GetMeanIntensity(UShortImageType::Pointer& spImg, float sphereR, float* sdIntensity = NULL);
void AddConstHU(UShortImageType::Pointer& spImg, int HUval);
bool ResortCBCTProjection(vector<int>& vIntPhaseBinSelected, QString& strPathForXML, QString& strPathProjRoot, QString& strUID, vector<float>& vFloatPhaseFull, GeometryType::Pointer& spGeomFull, vector<string>& vProjPathsFull);
void AppendInPhaseIndex(int iPhase, vector<float>& vFloatPhaseFull, vector<int>& vOutputIndex, int margin=5);
void LoadShort3DImage(QString& filePath, enREGI_IMAGES enTarget);
//Read long INIXVI text file and read couch shift values. apply cm -> mm conversion (multiply 10). NO sign changes.
bool GetCouchShiftFromINIXVI(QString& strPathINI, VEC3D* pTrans, VEC3D* pRot);
//This function came from the tracking project. trans values are all in mm, DICOM x, y, z
void ImageTransformUsingCouchCorrection(UShortImageType::Pointer& spUshortInput, UShortImageType::Pointer& spUshortOutput, VEC3D couch_trans, VEC3D couch_rot);
void GetWEPLDataFromSingleFile(const QString& filePath, vector<VEC3D>& vPOI, vector<WEPLData>& vOutputWEPL);
void SingleForwardProjection(FloatImageType::Pointer& spVolImgFloat, float fMVGanAngle, float panelOffsetX, float panelOffsetY,
UShortImageType::Pointer& spProjImg3D, int iSliceIdx);
bool LoadShortImageDirOrFile(QString& strPathDir, ShortImageType::Pointer& spOutputShortImg);
void ConvertShort2Ushort(ShortImageType::Pointer& spInputImgShort, UShortImageType::Pointer& spOutputImgUshort);
void RotateImgBeforeFwd(UShortImageType::Pointer& spInputImgUS, UShortImageType::Pointer& spOutputImgUS);
void ConvertUshort2AttFloat(UShortImageType::Pointer& spImgUshort, FloatImageType::Pointer& spAttImgFloat);
bool SaveCurrentSetting(QString& strPathConfigFile);
bool LoadCurrentSetting(QString& strPathConfigFile);
//using RTK forward projection algorithm, generate 2D projection image files (as line integral, mu_t)
public slots:
void SLT_LoadRawImages(); //independent 2d projection files //not used in clinical case
void SLT_Load3DImage(); //indenepndent 3D mha file. UshortFormat. Do reconstruction is an antoher way to make m_spReconImg
void SLT_Load3DImageShort();
void SLT_LoadPlanCT_mha();
void SLT_LoadPlanCT_USHORT();
void SLT_LoadCBCTcorrMHA();
void SLT_LoadCTrigidMHA();
void SLT_LoadCTdeformMHA();
void SLT_LoadNKIImage();
void SLT_LoadSelectedProjFiles(); //based on presetting values on GUI, including geometry files
void SLT_ExportHis();
void SLT_LoadImageFloat3D(); //Dose file
void SLTM_LoadDICOMdir();
void SLTM_LoadRTKoutput();
void SLT_DrawRawImages(); //external *.his images
void SLT_DrawProjImages(); // draw images from HIS FILE READER or filtered image before going into recon.
void SLT_DrawReconImage();
//tools
void SLT_FileNameHex2Dec();
void SLT_MakeElektaXML();
//Gain/ Offset correction
void SLT_OpenOffsetFile();
void SLT_OpenGainFile();
void SLT_OpenBadpixelFile();
void SLT_ApplyCalibration();
//Gain/ Offset correction
void SLT_SetHisDir();
void SLT_OpenElektaGeomFile();
void SLT_SetOutputPath();
void SLT_DoReconstruction();
//Profile table
//void SLT_GetProjectionProfile();
//void SLT_GetReconImgProfile();
void SLT_CopyTableToClipBoard();
void SLT_DataProbeProj();
void SLT_DataProbeRecon();
void SLT_DrawGraph();
void SLT_InitializeGraphLim();
void SLT_UpdateTable();
void SLT_CalculateROI_Recon();
void SLT_CalculateROI_Proj();
void SLT_GoForcedProbePos();
void SLT_PostApplyFOVDispParam();
void SLT_DoPostProcessing(); //cropping Circle
void SLT_PostProcCropInv();
void SLT_ExportReconUSHORT();
void SLT_ExportReconSHORT_HU();
void SLT_DoBHC();
void SLT_Export2DDose_TIF();
void SLTM_Export2DDoseMapAsMHA();
void SLT_ViewRegistration();
void SLT_DoScatterCorrection_APRIORI();
void SLT_TempAudit();
void SLT_CalcAndSaveAngularWEPL();
void SLT_DoScatterCorrectionUniform();
void SLT_FileExportShortDICOM_CurrentImg();
void SLT_AddConstHUToCurImg();
void SLT_SetCBCTSkinRSPath();
void SLT_CropSkinUsingRS();
void SLT_ExportAngularWEPL_byFile();
void SLT_LoadPOIData();
void SLT_StartSyncFromSharedMem();
void SLT_StopSyncFromSharedMem();
void SLT_TimerEvent();
void SLTM_ViewExternalCommand();
void SLT_MedianFilterDoNow();
void SLTM_ExportProjGeometryTXT();
void SLTM_ForwardProjection();
void SLTM_FineResolScatterCorrectrionMacro();//projection: full, scatter map:512x512
void SLTM_FullScatterCorrectionMacroAP();
void SLTM_BatchScatterCorrectionMacroAP();
void SLT_OpenPhaseData(); //fill lineEdit_PhaseTxtPath
void SLT_Export4DCBCT(); //phase resorting
void SLT_DoCouchCorrection();
void SLTM_WELPCalcMultipleFiles();
void SLTM_ScatterCorPerProjRef();
void SLTM_LoadPerProjRefList();
void SLTM_CropMaskBatch();
void SLT_SaveCurrentSetting();
void SLT_CropSupInf();
public:
//ReaderType::Pointer m_reader;
//WriterType::Pointer m_writer;
YK16GrayImage* m_arrYKImage; //independent raw images
int m_iImgCnt; //for independent raw images --> no relation to Directroy based projections
YK16GrayImage* m_arrYKBufProj;
int m_iCntSelectedProj;
YK16GrayImage* m_pImgOffset;
YK16GrayImage* m_pImgGain;
//Badpixmap;
vector<BADPIXELMAP> m_vPixelReplMap;
//RTK recon
GeometryType::Pointer m_spFullGeometry; //sp = smart pointer
GeometryType::Pointer m_spCustomGeometry;
bool m_bScanDirectionCW;
FloatImageType::Pointer m_spProjImg3DFloat; //This is float image loaded by RTK. line integral (mu_t value). To convert this to Intensity, use mu t = ln(65535/I)
UShortImageType::Pointer m_spProjImgRaw3D;//raw intensity value converted from line integral (mu_t). 0-65535
UShortImageType::Pointer m_spProjImgCT3D;//1.5G // release this after Scatter Generation
UShortImageType::Pointer m_spProjImgScat3D; //scatter map proj file using any scatter-estimation method//1.5G //release this after Cor gen
UShortImageType::Pointer m_spProjImgCorr3D; //proj file-scatter corrected one using either priori CT or any other method//1.5G
UShortImageType::Pointer m_spCrntReconImg; //fixed image // ID: RawCBCT
UShortImageType::Pointer m_spRawReconImg; //just added --> when file is loaded
UShortImageType::Pointer m_spScatCorrReconImg;//just added --> after scatter correction
UShortImageType::Pointer m_spRefCTImg;//filled by SLT_LoadPlanCT_mha(); ID: RefCT_Original
UShortImageType::Pointer m_spManualRigidCT;//copied from RefCTImg; ID: RefCT --> Moving Img, cloned
UShortImageType::Pointer m_spAutoRigidCT; // ID: AutoRigidCT
UShortImageType::Pointer m_spDeformedCT1; //Deformmation will be carried out based on Moving IMage of GUI //AutoDeformCT1
UShortImageType::Pointer m_spDeformedCT2; //AutoDeformCT2
UShortImageType::Pointer m_spDeformedCT3; //AutoDeformCT3
UShortImageType::Pointer m_spDeformedCT_Final; //AutoDeformCT3
YK16GrayImage* m_dspYKReconImage;
YK16GrayImage* m_dspYKImgProj;
int m_iTmpIdx;
double m_fProjImgValueMax; //value of float image
double m_fProjImgValueMin;
double m_multiplyFactor;
QStandardItemModel *m_pTableModel;
DlgRegistration* m_pDlgRegistration;
DlgExternalCommand* m_pDlgExternalCommand;
//Automatically detected relavant file/Dir path when load the projection files (SLT_SetHisDir)
//Belows are ELEKTA specific
//1) Find DICOM UID by subtracting "img_" from whole proj path name
//Below paths will be decided after the Find... Func.
QString m_strDCMUID;
QString m_strPathPatientDir; //full path of patient Directory
QString m_strPatientDirName; //just the name --> later I can extract the patient ID from here
QString m_strPathFRAME_DBF;
QString m_strPathIMAGE_DBF;
QString m_strPathGeomXML; //after Generation of the XML from DBF files
QString m_strPathPlanCTDir;
QString m_strPathRS; //for body and lung contours
QString m_strPathPlan; //for isocenter position
QString m_strPathDirDefault; //QFileDialog default starting point
QString m_strPathRS_CBCT; //QFileDialog default starting point
QString m_strPathElektaINI; //for mAs values
QString m_strPathIMAGES;//upper folder of projection files (His)
QString m_strPathElektaINIXVI2; //this includes couch shift values. longer INI.XVI file
int m_iFixedOffset_ScatterMap;//fixed! allows negative value of scatter
double m_fResampleF; //typically 0.5. this is updated during LoadSelectedProj image and ui.lineEdit_DownResolFactor.//also affects all other scatter correction method
double m_fProjSpacingX; //updated from SelectedProjLoad
double m_fProjSpacingY; //updated from SelectedProjLoad
vector<VEC3D> m_vPOI_DCM;//initialized by file Load
QTimer* m_Timer;
bool m_busyTimer;
vector<string> m_vSelectedFileNames;
bool m_bMacroContinue;
vector<float> m_vPhaseFloat;
QStringList m_strListPerProjRefVol;
QString m_strPathDefaultConfigFile;
vector<int> m_vExcludeProjIdx;//if kVON (exposed_ tag is false
//private:
public:
Ui::CbctReconClass ui;
};
#endif // BADPIXELDETECTOR_H