-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathTensorReconstructionPhantom.java
149 lines (90 loc) · 4.8 KB
/
TensorReconstructionPhantom.java
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
// This code was developed in a collaboration with ECAP, Erlangen, Germany.
// This part of the code is not to be published under GPL before Oct 31st 2017.
// author@ Florian Schiffers July 1st, 2015
//
package edu.stanford.rsl.science.darkfield.FlorianDarkField;
import java.io.File;
import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
import edu.stanford.rsl.conrad.numerics.SimpleVector;
import edu.stanford.rsl.conrad.utils.Configuration;
import edu.stanford.rsl.science.darkfield.FlorianDarkField.DarkFieldTensorPhantom.PhantomType;
// Contains the reconstructed sample
import edu.stanford.rsl.science.darkfield.FlorianDarkField.DarkField3DTensorVolume;
import edu.stanford.rsl.science.darkfield.FlorianDarkField.DarkField3DTensorVolume.TensorConstraintType;
import edu.stanford.rsl.science.darkfield.FlorianDarkField.DarkFieldTensorGeometry.TrajectoryType;
import ij.ImageJ;
public class TensorReconstructionPhantom{
public static void main (String [] args) throws Exception{
DarkFieldTensorPhantom phantomObject;
DarkFieldReconPipeline myDarkFieldPipeLine;
int numScatterVectors;
File folder;
String fileNameConfig1 = "E:\\fschiffers\\MeasuredData\\Phantom2\\PhantomHalfLarge_unsymetricSmall.xml";
// Load configuration wooden case
Configuration Configuration1 = Configuration.loadConfiguration(fileNameConfig1);
System.out.println("Configuration 1 loaded.");
Configuration Configuration2 = Configuration.loadConfiguration(fileNameConfig1);
// Reset rotation axis for Config2
SimpleVector rotationAxis2 = new SimpleVector(0.0d,1.0d,0.0);
Configuration2.getGeometry().setRotationAxis(rotationAxis2);
// Load ImageJ
new ImageJ();
// Number of scatter vectors
numScatterVectors = 13;
// Create Dark Field Phantom
phantomObject = new DarkFieldTensorPhantom(Configuration1,numScatterVectors,PhantomType.WOODEN_BLOCK_PHANTOM);
// display the phantom
phantomObject.getPhantom().show("Phantom Volume");
folder = new File(fileNameConfig1);
SimpleMatrix myScatterMatrix = DarkFieldScatterDirection.getScatterDirectionMatrix(numScatterVectors);
DarkFieldTensorClass phantomFiberDirection = DarkFieldReconPipeline.calculateFiberOrientations(phantomObject.getPhantom(), myScatterMatrix, folder,"fiberDirectionsPhantom");
System.out.println("Start calculating Phantom DarkField Projections");
phantomObject.calculateDarkFieldProjection(Configuration1, Configuration2);
/*
* Load dark field images
*/
// Load dark field image of orientation 1
DarkField3DSinogram sinoDCI1 = phantomObject.getDarkFieldSinogram(TrajectoryType.HORIZONTAL);
sinoDCI1.writeDarkFieldSinogramToImage(folder, "DarkFieldSinoGram1.tif","DarkField Sinogram 1");
DarkField3DSinogram sinoDCI2 = phantomObject.getDarkFieldSinogram(TrajectoryType.VERTICAL);
sinoDCI2.writeDarkFieldSinogramToImage(folder, "DarkFieldSinoGram2.tif","DarkField Sinogram 2");
boolean showFlag = true;
if(showFlag){
// Show DarkField Projection Images
sinoDCI1.show("Dark field image 1");
// Show Stack of DarkField slices
sinoDCI1.showSinogram("Sinogram of dark field image 1");
// Show DarkField Projection Images
// Show DarkField Projection Images
sinoDCI2.show("Dark field image 2");
// Show Stack of DarkField slices
sinoDCI2.showSinogram("Sinogram of dark field image 2");
// Show DarkField Projection Images
}
DarkField3DTensorVolume mask = phantomObject.getPhantomMask();
// mask.show("Mask volume");
/*
* INITILIAZATION OF SOME DATA
*/
// Number of scatter vectors
//Step size for Gradient decent
float stepSize = 0.02f;
// Number of maximal iterations in gradient decent
int maxIt = 5;
// Initialize the pipeline
myDarkFieldPipeLine = new DarkFieldReconPipeline(Configuration1,Configuration2,fileNameConfig1,TensorConstraintType.NO_CONSTRAINT);
myDarkFieldPipeLine.setReconMask(mask);
// Reconstruct DarkField Volume
boolean writeVtkInEveryStep = true;
myDarkFieldPipeLine.reconstructDarkFieldVolume(numScatterVectors,maxIt,stepSize,folder,sinoDCI1,sinoDCI2,writeVtkInEveryStep);
System.out.println(" DarkField Reconstruction was successfully created and saved.");
File myParentFile = new File(fileNameConfig1);
DarkFieldTensorClass tensorReko = myDarkFieldPipeLine.calculateFiberOrientations(myParentFile);
double angularError = DarkFieldErrorMeasures.errorAngularDistance(phantomFiberDirection,tensorReko,mask);
System.out.println("Angular Error: " +angularError);
System.out.println("Fiber Orientations sucessfully saved.");
DarkField3DTensorVolume recon = myDarkFieldPipeLine.getReconDarkField();
DarkField3DTensorVolume diffVolume = DarkField3DTensorVolume.sub(recon, phantomObject.getPhantom());
diffVolume.show("Difference between diffVolume and Phantom");
}
}