30 : G4VDigitizerModule( modName ), m_emcCalibConstSvc( 0 ) {
31 collectionName.push_back(
"BesEmcDigitsCollection" );
32 m_besEmcDigitsCollection = 0;
35 ISvcLocator* svcLocator = Gaudi::svcLocator();
37 StatusCode sc = svcLocator->service(
"G4Svc", iG4Svc );
42 if ( m_G4Svc->EmcRootFlag() )
44 m_tupleEmc1 = m_G4Svc->GetTupleEmc1();
45 sc = m_tupleEmc1->addItem(
"partId", m_partId );
46 sc = m_tupleEmc1->addItem(
"nTheta", m_nTheta );
47 sc = m_tupleEmc1->addItem(
"nPhi", m_nPhi );
48 sc = m_tupleEmc1->addItem(
"edep", m_eDep );
49 sc = m_tupleEmc1->addItem(
"nHits", m_nHits );
50 sc = m_tupleEmc1->addItem(
"adc", m_adc );
51 sc = m_tupleEmc1->addItem(
"tdc", m_tdc );
53 m_tupleEmc2 = m_G4Svc->GetTupleEmc2();
54 sc = m_tupleEmc2->addItem(
"etot", m_eTot );
55 sc = m_tupleEmc2->addItem(
"nDigi", m_nDigi );
59 sc = svcLocator->service(
"EmcCalibConstSvc", m_emcCalibConstSvc );
60 if ( sc != StatusCode::SUCCESS )
61 { G4cout <<
"BesEmcDigitizer Error: Can't get EmcCalibConstSvc." << G4endl; }
71 m_besEmcDigitsCollection =
73 G4DigiManager* DigiMan = G4DigiManager::GetDMpointer();
77 EHCID = DigiMan->GetHitsCollectionID(
"BesEmcHitsCollection" );
86 m_crystalGroup =
new vector<CrystalSingle*>;
88 G4int size = m_crystalGroup->size();
90 G4int partId, nTheta,
nPhi, nHits;
91 G4double eTot = 0, eDigi;
94 G4double coherentNoise = RandGauss::shoot() * m_G4Svc->EmcCoherentNoise();
96 for ( G4int i = 0; i < size; i++ )
98 cryst = ( *m_crystalGroup )[i];
110 const int indexSize = 200;
111 G4double e[indexSize];
112 for ( G4int i = 0; i < indexSize; i++ ) e[i] = 0;
116 for ( G4int j = 0; j < nHits; j++ )
121 if ( index < indexSize && index >= 0 ) e[index] +=
energy;
122 else G4cout <<
"Track index overload!" << G4endl;
125 G4double maxi = e[0];
126 for ( G4int i = 1; i < indexSize; i++ )
141 digi->
SetTime( m_G4Svc->EmcTime() );
145 if ( m_G4Svc->EmcNoiseLevel() > 0 )
146 wave->
addElecNoise( m_G4Svc->EmcIncoherentNoise(), coherentNoise );
149 m_energy = wave->
max(
bin );
151 m_energy -= 0.46 * MeV;
155 if ( m_G4Svc->EmcLightOutput() )
157 G4int index = m_emcCalibConstSvc->getIndex( partId, nTheta,
nPhi );
158 G4double adc2e = m_emcCalibConstSvc->getDigiCalibConst( index );
160 G4double CrystalDeadEcut = m_emcCalibConstSvc->getCrystalDeadEcut( index );
162 if ( m_G4Svc->EmcElecSaturation() == 1 )
164 G4double emaxData = m_emcCalibConstSvc->getCrystalEmaxData( index );
166 if ( emaxData > 0 ) { adc2e = emaxData / 2.5; }
171 else if ( m_G4Svc->EmcElecSatuDead() == 1 && CrystalDeadEcut > 0 &&
172 m_energy / 1000.0 > CrystalDeadEcut )
189 if ( m_G4Svc->EmcRootFlag() )
198 m_tupleEmc1->write();
204 m_besEmcDigitsCollection->insert( digi );
209 if ( m_G4Svc->EmcNoiseLevel() == 2 )
AddNoise5x5( coherentNoise );
210 else if ( m_G4Svc->EmcNoiseLevel() == 3 )
215 if ( m_G4Svc->EmcRootFlag() )
219 m_tupleEmc2->write();
222 StoreDigiCollection( m_besEmcDigitsCollection );
224 for (
size_t i = 0; i < m_crystalGroup->size(); i++ ) {
delete ( *m_crystalGroup )[i]; }
225 m_crystalGroup->clear();
226 delete m_crystalGroup;
231 G4int partId, nTheta,
nPhi, size,
flag;
234 G4int nHits = m_EHC->entries();
237 for ( G4int i = 0; i < nHits; i++ )
244 size = m_crystalGroup->size();
250 for ( G4int j = 0; j < size; j++ )
252 oldCryst = ( *m_crystalGroup )[j];
272 m_crystalGroup->push_back( newCryst );
279 vector<BesEmcDigi*>* vecDC = m_besEmcDigitsCollection->GetVector();
280 G4int nDigi = m_besEmcDigitsCollection->entries();
281 G4int partMax, thetaMax, phiMax;
282 partMax = thetaMax = phiMax = -99;
285 for ( G4int i = 0; i < nDigi; i++ )
300 G4int thetan, thetap, phin, phip;
301 thetan = thetaMax - 2;
302 thetap = thetaMax + 2;
310 else if ( thetaMax == 1 )
312 thetan = thetaMax - 1;
320 thetap = thetaMax + 1;
323 if ( phiMax == 0 ) { phin = emcPara.
GetBSCNbPhi() - 2; }
324 else if ( phiMax == 1 ) { phin = emcPara.
GetBSCNbPhi() - 2; }
334 for ( G4int theta = thetan; theta <= thetap; theta++ )
336 for ( G4int phi = phin; phi <= phip; phi++ )
342 for ( G4int i = 0; i < nDigi; i++ )
362 digi->
SetTime( m_G4Svc->EmcTime() );
366 wave->
addElecNoise( m_G4Svc->EmcIncoherentNoise(), coherentNoise );
370 m_energy = wave->
max(
bin );
372 if ( m_G4Svc->EmcLightOutput() )
381 if ( m_energy < 625. )
383 ecorr = -0.1285 * log( m_energy / 6805. );
385 else { ecorr = -2.418 + 9.513e-4 * m_energy; }
387 if ( m_energy - ecorr > m_G4Svc->EmcNoiseThreshold() )
388 { m_besEmcDigitsCollection->insert( digi ); }
389 else {
delete digi; }
399 vector<BesEmcDigi*>* vecDC = m_besEmcDigitsCollection->GetVector();
400 G4int nDigi = m_besEmcDigitsCollection->entries();
403 for ( G4int part = 0; part < 3; part++ )
416 for ( G4int theta = 0; theta < thetaNb; theta++ )
420 if ( part == 1 ) { phiNb = emcPara.
GetBSCNbPhi(); }
423 for ( G4int phi = 0; phi < phiNb; phi++ )
432 for ( G4int i = 0; i < nDigi; i++ )
453 bool fastSimulation =
true;
454 if ( fastSimulation )
457 m_energy = RandGauss::shoot() * m_G4Svc->EmcNoiseSigma();
458 m_energy += m_G4Svc->EmcNoiseMean();
459 digi->
SetTime( (G4int)( G4UniformRand() * 60 ) );
465 digi->
SetTime( m_G4Svc->EmcTime() );
468 wave->
addElecNoise( m_G4Svc->EmcIncoherentNoise(), coherentNoise );
472 m_energy = wave->
max(
bin );
477 if ( m_G4Svc->EmcLightOutput() )
483 if ( m_energy < 625. )
485 ecorr = -0.1285 * log( m_energy / 6805. );
487 else { ecorr = -2.418 + 9.513e-4 * m_energy; }
489 if ( m_energy - ecorr > m_G4Svc->EmcNoiseThreshold() )
490 { m_besEmcDigitsCollection->insert( digi ); }
491 else {
delete digi; }