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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}
Ejemplo n.º 7
0
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;
}
Ejemplo n.º 9
0
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;
}