ATLAS Offline Software
Loading...
Searching...
No Matches
CscCalibTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "CscCalibTool.h"
7
8#include <sstream>
9#include <cmath>
10
12( const std::string& t, const std::string& n, const IInterface* p )
13 : base_class(t,n,p)
14{
15 declareProperty( "Slope", m_slope = 0.19 );
16 declareProperty( "Noise", m_noise = 3.5 );
17 declareProperty( "Pedestal", m_pedestal = 2048.0 );
18 declareProperty( "ReadFromDatabase", m_readFromDatabase = true);
19 declareProperty( "integrationNumber", m_integrationNumber = 12.0);
20 declareProperty( "integrationNumber2", m_integrationNumber2 = 11.66);
21 declareProperty( "samplingTime", m_samplingTime = 50. ); //ns
22 declareProperty( "signalWidth", m_signalWidth = 14.40922); // 50/3.47ns
23 declareProperty( "SlopeFromDatabase", m_slopeFromDatabase=false);
24 declareProperty( "timeOffset", m_timeOffset = 46.825 );
25
26 declareProperty( "IsOnline" , m_onlineHLT = true); // This will be fed from jO
27
28 // new latency starting from 2010...
29 declareProperty( "Latency", m_latency = 100 ); // ns.....
30 declareProperty( "NSamples", m_nSamples = 4); // number of samples
31
32 declareProperty( "Use2Samples", m_use2Samples = false); // force 2 sample
33}
34
35// ROOT USER Function
36Double_t bipfunc(const Double_t *x, const Double_t *par){
37 if (x[0] < par[1]) return 0.;
38 Double_t integrationNumber = par[2]; //12
39 Double_t integrationNumber2 = par[3]; //11.66
40 // Double_t samplingTime = par[4]; //50 ns
41 Double_t signalWidth = par[4]; //50 ns
42 Double_t sum = integrationNumber+integrationNumber2;
43 Double_t z0 = 0.5*( (sum+2)
44 -std::sqrt(std::pow(sum+2,2)
45 -4*integrationNumber*(integrationNumber2+1))
46 );
47
48 Double_t norm = (1.0 - z0 / (1 + integrationNumber2))
49 * std::pow(z0, 1.0 * integrationNumber)
50 * std::exp(-z0);
51
52 Double_t z = (x[0]-par[1])/signalWidth;//*3.47/samplingTime;
53 Double_t amplitude =
54 par[0]*(1-z/(1+integrationNumber2))
55 *std::pow(z,integrationNumber)*std::exp(-1.0*z)/norm;
56 return amplitude;
57}
58// To add two bipolar function and get a distribution, this function is defined
59Double_t dualbipfunc(const Double_t *x, const Double_t *par){
60 return ( bipfunc(x,par) + bipfunc(x,&par[5]) );
61}
62
64
65 ATH_MSG_DEBUG ( "Initializing Initializing CscCalibTool");
66
67 ATH_MSG_DEBUG ( "Default slope (if DB is not available) =" << m_slope );
68 ATH_MSG_DEBUG ( "Default noise (if DB is not available) =" << m_noise );
69 ATH_MSG_DEBUG ( "Default pedestal (if DB is not available) =" << m_pedestal );
70 ATH_MSG_DEBUG ( "Calib Constants are from DB ? =" << m_readFromDatabase );
71 ATH_MSG_DEBUG ( "Slope Constants are from DB ? =" << m_slopeFromDatabase );
72 ATH_MSG_DEBUG ( "Bipolar function integrationNumber(N_1) =" << m_integrationNumber);
73 ATH_MSG_DEBUG ( "Bipolar function integrationNumber(N_2) =" << m_integrationNumber2);
74 ATH_MSG_DEBUG ( "SamplingTime =" << m_samplingTime);
75 ATH_MSG_DEBUG ( "Signalwidth =" << m_signalWidth);
76 ATH_MSG_DEBUG ( "timeOffset (digitization) =" << m_timeOffset);
77 ATH_MSG_DEBUG ( "Is OnlineAccess (HLT) ?? =" << m_onlineHLT);
78 ATH_MSG_DEBUG ( "Force the use of the 2 sample charge? =" << m_use2Samples);
79
80 if (m_onlineHLT) {
81 ATH_MSG_DEBUG( "T0BaseFolder and T0PhaseFolder are not loaded!!! HLT COOLDB does not have it!!");
82 }
83
84 ATH_CHECK(m_readKey.initialize());
85
88
89 return StatusCode::SUCCESS;
90}
91
92float CscCalibTool::getPSlope(uint32_t stripHashId) const {
93
94
95 float slope = m_slope;
98 const CscCondDbData* readCdo{*readHandle};
99 if(!readCdo->readChannelPSlope(stripHashId, slope).isSuccess()){
100 ATH_MSG_WARNING ( " failed to access CSC conditions database - slope - "
101 << "strip hash id = " << stripHashId );
102 }
103 }
104 ATH_MSG_DEBUG ( "The slope is " << slope << " for strip hash = " << stripHashId );
105
106 return slope;
107
108}
109
110
112int CscCalibTool::numberOfElectronsToADCCount(uint32_t stripHashId, const int numberOfElecEquiv) const
113{
114
115 //ATH_MSG_VERBOSE ( "Using CscCalibTool::numberOfElectronsToADCCount" );
116
117 double conversionFactor = 1.602e-4; // 1 ee in femtoCoulomb
118 double femtoCoulombs = conversionFactor*numberOfElecEquiv;
119
120 float slope = getPSlope(stripHashId);
121
122 int adcValue = int ( func(femtoCoulombs,slope) );
123 return adcValue;
124}
125
126int CscCalibTool::femtoCoulombToADCCount(uint32_t stripHashId, const double femtoCoulombs) const
127{
128
129 //ATH_MSG_VERBOSE ( "Using CscCalibTool::femtoCoulombToADCCount" );
130
131 float slope = getPSlope(stripHashId);
132
133 int adcValue = int ( func(femtoCoulombs,slope) );
134 return adcValue;
135}
136
138double CscCalibTool::adcCountToNumberOfElectrons(const float adcValue, const float slope) const
139{
140 double conversionFactor = 1.602e-4; // 1 ee in femtoCoulomb
141 double femtoCoulombs = this->adcCountToFemtoCoulomb(adcValue, slope);
142 return (femtoCoulombs/conversionFactor);
143}
144
146double CscCalibTool::stripNoise ( uint32_t stripHashId, const bool convert ) const
147{
148 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
149
150 float noise = m_noise;
151 if ( m_readFromDatabase ) {
153 const CscCondDbData* readCdo{*readHandle};
154 if(!readCdo->readChannelNoise(stripHashId, noise).isSuccess()){
155 ATH_MSG_DEBUG ( " failed to access CSC conditions database - noise - "
156 << "strip hash id = " << stripHashId );
157 noise = m_noise;
158 }
159 }
160
161 ATH_MSG_VERBOSE ( "The noise is " << noise << " for strip hash = " << stripHashId );
162
163 if ( convert ) {
164 float slope = getPSlope(stripHashId);
165 return this->adcCountToNumberOfElectrons( noise, slope );
166 } else {
167 return noise;
168 }
169}
170
171
173double CscCalibTool::stripRMS ( uint32_t stripHashId, const bool convert ) const
174{
175 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
176
177 float rms = m_noise;
178 if ( m_readFromDatabase ) {
180 const CscCondDbData* readCdo{*readHandle};
181 if(!readCdo->readChannelRMS(stripHashId, rms).isSuccess()){
182 ATH_MSG_DEBUG ( " failed to access CSC conditions database - rms - "
183 << "strip hash id = " << stripHashId );
184 rms = m_noise;
185 }
186 }
187
188 ATH_MSG_VERBOSE ( "The RMS is " << rms << " for strip hash = " << stripHashId );
189
190 if ( convert ) {
191 float slope = getPSlope(stripHashId);
192 return this->adcCountToNumberOfElectrons( rms, slope );
193 } else {
194 return rms;
195 }
196
197}
198
200// NOTE: f001 is raw ADC count...+1
201double CscCalibTool::stripF001 ( uint32_t stripHashId, const bool convert ) const
202{
203 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
204
205 float f001 = m_noise+m_pedestal;
206 if ( m_readFromDatabase ) {
208 const CscCondDbData* readCdo{*readHandle};
209 if(!readCdo->readChannelF001(stripHashId, f001).isSuccess()){
210 ATH_MSG_DEBUG ( " failed to access CSC conditions database - f001 - "
211 << "strip hash id = " << stripHashId );
212 f001 = 3.251*m_noise+m_pedestal;
213 }
214 }
215
216 ATH_MSG_VERBOSE ( "The F001 is " << f001 << " for strip hash = " << stripHashId );
217
218 if ( convert ) {
219 float slope = getPSlope(stripHashId);
220 return this->adcCountToNumberOfElectrons( f001, slope );
221 } else {
222 return f001;
223 }
224}
225
227double CscCalibTool::stripPedestal ( uint32_t stripHashId, const bool convert ) const
228{
229 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
230
231 float pedestal = m_pedestal;
232 if ( m_readFromDatabase ) {
234 const CscCondDbData* readCdo{*readHandle};
235 if(!readCdo->readChannelPed(stripHashId, pedestal).isSuccess()){
236 ATH_MSG_DEBUG ( " failed to access CSC conditions database - pedestal - "
237 << "strip hash id = " << stripHashId );
238 pedestal = m_pedestal;
239 }
240 }
241 ATH_MSG_VERBOSE ( "The pedestal is " << pedestal << " for strip hash = " << stripHashId );
242
243 if ( convert ) {
244 float slope = getPSlope(stripHashId);
245 return this->adcCountToNumberOfElectrons( pedestal, slope );
246 } else {
247 return pedestal;
248 }
249}
250
254bool CscCalibTool::isGood ( uint32_t stripHashId ) const
255{
256
257 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
258
259 unsigned int status = stripStatusBit(stripHashId);
260 bool is_good = !( (status & 0x1) || ((status >> 1) & 0x1) ); // test for hot/dead channel
261 return is_good;
262}
263
264
265int CscCalibTool::stripStatusBit ( uint32_t stripHashId ) const {
266
267 int status = 0;
268 if ( m_readFromDatabase ) {
270 const CscCondDbData* readCdo{*readHandle};
271 if(!readCdo->readChannelStatus(stripHashId, status).isSuccess())
272 ATH_MSG_WARNING ( " failed to access CSC conditions database - status - "
273 << "strip hash id = " << stripHashId );
274 else
275 ATH_MSG_VERBOSE("The status word is " << std::hex << status <<
276 " for strip hash = " << std::dec << stripHashId);
277 }
278 return status;
279}
280
281
282
283bool CscCalibTool::stripT0phase ( uint32_t stripHashId ) const {
284
285 bool t0phase = 0;
286
287 if (! m_onlineHLT ) {
288 if ( m_readFromDatabase ) {
290 const CscCondDbData* readCdo{*readHandle};
291 if(!readCdo->readChannelT0Phase(stripHashId, t0phase).isSuccess()){
292 if (m_messageCnt_t0phase < 3) {
293 ATH_MSG_WARNING ( " failed to access CSC conditions database - t0phase - "
294 << "strip hash id = " << stripHashId );
295 ATH_MSG_WARNING ( " This WARNING Message can be temporarily until COOL DB is filled");
297 }
298 } else {
299 ATH_MSG_VERBOSE ( "The t0phase is " << t0phase << " for stripHashId " << stripHashId );
300 }
301 }
302 }
303 return t0phase;
304}
305
306
307double CscCalibTool::stripT0base ( uint32_t stripHashId ) const {
308
309 float t0base = 0.0;
310 if (! m_onlineHLT ) {
311 if ( m_readFromDatabase ) {
313 const CscCondDbData* readCdo{*readHandle};
314 if(!readCdo->readChannelT0Base(stripHashId, t0base).isSuccess()){
315
316 if (m_messageCnt_t0base < 3) {
317 ATH_MSG_WARNING ( " failed to access CSC conditions database - t0base - "
318 << "strip hash id = " << stripHashId );
319 ATH_MSG_WARNING ( " This WARNING Message can be temporarily until COOL DB is filled");
321 }
322 } else {
323 ATH_MSG_VERBOSE ( "The t0base is " << t0base << " for stripHashId " << stripHashId );
324 }
325 }
326 }
327 return t0base;
328}
329
330
331
332double CscCalibTool::adcCountToFemtoCoulomb(const float adc, const float slope) const
333{
334
335 double charge = adc * slope;
336 ATH_MSG_VERBOSE ( "Using CscCalibTool::adcCountToFemtoCoulomb - adc = "
337 << adc << " charge(fC) = " << charge );
338 return charge;
339}
340
341double CscCalibTool::func(const double x, const float slope) const
342{
343 int val = 0;
344 if ( slope != 0 ) val = int ( (x / slope) + 0.5);
345 // else
346 // ATH_MSG_WARNING ( "CscCalibTool::femtoCoulombToADC - slope = 0" );
347 // if ( val < 0 ) {
348 // ATH_MSG_WARNING ( "CscCalibTool::femtoCoulombToADC - ADC cannot be < 0 - " << val );
349 //val = 0;
350 // }
351
352 return (1.0*val);
353}
354
355double CscCalibTool::func_prime(const double x, const float slope) const
356{
357 double val = slope;
358 if ( slope == 0.0 )
359 ATH_MSG_WARNING ( "CscCalibTool - slope = 0 for x = " << x );
360 return val;
361}
362
363//
364bool CscCalibTool::findCharge(const float samplingTime, const unsigned int samplingPhase,
365 const std::vector<float>& samples, double & charge, double & time) const {
366
367 time = 0.0;
368 charge = 0.0;
369
370 int numberOfSamplings = samples.size();
371 // no samples given
372 if (numberOfSamplings==0) return false;
373
374 // MS: The case of only 2 samples:
375 if ((numberOfSamplings==2) || m_use2Samples) { // no parabola possible
376 int i = numberOfSamplings/2-1;
377 charge = 0.5*(samples[i]+samples[i+1]); // 1+2 for 4 samples, 0+1 for 2
378
379 double asym = 0.;
380 if (std::abs(samples[i]+samples[i+1])>0.0001) asym = (samples[i+1]-samples[i])/(samples[i]+samples[i+1]);
381 /********************* No charge correction now.
382 // charge correction:
383 double chargecor = 77.85 + 1.415*asym - 44.97*asym*asym; // in percent
384 charge = charge / chargecor * 100.0;
385 *******************/
386
387 // time = i+0.5; // midpoint beween the 2 samples: no interpolation
388 // time *= samplingTime;
389 time = 76 + 47.85*asym + 6.629*asym*asym; // in ns, for 50ns sampling
390 if ( samplingPhase == 1 ) time -= 25;
391 return true;
392 }
393
395 float max = -4096000;
396 int maxIndex = -1;
397
398 if ( numberOfSamplings >10) { // for x5 data
399 maxIndex = 2;
400 max = samples[maxIndex];
401 }
402
403 for (int i=0; i<numberOfSamplings; i++) {
404 if ( numberOfSamplings >10 && (i<2 || i>6) ) continue; // for x5 data
405 if (samples[i] > max) {
406 max = samples[i];
407 maxIndex = i;
408 }
409 }
410
412 // if (max == -4096000) return false; //not possible
413
414
416
417 double a, b, c;
418
419 int midIndex = maxIndex;
420 if (maxIndex == 0) { // peaks on the first sample
421 a = samples[maxIndex];
422 b = samples[maxIndex+1];
423 c = samples[maxIndex+2];
424 midIndex +=1;
425 } else if (maxIndex == numberOfSamplings-1) { // last sample but it won't happen if third and 4th samples are same...
426 a = samples[maxIndex-2];
427 b = samples[maxIndex-1];
428 c = samples[maxIndex];
429 midIndex -=1;
430 } else { // normal case
431 a = samples[maxIndex-1];
432 b = samples[maxIndex];
433 c = samples[maxIndex+1];
434 }
435
436 //#D!!!!! Need to carefully check the case of 250 * 23898.136 * 28535.650 * 33587.949 * 33587.949 *
437
438 double aa = 0.5*(c+a-2*b); // p2 (coeff for x^2)
439 double bb = 0.5*(c-a);
440
441
444 if ( aa >= 0 ) {
445 time = midIndex;
446 time *= samplingTime;
447 if ( samplingPhase == 1 ) time -= 25; // works for both 20MHz and 40MHz
448 // time =0.0;
449 charge = max;
450
451 if (maxIndex ==0 || maxIndex ==1)
452 time -= 1000;
453 else if (maxIndex ==2 || maxIndex ==3)
454 time += 1000;
455
456 ATH_MSG_VERBOSE("WP aa is positive");
457 return false;
458 }
459
460 double timeOffset = -0.5*bb/aa;
461
462 ATH_MSG_VERBOSE("WP " << timeOffset);
464 if ( ( maxIndex == 0 && timeOffset < -2.0 )
465 || ( maxIndex == 3 && timeOffset > 2.0) ) {
466 time = midIndex;
467 time *= samplingTime;
468 if ( samplingPhase == 1 ) time -= 25; // works for both 20MHz and 40MHz
469 // time =0.0;
470 charge = max;
471
472 if (maxIndex ==0 || maxIndex ==1)
473 time -= 1000;
474 else if (maxIndex ==2 || maxIndex ==3)
475 time += 1000;
476
477 ATH_MSG_VERBOSE("time is out of range");
478
479 return true;
480 }
481
483 charge = aa*timeOffset*timeOffset + bb*timeOffset + b;
484 time = timeOffset;
485
495 time += midIndex;
496 time *= samplingTime;
497 if ( samplingPhase == 1 ) time -= 25;
498
499 return true;
500}
501
502double CscCalibTool::adcCountToFemtoCoulomb(uint32_t stripHashId, const float adcValue) const
503{
504 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
505
507
509 float pedestal = m_pedestal;
510 float slope = getPSlope(stripHashId);
511
512 if ( m_readFromDatabase ) {
514 const CscCondDbData* readCdo{*readHandle};
515 if(!readCdo->readChannelPed(stripHashId, pedestal).isSuccess()){
516 ATH_MSG_DEBUG ( " failed to access CSC conditions database - pedestal - "
517 << "strip hash id = " << stripHashId );
518 pedestal = m_pedestal;
519 }
520 }
521 ATH_MSG_VERBOSE ( "Pedestal is " << pedestal << " For strip hash id " << stripHashId );
522
523 // allowed negative adc values for bipolar fit
524 float adc = adcValue-pedestal;
525 return this->adcCountToFemtoCoulomb( adc, slope );
526
527}
528
529double CscCalibTool::adcCountToNumberOfElectrons(uint32_t stripHashId, const float adcValue) const
530{
531 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
532
534
536 float pedestal = m_pedestal;
537 float slope = getPSlope(stripHashId);
538 if ( m_readFromDatabase ) {
540 const CscCondDbData* readCdo{*readHandle};
541 if(!readCdo->readChannelPed(stripHashId, pedestal).isSuccess()){
542 ATH_MSG_DEBUG ( "failed to access CSC Conditions database - pedestal - "
543 << "strip hash id = " << stripHashId );
544 pedestal = m_pedestal;
545 }
546 }
547 ATH_MSG_VERBOSE ( "Pedestal is " << pedestal << " For strip hash id " << stripHashId );
548
549 // allowed negative adc values for bipolar fit
550 float adc = adcValue-pedestal;
551 return this->adcCountToNumberOfElectrons( adc, slope );
552}
553
554bool CscCalibTool::adcToCharge(const std::vector<uint16_t>& samples, uint32_t stripHashId,
555 std::vector<float>& charges) const {
556 ATH_MSG_VERBOSE ( "The strip hash id is " << stripHashId );
557
558 charges.clear();
559
561 float pedestal = m_pedestal;
562 float slope = getPSlope(stripHashId);
563 if ( m_readFromDatabase ) {
565 const CscCondDbData* readCdo{*readHandle};
566 if(!readCdo->readChannelPed(stripHashId, pedestal).isSuccess()){
567 ATH_MSG_DEBUG ( "failed to access CSC Conditions database - pedestal - "
568 << "strip hash id = " << stripHashId );
569 pedestal = m_pedestal;
570 }
571 }
572 ATH_MSG_VERBOSE ( "Pedestal is " << pedestal << " For strip hash id " << stripHashId );
573
574 unsigned max = samples.size();
575 if ( max == 0 ) return false;
576 for (unsigned int i=0; i<max; i++) {
577 // if ( samples[i] > pedestal ) {
578 float adc = samples[i]-pedestal;
579 float charge = static_cast<float> ( this->adcCountToNumberOfElectrons( adc, slope ) );
580 charges.push_back( charge );
581 // } else charges.push_back( 0.0 );
582 }
583 return true;
584}
585
587// define bipolar functional shape
588// Parameters are from Kostas presentation at the following link (09/2007)
589// http://indico.cern.ch/getFile.py/access?contribId=1&resId=1&materialId=slides&confId=18787
590
591double CscCalibTool::getZ0() const{
593 double z0 = 0.5*( (sum+2)
594 -std::sqrt(std::pow(sum+2,2)
596 );
597 return z0;
598}
599
600double CscCalibTool::signal( const double z ) const{
601 double amplitude = (1.0 - z / (1 + m_integrationNumber2))
602 * std::pow(z, 1.0 * m_integrationNumber)
603 * std::exp(-z);
604 return amplitude;
605}
606
607double CscCalibTool::signal_amplitude(const double driftTime, const double samplingTime) const{
608 double z0 = getZ0();
609 double norm = signal(z0);
610 if (samplingTime <= driftTime) return 0.;
611 Double_t z = (samplingTime-driftTime)/m_signalWidth;
612 return signal(z)/norm;
613}
614
615
616// new schema starting from 09/2010...
617std::vector<float> CscCalibTool::getSamplesFromBipolarFunc(const double driftTime0, const double stripCharge0) const {
618
619 std::vector<float> result;
620 if ( stripCharge0==0.0 ) {
621 result.push_back(0.0);
622 result.push_back(0.0);
623 result.push_back(0.0);
624 result.push_back(0.0);
625 return result;
626 }
627
628 std::unique_ptr<TF1> bipolarFunc = std::make_unique<TF1>("bipolarFunc", bipfunc, -500, 500, 5, 1, TF1::EAddToList::kNo);
629 bipolarFunc->SetParameters(stripCharge0, driftTime0,
631
632
633 for (unsigned int i=0; i<m_nSamples; ++i) {
634
635 float sampleCharge = bipolarFunc->Eval(m_latency + i*m_samplingTime);
636 result.push_back( sampleCharge );
637
638 }
639 return result;
640}
641
642
643std::pair<double,double> CscCalibTool::addBipfunc(const double driftTime0,
644 const double stripCharge0,
645 const double driftTime1,
646 const double stripCharge1) const {
647
648 std::pair<double,double> result;
649 // To get a nomalization constant...
650 result.first =driftTime0;
651 result.second = stripCharge0;
652
653 if ( (stripCharge0==0.0 && stripCharge1==0.0)||
654 (stripCharge0>0.0 && stripCharge1==0.0))
655 return result;
656
657 if (stripCharge0==0.0 && stripCharge1>0.0) {
658 result.first =driftTime1;
659 result.second = stripCharge1;
660 return result;
661 }
662
663 std::unique_ptr<TF1> addedfunc = std::make_unique<TF1>("addedfunc", dualbipfunc, 0, 500, 10, 1, TF1::EAddToList::kNo);
664 addedfunc->SetParameters(stripCharge0, driftTime0,
666 stripCharge1, driftTime1,
668 result.second =addedfunc->GetMaximum(); // ==>stripCharges of added bipolars
669 float tmax =addedfunc->GetX(result.second);
670 result.first = tmax - getZ0()*m_signalWidth;
671
672 if (stripCharge0>0.0 && stripCharge1>0.0) return result;
673
674 float bipmin = addedfunc->GetMinimum(); // ==>stripCharges of added bipolars
675 float tmin = addedfunc->GetX(bipmin);
676 if (tmin<tmax) {
677 result.first = tmin-getZ0()*m_signalWidth;
678 result.second = bipmin;
679 }
680
681 // To check out conversion is correct...
682 ATH_MSG_VERBOSE ( "(" << driftTime0 << ":" << int(stripCharge0) << ")"
683 << "+(" << driftTime1 << ":" << int(stripCharge1) << ")"
684 << " ==> " << result.first << ":" << int(result.second)
685 << " e- which was " << int(stripCharge0+stripCharge1) );
686
687
688
689 return result;
690}
691
693double CscCalibTool::getLatency() const {return m_latency;}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
Double_t bipfunc(const Double_t *x, const Double_t *par)
Double_t dualbipfunc(const Double_t *x, const Double_t *par)
defines an "iterator" over instances of a given type in StoreGateSvc
static Double_t a
#define x
#define z
#define max(a, b)
Definition cfImp.cxx:41
virtual bool adcToCharge(const std::vector< uint16_t > &samples, uint32_t stripHashId, std::vector< float > &charges) const override final
Conversion of ADC value to charge - Here the charges is returned in numbers of equivalent electrons.
virtual StatusCode initialize() override final
virtual int femtoCoulombToADCCount(uint32_t stripHashId, const double femtoCoulombs) const override final
given a charge on the CSC strip, convert that to ADC counts this is needed in the digitization for ex...
virtual bool findCharge(const float samplingTime, const unsigned int samplingPhase, const std::vector< float > &samples, double &charge, double &time) const override final
Given sampling values for a CSC strip, find the corresponding charge by fitting the time samples.
unsigned int m_nSamples
virtual double stripPedestal(uint32_t stripHashId, const bool convert=true) const override final
return the pedestal on the readout strip in ADC counts or Number of Electrons
bool m_slopeFromDatabase
virtual double stripNoise(uint32_t stripHashId, const bool convert=true) const override final
return the noise(sigma) on the readout strip in ADC counts or Number of Electrons number of electrons...
double m_integrationNumber2
double m_integrationNumber
ROOT version of bipolar function.
virtual double signal_amplitude(const double driftTime, const double samplingTime) const override final
virtual double getTimeOffset() const override final
double m_signalWidth
virtual double getNumberOfIntegration() const override final
virtual double getLatency() const override final
virtual double getZ0() const override final
ROOT version of bipolar function.
bool m_readFromDatabase
SG::ReadCondHandleKey< CscCondDbData > m_readKey
virtual std::vector< float > getSamplesFromBipolarFunc(const double driftTime0, const double stripCharge0) const override final
std::atomic_int m_messageCnt_t0base
virtual bool stripT0phase(uint32_t stripHashId) const override final
return T0phase related to 5 ASM.
std::atomic_int m_messageCnt_t0phase
virtual double signal(const double z) const override final
virtual int stripStatusBit(uint32_t stripHashId) const override final
return status bit
virtual std::pair< double, double > addBipfunc(const double driftTime0, const double stripCharge0, const double driftTime1, const double stripCharge1) const override final
virtual int numberOfElectronsToADCCount(uint32_t stripHashId, const int numberOfElecEquiv) const override final
Here the charge on the CSC strip is given in number of equivalent electrons; conversion to ADC counts...
virtual bool isGood(uint32_t stripHashId) const override final
return the status of this strip, good channel, dead channel, noisy channel - it will return true for ...
virtual double stripT0base(uint32_t stripHashId) const override final
return T0base related to 5 ASM.
virtual double getNumberOfIntegration2() const override final
virtual double adcCountToNumberOfElectrons(const float adcValue, const float slope) const override final
given one CSC ADC sample value, convert that to charge in number of equivalent electrons
CscCalibTool(const std::string &, const std::string &, const IInterface *)
double m_samplingTime
virtual double getSamplingTime() const override final
virtual double func_prime(const double x, const float slope) const override final
virtual double stripRMS(uint32_t stripHashId, const bool convert=true) const override final
return the RMS on the readout strip in ADC counts or Number of Electrons number of electrons by defau...
virtual double getSignalWidth() const override final
virtual double adcCountToFemtoCoulomb(const float adcCounts, const float slope) const override final
given one CSC ADC sample value, convert that to charge in femtoCoulomb
virtual double stripF001(uint32_t stripHashId, const bool convert=true) const override final
return the F001 on the readout strip in ADC counts or Number of Electrons number of electrons by defa...
virtual double func(const double x, const float slope) const override final
these function used in the AOD <-> conversion; may not be needed once we integrate the calibration se...
double m_timeOffset
float getPSlope(uint32_t stripHashId) const
StatusCode readChannelPed(IdentifierHash, float &) const
StatusCode readChannelT0Base(IdentifierHash, float &) const
StatusCode readChannelT0Phase(IdentifierHash, bool &) const
StatusCode readChannelRMS(IdentifierHash, float &) const
StatusCode readChannelStatus(IdentifierHash, int &) const
StatusCode readChannelPSlope(IdentifierHash, float &) const
StatusCode readChannelNoise(IdentifierHash, float &) const
StatusCode readChannelF001(IdentifierHash, float &) const