'''
@brief Runs routines that read in text image files; writes out "movie" file + moments in fits form.
@author A. Connors
'''
# @file run_get_multi_txt_matrix.py
#
# This script is explicitly for reading in "output.txt" format files
# and writing them out in fits form compatible with
# CHASC imaging software.
#
import pyfits
#from numarray import * ## Changed to numpy Aug 2007
from numpy import *
from get_txt_rmatrix import *

#----------------------New method requires a fits exposure file, number of iterations/inputfile--------------------------------------------#
infile_list = [
    ([('Bayes-Image-Analysis_dvd_061211/do_emc2c1_Pad128ModelData.PSFonVP3_3C279andDiffFromVP3Mean_vp0030_g001_001-002GeV.070220a.on_128_001-002GeVcounts_vp0030_g001.it1000.ms100gamttlcnt_1_.05FitS0.070220b.output.txt',100)],
     'Bayes-Image-Analysis_dvd_061211/do_emc2c1_Pad128ModelData.PSFonVP3_3C279andDiffFromVP3Mean_vp0030_g001_001-002GeV.070220a.on_128_001-002GeVcounts_vp0030_g001.it1000.ms100gamttlcnt_1_.05FitS0.070220b.allmovies.fits',
     'Bayes-Image-Analysis_dvd_061211/do_emc2c1_Pad128ModelData.PSFonVP3_3C279andDiffFromVP3Mean_vp0030_g001_001-002GeV.070220a.on_128_001-002GeVcounts_vp0030_g001.it1000.ms100gamttlcnt_1_.05FitS0.070220b.moments.fits',
     'Pad128ExpAreaTime_vp0110_g001_001-002GeV.070218a.fits'
     )
    ]

infile_list = [
    ([('Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_Nu2Sum242PoisDatonPaddedIntTime539.X.060529.it1000.ms100gamttlcnt_1_.05FitS0.070904a.output.txt',100)],
     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_Nu2Sum242PoisDatonPaddedIntTime539.X.060529.it1000.ms100gamttlcnt_1_.05FitS0.070904a.allmovies.fits',
     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_Nu2Sum242PoisDatonPaddedIntTime539.X.060529.it1000.ms100gamttlcnt_1_.05FitS0.070904a.moments.fits',
     'ExposrTimPaddedIntTime539.0.060529.fits'
     )
    ]

infile_list = [(
    [
     ('Bayes-Image-Analysis_dvd_060818/do_emc2c1_PoisDatonPaddedIntTime539.X.060612.it1000.ms100gamttlcnt_1_.05FitS0.060819a.output.txt',100),
     ('Bayes-Image-Analysis_dvd_060818/do_emc2c1_PoisDatonPaddedIntTime539.X.060612.it1000.ms100gamttlcnt_1_.05FitS0.060822a.output.txt',100),
     ('Bayes-Image-Analysis_dvd_060818/do_emc2c1_PoisDatonPaddedIntTime539.X.060612.it1000.ms100gamttlcnt_1_.05FitS0.060822b.output.txt',100),
     ('Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_PoisDatonPaddedIntTime539.X.060612.it5000.ms100gamttlcnt_1_.05FitS0.070906a.output.txt',500)
    ],
     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_PoisDatonPaddedIntTime539.X.060612.it5000.ms100gamttlcnt_1_.05FitS0.All.allmovies.fits',
     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_PoisDatonPaddedIntTime539.X.060612.it5000.ms100gamttlcnt_1_.05FitS0.All.moments.fits',
     'ExposrTimPaddedIntTime539.0.060529.fits',
     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_PoisDatonPaddedIntTime539.X.060612.it5000.ms100gamttlcnt_1_.05FitS0.All.chopmovies.fits'
     )
    ]

## For debugging:
##infile_list=[(
##   [
#     ('Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_Nu3SumPoisDatonPaddedIntTime133.0.070905.it4000.ms100gamttlcnt_1_.05FitS0.070905b.output.txt',400)
#    ],
#     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_Nu3SumPoisDatonPaddedIntTime133.0.070905.it4000.ms100gamttlcnt_1_.05FitS0.070905bcd.allmovies.fits',
#     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_Nu3SumPoisDatonPaddedIntTime133.0.070905.it4000.ms100gamttlcnt_1_.05FitS0.070905bcd.moments.fits',
#     'ExposrTimPaddedIntTime539.0.060529.fits',
#     'Bayes-Image-Analysis_dvd_060818/do_emc2c1_ModelDataPaddedIntTime539.0.060529_on_Nu3SumPoisDatonPaddedIntTime133.0.070905.it4000.ms100gamttlcnt_1_.05FitS0.070905bcd.chopmovies.fits'
#     )
###    ]

### Initializing:
print '** CAUTION: CURRENTLY 128x128 ARE MAGIC NUMBERS **'

numburnin = 10   #   For each input file, Assume 1st 9-10 lines of 'output.txt' get tossed; converges later

blankarray = zeros([1,128,128],dtype=float)  # For the "movie" file, to visually see boundary between files.

imode = 5   # Placeholder.

## Silly initialization of output file, an "pyfits.append" seems not to work as advertised.
for nametuple in infile_list:
    BigAllIters = 0
    BigChopIters= 0
    for (infilename, niter) in nametuple[0]:
        BigAllIters  += niter+1
        BigChopIters +=(niter-numburnin)

    print 'Total number of samples for AllMovies data: ',BigAllIters
    BigAllMoviesData = zeros( (BigAllIters,128,128),dtype=float)
    allmoviepointer  = 0
    print 'Total number of samples for ChopMovies data: ',BigChopIters
    BigChopMoviesData= zeros((BigChopIters,128,128),dtype=float)
    chopmoviepointer = 0

    print '\n \n run_get_multi_txt_rmatrix: File names:\n'##,nametuple[0], '\n \n \n',nametuple[1], '\n \n',nametuple[2], '\n \n', nametuple[3], '\n \n', nametuple[4], '\n \n \n'
    for (infilename, niter) in nametuple[0]:
        print 'Within nametuple[0] loop.  Now scanning ',niter,' samples from '
        print infilename, ' \n \n'
        this_naxis_3tuple = (niter, 128, 128)
        tst = ScanTxtMatrix(infilename,this_naxis_3tuple)
        print 'Data: ', tst.data
##        pyfits.append(nametuple[1], tst.data)
        BigAllMoviesData [ allmoviepointer: allmoviepointer+niter] = tst.data[0:niter]
        allmoviepointer  += niter
        BigAllMoviesData[ allmoviepointer: allmoviepointer+1] = blankarray[0]
        allmoviepointer  += 1
        cleandata = tst.data[numburnin:niter]
        liter = niter-numburnin
        BigChopMoviesData[chopmoviepointer:chopmoviepointer+liter] = cleandata[0:liter]
        chopmoviepointer +=liter

    print 'End of nametuple[0] loop'

    tst1_HDU = pyfits.PrimaryHDU(data=BigAllMoviesData)
    tst1_HDU.writeto(nametuple[1])
    print 'Allmovie Fits data final shape: ', tst1_HDU.header, '\n',  tst1_HDU.data.shape
    print 'Allmovie Fits file written  \n \n'

    tst4_HDU = pyfits.PrimaryHDU(data=BigChopMoviesData)
    tst4_HDU.writeto(nametuple[4])
    print 'Allmovie Fits data with burn-in chopped off final shape: ', tst4_HDU.header, '\n',  tst4_HDU.data
    print 'Allmovie Fits file with burn-in chopped off successfully written \n \n'

    MatchedExposrHDULst = pyfits.open(nametuple[3])
    print 'Exposure Fits file successfully opened \n'
#   touch HDU to make sure all is well:
    print MatchedExposrHDULst[0].header, '\n'
    print MatchedExposrHDULst[0].data[0][63][63], '\n \n'

    Allcleanmoments_HDULst = pyfits.open(nametuple[4])
    print '\n Final Shape of Allcleanmoments: ', Allcleanmoments_HDULst[0].data.shape
    print '\n Final Data of Allcleanmoments: ', Allcleanmoments_HDULst[0].data, '\n'
    Allcleanmoments_HDULst.close()
    tstmoments = MatrixModeNMoments(Allcleanmoments_HDULst[0].data,imode,MatchedExposrHDULst[0].data[0],nametuple[2])

    print 'Accumulated moments file successfully written \n \n'
    
# End!!
