#include #include #include #include #include #include #include "AliRun.h" #include "AliITS.h" #include "AliITShit.h" #include "AliITSdigit.h" #include "AliITSmodule.h" #include "AliITSMapA2.h" #include "AliITSsimulationSPDdubna.h" #include "AliITSsegmentation.h" #include "AliITSresponse.h" ClassImp(AliITSsimulationSPDdubna) //////////////////////////////////////////////////////////////////////// // Version: 0 // Written by Boris Batyunya // December 20 1999 // // AliITSsimulationSPDdubna is the simulation of SPDs //________________________________________________________________________ AliITSsimulationSPDdubna::AliITSsimulationSPDdubna() { // constructor fResponse = 0; fSegmentation = 0; fMapA2=0; fHis = 0; fNoise=0.; fBaseline=0.; fNPixelsZ=0; fNPixelsX=0; } //_____________________________________________________________________________ AliITSsimulationSPDdubna::AliITSsimulationSPDdubna(AliITSsegmentation *seg, AliITSresponse *resp) { // standard constructor fHis = 0; fResponse = resp; fSegmentation = seg; fResponse->GetNoiseParam(fNoise,fBaseline); fMapA2 = new AliITSMapA2(fSegmentation); // fNPixelsZ=fSegmentation->Npz(); fNPixelsX=fSegmentation->Npx(); } //_____________________________________________________________________________ AliITSsimulationSPDdubna::~AliITSsimulationSPDdubna() { // destructor delete fMapA2; if (fHis) { fHis->Delete(); delete fHis; } } //__________________________________________________________________________ AliITSsimulationSPDdubna::AliITSsimulationSPDdubna(const AliITSsimulationSPDdubna &source){ // Copy Constructor if(&source == this) return; this->fMapA2 = source.fMapA2; this->fNoise = source.fNoise; this->fBaseline = source.fBaseline; this->fNPixelsX = source.fNPixelsX; this->fNPixelsZ = source.fNPixelsZ; this->fHis = source.fHis; return; } //_________________________________________________________________________ AliITSsimulationSPDdubna& AliITSsimulationSPDdubna::operator=(const AliITSsimulationSPDdubna &source) { // Assignment operator if(&source == this) return *this; this->fMapA2 = source.fMapA2; this->fNoise = source.fNoise; this->fBaseline = source.fBaseline; this->fNPixelsX = source.fNPixelsX; this->fNPixelsZ = source.fNPixelsZ; this->fHis = source.fHis; return *this; } //_____________________________________________________________________________ void AliITSsimulationSPDdubna::DigitiseModule(AliITSmodule *mod, Int_t module, Int_t dummy) { // digitize module const Float_t kEnToEl = 2.778e+8; // GeV->charge in electrons // for 3.6 eV/pair const Float_t kconv = 10000.; // cm -> microns Float_t spdLength = fSegmentation->Dz(); Float_t spdWidth = fSegmentation->Dx(); Float_t spdThickness = fSegmentation->Dy(); Float_t difCoef, dum; fResponse->DiffCoeff(difCoef,dum); if(spdThickness > 290) difCoef = 0.00613; Float_t zPix0 = 1e+6; Float_t xPix0 = 1e+6; Float_t yPrev = 1e+6; Float_t zPitch = fSegmentation->Dpz(0); Float_t xPitch = fSegmentation->Dpx(0); TObjArray *fHits = mod->GetHits(); Int_t nhits = fHits->GetEntriesFast(); if (!nhits) return; cout<<"len,wid,thickness,nx,nz,pitchx,pitchz,difcoef ="<At(hit); //Int_t layer = iHit->GetLayer(); Float_t yPix0 = -spdThickness/2; // work with the idtrack=entry number in the TreeH //Int_t idhit,idtrack; //! //mod->GetHitTrackAndHitIndex(hit,idtrack,idhit); //! //Int_t idtrack=mod->GetHitTrackIndex(hit); // or store straight away the particle position in the array // of particles : if(iHit->StatusEntering()) idhit=hit; Int_t itrack = iHit->GetTrack(); Int_t dray = 0; if (lasttrack != itrack || hit==(nhits-1)) first = kTRUE; //Int_t parent = iHit->GetParticle()->GetFirstMother(); Int_t partcode = iHit->GetParticle()->GetPdgCode(); // partcode (pdgCode): 11 - e-, 13 - mu-, 22 - gamma, 111 - pi0, 211 - pi+ // 310 - K0s, 321 - K+, 2112 - n, 2212 - p, 3122 - lambda /* Float_t px = iHit->GetPXL(); // the momenta at the Float_t py = iHit->GetPYL(); // each GEANT step Float_t pz = iHit->GetPZL(); Float_t ptot = 1000*sqrt(px*px+py*py+pz*pz); */ Float_t pmod = iHit->GetParticle()->P(); // total momentum at the // vertex pmod *= 1000; if(partcode == 11 && pmod < 6) dray = 1; // delta ray is e- // at p < 6 MeV/c // Get hit z and x(r*phi) cordinates for each module (detector) // in local system. Float_t zPix = kconv*iHit->GetZL(); Float_t xPix = kconv*iHit->GetXL(); Float_t yPix = kconv*iHit->GetYL(); // Get track status Int_t status = iHit->GetTrackStatus(); // Check boundaries if(zPix > spdLength/2) { //cout<<"!!! SPD: z outside ="<MinVal(); Int_t digits[3], tracks[3], hits[3],gi,j1; Float_t charges[3]; Float_t electronics; Float_t signal,phys; for(Int_t iz=0;izGaus(); signal = (float)fMapA2->GetSignal(iz,ix); signal += electronics; gi =iz*fNPixelsX+ix; // global index if (signal > threshold) { digits[0]=iz; digits[1]=ix; digits[2]=1; for(j1=0;j1<3;j1++){ if (pList[gi]) { //b.b. tracks[j1]=-3; tracks[j1] = (Int_t)(*(pList[gi]+j1)); hits[j1] = (Int_t)(*(pList[gi]+j1+6)); }else { tracks[j1]=-2; //noise hits[j1] = -1; } charges[j1] = 0; } if(tracks[0] == tracks[1] && tracks[0] == tracks[2]) { tracks[1] = -3; hits[1] = -1; tracks[2] = -3; hits[2] = -1; } if(tracks[0] == tracks[1] && tracks[0] != tracks[2]) { tracks[1] = -3; hits[1] = -1; } if(tracks[0] == tracks[2] && tracks[0] != tracks[1]) { tracks[2] = -3; hits[2] = -1; } if(tracks[1] == tracks[2] && tracks[0] != tracks[1]) { tracks[2] = -3; hits[2] = -1; } phys=0; aliITS->AddSimDigit(0,phys,digits,tracks,hits,charges); } if(pList[gi]) delete [] pList[gi]; } } delete [] pList; } //____________________________________________ void AliITSsimulationSPDdubna::CreateHistograms() { // create 1D histograms for tests printf("SPD - create histograms\n"); fHis=new TObjArray(fNPixelsZ); TString spdName("spd_"); for (Int_t i=0;iAddAt(new TH1F(spdName.Data(),"SPD maps", fNPixelsX,0.,(Float_t) fNPixelsX), i); } } //____________________________________________ void AliITSsimulationSPDdubna::ResetHistograms() { // // Reset histograms for this detector // for ( int i=0;iReset(); if (fHis->At(i)) ((TH1F*)fHis->At(i))->Reset(); } }