Wiki

Clone wiki

PnP-MRF / PNP

In-cilico PnP-MRF Experiments

##How to compile##

$ make mrs
Note: This code contains low level system optimization using Advanced Vector Extensions (AVX). For more info see: wikipedia and intel

##How to run## Step 1: Create the dictionary.

$ ./Create_PNP_Dictionary.app

Set 2: Simulate the acquisition process

$ ./Simulate_PNP_acquisition.app

Set 3: Reconstruct measurement data

$ ./Recon_PnP.app

##How to view## The results are stored in the './Results/' subfolder (160x160 array of 32 bit real):

$ ./Results/PNP_recon_PD.float     (PD-map      [a.u])
$ ./Results/PNP_recon_T1.float     (T1-map      [ms] )
$ ./Results/PNP_recon_T2.float     (T2-map      [ms] )
$ ./Results/PNP_recon_M1.float     (B1-map TX1  [ms] )
$ ./Results/PNP_recon_M3.float     (B1-map TX2  [ms] )

To view the result one can us the exemplary Matlab code:

$ ./View_PNP_results_in_matlab.m
##How to reconstruct scanner data## With a few minor modifications, the same code can be used to reconstruct data acquired with a MR scanner.

Step 1: To take the slice-profile into account, change line 10 in ./SEQ_PNP/PNP_Config.h to:

#!c++
#define SPAT_STEPS 8
Recompile and run the dictionary simulation (which will now take about 8x longer).
$ ./make pnp && ./Create_PnP_Dictionary.cpp
This will create a new dictionary corresponding to a slice profile produced Sinc pulse with a time-bandwitdth product of 2.

Step 2: Safe the scanner data into a 32 bit float file with the following alignment:

#!c++
|A 1|A 2| ... |A 32|B 1||B 2| ... |A B32||C 1|C 2| ... 
Where A1 to A32 are the compressed time points of the first PnP-MR fingerprint, B the second, etc. The file name should be "pnp_acquisition.float".

Place the dictionary ('pnp_dictionary.float' & 'pnp_lookup_table.float'), scanner data ('pnp_acquisition.float') and reconstruction program ('Recon_PnP.app') into the same folder. Create a subfolder called 'Results' and run:

$ mkdir Results && ./Recon_PnP.app

Updated