CGEM BOSS 6.6.5.f
BESIII Offline Software System
Loading...
Searching...
No Matches
TofRawDataProvider Class Reference

#include <TofRawDataProvider.h>

+ Inheritance diagram for TofRawDataProvider:

Public Member Functions

 TofRawDataProvider ()
 
 TofRawDataProvider (const char *name)
 
 ~TofRawDataProvider ()
 
StatusCode initialize (bool mode=false, ISvcLocator *svcLoc=0, IMessageSvc *pMsg=0)
 
void handle (const Incident &)
 
void tofDataMapFull ()
 
TofDataMaptofDataMapOnlineMode (uint32_t control=1)
 
TofDataVectortofDataVectorOnlineMode (uint32_t control=1)
 
TofDataMaptofDataMapEstime ()
 
TofDataVectortofDataVectorEstime ()
 
TofDataMaptofDataMapTof (double estime=0.0)
 
TofDataVectortofDataVectorTof (double estime=0.0)
 
TofDataMaptofDataMapEmc (double estime=0.0)
 
TofDataVectortofDataVectorEmc (double estime=0.0)
 
 TofRawDataProvider ()
 
 TofRawDataProvider (const char *name)
 
 ~TofRawDataProvider ()
 
StatusCode initialize (bool mode=false, ISvcLocator *svcLoc=0, IMessageSvc *pMsg=0)
 
void handle (const Incident &)
 
void tofDataMapFull ()
 
TofDataMaptofDataMapOnlineMode (uint32_t control=1)
 
TofDataVectortofDataVectorOnlineMode (uint32_t control=1)
 
TofDataMaptofDataMapEstime ()
 
TofDataVectortofDataVectorEstime ()
 
TofDataMaptofDataMapTof (double estime=0.0)
 
TofDataVectortofDataVectorTof (double estime=0.0)
 
TofDataMaptofDataMapEmc (double estime=0.0)
 
TofDataVectortofDataVectorEmc (double estime=0.0)
 
- Public Member Functions inherited from RawDataProviderBase
 RawDataProviderBase (const char *name)
 
virtual ~RawDataProviderBase ()
 
StatusCode initialize (ISvcLocator *svcLoc=0, IMessageSvc *pMsg=0)
 
void setSvcLocator (ISvcLocator *svcLoc)
 
void setMsgSvc (IMessageSvc *svc)
 
void setMsgName (const char *name)
 
 RawDataProviderBase (const char *name)
 
virtual ~RawDataProviderBase ()
 
StatusCode initialize (ISvcLocator *svcLoc=0, IMessageSvc *pMsg=0)
 
void setSvcLocator (ISvcLocator *svcLoc)
 
void setMsgSvc (IMessageSvc *svc)
 
void setMsgName (const char *name)
 

Public Attributes

MrpcCalibSvcmrpcCaliSvc
 

Additional Inherited Members

- Protected Member Functions inherited from RawDataProviderBase
 RawDataProviderBase ()
 
 RawDataProviderBase ()
 
- Protected Attributes inherited from RawDataProviderBase
ISvcLocator * m_svcLocator
 
IMessageSvc * m_msgSvc
 
std::string m_name
 

Detailed Description

Constructor & Destructor Documentation

◆ TofRawDataProvider() [1/4]

TofRawDataProvider::TofRawDataProvider ( )

Definition at line 34 of file TofRawDataProvider.cxx.

34 :
36 m_hasFilled(0)
37{}

◆ TofRawDataProvider() [2/4]

TofRawDataProvider::TofRawDataProvider ( const char *  name)

Definition at line 40 of file TofRawDataProvider.cxx.

40 :
41 RawDataProviderBase( name ),
42 m_hasFilled(0)
43{}

◆ ~TofRawDataProvider() [1/2]

TofRawDataProvider::~TofRawDataProvider ( )

Definition at line 46 of file TofRawDataProvider.cxx.

46 {
47 IterTofDataMap iter = m_tofDataMap.begin();
48 for( ; iter != m_tofDataMap.end(); iter++ ) {
49 delete (*iter).second;
50 }
51 m_tofDataMap.clear();
52
53 m_tofDataMapOnline.clear();
54 m_tofDataVectorOnline.clear();
55 m_tofDataMapEstime.clear();
56 m_tofDataVectorEstime.clear();
57 m_tofDataMapTof.clear();
58 m_tofDataVectorTof.clear();
59 m_tofDataMapEmc.clear();
60 m_tofDataVectorEmc.clear();
61
62 return;
63}
std::multimap< unsignedint, TofData * >::iterator IterTofDataMap
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)

◆ TofRawDataProvider() [3/4]

TofRawDataProvider::TofRawDataProvider ( )

◆ TofRawDataProvider() [4/4]

TofRawDataProvider::TofRawDataProvider ( const char *  name)

◆ ~TofRawDataProvider() [2/2]

TofRawDataProvider::~TofRawDataProvider ( )

Member Function Documentation

◆ handle() [1/2]

void TofRawDataProvider::handle ( const Incident &  inc)

Definition at line 101 of file TofRawDataProvider.cxx.

101 {
102 MsgStream log( m_msgSvc, m_name );
103 log << MSG::DEBUG << "handle: " << inc.type() << endreq;
104 if ( inc.type() == "BeginEvent" ){
105 log << MSG::DEBUG << "Begin Event" << endreq;
106 IterTofDataMap iter = m_tofDataMap.begin();
107 for( ; iter != m_tofDataMap.end(); iter++ ) {
108 delete (*iter).second;
109 }
110 IterTofDataMap iterOnline = m_tofDataMapOnline.begin();
111 for( ; iterOnline != m_tofDataMapOnline.end(); iterOnline++ ) {
112 delete (*iterOnline).second;
113 }
114 m_tofDataMap.clear();
115 m_tofDataMapOnline.clear();
116 m_tofDataVectorOnline.clear();
117 m_tofDataMapEstime.clear();
118 m_tofDataVectorEstime.clear();
119 m_tofDataMapTof.clear();
120 m_tofDataVectorTof.clear();
121 m_tofDataMapEmc.clear();
122 m_tofDataVectorEmc.clear();
123
124 m_hasFilled = false;
125 }
126 return;
127}

Referenced by RawDataProviderSvc::handle().

◆ handle() [2/2]

void TofRawDataProvider::handle ( const Incident &  )

◆ initialize() [1/2]

StatusCode TofRawDataProvider::initialize ( bool  mode = false,
ISvcLocator *  svcLoc = 0,
IMessageSvc *  pMsg = 0 
)

Definition at line 66 of file TofRawDataProvider.cxx.

66 {
67 MsgStream log( m_msgSvc, m_name );
68 RawDataProviderBase::initialize( pSvcLoc,pMsg );
69
70 //Get TOF Calibtration Service
71 StatusCode scc = m_svcLocator->service("TofCaliSvc", tofCaliSvc);
72 if (scc == StatusCode::SUCCESS) {
73 log << MSG::INFO << "TofRec Get Calibration Service Sucessfully!" << endreq;
74 } else if(!mode) {
75 log << MSG::ERROR << "TofRec Get Calibration Service Failed !" << endreq;
76 return StatusCode::FAILURE;
77 }
78
79 //Get TOF Q Correction Service
80 StatusCode scq = m_svcLocator->service("TofQCorrSvc", tofQCorrSvc);
81 if (scq == StatusCode::SUCCESS) {
82 log << MSG::INFO << "TofRec Get Q Correction Service Sucessfully!" << endreq;
83 } else if(!mode){
84 log << MSG::ERROR << "TofRec Get Q Correction Service Failed !" << endreq;
85 return StatusCode::FAILURE;
86 }
87
88 //Get TOF Q Electronics Saturation Service
89 StatusCode sce = m_svcLocator->service("TofQElecSvc", tofQElecSvc);
90 if (sce == StatusCode::SUCCESS) {
91 log << MSG::INFO << "TofRec Get Q Electronics Calibration Service Sucessfully!" << endreq;
92 } else if(!mode){
93 log << MSG::ERROR << "TofRec Get Q Electronics Calibration Service Failed !" << endreq;
94 return StatusCode::FAILURE;
95 }
96
97 return StatusCode::SUCCESS;
98}
ITofQElecSvc * tofQElecSvc
ITofQCorrSvc * tofQCorrSvc
ITofCaliSvc * tofCaliSvc
StatusCode initialize(ISvcLocator *svcLoc=0, IMessageSvc *pMsg=0)

Referenced by RawDataProviderSvc::initialize().

◆ initialize() [2/2]

StatusCode TofRawDataProvider::initialize ( bool  mode = false,
ISvcLocator *  svcLoc = 0,
IMessageSvc *  pMsg = 0 
)

◆ tofDataMapEmc() [1/2]

TofDataMap & TofRawDataProvider::tofDataMapEmc ( double  estime = 0.0)

Definition at line 915 of file TofRawDataProvider.cxx.

915 {
916
917 if( !m_hasFilled ) {
919 m_hasFilled = true;
920 }
921
922 if( !m_tofDataMapEmc.empty() ) {
923 m_tofDataMapEmc.clear();
924 }
925
926 IterTofDataMap iter = m_tofDataMap.begin();
927 for( ; iter != m_tofDataMap.end(); iter++ ) {
928 if( ( ((*iter).second)->quality() & 0xa ) != 0 ) {
929
930 if( estime > 1.0e-6 ) {
931 int t0clock = static_cast<int>(estime/24.0);
932 int clock1 = ((*iter).second)->qclock1();
933 int clock2 = ((*iter).second)->qclock2();
934 bool forward = ( ( ( t0clock - clock1 ) < tClockBackward ) && ( ( clock1 - t0clock ) < tClockForward ) );
935 bool backward = ( ( ( t0clock - clock2 ) < tClockBackward ) && ( ( clock2 - t0clock ) < tClockForward ) );
936 if( !forward && !backward ) continue;
937 }
938
939 m_tofDataMapEmc.insert( make_pair( (*iter).first, (*iter).second ) );
940 }
941 }
942
943 iter = m_tofDataMapEmc.begin();
944 while( iter != m_tofDataMapEmc.end() ) {
945 unsigned int iden_value = (*iter).first;
946 unsigned int count = m_tofDataMapEmc.count( iden_value );
947 for( unsigned int i=0; i != count; i++, iter++ ) {
948 ((*iter).second)->setTimes( count );
949 }
950 }
951
952 return m_tofDataMapEmc;
953}
uint32_t count(const node_t &list)
Definition: node.cxx:42

Referenced by RawDataProviderSvc::tofDataMapEmc(), and tofDataVectorEmc().

◆ tofDataMapEmc() [2/2]

TofDataMap & TofRawDataProvider::tofDataMapEmc ( double  estime = 0.0)

◆ tofDataMapEstime() [1/2]

TofDataMap & TofRawDataProvider::tofDataMapEstime ( )

Definition at line 807 of file TofRawDataProvider.cxx.

807 {
808
809 if( !m_hasFilled ) {
811 m_hasFilled = true;
812 }
813
814 if( !m_tofDataMapEstime.empty() ) {
815 m_tofDataMapEstime.clear();
816 }
817
818 IterTofDataMap iter = m_tofDataMap.begin();
819 for( ; iter != m_tofDataMap.end(); iter++ ) {
820 if( ( ( ((*iter).second)->quality() & 0x5 ) != 0 ) && ((*iter).second)->tmatched() ) {
821 m_tofDataMapEstime.insert( make_pair( (*iter).first, (*iter).second ) );
822 }
823 }
824
825 iter = m_tofDataMapEstime.begin();
826 while( iter != m_tofDataMapEstime.end() ) {
827 unsigned int iden_value = (*iter).first;
828 unsigned int count = m_tofDataMapEstime.count( iden_value );
829 for( unsigned int i=0; i != count; i++, iter++ ) {
830 ((*iter).second)->setTimes( count );
831 }
832 }
833
834 return m_tofDataMapEstime;
835}

Referenced by RawDataProviderSvc::tofDataMapEstime(), and tofDataVectorEstime().

◆ tofDataMapEstime() [2/2]

TofDataMap & TofRawDataProvider::tofDataMapEstime ( )

◆ tofDataMapFull() [1/2]

void TofRawDataProvider::tofDataMapFull ( )

IMPORTANT /// We use the same datastructure as the olf tof, /// even if we do not have PMTs and so on ///

Definition at line 131 of file TofRawDataProvider.cxx.

131 {
132
133 MsgStream log(m_msgSvc, m_name);
134 log << MSG::INFO << "TofRawDataProvider::tofDataMapFull()" << endreq;
135
136 if( !m_tofDataMap.empty() ) {
137
138 log << MSG::WARNING << "TofRawDataProvider::tofDataMapFull: m_tofDataMap is NOT empty!" << endreq;
139
140 IterTofDataMap iter = m_tofDataMap.begin();
141 for( ; iter != m_tofDataMap.end(); iter++ ) {
142 delete (*iter).second;
143 }
144 m_tofDataMap.clear();
145 }
146 // tianhl for mt
147 std::string evtDataSvc_name("EventDataSvc");
148 if(isGaudiThreaded(m_name)){
149 evtDataSvc_name += getGaudiThreadIDfromName(m_name);
150 }
151 // tianhl for mt
152
153 IDataProviderSvc* eventSvc;
154 StatusCode sc = m_svcLocator->service( evtDataSvc_name.c_str(),eventSvc, true );
155 if( !sc.isSuccess() ) {
156 log << MSG::FATAL << "TofRawDataProvider::tofDataMapFull: ERROR Could not load EventDataSvc" << endreq;
157 return;
158 }
159
160 // Event Header
161 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc,"/Event/EventHeader");
162 if( !eventHeader ) {
163 log << MSG::FATAL << "TofRawDataProvider could not find Event Header!" << endreq;
164 return;
165 }
166 int run = eventHeader->runNumber();
167
168 bool mc = ( run < 0 ) ? true:false;
169 bool qCorr = bool( tofCaliSvc->QCorr() );
170 qCorr = qCorr && (!mc);
171 bool qElec = bool( tofCaliSvc->QElec() );
172 bool misLable = bool( tofCaliSvc->MisLable() );
173 misLable = ( !mc && misLable );
174 vector<int> deadId;
175
176 int identmp = -1;
177 for( unsigned int i=0; i<5; i++ ) {
178 identmp = tofCaliSvc->BrEast(i);
179 //std::cout << "TofRawDataProvider DeadID: identmp_breast " << identmp << std::endl;
180 if( identmp != 0x2fffffff ) {
181 //std::cout << "TofRawDataProvider deadid pushback " << identmp << std::endl;
182 deadId.push_back( identmp );
183 }
184 identmp = tofCaliSvc->BrWest(i);
185 //std::cout << "TofRawDataProvider DeadID: identmp_brwest " << identmp << std::endl;
186
187 if( identmp != 0x2fffffff ) {
188 //std::cout << "TofRawDataProvider deadid pushback " << identmp << std::endl;
189 deadId.push_back( identmp );
190 }
191 identmp = tofCaliSvc->Endcap(i);
192 //std::cout << "TofRawDataProvider DeadID: identmp_endcap " << identmp << std::endl;
193 if( identmp != 0x2fffffff ) {
194 //std::cout << "TofRawDataProvider deadid pushback " << identmp << std::endl;
195 deadId.push_back( identmp );
196 }
197 }
198
199 // get TDS data in a common class
200 SmartDataPtr<TofDigiCol> tofDigiCol(eventSvc,"/Event/Digi/TofDigiCol");
201 if( !tofDigiCol ) {
202 log << MSG::WARNING << "TofRawDataProvider::tofDataMapFull: Could not find Tof Digi Data!" << endreq;
203 return;
204 }
205
206 int qnumber = 0;
207 int tnumber = 0;
208
209 std::vector<Adc*> chargeVec;
210 std::vector<Tdc*> timeVec;
211
212
213
214
215 TofDigiCol::iterator iter = tofDigiCol->begin();
216
217for( ; iter != tofDigiCol->end(); iter++ ) {
218
219
220
221 Identifier iden_help = (*iter)->identify();
222 int barrel_ec_help = TofID::barrel_ec(iden_help);
223
224
225 if(barrel_ec_help == 0 || barrel_ec_help ==1 || barrel_ec_help==2) // barrel tof or old endcap
226 {
227
228 unsigned int overflow = (*iter)->getOverflow();
229 // electronics error message
230
231
232 if( ( overflow & 0xfe000000 ) == 0xfe000000 )
233 {
234 continue;
235 }
236
237 // overflow 0x 1 1 1 1 1 1
238 // no Q T / multi Q T / overflow Q T
239
240 bool multiQ = ( ( overflow & 0x8 ) != 0 );
241 bool multiT = ( ( overflow & 0x4 ) != 0 );
242
243 Identifier iden = (*iter)->identify();
244
245 unsigned int iden_value = iden.get_value();
246
247
248
249
250 bool sameId = false;
251 vector<int>::iterator iter_dead = deadId.begin();
252 for( ; iter_dead != deadId.end(); iter_dead++ ) {
253 if( iden_value == (*iter_dead) ) {
254 sameId = true;
255 break;
256 }
257 }
258 if( sameId ) {
259 if( mc ) { continue; }
260 else {
261 log << MSG::ERROR << "TofRawDataProvider::tofDataMapFull: Dead Channel Number is not Correct, please check TOF Calibration Constants!" << endreq;
262 }
263 }
264
265
266 int barrel_ec = TofID::barrel_ec(iden);
267 int id = TofID::phi_module(iden);
268 int end = TofID::end(iden);
269
270
271
272 if( ( barrel_ec != 1 ) && ( end == 1 ) ) continue;
273 // TofDigiCol 48 and 96 for luminocity
274 if( ( barrel_ec != 1 ) && ( id == 48 ) ) continue;
275
276 unsigned int tdcChannel = (*iter)->getTimeChannel();
277 unsigned int adcChannel = (*iter)->getChargeChannel();
278
279
280
281
282 if( ( overflow & 0x2 ) != 0 )
283 {
284 adcChannel = ( adcChannel | 0x80000 );
285 }
286
287 if( (adcChannel&0x7fffffff) != 0x7fffffff ) {
288
289 Adc* adc = new Adc;
290 if( qCorr ) adc->setCorr();
291 if( qElec ) adc->setElec();
292
293 adc->setValue( adcChannel );
294 qnumber++;
295 adc->setNumber( qnumber );
296 chargeVec.push_back( adc );
297 }
298
299
300
301 if( tdcChannel != 0x7fffffff ) {
302 Tdc* tdc = new Tdc;
303 tdc->setValue( tdcChannel );
304 tnumber++;
305 tdc->setNumber( tnumber );
306 timeVec.push_back( tdc );
307 }
308
309
310
311 if( multiT || multiQ ) {
312 TofDigiCol::iterator iter_next = iter + 1;
313 if( iter_next != tofDigiCol->end() ) {
314 unsigned int idenNext_value = ((*iter_next)->identify()).get_value();
315 if( iden_value == idenNext_value ) continue;
316 }
317 }
318
319
320
321 qnumber = 0;
322 tnumber = 0;
323
324 std::vector<PmtData*> pmtDataVec;
325 std::vector<Tdc*>::iterator iter_t = timeVec.begin();
326 for( ; iter_t != timeVec.end(); iter_t++ ) {
327 int tclock = (*iter_t)->clock();
328 PmtData* pmt = new PmtData;
329 pmt->setTdc( (*iter_t) );
330
331 std::vector<Adc*>::iterator iter_q = chargeVec.begin();
332 for( ; iter_q != chargeVec.end(); iter_q++ ) {
333 int qclock = (*iter_q)->clock();
334
335 if( abs(tclock-qclock)<2 ) {
336 if( ( pmt->quality() & 0x2 ) != 0 ) { // pmt has Q
337 if( (*iter_q)->value() > pmt->adc() ) {
338 pmt->qtimesmm();
339 pmt->setAdc( (*iter_q) );
340
341
342 }
343 }//close pmt has q
344 else { // pmt has no Q
345 pmt->setAdc( (*iter_q) );
346 }
347 }
348 }
349 pmtDataVec.push_back( pmt );
350 }
351
352
353
354 std::vector<Adc*>::iterator iter_q = chargeVec.begin();
355 for( ; iter_q != chargeVec.end(); iter_q++ ) {
356 //cout << "(*iter_q)->times() " << (*iter_q)->times() <<endl;
357 if( (*iter_q)->times() != -1 )
358 {
359 continue;
360 }
361
362 //cout << "Hallo Hier, d.h. times() von charge !=-1 und barrel_ec ist "<< barrel_ec_help <<endl;
363 PmtData* pmt = new PmtData;
364 pmt->setAdc( (*iter_q) );
365 pmtDataVec.push_back( pmt );
366 }
367
368
369 //std::cout << "TofRawDataProvider old chargeVec.size() " << chargeVec.size() << std::endl;
370 //std::cout << "TofRawDataProvider old timeVec.size() " << timeVec.size() << std::endl;
371 chargeVec.clear();
372 timeVec.clear();
373
374 unsigned int iden_value_key = (iden_value & 0xfffffffe );
375 if( ( barrel_ec == 0 ) || ( barrel_ec == 2 ) ) {
376 std::vector<PmtData*>::iterator iter_pmt = pmtDataVec.begin();
377 for( ; iter_pmt != pmtDataVec.end(); iter_pmt++ ) {
378 TofData* tof = new TofData;
379 if( misLable ) {
380 tof->setMisLable();
381
382 if( barrel_ec==2 && id==42 ) {
383 unsigned int iden91 = TofID::getIntID( 2, 0, 91-48, 0 );
384
385 iden_value_key = iden91;
386 }
387
388 if( barrel_ec==2 && id==43 ) {
389 unsigned int iden90 = TofID::getIntID( 2, 0, 90-48, 0 );
390 iden_value_key = iden90;
391 }
392
393 }
394
395
396 tof->setIdentify( iden );
397 tof->setForward( (*iter_pmt) );
398 tof->setTMatched( true );
399 m_tofDataMap.insert( make_pair( iden_value_key, tof ) );
400 }
401 }
402 else if( barrel_ec == 1 ) { //super
403 unsigned int count = m_tofDataMap.count( iden_value_key );
404 if( count == 0 ) {
405 std::vector<PmtData*>::iterator iter_pmt = pmtDataVec.begin();
406 for( ; iter_pmt != pmtDataVec.end(); iter_pmt++ ) {
407 TofData* tof = new TofData;
408 tof->setIdentify( iden );
409 if( end == 0 ) {
410 tof->setForward( (*iter_pmt) );
411 }
412 else {
413 tof->setBackward( (*iter_pmt) );
414 }
415 tof->setTMatched( true );
416
417 m_tofDataMap.insert( make_pair( iden_value_key, tof ) );
418 }
419 }
420 else {
421 pair< IterTofDataMap, IterTofDataMap > range = m_tofDataMap.equal_range( iden_value_key );
422 std::vector<PmtData*>::iterator iter_pmt = pmtDataVec.begin();
423 for( ; iter_pmt != pmtDataVec.end(); iter_pmt++ ) {
424 bool used = false;
425 IterTofDataMap iter = range.first;
426 for( unsigned int tofDataNumber = 0; tofDataNumber < count; tofDataNumber++, iter++ ) {
427 bool matched = false;
428 if( end == 0 ) { // east, forward
429 if( ( ( (*iter_pmt)->quality() & 0x1 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x1 ) != 0 ) ) { // has east and west time
430 double time1 = (*iter_pmt)->tdc();
431 double time2 = ((*iter).second)->tdc2();
432 matched = ( abs(time1-time2)<timeDiff );
433 }
434 else if( ( ( (*iter_pmt)->quality() & 0x1 ) == 0 ) && ( ( (*iter_pmt)->quality() & 0x2 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x1 ) != 0 ) ) { // has east charge and west time
435 double time1 = (*iter_pmt)->qclock();
436 double time2 = ((*iter).second)->tclock2();
437 double time3 = ((*iter).second)->qclock2();
438 matched = ( ( abs(time1-time2)<=tClockDiff ) || ( abs(time1-time3)<=tClockDiff ) );
439 }
440 else if( ( ( (*iter_pmt)->quality() & 0x1 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x1 ) == 0 ) && ( ( ((*iter).second)->quality() & 0x2 ) != 0 ) ) { // has east time and west charge
441 double time1 = (*iter_pmt)->tclock();
442 double time2 = (*iter_pmt)->qclock();
443 double time3 = ((*iter).second)->qclock2();
444 matched = ( ( abs(time1-time3)<=tClockDiff ) || ( abs(time2-time3)<=tClockDiff ) );
445 }
446 else if( ( ( (*iter_pmt)->quality() & 0x1 ) == 0 ) && ( ( (*iter_pmt)->quality() & 0x2 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x1 ) == 0 ) && ( ( ((*iter).second)->quality() & 0x2 ) != 0 ) ) { // has east and west charge
447 double time1 = (*iter_pmt)->qclock();
448 double time2 = ((*iter).second)->qclock2();
449 matched = ( abs(time1-time2)<=tClockDiff );
450 }
451
452 if( matched ) {
453 used = true;
454 if( ( ( (*iter).second)->quality() & 0xc ) == 0 ) {
455 ((*iter).second)->setForward( (*iter_pmt) );
456 }
457 else {
458 TofData* tof = new TofData;
459 tof->setIdentify( iden );
460 tof->setForward( (*iter_pmt) );
461 tof->setBackward( ((*iter).second)->backward() );
462
463 m_tofDataMap.insert( make_pair( iden_value_key, tof ) );
464 }
465 }
466
467 }//close if(end==0)
468 else { // west, backward
469 if( ( ( (*iter_pmt)->quality() & 0x1 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x4 ) != 0 ) ) { // has west and east time
470 double time1 = (*iter_pmt)->tdc();
471 double time2 = ((*iter).second)->tdc1();
472 matched = ( abs(time1-time2)<timeDiff );
473 }
474 else if( ( ( (*iter_pmt)->quality() & 0x1 ) == 0 ) && ( ( (*iter_pmt)->quality() & 0x2 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x4 ) != 0 ) ) { // has west charge and east time
475 double time1 = (*iter_pmt)->qclock();
476 double time2 = ((*iter).second)->tclock1();
477 double time3 = ((*iter).second)->qclock1();
478 matched = ( ( abs(time1-time2)<=tClockDiff ) || ( abs(time1-time3)<=tClockDiff ) );
479 }
480 else if( ( ( (*iter_pmt)->quality() & 0x1 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x4 ) == 0 ) && ( ( ((*iter).second)->quality() & 0x8 ) != 0 ) ) { // has east time and west charge
481 double time1 = (*iter_pmt)->tclock();
482 double time2 = (*iter_pmt)->qclock();
483 double time3 = ((*iter).second)->qclock1();
484 matched = ( ( abs(time1-time3)<=tClockDiff ) || ( abs(time2-time3)<=tClockDiff ) );
485 }
486 else if( ( ( (*iter_pmt)->quality() & 0x1 ) == 0 ) && ( ( (*iter_pmt)->quality() & 0x2 ) != 0 ) && ( ( ((*iter).second)->quality() & 0x4 ) == 0 ) && ( ( ((*iter).second)->quality() & 0x8 ) != 0 ) ) { // has east and west charge
487 double time1 = (*iter_pmt)->qclock();
488 double time2 = ((*iter).second)->qclock1();
489 matched = ( abs(time1-time2)<=tClockDiff );
490 }
491
492 if( matched ) {
493 used = true;
494 if( ( ( (*iter).second)->quality() & 0x3 ) == 0 ) {
495 ((*iter).second)->setBackward( (*iter_pmt) );
496 if( ( ( ((*iter).second)->quality() & 0x5 )==0x5 ) || ( ( ( ((*iter).second)->quality() & 0x5 )==0x4 ) && ( ((*iter).second)->ttimes1()==1 ) ) || ( ( ( ((*iter).second)->quality() & 0x5 )==0x1 ) && ( ((*iter).second)->ttimes2()==1 ) ) ) {
497 ((*iter).second)->setTMatched( true );
498 }
499 else {
500 ((*iter).second)->setTMatched( false );
501 }
502 }
503 else {
504 TofData* tof = new TofData;
505 tof->setIdentify( iden );
506 tof->setForward( ((*iter).second)->forward() );
507 tof->setBackward( (*iter_pmt) );
508 if( ( ( tof->quality() & 0x5 )==0x5 ) || ( ( ( tof->quality() & 0x5 )==0x4 ) && ( tof->ttimes1()==1 ) ) || ( ( ( tof->quality() & 0x5 )==0x1 ) && ( tof->ttimes2()==1 ) ) ) {
509 tof->setTMatched( true );
510 }
511 else {
512 tof->setTMatched( false );
513 }
514 m_tofDataMap.insert( make_pair( iden_value_key, tof ) );
515 }
516 }
517 }
518 }
519 if( ! used ) {
520 TofData* tof = new TofData;
521 tof->setIdentify( iden );
522 if( end == 0 ) {
523 tof->setForward( (*iter_pmt) );
524 }
525 else {
526 tof->setBackward( (*iter_pmt) );
527 }
528 tof->setTMatched( true );
529 m_tofDataMap.insert( make_pair( iden_value_key, tof ) );
530 }
531 }
532 }
533 }
534
535 pmtDataVec.clear();
536
537 }//close if for barrel/old tof
538
539
540 else if(barrel_ec_help==3 || barrel_ec_help==4 || barrel_ec_help==5 || barrel_ec_help==6)//We treat the new MRPC endcap here!
541 {
542
543
544
545
546 //////////////////////////////////////////////////////
547 //// IMPORTANT ///
548 /// We use the same datastructure as the olf tof, ///
549 /// even if we do not have PMTs and so on ///
550 //////////////////////////////////////////////////////
551
552
553 Identifier iden = (*iter)->identify();
554
555 unsigned int iden_value = iden.get_value();
556
557 int barrel_ec = TofID::barrel_ec(iden);
558 int id = TofID::phi_module(iden);
559 int end = TofID::end(iden);
560
561
562 unsigned int tdcChannel = (*iter)->getTimeChannel();
563 unsigned int tdc2Channel = (*iter)->getChargeChannel();
564
565
566 double time_of_flight = RawDataUtil::TofTime(tdcChannel);
567 unsigned int pulse_length_channel_without_correction = tdc2Channel-tdcChannel;
568
569 double correction_ta= mrpcCaliSvc->Time_Amplitude_Correction(tdcChannel,tdc2Channel);
570 if(correction_ta<0) continue;//Charge is not enough -> Noise!
571
572 time_of_flight=time_of_flight - correction_ta/1000.; //Divide by 1000 to convert in ns
573 tdcChannel = RawDataUtil::TofTimeChannel(time_of_flight); //This is the correceted time of flight. All further calcualtion are performed with the corrected version.
574
575 //Store HIt information: The time of the first hit is stored in the "TDC" the lenght of the pulse in the "ADC", as the pulse length correspond to charge
576
577 Adc* adc = new Adc;
578 if( qCorr ) adc->setCorr(); //qCorr =0 for MC
579 if( qElec ) adc->setElec(); //qElec= 1 for MC
580
581
582 adc->setValue_mrpc( pulse_length_channel_without_correction,(tdcChannel & 0x07e000) ); //We store the length of the pulse into the ADC information as it corresponds to the charge! The other part is the clock information
583
584 qnumber++;
585 adc->setNumber(qnumber);//old stuff ?????
586
587
588 Tdc* tdc = new Tdc;
589 tdc->setValue( tdcChannel );
590 tnumber++;
591
592 tdc->setNumber( tnumber );//old stuff ?????
593
594
595 qnumber = 0;
596 tnumber = 0;
597
598 //Store the ADC and TDC information into a PMT
599 PmtData* pmt = new PmtData;
600 pmt->setTdc(tdc);
601 pmt->setAdc(adc);
602
603
604 chargeVec.clear();//old stuff
605 timeVec.clear();//old stuff
606
607
608
609 //Store this data into the TOFDATAMAP !
610 unsigned int iden_value_key_mrpc = (iden_value & 0xffffffff ); //The MRPC needs the last bit!
611
612 TofData* tof = new TofData;
613 if( misLable ) { tof->setMisLable(); }
614 tof->setIdentify( iden );
615 tof->setForward( pmt );
616 tof->setTMatched( true );//Sof far only MC data -> Match is true
617
618
619
620 m_tofDataMap.insert( make_pair( iden_value_key_mrpc, tof ) );
621
622
623
624
625
626 }//close else if new endcap.
627
628
629
630}//close for loop
631
632
633
634 return;
635
636}//close tofDataMapFull
double abs(const EvtComplex &c)
Definition: EvtComplex.hh:212
void setValue_mrpc(int value, int clock)
Definition: TofData.cxx:77
void setValue(int value)
Definition: TofData.cxx:85
virtual const int BrWest(unsigned int No)=0
virtual const int QElec()=0
virtual const int BrEast(unsigned int No)=0
virtual const int QCorr()=0
virtual const int MisLable()=0
virtual const int Endcap(unsigned int No)=0
double Time_Amplitude_Correction(unsigned int tdcChannel, unsigned int tdc2Channel)
void setAdc(Adc *adc)
Definition: TofData.cxx:398
void qtimesmm()
Definition: TofData.cxx:308
double adc()
Definition: TofData.cxx:238
void setTdc(Tdc *tdc)
Definition: TofData.cxx:408
static unsigned int TofTimeChannel(double time)
static double TofTime(unsigned int timeChannel)
void setValue(int value)
Definition: TofData.cxx:48
int ttimes1()
Definition: TofData.cxx:760
void setForward(PmtData *pmt)
Definition: TofData.cxx:907
void setBackward(PmtData *pmt)
Definition: TofData.cxx:926
int ttimes2()
Definition: TofData.cxx:778
void setIdentify(Identifier identify)
Definition: TofData.cxx:503
static int end(const Identifier &id)
static int phi_module(const Identifier &id)
static int barrel_ec(const Identifier &id)
Values of different levels (failure returns 0)
static value_type getIntID(int barrel_ec, int layer, int phi_module, int end)

Referenced by tofDataMapEmc(), tofDataMapEstime(), and tofDataMapTof().

◆ tofDataMapFull() [2/2]

void TofRawDataProvider::tofDataMapFull ( )

◆ tofDataMapOnlineMode() [1/2]

TofDataMap & TofRawDataProvider::tofDataMapOnlineMode ( uint32_t  control = 1)

Definition at line 640 of file TofRawDataProvider.cxx.

640 {
641
642 MsgStream log(m_msgSvc, m_name);
643 log << MSG::INFO << "TofRawDataProvider::tofDataMapOnlineMode()" << endreq;
644
645 if( ! m_tofDataMapOnline.empty() ) {
646 if(control){
647 IterTofDataMap iter = m_tofDataMapOnline.begin();
648 for( ; iter != m_tofDataMapOnline.end(); iter++ ) {
649 delete (*iter).second;
650 }
651 m_tofDataMapOnline.clear();
652 }
653 else return m_tofDataMapOnline;
654 }
655 // tianhl for mt
656 std::string evtDataSvc_name("EventDataSvc");
657 if(isGaudiThreaded(m_name)){
658 evtDataSvc_name += getGaudiThreadIDfromName(m_name);
659 }
660 // tianhl for mt
661
662 IDataProviderSvc* eventSvc;
663 StatusCode sc = m_svcLocator->service( evtDataSvc_name.c_str(), eventSvc, true );
664 if( !sc.isSuccess() ) {
665 log << MSG::FATAL << "TofRawDataProvider::tofDataMapOnlineMode(): ERROR Could not load EventDataSvc" << endreq;
666 return m_tofDataMapOnline;
667 }
668
669 // get TDS data in a common class
670 SmartDataPtr<TofDigiCol> tofDigiCol(eventSvc,"/Event/Digi/TofDigiCol");
671 if( !tofDigiCol ) {
672 log << MSG::WARNING << "TofRawDataProvider::tofDataMapOnlineMode(): Could not find Tof Digi Data!" << endreq;
673 return m_tofDataMapOnline;
674 }
675
676 TofDigiCol::iterator iter = tofDigiCol->begin();
677 for( ; iter != tofDigiCol->end(); iter++ ) {
678 unsigned int overflow = (*iter)->getOverflow();
679 if( ( overflow & 0xfe000000 ) == 0xfe000000 ) continue;
680 // overflow 0x 1 1 1 1 1 1
681 // no Q T / multi Q T / overflow Q T
682
683 bool noT = ( ( overflow & 0x10 ) != 0 );
684 // bool multiQ = ( ( overflow & 0x8 ) != 0 );
685 // bool multiT = ( ( overflow & 0x4 ) != 0 );
686 if( noT ) continue;
687
688 Identifier iden = (*iter)->identify();
689 unsigned int iden_value = iden.get_value();
690 int barrel_ec = TofID::barrel_ec(iden);
691 int id = TofID::phi_module(iden);
692 int end = TofID::end(iden);
693 if( ( barrel_ec != 1 ) && ( end == 1 ) ) continue;
694 if( ( barrel_ec != 1 ) && ( id == 48 ) ) continue;
695
696 unsigned int tdcChannel = (*iter)->getTimeChannel();
697 if( tdcChannel == 0x7fffffff ) continue;
698
699 Tdc* tdc = new Tdc;
700 tdc->setValue( tdcChannel );
701 PmtData* pmt = new PmtData;
702 pmt->setTdc( tdc );
703
704 unsigned int iden_value_key = ( iden_value & 0xfffffffe );
705
706 if( barrel_ec == 0 || barrel_ec == 2 ) {
707 TofData* tof = new TofData;
708 tof->setIdentify( iden );
709 tof->setForward( pmt );
710 m_tofDataMapOnline.insert( make_pair( iden_value_key, tof ) );
711 }
712 else if( barrel_ec == 1 ) {
713 unsigned int count = m_tofDataMapOnline.count( iden_value_key );
714
715 if( count == 0 ) {
716 TofData* tof = new TofData;
717 tof->setIdentify( iden );
718 if( end == 0 ) {
719 tof->setForward( pmt );
720 }
721 else {
722 tof->setBackward( pmt );
723 }
724 m_tofDataMapOnline.insert( make_pair( iden_value_key, tof ) );
725 }
726 else {
727 bool used = false;
728 pair< IterTofDataMap, IterTofDataMap > range = m_tofDataMapOnline.equal_range( iden_value_key );
729 IterTofDataMap iter = range.first;
730 for( unsigned int i=0; i<count; i++, iter++ ) {
731 if( ( end == 0 ) && ( ( ( (*iter).second)->quality() & 0x1 ) != 0 ) ) {
732 double time1 = pmt->tdc();
733 double time2 = ((*iter).second)->tdc2();
734 if( abs(time1-time2)<timeDiff ) {
735 used = true;
736 if( ( ( (*iter).second)->quality() & 0x4 ) == 0 ) {
737 ((*iter).second)->setForward( pmt );
738 }
739 else {
740 TofData* tof = new TofData;
741 tof->setIdentify( iden );
742 tof->setForward( pmt );
743 tof->setBackward( ((*iter).second)->backward() );
744 m_tofDataMapOnline.insert( make_pair( iden_value_key, tof ) );
745 }
746 }
747 }
748 else if( ( end == 1 ) && ( ( ((*iter).second)->quality() & 0x4 ) != 0 ) ) {
749 double time1 = ((*iter).second)->tdc1();
750 double time2 = pmt->tdc();
751
752 if( abs(time1-time2)<timeDiff ) {
753 used = true;
754 if( ( ( (*iter).second)->quality() & 0x1 ) == 0 ) {
755 ((*iter).second)->setBackward( pmt );
756 }
757 else {
758 TofData* tof = new TofData;
759 tof->setIdentify( iden );
760 tof->setForward( ((*iter).second)->forward() );
761 tof->setBackward( pmt );
762 m_tofDataMapOnline.insert( make_pair( iden_value_key, tof ) );
763 }
764 }
765 }
766 }
767 if( ! used ) {
768 TofData* tof = new TofData;
769 tof->setIdentify( iden );
770 if( end == 0 ) {
771 tof->setForward( pmt );
772 }
773 else {
774 tof->setBackward( pmt );
775 }
776 m_tofDataMapOnline.insert( make_pair( iden_value_key, tof ) );
777 }
778 }
779 }
780 }
781
782 return m_tofDataMapOnline;
783
784}
double tdc()
Definition: TofData.cxx:270

Referenced by RawDataProviderSvc::tofDataMapOnlineMode(), and tofDataVectorOnlineMode().

◆ tofDataMapOnlineMode() [2/2]

TofDataMap & TofRawDataProvider::tofDataMapOnlineMode ( uint32_t  control = 1)

◆ tofDataMapTof() [1/2]

TofDataMap & TofRawDataProvider::tofDataMapTof ( double  estime = 0.0)

Definition at line 851 of file TofRawDataProvider.cxx.

851 {
852
853 if( !m_hasFilled ) {
855 m_hasFilled = true;
856 }
857
858 if( !m_tofDataMapTof.empty() ) {
859 m_tofDataMapTof.clear();
860 }
861
862 IterTofDataMap iter = m_tofDataMap.begin();
863 for( ; iter != m_tofDataMap.end(); iter++ ) {
864 if( ( ( ((*iter).second)->quality() & 0xc ) == 0xc ) || ( ( ((*iter).second)->quality() & 0x3 ) == 0x3 ) ) {
865
866 if( estime > 1.0e-6 ) {
867 double tdc1 = ((*iter).second)->tdc1();
868 double tdc2 = ((*iter).second)->tdc2();
869 bool forward = ( ( ( estime - tdc1 ) < timeBackward ) && ( ( tdc1 - estime ) < timeForward ) );
870 bool backward = ( ( ( estime - tdc2 ) < timeBackward ) && ( ( tdc2 - estime ) < timeForward ) );
871
872 //std::cout << "TofRawDataProvider tdc1: " << tdc1 << std::endl;
873 //std::cout << "TofRawDataProvider tdc2: " << tdc1<< std::endl;
874 //std::cout << "TofRawDataProvider (est - tdc1) | (tdc1 - est): " << estime - tdc1 << " | " << tdc1 - estime<< std::endl;
875 //std::cout << "TofRawDataProvider (est - tdc2) | (tdc2 - est): " << estime - tdc2 << " | " << tdc2 - estime<< std::endl;
876 //std::cout << "TofRawDataProvider bool (est - tdc1)< 24 && (tdc1 - est)<120: " << forward << std::endl;
877 //std::cout << "TofRawDataProvider bool (est - tdc2)< 24 && (tdc2 - est)<120: " << backward << std::endl;
878 if( !forward && !backward ) continue;
879
880
881 }
882
883 m_tofDataMapTof.insert( make_pair( (*iter).first, (*iter).second ) );
884 }
885 }
886
887 iter = m_tofDataMapTof.begin();
888 while( iter != m_tofDataMapTof.end() ) {
889 unsigned int iden_value = (*iter).first;
890 unsigned int count = m_tofDataMapTof.count( iden_value );
891 for( unsigned int i=0; i != count; i++, iter++ ) {
892 ((*iter).second)->setTimes( count );
893 }
894 }
895
896 return m_tofDataMapTof;
897}

Referenced by RawDataProviderSvc::tofDataMapTof(), and tofDataVectorTof().

◆ tofDataMapTof() [2/2]

TofDataMap & TofRawDataProvider::tofDataMapTof ( double  estime = 0.0)

◆ tofDataVectorEmc() [1/2]

TofDataVector & TofRawDataProvider::tofDataVectorEmc ( double  estime = 0.0)

Definition at line 956 of file TofRawDataProvider.cxx.

956 {
957 if( m_tofDataVectorEmc.size() != 0 ) {
958 m_tofDataVectorEmc.clear();
959 }
960
963 for( ; iter != tofDataMapEmc.end(); iter++ ) {
964 m_tofDataVectorEmc.push_back( iter->second );
965 }
966 return m_tofDataVectorEmc;
967}
TofDataMap & tofDataMapEmc(double estime=0.0)

Referenced by RawDataProviderSvc::tofDataVectorEmc().

◆ tofDataVectorEmc() [2/2]

TofDataVector & TofRawDataProvider::tofDataVectorEmc ( double  estime = 0.0)

◆ tofDataVectorEstime() [1/2]

TofDataVector & TofRawDataProvider::tofDataVectorEstime ( )

Definition at line 838 of file TofRawDataProvider.cxx.

838 {
839 if( m_tofDataVectorEstime.size() != 0 ) return m_tofDataVectorEstime;
840
843 for( ; iter != tofDataMapEstime.end(); iter++ ) {
844 m_tofDataVectorEstime.push_back( iter->second );
845 }
846 return m_tofDataVectorEstime;
847}
TofDataMap & tofDataMapEstime()

Referenced by RawDataProviderSvc::tofDataVectorEstime().

◆ tofDataVectorEstime() [2/2]

TofDataVector & TofRawDataProvider::tofDataVectorEstime ( )

◆ tofDataVectorOnlineMode() [1/2]

TofDataVector & TofRawDataProvider::tofDataVectorOnlineMode ( uint32_t  control = 1)

Definition at line 787 of file TofRawDataProvider.cxx.

787 {
788
789 MsgStream log(m_msgSvc, m_name);
790 log << MSG::INFO << "TofRawDataProvider::tofDataVectorOnlineMode()" << endreq;
791
792 if( m_tofDataVectorOnline.size() != 0 ) {
793 if(!control) return m_tofDataVectorOnline;
794 else m_tofDataVectorOnline.clear();
795 }
797 IterTofDataMap iter = tofRawDataMap.begin();
798 for( ; iter != tofRawDataMap.end(); iter++ ) {
799 m_tofDataVectorOnline.push_back( iter->second );
800 }
801
802 return m_tofDataVectorOnline;
803}
TofDataMap & tofDataMapOnlineMode(uint32_t control=1)

Referenced by RawDataProviderSvc::tofDataVectorOnlineMode().

◆ tofDataVectorOnlineMode() [2/2]

TofDataVector & TofRawDataProvider::tofDataVectorOnlineMode ( uint32_t  control = 1)

◆ tofDataVectorTof() [1/2]

TofDataVector & TofRawDataProvider::tofDataVectorTof ( double  estime = 0.0)

Definition at line 900 of file TofRawDataProvider.cxx.

900 {
901 if( m_tofDataVectorTof.size() != 0 ) {
902 m_tofDataVectorTof.clear();
903 }
904
907 for( ; iter != tofDataMapTof.end(); iter++ ) {
908 m_tofDataVectorTof.push_back( iter->second );
909 }
910 return m_tofDataVectorTof;
911}
TofDataMap & tofDataMapTof(double estime=0.0)

Referenced by RawDataProviderSvc::tofDataVectorTof().

◆ tofDataVectorTof() [2/2]

TofDataVector & TofRawDataProvider::tofDataVectorTof ( double  estime = 0.0)

Member Data Documentation

◆ mrpcCaliSvc

MrpcCalibSvc * TofRawDataProvider::mrpcCaliSvc

The documentation for this class was generated from the following files: