11#include "MdcSim/BesMdcDigitizer.hh"
12#include "MdcSim/BesMdcDigitizerMessenger.hh"
13#include "MdcSim/BesMdcHit.hh"
15#include "G4DigiManager.hh"
17#include "Randomize.hh"
24#include "G4Svc/IG4Svc.h"
25#include "GaudiKernel/Bootstrap.h"
26#include "GaudiKernel/IDataProviderSvc.h"
27#include "GaudiKernel/ISvcLocator.h"
37 for ( G4int i = 0; i < 43; i++ ) { layerEff.push_back( 1. ); }
38 collectionName.push_back(
"BesMdcDigisCollection" );
43 StatusCode sc = Gaudi::svcLocator()->service(
"G4Svc", m_G4Svc );
44 if ( !sc.isSuccess() ) G4cout <<
" MdcDigitizer::Error,could not open G4Svc" << G4endl;
46 sc = Gaudi::svcLocator()->service(
"MdcTunningSvc", mdcTunningSvc );
47 if ( !sc.isSuccess() )
48 { G4cout <<
" MdcDigitizer::Error,could not open Mdc Tunning Service" << G4endl; }
49 else { G4cout <<
" MdcDigitizer:: Open Mdc Tunning Service" << G4endl; }
51 std::string noiseFile = m_G4Svc->GetMdcNoiseFile();
52 f =
new TFile( noiseFile.c_str() );
53 h1 = (TH1F*)f->Get(
"h703" );
54 h2 = (TH1F*)f->Get(
"h501" );
55 h3 = (TH1F*)f->Get(
"h801" );
83 for ( G4int i = 0; i < 43; i++ ) { layerEff[i] = eff; }
85 else { layerEff[layer] = eff; }
91 for ( G4int i = 0; i < 43; i++ )
93 for ( G4int j = 0; j < 288; j++ ) { digiPointer[i][j] = -1; }
96 G4int
NHits, layerId, cellId, posFlag;
97 G4double edep, driftD, driftT, globalT, theta, cosTheta, enterAngle;
98 G4double mean, sigma, mean1, mean2, sigma1, sigma2, f, sig, delSig, fRandom, driftDNew,
101 G4double resLargest, resSmallest, resRatio;
103 G4DigiManager* DigiMan = G4DigiManager::GetDMpointer();
107 THCID = DigiMan->GetHitsCollectionID(
"BesMdcHitsCollection" );
116 NHits = THC->entries();
117 for ( G4int i = 0; i <
NHits; i++ )
119 layerId = ( *THC )[i]->GetLayerNo();
120 cellId = ( *THC )[i]->GetCellNo();
121 edep = ( *THC )[i]->GetEdep();
122 driftD = ( *THC )[i]->GetDriftD();
123 globalT = ( *THC )[i]->GetGlobalT();
124 theta = ( *THC )[i]->GetTheta();
125 cosTheta =
cos( theta );
126 enterAngle = ( *THC )[i]->GetEnterAngle();
127 posFlag = ( *THC )[i]->GetPosFlag();
130 mdcCalPointer->SetHitPointer( ( *THC )[i] );
136 tempEff = mdcTunningSvc->GetEff( layerId, cellId, driftD, cosTheta, posFlag );
138 else { tempEff = layerEff[layerId]; }
139 fRandom = G4UniformRand();
140 if ( fRandom > tempEff )
continue;
144 if ( smearFlag == 0 )
148 else if ( smearFlag == 1 )
152 mdcTunningSvc->GetRes3( layerId, cellId, driftD, cosTheta, posFlag, enterAngle, f,
153 mean1, sigma1, mean2, sigma2, resLargest, resSmallest,
161 Smear( driftD - ( f * mean1 + ( 1 - f ) * mean2 ), f, mean1, sigma1, mean2, sigma2,
162 resLargest, resSmallest, resRatio );
164 else if ( smearFlag == 2 )
166 driftDNew = Smear( driftD );
170 G4cerr <<
"MdcDigitizer::wrong smearFlag: " << smearFlag << G4endl;
175 driftTNew = mdcCalPointer->D2T( driftDNew );
178 driftTNew += mdcCalPointer->GetTimeWalk();
181 driftTNew += mdcCalPointer->GetT0();
184 driftTNew += globalT;
190 if ( std::isnan( driftTNew ) )
192 G4cout <<
"MdcDigitizer::error, driftT is nan" << G4endl;
214 newDigi->
SetTrackID( ( *THC )[i]->GetTrackID() );
219 G4int NbDigis = digisCollection->insert( newDigi );
220 digiPointer[layerId][cellId] = NbDigis - 1;
223 if ( noiseFlag == 1 ) AddNoise();
224 if ( noiseFlag == 2 )
226 ifstream readNoiseLevel(
"$MDCSIMROOT/share/noiselevel.txt" );
227 if ( !readNoiseLevel.good() )
228 { std::cout <<
" Error , noiselevel file not exist " << std::endl; }
229 else { std::cout <<
" MdcDigitizer:: Open noiselevel file " << std::endl; }
230 G4int NLayer = mdcGeoPointer->SignalLayerNo();
232 for ( G4int i = 0; i < NLayer; i++ )
234 readNoiseLevel >> level;
235 mixLevel.push_back( level );
240 if ( verboseLevel > 0 )
242 G4cout <<
"\n-------->digis Collection: in this event they are "
243 << digisCollection->entries() <<
" digis in the MDC chambers: " << G4endl;
244 digisCollection->PrintAllDigi();
246 StoreDigiCollection( digisCollection );
250G4double BesMdcDigitizer::Smear( G4double driftD ) {
251 G4double r, driftDNew;
252 r = G4RandGauss::shoot();
253 driftDNew = driftD + mdcDRes * r;
254 while ( driftDNew <= 0 )
256 r = G4RandGauss::shoot();
257 driftDNew = driftD + mdcDRes * r;
262G4double BesMdcDigitizer::Smear( G4double driftD, G4double sigma, G4double mean ) {
263 G4double r, driftDNew;
264 r = G4RandGauss::shoot();
265 driftDNew = driftD + sigma * r + mean;
266 while ( driftDNew <= 0 )
268 r = G4RandGauss::shoot();
269 driftDNew = driftD + sigma * r + mean;
274G4double BesMdcDigitizer::Smear( G4double driftD, G4double
f, G4double mean1, G4double sigma1,
275 G4double mean2, G4double sigma2 ) {
276 G4double r, driftDNew, mean, sigma;
289 r = G4RandGauss::shoot();
290 driftDNew = driftD + sigma * r + mean;
291 while ( driftDNew <= 0 )
293 r = G4RandGauss::shoot();
294 driftDNew = driftD + sigma * r + mean;
296 if ( times > 10 ) driftDNew = 0.01;
301G4double BesMdcDigitizer::Smear( G4double driftD, G4double
f, G4double mean1, G4double sigma1,
302 G4double mean2, G4double sigma2, G4double resLargest,
303 G4double resSmallest, G4double resRatio ) {
304 G4double r, driftDNew, mean = 0, sigma = 0;
305 G4double ratio, tempd;
306 ratio = G4UniformRand();
308 if ( ratio <= resRatio )
323 r = G4RandGauss::shoot();
324 driftDNew = driftD + sigma * r + mean;
328 tempd = G4UniformRand() * 2.0 + resLargest;
330 driftDNew = driftD + tempd;
332 while ( driftDNew <= 0 )
334 r = G4RandGauss::shoot();
335 driftDNew = driftD + sigma * r + mean;
337 if ( times > 10 ) driftDNew = 0.01;
342void BesMdcDigitizer::AddNoise2(
void ) {
347 G4int NLayer = mdcGeoPointer->SignalLayerNo();
348 for ( G4int i = 0; i < NLayer; i++ )
350 wireNo = mdcGeoPointer->SignalLayer( i ).WireNo() / 2;
351 for ( G4int j = 0; j <
wireNo; j++ )
353 random = G4UniformRand();
354 if ( random < mixLevel[i] )
356 randomT = G4UniformRand() * 2000;
357 if ( std::isnan( randomT ) )
359 G4cout <<
"MdcDigitizer: error, randomT is nan" << G4endl;
364 if ( digiPointer[i][j] != -1 )
366 G4int pointer = digiPointer[i][j];
367 G4double preDriftT = ( *digisCollection )[pointer]->GetDriftT();
368 if ( preDriftT <= randomT )
continue;
369 ( *digisCollection )[pointer]->SetDriftT( randomT );
370 ( *digisCollection )[pointer]->SetTrackID( -1 );
374 BesMdcDigi* newDigi =
new BesMdcDigi();
380 digisCollection->insert( newDigi );
387void BesMdcDigitizer::AddNoise(
void ) {
389 vector<G4double> noise;
391 G4int NLayer = mdcGeoPointer->SignalLayerNo();
392 if ( noiseType == 0 )
394 for ( G4int i = 0; i < NLayer; i++ ) { noise.push_back( noiseLevel ); }
396 else if ( noiseType == 1 )
398 r0 = mdcGeoPointer->SignalLayer( 0 ).R();
399 for ( G4int i = 0; i < NLayer; i++ )
401 r = mdcGeoPointer->SignalLayer( i ).R();
402 noise.push_back( noiseLevel * r0 / r );
405 else if ( noiseType == 2 )
407 r0 = mdcGeoPointer->SignalLayer( 0 ).R();
408 for ( G4int i = 0; i < NLayer; i++ )
410 r = mdcGeoPointer->SignalLayer( i ).R();
411 noise.push_back( noiseLevel * r0 * r0 / r / r );
414 else if ( noiseType == 3 )
416 Int_t Nbins = (Int_t)h1->GetNbinsX();
418 double xmax = h1->GetXaxis()->GetXmax();
419 double xmin = h1->GetXaxis()->GetXmin();
420 double dx = ( xmax - xmin ) / Nbins;
422 for ( G4int i = 0; i < Nbins; i++ )
424 double x = double( i + 1 ) * dx;
425 y = (G4double)h1->GetBinContent(
x );
428 noise.push_back( y );
436 G4double T0 = m_G4Svc->GetBeamStartTime();
437 for ( G4int i = 0; i < NLayer; i++ )
439 wireNo = mdcGeoPointer->SignalLayer( i ).WireNo() / 2;
440 for ( G4int j = 0; j <
wireNo; j++ )
442 random = G4UniformRand();
443 if ( random < noise[i] )
446 randomT = h2->GetRandom() + T0;
451 if ( std::isnan( randomT ) )
453 G4cout <<
"MdcDigitizer: error, randomT is nan" << G4endl;
458 if ( digiPointer[i][j] != -1 )
460 G4int pointer = digiPointer[i][j];
461 G4double signalEdep = ( *digisCollection )[pointer]->GetEdep();
462 ( *digisCollection )[pointer]->SetEdep( randomQ + signalEdep );
463 G4double preDriftT = ( *digisCollection )[pointer]->GetDriftT();
464 if ( preDriftT <= randomT )
continue;
465 ( *digisCollection )[pointer]->SetDriftT( randomT );
466 ( *digisCollection )[pointer]->SetTrackID( -1 );
470 BesMdcDigi* newDigi =
new BesMdcDigi();
476 digisCollection->insert( newDigi );
TFile f("ana_bhabha660a_dqa_mcPat_zy_old.root")
double cos(const BesAngle a)
G4TDigiCollection< BesMdcDigi > BesMdcDigisCollection
G4THitsCollection< BesMdcHit > BesMdcHitsCollection
void NHits(const AList< TMLink > &links, unsigned nHits[50])
returns # of hits per layer.
void SetEdep(G4double de)
void SetCellNo(G4int cell)
void SetDriftT(G4double time)
void SetTrackID(G4int track)
void SetLayerNo(G4int layer)
BesMdcDigitizer(G4String modName)
void SetEff(G4int layer, G4double eff)
static BesMdcGeoParameter * GetGeo(void)