BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
BesRawDataWriter Class Reference

#include <BesRawDataWriter.hh>

Public Member Functions

 BesRawDataWriter ()
 ~BesRawDataWriter ()
void SaveDigits ()
void SaveMdcDigits ()
void SaveTofDigits ()
void SaveEmcDigits ()
void SaveMucDigits ()

Detailed Description

Definition at line 26 of file BesRawDataWriter.hh.

Constructor & Destructor Documentation

◆ BesRawDataWriter()

BesRawDataWriter::BesRawDataWriter ( )

Definition at line 40 of file BesRawDataWriter.cc.

40 {
41 m_DigiMan = G4DigiManager::GetDMpointer();
42 // yuany 2005-2-28
43 mdcGeoPointer = BesMdcGeoParameter::GetGeo();
44
45 StatusCode sc = Gaudi::svcLocator()->service( "G4Svc", m_G4Svc );
46 if ( !sc.isSuccess() )
47 {
48 std::cout << "Could not access G4Svc!" << std::endl;
49 exit( 1 );
50 }
51
52 sc = Gaudi::svcLocator()->service( "RealizationSvc", m_RealizationSvc );
53 if ( !sc.isSuccess() )
54 {
55 std::cout << "Could not access RealizationSvc!" << std::endl;
56 exit( 1 );
57 }
58}
static BesMdcGeoParameter * GetGeo(void)

◆ ~BesRawDataWriter()

BesRawDataWriter::~BesRawDataWriter ( )

Definition at line 60 of file BesRawDataWriter.cc.

60{}

Member Function Documentation

◆ SaveDigits()

void BesRawDataWriter::SaveDigits ( )

Definition at line 62 of file BesRawDataWriter.cc.

62 {
63 // interface to event data service
64 ISvcLocator* svcLocator = Gaudi::svcLocator();
65 StatusCode sc = svcLocator->service( "EventDataSvc", m_evtSvc );
66 if ( sc.isFailure() ) G4cout << "Could not accesss EventDataSvc!" << G4endl;
67
68 DigiEvent* aDigiEvent = new DigiEvent;
69 sc = m_evtSvc->registerObject( "/Event/Digi", aDigiEvent );
70 if ( sc != StatusCode::SUCCESS ) { G4cout << "Could not register DigiEvent" << G4endl; }
71
76}

◆ SaveEmcDigits()

void BesRawDataWriter::SaveEmcDigits ( )

Definition at line 300 of file BesRawDataWriter.cc.

300 {
301 // Emc digits collection defined in BOSS
302 EmcDigiCol* aEmcDigiCol = new EmcDigiCol;
303
304 G4int emcDigiCollID = -1;
305 emcDigiCollID = m_DigiMan->GetDigiCollectionID( "BesEmcDigitsCollection" );
306 if ( emcDigiCollID >= 0 )
307 {
309 (BesEmcDigitsCollection*)m_DigiMan->GetDigiCollection( emcDigiCollID );
310 G4int nDigi = emcDC->entries();
311 if ( nDigi > 0 )
312 {
313 // arrange digis in digitsCollection in order of trackIndex
314 BesEmcDigi* digi;
315 vector<BesEmcDigi*>* vecDC = emcDC->GetVector();
316 for ( int i = 0; i < nDigi - 1; i++ )
317 for ( int j = i + 1; j < nDigi; j++ )
318 if ( ( *vecDC )[i]->GetTrackIndex() > ( *vecDC )[j]->GetTrackIndex() )
319 {
320 digi = ( *vecDC )[i];
321 ( *vecDC )[i] = ( *vecDC )[j];
322 ( *vecDC )[j] = digi;
323 }
324 // push back EmcDigi to EmcDigiCol in BOSS
325 for ( int i = 0; i < nDigi; i++ )
326 {
327 digi = ( *emcDC )[i];
328
329 int charge = RawDataUtil::EmcChargeChannel( digi->GetEnergy() );
330 int measure = RawDataUtil::EmcChargeMeasure( digi->GetEnergy() );
332 Identifier ident =
333 EmcID::crystal_id( digi->GetPartId(), digi->GetThetaNb(), digi->GetPhiNb() );
334 EmcDigi* emcDigi = new EmcDigi( ident, time, charge );
335 emcDigi->setTrackIndex( digi->GetTrackIndex() );
336 emcDigi->setMeasure( measure );
337 aEmcDigiCol->push_back( emcDigi );
338 }
339 }
340 }
341
342 // register EMC digits collection to TDS
343 StatusCode scEmc = m_evtSvc->registerObject( "/Event/Digi/EmcDigiCol", aEmcDigiCol );
344 if ( scEmc != StatusCode::SUCCESS )
345 G4cout << "Could not register EMC digi collection" << G4endl;
346
347 // retrieve EMC digits from TDS
348 /*SmartDataPtr<EmcDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/EmcDigiCol");
349 if(!aDigiCol)
350 G4cout<<"Could not retrieve EMC digi collection"<<G4endl;
351
352 EmcDigiCol::iterator iDigiCol;
353 for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++)
354 {
355 const Identifier ident = (*iDigiCol)->identify();
356 G4cout<<"barrel_ec: "<<EmcID::barrel_ec(ident);
357 G4cout<<" theta: "<<EmcID::theta_module(ident);
358 G4cout<<" phi: "<<EmcID::phi_module(ident);
359 G4cout<<" charge: "<<(*iDigiCol)->getChargeChannel();
360 G4cout<<" time: "<<(*iDigiCol)->getTimeChannel()<<G4endl;
361 }
362 G4cout<<"end of retrieve EMC digits"<<G4endl;
363 */
364}
Double_t time
ObjectVector< EmcDigi > EmcDigiCol
G4TDigiCollection< BesEmcDigi > BesEmcDigitsCollection
void setMeasure(const unsigned int measure)
static Identifier crystal_id(const unsigned int barrel_ec, const unsigned int theta_module, const unsigned int phi_module)
For a single crystal.
Definition EmcID.cxx:63
static int EmcChargeChannel(double charge)
static int EmcChargeMeasure(double charge)
void setTrackIndex(const int trackIndex)
Definition RawData.cxx:29

Referenced by SaveDigits().

◆ SaveMdcDigits()

void BesRawDataWriter::SaveMdcDigits ( )

Definition at line 78 of file BesRawDataWriter.cc.

78 {
79 // mdc digis collection defined in BOSS
80 MdcDigiCol* aMdcDigiCol = new MdcDigiCol;
81
82 G4int mdcDigiCollID = -1;
83 mdcDigiCollID = m_DigiMan->GetDigiCollectionID( "BesMdcDigisCollection" );
84 if ( mdcDigiCollID >= 0 )
85 {
87 (BesMdcDigisCollection*)m_DigiMan->GetDigiCollection( mdcDigiCollID );
88 G4int nDigi = mdcDC->entries();
89 if ( nDigi > 0 )
90 {
91 // push back mdc digits to MdcDigiCol in BOSS
92 BesMdcDigi* mdcDigi;
93 for ( int i = 0; i < nDigi; i++ )
94 {
95 mdcDigi = ( *mdcDC )[i];
96 unsigned int charge;
97 if ( m_G4Svc->GetMdcDedxFlag() == 1 ) { charge = int( mdcDigi->GetEdep() ); }
98 else { charge = RawDataUtil::MdcChargeChannel( mdcDigi->GetEdep() ); }
99 unsigned int time = RawDataUtil::MdcTimeChannel( mdcDigi->GetDriftT() );
100 const Identifier ident = MdcID::wire_id( mdcDigi->GetLayerNo(), mdcDigi->GetCellNo() );
101
102 MdcDigi* aMdcDigi = new MdcDigi( ident, time, charge );
103 aMdcDigi->setTrackIndex( mdcDigi->GetTrackID() );
104 aMdcDigiCol->push_back( aMdcDigi );
105 }
106 }
107 }
108
109 // register MDC digits collection to TDS
110 StatusCode scMdc = m_evtSvc->registerObject( "/Event/Digi/MdcDigiCol", aMdcDigiCol );
111 if ( scMdc != StatusCode::SUCCESS )
112 G4cout << "Could not register MDC digi collection" << G4endl;
113
114 // retrieve MDC digits from TDS
115 /*SmartDataPtr<MdcDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/MdcDigiCol");
116 if(!aDigiCol)
117 G4cout<<"Could not retrieve MDC digi collection"<<G4endl;
118
119 MdcDigiCol::iterator iDigiCol;
120 for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++)
121 {
122 const Identifier ident = (*iDigiCol)->identify();
123 G4cout<<"layer: "<<MdcID::layer(ident);
124 G4cout<<" cell: "<<MdcID::wire(ident);
125 G4cout<<" charge: "<<(*iDigiCol)->getChargeChannel();
126 G4cout<<" time: "<<(*iDigiCol)->getTimeChannel()<<G4endl;
127 }
128 G4cout<<"end of retrieve MDC digi collection"<<G4endl;
129 */
130}
G4TDigiCollection< BesMdcDigi > BesMdcDigisCollection
static Identifier wire_id(int wireType, int layer, int wire)
For a single wire.
Definition MdcID.cxx:69
static int MdcChargeChannel(double charge)

Referenced by SaveDigits().

◆ SaveMucDigits()

void BesRawDataWriter::SaveMucDigits ( )

Definition at line 366 of file BesRawDataWriter.cc.

366 {
367 // Muc digits collection defined in BOSS
368 MucDigiCol* aMucDigiCol = new MucDigiCol;
369
370 G4int mucDigiCollID = -1;
371 mucDigiCollID = m_DigiMan->GetDigiCollectionID( "BesMucDigisCollection" );
372 if ( mucDigiCollID >= 0 )
373 {
374 BesMucDigisCollection* mucDC =
375 (BesMucDigisCollection*)m_DigiMan->GetDigiCollection( mucDigiCollID );
376 G4int nDigi = mucDC->entries();
377
378 if ( nDigi > 0 )
379 {
380 BesMucDigi* digi;
381 for ( int i = 0; i < nDigi; i++ )
382 {
383 digi = ( *mucDC )[i];
384 Identifier ident = MucID::channel_id( digi->GetPartId(), digi->GetSegId(),
385 digi->GetGapId(), digi->GetStripId() );
386 MucDigi* mucDigi = new MucDigi( ident );
387 mucDigi->setTrackIndex( digi->GetTrackIndex() );
388 aMucDigiCol->push_back( mucDigi );
389 }
390 }
391 }
392
393 // register MUC digits collection to TDS
394 StatusCode scMuc = m_evtSvc->registerObject( "/Event/Digi/MucDigiCol", aMucDigiCol );
395 if ( scMuc != StatusCode::SUCCESS )
396 G4cout << "Could not register MUC digi collection" << G4endl;
397
398 // retrieve MUC digits from TDS
399 /*SmartDataPtr<MucDigiCol> aDigiCol(m_evtSvc,"/Event/Digi/MucDigiCol");
400 if(!aDigiCol)
401 G4cout<<"Could not retrieve MUC digi collection"<<G4endl;
402
403 MucDigiCol::iterator iDigiCol;
404 for(iDigiCol=aDigiCol->begin(); iDigiCol!=aDigiCol->end(); iDigiCol++)
405 {
406 const Identifier ident = (*iDigiCol)->identify();
407 G4cout<<"Part: "<<MucID::part(ident);
408 G4cout<<" Seg: "<<MucID::seg(ident);
409 G4cout<<" Gap: "<<MucID::gap(ident);
410 G4cout<<" Strip: "<<MucID::strip(ident)<<G4endl;
411 }
412 G4cout<<"end of retrieve MUC digits"<<G4endl;
413 */
414}
G4TDigiCollection< BesMucDigi > BesMucDigisCollection
static Identifier channel_id(int barrel_ec, int segment, int layer, int channel)
For a single crystal.
Definition MucID.cxx:114

Referenced by SaveDigits().

◆ SaveTofDigits()

void BesRawDataWriter::SaveTofDigits ( )

Definition at line 132 of file BesRawDataWriter.cc.

132 {
133
134 // Tof digits collection defined in BOSS
135 TofDigiCol* aTofDigiCol = new TofDigiCol;
136
137 G4int tofDigiCollID = -1;
138 tofDigiCollID = m_DigiMan->GetDigiCollectionID( "BesTofDigitsCollection" );
139
140 if ( tofDigiCollID >= 0 )
141 {
143 (BesTofDigitsCollection*)m_DigiMan->GetDigiCollection( tofDigiCollID );
144 G4int nDigi = tofDC->entries();
145 if ( nDigi > 0 )
146 {
147 // arrange digis in digitsCollection in order of trackIndex
148 BesTofDigi* digi;
149 vector<BesTofDigi*>* vecDC = tofDC->GetVector();
150 for ( int i = 0; i < nDigi - 1; i++ )
151 {
152 for ( int j = i + 1; j < nDigi; j++ )
153 {
154 if ( ( *vecDC )[i]->GetTrackIndex() > ( *vecDC )[j]->GetTrackIndex() )
155 {
156 digi = ( *vecDC )[i];
157 ( *vecDC )[i] = ( *vecDC )[j];
158 ( *vecDC )[j] = digi;
159 }
160 }
161 }
162
163 // push back tof digits to TofDigiCol in BOSS
164 for ( int i = 0; i < nDigi; i++ )
165 {
166 digi = ( *tofDC )[i];
167
168 // for Scintillator, scinNum is the number of scintillator
169 // for MRPC, scinNum is the number of module
170 G4int scinNum = digi->GetScinNb();
171 // for Scintillator, barrel_ec is 0 for east endcap, 1 for barrel, and 2 for west
172 // endcap for MRPC, barrel_ec is 100 + module number for east, 200 + module number for
173 // west
174 G4int barrel_ec = digi->GetPartId();
175
176 if ( TofID::is_scin( barrel_ec ) )
177 { // for Scintillator
178 unsigned int layer = 0;
179 if ( TofID::is_barrel( barrel_ec ) && scinNum > TofID::getPHI_BARREL_MAX() )
180 {
181 layer = 1;
182 scinNum = scinNum - TofID::getPHI_BARREL_MAX() - 1;
183 }
184
185 // Store tofDigi for end==0
186 Identifier ident = TofID::cell_id( barrel_ec, layer, scinNum, 0 );
187 unsigned int time;
188 if ( digi->GetForwTDC() > 0 )
190 else { time = 0; }
191
192 unsigned int charge;
193 if ( digi->GetForwADC() > 0 )
194 {
195 // ADC linear conversion
196 charge = digi->GetForwADC(); // convert ADC(pC) of bTof into Q channel in Data
197 // Treat ADC overflow
198 if ( charge >= 8192 )
199 {
200 // The overlow flag is the 20th bit of the ADC_channel.
201 charge = ( charge | 0x080000 ); // if ADC_channel>=8192, set overflow flag = 1.
202 }
203 charge =
204 ( ( time & 0x07e000 ) | charge ); // Store tclock into ADC_channel as qclock
205 }
206 else { charge = 0; }
207
208 TofDigi* tofDigi = new TofDigi( ident, time, charge );
209 if ( charge & 0x80000 )
210 { // Treat overflow flag(20th bit)
211 tofDigi->setOverflow( 0x2 );
212 }
213 tofDigi->setTrackIndex( digi->GetTrackIndex() );
214 aTofDigiCol->push_back( tofDigi );
215
216 // Store tofDigi for end==1
217 ident = TofID::cell_id( barrel_ec, layer, scinNum, 1 );
218 if ( digi->GetBackTDC() > 0 )
220 else { time = 0; }
221
222 if ( digi->GetBackADC() > 0 )
223 {
224 // ADC linear conversion
225 charge = digi->GetBackADC();
226 // Treat ADC overflow
227 if ( charge >= 8192 )
228 {
229 // The overlow flag is the 20th bit of the ADC_channel.
230 charge = ( charge | 0x080000 ); // if ADC_channel>=8192, set overflow flag = 1.
231 }
232 charge =
233 ( ( time & 0x07e000 ) | charge ); // Store tclock into ADC_channel as qclock
234 }
235 else { charge = 0; }
236
237 tofDigi = new TofDigi( ident, time, charge );
238 if ( charge & 0x80000 )
239 { // Treat overflow flag(20th bit)
240 tofDigi->setOverflow( 0x2 );
241 }
242 tofDigi->setTrackIndex( digi->GetTrackIndex() );
243 aTofDigiCol->push_back( tofDigi );
244 } // end if is_scin
245 else
246 { // for ETF(MRPC)
247 if ( barrel_ec == 3 || barrel_ec == 4 )
248 {
249 unsigned int endcap = 0;
250 unsigned int module = digi->GetModule();
251 unsigned int strip = digi->GetStrip();
252 if ( barrel_ec == 4 )
253 { // west end cap
254 endcap = 1;
255 }
256
257 // Store tofDigi for end==0
258 Identifier ident = TofID::cell_id( 3, endcap, module, strip, 0 );
259 unsigned int tleading;
260 if ( digi->GetForwT1() > 0 )
261 { tleading = RawDataUtil::TofTimeChannel( digi->GetForwT1() ); }
262 else { tleading = 0; }
263 unsigned int ttrailing;
264 if ( digi->GetForwT2() > 0 )
265 { ttrailing = RawDataUtil::TofTimeChannel( digi->GetForwT2() ); }
266 else { ttrailing = 0; }
267 TofDigi* tofDigi = new TofDigi( ident, tleading, ttrailing );
268 tofDigi->setTrackIndex( digi->GetTrackIndex() );
269 aTofDigiCol->push_back( tofDigi );
270 /*
271 G4cout << " --------- BesRawDataWriter: TOF ------------------ " << G4endl;
272 G4cout << " endcap=" << endcap << " module=" << module << " strip=" << strip <<
273 G4endl; G4cout << " tleading=" << tleading << " ttrailing=" << ttrailing << G4endl;
274 G4cout << " --------- BesRawDataWriter: TOF ------------------ " << G4endl;
275 */
276 // Store tofDigi for end==1
277 ident = TofID::cell_id( 3, endcap, module, strip, 1 );
278 if ( digi->GetBackT1() > 0 )
279 { tleading = RawDataUtil::TofTimeChannel( digi->GetBackT1() ); }
280 else { tleading = 0; }
281 if ( digi->GetBackT2() > 0 )
282 { ttrailing = RawDataUtil::TofTimeChannel( digi->GetBackT2() ); }
283 else { ttrailing = 0; }
284 tofDigi = new TofDigi( ident, tleading, ttrailing );
285 tofDigi->setTrackIndex( digi->GetTrackIndex() );
286 aTofDigiCol->push_back( tofDigi );
287 }
288 } // end if is_MRPC
289 }
290 }
291 }
292
293 // register TOF digits collection to TDS
294 StatusCode scTof = m_evtSvc->registerObject( "/Event/Digi/TofDigiCol", aTofDigiCol );
295 if ( scTof != StatusCode::SUCCESS )
296 { G4cout << "Could not register TOF digi collection" << G4endl; }
297 return;
298}
G4TDigiCollection< BesTofDigi > BesTofDigitsCollection
static unsigned int TofTimeChannel(double time)
static Identifier cell_id(int barrel_ec, int layer, int phi_module, int end)
For a single crystal.
Definition TofID.cxx:126
static bool is_scin(const Identifier &id)
Definition TofID.cxx:88
static value_type getPHI_BARREL_MAX()
Definition TofID.cxx:167
static bool is_barrel(const Identifier &id)
Test for barrel.
Definition TofID.cxx:40

Referenced by SaveDigits().


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