ROOT logo
/*!\class PelIO
\author Alexandre A. P. Suaide 

<p>
This class is responsible for the basic I/O between the Pelletron data files
(.FIL) and the ROOT framework. 
*/

#ifndef PelIO_HH
#define PelIO_HH

#include "stdio.h"
#include "TNamed.h"
#include "TROOT.h"
#include "TString.h"
#include "TH1.h"
#include "TString.h"
#include "TRandom.h"

#define MAXBLOCKSIZE 16384
#define MAXBLOCKSIZEWRITE 73728
#define BLOCKSIZEWRITE 65536
#define BLOCKSIZETAPE 32768
#define BLOCKSIZETAPEHEADER 256
#define STREAMSIZE 32768
#define MAXEVENTSBLOCK 16384
#define MAXOUTPUT 4
#define MAXPAR 8192

enum RetCode { kWarn, kOk, kEOF, kERR};


class PelIO : public TNamed
{
  protected:    
    unsigned short     mEventsPosition[MAXEVENTSBLOCK]; ///< Position of each event in the memory block
    unsigned short     mBlock[MAXBLOCKSIZE]; ///< Event block
    unsigned short     mResidual[MAXBLOCKSIZE]; ///< Resiual from last block
    unsigned short     mDataStream[STREAMSIZE]; ///< Input data stream
    unsigned short     mResidualSize; ///< Residual size
    unsigned short     BLOCKSIZE; ///< Block size
    unsigned long      mBytesOutput[MAXOUTPUT]; ///< Bytes in the output stream
    unsigned long      mNSaved[MAXOUTPUT]; ///< Number of events saved in the output stream
    unsigned long      mNRead; ///< Number of events read
    unsigned long      mNBlockRead; ///< Number of blocks read
    char               mOutputBuffer[MAXOUTPUT][MAXBLOCKSIZEWRITE]; ///< Output buffer
    short              mParIndexTmp[MAXPAR];
    float              mParValuesTmp[MAXPAR];
    
    unsigned short     mCurrentPosition;
    unsigned short     mNextPosition;
    unsigned short     mLastPosition;
    
    FILE               *mInput; ///< pointer to the input stream    
    FILE               *mOutput[MAXOUTPUT]; ///< pointers to the output stream
    bool               mIsInputOpen;
    bool               mIsOutputOpen[MAXOUTPUT];
    int                mLastInput; // the status of the last input request
    
    TString            mFileName; ///< Input file name
    TString            mFileNameOutput[MAXOUTPUT]; ///< Output file names
    
    bool               mDebug; ///< Debug flag
    short              mCurrentSize; ///< Current event size
    int                mStat;
    
    int                mNAddedPar;
    unsigned short     mParAdded[STREAMSIZE]; ///< added parameters
    bool               mSaveOnlyNew;
		bool               mSmearing;
    
    
    virtual int        writeEventToOutput(int out=0); ///< Method to write event number to the output
    virtual int        readBlock(); ///< Read block from input
    virtual int        decodeBlock(int = 0); ///< Decode block
    virtual int        decodeEvent(short&,short*,float*); ///< Decode event from the input
     
  public:
                       PelIO(char* name="PelIO",char *title="Pelletron IO"); ///< Default constructor
    virtual            ~PelIO(); ///< Class destructor
    
    // Input/output methods
    virtual int        openInput(char*); ///< Open input stream
    virtual int        openOutput(char*,int out=0,int run = 0, char* comment=""); ///< Open output stream
    virtual int        closeInput(); ///< Close input stream
    virtual int        closeOutput(int out=0); ///< Close output stream
    virtual int        readEvent(short,short&,float*); ///< Read event from input stream and return the parameters 
    virtual int        skipEvents(int n = 1); ///< Skip events from input file. 
    virtual int        writeEvent(int out=0); ///< Write event to the output stream		
		virtual int        rewind(); ///<Rewind input file
		
		//virtual methods for data aquisition
		virtual int                loadEVO(char*)                 { return 0;}
    virtual int                start()                        { return 0;}
    virtual int                stop()                         { return 0;}
    virtual int                getNEventsLost()               { return 0;}
    virtual int                getNUsedBuffers()              { return 0;}
    virtual int                getNBuffers()                  { return 0;}
    virtual int                readScalers(int,int*,int=0)    { return 0;}
    virtual int                clearScalers(int,int=0)        { return 0;}
    virtual int                setBufferSize(int)             { return 0;}

		
        
    // general methods
    char*              getFileName()             	       { return (char*)mFileName.Data();} ///< Get input file name
    char*              getFileNameOutput(int out=0)      { return (char*)mFileNameOutput[out].Data();} ///< Get output file name
    short              getCurrentEventSize()             { return mCurrentSize; } ///< Returns current event size in bytes
    unsigned long      getNSaved(int out=0)              { return mNSaved[out]; } ///< Get number of events saved in output
    unsigned long      getNRead()                        { return mNRead; } ///< Get number of events read from input
    unsigned long      getBlockSize()                    { return BLOCKSIZE;}  ///< Get block size
    void               setDebug(bool a)                  { mDebug = a;}  ///< Set debug mode. 
    void               setBlockSize(unsigned short a)    { BLOCKSIZE = a;} ///< Set block size
		void               setSmearing(bool s)               { mSmearing = s;} ///< Set Smearing
		
    void               printStats();                     ///< Print statictics
    int                getMaxOutput()                    { return MAXOUTPUT;}///< Return maximum number of outputs
    bool               isInputOpen()                     { return mIsInputOpen;}
    bool               isOutputOpen(int out =0)          { return mIsOutputOpen[out];}
    bool               isDebug()                         { return mDebug;}
		bool               isSmearing()                      { return mSmearing;}

    void               saveOnlyNewPar(bool a)            { mSaveOnlyNew = a;} // if true, saves only the new parameters
    bool               isSaveOnlyNewPar()                { return mSaveOnlyNew;} // returns the way of saving to the output
    void               addPar(int,float);
    
  ClassDef(PelIO,1)
};
#endif
 PelIO.h:1
 PelIO.h:2
 PelIO.h:3
 PelIO.h:4
 PelIO.h:5
 PelIO.h:6
 PelIO.h:7
 PelIO.h:8
 PelIO.h:9
 PelIO.h:10
 PelIO.h:11
 PelIO.h:12
 PelIO.h:13
 PelIO.h:14
 PelIO.h:15
 PelIO.h:16
 PelIO.h:17
 PelIO.h:18
 PelIO.h:19
 PelIO.h:20
 PelIO.h:21
 PelIO.h:22
 PelIO.h:23
 PelIO.h:24
 PelIO.h:25
 PelIO.h:26
 PelIO.h:27
 PelIO.h:28
 PelIO.h:29
 PelIO.h:30
 PelIO.h:31
 PelIO.h:32
 PelIO.h:33
 PelIO.h:34
 PelIO.h:35
 PelIO.h:36
 PelIO.h:37
 PelIO.h:38
 PelIO.h:39
 PelIO.h:40
 PelIO.h:41
 PelIO.h:42
 PelIO.h:43
 PelIO.h:44
 PelIO.h:45
 PelIO.h:46
 PelIO.h:47
 PelIO.h:48
 PelIO.h:49
 PelIO.h:50
 PelIO.h:51
 PelIO.h:52
 PelIO.h:53
 PelIO.h:54
 PelIO.h:55
 PelIO.h:56
 PelIO.h:57
 PelIO.h:58
 PelIO.h:59
 PelIO.h:60
 PelIO.h:61
 PelIO.h:62
 PelIO.h:63
 PelIO.h:64
 PelIO.h:65
 PelIO.h:66
 PelIO.h:67
 PelIO.h:68
 PelIO.h:69
 PelIO.h:70
 PelIO.h:71
 PelIO.h:72
 PelIO.h:73
 PelIO.h:74
 PelIO.h:75
 PelIO.h:76
 PelIO.h:77
 PelIO.h:78
 PelIO.h:79
 PelIO.h:80
 PelIO.h:81
 PelIO.h:82
 PelIO.h:83
 PelIO.h:84
 PelIO.h:85
 PelIO.h:86
 PelIO.h:87
 PelIO.h:88
 PelIO.h:89
 PelIO.h:90
 PelIO.h:91
 PelIO.h:92
 PelIO.h:93
 PelIO.h:94
 PelIO.h:95
 PelIO.h:96
 PelIO.h:97
 PelIO.h:98
 PelIO.h:99
 PelIO.h:100
 PelIO.h:101
 PelIO.h:102
 PelIO.h:103
 PelIO.h:104
 PelIO.h:105
 PelIO.h:106
 PelIO.h:107
 PelIO.h:108
 PelIO.h:109
 PelIO.h:110
 PelIO.h:111
 PelIO.h:112
 PelIO.h:113
 PelIO.h:114
 PelIO.h:115
 PelIO.h:116
 PelIO.h:117
 PelIO.h:118
 PelIO.h:119
 PelIO.h:120
 PelIO.h:121
 PelIO.h:122
 PelIO.h:123
 PelIO.h:124
 PelIO.h:125
 PelIO.h:126
 PelIO.h:127
 PelIO.h:128
 PelIO.h:129