00001 #include "RawEvent/RawDataUtil.h"
00002 #include "RawDataProviderSvc/TofData.h"
00003 #include "TofQCorrSvc/ITofQCorrSvc.h"
00004 #include "TofQElecSvc/ITofQElecSvc.h"
00005 #include "Identifier/Identifier.h"
00006 #include "Identifier/TofID.h"
00007 #include <iostream>
00008
00009 extern ITofQCorrSvc* tofQCorrSvc;
00010 extern ITofQElecSvc* tofQElecSvc;
00011
00012 TofValue::TofValue() {
00013 m_channel = -999;
00014 m_value = -999.0;
00015 m_times = -1;
00016 m_number = 0;
00017 m_clock = -999;
00018 m_used = false;
00019 return;
00020 }
00021
00022
00023 TofValue::~TofValue() {}
00024
00025
00026 TofValue& TofValue::operator=(const TofValue& source){
00027 m_channel = source.m_channel;
00028 m_value = source.m_value;
00029 m_times = source.m_times;
00030 m_number = source.m_number;
00031 m_clock = source.m_clock;
00032 m_used = source.m_used;
00033 return *this;
00034 }
00035
00036
00037 void TofValue::timespp() {
00038 m_times = m_times + 1;
00039 return;
00040 }
00041
00042
00043 void TofValue::timesmm() {
00044 m_times = m_times - 1;
00045 return;
00046 }
00047
00048
00049 void Tdc::setValue( int value ) {
00050 m_clock = ( ( value & 0x7e000 ) >> 13 );
00051 if( value == 0x7fffffff ) {
00052 m_clock = 100;
00053 m_channel = 10000;
00054 m_value = 10000.0;
00055 }
00056 else if( value == -999 ) {
00057 m_channel = -999;
00058 m_value = -999.0;
00059 }
00060 else {
00061 m_channel = value;
00062 m_value = RawDataUtil::TofTime( value );
00063 }
00064
00065 return;
00066 }
00067
00068
00069 Adc::Adc() {
00070 m_corr = false;
00071 m_elec = false;
00072 m_mrpc = false;
00073 m_qtc = -999.0;
00074 }
00075
00076
00077 void Adc::setValue( Identifier identify, int value ) {
00078 m_clock = ( ( value & 0x7e000 ) >> 13 );
00079 if( value == 0x7fffffff ) {
00080 m_clock = 100;
00081 m_channel = 10000;
00082 m_qtc = 10000.0;
00083 m_value = 10000.0;
00084 }
00085 else if( value == -999 ) {
00086 m_channel = -999;
00087 m_qtc = -999.0;
00088 m_value = -999.0;
00089 }
00090 else {
00091
00092 m_mrpc = TofID::is_mrpc( identify );
00093 if( m_mrpc ) {
00094 m_channel = value;
00095 m_qtc = RawDataUtil::TofTime( m_channel );
00096 }
00097 else {
00098 if( !( TofID::is_scin( identify ) ) ) {
00099 std::cout << "Event/RawDataProviderSvc:: ERROR! ETF(MRPC) data is treated as scintillator data !" << std::endl;
00100 }
00101
00102 m_channel = ( value & 0x1fff );
00103 if( ( value & 0x80000 ) != 0 ) {
00104 if( m_corr ) {
00105 if( m_channel < 4000 ) {
00106 m_channel += 0x2000;
00107 }
00108 }
00109 else {
00110 m_channel += 0x2000;
00111 }
00112 }
00113
00114 int barrel = TofID::barrel_ec( identify );
00115 int tofid = TofID::phi_module( identify );
00116 int layer = TofID::layer( identify );
00117 if( barrel==1 ) {
00118 if( layer==1 ) {
00119 tofid = tofid + 88;
00120 }
00121 }
00122 else if( barrel==2 ) {
00123 tofid = tofid + 48;
00124 }
00125 int east = TofID::end( identify );
00126
00127 if( m_corr ) {
00128 if( barrel==1 ) {
00129 if( east==0 ) {
00130 m_qtc = tofQCorrSvc->BQRaw1( tofid, m_channel*1.0 );
00131 }
00132 else {
00133 m_qtc = tofQCorrSvc->BQRaw2( tofid, m_channel*1.0 );
00134 }
00135 }
00136 else {
00137 m_qtc = tofQCorrSvc->EQRaw( tofid, m_channel*1.0 );
00138 }
00139 }
00140 else {
00141 m_qtc = m_channel*1.0;
00142 }
00143
00144 if( m_elec ) {
00145 if( barrel==1 ) {
00146 if( east==0 ) {
00147 m_value = tofQElecSvc->BQTC1( tofid, m_qtc );
00148 }
00149 else {
00150 m_value = tofQElecSvc->BQTC2( tofid, m_qtc );
00151 }
00152 }
00153 else {
00154 m_value = tofQElecSvc->EQTC( tofid, m_qtc );
00155 }
00156 }
00157 else {
00158 m_value = m_qtc*1.0;
00159 }
00160 }
00161
00162 }
00163 return;
00164 }
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246 PmtData::PmtData() {
00247 m_iden_value = 0;
00248 m_times = 0;
00249 m_quality = 0;
00250 m_adc = 0;
00251 m_tdc = 0;
00252 }
00253
00254
00255 PmtData::~PmtData() {
00256 PmtData::clear();
00257 }
00258
00259
00260 PmtData& PmtData::operator=(const PmtData& source){
00261 m_iden_value = source.m_iden_value;
00262 m_times = source.m_times;
00263 m_quality = source.m_quality;
00264 m_adc = source.m_adc;
00265 m_tdc = source.m_tdc;
00266 return *this;
00267 }
00268
00269
00270 int PmtData::adcChannel() {
00271 int channel = -999;
00272 if( m_adc ) {
00273 channel = m_adc->channel();
00274 }
00275 return channel;
00276 }
00277
00278
00279 double PmtData::qtc() {
00280 double value = -999.0;
00281 if( m_adc ) {
00282 value = m_adc->qtc();
00283 }
00284 else {
00285 if( m_tdc ) {
00286 value = 10000.0;
00287 }
00288 }
00289 return value;
00290 }
00291
00292
00293 double PmtData::adc() {
00294 double value = -999.0;
00295 if( m_adc ) {
00296
00297 if( TofID::is_mrpc( TofID::cell_id( m_iden_value ) ) ) {
00298 if( m_tdc ) {
00299 double tleading = m_tdc->value();
00300 if( tleading>0.0 ) {
00301 int qchannel = m_adc->channel();
00302 if( qchannel!=10000 && qchannel!=-999 ) {
00303 double ttrailing = m_adc->qtc();
00304 value = ttrailing - tleading;
00305 }
00306 }
00307 }
00308 }
00309 else {
00310 value = m_adc->value();
00311 }
00312 }
00313 else {
00314 if( m_tdc ) {
00315 value = 10000.0;
00316 }
00317 }
00318 return value;
00319 }
00320
00321
00322 int PmtData::qclock() {
00323 int clock = -999;
00324 if( m_adc ) {
00325 clock = m_adc->clock();
00326 }
00327 return clock;
00328 }
00329
00330
00331 int PmtData::tdcChannel() {
00332 int channel = -999;
00333 if( m_tdc ) {
00334 channel = m_tdc->channel();
00335 }
00336 return channel;
00337 }
00338
00339
00340 double PmtData::tdc() {
00341 double value = -999.;
00342 if( m_tdc ) {
00343 value = m_tdc->value();
00344 }
00345 return value;
00346 }
00347
00348
00349 int PmtData::tclock() {
00350 int clock = -999;
00351 if( m_tdc ) {
00352 clock = m_tdc->clock();
00353 }
00354 return clock;
00355 }
00356
00357
00358 void PmtData::timespp() {
00359 m_times = m_times + 1;
00360 return;
00361 }
00362
00363
00364 void PmtData::timesmm() {
00365 m_times = m_times - 1;
00366 return;
00367 }
00368
00369
00370 void PmtData::qtimespp() {
00371 if( m_adc ) {
00372 m_adc->timespp();
00373 }
00374 return;
00375 }
00376
00377
00378 void PmtData::qtimesmm() {
00379 if( m_adc ) {
00380 m_adc->timesmm();
00381 }
00382 return;
00383 }
00384
00385
00386 void PmtData::ttimespp() {
00387 if( m_tdc ) {
00388 m_tdc->timespp();
00389 }
00390 return;
00391 }
00392
00393
00394 void PmtData::ttimesmm() {
00395 if( m_tdc ) {
00396 m_tdc->timesmm();
00397 }
00398 return;
00399 }
00400
00401
00402 int PmtData::qtimes() {
00403 int times = -1;
00404 if( m_adc ) {
00405 times = m_adc->times();
00406 }
00407 return times;
00408 }
00409
00410
00411 int PmtData::ttimes() {
00412 int times = -1;
00413 if( m_tdc ) {
00414 times = m_tdc->times();
00415 }
00416 return times;
00417 }
00418
00419
00420 int PmtData::qnumber() {
00421 int number = 0;
00422 if( m_adc ) {
00423 number = m_adc->number();
00424 }
00425 return number;
00426 }
00427
00428
00429 int PmtData::tnumber() {
00430 int number = 0;
00431 if( m_tdc ) {
00432 number = m_tdc->number();
00433 }
00434 return number;
00435 }
00436
00437
00438 bool PmtData::qused() {
00439 bool used = false;
00440 if( m_adc ) {
00441 used = m_adc->used();
00442 }
00443 return used;
00444 }
00445
00446
00447 bool PmtData::tused() {
00448 bool used = false;
00449 if( m_tdc ) {
00450 used = m_tdc->used();
00451 }
00452 return used;
00453 }
00454
00455
00456 bool PmtData::used() {
00457 bool used = false;
00458 if( m_adc ) {
00459 used = ( used || m_adc->used() );
00460 }
00461 if( m_tdc ) {
00462 used = ( used || m_tdc->used() );
00463 }
00464 return used;
00465 }
00466
00467
00468 void PmtData::setAdc( Adc* adc ) {
00469 m_adc = adc;
00470 if( adc->channel() != -999 ) {
00471 if( m_adc->times() == -1 ) { m_adc->timespp(); }
00472 m_quality = ( m_quality | 0x2 );
00473 }
00474 return;
00475 }
00476
00477
00478 void PmtData::setTdc( Tdc* tdc ) {
00479 m_tdc = tdc;
00480 if( tdc->channel() != -999 ) {
00481 if( m_tdc->times() == -1 ) { m_tdc->timespp(); }
00482 m_quality = ( m_quality | 0x1 );
00483 }
00484 return;
00485 }
00486
00487
00488 void PmtData::setUsed() {
00489 if( m_adc ) {
00490 m_adc->setUsed( true );
00491 }
00492 if( m_tdc ) {
00493 m_tdc->setUsed( true );
00494 }
00495 return;
00496 }
00497
00498
00499 void PmtData::clear() {
00500 if( m_adc ) {
00501 if( m_adc->times() <= 1 ) {
00502 delete m_adc;
00503 m_adc = 0;
00504 }
00505 else {
00506 m_adc->timesmm();
00507 }
00508 }
00509 if( m_tdc ) {
00510 if( m_tdc->times() <= 1 ) {
00511 delete m_tdc;
00512 m_tdc = 0;
00513 }
00514 else {
00515 m_tdc->timesmm();
00516 }
00517 }
00518 return;
00519 }
00520
00521
00522 TofData::TofData() {
00523 m_identify = 0;
00524 m_mrpc = false;
00525 m_barrel = false;
00526 m_tofId = -1;
00527 m_layer = -1;
00528 m_strip = -1;
00529 m_tofTrackId = -1;
00530 m_misLable = false;
00531 m_quality = 0;
00532 m_tmatched = false;
00533 m_forward = 0;
00534 m_backward = 0;
00535 m_ztdc = -999;
00536 m_zadc = -999;
00537 m_zpos = -999;
00538 m_energy = 0;
00539 }
00540
00541
00542 TofData& TofData::operator=(const TofData& source){
00543 m_identify = source.m_identify;
00544 m_mrpc = source.m_mrpc;
00545 m_barrel = source.m_barrel;
00546 m_tofId = source.m_tofId;
00547 m_layer = source.m_layer;
00548 m_strip = source.m_strip;
00549 m_tofTrackId = source.m_tofTrackId;
00550 m_misLable = source.m_misLable;
00551 m_quality = source.m_quality;
00552 m_tmatched = source.m_tmatched;
00553 m_forward = source.m_forward;
00554 m_backward = source.m_backward;
00555 m_ztdc = source.m_ztdc;
00556 m_zadc = source.m_zadc;
00557 m_zpos = source.m_zpos;
00558 m_energy = source.m_energy;
00559 return *this;
00560 }
00561
00562
00563 TofData::~TofData() {
00564 TofData::clear();
00565 }
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577 void TofData::setIdentify( Identifier identify ) {
00578 m_identify = identify.get_value();
00579 m_mrpc = TofID::is_mrpc( identify );
00580 if( !m_mrpc ) {
00581 int barrel_ec = TofID::barrel_ec(identify);
00582 m_layer = TofID::layer(identify);
00583 m_tofId = TofID::phi_module(identify);
00584 if( barrel_ec == 0 ) {
00585 m_barrel = false;
00586 }
00587 else if( barrel_ec == 1 ) {
00588 m_barrel = true;
00589 if( m_layer == 1 ) { m_tofId = m_tofId + 88; }
00590 }
00591 else if( barrel_ec == 2 ) {
00592 m_barrel = false;
00593 m_tofId = m_tofId + 48;
00594 }
00595 }
00596 else {
00597 m_barrel = false;
00598 int endcap = TofID::endcap(identify);
00599 m_tofId = TofID::module(identify);
00600 if( endcap==1 ) {
00601 m_tofId = m_tofId + 36;
00602 }
00603 m_strip = TofID::strip(identify);
00604 }
00605
00606 return;
00607 }
00608
00609
00610 void TofData::data( double& adcEast, double& tdcEast, double& adcWest, double& tdcWest ) {
00611 adcEast = -999.;
00612 tdcEast = -999.;
00613 if( m_forward ) {
00614 adcEast = m_forward->adc();
00615 tdcEast = m_forward->tdc();
00616 }
00617 adcWest = -999.;
00618 tdcWest = -999.;
00619 if( m_backward ) {
00620 adcWest = m_backward->adc();
00621 tdcWest = m_backward->tdc();
00622 }
00623 return;
00624 }
00625
00626
00627 void TofData::data(double& adc, double& tdc ) {
00628 adc = -999.;
00629 tdc = -999.;
00630 if( m_forward ) {
00631 adc = m_forward->adc();
00632 tdc = m_forward->tdc();
00633 }
00634 return;
00635 }
00636
00637
00638 double TofData::adc1() {
00639 double value = -999.;
00640 if( m_forward ) {
00641 value = m_forward->adc();
00642 }
00643 return value;
00644 }
00645
00646
00647 double TofData::tdc1() {
00648 double value = -999.;
00649 if( m_forward ) {
00650 value = m_forward->tdc();
00651 }
00652 return value;
00653 }
00654
00655
00656 double TofData::adc2() {
00657 double value = -999.;
00658 if( m_backward ) {
00659 value = m_backward->adc();
00660 }
00661 return value;
00662 }
00663
00664
00665 double TofData::tdc2() {
00666 double value = -999.;
00667 if( m_backward ) {
00668 value = m_backward->tdc();
00669 }
00670 return value;
00671 }
00672
00673
00674 double TofData::adc() {
00675 double value = -999.;
00676 if( m_forward ) {
00677 value = m_forward->adc();
00678 }
00679 return value;
00680 }
00681
00682
00683 double TofData::tdc() {
00684 double value = -999.;
00685 if( m_forward ) {
00686 value = m_forward->tdc();
00687 }
00688 return value;
00689 }
00690
00691
00692 double TofData::qtc1() {
00693 double value = -999.;
00694 if( m_forward ) {
00695 value = m_forward->qtc();
00696 }
00697 return value;
00698 }
00699
00700
00701 double TofData::qtc2() {
00702 double value = -999.;
00703 if( m_backward ) {
00704 value = m_backward->qtc();
00705 }
00706 return value;
00707 }
00708
00709
00710 double TofData::qtc() {
00711 double value = -999.;
00712 if( m_forward ) {
00713 value = m_forward->qtc();
00714 }
00715 return value;
00716 }
00717
00718
00719 int TofData::adcChannelEast() {
00720 int channel = -999;
00721 if( m_forward ) {
00722 channel = m_forward->adcChannel();
00723 }
00724 return channel;
00725 }
00726
00727
00728 int TofData::tdcChannelEast() {
00729 int channel = -999;
00730 if( m_forward ) {
00731 channel = m_forward->tdcChannel();
00732 }
00733 return channel;
00734 }
00735
00736
00737 int TofData::adcChannelWest() {
00738 int channel = -999;
00739 if( m_backward ) {
00740 channel = m_backward->adcChannel();
00741 }
00742 return channel;
00743 }
00744
00745
00746 int TofData::tdcChannelWest() {
00747 int channel = -999;
00748 if( m_backward ) {
00749 channel = m_backward->tdcChannel();
00750 }
00751 return channel;
00752 }
00753
00754
00755 int TofData::adcChannel() {
00756 int channel = -999;
00757 if( m_forward ) {
00758 channel = m_forward->adcChannel();
00759 }
00760 return channel;
00761 }
00762
00763
00764 int TofData::tdcChannel() {
00765 int channel = -999;
00766 if( m_forward ) {
00767 channel = m_forward->tdcChannel();
00768 }
00769 return channel;
00770 }
00771
00772
00773 int TofData::qclock1() {
00774 int clock = -999;
00775 if( m_forward ) {
00776 clock = m_forward->qclock();
00777 }
00778 return clock;
00779 }
00780
00781
00782 int TofData::tclock1() {
00783 int clock = -999;
00784 if( m_forward ) {
00785 clock = m_forward->tclock();
00786 }
00787 return clock;
00788 }
00789
00790
00791 int TofData::qclock2() {
00792 int clock = -999;
00793 if( m_backward ) {
00794 clock = m_backward->qclock();
00795 }
00796 return clock;
00797 }
00798
00799
00800 int TofData::tclock2() {
00801 int clock = -999;
00802 if( m_backward ) {
00803 clock = m_backward->tclock();
00804 }
00805 return clock;
00806 }
00807
00808
00809 int TofData::qclock() {
00810 int clock = -999;
00811 if( m_forward ) {
00812 clock = m_forward->qclock();
00813 }
00814 return clock;
00815 }
00816
00817
00818 int TofData::tclock() {
00819 int clock = -999;
00820 if( m_forward ) {
00821 clock = m_forward->tclock();
00822 }
00823 return clock;
00824 }
00825
00826
00827 int TofData::qtimes1() {
00828 int times = -1;
00829 if( m_forward ) {
00830 times = m_forward->qtimes();
00831 }
00832 return times;
00833 }
00834
00835
00836 int TofData::ttimes1() {
00837 int times = -1;
00838 if( m_forward ) {
00839 times = m_forward->ttimes();
00840 }
00841 return times;
00842 }
00843
00844
00845 int TofData::qtimes2() {
00846 int times = -1;
00847 if( m_backward ) {
00848 times = m_backward->qtimes();
00849 }
00850 return times;
00851 }
00852
00853
00854 int TofData::ttimes2() {
00855 int times = -1;
00856 if( m_backward ) {
00857 times = m_backward->ttimes();
00858 }
00859 return times;
00860 }
00861
00862
00863 unsigned int TofData::eastTimes() {
00864 int times = 0;
00865 if( m_forward ) {
00866 times = m_forward->times();
00867 }
00868 return times;
00869 }
00870
00871
00872 unsigned int TofData::westTimes() {
00873 int times = 0;
00874 if( m_backward ) {
00875 times = m_backward->times();
00876 }
00877 return times;
00878 }
00879
00880
00881 int TofData::qnumber1() {
00882 int number = 0;
00883 if( m_forward ) {
00884 number = m_forward->qnumber();
00885 }
00886 return number;
00887 }
00888
00889
00890 int TofData::tnumber1() {
00891 int number = 0;
00892 if( m_forward ) {
00893 number = m_forward->tnumber();
00894 }
00895 return number;
00896 }
00897
00898
00899 int TofData::qnumber2() {
00900 int number = 0;
00901 if( m_backward ) {
00902 number = m_backward->qnumber();
00903 }
00904 return number;
00905 }
00906
00907
00908 int TofData::tnumber2() {
00909 int number = 0;
00910 if( m_backward ) {
00911 number = m_backward->tnumber();
00912 }
00913 return number;
00914 }
00915
00916
00917 bool TofData::qused1() {
00918 bool used = false;
00919 if( m_forward ) {
00920 used = ( used || m_forward->qused() );
00921 }
00922 return used;
00923 }
00924
00925
00926 bool TofData::tused1() {
00927 bool used = false;
00928 if( m_forward ) {
00929 used = ( used || m_forward->tused() );
00930 }
00931 return used;
00932 }
00933
00934
00935 bool TofData::qused2() {
00936 bool used = false;
00937 if( m_backward ) {
00938 used = ( used || m_backward->qused() );
00939 }
00940 return used;
00941 }
00942
00943
00944 bool TofData::tused2() {
00945 bool used = false;
00946 if( m_backward ) {
00947 used = ( used || m_backward->tused() );
00948 }
00949 return used;
00950 }
00951
00952
00953 bool TofData::used1() {
00954 bool used = false;
00955 if( m_forward ) {
00956 used = ( used || m_forward->used() );
00957 }
00958 return used;
00959 }
00960
00961
00962 bool TofData::used2() {
00963 bool used = false;
00964 if( m_backward ) {
00965 used = ( used || m_backward->used() );
00966 }
00967 return used;
00968 }
00969
00970
00971 bool TofData::used() {
00972 bool used = false;
00973 if( m_forward ) {
00974 used = ( used || m_forward->used() );
00975 }
00976 if( m_backward ) {
00977 used = ( used || m_backward->used() );
00978 }
00979 return used;
00980 }
00981
00982
00983 void TofData::setForward( PmtData* pmt ) {
00984 m_forward = pmt;
00985 unsigned int quality = m_forward->quality();
00986 quality = ( quality & 0x3 );
00987 if( quality != 0 ) {
00988 m_forward->timespp();
00989 if( ( quality & 0x1 ) != 0 ) {
00990 m_forward->ttimespp();
00991 }
00992 if( ( quality & 0x2 ) != 0 ) {
00993 m_forward->qtimespp();
00994 }
00995 }
00996 m_quality = ( m_quality | ( quality << 2 ) );
00997 return;
00998 }
00999
01000
01001 void TofData::setBackward( PmtData* pmt ) {
01002 m_backward = pmt;
01003 unsigned int quality = m_backward->quality();
01004 quality = ( quality & 0x3 );
01005 if( quality != 0 ) {
01006 m_backward->timespp();
01007 if( ( quality & 0x1 ) != 0 ) {
01008 m_backward->ttimespp();
01009 }
01010 if( ( quality & 0x2 ) != 0 ) {
01011 m_backward->qtimespp();
01012 }
01013 }
01014 m_quality = ( m_quality | quality );
01015 return;
01016 }
01017
01018
01019 void TofData::setUsed() {
01020 if( m_forward ) {
01021 m_forward->setUsed();
01022 }
01023 if( m_backward ) {
01024 m_backward->setUsed();
01025 }
01026 return;
01027 }
01028
01029
01030 void TofData::clear() {
01031 if( m_forward ) {
01032 if( m_forward->times() <= 1 ) {
01033 delete m_forward;
01034 m_forward = 0;
01035 }
01036 else {
01037 m_forward->timesmm();
01038 }
01039 }
01040 if( m_backward ) {
01041 if( m_backward->times() <= 1 ) {
01042 delete m_backward;
01043 m_backward = 0;
01044 }
01045 else {
01046 m_backward->timesmm();
01047 }
01048 }
01049 return;
01050 }