00001
00002
00003
00004
00005
00006
00007 #ifndef StHbtIOBinary_hh
00008 #define StHbtIOBinary_hh
00009
00010
00011 #include "StHbtMaker/Infrastructure/StHbtV0.hh"
00012 #include "StHbtMaker/Infrastructure/StHbtTrack.hh"
00013 #include "StHbtMaker/Infrastructure/StHbtEvent.hh"
00014 #include "StarClassLibrary/StPhysicalHelix.hh"
00015 #include <float.h>
00016 #include <limits.h>
00017 #include <Stiostream.h>
00018 #include "Stiostream.h"
00019
00020 typedef unsigned int colSizeType;
00021
00022
00023
00024
00025
00026
00027
00028
00029 enum ioStatus { ioOK=0, ioERR, ioEOF, ioEOL, ioERROpen };
00030
00031 class StHbtIOBinary {
00032 protected:
00033 int mDebug;
00034 public:
00035 int byteCounterEvent;
00036 int byteCounterTotal;
00037 ofstream* mOStream;
00038 ifstream* mIStream;
00039
00040 StHbtIOBinary(const char* dirName, const char* fileName, const char* appendix, const char* readWrite);
00041 ~StHbtIOBinary();
00042
00043 #ifndef SOLARIS
00044 template<class T> int read(T& x);
00045 template<class T> int write(const T& x);
00046 #else
00047 int read(unsigned short x) {return 0;}
00048 int read(const StHbtTrack) {return 0;}
00049 int read(const StHbtV0) {return 0;};
00050 int write(const StHbtTrack) {return 0;}
00051 int write(unsigned short x) {return 0;}
00052 int write(const StHbtV0) {return 0;}
00053 #endif
00054
00055 int read(StThreeVectorD& x);
00056 int write(const StThreeVectorD& x);
00057 int read(StPhysicalHelixD& x);
00058 int write(const StPhysicalHelixD& x);
00059
00060 int read(StHbtEvent& event, unsigned short evVersion, unsigned short trVersion, unsigned short v0Version );
00061 int write(const StHbtEvent& event, unsigned short evVersion, unsigned short trVersion, unsigned short v0Version );
00062
00063 int read(StHbtTrack&, unsigned short);
00064 int write(const StHbtTrack&, unsigned short);
00065
00066 int read(StHbtV0&, unsigned short);
00067 int write(const StHbtV0&, unsigned short);
00068
00069 int readString(StHbtString&);
00070 int writeString(const StHbtString&);
00071 int readHeader(StHbtString&);
00072 int writeHeader(const StHbtString&);
00073 int bytesRead();
00074 int bytesWritten();
00075
00076
00077 int read_V0(StHbtEvent& event, unsigned short trVersion, unsigned short v0Version );
00078 int read_V1(StHbtEvent& event, unsigned short trVersion, unsigned short v0Version );
00079 int read_V2(StHbtEvent& event, unsigned short trVersion, unsigned short v0Version );
00080 int write_V0(const StHbtEvent& event, unsigned short trVersion, unsigned short v0Version );
00081 int write_V1(const StHbtEvent& event, unsigned short trVersion, unsigned short v0Version );
00082 int write_V2(const StHbtEvent& event, unsigned short trVersion, unsigned short v0Version );
00083
00084 int read_V1(StHbtTrack&);
00085 int read_V2(StHbtTrack&);
00086 int write_V1(const StHbtTrack&);
00087 int write_V2(const StHbtTrack&);
00088
00089 int read_V1(StHbtV0&);
00090 int read_V2(StHbtV0&);
00091 int read_V3(StHbtV0&);
00092 int write_V1(const StHbtV0&);
00093 int write_V2(const StHbtV0&);
00094 int write_V3(const StHbtV0&);
00095
00096 int outputStreamStatus();
00097 int inputStreamStatus();
00098
00099 int readTrackList(StHbtEvent&, unsigned short trVersion);
00100 int readV0List(StHbtEvent&, unsigned short v0Version);
00101 int writeTrackList(const StHbtEvent&, unsigned short trVersion);
00102 int writeV0List(const StHbtEvent&, unsigned short v0Version);
00103
00104 const char* parseDirFile(const char*, const char*, const char*);
00105
00106 void wait(int n, const char* c) {
00107 for (int i = 0; i< 1e6*n; i++) {
00108 cout << c;
00109 }
00110 }
00111 };
00112
00113 inline int StHbtIOBinary::outputStreamStatus() {
00114 if (mOStream) return !mOStream->good();
00115 return ioERR;
00116 }
00117 inline int StHbtIOBinary::inputStreamStatus() {
00118 if (mIStream) return !mIStream->good();
00119 return ioERR;
00120 }
00121
00122 #ifndef SOLARIS
00123 template<class T>
00124 inline int StHbtIOBinary::read(T& x){
00125 mIStream->read( (char*)&x, sizeof(x) );
00126 byteCounterEvent += sizeof(x);
00127 return (!mIStream->good());
00128 }
00129 template<class T>
00130 inline int StHbtIOBinary::write(const T& x){
00131 mOStream->write( (char*)&x, sizeof(x) );
00132 byteCounterEvent += sizeof(x);
00133 return (!mOStream->good());
00134 }
00135 #endif
00136
00137 inline int StHbtIOBinary::read(StThreeVectorD& x) {
00138 int iret;
00139 double a,b,c;
00140 iret = read(a);
00141 iret = read(b);
00142 iret = read(c);
00143 x = StHbtThreeVector(a,b,c);
00144 return (!mIStream->good());
00145 };
00146
00147 inline int StHbtIOBinary::write(const StThreeVectorD& x) {
00148 int iret;
00149 double a,b,c;
00150 a = x.x(); b = x.y(); c = x.z();
00151 iret = write(a);
00152 iret = write(b);
00153 iret = write(c);
00154 return (!mOStream->good());
00155 };
00156 inline int StHbtIOBinary::read(StPhysicalHelixD& x){
00157 int iret;
00158 double c, dip, phase;
00159 StThreeVectorD o;
00160 int h=-1;
00161 iret = read(o);
00162 iret = read(dip);
00163 iret = read(c);
00164 iret = read(phase);
00165 iret = read(h);
00166 x = StPhysicalHelixD(c,dip,phase,o,h);
00167 return (!mIStream->good());
00168 };
00169
00170 inline int StHbtIOBinary::write(const StPhysicalHelixD& x){
00171 int iret;
00172 double c, dip, phase;
00173 StThreeVectorD o;
00174 int h=-1;
00175 c = x.curvature();
00176 dip = x.dipAngle();
00177 phase = x.phase();
00178 o = x.origin();
00179 h = x.h();
00180 iret = write(o);
00181 iret = write(dip);
00182 iret = write(c);
00183 iret = write(phase);
00184 iret = write(h);
00185 return (!mOStream->good());
00186 };
00187
00188 #endif