double ECHARM_process_bethe_bloch::ComputeLogarithmicTerm(ECHARM_strip* strip,ECHARM_particle* part) //!< { double LogarithmicTerm = 2 * cElectronMass * fSquare(part->GetBeta() * part->GetGamma()); LogarithmicTerm *= ComputeElectronMaximumKineticTransfer(strip,part); LogarithmicTerm /= (fSquare(strip->GetCrystal()->GetAverageIonizationConstant())); return (0.5 * log(LogarithmicTerm)); }
double ECHARM_process_bethe_bloch::ComputeMeanEnergyLoss(ECHARM_strip* strip,ECHARM_particle* part) //!< { double EnergyLoss = (4 * cPi * fSquare(cElectronRadius) * cElectronMass); EnergyLoss *= (fSquare(fabs(part->GetZ()))*strip->GetCrystal()->GetZ()); EnergyLoss *= (ComputeLogarithmicTerm(strip,part) + ComputeDensityEffectTerm(strip,part) - fSquare(part->GetBeta())); EnergyLoss /= (fSquare(part->GetBeta()) * strip->GetCrystal()->GetA()); EnergyLoss *= strip->GetCrystal()->GetMassDensity(); return EnergyLoss; }
double ComputeN21(double vParticleEnergy,ECHARM_threevector* vPhoton,ECHARM_threevector* vPartMom,ECHARM_threevector* vPartMomNew){ double vPhotonEnergy = vPhoton->GetModule(); double vParticleEnergyNew = vParticleEnergy - vPhotonEnergy; double N21a = fSquare(vParticleEnergy) + fSquare(vParticleEnergyNew); double N21bX = (vPartMom->GetX() - vPhoton->GetX()) * (vPartMomNew()->GetX() - vPhoton->GetX()); double N21bY = (vPartMom->GetY() - vPhoton->GetY()) * (vPartMomNew()->GetY() - vPhoton->GetY()); double N21c = fSquare(vPhotonEnergy)/fSquare(vParticle->GetGamma()); double N21 = 0.5 * (N21a * (N21bX + N21bY) + N21c) / fSquare(vParticleEnergyNew); return N21; }
double ECHARM_distribution::GenerateNumberNegPol2(double Mean, double RMS, double xMin, double xMax) { double RandomNumber = 0.0; double vVariableX = 0.0; double vVariableY = 0.0; double vMax = 1.0 / (fSquare( xMin / RMS - Mean)); do { vVariableX = xMin + (drand48() - 0.5) * 2.0 * (xMax - xMin); RandomNumber = 1.0 / (fSquare(vVariableX / RMS - Mean)); vVariableY = drand48() * vMax; } while (vVariableY > RandomNumber); return vVariableX; }
double ECHARM_cell::FindVectorSquaredReciprocal(int vIndex[3]) { double double_result = 0.0; double double_temp[6]; int i; if(IsOrthogonal()) { for(i=0;i<3;i++) double_result += fSquare(vIndex[i] / fSize->GetComponent(i)); } else { double_temp[0] = fSize->GetComponent(1) * fSize->GetComponent(2) * sin(fAngle->GetComponent(1)) / FindVolume(); double_temp[1] = fSize->GetComponent(0) * fSize->GetComponent(2) * sin(fAngle->GetComponent(0)) / FindVolume(); double_temp[2] = fSize->GetComponent(0) * fSize->GetComponent(1) * sin(fAngle->GetComponent(2)) / FindVolume(); double_temp[3] = fSize->GetComponent(0) * fSize->GetComponent(1) * fSize->GetComponent(2) * fSize->GetComponent(2) * (cos(fAngle->GetComponent(0)) * cos(fAngle->GetComponent(1)) - cos(fAngle->GetComponent(2))) / FindVolume(); double_temp[4] = fSize->GetComponent(0) * fSize->GetComponent(1) * fSize->GetComponent(1) * fSize->GetComponent(2) * (cos(fAngle->GetComponent(2)) * cos(fAngle->GetComponent(0)) - cos(fAngle->GetComponent(1))) / FindVolume(); double_temp[5] = fSize->GetComponent(0) * fSize->GetComponent(0) * fSize->GetComponent(1) * fSize->GetComponent(2) * (cos(fAngle->GetComponent(1)) * cos(fAngle->GetComponent(2)) - cos(fAngle->GetComponent(0))) / FindVolume(); for(i=0;i<3;i++) double_temp[i] = double_temp[i] * double_temp[i] * vIndex[i] * vIndex[i]; double_temp[3] *= (2 * vIndex[0] * vIndex[1]); double_temp[4] *= (2 * vIndex[2] * vIndex[0]); double_temp[5] *= (2 * vIndex[2] * vIndex[2]); for(i=0;i<6;i++) double_result += double_temp[i]; } double_result *= (4 * M_PI * M_PI); return double_result; }
double ECHARM_cell::FindPeriodReciprocal(int vIndex[3]) { double double_temp = 0.0; int i; for(i=0;i<3;i++) double_temp += fSquare(vIndex[i]/fSize->GetComponent(i)); double_temp = fSquareRoot(double_temp)*2*M_PI; return double_temp; }
double ECHARM_cell::FindPeriodDirect(int vIndex[3]) { double double_temp = 0.0; int i; for(i=0;i<3;i++) double_temp += fSquare(vIndex[i]/fSize->GetComponent(i)); double_temp = fSquareRoot(1/double_temp); return double_temp; }
double ComputeRadiationProability(std::vector<ECHARM_threevector*> vPos,std::vector<ECHARM_threevector*> vMomentum,ECHARM_particle* vParticle,ECHARM_threevector* vPhoton){ double vPhotonEnergy = vPhoton->GetModule(); double vParticleEnergy = vParticle->GetEnergy(); double vParticleEnergyNew = vParticleEnergy - vPhotonEnergy; double vOmegaFirst = vPhotonEnergy * vParticleEnergy / vParticleEnergyNew; double vRadiationProbability = 0; for(unsigned int i=1;i<vX.size();i++){ vRadiationProbability += cos(vOmegaFirst * ComputeDistanceThreeVectors(vPos.at(i),vPos.at(i-1)) * ComputeN21(vParticleEnergy,vPhoton,vPartMom,vPartMomNew)); } vRadiationProbability *= cFineStructureConstant; vRadiationProbability /= ( fSquare( 4. * cPi)); return vRadiationProbability; }
std::vector<double> ECHARM_EC_rec_pot::ComputeRecFF(int vIndex[3], double vIndexEC[3]) { std::vector<double> FC; std::vector<double> SF = fCrystal->ComputeSF(vIndex); double FormFactor = 0.0; double ThermalVibration = 0.0; double RecVec2 = fCrystal->GetCell()->ComputeRecVec2(vIndex); for(unsigned int i=0;i<fCrystal->GetNumBases();i++){ FormFactor = fCrystal->GetAtom(i)->ComputeRecFF(RecVec2); ThermalVibration = exp( - fSquare(fCrystal->GetAtom(i)->GetThermalVibrationConstant()) * RecVec2 / 2); FC.push_back(GetFactorRe(vIndexEC) * FormFactor * SF[2*i] * fCrystal->GetAtom(i)->GetZ() * ThermalVibration / RecVec2); FC.push_back(GetFactorIm(vIndexEC) * FormFactor * SF[2*i+1] * fCrystal->GetAtom(i)->GetZ() * ThermalVibration / RecVec2); } return FC; }
void ECHARM_simulation_integration_averaged::PreInitializeEnergyToDechannel() { double vTempEnergy; double vX; fPlanarEnergyToDechannel.clear(); double vPotentialBarrier = GetStrip()->GetCrystal()->GetPlanarElectricCharacteristic(0.0,0); #ifdef ROOT_ std::string vHistoName = "hEnergyToDechannel_prf" + GetStrip()->GetRadiusValueAsStringText() + "_" + GetStrip()->GetLengthValueAsStringText(); TH1F *hEnergyToDechannel = new TH1F( vHistoName.c_str(),"hEnergyToDechannel;Interplanar Distance [#AA]",GetIntegrationStepNumberPlanar(),0.,GetStrip()->GetCrystal()->GetDirectPeriodPlanar() ); #endif for(unsigned int i = 0; i < GetIntegrationStepNumberPlanar(); i++) { vX = double(i) / double(GetIntegrationStepNumberPlanar()) * GetStrip()->GetCrystal()->GetDirectPeriodPlanar(); vTempEnergy = GetStrip()->GetCrystal()->GetPlanarElectricCharacteristic( vX , 0); //std::cout << vTempEnergy << " "; if( StripIsBentX() ) vTempEnergy += ( GetParticle()->GetMomentumVector()->GetZ() * GetParticle()->GetBeta() * vX / GetStrip()->GetCurvatureRadius()->GetX() ); //std::cout << GetParticle()->GetMomentumVector()->GetZ() << " " << GetParticle()->GetBeta() << " " << GetStrip()->GetCurvatureRadius()->GetX() << " " << vX << " "; vTempEnergy -= vPotentialBarrier; vTempEnergy += ( GetParticle()->GetBeta() * fSquare(GetParticle()->GetMomentumVector()->GetX()) / GetParticle()->GetMomentumVector()->GetZ()); //std::cout << vTempEnergy << " "; if(vTempEnergy > 0.0) vTempEnergy = -0.; vTempEnergy *= (-1.); fPlanarEnergyToDechannel.push_back(vTempEnergy); //std::cout << vTempEnergy << std::endl; // DA TOGLIERE #ifdef ROOT_ hEnergyToDechannel->SetBinContent(i+1,vTempEnergy); #endif } }
double ECHARM_distribution::GetValueGauss(double vX, double Mean, double Sigma) { double vValue = exp(-0.5*fSquare((vX-Mean)/(Sigma)))/(fSquareRoot(2.*M_PI)*Sigma); return vValue; }
double ECHARM_simulation_integration_averaged::GetAveragedDechannelingProbability() { double vDechannelingEnergy = 0.0; double vValueATD = 0.; double vValueELD = 0.; double vDechProb = 0.0; #ifdef ROOT_ std::string vHistoName = "hDechProb_prf" + GetStrip()->GetRadiusValueAsStringText() + "_" + GetStrip()->GetLengthValueAsStringText(); std::string vHistoNameATD = "hDechProbATD_prf" + GetStrip()->GetRadiusValueAsStringText() + "_" + GetStrip()->GetLengthValueAsStringText(); std::string vHistoNameELD = "hDechProbELD_prf" + GetStrip()->GetRadiusValueAsStringText() + "_" + GetStrip()->GetLengthValueAsStringText(); TH1F *hDechProb = new TH1F( vHistoName.c_str(),"hDechProb;Interplanar Distance [#AA]",GetIntegrationStepNumberPlanar(),0.,GetStrip()->GetCrystal()->GetDirectPeriodPlanar()/AA); TH1F *hDechProbATD = new TH1F( vHistoNameATD.c_str(),"hDechProb;Interplanar Distance [#AA]",GetIntegrationStepNumberPlanar(),0.,GetStrip()->GetCrystal()->GetDirectPeriodPlanar()/AA); TH1F *hDechProbELD = new TH1F( vHistoNameELD.c_str(),"hDechProb;Interplanar Distance [#AA]",GetIntegrationStepNumberPlanar(),0.,GetStrip()->GetCrystal()->GetDirectPeriodPlanar()/AA); #endif std::vector<double> vVectEff; vVectEff.clear(); for(unsigned int i = 0; i < GetIntegrationStepNumberPlanar(); i++) { if(fPlanarEnergyToDechannel.at(i)==0.){ vValueELD = 1.; vValueATD = 1.; } else{ if(fPlanarElectronDensity.at(i)!=0.0){ fMultipleScattering->SetCrossedMaterialLength( fPlanarElectronDensity.at(i) * GetStrip()->GetDimension()->GetZ() ); fMultipleScattering->UpdateElectronScatteringOutgoingDistribution(); vValueELD = (erfc(vDechannelingEnergy/(fSquareRoot(2.)*(fMultipleScattering->GetElectronScatteringOutgoingDistribution()->GetDistributionParameters().at(1))))); } if(fPlanarEnergyToDechannel.at(i)!=0.){ fMultipleScattering->SetCrossedMaterialLength( fPlanarAtomicDensity.at(i) * GetStrip()->GetDimension()->GetZ() ); fMultipleScattering->UpdateNuclearScatteringOutgoingDistribution(); vValueATD = (erfc(vDechannelingEnergy/(fSquareRoot(2.)*(fMultipleScattering->GetNuclearScatteringOutgoingDistribution()->GetDistributionParameters().at(1))))); } vDechannelingEnergy = fSquareRoot(2. * fPlanarEnergyToDechannel.at(i) * GetParticle()->GetMomentumVector()->GetZ() ); } vVectEff.push_back(fSquareRoot(fSquare(vValueATD)+fSquare(vValueELD)) / fSquareRoot(2.)); vDechProb += vVectEff.at(i); #ifdef ROOT_ hDechProbATD->SetBinContent(i+1,vValueATD); hDechProbELD->SetBinContent(i+1,vValueELD); hDechProb->SetBinContent(i+1,vVectEff.at(i)); #endif } // unsigned int vNumberOfResample = 3; // unsigned int iTot = GetIntegrationStepNumberPlanar() * vNumberOfResample; // // double vValue = 0.; // double x = 0.; // // for(unsigned int j = 0;j < iTot - 2 ;j++) // { // x = GetStrip()->GetDirectPeriodPlanar() / iTot * j; // vValue = fInterpolationFunction->FindInterpolate1D(vVectEff.at(j),vVectEff.at(j+1),vVectEff.at(j+2),vVectEff.at(j+3),x); // vDechProb += vValue; // } // // x = GetStrip()->GetDirectPeriodPlanar() / iTot * (iTot - 2); // vDechProb += fInterpolationFunction->FindInterpolate1D(vVectEff.at(iTot - 2),vVectEff.at(iTot - 1),vVectEff.at(iTot),vVectEff.at(0),x) // // x = GetStrip()->GetDirectPeriodPlanar() / iTot * (iTot - 1); // vDechProb += fInterpolationFunction->FindInterpolate1D(vVectEff.at(iTot - 1),vVectEff.at(iTot),vVectEff.at(0),vVectEff.at(1),x) vDechProb /= GetIntegrationStepNumberPlanar(); vDechProb -= 1.; vDechProb *= (-1); //std::cout << "ECHARM_simulation_integration_averaged: Efficiency = " << vDechProb*100 << " [%]" << std::endl; return vDechProb; }
double ECHARM_process_bethe_bloch::ComputeElectronMaximumKineticTransfer(ECHARM_strip* strip,ECHARM_particle* part) //!< { double KineticTransfer = 2 * fSquare(cElectronMass * part->GetBeta() * part->GetGamma()); KineticTransfer /= (1 + 2 * part->GetGamma() * cElectronMass / part->GetMass() + fSquare(cElectronMass/part->GetMass())); return KineticTransfer; }