Trying to understand the shape of X-ray spectrum

Geant4 Version: 11.3.2
Operating System: Linux Mint 22.2 x86_64
Compiler/Version: g++ 13.3.0
CMake Version: 3.28.3


Hello everyone!

Does anybody know why my X rays spectrum looks like this? I want to understand why the intensity decreases until ~35 keV and then gets up very fast.

This is the PhysicsList I have used:

I have used G4EmStandardPhysics_option4() class and activated these:

param->SetFluo(true);
param->SetAuger(true);
param->SetPixe(true);

fEm = new G4EmStandardPhysics_option4(0);
RegisterPhysics(fEm);

I also used Sensitive Detector and this is how my ProcessHits method looks like:

if(aStep->IsFirstStepInVolume())
{
auto particle = aStep->GetTrack()->GetDefinition();

if(particle == G4Gamma::GammaDefinition())
{
  G4double KE = aStep->GetTrack()->GetKineticEnergy();

  auto analysisManager = G4AnalysisManager::Instance();
  analysisManager->FillH1(0, KE / keV);
  analysisManager->FillNtupleDColumn(0, 0, KE / keV);
  analysisManager->AddNtupleRow(0);
}

}

return true;

I used this in order to access the Kinetic energies of those X-rays that touch my sensitive detector only once.

Thank you!

@georgepata, what kind of source and detector are you studying? If you are using a CdTe detector, these are probably its absorption edges. I suggest you take a look at this page [CdTe Measurement of X-Ray Tube Spectra: Escape Events – Amptek – X-Ray Detectors and Electronics].
Then, search a bit more about X-ray absorption edges and take a look at your own detector’s technical sheet.

1 Like

Hello and ty for your answer !

I used a very thin plate (0.1 mm thickness) as sensitive detector because I wanted to get the KEs of the X rays that reach my detector (I wanted the energy of X rays, not how much they deposit in the detector):

G4Box *solidUnion = new G4Box("solidUnion", 0.05*mm, 5*cm, 5*cm);

logicUnion = new G4LogicalVolume(solidUnion, voidMat, "logicUnion");

G4VPhysicalVolume *physUnion = new G4PVPlacement(0, G4ThreeVector(5.5*cm, 0, 23.15*cm), logicUnion, "physUnion", logicWorld, false, 0);

then, in my ConstructSDandField() method:

void MyDetectorConstruction::ConstructSDandField()
{
    MySensitiveDetector *sensDet = new MySensitiveDetector("SensitiveDetector");
    G4SDManager::GetSDMpointer()->AddNewDetector(sensDet);
    logicUnion->SetSensitiveDetector(sensDet);
}

My goal is to find the KEs of X-rays that leave the tube (their spectrum), not the energy they deposit inside a detector.

EDIT: As a source, I used an electron source inside the tube geometry, as shown below:

MyPrimaryGenerator::MyPrimaryGenerator()
{
    fParticleGun = new G4ParticleGun(1);

    G4ParticleTable *particleTable = G4ParticleTable::GetParticleTable();
    G4ParticleDefinition *electron = particleTable->FindParticle("e-");
    G4ThreeVector mom(0, 0, 1);
    
    fParticleGun->SetParticleDefinition(electron);
    fParticleGun->SetParticleMomentumDirection(mom);
    fParticleGun->SetParticleEnergy(150*keV);
}


MyPrimaryGenerator::~MyPrimaryGenerator()
{ delete fParticleGun; }


void MyPrimaryGenerator::GeneratePrimaries(G4Event *anEvent)
{

    G4ThreeVector pos(0, 0, 9.3*cm);

    fParticleGun->SetParticlePosition(pos);
    fParticleGun->GeneratePrimaryVertex(anEvent);
}