BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
MucBuilder.cxx
Go to the documentation of this file.
1#include "Gaudi/Interfaces/IOptionsSvc.h"
2#include "GaudiKernel/Bootstrap.h"
3#include "GaudiKernel/ISvcLocator.h"
4#include "GaudiKernel/Parsers.h"
5using Gaudi::Interfaces::IOptionsSvc;
6
7#include "Identifier/MucID.h"
8#include "RawDataCnv/EventManagement/MucBuilder.h"
9
10using namespace std;
11
13 if ( !m_fec2idFile.empty() ) return;
14 // m_propMgr.declareProperty("Fec2IdMap", m_fec2idFile);
15
16 // Get a pointer to the Job Options Service
17 // IJobOptionsSvc* jobSvc;
18 auto jobSvc = Gaudi::svcLocator()->service<IOptionsSvc>( "JobOptionsSvc" );
19 Gaudi::Parsers::parse( m_fec2idFile, jobSvc->get( "MucBuilder.Fec2IdMap" ) );
20
21 m_re2te = new uint32_t[1024];
22 strSqcVec = new uint32_t[1024];
23 memset( (void*)m_re2te, 0xFF, 1024 * sizeof( uint32_t ) );
24 memset( (void*)strSqcVec, 0, 1024 * sizeof( uint32_t ) );
25
26 initialize( m_fec2idFile );
27}
28
30 delete m_re2te;
31 delete strSqcVec;
32}
33
34void MucBuilder::unPack( uint32_t reDigi, uint32_t& REId, uint32_t& FecData,
35 uint32_t& StrSqc ) {
36 uint32_t fecAddr = ( reDigi & 0xFFFF0000 ) >> 16;
37 uint32_t module = ( fecAddr & 0xF800 ) >> 5;
38 REId = ( fecAddr & 0x07FF ) | module;
39 FecData = reDigi & 0xFFFF;
40 StrSqc = strSqcVec[REId];
41 return;
42}
43
44StatusCode MucBuilder::pack( MucDigiCol* digiCol, WriteRawEvent*& re ) {
45 if ( digiCol == 0 )
46 {
47 cerr << "MdcBuilder::pack can't get digiCol" << endl;
48 return StatusCode::FAILURE;
49 }
50
51 uint32_t size = 0, index;
52 uint32_t teid, reid, channel;
53
54 MucDigiCol::const_iterator pMucDigi = digiCol->begin();
55 for ( pMucDigi; pMucDigi != digiCol->end(); pMucDigi++ )
56 {
57 teid = ( *pMucDigi )->getIntId();
58 reid = getREID( teid & 0xFFFFFFF0 );
59 channel =
60 ( strSqcVec[reid] == 0 ) ? ( 0x8000 >> ( teid & 0xF ) ) : ( 0x1 << ( teid & 0xF ) );
61 // set the value if the current reid has been in the buffer
62 for ( index = 0; index < size; index++ )
63 {
64 if ( ( m_buf[index] >> 16 ) == reid )
65 {
66 m_buf[index] |= channel;
67 break;
68 }
69 }
70 // otherwise, append the current reid and value to the buffer
71 if ( index == size ) m_buf[size++] = ( ( reid << 16 ) | ( channel ) );
72 }
73
74 append2event( re, 0xa40000, size );
75
76 return StatusCode::SUCCESS;
77}
78
79// initialize re2te tables
80StatusCode MucBuilder::initialize( string& fec2idFile ) {
81 ifstream fs( fec2idFile.c_str() );
82 if ( fs.bad() )
83 {
84 cerr << "Error: could not open file " << fec2idFile << endl;
85 return StatusCode::FAILURE;
86 }
87
88 fs.ignore( 256, '\n' );
89
90 int fec, part, seg, layer, firstStr, strSqc;
91
92 for ( int i = 0; i < 572; i++ )
93 {
94 fs >> fec >> part >> seg >> layer >> firstStr >> strSqc;
95 // reid ... teid
96 uint32_t reid = fec; // ?
97 uint32_t teid = MucID::getIntID( part, seg, layer, firstStr );
98 // if (strSqc < 0) teid |= 0x00F00000; // local teid
99
100 m_re2te[reid] = teid;
101 strSqcVec[reid] = strSqc + 1;
102 m_te2reMap.insert( TE2REMAP::value_type( teid, reid ) );
103 // cout << "teid " << teid << " reid " << reid << " strSqc " << strSqcVec[reid] << endl;
104 }
105
106 return StatusCode::SUCCESS;
107}
108
109uint32_t MucBuilder::getREID( uint32_t teid ) {
110 TE2REMAP::iterator itr = m_te2reMap.find( teid );
111
112 if ( itr == m_te2reMap.end() )
113 {
114 cout << "wrong teid in muc " << teid << endl;
115 exit( 8 );
116 }
117
118 return itr->second;
119}
#define fs
eformat::write::FullEventFragment WriteRawEvent
void append2event(WriteRawEvent *&re, uint32_t source_id, uint32_t size, uint32_t shift=0)
Definition Builder.cxx:69
Builder()
Definition Builder.cxx:11
virtual StatusCode pack(MucDigiCol *digiCol, WriteRawEvent *&re)
virtual void unPack(uint32_t reDigi, uint32_t &REId, uint32_t &FecData, uint32_t &StrSqc)
virtual StatusCode initialize(string &initFile)
virtual ~MucBuilder()
virtual uint32_t getREID(uint32_t teid)
static value_type getIntID(int barrel_ec, int segment, int layer, int channel)
Definition MucID.cxx:123