@@ -177,7 +177,189 @@ TEST(tomato, T1Shmolli_calculateSignWithoutPhase) {
177177 double correctDeltaB = 0.1775 ;
178178 double correctDeltaT1star = 5.5996 ;
179179 double correctDeltaT1 = 11.6167 ;
180- double correctTimeFlip = 2 ;
180+ double correctTimeFlip = 3 ;
181+
182+ // init the necessary objects
183+ Ox::ModelT1Shmolli<TYPE> model;
184+ Ox::FitterLevenbergMarquardtVnl<TYPE> fitter;
185+ Ox::SignCalculatorNoSign<TYPE> signCalculator;
186+ Ox::StartPointCalculatorShmolli<TYPE> startPointCalculator;
187+ Ox::CalculatorT1Shmolli<TYPE> calculator;
188+
189+ // configure
190+ calculator.setModel (&model);
191+ calculator.setFitter (&fitter);
192+ calculator.setSignCalculator (&signCalculator);
193+ calculator.setStartPointCalculator (&startPointCalculator);
194+
195+ // set the data
196+ calculator.setNSamples (nSamples);
197+ calculator.setInvTimes (time);
198+ calculator.setSigMag (signal);
199+
200+ calculator.calculate ();
201+
202+ EXPECT_NEAR (calculator.getResults ()[" A" ], correctA, tolerance);
203+ EXPECT_NEAR (calculator.getResults ()[" B" ], correctB, tolerance);
204+ EXPECT_NEAR (calculator.getResults ()[" T1star" ], correctT1star, tolerance);
205+ EXPECT_NEAR (calculator.getResults ()[" T1" ], correctT1, tolerance);
206+ EXPECT_NEAR (calculator.getResults ()[" R2Abs" ], correctR2Abs, tolerance);
207+ EXPECT_NEAR (calculator.getResults ()[" deltaA" ], correctDeltaA, tolerance);
208+ EXPECT_NEAR (calculator.getResults ()[" deltaB" ], correctDeltaB, tolerance);
209+ EXPECT_NEAR (calculator.getResults ()[" deltaT1star" ], correctDeltaT1star, tolerance);
210+ EXPECT_NEAR (calculator.getResults ()[" deltaT1" ], correctDeltaT1, tolerance);
211+ EXPECT_NEAR (calculator.getResults ()[" timeFlip" ], correctTimeFlip, tolerance);
212+ }
213+
214+ // results from tomato
215+ TEST (tomato, T1Shmolli_calculateSignWithoutPhase_5samples) {
216+
217+ typedef double TYPE;
218+
219+ TYPE signal[] = {
220+ 95.665639445300456 ,
221+ 53.529532614278374 ,
222+ 13.85130970724191 ,
223+ 128.0945043656908 ,
224+ 156.30662557781201 ,
225+ 159.62223934257833 ,
226+ 160.15511042629686 };
227+ TYPE time[] = { 100 , 180 , 260 , 1000 , 1900 , 2800 , 3700 };
228+ int nSamples = 7 ;
229+
230+ double tolerance = 1e-2 ;
231+
232+ double correctA = 160.2188 ;
233+ double correctB = 322.2685 ;
234+ double correctT1star = 433.5508 ;
235+ double correctT1 = 438.5053 ;
236+ double correctR2Abs = 0.9998 ;
237+ double correctDeltaA = 0.0674 ;
238+ double correctDeltaB = 0.1775 ;
239+ double correctDeltaT1star = 0.8256 ;
240+ double correctDeltaT1 = 1.7039 ;
241+ double correctTimeFlip = 1 ;
242+
243+ // init the necessary objects
244+ Ox::ModelT1Shmolli<TYPE> model;
245+ Ox::FitterLevenbergMarquardtVnl<TYPE> fitter;
246+ Ox::SignCalculatorNoSign<TYPE> signCalculator;
247+ Ox::StartPointCalculatorShmolli<TYPE> startPointCalculator;
248+ Ox::CalculatorT1Shmolli<TYPE> calculator;
249+
250+ // configure
251+ calculator.setModel (&model);
252+ calculator.setFitter (&fitter);
253+ calculator.setSignCalculator (&signCalculator);
254+ calculator.setStartPointCalculator (&startPointCalculator);
255+
256+ // set the data
257+ calculator.setNSamples (nSamples);
258+ calculator.setInvTimes (time);
259+ calculator.setSigMag (signal);
260+
261+ calculator.calculate ();
262+
263+ EXPECT_NEAR (calculator.getResults ()[" A" ], correctA, tolerance);
264+ EXPECT_NEAR (calculator.getResults ()[" B" ], correctB, tolerance);
265+ EXPECT_NEAR (calculator.getResults ()[" T1star" ], correctT1star, tolerance);
266+ EXPECT_NEAR (calculator.getResults ()[" T1" ], correctT1, tolerance);
267+ EXPECT_NEAR (calculator.getResults ()[" R2Abs" ], correctR2Abs, tolerance);
268+ EXPECT_NEAR (calculator.getResults ()[" deltaA" ], correctDeltaA, tolerance);
269+ EXPECT_NEAR (calculator.getResults ()[" deltaB" ], correctDeltaB, tolerance);
270+ EXPECT_NEAR (calculator.getResults ()[" deltaT1star" ], correctDeltaT1star, tolerance);
271+ EXPECT_NEAR (calculator.getResults ()[" deltaT1" ], correctDeltaT1, tolerance);
272+ EXPECT_NEAR (calculator.getResults ()[" timeFlip" ], correctTimeFlip, tolerance);
273+ }
274+
275+ TEST (tomato, T1Shmolli_calculateSignWithoutPhase_6samples) {
276+
277+ typedef double TYPE;
278+
279+ TYPE signal[] = {
280+ 197.59609868043603 ,
281+ 135.06540447504304 ,
282+ 23.955249569707401 ,
283+ 24.962134251290877 ,
284+ 62.294320137693632 ,
285+ 111.68445209409064 ,
286+ 140.4084911072863 };
287+ TYPE time[] = { 100 , 180 , 260 , 1000 , 1900 , 2800 , 3700 };
288+ int nSamples = 7 ;
289+
290+ double tolerance = 1e-2 ;
291+
292+ double correctA = 169.0853 ;
293+ double correctB = 392.4758 ;
294+ double correctT1star = 1441.06949 ;
295+ double correctT1 = 1903.8977 ;
296+ double correctR2Abs = 0.9998 ;
297+ double correctDeltaA = 4.1456 ;
298+ double correctDeltaB = 4.083 ;
299+ double correctDeltaT1star = 43.2234 ;
300+ double correctDeltaT1 = 173.9150 ;
301+ double correctTimeFlip = 4 ;
302+
303+ // init the necessary objects
304+ Ox::ModelT1Shmolli<TYPE> model;
305+ Ox::FitterLevenbergMarquardtVnl<TYPE> fitter;
306+ Ox::SignCalculatorNoSign<TYPE> signCalculator;
307+ Ox::StartPointCalculatorShmolli<TYPE> startPointCalculator;
308+ Ox::CalculatorT1Shmolli<TYPE> calculator;
309+
310+ // configure
311+ calculator.setModel (&model);
312+ calculator.setFitter (&fitter);
313+ calculator.setSignCalculator (&signCalculator);
314+ calculator.setStartPointCalculator (&startPointCalculator);
315+
316+ // set the data
317+ calculator.setNSamples (nSamples);
318+ calculator.setInvTimes (time);
319+ calculator.setSigMag (signal);
320+
321+ calculator.calculate ();
322+
323+ EXPECT_NEAR (calculator.getResults ()[" A" ], correctA, tolerance);
324+ EXPECT_NEAR (calculator.getResults ()[" B" ], correctB, tolerance);
325+ EXPECT_NEAR (calculator.getResults ()[" T1star" ], correctT1star, tolerance);
326+ EXPECT_NEAR (calculator.getResults ()[" T1" ], correctT1, tolerance);
327+ EXPECT_NEAR (calculator.getResults ()[" R2Abs" ], correctR2Abs, tolerance);
328+ EXPECT_NEAR (calculator.getResults ()[" deltaA" ], correctDeltaA, tolerance);
329+ EXPECT_NEAR (calculator.getResults ()[" deltaB" ], correctDeltaB, tolerance);
330+ EXPECT_NEAR (calculator.getResults ()[" deltaT1star" ], correctDeltaT1star, tolerance);
331+ EXPECT_NEAR (calculator.getResults ()[" deltaT1" ], correctDeltaT1, tolerance);
332+ EXPECT_NEAR (calculator.getResults ()[" timeFlip" ], correctTimeFlip, tolerance);
333+ }
334+
335+ TEST (tomato, T1Shmolli_calculateSignWithoutPhase_7samples) {
336+
337+ typedef double TYPE;
338+
339+ TYPE signal[] = {
340+ 89.360373295046656 ,
341+ 8.201722900215362 ,
342+ 81.208183776022977 ,
343+ 261.15290739411341 ,
344+ 270.49353912419241 ,
345+ 269.98456568557071 ,
346+ 270.83237616654702 ,
347+ };
348+ TYPE time[] = { 100 , 180 , 260 , 1000 , 1900 , 2800 , 3700 };
349+ int nSamples = 7 ;
350+
351+ double tolerance = 1e-2 ;
352+
353+ double correctA = 270.6357 ;
354+ double correctB = 537.7456 ;
355+ double correctT1star = 249.7954 ;
356+ double correctT1 = 246.5412 ;
357+ double correctR2Abs = 0.9998 ;
358+ double correctDeltaA = 0.3358 ;
359+ double correctDeltaB = 1.8499 ;
360+ double correctDeltaT1star = 1.4237 ;
361+ double correctDeltaT1 = 3.7284 ;
362+ double correctTimeFlip = 1 ;
181363
182364 // init the necessary objects
183365 Ox::ModelT1Shmolli<TYPE> model;
0 commit comments