CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TRandomAdaptor.cc
Go to the documentation of this file.
3 
4 #include "CLHEP/Random/engineIDulong.h"
5 
6 #include "TBufferFile.h"
7 
8 #include <cstddef>
9 #include <iomanip>
10 #include <iostream>
11 #include <sstream>
12 #include <stdint.h>
13 #include <string>
14 
15 namespace edm {
16 
18  Grumble(std::string("Cannot instantiate a TRandom engine from an istream"));
19 }
20 
22 }
23 
24 std::ostream& TRandomAdaptor::put(std::ostream& os) const {
25  Grumble(std::string("put(std::ostream) not available for TRandom engines"));
26  return os;
27 }
28 
29 std::vector<unsigned long> TRandomAdaptor::put() const {
30  std::vector<unsigned long> v;
31 
32  int32_t itemSize = sizeof(uint32_t);
33  TBufferFile buffer(TBuffer::kWrite, 2048 * itemSize);
34  trand_->Streamer(buffer);
35  buffer.SetReadMode();
36  char* bufferPtr = buffer.Buffer();
37  int32_t numItems = (buffer.Length() + itemSize - 1) / itemSize;
38  v.reserve(numItems + 1);
39  v.push_back(CLHEP::engineIDulong<TRandomAdaptor>());
40  for(int i = 0; i < numItems; ++i) {
41 
42  // Here we do some ugly manipulations to the data to match the format
43  // of the output of the CLHEP put function (the whole point of this adaptor
44  // is to make TRandom3 work through the CLHEP interface as if it were a
45  // a CLHEP engine ...). In CLHEP, the vector returned by put contains
46  // unsigned long's, but these always contain only 32 bits of information.
47  // In the case of a 64 bit build the top 32 bits is only padding (all 0's).
48 
49  // Get the next 32 bits of data from the buffer
50  uint32_t value32 = *reinterpret_cast<uint32_t*>(bufferPtr + i * itemSize);
51 
52  if(i == numItems - 1) {
53  int nBytes = buffer.Length() % itemSize;
54  if(nBytes == 1) value32 &= 0xffu;
55  else if(nBytes == 2) value32 &= 0xffffu;
56  else if(nBytes == 3) value32 &= 0xffffffu;
57  }
58 
59  // Push it into the vector in an unsigned long which may be 32 or 64 bits
60  v.push_back(static_cast<unsigned long>(value32));
61  }
62  return v;
63 }
64 
65 std::istream& TRandomAdaptor::get(std::istream& is) {
66  Grumble(std::string("get(std::istream) not available for TRandom engines"));
67  return getState(is);
68 }
69 
70 std::istream& TRandomAdaptor::getState(std::istream& is) {
71  Grumble(std::string("getState(std::istream) not available for TRandom engines"));
72  return is;
73 }
74 
75 bool TRandomAdaptor::get(std::vector<unsigned long> const& v) {
76  if(v.empty()) return false;
77  if(v[0] != CLHEP::engineIDulong<TRandomAdaptor>()) return false;
78  int32_t numItems = v.size()-1;
79 
80  int32_t itemSize = sizeof(uint32_t);
81  TBufferFile buffer(TBuffer::kRead, numItems * itemSize + 1024);
82  char* bufferPtr = buffer.Buffer();
83  for(int32_t i = 0; i < numItems; ++i) {
84 
85  *reinterpret_cast<uint32_t*>(bufferPtr + i * itemSize) = static_cast<uint32_t>(v[i+1] & 0xffffffff);
86  }
87 
88  // Note that this will fail if the TRandom3 version (specifically the TStreamerInfo)
89  // has changed between the time the state was saved and the time the following call
90  // is made. Because we are manually calling the Streamer function, the original
91  // TStreamerInfo is not saved anywhere. Normally ROOT saves the TStreamerInfo
92  // automatically.
93  trand_->Streamer(buffer);
94 
95  return true;
96 }
97 
98 void TRandomAdaptor::Grumble(std::string const& errortext) const {
99 
100 // Throw an edm::Exception for unimplemented functions
101  std::ostringstream sstr;
102  sstr << "Unimplemented Feature: " << errortext << '\n';
104  throw except;
105 }
106 
107 } // namespace edm
int i
Definition: DBlmapReader.cc:9
std::vector< unsigned long > put() const
virtual std::istream & getState(std::istream &is)
virtual std::istream & get(std::istream &is)
void Grumble(std::string const &errortext) const
mathSSE::Vec4< T > v