CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
HcalTBSource.cc
Go to the documentation of this file.
1 #include "TFile.h"
2 #include "TTree.h"
8 #include <iostream>
9 
12 
13 using namespace edm;
14 using namespace std;
15 
17  : edm::ProducerSourceFromFiles(pset, desc, true),
18  m_quiet(pset.getUntrackedParameter<bool>("quiet", true)),
19  m_onlyRemapped(pset.getUntrackedParameter<bool>("onlyRemapped", false)),
20  m_skip(pset.getUntrackedParameter<uint32_t>("skipEvents", 0)) {
21  m_tree = nullptr;
22  m_fileCounter = -1;
23  m_file = nullptr;
24  m_i = 0;
25 
26  unpackSetup(pset.getUntrackedParameter<std::vector<std::string> >("streams", std::vector<std::string>()));
27  produces<FEDRawDataCollection>();
28 }
29 
30 void HcalTBSource::unpackSetup(const std::vector<std::string>& params) {
31  for (std::vector<std::string>::const_iterator i = params.begin(); i != params.end(); i++) {
32  unsigned long pos = i->find(':');
33  std::string streamName = i->substr(0, pos);
34  int remapTo = -1;
35  if (pos != std::string::npos)
36  remapTo = atoi(i->c_str() + pos + 1);
37 
38  m_sourceIdRemap.insert(std::pair<std::string, int>(streamName, remapTo));
39  if (remapTo != -1)
40  edm::LogInfo("HCAL") << streamName << " --> " << remapTo << endl;
41  else
42  edm::LogInfo("HCAL") << streamName << " using fedid in file" << endl;
43  }
44 }
45 
47  if (m_file != nullptr) {
48  m_file->Close();
49  m_file = nullptr;
50  m_tree = nullptr;
51  }
52 }
53 
55  if (m_file != nullptr) {
56  m_file->Close();
57  m_file = nullptr;
58  m_tree = nullptr;
59  }
60 
61  // try {
62  m_file = TFile::Open(filename.c_str());
63  if (m_file == nullptr) {
64  edm::LogError("HCAL") << "Unable to open " << filename << endl;
65  m_tree = nullptr;
66  return;
67  }
68 
69  m_tree = (TTree*)m_file->Get("CMSRAW");
70 
71  if (m_tree == nullptr) {
72  m_file->Close();
73  m_file = nullptr;
74  edm::LogError("HCAL") << "Unable to find CMSRAW tree" << endl;
75  return;
76  }
77 
78  if (!m_quiet) {
79  edm::LogInfo("HCAL") << "Opening '" << filename << "' with " << m_tree->GetEntries() << " events.\n";
80  }
81 
82  TObjArray* lb = m_tree->GetListOfBranches();
83  n_chunks = 0;
84  for (int i = 0; i < lb->GetSize(); i++) {
85  TBranch* b = (TBranch*)lb->At(i);
86  if (b == nullptr)
87  continue;
88  if (!strcmp(b->GetClassName(), "CDFEventInfo")) {
89  m_eventInfo = nullptr;
90  b->SetAddress(&m_eventInfo);
91  } else {
92  if (strcmp(b->GetClassName(), "CDFChunk"))
93  continue;
94  if (m_sourceIdRemap.find(b->GetName()) == m_sourceIdRemap.end()) {
95  if (m_onlyRemapped)
96  continue;
97  m_sourceIdRemap.insert(std::pair<std::string, int>(b->GetName(), -1));
98  if (!m_quiet)
99  edm::LogInfo("HCAL") << "Also reading branch " << b->GetName();
100  }
101 
102  m_chunks[n_chunks] = nullptr; // allow ROOT to allocate
103  b->SetAddress(&(m_chunks[n_chunks]));
104  m_chunkIds[n_chunks] = m_sourceIdRemap[b->GetName()];
105  n_chunks++;
106  }
107  }
108  m_i = 0;
109 }
110 
112  bool is_new = false;
113 
114  while (m_tree == nullptr || m_i == m_tree->GetEntries()) {
115  m_fileCounter++;
116  if (m_file != nullptr) {
117  m_file->Close();
118  m_file = nullptr;
119  m_tree = nullptr;
120  }
121  if (m_fileCounter >= int(fileNames(0).size()))
122  return false; // nothing good
124  is_new = true;
125  }
126 
127  if (m_tree == nullptr || m_i == m_tree->GetEntries())
128  return false; //nothing good
129 
130  m_tree->GetEntry(m_i);
131  m_i++;
132 
133  if (m_eventInfo != nullptr) {
134  if (is_new) {
135  if (m_eventInfo->getEventNumber() == 0)
137  else
139  }
140  // ZERO is unacceptable for a run number from a technical point of view
141  id = EventID((m_eventInfo->getRunNumber() == 0 ? 1 : m_eventInfo->getRunNumber()),
142  id.luminosityBlock(),
144  } else {
145  id = EventID(m_fileCounter + 10, id.luminosityBlock(), m_i + 1);
146  }
147  // time is a hack
148  edm::TimeValue_t present_time = presentTime();
149  unsigned long time_between_events = timeBetweenEvents();
150 
151  time = present_time + time_between_events;
152  return true;
153 }
154 
156  auto bare_product = std::make_unique<FEDRawDataCollection>();
157  for (int i = 0; i < n_chunks; i++) {
158  const unsigned char* data = (const unsigned char*)m_chunks[i]->getData();
159  int len = m_chunks[i]->getDataLength() * 8;
160 
161  int natId = m_chunks[i]->getSourceId();
162  int id = (m_chunkIds[i] > 0) ? (m_chunkIds[i]) : (natId);
163 
164  FEDRawData& fed = bare_product->FEDData(id);
165  fed.resize(len);
166  memcpy(fed.data(), data, len);
167 
168  // patch the SourceId...
169  if (natId != id) {
170  unsigned int* header = (unsigned int*)fed.data();
171  header[0] = (header[0] & 0xFFF000FFu) | (id << 8);
172  // TODO: patch CRC after this change!
173  }
174  if (!m_quiet)
175  edm::LogInfo("HCAL") << "Reading " << len << " bytes for FED " << id << std::endl;
176  }
177 
178  e.put(std::move(bare_product));
179 }
180 
182 
T getUntrackedParameter(std::string const &, T const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
TFile * m_file
Definition: HcalTBSource.h:32
int m_eventNumberOffset
Definition: HcalTBSource.h:41
int getSourceId() const
Definition: CDFChunk.h:24
Log< level::Error, false > LogError
TTree * m_tree
Definition: HcalTBSource.h:31
void openFile(const std::string &filename)
Definition: HcalTBSource.cc:54
#define DEFINE_FWK_INPUT_SOURCE(type)
void resize(size_t newsize)
Definition: FEDRawData.cc:28
def move
Definition: eostools.py:511
ClassImp(AliDaqEventHeader)
Global information about an event such as event number and run number.
Definition: CDFEventInfo.h:8
unsigned long long TimeValue_t
Definition: Timestamp.h:28
UInt_t getRunNumber() const
get the run number
Definition: CDFEventInfo.h:12
bool m_onlyRemapped
Definition: HcalTBSource.h:34
CDFChunk * m_chunks[CHUNK_COUNT]
Definition: HcalTBSource.h:37
Log< level::Info, false > LogInfo
int m_chunkIds[CHUNK_COUNT]
Definition: HcalTBSource.h:38
HcalTBSource(const edm::ParameterSet &pset, edm::InputSourceDescription const &desc)
Definition: HcalTBSource.cc:16
void unpackSetup(const std::vector< std::string > &params)
Definition: HcalTBSource.cc:30
double b
Definition: hdecay.h:118
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
tuple filename
Definition: lut2db_cfg.py:20
std::map< std::string, int > m_sourceIdRemap
Definition: HcalTBSource.h:39
CDFEventInfo * m_eventInfo
Definition: HcalTBSource.h:40
bool setRunAndEventInfo(edm::EventID &id, edm::TimeValue_t &time, edm::EventAuxiliary::ExperimentType &) override
Int_t getDataLength() const
Definition: CDFChunk.h:23
~HcalTBSource() override
Definition: HcalTBSource.cc:46
ULong64_t getEventNumber() const
get the event number
Definition: CDFEventInfo.h:16
tuple size
Write out results.
void produce(edm::Event &e) override
std::vector< std::string > fileNames(unsigned iCatalog) const
Definition: FromFiles.h:22