// ------------------------------------------------------------------------ // ----- CbmTrdRadiator source fil ----- // ----- Created 10/11/04 by M.Kalisky ----- // ------------------------------------------------------------------------- #include "CbmTrdRadiator.h" #include "CbmRootManager.h" #include "iostream.h" #include "cmath" #include #include #include "TCanvas.h" // ----- Default constructor --------------------------------------- CbmTrdRadiator::CbmTrdRadiator() :CbmTask(){ fSpectrum=0; fMySpectrum = 0; fDetSpectrumA = 0; fDetSpectrum = 0; fRnd = new TRandom(0); fInitialised = kFALSE; for(Int_t i=0; i<6; i++){ fFinal[i] = NULL; } fSigma = NULL; fSigmaMy = NULL; fSigmaDet = NULL; fELoss = - 1.0; } //----------------------------------------------------------------------------- // ----- Constructor -------------------------------------------------- CbmTrdRadiator::CbmTrdRadiator(const char *name, const char *title) :CbmTask(name){ fSpectrum=0; fMySpectrum = 0; fDetSpectrumA = 0; fDetSpectrum = 0; fRnd = new TRandom(0); fInitialised = kFALSE; for(Int_t i=0; i<6; i++){ fFinal[i] = NULL; } fSigma = NULL; fSigmaMy = NULL; fSigmaDet = NULL; fELoss = -1.0; } //----------------------------------------------------------------------------- // ----- Destructor ---------------------------------------------------- CbmTrdRadiator::~CbmTrdRadiator() { CbmRootManager *fManager = CbmRootManager::Instance(); fManager->Write(); if(fRnd) delete fRnd; if (fSpectrum){ cout << " -I DELETING fSpectrum " << endl; delete fSpectrum; } if (fMySpectrum) delete fMySpectrum; if (fDetSpectrum) delete fDetSpectrum; if (fDetSpectrumA) delete fDetSpectrumA; for(Int_t i=0; i<6; i++){ if(fFinal[i]) delete fFinal[i]; } } //---------------------------------------------------------------------------- InitStatus CbmTrdRadiator::Init(){ fNFoils = 100; fFoilThick = 0.0010; // [cm] fGapThick = 0.008; fFoilDens = 0.92; // [g/cm3 ] fFoilOmega = 20.9; //Omega(fFoilDens,fFoilZ,fFoilA); fFoilThickCorr = fFoilThick; fGapThickCorr = fGapThick; fGasThickCorr = fGasThick; return kSUCCESS; } // ----- Init function ---------------------------------------------------- //void CbmTrdRadiator::Init(TLorentzVector Mom, TLorentzVector Pos){ void CbmTrdRadiator::Init(Bool_t SimpleTR, Int_t Nfoils, Float_t FoilThick, Float_t GapThick){ fNFoils = Nfoils; fGapThick = GapThick; fFoilThick = FoilThick; fSimpleTR = SimpleTR; fFoilThickCorr = fFoilThick; fGapThickCorr = fGapThick; fGasThickCorr = fGasThick; // Update needed - the thickness of the detector should nb obtained from the parfile fDetThick = 0.6; // hardcoded in the geometry file of the TRD //fNFoils = 100; //fFoilThick = 0.0010; // [cm] fFoilDens = 0.92; // [g/cm3 ] fFoilOmega = 20.9; //Omega(fFoilDens,fFoilZ,fFoilA); //fGapThick = 0.0080; // [cm] fGapDens = 0.00186; //20 deg. //0.001977 //STP; fGapOmega = 0.7; //Omega(fGapDens ,fGapZ ,fGapA ); fGasThick = 0.6; // foil between radiator and gas chamber fMyDens = 1.39; // [g/cm3] fMyThick = 0.0025; // [cm] //fDetThick = 0.6; //cm fCom1 = 0.15; fCom2 = 1.0 - fCom1; //fMom = Mom; fNormPhi = 1; // some binning stuff fSpNBins = 100; //200; fSpRange = 50; //100; fSpBinWidth = fSpRange / fSpNBins; fSpLower = 1.0 - 0.5 * fSpBinWidth; fSpUpper = fSpLower + fSpRange; fSigma = NULL; fSigmaMy = NULL; fSigmaDet = NULL; // Histograms // if (fSpectrum) delete fSpectrum; Char_t name[50]; if ( fInitialised == kFALSE ) { fSpectrum = new TH1D("fSpectrum","TR spectrum",fSpNBins,fSpLower,fSpUpper); if (fMySpectrum) delete fMySpectrum; fMySpectrum = new TH1D("fMySpectrum","TR spectrum in Mylar",fSpNBins,fSpLower,fSpUpper); if (fDetSpectrum) delete fDetSpectrum; fDetSpectrum = new TH1D("fDetSpectrum", "TR spectrum escaped from detector",fSpNBins,fSpLower,fSpUpper); if (fDetSpectrumA) delete fDetSpectrumA; fDetSpectrumA = new TH1D("fDetSpectrumA", "TR spectrum absorbed in detector",fSpNBins,fSpLower,fSpUpper); for(Int_t i=0; i<6; i++){ sprintf(name,"fFinal%d", i+1); //cout<<"name : "<GetBinContent(j + 1); fFinal[i]->SetBinContent(j + 1, tmp); } } // TR spectra for different momenta /* TFile* f1 = new TFile("histos.root", "recreate"); fFinal[0]->Write(); fFinal[1]->Write(); fFinal[2]->Write(); fFinal[3]->Write(); fFinal[4]->Write(); fFinal[5]->Write(); f1->Write(); f1->Close(); f1->Delete(); */ } //---------------------------------------------------------------------------- // ---- GetTR --------------------------------------------------------------- Float_t CbmTrdRadiator::GetTR(TVector3 Mom){ /* * Simplified simulation of the TR */ if(fSimpleTR == kTRUE){ //cout<<" -I : CbmTrdRadiator : SimpleTR used "< mom[i]){ i++; if(i == 6) { i--; break; } } //cout<<" Mom: "<Poisson(fnTRab); Int_t maxPhoton = 50; if (nPhoton > maxPhoton) nPhoton = maxPhoton; Double32_t eLoss = 0; Float_t eTR = 0; //cout<<" index: "<50) cout << "nphoton" << i << endl; //eTR = spectrum->GetRandom(); eTR = fDetSpectrumA->GetRandom(); //cout<<" eLoss: "<50) cout << "nphoton" << i << endl; //eTR = spectrum->GetRandom(); eTR = fFinal[index]->GetRandom(); //cout<<" eLoss: "<GeV & set the result fELoss = eLoss /1000000.0; return 0; } //---------------------------------------------------------------------------- //----- TR spectrum --------------------------------------------------- Int_t CbmTrdRadiator::TRspectrum(){ const Float_t kAlpha = 0.0072973; const Int_t kSumMax = 30; Float_t gamma = GammaF(); //cout<<"TR spectrum - 2"<Reset(); fDetSpectrum->Reset(); fDetSpectrumA->Reset(); Float_t kappa = fGapThickCorr / fFoilThickCorr; SetSigma(1); //cout<<"TR spectrum - 3"<100 ) cout << " -I fSpNBins " << fSpNBins << endl; // keV -> eV Float_t energyeV = (fSpBinWidth * iBin + 1.0) * 1e3; Float_t csFoil = fFoilOmega / energyeV; Float_t csGap = fGapOmega / energyeV; Float_t rho1 = energyeV * fFoilThickCorr * 1e4 * 2.5 * (1.0 / (gamma * gamma) + csFoil * csFoil); // if (iBin < 10) cout <<" rho1 = " << rho1<< endl; Float_t rho2 = energyeV * fFoilThickCorr * 1e4 * 2.5 * (1.0 / (gamma*gamma) + csGap *csGap); // Calculate the sum Float_t sum = 0; for (Int_t iSum = 0; iSum < kSumMax; iSum++) { if (iSum>30) cout << " -I kSumMax " << kSumMax << endl; Float_t tetan = (TMath::Pi() * 2.0 * (iSum+1) - (rho1 + kappa * rho2)) / (kappa + 1.0); if (tetan < 0.0) { // cout << " tetaN = , "< (binsize corr.) //Float_t nTR0 = stemp * fSpBinWidth; //cout << " No. of photons after radiator" << nTR0 << endl; // compute the spectra behind the mylar foil (absorption) MyTRspectrum(); return 1; } //------------------------------------------------------------------ //----- MyTRspectrum ----------------------------------------------- Int_t CbmTrdRadiator::MyTRspectrum(){ // // Computes the spectrum after absorption in Mylar foil // fMySpectrum->Reset(); SetSigma(2); Float_t stemp = 0; for(Int_t iBin = 0; iBin < fSpNBins ; iBin ++){ if ( iBin>100 ) cout << " -I fSpNBins " << fSpNBins << endl; Float_t sp = 0; sp = fSpectrum->GetBinContent(iBin+1); // compute the absorption coefficient Float_t conv = TMath::Exp(-fSigmaMy[iBin]); Float_t wn = sp * conv; fMySpectrum->SetBinContent(iBin+1,wn); stemp += wn; } fnTRprod = stemp * fSpBinWidth; //cout << "No. of photons after My = "<< fnTRprod << endl; // compute the spectrum absorbed in the D & escaped from ther D DetTRspectrum(); return 1; } //---------------------------------------------------------------------------- //----- DetTRspectrum ------------------------------------------------ Int_t CbmTrdRadiator::DetTRspectrum(){ // // Computes the spectrum absorbed and passed in the gas mixture // SetSigma(3); Float_t stemp = 0; Float_t stemp2 = 0; for(Int_t iBin = 0; iBin < fSpNBins; iBin++ ){ if ( iBin>100 ) cout << " -I fSpNBins " << fSpNBins << endl; //passed spectrum Float_t sp = 0; sp = fMySpectrum->GetBinContent(iBin + 1); Float_t conv = TMath::Exp(-fSigmaDet[iBin]); Float_t wn = sp * conv; fDetSpectrum->SetBinContent(iBin + 1, wn); stemp += wn; // absorbed spectrum Float_t conv2 = 1 - TMath::Exp(-fSigmaDet[iBin]); Float_t wn2 = sp * conv2; fDetSpectrumA->SetBinContent(iBin + 1, wn2); //cout<<"wn2 = "<