/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/Simulation/BOOST/MdcSim/MdcSim-00-00-73/src/BesMdcDigitizer.cc

Go to the documentation of this file.
00001 //---------------------------------------------------------------------------//
00002 //      BOOST --- BESIII Object_Oriented Simulation Tool                     //
00003 //---------------------------------------------------------------------------//
00004 //Description:
00005 //Author: Yuan Ye(yuany@mail.ihep.ac.cn)
00006 //Created: Oct. 26, 2004
00007 //Modified:
00008 //Comment:
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;//10%
00033         maxNoiseT=300.;//ns
00034         smearFlag=1;
00035         mdcDRes = 0.13; //mm
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         //  ISvcLocator* svcLocator = Gaudi::svcLocator();
00046         IG4Svc* tmpSvc;
00047         //G4Svc* m_G4Svc;
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         //get Mdc Ntuple from G4Svc
00070         if(m_G4Svc->MdcRootFlag())
00071         {
00072         m_tupleMdc = m_G4Svc->GetTupleMdc();
00073         sc = m_tupleMdc->addItem("NHits",m_NHits);
00074         sc = m_tupleMdc->addItem("LayerId",m_layerId);
00075         sc = m_tupleMdc->addItem("cellId",m_cellId);
00076         sc = m_tupleMdc->addItem("Edep",m_edep);
00077         sc = m_tupleMdc->addItem("driftD",m_driftD);
00078         // sc = m_tupleMdc->addItem("driftT",m_driftT);
00079         sc = m_tupleMdc->addItem("globalT",m_globalT);
00080         sc = m_tupleMdc->addItem("theta",m_theta);
00081         sc = m_tupleMdc->addItem("enterAngle",m_enterAngle);
00082         sc = m_tupleMdc->addItem("driftDNew",m_driftDNew);  
00083         sc = m_tupleMdc->addItem("driftTNew",m_driftTNew);  
00084         // sc = m_tupleMdc->addItem("adc",m_adc);
00085         // sc = m_tupleMdc->addItem("tdc",m_tdc);
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         //initialize 
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;//added by liukai
00116 
00117         G4DigiManager* DigiMan = G4DigiManager::GetDMpointer();
00118 
00119         //hits collection ID
00120         G4int THCID=-1;
00121         THCID = DigiMan->GetHitsCollectionID("BesMdcHitsCollection");
00122 
00123         //hits collection
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                         //Transfer hit pointer to BesMdcCalTransfer
00143                         mdcCalPointer->SetHitPointer((*THC)[i]);
00144 
00145                         //Filter with wire efficiency
00146                         if(effFlag==0){
00147                                 //tempEff = mdcCalPointer->GetEff();
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                         //cout<<"layerid "<<layerId<<" cellid "<<cellId<<" theta "<<cosTheta<<" enterangle "<<enterAngle<<endl;
00156                         //Drift distance smear
00157                         if(smearFlag==0){ //No smear
00158                                 driftDNew = driftD;
00159                         }else if(smearFlag==1){           //Smear from TuningSvc
00160                                 //      mdcTunningSvc->GetRes(layerId,cellId,driftD,cosTheta,posFlag,enterAngle,mean,sigma);
00161                                 //mdcTunningSvc->GetRes2(layerId,cellId,driftD,cosTheta,posFlag,enterAngle,f,mean1,sigma1,mean2,sigma2);
00162                                 mdcTunningSvc->GetRes3(layerId,cellId,driftD,cosTheta,posFlag,enterAngle,f,mean1,sigma1,mean2,sigma2,resLargest,resSmallest,resRatio);
00163 
00164                                 //driftDNew = Smear(driftD,f,mean1,sigma1,mean2,sigma2);
00165                                 //driftDNew = Smear(driftD-(f*mean1+(1-f)*mean2),f,mean1,sigma1,mean2,sigma2);//new method
00166 
00167                                 driftDNew = Smear(driftD-(f*mean1+(1-f)*mean2),f,mean1,sigma1,mean2,sigma2,resLargest,resSmallest,resRatio);//----added by liukai 2012-6-4
00168 
00169 
00170                         }else if(smearFlag==2){ //Smear with fixed resolution
00171                                 driftDNew = Smear(driftD);
00172                         }else{
00173                                 G4cerr<<"MdcDigitizer::worong smearFlag: "<<smearFlag<<G4endl;
00174                         }
00175 
00176                         //Do X-T conversion
00177                         driftTNew = mdcCalPointer->D2T(driftDNew);
00178 
00179                         //Do Q-T correct
00180                         driftTNew += mdcCalPointer->GetTimeWalk();
00181 
00182                         //Add T0
00183                         driftTNew += mdcCalPointer->GetT0();
00184 
00185                         //Add TOF
00186                         driftTNew += globalT;
00187 
00188                         //Signal transfer time on wire
00189                         // transferT=Transfer(layerId,cellId,hitPosition);
00190                         //driftTNew+=transferT;
00191 
00192                         if(isnan(driftTNew)){
00193                                 G4cout<<"MdcDigitizer::error, driftT is nan"<<G4endl;
00194                                 continue;
00195                         }
00196 
00197                         /*
00198                            if(m_G4Svc->MdcRootFlag())
00199                            {
00200                            m_NHits= NHits;
00201                            m_layerId= layerId;
00202                            m_cellId= cellId;
00203                            m_edep= edep;
00204                            m_driftD= driftD;
00205                         //     m_driftT= driftT;
00206                         m_globalT = globalT;
00207                         m_enterAngle = enterAngle;
00208                         m_driftDNew = driftDNew;
00209                         m_driftTNew = driftTNew;
00210                         m_theta = theta;
00211                         m_tupleMdc ->write(); 
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                 //for hitOnTrk distribution
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//for hitNotOnTrk
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; //Noise level of each layer
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){ // liugc add 22:11 4/14/06
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;// Normalize use noise level of 1st layer in "run23096noise.root" 
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                                 //randomT=G4UniformRand() * maxNoiseT;
00417                                 randomT=h2->GetRandom()+T0;
00418                                 //        randomT=randomT;
00419                                 //        randomQ=h3->GetRandom();
00420                                 //        randomQ=randomQ*0.001*0.001; //Transfer from TDC channels to Mev, coef. is temporary one.
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 }

Generated on Tue Nov 29 23:14:27 2016 for BOSS_7.0.2 by  doxygen 1.4.7