11 #include <cdc/modules/cdcCrossTalkAdder/CDCCrossTalkAdderModule.h>
13 #include <framework/datastore/RelationIndex.h>
14 #include <framework/logging/Logger.h>
16 #include <cdc/dataobjects/CDCSimHit.h>
17 #include <mdst/dataobjects/MCParticle.h>
30 setDescription(
"Overlays signal-induced asic cross-talk to CDCHits.");
31 setPropertyFlags(c_ParallelProcessingCertified);
33 addParam(
"InputCDCHitsName", m_inputCDCHitsName,
"Name of input array. Should consist of CDCHits.",
string(
""));
34 addParam(
"Issue2ndHitWarning", m_issue2ndHitWarning,
"=true: issue a warning when a 2nd TDC hit is found.",
true);
35 addParam(
"IncludeEarlyXTalks", m_includeEarlyXTalks,
"=true: include earlier x-talks as well than the signal hit in question.",
37 addParam(
"DebugLevel", m_debugLevel,
"Debug level; 20-29 are usable.", 20);
40 void CDCCrossTalkAdderModule::initialize()
42 m_hits.isRequired(m_inputCDCHitsName);
44 m_cdcgp = &(CDCGeometryPar::Instance());
46 m_invOfTDCBinWidth = 1. / m_cdcgp->getTdcBinWidth();
49 if ((*m_xTalkFromDB).isValid()) {
51 B2FATAL(
"CDCCrossTalkLibrary invalid!");
55 if ((*m_fEElectronicsFromDB).isValid()) {
56 (*m_fEElectronicsFromDB).
addCallback(
this, &CDCCrossTalkAdderModule::setFEElectronics);
59 B2FATAL(
"CDCCrossTalkAdder:: CDCFEElectronics not valid!");
63 void CDCCrossTalkAdderModule::event()
65 map<WireID, XTalkInfo> xTalkMap;
66 map<WireID, XTalkInfo> xTalkMap1;
67 map<WireID, XTalkInfo>::iterator iterXTalkMap1;
70 int OriginalNoOfHits = m_hits.getEntries();
71 B2DEBUG(m_debugLevel,
"\n \n" <<
"#CDCHits " << OriginalNoOfHits);
72 for (
const auto& aHit : m_hits) {
73 if (m_issue2ndHitWarning && aHit.is2ndHit()) {
74 B2WARNING(
"2nd TDC hit found, but not ready for it!");
78 short tdcCount = aHit.getTDCCount();
79 short adcCount = aHit.getADCCount();
80 short tot = aHit.getTOT();
81 short board = m_cdcgp->getBoardID(wid);
82 short channel = m_cdcgp->getChannelID(wid);
83 const vector<pair<short, asicChannel>> xTalks = (*m_xTalkFromDB)->getLibraryCrossTalk(channel, tdcCount, adcCount, tot);
85 int nXTalks = xTalks.size();
86 for (
int i = 0; i < nXTalks; ++i) {
87 const unsigned short tdcCount4XTalk = xTalks[i].second.TDC;
89 B2DEBUG(m_debugLevel,
"\n" <<
" signal: " << channel <<
" " << tdcCount <<
" " << adcCount <<
" " << tot);
91 B2DEBUG(m_debugLevel,
"xtalk: " << xTalks[i].first <<
" " << tdcCount4XTalk <<
" " << xTalks[i].second.ADC <<
" " <<
92 xTalks[i].second.TOT);
93 WireID widx = m_cdcgp->getWireID(board, xTalks[i].first);
94 if (!m_cdcgp->isBadWire(widx)) {
95 if (m_includeEarlyXTalks || (xTalks[i].second.TDC <= tdcCount)) {
96 const double t0 = m_cdcgp->getT0(widx);
97 const double ULOfTDC = (t0 - m_lowEdgeOfTimeWindow[board]) * m_invOfTDCBinWidth;
98 const double LLOfTDC = (t0 - m_uprEdgeOfTimeWindow[board]) * m_invOfTDCBinWidth;
99 if (LLOfTDC <= tdcCount4XTalk && tdcCount4XTalk <= ULOfTDC) {
100 const unsigned short status = 0;
101 xTalkMap.insert(make_pair(widx,
XTalkInfo(tdcCount4XTalk, xTalks[i].second.ADC, xTalks[i].second.TOT, status)));
111 B2DEBUG(m_debugLevel,
"#xtalk hits: " << xTalkMap.size());
112 for (
const auto& aHit : xTalkMap) {
115 iterXTalkMap1 = xTalkMap1.find(wid);
116 unsigned short tdcCount = aHit.second.m_tdc;
117 unsigned short adcCount = aHit.second.m_adc;
118 unsigned short tot = aHit.second.m_tot;
119 unsigned short status = aHit.second.m_status;
121 if (iterXTalkMap1 == xTalkMap1.end()) {
122 xTalkMap1.insert(make_pair(wid,
XTalkInfo(tdcCount, adcCount, tot, status)));
125 if (tdcCount < iterXTalkMap1->second.m_tdc) {
126 iterXTalkMap1->second.m_tdc = tdcCount;
127 B2DEBUG(m_debugLevel,
"TDC-count of current xtalk: " << tdcCount);
129 iterXTalkMap1->second.m_adc += adcCount;
130 iterXTalkMap1->second.m_tot += tot;
135 B2DEBUG(m_debugLevel,
"#xtalk1 hits: " << xTalkMap1.size());
136 for (
const auto& aX : xTalkMap1) {
138 const unsigned short tdc4Bg = aX.second.m_tdc;
139 const unsigned short adc4Bg = aX.second.m_adc;
140 const unsigned short tot4Bg = aX.second.m_tot;
141 const unsigned short status4Bg = aX.second.m_status;
143 for (
int iHit = 0; iHit < OriginalNoOfHits; ++iHit) {
144 CDCHit& aH = *(m_hits[iHit]);
145 if (aH.
getID() != aX.first.getEWire()) {
151 const unsigned short tot4Sg = aH.
getTOT();
157 if (tdc4Sg < tdc4Bg) {
161 for (
int i = relSimHits.size() - 1; i >= 0; --i) {
162 relSimHits.remove(i);
165 for (
int i = relMCParticles.size() - 1; i >= 0; --i) {
166 relMCParticles.remove(i);
176 unsigned short s1 = tdc4Sg;
177 unsigned short s2 = tdc4Bg;
178 unsigned short w1 = tot4Sg;
179 unsigned short w2 = tot4Bg;
180 if (tdc4Sg < tdc4Bg) {
188 const unsigned short e1 = s1 - w1;
189 const unsigned short e2 = s2 - w2;
192 double pulseW = w1 + w2;
195 }
else if (e1 <= s2) {
199 unsigned short board = m_cdcgp->getBoardID(aX.first);
200 aH.
setTOT(std::min(std::round(pulseW / 32.),
static_cast<double>(m_widthOfTimeWindow[board])));
208 m_hits.appendNew(tdc4Bg, adc4Bg, aX.first, status4Bg, tot4Bg);
209 B2DEBUG(m_debugLevel,
"appended tdc,adc,tot,wid,status= " << tdc4Bg <<
" " << adc4Bg <<
" " << tot4Bg <<
" " << aX.first <<
" " <<
213 B2DEBUG(m_debugLevel,
"original #hits, #hits= " << OriginalNoOfHits <<
" " << m_hits.getEntries());
217 void CDCCrossTalkAdderModule::setFEElectronics()
219 const double el1TrgLatency = m_cdcgp->getMeanT0();
220 B2DEBUG(m_debugLevel,
"L1TRGLatency= " << el1TrgLatency);
221 const double c = 32. * m_cdcgp->getTdcBinWidth();
223 if (!m_fEElectronicsFromDB) B2FATAL(
"No FEEElectronics dbobject!");
225 int mode = (fp.getBoardID() == -1) ? 1 : 0;
226 int iNBoards =
static_cast<int>(nBoards);
230 for (
int bdi = 1; bdi < iNBoards; ++bdi) {
231 m_uprEdgeOfTimeWindow[bdi] = el1TrgLatency - c * (fp.getTrgDelay() + 1);
232 if (m_uprEdgeOfTimeWindow[bdi] < 0.) B2FATAL(
"Upper edge of time window < 0!");
233 m_lowEdgeOfTimeWindow[bdi] = m_uprEdgeOfTimeWindow[bdi] - c * (fp.getWidthOfTimeWindow() + 1);
234 if (m_lowEdgeOfTimeWindow[bdi] > 0.) B2FATAL(
"Lower edge of time window > 0!");
235 m_widthOfTimeWindow[bdi] = fp.getWidthOfTimeWindow() + 1;
241 for (
const auto& fpp : (*m_fEElectronicsFromDB)) {
242 int bdi = fpp.getBoardID();
243 if (mode == 0 && bdi == 0)
continue;
244 if (mode == 1 && bdi == -1)
continue;
245 if (bdi < 0 || bdi >= iNBoards) B2FATAL(
"Invalid no. of FEE board!");
246 m_uprEdgeOfTimeWindow[bdi] = el1TrgLatency - c * (fpp.getTrgDelay() + 1);
247 if (m_uprEdgeOfTimeWindow[bdi] < 0.) B2FATAL(
"Upper edge of time window < 0!");
248 m_lowEdgeOfTimeWindow[bdi] = m_uprEdgeOfTimeWindow[bdi] - c * (fpp.getWidthOfTimeWindow() + 1);
249 if (m_lowEdgeOfTimeWindow[bdi] > 0.) B2FATAL(
"Lower edge of time window > 0!");
250 m_widthOfTimeWindow[bdi] = fpp.getWidthOfTimeWindow() + 1;
254 B2DEBUG(m_debugLevel,
"mode= " << mode);
255 for (
int bdi = 1; bdi < iNBoards; ++bdi) {
256 B2DEBUG(m_debugLevel, bdi <<
" " << m_lowEdgeOfTimeWindow[bdi] <<
" " << m_uprEdgeOfTimeWindow[bdi]);