CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 
78  calib1_[extrainfo_] = HistoSet();
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 
98  calib2_[extrainfo_] = HistoSet();
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]));
145  updateHistoSet(calib2_[extrainfo_],
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 
CalibrationScanTask(DQMStore *, const FedChannelConnection &, const sistrip::RunType &, const char *filename, uint32_t run, const SiStripPedestals &pedestals)
const uint32_t & vfs() const
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::EventIDconst &, edm::Timestampconst & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
Utility class that holds histogram title.
void setCurrentFolder(const std::string &)
const std::string & title() const
const uint32_t & latency() const
sistrip::RunType runType_
void setCurrentFolder(std::string const &fullpath) override
Definition: DQMStore.h:569
uint16_t apvPairNumber() const
std::pair< ContainerIterator, ContainerIterator > Range
std::vector< uint16_t > ped
void fill(const SiStripEventSummary &, const edm::DetSet< SiStripRawDigi > &) override
float getPed(const uint16_t &strip, const Range &range) const
const uint32_t & isha() const
void updateHistoSet(HistoSet &, const uint32_t &bin, const float &value)
const uint32_t & detId() const
DQMStore *const dqm() const
Class containning control, module, detector and connection information, at the level of a FED channel...
std::map< std::string, HistoSet > calib2_
const uint32_t & calSel() const
std::map< std::string, HistoSet > calib1_
collection_type data
Definition: DetSet.h:80
tuple filename
Definition: lut2db_cfg.py:20
tuple conn
Definition: getInfo.py:9
const uint32_t & calChan() const
const uint32_t & fedKey() const
const Range getRange(const uint32_t &detID) const
const FedChannelConnection & connection() const
#define LogDebug(id)