00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "BesMdcDigitizer.hh"
00012 #include "BesMdcDigitizerMessenger.hh"
00013 #include "BesMdcHit.hh"
00014
00015 #include "G4DigiManager.hh"
00016 #include "Randomize.hh"
00017 #include "G4ios.hh"
00018 #include <string>
00019
00020 #include "TFile.h"
00021 #include "TH1F.h"
00022
00023 #include "G4Svc/IG4Svc.h"
00024 #include "G4Svc/G4Svc.h"
00025 #include "GaudiKernel/ISvcLocator.h"
00026 #include "GaudiKernel/Bootstrap.h"
00027 #include "GaudiKernel/IDataProviderSvc.h"
00028
00029 BesMdcDigitizer::BesMdcDigitizer(G4String modName):G4VDigitizerModule(modName){
00030 noiseFlag=0;
00031 noiseType=3;
00032 noiseLevel=0.1;
00033 maxNoiseT=300.;
00034 smearFlag=1;
00035 mdcDRes = 0.13;
00036 effFlag = 0;
00037 for(G4int i=0; i<43;i++){
00038 layerEff.push_back(1.);
00039 }
00040 collectionName.push_back("BesMdcDigisCollection");
00041 digitizerMessenger = new BesMdcDigitizerMessenger(this);
00042 mdcGeoPointer=BesMdcGeoParameter::GetGeo();
00043 mdcCalPointer=new BesMdcCalTransfer;
00044
00045
00046 IG4Svc* tmpSvc;
00047
00048 StatusCode sc=Gaudi::svcLocator()->service("G4Svc", tmpSvc);
00049 if (!sc.isSuccess())
00050 G4cout <<" MdcDigitizer::Error,could not open G4Svc"<<G4endl;
00051
00052 m_G4Svc=dynamic_cast<G4Svc *>(tmpSvc);
00053
00054 IMdcTunningSvc* IMdcTunningSvc;
00055 sc= Gaudi::svcLocator()->service("MdcTunningSvc",IMdcTunningSvc);
00056 if (!sc.isSuccess()){
00057 G4cout <<" MdcDigitizer::Error,could not open Mdc Tunning Service"<<G4endl;
00058 }else{
00059 G4cout<<" MdcDigitizer:: Open Mdc Tunning Service"<<G4endl;
00060 }
00061 mdcTunningSvc=dynamic_cast<MdcTunningSvc *>(IMdcTunningSvc);
00062
00063 std::string noiseFile=m_G4Svc->GetMdcNoiseFile();
00064 f=new TFile(noiseFile.c_str());
00065 h1=(TH1F*)f->Get("h703");
00066 h2=(TH1F*)f->Get("h501");
00067 h3=(TH1F*)f->Get("h801");
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 }
00089
00090 BesMdcDigitizer::~BesMdcDigitizer(){delete digitizerMessenger;}
00091
00092 void BesMdcDigitizer::SetEff(G4int layer, G4double eff){
00093 if(layer==-1){
00094 for(G4int i=0; i<43;i++){
00095 layerEff[i]=eff;
00096 }
00097 }else{
00098 layerEff[layer]=eff;
00099 }
00100 }
00101
00102 void BesMdcDigitizer::Digitize(){
00103
00104
00105 for(G4int i=0; i<43;i++){
00106 for(G4int j=0;j<288;j++){
00107 digiPointer[i][j]=-1;
00108 }
00109 }
00110
00111 G4int NHits,layerId, cellId, posFlag;
00112 G4double edep,driftD,driftT, globalT, theta,cosTheta,enterAngle;
00113 G4double mean,sigma,mean1,mean2,sigma1, sigma2, f,sig,delSig, fRandom, driftDNew, driftTNew;
00114 G4double tempEff;
00115 G4double resLargest,resSmallest,resRatio;
00116
00117 G4DigiManager* DigiMan = G4DigiManager::GetDMpointer();
00118
00119
00120 G4int THCID=-1;
00121 THCID = DigiMan->GetHitsCollectionID("BesMdcHitsCollection");
00122
00123
00124 BesMdcHitsCollection* THC = 0;
00125 THC = (BesMdcHitsCollection*) (DigiMan->GetHitsCollection(THCID));
00126
00127 if(THC){
00128 digisCollection=new BesMdcDigisCollection
00129 (moduleName, collectionName[0]);
00130 NHits=THC->entries();
00131 for(G4int i=0;i<NHits;i++){
00132 layerId = (*THC)[i]->GetLayerNo();
00133 cellId = (*THC)[i]->GetCellNo();
00134 edep = (*THC)[i]->GetEdep();
00135 driftD = (*THC)[i]->GetDriftD();
00136 globalT = (*THC)[i]->GetGlobalT();
00137 theta = (*THC)[i]->GetTheta();
00138 cosTheta = cos(theta);
00139 enterAngle = (*THC)[i]->GetEnterAngle();
00140 posFlag = (*THC)[i]->GetPosFlag();
00141
00142
00143 mdcCalPointer->SetHitPointer((*THC)[i]);
00144
00145
00146 if(effFlag==0){
00147
00148 tempEff=mdcTunningSvc->GetEff(layerId,cellId,driftD,cosTheta,posFlag);
00149 }else{
00150 tempEff = layerEff[layerId];
00151 }
00152 fRandom=G4UniformRand();
00153 if(fRandom>tempEff)continue;
00154
00155
00156
00157 if(smearFlag==0){
00158 driftDNew = driftD;
00159 }else if(smearFlag==1){
00160
00161
00162 mdcTunningSvc->GetRes3(layerId,cellId,driftD,cosTheta,posFlag,enterAngle,f,mean1,sigma1,mean2,sigma2,resLargest,resSmallest,resRatio);
00163
00164
00165
00166
00167 driftDNew = Smear(driftD-(f*mean1+(1-f)*mean2),f,mean1,sigma1,mean2,sigma2,resLargest,resSmallest,resRatio);
00168
00169
00170 }else if(smearFlag==2){
00171 driftDNew = Smear(driftD);
00172 }else{
00173 G4cerr<<"MdcDigitizer::worong smearFlag: "<<smearFlag<<G4endl;
00174 }
00175
00176
00177 driftTNew = mdcCalPointer->D2T(driftDNew);
00178
00179
00180 driftTNew += mdcCalPointer->GetTimeWalk();
00181
00182
00183 driftTNew += mdcCalPointer->GetT0();
00184
00185
00186 driftTNew += globalT;
00187
00188
00189
00190
00191
00192 if(isnan(driftTNew)){
00193 G4cout<<"MdcDigitizer::error, driftT is nan"<<G4endl;
00194 continue;
00195 }
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 BesMdcDigi* newDigi = new BesMdcDigi();
00215 newDigi->SetTrackID((*THC)[i]->GetTrackID());
00216 newDigi->SetLayerNo(layerId);
00217 newDigi->SetCellNo(cellId);
00218 newDigi->SetEdep(edep);
00219 newDigi->SetDriftT(driftTNew);
00220 G4int NbDigis = digisCollection->insert(newDigi);
00221 digiPointer[layerId][cellId]=NbDigis-1;
00222 }
00223
00224 if(noiseFlag==1)AddNoise();
00225 if(noiseFlag==2){
00226 ifstream readNoiseLevel("$MDCSIMROOT/share/noiselevel.txt");
00227 if(!readNoiseLevel.good()){
00228 std::cout<<" Error , noiselevel file not exist "<<std::endl;
00229 }else{
00230 std::cout<<" MdcDigitizer:: Open noiselevel file "<<std::endl;
00231 }
00232 G4int NLayer=mdcGeoPointer->SignalLayerNo();
00233 G4double level;
00234 for(G4int i=0;i<NLayer;i++){
00235 readNoiseLevel>>level;
00236 mixLevel.push_back(level);
00237 }
00238 AddNoise2();
00239 }
00240
00241 if (verboseLevel>0) {
00242 G4cout << "\n-------->digis Collection: in this event they are "
00243 << digisCollection->entries()
00244 << " digis in the MDC chambers: " << G4endl;
00245 digisCollection->PrintAllDigi();
00246 }
00247 StoreDigiCollection(digisCollection);
00248 }
00249
00250 }
00251
00252 G4double BesMdcDigitizer::Smear(G4double driftD){
00253 G4double r, driftDNew;
00254 r = G4RandGauss::shoot();
00255 driftDNew = driftD + mdcDRes * r;
00256 while(driftDNew<=0){
00257 r = G4RandGauss::shoot();
00258 driftDNew = driftD + mdcDRes * r;
00259 }
00260 return driftDNew;
00261 }
00262
00263 G4double BesMdcDigitizer::Smear(G4double driftD,G4double sigma,G4double mean){
00264 G4double r, driftDNew;
00265 r = G4RandGauss::shoot();
00266 driftDNew = driftD + sigma * r+mean;
00267 while(driftDNew <= 0){
00268 r = G4RandGauss::shoot();
00269 driftDNew = driftD + sigma * r+mean;
00270 }
00271 return driftDNew;
00272 }
00273
00274 G4double BesMdcDigitizer::Smear(G4double driftD,G4double f,G4double mean1,G4double sigma1,G4double mean2,G4double sigma2){
00275 G4double r, driftDNew,mean,sigma;
00276 r = G4UniformRand();
00277 if(r<=f){
00278 mean=mean1;
00279 sigma=sigma1;
00280 }else{
00281 mean=mean2;
00282 sigma=sigma2;
00283 }
00284 int times=0;
00285 r = G4RandGauss::shoot();
00286 driftDNew = driftD + sigma * r+mean;
00287 while(driftDNew <= 0){
00288 r = G4RandGauss::shoot();
00289 driftDNew = driftD + sigma * r+mean;
00290 times++;
00291 if(times>10)driftDNew=0.01;
00292 }
00293 return driftDNew;
00294 }
00295
00296 G4double BesMdcDigitizer::Smear(G4double driftD,G4double f,G4double mean1,G4double sigma1,G4double mean2,G4double sigma2,G4double resLargest,G4double resSmallest,G4double resRatio){
00297 G4double r, driftDNew,mean,sigma;
00298 G4double ratio,tempd;
00299 ratio=G4UniformRand();
00300 int times;
00301 if(ratio<=resRatio)
00302 {
00303
00304 r = G4UniformRand();
00305 if(r<=f){
00306 mean=mean1;
00307 sigma=sigma1;
00308 }else{
00309 mean=mean2;
00310 sigma=sigma2;
00311 }
00312 times=0;
00313 r = G4RandGauss::shoot();
00314 driftDNew = driftD + sigma * r+mean;
00315 }
00316 else
00317 {
00318 tempd=G4UniformRand()*2.0+resLargest;
00319 times=0;
00320 driftDNew = driftD + tempd;
00321 }
00322 while(driftDNew <= 0){
00323 r = G4RandGauss::shoot();
00324 driftDNew = driftD + sigma * r+mean;
00325 times++;
00326 if(times>10)driftDNew=0.01;
00327 }
00328 return driftDNew;
00329 }
00330
00331 void BesMdcDigitizer::AddNoise2(void){
00332 G4int wireNo;
00333 G4double random;
00334 G4double randomT;
00335 G4double randomQ;
00336 G4int NLayer=mdcGeoPointer->SignalLayerNo();
00337 for(G4int i=0;i<NLayer;i++){
00338 wireNo=mdcGeoPointer->SignalLayer(i).WireNo()/2;
00339 for(G4int j=0;j<wireNo;j++){
00340 random=G4UniformRand();
00341 if(random < mixLevel[i]){
00342 randomT=G4UniformRand() * 2000;
00343 if(isnan(randomT)){
00344 G4cout<<"MdcDigitizer: error, randomT is nan"<<G4endl;
00345 continue;
00346 }
00347
00348 randomQ=200.;
00349 if(digiPointer[i][j]!=-1){
00350 G4int pointer=digiPointer[i][j];
00351 G4double preDriftT=(*digisCollection)[pointer]->GetDriftT();
00352 if(preDriftT <= randomT)continue;
00353 (*digisCollection)[pointer]->SetDriftT(randomT);
00354 (*digisCollection)[pointer]->SetTrackID(-1);
00355 }else{
00356 BesMdcDigi* newDigi = new BesMdcDigi();
00357 newDigi->SetTrackID(-1);
00358 newDigi->SetLayerNo(i);
00359 newDigi->SetCellNo(j);
00360 newDigi->SetEdep(randomQ);
00361 newDigi->SetDriftT(randomT);
00362 digisCollection->insert(newDigi);
00363 }
00364 }
00365 }
00366 }
00367 }
00368
00369
00370 void BesMdcDigitizer::AddNoise(void){
00371 G4double r0,r;
00372 vector<G4double> noise;
00373
00374 G4int NLayer=mdcGeoPointer->SignalLayerNo();
00375 if(noiseType==0){
00376 for(G4int i=0;i<NLayer;i++){
00377 noise.push_back(noiseLevel);
00378 }
00379 }else if(noiseType==1){
00380 r0=mdcGeoPointer->SignalLayer(0).R();
00381 for(G4int i=0;i<NLayer;i++){
00382 r=mdcGeoPointer->SignalLayer(i).R();
00383 noise.push_back(noiseLevel * r0 / r);
00384 }
00385 }else if(noiseType==2){
00386 r0=mdcGeoPointer->SignalLayer(0).R();
00387 for(G4int i=0;i<NLayer;i++){
00388 r=mdcGeoPointer->SignalLayer(i).R();
00389 noise.push_back(noiseLevel * r0 * r0 / r / r);
00390 }
00391 }else if(noiseType==3){
00392 Int_t Nbins=(Int_t)h1->GetNbinsX();
00393
00394 double xmax=h1->GetXaxis()->GetXmax();
00395 double xmin=h1->GetXaxis()->GetXmin();
00396 double dx=(xmax-xmin)/Nbins;
00397 G4double y;
00398 for(G4int i=0;i<Nbins;i++){
00399 double x=double(i+1)*dx;
00400 y=(G4double)h1->GetBinContent(x);
00401 y=y*noiseLevel/0.05608559;
00402 noise.push_back(y);
00403 }
00404 }
00405
00406 G4int wireNo;
00407 G4double random;
00408 G4double randomT;
00409 G4double randomQ;
00410 G4double T0=m_G4Svc->GetBeamStartTime();
00411 for(G4int i=0;i<NLayer;i++){
00412 wireNo=mdcGeoPointer->SignalLayer(i).WireNo()/2;
00413 for(G4int j=0;j<wireNo;j++){
00414 random=G4UniformRand();
00415 if(random < noise[i]){
00416
00417 randomT=h2->GetRandom()+T0;
00418
00419
00420
00421 if(isnan(randomT)){
00422 G4cout<<"MdcDigitizer: error, randomT is nan"<<G4endl;
00423 continue;
00424 }
00425
00426 randomQ=0.;
00427 if(digiPointer[i][j]!=-1){
00428 G4int pointer=digiPointer[i][j];
00429 G4double signalEdep=(*digisCollection)[pointer]->GetEdep();
00430 (*digisCollection)[pointer]->SetEdep(randomQ+signalEdep);
00431 G4double preDriftT=(*digisCollection)[pointer]->GetDriftT();
00432 if(preDriftT <= randomT)continue;
00433 (*digisCollection)[pointer]->SetDriftT(randomT);
00434 (*digisCollection)[pointer]->SetTrackID(-1);
00435 }else{
00436 BesMdcDigi* newDigi = new BesMdcDigi();
00437 newDigi->SetTrackID(-1);
00438 newDigi->SetLayerNo(i);
00439 newDigi->SetCellNo(j);
00440 newDigi->SetEdep(randomQ);
00441 newDigi->SetDriftT(randomT);
00442 digisCollection->insert(newDigi);
00443 }
00444 }
00445 }
00446 }
00447 }