File indexing completed on 2023-03-17 11:25:28
0001 #include "SimMuon/Neutron/src/AsciiNeutronReader.h"
0002 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0003 #include "FWCore/Utilities/interface/EDMException.h"
0004 #include "FWCore/ParameterSet/interface/FileInPath.h"
0005 #include <sstream>
0006 #include <iostream>
0007
0008 using namespace std;
0009
0010 AsciiNeutronReader::AsciiNeutronReader(string fileNameBase)
0011 : theFileNameBase(fileNameBase),
0012
0013 theStreamPos(11, 0) {}
0014
0015 void AsciiNeutronReader::readNextEvent(int chamberType, edm::PSimHitContainer& result) {
0016 stringstream fileName;
0017 fileName << theFileNameBase << chamberType;
0018 ifstream fin(fileName.str().c_str(), ios::in);
0019 if (!fin.is_open()) {
0020 throw cms::Exception("NeutronReader") << "Muon neutron noise file missing " << fileName.str();
0021 }
0022
0023 int nhits = read_nhits(fin, chamberType);
0024 for (int ihit = 0; ihit < nhits; ++ihit) {
0025 float entryX, entryY, entryZ, exitX, exitY, exitZ;
0026 float p, tof, eloss, theta, phi;
0027 int type, layer, track;
0028
0029 fin >> entryX >> entryY >> entryZ >> exitX >> exitY >> exitZ >> p >> tof >> eloss >> type >> layer >> track >>
0030 theta >> phi;
0031 LocalPoint entry(entryX, entryY, entryZ);
0032 LocalPoint exit(exitX, exitY, exitZ);
0033 PSimHit phit(entry, exit, p, tof, eloss, type, layer, track, theta, phi);
0034 result.push_back(phit);
0035 }
0036 theStreamPos[chamberType] = fin.tellg();
0037 }
0038
0039 int AsciiNeutronReader::read_nhits(ifstream& fin, int chamberType) {
0040 int nhits = 0;
0041
0042 fin.seekg(theStreamPos[chamberType]);
0043 if (fin.eof()) {
0044 resetStreampos(fin, chamberType);
0045 }
0046 LogDebug("NeutronReader") << "starting from pos " << theStreamPos[chamberType] << " EOF " << fin.eof();
0047 fin >> nhits;
0048 if (fin.eof()) {
0049 resetStreampos(fin, chamberType);
0050 fin >> nhits;
0051 }
0052 LogDebug("NeutronReader") << "returning nhits " << nhits;
0053 return nhits;
0054 }
0055
0056 void AsciiNeutronReader::resetStreampos(ifstream& fin, int chamberType) {
0057 LogDebug("NeutronReader") << "reached EOF, resetting streampos ";
0058 theStreamPos[chamberType] = 0;
0059 fin.clear();
0060 fin.seekg(0, ios::beg);
0061 }