BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EmcBuilder.cxx
Go to the documentation of this file.
1#include "RawDataCnv/EventManagement/EmcBuilder.h"
2#include "Identifier/EmcID.h"
3#include <fstream>
4#include <iostream>
5using namespace std;
6
8 // set vector size (2^13) and initialize to -1
9 m_re2te = new uint32_t[8192]; // we have 2^14 different REID
10 memset( (void*)m_re2te, 0xFF, 8192 * sizeof( uint32_t ) );
11
13}
14
15EmcBuilder::~EmcBuilder() { delete m_re2te; }
16
17void EmcBuilder::unPack( uint32_t reDigi, uint32_t& REId, uint32_t& TETDC, uint32_t& TEADC,
18 uint32_t& measure ) {
19 REId = ( reDigi & m_idMask ) >> m_idIndex;
20 TETDC = ( reDigi & m_tdcMask ) >> m_tdcIndex;
21 TEADC = ( reDigi & m_adcMask ) >> m_adcIndex;
22 measure = ( reDigi & m_measureMask ) >> m_measureIndex;
23
24 return;
25}
26
27StatusCode EmcBuilder::pack( EmcDigiCol* digiCol, WriteRawEvent*& re ) {
28 if ( digiCol == 0 )
29 {
30 cerr << "EmcBuilder::pack can't get digiCol" << endl;
31 return StatusCode::FAILURE;
32 }
33
34 uint32_t size = 0;
35 uint32_t teid = 0, tetdc = 0, teadc = 0, reid = 0, redigi = 0, measure = 0;
36
37 EmcDigiCol::const_iterator pEmcDigi = digiCol->begin();
38 for ( pEmcDigi; pEmcDigi != digiCol->end(); pEmcDigi++ )
39 {
40 teid = ( *pEmcDigi )->getIntId();
41 reid = getREID( teid );
42 tetdc = ( *pEmcDigi )->getTimeChannel();
43 teadc = ( *pEmcDigi )->getChargeChannel();
44 measure = ( *pEmcDigi )->getMeasure();
45
46 // if negative energy, don't record
47 if ( teadc & 0x80000000 ) continue;
48 // set ...
49 redigi = ( ( reid << m_idIndex ) & m_idMask ) | ( ( tetdc << m_tdcIndex ) & m_tdcMask ) |
50 ( ( teadc << m_adcIndex ) & m_adcMask ) |
51 ( ( measure << m_measureIndex ) & m_measureMask );
52 m_buf[size++] = redigi;
53 }
54
55 append2event( re, 0xa30000, size );
56
57 return StatusCode::SUCCESS;
58}
59
60// initialize re2te tables
61
62StatusCode EmcBuilder::initialize( string& initFile ) {
63 ifstream f;
64
65 uint32_t nREThetaPos, nREPhiPos, nREEaWePos;
66 uint32_t nREThetaMask, nREPhiMask, nREEaWeMask;
67
68 //-----------------------------------------------------------
69 // read initFile
70 f.open( initFile.c_str() );
71
72 if ( f.bad() )
73 {
74 cerr << "Error: could not open file " << initFile << endl;
75 return StatusCode::FAILURE;
76 }
77
78 if ( !Builder::find( f, "##EmcDigiConf", initFile ) )
79 {
80 cerr << "Error: could not find '##EmcDigiConf' in file " << initFile << endl;
81 return StatusCode::FAILURE;
82 }
83
84 if ( !Builder::expect( f, "#Index,mask", initFile ) ||
85 !Builder::expectInt( f, "id", initFile, m_idIndex, m_idMask ) ||
86 !Builder::expectInt( f, "tdc", initFile, m_tdcIndex, m_tdcMask ) ||
87 !Builder::expectInt( f, "measure", initFile, m_measureIndex, m_measureMask ) ||
88 !Builder::expectInt( f, "adc", initFile, m_adcIndex, m_adcMask ) ||
89 !Builder::expectInt( f, "Phi", initFile, nREPhiPos, nREPhiMask ) ||
90 !Builder::expectInt( f, "Theta", initFile, nREThetaPos, nREThetaMask ) ||
91 !Builder::expectInt( f, "EaWe", initFile, nREEaWePos, nREEaWeMask ) )
92 return StatusCode::FAILURE;
93
94 f.close();
95
96 //-----------------------------------------------------------
97 // Build re2te table
98 for ( uint32_t barrel_ec_eawe = EmcID::getBARREL_EC_MIN();
99 barrel_ec_eawe <= EmcID::getBARREL_EC_MAX(); barrel_ec_eawe++ )
100 {
101 uint32_t TEthetaMax, TEphiMax;
102 uint32_t TEthetaMin, TEphiMin;
103 uint32_t eawe = 0, theta = 0, phi = 0;
104 if ( barrel_ec_eawe == EmcID::getBARREL() )
105 {
106 // it is BARREL
107 TEthetaMax = EmcID::getTHETA_BARREL_MAX(); // 43
108 TEthetaMin = EmcID::getTHETA_BARREL_MIN(); // 0
109 }
110 else
111 {
112 // it is ease and west ENDCAP
113 TEthetaMax = EmcID::getTHETA_ENDCAP_MAX(); // 5
114 TEthetaMin = EmcID::getTHETA_ENDCAP_MIN(); // 0
115 if ( barrel_ec_eawe == EmcID::getBARREL_EC_MIN() ) eawe = 0; // east
116 else eawe = 1; // west
117 }
118 for ( uint32_t TEtheta = TEthetaMin; TEtheta <= TEthetaMax; TEtheta++ )
119 {
120 if ( barrel_ec_eawe == EmcID::getBARREL() )
121 {
122 // it is BARREL
123 if ( TEtheta <= EmcID::getTHETA_BARREL_MAX() / 2 )
124 {
125 eawe = 0; // east
126 theta = EmcID::getTHETA_BARREL_MAX() / 2 + 1 - TEtheta; // 0-21=>22-1
127 }
128 else
129 {
130 eawe = 1; // west
131 theta = TEtheta - EmcID::getTHETA_BARREL_MAX() / 2; // 22-43=>1-22
132 }
133 TEphiMax = EmcID::getPHI_BARREL_MAX(); // 119
134 TEphiMin = EmcID::getPHI_BARREL_MIN(); // 0
135 }
136 else
137 {
138 // it is ease and west ENDCAP
139 theta = TEtheta + EmcID::getTHETA_BARREL_MAX() / 2 + 2;
140 TEphiMax = EmcID::getPHI_ENDCAP_MAX( TEtheta ); // 64,80,96
141 TEphiMin = EmcID::getPHI_ENDCAP_MIN();
142 }
143
144 for ( uint32_t TEphi = TEphiMin; TEphi <= TEphiMax; TEphi++ )
145 {
146 phi = TEphi + 1;
147 // cout << "eawe" << hex << eawe <<endl;
148 // cout << "__FILE__ theta " << theta << "phi " << phi << endl;
149 uint32_t reid = ( ( eawe << nREEaWePos ) & nREEaWeMask ) |
150 ( ( theta << nREThetaPos ) & nREThetaMask ) |
151 ( ( phi << nREPhiPos ) & nREPhiMask );
152 uint32_t teid = EmcID::getIntID( barrel_ec_eawe, TEtheta, TEphi );
153 // cout << "barrel_ec_eawe" << barrel_ec_eawe <<endl;
154 // cout << "TEtheta" << hex << TEtheta << endl;
155 // cout << "TEphi" << hex << TEphi <<endl;
156
157 if ( reid >= 8192 )
158 {
159 cerr << "Error: REID overflow !" << reid << endl;
160 exit( 8 );
161 }
162 // cout << "reid" << hex << reid << endl;
163 // cout << "teid" << hex << teid << endl;
164 m_re2te[reid] = teid;
165 m_te2reMap.insert( TE2REMAP::value_type( teid, reid ) );
166 }
167 }
168 }
169 // return StatusCode::SUCCESSful initialization
170 return StatusCode::SUCCESS;
171}
172
173uint32_t EmcBuilder::getREID( uint32_t teid ) {
174 TE2REMAP::iterator itr = m_te2reMap.find( teid );
175
176 if ( itr == m_te2reMap.end() )
177 {
178 cout << "wrong teid in emc " << teid << endl;
179 exit( 8 );
180 }
181
182 return itr->second;
183}
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
ObjectVector< EmcDigi > EmcDigiCol
eformat::write::FullEventFragment WriteRawEvent
void append2event(WriteRawEvent *&re, uint32_t source_id, uint32_t size, uint32_t shift=0)
Definition Builder.cxx:69
static bool find(ifstream &f, string msg, string fname)
Definition Builder.cxx:52
static bool expect(ifstream &f, string msg, string fname)
Definition Builder.cxx:25
static bool expectInt(ifstream &f, string msg, string fname, uint32_t &val1, uint32_t &val2)
Definition Builder.cxx:39
Builder()
Definition Builder.cxx:11
StatusCode initialize(string &initFile)
StatusCode pack(EmcDigiCol *digiCol, WriteRawEvent *&re)
virtual ~EmcBuilder()
void unPack(uint32_t reDigi, uint32_t &REId, uint32_t &TETDC, uint32_t &TEADC, uint32_t &measure)
uint32_t getREID(uint32_t teid)
static unsigned int getPHI_BARREL_MAX()
Definition EmcID.cxx:83
static unsigned int getBARREL_EC_MIN()
Definition EmcID.cxx:93
static unsigned int getBARREL_EC_MAX()
Definition EmcID.cxx:92
static unsigned int getTHETA_ENDCAP_MIN()
Definition EmcID.cxx:82
static unsigned int getTHETA_ENDCAP_MAX()
Definition EmcID.cxx:81
static unsigned int getBARREL()
Definition EmcID.cxx:97
static unsigned int getTHETA_BARREL_MIN()
Definition EmcID.cxx:80
static unsigned int getIntID(const unsigned int barrel_ec, const unsigned int theta_module, const unsigned int phi_module)
Definition EmcID.cxx:71
static unsigned int getTHETA_BARREL_MAX()
Definition EmcID.cxx:79
static unsigned int getPHI_ENDCAP_MAX(const unsigned int theta)
Definition EmcID.cxx:85
static unsigned int getPHI_ENDCAP_MIN()
Definition EmcID.cxx:91
static unsigned int getPHI_BARREL_MIN()
Definition EmcID.cxx:84