CMS 3D CMS Logo

CalibrationScanTask.cc
Go to the documentation of this file.
6 
7 #include <arpa/inet.h>
8 #include <cstdio>
9 #include <fstream>
10 #include <netdb.h>
11 #include <sys/socket.h>
12 #include <sys/unistd.h>
13 
14 // -----------------------------------------------------------------------------
15 //
18  const sistrip::RunType& rtype,
19  const char* filename,
20  uint32_t run,
21  const SiStripPedestals& pedestals)
22  : CommissioningTask(dqm, conn, "CalibrationScanTask"),
23  runType_(rtype),
24  nBins_(0),
25  lastISHA_(1000),
26  lastVFS_(1000),
27  lastCalChan_(1000),
28  lastCalSel_(1000),
29  lastLatency_(1000),
30  extrainfo_(),
31  run_(run) {
32  // each latency point is 25ns, each calSel is 25/8 --> 64 points = 8 calsel + 8 latency --> as set in the DAQ configuration
34  nBins_ = 64;
35  // each latency point is 25ns, each calSel is 25/8 --> 80 points = 8 calsel + 10 latency --> as set in the DAQ configuration
37  nBins_ = 80;
38 
39  LogDebug("Commissioning") << "[CalibrationScanTask::CalibrationScanTask] Constructing object...";
40  // load the pedestals
41  SiStripPedestals::Range detPedRange = pedestals.getRange(conn.detId());
42  int start = conn.apvPairNumber() * 256;
43  int stop = start + 256;
44  int value = 0;
45  ped.reserve(256);
46  LogDebug("Commissioning") << "[CalibrationScanTask::CalibrationScanTask] Loading pedestal for " << conn.detId();
47  if (conn.detId() == 0)
48  return;
49  for (int strip = start; strip < stop; ++strip) {
50  value = int(pedestals.getPed(strip, detPedRange));
51  if (value > 895)
52  value -= 1024;
53  ped.push_back(value);
54  }
55 }
56 
57 // -----------------------------------------------------------------------------
58 //
60  LogDebug("Commissioning") << "[CalibrationScanTask::CalibrationScanTask] Destructing object...";
61 }
62 
63 // -----------------------------------------------------------------------------
64 //
66  if (calib1_.find(extrainfo_) == calib1_.end()) {
67  // construct the histo titles and book two histograms: one per APV --> all strip in one APV are considered to fill histogram
69  runType_,
71  fedKey(),
73  connection().i2cAddr(0),
74  extrainfo_)
75  .title();
76 
80  calib1_[extrainfo_].histo(dqm()->book1D(title, title, nBins_, 0, 200));
82  calib1_[extrainfo_].histo(dqm()->book1D(title, title, nBins_, 0, 250));
83  calib1_[extrainfo_].isProfile_ = false;
84  calib1_[extrainfo_].vNumOfEntries_.resize(nBins_, 0);
85  }
86 
87  if (calib2_.find(extrainfo_) == calib2_.end()) {
89  runType_,
91  fedKey(),
93  connection().i2cAddr(1),
94  extrainfo_)
95  .title();
96 
100  calib2_[extrainfo_].histo(dqm()->book1D(title, title, nBins_, 0, 200));
102  calib2_[extrainfo_].histo(dqm()->book1D(title, title, nBins_, 0, 250));
103  calib2_[extrainfo_].isProfile_ = false;
104  calib2_[extrainfo_].vNumOfEntries_.resize(nBins_, 0);
105  }
106 }
107 
108 // -----------------------------------------------------------------------------
109 //
111  if (lastISHA_ != summary.isha() or
112  lastVFS_ != summary.vfs()) { // triggered only when there is a change in isha and vfs
113  lastISHA_ = summary.isha();
114  lastVFS_ = summary.vfs();
115  lastCalSel_ = summary.calSel();
116  lastLatency_ = summary.latency();
117  lastCalChan_ = summary.calChan();
118  extrainfo_ = "isha_" + std::to_string(lastISHA_) + "_vfs_" + std::to_string(lastVFS_);
119  book(); // book histograms and load the right one
120  } else {
121  lastISHA_ = summary.isha();
122  lastVFS_ = summary.vfs();
123  lastCalSel_ = summary.calSel();
124  lastLatency_ = summary.latency();
125  lastCalChan_ = summary.calChan();
126  extrainfo_ = "isha_" + std::to_string(lastISHA_) + "_vfs_" + std::to_string(lastVFS_);
127  }
128 
129  // retrieve the delay from the EventSummary
130  int bin = 0;
132  bin = (100 - summary.latency()) * 8 + (7 - summary.calSel());
134  bin = (102 - summary.latency()) * 8 + (7 - summary.calSel());
135 
136  // Digis are obtained for an APV pair.strips 0->127 : calib1_ strips 128->255: calib2_
137  // then, only some strips are fired at a time, we use calChan to know that
138  int isub = lastCalChan_ < 4 ? lastCalChan_ + 4 : lastCalChan_ - 4;
139  for (int k = 0; k < 16; ++k) {
140  // all strips of the APV are merged in
142  bin,
143  digis.data[lastCalChan_ + k * 8].adc() - ped[lastCalChan_ + k * 8] -
144  (digis.data[isub + k * 8].adc() - ped[isub + k * 8]));
146  bin,
147  digis.data[128 + lastCalChan_ + k * 8].adc() - ped[128 + lastCalChan_ + k * 8] -
148  (digis.data[128 + isub + k * 8].adc() - ped[128 + isub + k * 8]));
149  }
150  update(); //TODO: temporary: find a better solution later
151 }
152 
153 // -----------------------------------------------------------------------------
154 //
156  LogDebug("Commissioning") << "[CalibrationScanTask::update]"; // huge output
157  for (auto element : calib1_)
158  updateHistoSet(element.second);
159  for (auto element : calib2_)
160  updateHistoSet(element.second);
161 }
162 
Definition: start.py:1
CalibrationScanTask(DQMStore *, const FedChannelConnection &, const sistrip::RunType &, const char *filename, uint32_t run, const SiStripPedestals &pedestals)
const Range getRange(const uint32_t &detID) const
Utility class that holds histogram title.
void setCurrentFolder(const std::string &)
sistrip::RunType runType_
void setCurrentFolder(std::string const &fullpath) override
Definition: DQMStore.h:646
std::pair< ContainerIterator, ContainerIterator > Range
std::vector< uint16_t > ped
static std::string to_string(const XMLCh *ch)
float getPed(const uint16_t &strip, const Range &range) const
void fill(const SiStripEventSummary &, const edm::DetSet< SiStripRawDigi > &) override
void updateHistoSet(HistoSet &, const uint32_t &bin, const float &value)
Class containning control, module, detector and connection information, at the level of a FED channel...
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Definition: value.py:1
const uint32_t & fedKey() const
std::map< std::string, HistoSet > calib2_
DQMStore *const dqm() const
std::map< std::string, HistoSet > calib1_
collection_type data
Definition: DetSet.h:80
conn
Definition: getInfo.py:9
const std::string & title() const
const FedChannelConnection & connection() const
Definition: DQMStore.h:18
#define LogDebug(id)