BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
RawDataEvtHeaderCnv.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "RawDataCnv/EventManagement/RAWEVENT.h"
4#include "RawDataCnv/OfflineRevise.h"
5#include "RawDataCnv/RawDataAddress.h"
6
7#include "RawDataBaseCnv.h"
8
9extern const CLID& CLID_EventHeader;
10static OfflineRevise* _localRevisor = nullptr;
11static int _localTimeRound = 0;
12
14public:
15 RawDataEvtHeaderCnv( ISvcLocator* svc ) : RawDataBaseCnv( svc, classID() ) {}
16
17 StatusCode initialize() {
18 MsgStream log( msgSvc(), "RawDataEvtHeaderCnv" );
19 log << MSG::INFO << "RawDataEvtHeaderCnv::initialize" << endmsg;
20
21 StatusCode sc = RawDataBaseCnv::initialize();
22 if ( sc.isFailure() )
23 {
24 log << MSG::ERROR << "Failed to initialize Converter" << endmsg;
25 return sc;
26 }
27
28 _localRevisor = m_inputSvc->offlineRevisor();
29
30 return StatusCode::SUCCESS;
31 }
32
33 static const CLID& classID() { return CLID_EventHeader; }
34
35 StatusCode createObj( IOpaqueAddress* pAddr, DataObject*& pObj ) {
36 StatusCode sc;
37 RawDataAddress* pEFAddr;
38 const RAWEVENT* evt;
39
41 pObj = header;
42
43 // if ( (pEFAddr = dynamic_cast<RawDataAddress*>(pAddr)) ) {
44 evt = m_inputSvc->currentEvent();
45
46 if ( evt == NULL ) return StatusCode::FAILURE;
47
48 header->setEventNumber( evt->eventHeader().event_number() );
49 header->setRunNumber( evt->eventHeader().run_number() );
50 header->setTime( evt->eventHeader().time() );
51 header->setFlag1( evt->eventHeader().flag1() );
52 // header->setFlag2( evt->eventHeader().flag2() );
53
54 const BufferHolder& rBuf = evt->getEtsBuf();
55 if ( rBuf.nBuf() == 1 )
56 { // this event has ETS data
57 uint32_t dataLen = rBuf.bufSize( 0 );
58 uint32_t* dataPtr = rBuf( 0 );
59
60 if ( dataLen > 11 && dataPtr[1] == 0xffffffff )
61 {
62 uint32_t start = 10;
63 if ( ( dataPtr[start] >> 24 ) == 0xcf )
64 {
65 _localTimeRound = _localRevisor->timeRound( header->runNumber() );
66
67 unsigned long t1 = calEts( dataPtr + start );
68 header->setEtsT1( t1 );
69
70 static unsigned long t2 = 0;
71 if ( ( start + 3 ) < dataLen && dataPtr[start + 2] != 0xf0f0f0f0 )
72 {
73 if ( ( dataPtr[start + 2] >> 24 ) == 0xd1 ) { t2 = calEts( dataPtr + start + 2 ); }
74 else
75 {
76 uint32_t _dataT2[2] = { dataPtr[10], dataPtr[12] };
77 unsigned long _t2 = calEts( _dataT2 );
78 if ( labs( _t2 - t2 ) < 150 /*ms*/ * 2000 ) { t2 = _t2; }
79 else if ( labs( _t2 - 2000000 - t2 ) < 150 * 2000 ) { t2 = _t2 - 2000000; }
80 else if ( labs( _t2 + 2000000 - t2 ) < 150 * 2000 ) { t2 = _t2 + 2000000; }
81 }
82 }
83 header->setEtsT2( t2 );
84 }
85 }
86 }
87
88 return StatusCode::SUCCESS;
89 //}
90 }
91
92 unsigned long calEts( uint32_t* dptr ) {
93 unsigned int tmp = dptr[0] & 0xffffff;
94 unsigned long val = ( tmp >> 16 ) * _localTimeRound * _localTimeRound;
95 val += ( ( tmp >> 8 ) & 0xff ) * _localTimeRound;
96 val += tmp & 0xff;
97 val *= 2000000; // s -> 500ns
98 val += ( dptr[1] & 0x3fffff );
99 return val;
100 }
101};
const CLID & CLID_EventHeader
const CLID & CLID_EventHeader
IMessageSvc * msgSvc()
void setRunNumber(int value)
Update run number.
void setFlag1(unsigned int value)
Update flags.
void setEventNumber(int value)
Update event number.
void setEtsT1(unsigned long value)
Update ETS.
IRawDataInputSvc * m_inputSvc
RawDataBaseCnv(long storageType, const CLID &clid, ISvcLocator *svc)
StatusCode initialize()
RawDataEvtHeaderCnv(ISvcLocator *svc)
static const CLID & classID()
unsigned long calEts(uint32_t *dptr)
StatusCode createObj(IOpaqueAddress *pAddr, DataObject *&pObj)