//----------------------------------------------------------- // File and Version Information: // $Id$ // // Description: // Implementation of class TpcLaserTask // see TpcLaserTask.h for details // // Environment: // Software developed for the PANDA Detector at FAIR. // // Author List: // Felix Boehmer TUM (original author) // // //----------------------------------------------------------- // This Class' Header --------------------------------------- #include "TpcNoiseTask.h" // Collaborating Class Headers -------- #include "FairRootManager.h" #include "FairRunAna.h" #include "FairRuntimeDb.h" #include "TClonesArray.h" #include "TpcPrimaryCluster.h" #include "TVector3.h" #include "TMath.h" #include "TError.h" #include "TpcDigiPar.h" #include "TpcGas.h" #include "TpcPadPlane.h" #include #include #include "TRandom3.h" TpcNoiseTask::TpcNoiseTask() : FairTask("TPC Noise Generator") { } TpcNoiseTask::~TpcNoiseTask() { ; } InitStatus TpcNoiseTask::Init() { //Get ROOT Manager FairRootManager* ioman= FairRootManager::Instance(); if(ioman==0) { Error("TpcNoiseTask::Init","RootManager not instantiated!"); return kERROR; } // Get input collection fprimArray=(TClonesArray*) ioman->GetObject("TpcPrimaryCluster"); if(fprimArray==0) { Error("TpcNoiseTask::Init","PrimaryElectron-array not found!"); return kERROR; } //clear input array of any real "physical" hits fprimArray->Delete(); fGas=fpar->getGas(); //calculate number of voxels: unsigned int nPads = fpar->getPadPlane()->GetNPads(); double rate = fpar->getRate() * 1.0E6; double dz = fpar->getZMax() - fpar->getZGem(); //cm double vDrift = fGas->VDrift()*1.0E-9; //cm/s double tDrift = dz/vDrift; unsigned int nSamples = tDrift * rate; fVox = nSamples * nPads; std::cout<<"***** TpcNoiseTask: Normalizing to " <GetRuntimeDb(); if ( ! db ) Fatal("SetParContainers", "No runtime database"); // Get Tpc digitisation parameter container fpar = (TpcDigiPar*) db->getContainer("TpcDigiPar"); if (! fpar ) Fatal("SetParContainers", "TpcDigiPar not found"); } void TpcNoiseTask::Exec(Option_t* opt) { //Int_t nPrim = fprimArray->GetEntriesFast(); int nNoise=(int)floor(fOcc*fVox); std::cout<<"nNoise: " < convert deposited Energy from keV to eV double b=1000.*fmeanEnergy; unsigned int totalNoise(0); while(nNoise>0){ // position: double z=randm.Uniform(fpar->getZGem(),fpar->getZMax()); double r=randm.Uniform(fpar->getRMin(),fpar->getRMax()); double phi=randm.Uniform(0,2*TMath::Pi()); pos.SetZ(z);pos.SetPerp(r);pos.SetPhi(phi); // charge W is given in eV -> has been convert to keV above unsigned int q=(unsigned int)ceil(randm.Exp(b)/fGas->W()); totalNoise+=q; unsigned int nPrim = fprimArray->GetEntriesFast(); new((*fprimArray)[nPrim]) TpcPrimaryCluster(0,q,pos,9999,1,-1); nNoise--; if(nNoise%1000 == 0) { std::cout<<". "; std::cout.flush(); } } std::cout<<" created "<< totalNoise <<" noise electrons"<