# read projections
prjs = np.load(args.sino)
prjs = np.copy(prjs[args.slices[0]:args.slices[1], ...], 'C') / args.imgNorm

# add noise to projections
np.random.seed(0)
if args.N0 > 0:
    prjs = prjs + np.sqrt(
        (1 - args.doseRate) / args.doseRate * np.exp(prjs * args.imgNorm) /
        args.N0) * np.random.normal(size=prjs.shape) / args.imgNorm

# In[11]:

# mask for network training
masks = helper.GetMasks2D(reconNet, [resolution] * refs.shape[0])

# In[12]:


def CalcProjectorNorm(reconNet, weight, nIter=20):
    weight = np.sqrt(weight)

    x = np.random.random_sample([1, reconNet.nx, reconNet.ny,
                                 1]).astype(np.float32)
    x = x / np.linalg.norm(x)

    for i in range(nIter):
        print(i, end=',', flush=True)
        fp = reconNet.cDDFanProjection3d(x) * weight
        projectorNorm = np.linalg.norm(fp)
# read projections
prjs = np.load(args.sino)
prjs = np.copy(prjs[inds[:args.nSlices], ...], 'C') / args.imgNorm

# add noise to projections
np.random.seed(0)
if args.N0 > 0:
    prjs = prjs + np.sqrt((1 - args.doseRate) / args.doseRate * np.exp(prjs * args.imgNorm) / args.N0)     * np.random.normal(size = prjs.shape) / args.imgNorm


# In[8]:


# mask for network training
masks = helper.GetMasks2D(reconNet, resolutions)


# In[9]:


# fbp
imgs = []
for i in range(prjs.shape[0]):
# for i in range(10):
    if i % 10 == 0:
        print (i, end=', ')
    
    reconNet.dx = resolutions[i]
    reconNet.dy = resolutions[i]
    
reconNet.rotview = len(setToUse)
reconNet.angles = [reconNet.angles[i] for i in setToUse]

# support only one resolution
resolution = np.load(args.resolutionFile)
resolution = np.mean(resolution[args.slices[0]:args.slices[1]])
reconNet.dx = resolution
reconNet.dy = resolution


# In[38]:


# mask for network training
masks = helper.GetMasks2D(reconNet, [0.8] * refs.shape[0])


# In[39]:


# fbp 
imgs = []

for i in range(prjs.shape[0]):
# for i in range(10):
    if i % 10 == 0:
        print (i, end=', ')
    
    fp = np.copy(prjs[[i],...], 'C')