CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalTBTDCUnpacker.cc
Go to the documentation of this file.
3 #include <math.h>
4 
5 // Timing channels
6 static const int lcTriggerTime = 1;
7 static const int lcTTCL1ATime = 2;
8 static const int lcBeamCoincidence = 3;
9 static const int lcLaserFlash = 4;
10 static const int lcQIEPhase = 5;
11 
12 static const int lcMuon1 = 90;
13 static const int lcMuon2 = 91;
14 static const int lcMuon3 = 92;
15 static const int lcScint1 = 93;
16 static const int lcScint2 = 94;
17 static const int lcScint3 = 95;
18 static const int lcScint4 = 96;
19 static const int lcBeamHalo1 = 50;
20 static const int lcBeamHalo2 = 51;
21 static const int lcBeamHalo3 = 55;
22 static const int lcBeamHalo4 = 63;
23 static const int lcTOF1S = 129;
24 static const int lcTOF1J = 130;
25 static const int lcTOF2S = 131;
26 static const int lcTOF2J = 132;
27 
28 namespace hcaltb {
29 
30 HcalTBTDCUnpacker::HcalTBTDCUnpacker(bool include_unmatched_hits) :
31  includeUnmatchedHits_(include_unmatched_hits) {
32 // setupWC(); reads it from configuration file
33 }
34 void HcalTBTDCUnpacker::setCalib(const std::vector<std::vector<std::string> >& calibLines_) {
35  for(int i=0;i<161;i++)
36  {
37  tdc_ped[i]=0.;tdc_convers[i]=1.;
38  }
39  for(unsigned int ii=0;ii<calibLines_.size();ii++)
40  {
41 // TDC configuration
42  if(calibLines_[ii][0]=="TDC")
43  {
44  if(calibLines_[ii].size()==4)
45  {
46  int channel=atoi(calibLines_[ii][1].c_str());
47  tdc_ped[channel]=atof(calibLines_[ii][2].c_str());
48  tdc_convers[channel]=atof(calibLines_[ii][3].c_str());
49  // printf("Got TDC %i ped %f , conversion %f\n",channel, tdc_ped[channel],tdc_convers[channel]);
50  }
51  else
52  {
53  throw cms::Exception("Incomplete configuration") <<
54  "Wrong TDC configuration format : expected 3 parameters, got "<<calibLines_[ii].size()-1;
55  }
56  } // End of the TDCs
57 
58 // Wire chambers calibration
59  if(calibLines_[ii][0]=="WC")
60  {
61  if(calibLines_[ii].size()==6)
62  {
63  int plane=atoi(calibLines_[ii][1].c_str());
64  wc_[plane].b0=atof(calibLines_[ii][2].c_str());
65  wc_[plane].b1=atof(calibLines_[ii][3].c_str());
66  wc_[plane].mean=atof(calibLines_[ii][4].c_str());
67  wc_[plane].sigma=atof(calibLines_[ii][5].c_str());
68  // printf("Got WC plane %i b0 %f, b1 %f, mean %f, sigma %f\n",plane,
69  // wc_[plane].b0,wc_[plane].b1,wc_[plane].mean,wc_[plane].sigma);
70  }
71  else
72  {
73  throw cms::Exception("Incomplete configuration") <<
74  "Wrong Wire Chamber configuration format : expected 5 parameters, got "<<calibLines_[ii].size()-1;
75  }
76  } // End of the Wire Chambers
77 
78  } // End of the CalibLines
79  }
80 
83  HcalTBTiming& timing) const {
84  std::vector<Hit> hits;
85 
86  unpackHits(raw, hits, timing);
87 
88  reconstructWC(hits, pos);
89  reconstructTiming(hits, timing);
90 
91  }
92 
95  unsigned int n_max_hits; // maximum number of hits possible in the block
96  unsigned int n_hits;
97  unsigned int hits[2];
98  };
99 
100  struct CombinedTDCQDCDataFormat {
102  unsigned int n_qdc_hits; // Count of QDC channels
103  unsigned int n_tdc_hits; // upper/lower TDC counts
104  unsigned short qdc_values[4];
105  };
106 
107 //static const double CONVERSION_FACTOR=25.0/32.0;
108 
110  std::vector<Hit>& hits,HcalTBTiming& timing) const {
111  const ClassicTDCDataFormat* tdc=(const ClassicTDCDataFormat*)raw.data();
112 
113  if (raw.size()<3*8) {
114  throw cms::Exception("Missing Data") << "No data in the TDC block";
115  }
116 
117  const unsigned int* hitbase=0;
118  unsigned int totalhits=0;
119 
120  // old TDC (767)
121  if (tdc->n_max_hits!=192) {
122  const CombinedTDCQDCDataFormat* qdctdc=(const CombinedTDCQDCDataFormat*)raw.data();
123  hitbase=(unsigned int*)(qdctdc);
124  hitbase+=6; // header
125  hitbase+=qdctdc->n_qdc_hits/2; // two unsigned short per unsigned long
126  totalhits=qdctdc->n_tdc_hits&0xFFFF; // mask off high bits
127 
128  // for (unsigned int i=0; i<qdctdc->n_qdc_hits; i++)
129  // printf("QADC: %02d %d\n",i,qdctdc->qdc_values[i]&0xFFF);
130 
131  } else {
132  hitbase=&(tdc->hits[0]);
133  totalhits=tdc->n_hits;
134  }
135 
136  for (unsigned int i=0; i<totalhits; i++) {
137  Hit h;
138  h.channel=(hitbase[i]&0x7FC00000)>>22; // hardcode channel assignment
139  h.time=(hitbase[i]&0xFFFFF)*tdc_convers[h.channel];
140  hits.push_back(h);
141  // printf("V767: %d %f\n",h.channel,h.time);
142  }
143 
144  // new TDC (V775)
145  int v775[32];
146  for (int i=0;i<32;i++) v775[i]=-1;
147  if (tdc->n_max_hits!=192) {
148  const CombinedTDCQDCDataFormat* qdctdc=(const CombinedTDCQDCDataFormat*)raw.data();
149  hitbase=(unsigned int*)(qdctdc);
150  hitbase+=6; // header
151  hitbase+=qdctdc->n_qdc_hits/2; // two unsigned short per unsigned long
152  hitbase+=(qdctdc->n_tdc_hits&0xFFFF); // same length
153  totalhits=(qdctdc->n_tdc_hits&0xFFFF0000)>>16; // mask off high bits
154  for (unsigned int i=0; i<totalhits; i++) {
155  Hit h;
156 // h.channel=129+i;
157  h.channel=129+((hitbase[i]&0x3F0000)>>16);
158  h.time=(hitbase[i]&0xFFF)*tdc_convers[h.channel] ;
159  hits.push_back(h);
160  if ( (h.channel-129)<32 )
161  v775[(h.channel-129)] = (hitbase[i]&0xFFF);
162  // printf("V775: %d %f\n",h.channel,h.time);
163  }
164  }
165  timing.setV775(v775);
166 }
167 
168 void HcalTBTDCUnpacker::reconstructTiming(const std::vector<Hit>& hits,
169  HcalTBTiming& timing) const {
170  std::vector<Hit>::const_iterator j;
171  double trigger_time=0;
172  double ttc_l1a_time=0;
173  double laser_flash=0;
174  double qie_phase=0;
175  double TOF1S_time=0;
176  double TOF1J_time=0;
177  double TOF2S_time=0;
178  double TOF2J_time=0;
179 
180  std::vector<double> m1hits, m2hits, m3hits, s1hits, s2hits, s3hits, s4hits,
181  bh1hits, bh2hits, bh3hits, bh4hits,beam_coinc;
182 
183  for (j=hits.begin(); j!=hits.end(); j++) {
184  switch (j->channel) {
185  case lcTriggerTime: trigger_time = j->time-tdc_ped[lcTriggerTime]; break;
186  case lcTTCL1ATime: ttc_l1a_time = j->time-tdc_ped[lcTTCL1ATime]; break;
187  case lcBeamCoincidence: beam_coinc.push_back(j->time-tdc_ped[lcBeamCoincidence]); break;
188  case lcLaserFlash: laser_flash = j->time-tdc_ped[lcLaserFlash]; break;
189  case lcQIEPhase: qie_phase = j->time-tdc_ped[lcQIEPhase]; break;
190  case lcMuon1: m1hits.push_back(j->time-tdc_ped[lcMuon1]); break;
191  case lcMuon2: m2hits.push_back(j->time-tdc_ped[lcMuon2]); break;
192  case lcMuon3: m3hits.push_back(j->time-tdc_ped[lcMuon3]); break;
193  case lcScint1: s1hits.push_back(j->time-tdc_ped[lcScint1]); break;
194  case lcScint2: s2hits.push_back(j->time-tdc_ped[lcScint2]); break;
195  case lcScint3: s3hits.push_back(j->time-tdc_ped[lcScint3]); break;
196  case lcScint4: s4hits.push_back(j->time-tdc_ped[lcScint4]); break;
197  case lcTOF1S: TOF1S_time = j->time-tdc_ped[lcTOF1S]; break;
198  case lcTOF1J: TOF1J_time = j->time-tdc_ped[lcTOF1J]; break;
199  case lcTOF2S: TOF2S_time = j->time-tdc_ped[lcTOF2S]; break;
200  case lcTOF2J: TOF2J_time = j->time-tdc_ped[lcTOF2J]; break;
201  case lcBeamHalo1: bh1hits.push_back(j->time-tdc_ped[lcBeamHalo1]); break;
202  case lcBeamHalo2: bh2hits.push_back(j->time-tdc_ped[lcBeamHalo2]); break;
203  case lcBeamHalo3: bh3hits.push_back(j->time-tdc_ped[lcBeamHalo3]); break;
204  case lcBeamHalo4: bh4hits.push_back(j->time-tdc_ped[lcBeamHalo4]); break;
205  default: break;
206  }
207  }
208 
209  timing.setTimes(trigger_time,ttc_l1a_time,laser_flash,qie_phase,TOF1S_time,TOF1J_time,TOF2S_time,TOF2J_time);
210  timing.setHits (m1hits,m2hits,m3hits,s1hits,s2hits,s3hits,s4hits,bh1hits,bh2hits,bh3hits,bh4hits,beam_coinc);
211 
212 }
213 
214 const int HcalTBTDCUnpacker::WC_CHANNELIDS[PLANECOUNT*3] = {
215  12, 13, 14, // WCA LR plane
216  10, 11, 15, // WCA UD plane
217  22, 23, 24, // WCB LR plane
218  20, 21, 25, // WCB UD plane
219  32, 33, 34, // WCC LR plane
220  30, 31, 35, // WCC UD plane
221  101, 102, 104, // WCD LR plane
222  107, 108, 110, // WCD UD plane
223  113, 114, 116, // WCE LR plane
224  97, 98, 99, // WCE UD plane
225  42, 43, -1, // WCF LR plane (was WC1)
226  44, 60, -1, // WCF UD plane (was WC1)
227  40, 41, -1, // WCG LR plane (was WC2)
228  45, 61, -1, // WCG UD plane (was WC2)
229  52, 53, -1, // WCH LR plane (was WC3)
230  54, 62, -1 // WCH UD plane (was WC3)
231 };
232 
233 static const double TDC_OFFSET_CONSTANT = 12000;
234 static const double N_SIGMA = 2.5;
235 
236 /* Obsolated - reads it from the configuration file
237 void HcalTBTDCUnpacker::setupWC() {
238 
239  wc_[0].b0 = -0.0870056; wc_[0].b1 = -0.193263; // WCA planes
240  wc_[1].b0 = -0.0288171; wc_[1].b1 = -0.191231;
241 
242  wc_[2].b0 = -0.2214840; wc_[2].b1 = -0.191683; // WCB planes
243  wc_[3].b0 = -1.0847300; wc_[3].b1 = -0.187691;
244 
245  wc_[4].b0 = -0.1981440; wc_[4].b1 = -0.192760; // WCC planes
246  wc_[5].b0 = 0.4230690; wc_[5].b1 = -0.192278;
247 
248  wc_[6].b0 = -0.6039130; wc_[6].b1 = -0.185674; // WCD planes
249  wc_[7].b0 = -0.4366590; wc_[7].b1 = -0.184992;
250 
251  wc_[8].b0 = 1.7016400; wc_[8].b1 = -0.185575; // WCE planes
252  wc_[9].b0 = -0.2324480; wc_[9].b1 = -0.185367;
253 
254  wc_[0].mean=225.2; wc_[0].sigma=5.704;
255  wc_[1].mean=223.5; wc_[1].sigma=5.862;
256  wc_[2].mean=227.2; wc_[2].sigma=5.070;
257  wc_[3].mean=235.7; wc_[3].sigma=6.090;
258  wc_[4].mean=243.3; wc_[4].sigma=7.804;
259  wc_[5].mean=230.3; wc_[5].sigma=28.91;
260 
261  wc_[6].mean=225.0; wc_[6].sigma=6.000;
262  wc_[7].mean=225.0; wc_[7].sigma=6.000;
263  wc_[8].mean=225.0; wc_[8].sigma=6.000;
264  wc_[9].mean=225.0; wc_[9].sigma=6.000;
265 }
266 */
267 
268 void HcalTBTDCUnpacker::reconstructWC(const std::vector<Hit>& hits, HcalTBEventPosition& ep) const {
269  // process all planes, looping over all hits...
270  const int MAX_HITS=100;
271  float hits1[MAX_HITS], hits2[MAX_HITS], hitsA[MAX_HITS];
272  int n1,n2,nA,chan1,chan2,chanA;
273 
274  std::vector<double> x;
275 
276  for (int plane=0; plane<PLANECOUNT; plane++) {
277  n1=0; n2=0; nA=0;
278 
279  std::vector<double> plane_hits;
280  double hit_time;
281 
282  chan1=WC_CHANNELIDS[plane*3];
283  chan2=WC_CHANNELIDS[plane*3+1];
284  chanA=WC_CHANNELIDS[plane*3+2];
285 
286  for (std::vector<Hit>::const_iterator j=hits.begin(); j!=hits.end(); j++) {
287  if (j->channel==chan1 && n1<MAX_HITS) {
288  hits1[n1]=j->time-TDC_OFFSET_CONSTANT; n1++;
289  }
290  if (j->channel==chan2 && n2<MAX_HITS) {
291  hits2[n2]=j->time-TDC_OFFSET_CONSTANT; n2++;
292  }
293  if (j->channel==chanA && nA<MAX_HITS) {
294  hitsA[nA]=j->time-TDC_OFFSET_CONSTANT; nA++;
295  }
296  }
297 
298  // anode-matched hits
299  for (int ii=0; ii<n1; ii++) {
300  int jmin=-1, lmin=-1;
301  float dsumMin=99999;
302  for (int jj=0; jj<n2; jj++) {
303  for (int ll=0; ll<nA; ll++) {
304  float dsum=fabs(wc_[plane].mean - hits1[ii] - hits2[jj] + 2.0*hitsA[ll]);
305  if(dsum<(N_SIGMA*wc_[plane].sigma) && dsum<dsumMin){
306  jmin=jj;
307  lmin=ll;
308  dsumMin=dsum;
309  }
310  }
311  }
312  if (jmin>=0) {
313  hit_time = wc_[plane].b0 +
314  wc_[plane].b1 * (hits1[ii]-hits2[jmin]);
315  if((plane%2)==0)
316  {
317  plane_hits.push_back(-hit_time);
318  }else{
319  plane_hits.push_back(hit_time);
320  }
321  hits1[ii]=-99999;
322  hits2[jmin]=-99999;
323  hitsA[lmin]=99999;
324  }
325  }
326 
327  if (includeUnmatchedHits_||plane>9) // unmatched hits (all pairs get in here)
328  for (int ii=0; ii<n1; ii++) {
329  if (hits1[ii]<-99990) continue;
330  for (int jj=0; jj<n2; jj++) {
331  if (hits2[jj]<-99990) continue;
332  hit_time = wc_[plane].b0 +
333  wc_[plane].b1 * (hits1[ii]-hits2[jj]);
334  if((plane%2)==0)
335  {
336  plane_hits.push_back(-hit_time);
337  }else{
338  plane_hits.push_back(hit_time);
339  }
340  }
341  }
342 
343  if ((plane%2)==0) x=plane_hits;
344  else {
345  char chamber='A'+plane/2;
346  ep.setChamberHits(chamber,x,plane_hits);
347  }
348  }
349 
350 }
351 
352 }
static const int lcBeamCoincidence
int i
Definition: DBlmapReader.cc:9
void setChamberHits(char chamberch, const std::vector< double > &xvec, const std::vector< double > &yvec)
static const int lcTOF2S
void reconstructTiming(const std::vector< Hit > &hits, HcalTBTiming &timing) const
static const int lcBeamHalo4
static const int lcTOF1S
void unpackHits(const FEDRawData &raw, std::vector< Hit > &hits, HcalTBTiming &timing) const
static const int lcTTCL1ATime
static const int lcScint4
static const int lcScint3
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
static const int lcBeamHalo2
static const int lcLaserFlash
static const int lcScint1
void setV775(int *V775)
Definition: HcalTBTiming.cc:75
int j
Definition: DBlmapReader.cc:9
static const int lcMuon3
void setCalib(const std::vector< std::vector< std::string > > &calibLines_)
static const int lcBeamHalo1
static const int lcTriggerTime
static const int lcTOF1J
static const int lcQIEPhase
void unpack(const FEDRawData &raw, HcalTBEventPosition &pos, HcalTBTiming &timing) const
void reconstructWC(const std::vector< Hit > &hits, HcalTBEventPosition &pos) const
static const double N_SIGMA
static const int lcBeamHalo3
void setTimes(const double trigger_time, const double ttc_l1a_time, const double laser_flash, const double qie_phase, const double TOF1S_time, const double TOF1J_time, const double TOF2S_time, const double TOF2J_time)
Definition: HcalTBTiming.cc:29
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:29
static const int lcMuon1
static const double TDC_OFFSET_CONSTANT
void setHits(const std::vector< double > &m1hits, const std::vector< double > &m2hits, const std::vector< double > &m3hits, const std::vector< double > &s1hits, const std::vector< double > &s2hits, const std::vector< double > &s3hits, const std::vector< double > &s4hits, const std::vector< double > &bh1hits, const std::vector< double > &bh2hits, const std::vector< double > &bh3hits, const std::vector< double > &bh4hits, const std::vector< double > &beamCoincidenceHits)
Definition: HcalTBTiming.cc:47
static const int lcMuon2
static const int lcTOF2J
static const int WC_CHANNELIDS[PLANECOUNT *3]
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
tuple size
Write out results.
struct hcaltb::HcalTBTDCUnpacker::WireChamberRecoData wc_[PLANECOUNT]
static const int lcScint2