00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #define HBT_BFIELD 0.5*tesla
00017 #include <Stiostream.h>
00018 #include "Stiostream.h"
00019 #include "StHbtMaker/Reader/StHbtGstarTxtReader.h"
00020 #include "StHbtMaker/Base/StHbtEventCut.h"
00021 #include "StHbtMaker/Base/StHbtTrackCut.h"
00022 #include "StHbtMaker/Base/StHbtV0Cut.h"
00023 #include "StHbtMaker/Base/StHbtKinkCut.h"
00024
00025 #include "SystemOfUnits.h"
00026 #include "StHbtMaker/Infrastructure/StHbtTrackCollection.hh"
00027 #include "StHbtMaker/Infrastructure/StHbtV0Collection.hh"
00028 #include "phys_constants.h"
00029 #include "StPhysicalHelix.hh"
00030
00031 #ifdef __ROOT__
00032 ClassImp(StHbtGstarTxtReader)
00033 #endif
00034
00035 #if !(ST_NO_NAMESPACES)
00036 using namespace units;
00037 #endif
00038
00039
00040 int get_next_int(string strline,int start_at,int& wordends){
00041 int wordstarts = strline.find_first_not_of(" ",start_at);
00042 wordends = strline.find_first_of(" ",wordstarts);
00043 int ians = atoi((strline.substr(wordstarts,wordends-1)).c_str());
00044 return ians;
00045 }
00046 float get_next_float(string strline,int start_at, int& wordends){
00047 int wordstarts = strline.find_first_not_of(" ",start_at);
00048 wordends = strline.find_first_of(" ",wordstarts);
00049 float ans = atof((strline.substr(wordstarts,wordends-1)).c_str());
00050 return ans;
00051 }
00052 double dedxMean_geantTxt(double mass, double momentum){
00053 double dedxMean;
00054 double tpcDedxGain = 0.174325e-06;
00055 double tpcDedxOffset = -2.71889;
00056 double tpcDedxRise = 776.626;
00057
00058 double gamma = ::sqrt(::pow(momentum/mass,2)+1.);
00059 double beta = ::sqrt(1. - 1./::pow(gamma,2));
00060 double rise = tpcDedxRise*::pow(beta*gamma,2);
00061 if ( beta > 0)
00062 dedxMean = tpcDedxGain/::pow(beta,2) * (0.5*::log(rise)-::pow(beta,2)- tpcDedxOffset);
00063 else
00064 dedxMean = 1000.;
00065 return dedxMean;
00066 }
00067
00068
00069
00070
00071 StHbtGstarTxtReader::StHbtGstarTxtReader() : mInputStream(0){
00072 mFileName = "GstarTextFile";
00073 mReaderStatus = 0;
00074 }
00075
00076
00077 StHbtGstarTxtReader::StHbtGstarTxtReader(char* file) : mInputStream(0), mFileName(file)
00078 {
00079 mReaderStatus = 0;
00080 }
00081
00082
00083 StHbtGstarTxtReader::~StHbtGstarTxtReader(){
00084 if (!mInputStream){
00085 delete mInputStream;
00086 mInputStream = 0;
00087 }
00088 }
00089
00090
00091 StHbtEvent* StHbtGstarTxtReader::ReturnHbtEvent(){
00092 if (!mInputStream){
00093 cout << "StHbtGstarTxtReader::ReturnHbtEvent() - there is no input stream!";
00094 mReaderStatus = 1;
00095 return (0);
00096 }
00097 if (!(*mInputStream)){
00098 cout << "StHbtGstarTxtReader::ReturnHbtEvent() - input stream in bad state!" << endl;
00099 cout << "State is " << mInputStream->rdstate() << endl;
00100 mReaderStatus = 1;
00101 return (0);
00102 }
00103
00104 string strline;
00105 char line[100];
00106 string keyword;
00107 int stringposition;
00108
00109
00110 keyword = "EVENT:";
00111
00112 cout << "StHbtGstarTxtReader::ReturnHbtEvent() -- find and decode EVENT line..." << endl;
00113 while (strline.substr(0,keyword.size()) != keyword){
00114 (*mInputStream).getline(line,100);
00115 strline = line;
00116 if (!(mInputStream->good())){
00117 cout << "StHbtGstarTxtReader::ReturnHbtEvent() - input stream in bad state!" <<endl;
00118 cout << "State is " << mInputStream->rdstate() << endl;
00119 mReaderStatus = 1;
00120 return (0);
00121
00122 }
00123 }
00124
00125
00126
00127 int ievent = get_next_int(strline,keyword.size()+1,stringposition);
00128 int ntracks = get_next_int(strline,stringposition,stringposition);
00129 int nvertices = get_next_int(strline,stringposition,stringposition);
00130 cout << "Event number is " << ievent << endl;
00131 cout << "Number of tracks is " << ntracks << endl;
00132 cout << "Number of vertices is " << nvertices << endl;
00133
00134 if (ntracks <= 0){
00135 cout << "StHbtGstarTxtReader::ReturnHbtEvent() - hit end-of-file " << endl;
00136 cout << "State is " << mInputStream->rdstate() << endl;
00137 mReaderStatus = 1;
00138 return (0);
00139 }
00140
00141
00142 StHbtEvent* event = new StHbtEvent;
00143 const StHbtThreeVector vertexPos(0.0,0.0,0.0);
00144
00145 event->SetEventNumber(ievent);
00146 event->SetCtbMult(0);
00147 event->SetZdcAdcEast(0);
00148 event->SetZdcAdcWest(0);
00149 event->SetNumberOfTpcHits(0);
00150 event->SetNumberOfTracks(ntracks);
00151 event->SetNumberOfGoodTracks(ntracks);
00152 event->SetReactionPlane(0.);
00153 event->SetReactionPlaneSubEventDifference(0.);
00154 event->SetPrimVertPos(vertexPos);
00155
00156
00157
00158 int pid;
00159 float px,py,pz;
00160 StHbtThreeVector p;
00161 keyword = "TRACK:";
00162 for (int itrack=0; itrack<ntracks; itrack++){
00163 strline = " ";
00164 while (strline.substr(0,keyword.size()) != keyword){
00165 (*mInputStream).getline(line,100);
00166 strline = line;
00167 if (!(mInputStream->good())){
00168 cout << "StHbtGstarTxtReader::ReturnHbtEvent() - input stream in bad state!" <<endl;
00169 cout << "State is " << mInputStream->rdstate() << endl;
00170 mReaderStatus = 1;
00171 return (0);
00172
00173 }
00174 }
00175
00176
00177 pid = get_next_int(strline,keyword.size()+1,stringposition);
00178 px = get_next_float(strline,stringposition,stringposition);
00179 py = get_next_float(strline,stringposition,stringposition);
00180 pz = get_next_float(strline,stringposition,stringposition);
00181
00182 int charge = -1;
00183 float mass=0.0;
00184
00185 StHbtTrack* hbtTrack = new StHbtTrack;
00186
00187
00188 hbtTrack->SetTrackId(itrack);
00189
00190 switch (pid){
00191 case 2:
00192 charge = 1;
00193 case 3:
00194 hbtTrack->SetNSigmaElectron(0.);
00195 hbtTrack->SetNSigmaPion(999.);
00196 hbtTrack->SetNSigmaKaon(-999.);
00197 hbtTrack->SetNSigmaProton(-999.);
00198 mass = 5.1099905E-04;
00199 break;
00200 case 8:
00201 charge = 1;
00202 case 9:
00203 hbtTrack->SetNSigmaElectron(999.);
00204 hbtTrack->SetNSigmaPion(0.);
00205 hbtTrack->SetNSigmaKaon(-999.);
00206 hbtTrack->SetNSigmaProton(-999.);
00207 mass = 0.139567;
00208 break;
00209 case 11:
00210 charge = 1;
00211 case 12:
00212 hbtTrack->SetNSigmaElectron(999.);
00213 hbtTrack->SetNSigmaPion(999.0);
00214 hbtTrack->SetNSigmaKaon(0.);
00215 hbtTrack->SetNSigmaProton(-999.);
00216 mass = 0.493667;
00217 break;
00218 case 14:
00219 charge = 1;
00220 hbtTrack->SetNSigmaElectron(999.);
00221 hbtTrack->SetNSigmaPion(999.);
00222 hbtTrack->SetNSigmaKaon(999.);
00223 hbtTrack->SetNSigmaProton(0.);
00224 mass = 0.93828;
00225 break;
00226 default:
00227
00228 charge = -99;
00229 mass = 0.0;
00230 break;
00231 }
00232
00233 if (charge == -99){
00234 delete hbtTrack;
00235
00236 continue;
00237 }
00238
00239
00240 StHbtThreeVector tmpP;
00241 tmpP.setX(px);
00242 tmpP.setY(py);
00243 tmpP.setZ(pz);
00244 hbtTrack->SetP( tmpP );
00245
00246
00247
00248
00249 hbtTrack->SetNHits(45);
00250 hbtTrack->SetNHitsPossible(45);
00251 hbtTrack->SetdEdx( dedxMean_geantTxt( mass, tmpP.mag() ) );
00252 hbtTrack->SetPt( tmpP.perp());
00253 hbtTrack->SetCharge(charge);
00254
00255 StPhysicalHelixD helix = StPhysicalHelixD( hbtTrack->P(), vertexPos, HBT_BFIELD, hbtTrack->Charge() );
00256 hbtTrack->SetHelix(helix);
00257
00258 hbtTrack->SetDCAxy(0.001);
00259 hbtTrack->SetDCAz(0.001);
00260 hbtTrack->SetChiSquaredXY( 0.);
00261 hbtTrack->SetChiSquaredZ( 0.);
00262
00263 event->TrackCollection()->push_back(hbtTrack);
00264 }
00265 cout << event->TrackCollection()->size() << " tracks pushed to collection" << endl;
00266
00267 return event;
00268 }
00269
00270
00271 StHbtString StHbtGstarTxtReader::Report(){
00272 StHbtString temp = "\n This is the StHbtGstarTxtReader - no Early Cuts applied\n";
00273 temp += " *** NOTE I am kinda stupid-- I do NOT handle vertices, and I ONLY\n";
00274 temp += " *** know about pions protons and kaons\n";
00275 return temp;
00276 }
00277
00278
00279
00280 int StHbtGstarTxtReader::Init(const char* ReadWrite, StHbtString& Message){
00281 cout << " *\n *\n *\n StHbtGstarTxtReader::Init() being called*\n *\n";
00282 mReaderStatus = 0;
00283
00284 if (((*ReadWrite)=='r')|| ((*ReadWrite)=='R')){
00285 mInputStream = new ifstream;
00286 mInputStream->open(mFileName);
00287 if (!(*mInputStream)){
00288 cout << "StHbtGstarTxtReader::Init() - Cannot open input file! " << endl;
00289 return (1);
00290 }
00291 cout << "StHbtGstarTxtReader::Init() - being configured as a Reader - " << ReadWrite << endl;
00292 }
00293 else{
00294 cout << " CANNOT BE CONFIGURED AS A WRITER" << endl;
00295 return (1);
00296 }
00297 return (0);
00298 }
00299
00300
00301 void StHbtGstarTxtReader::Finish(){
00302 if (mInputStream) mInputStream->close();
00303 }
00304