// Read the documentation to learn more about C++ code generator // versioning. // %X% %Q% %Z% %W% #include #include // RMF #include #include "XSstreams.h" #include #include #include // Class RMF::ChanRangeIndicators // Class RMF RMF::RMF(const RMF &right) : m_eMin(right.m_eMin), m_eMax(right.m_eMax), m_name(right.m_name), m_gqString(right.m_gqString), m_telescope(right.m_telescope), m_instrument(right.m_instrument), m_channelType(right.m_channelType), m_retainPosition(right.m_retainPosition), m_convArraySize(right.m_convArraySize), m_detectorChannels(right.m_detectorChannels), m_chanRangeIndicator(right.m_chanRangeIndicator), m_energyHigh(right.m_energyHigh), m_energyLow(right.m_energyLow), m_binStart(right.m_binStart), m_binRunLengths(right.m_binRunLengths), m_eboundsMin(right.m_eboundsMin), m_eboundsMax(right.m_eboundsMax), m_matrixValue(right.m_matrixValue), m_normFactor(right.m_normFactor), m_convArray(0), m_binResponseGroups(right.m_binResponseGroups), m_channelForRun(right.m_channelForRun), m_energyRunLengths(right.m_energyRunLengths), m_energyStart(right.m_energyStart), m_positions(right.m_positions) { m_convArray.reset(new Real[m_convArraySize]); memcpy(m_convArray.get(),right.m_convArray.get(),m_convArraySize); } RMF::RMF (const RMF::ChanRangeIndicators& chanLimits, size_t nE, size_t nC, const string& id, const CodeContainer& gqString, bool retainPositionArray) : m_eMin(0), m_eMax(0), m_name(id), m_gqString(gqString), m_telescope(), m_instrument(), m_channelType(), m_retainPosition(retainPositionArray), m_convArraySize(0), m_detectorChannels(nC), m_chanRangeIndicator(chanLimits), m_energyHigh(nE), m_energyLow(nE), m_binStart(nE), m_binRunLengths(nE), m_eboundsMin(nC), m_eboundsMax(nC), m_matrixValue(nE), m_normFactor(), m_convArray(0), m_binResponseGroups(nE), m_channelForRun(), m_energyRunLengths(), m_energyStart(), m_positions() { } RMF::~RMF() { } RMF & RMF::operator=(const RMF &right) { RMF __temp(right); swap(__temp); return *this; } int RMF::operator==(const RMF &right) const { return compare(right); } int RMF::operator!=(const RMF &right) const { return !compare(right); } void RMF::swap (RMF& right) { std::swap(m_eMin,right.m_eMin); std::swap(m_eMax,right.m_eMax); std::swap(m_name,right.m_name); std::swap(m_energyHigh,right.m_energyHigh); std::swap(m_energyLow,right.m_energyLow); std::swap(m_binResponseGroups,right.m_binResponseGroups); std::swap(m_matrixValue,right.m_matrixValue); std::swap(m_binStart,right.m_binStart); std::swap(m_binRunLengths,right.m_binRunLengths); std::swap(m_eboundsMin,right.m_eboundsMin); std::swap(m_eboundsMax,right.m_eboundsMax); m_convArray.reset(right.m_convArray.release()); std::swap(m_convArraySize,right.m_convArraySize); std::swap(m_detectorChannels,right.m_detectorChannels); std::swap(m_channelForRun,right.m_channelForRun); std::swap(m_energyRunLengths,right.m_energyRunLengths); std::swap(m_energyStart,right.m_energyStart); std::swap(m_telescope,right.m_telescope); std::swap(m_instrument,right.m_instrument); std::swap(m_gqString,right.m_gqString); std::swap(m_positions,right.m_positions); std::swap(m_retainPosition,right.m_retainPosition); std::swap(m_normFactor,right.m_normFactor); std::swap(m_chanRangeIndicator,right.m_chanRangeIndicator); std::swap(m_channelType,right.m_channelType); } RMF* RMF::clone () const { return new RMF(*this); } bool RMF::compare (const RMF& right) const { if (m_name != right.m_name) return false; if (m_gqString != right.m_gqString) return false; return true; } void RMF::createConvolutionArray () { int nE = static_cast(m_energyLow.size()); RMFLONG lnE = static_cast(m_energyLow.size()); std::vector positions; for (int i = 0; i < nE; i++) { int ngroups_i (m_binResponseGroups[i]); for (int j = 0; j(positions[0]/lnE)); //determine row m_energyStart.push_back(static_cast(positions[0]%lnE)); //determine col m_energyRunLengths.push_back(1); } for (size_t i = 1; i(pos_i/lnE)); m_energyStart.push_back(static_cast(pos_i%lnE)); m_energyRunLengths.push_back(1); } else { ++m_energyRunLengths.back(); } } IntegerArray ecount(nE, 0); m_convArraySize = cvsz; m_convArray.reset(new Real[m_convArraySize]); size_t ncrg (m_channelForRun.size()); size_t k(0); for (size_t i = 0; i < ncrg; i++) { int f_i (m_energyStart[i]); int n_i (m_energyRunLengths[i]); for (int j = 0; j < n_i; j++) { int ebin (f_i+j); m_convArray[k++] = m_matrixValue[ebin][ecount[ebin]++]; } } if (m_retainPosition) m_positions = positions; int savConVerbose = tpout.conVerbose(); int savLogVerbose = tpout.logVerbose(); XSstream::verbose(tpout,60,60); if (tpout.maxChatter() >= 60) { int nchannels (0); tcout << "ORIGINAL\n"; for (int i = 0; i < nE; i++) { for (int j = 0; j < m_binResponseGroups[i]; j++) { tcout << "Energy: " << i+1 << " nGroups: " << m_binResponseGroups[i] << " fchan: " << m_binStart[i][j] << " nchan: " << m_binRunLengths[i][j] << std::endl; nchannels += m_binRunLengths[i][j]; } } k = 0; for (size_t i = 0; i < m_matrixValue.size(); i++) { for (size_t j = 0; j < m_matrixValue[i].size(); j++) { tcout << "i: " << i << " j: " << j << " matrix: " << m_matrixValue[i][j] << std::endl; k++; } } tcout << "total number of matrix elements: " << k << '\n'; tcout << "\nFINAL\n"; int sz (m_channelForRun.size()); for (int i = 0; i 1.0e-15) { okflag = false; tcout << "ERROR" < startBin) { ngroups++; fchan.push_back(startBin); nchan.push_back(ch-startBin); rowSize += ch - startBin; } } binResponseGroups(row,ngroups); if (ngroups > 0) { matrixVal.resize(rowSize); size_t iCompressed = 0; for (size_t i=0; i