Unclear how to configure scintillation (optical)

Hello,

I am having problems configuring a geometry to produce opticalphotons via scintillation. I am following the documentation in Physics Processes — Book For Application Developers 10.7 documentation and using v10.7.2. I have only managed to create these photons in version v11.0.0 but rolled back due to some other issues.

I am generating the geometry with geant4, exporting to GDML and then loading it back into geant4.

If I only define the properties found in the documentation:

G4Material* scintillator = new G4Material(/*...*/);

std::vector<G4double> energy     = {2.034*eV, 3.*eV, 4.136*eV};
std::vector<G4double> rindex     = {1.3435, 1.351, 1.3608};
std::vector<G4double> absorption = {344.8*cm, 850.*cm, 1450.0*cm};

G4MaterialPropertiesTable* MPT = new G4MaterialPropertiesTable();

// property independent of energy
MPT->AddConstProperty("SCINTILLATIONYIELD", 100./MeV);

// properties that depend on energy
MPT->AddProperty("RINDEX", energy, rindex)->SetSpline(true);
MPT->AddProperty("ABSLENGTH", energy, absorption)->SetSpline(true);

scintillator->SetMaterialPropertiesTable(MPT);

I cannot see opticalphotons created by Scintillation, only some due to Cerenkov. However, regardless of the properties I define I see the process “Scintillation” in my log, just no optical photons are generated from it.

I have managed (after reading the examples) to create a valid geometry that generated the scintillation photons using the following properties:

    scintillatorMaterialPropertiesTable->AddProperty("SCINTILLATIONCOMPONENT1", photonEnergy, scintillation);
    scintillatorMaterialPropertiesTable->AddProperty("RINDEX", photonEnergy, refractiveIndexScintillator);
    scintillatorMaterialPropertiesTable->AddProperty("ABSLENGTH", photonEnergy, absorptionLength);
    scintillatorMaterialPropertiesTable->AddConstProperty("SCINTILLATIONYIELD", 10000. / MeV);
    scintillatorMaterialPropertiesTable->AddConstProperty("RESOLUTIONSCALE", 1.0);
    scintillatorMaterialPropertiesTable->AddConstProperty("SCINTILLATIONRISETIME1", 0.9 * ns);
    scintillatorMaterialPropertiesTable->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 0.9 * ns);
    scintillatorMaterialPropertiesTable->AddConstProperty("SCINTILLATIONYIELD1", 1.0);
    scintillatorMaterial->SetMaterialPropertiesTable(scintillatorMaterialPropertiesTable);

However, this only seems to work with version v11.0.0, not with v10.7.2, but I have no idea how to change it so does it works.

Also I have found that the scintillatorMaterial->GetIonisation()->SetBirksConstant(0.110 * mm / MeV); line does “nothing” and does not change the generated GDML so I am wondering what this does.

Here are the parameters of my optical physics list:

=======================================================================
======                         Optical Physics Parameters      ========
=======================================================================
 Cerenkov process active:               1
 Cerenkov maximum photons per step:     100
 Cerenkov maximum beta change per step: 10 %
 Cerenkov stack photons:                1
 Cerenkov track secondaries first:      1
 Scintillation process active:          1
 Scintillation finite rise time:        0
 Scintillation by particle type:        0
 Scintillation record track info:       0
 Scintillation stack photons:           1
 Scintillation track secondaries first: 1
 WLS process active:                    1
 WLS time profile name:                 delta
 WLS2 process active:                   1
 WLS2 time profile name:                delta
 Boundary process active:               1
 Boundary invoke sensitive detector:    0
 Rayleigh process active:               1
 MieHG process active:                  1
 Absorption process active:             1
=======================================================================

I would really appreciate a minimalistic material configuration to produce scintillation light, or a way to debug this problem.

Thanks!

Some additional information:

If I do a simulation with a material taken from the documentation:

//Liquid Xenon
fLXe = new G4Material("LXe",z=54.,a=131.29*g/mole,density=3.020*g/cm3);

std::vector<G4double> lxe_Energy = {7.0*eV, 7.07*eV, 7.14*eV};

std::vector<G4double> lxe_SCINT = {0.1, 1.0, 0.1};
std::vector<G4double> lxe_RIND  = {1.59, 1.57, 1.54};
std::vector<G4double> lxe_ABSL  = {35.*cm, 35.*cm, 35.*cm};
fLXe_mt = new G4MaterialPropertiesTable();
fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT1", lxe_Energy, lxe_SCINT);
fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT2", lxe_Energy, lxe_SCINT);
fLXe_mt->AddProperty("RINDEX",        lxe_Energy, lxe_RIND);
fLXe_mt->AddProperty("ABSLENGTH",     lxe_Energy, lxe_ABSL);
fLXe_mt->AddConstProperty("SCINTILLATIONYIELD", 12000./MeV);
fLXe_mt->AddConstProperty("RESOLUTIONSCALE", 1.0);
fLXe_mt->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 20.*ns);
fLXe_mt->AddConstProperty("SCINTILLATIONTIMECONSTANT2", 45.*ns);
fLXe_mt->AddConstProperty("SCINTILLATIONYIELD1", 1.0);
fLXe_mt->AddConstProperty("SCINTILLATIONYIELD2", 0.0);
fLXe->SetMaterialPropertiesTable(fLXe_mt);

// Set the Birks Constant for the LXe scintillator
fLXe->GetIonisation()->SetBirksConstant(0.126*mm/MeV);

I get different results depending on the geant4 version.

With v11.0.0:

This seems like the correct results, lots of optical photons generated by scintillation.

With v10.7.2:

I don’t get a single scintillation photon, only a single opticalphoton generated by Cerenkov.

I have used a 662 gamma as a primary for both cases.

Keep in mind I am exporting / importing the geometry as GDML. Here is the GDML file:
OpticalTest.gdml.txt (8.6 KB)

Thanks for your help.

Thinking that the problem could be the GDML, I tried without using GDML, and still the same problem happens. This is my geometry:


G4VPhysicalVolume* DetectorConstruction::ConstructDefaultGeometry() {
    
    auto fLXe = new G4Material("LXe", 54., 131.29 * g / mole, 3.020 * g / cm3);

    std::vector<G4double> lxe_Energy = {7.0 * eV, 7.07 * eV, 7.14 * eV};

    std::vector<G4double> lxe_SCINT = {0.1, 1.0, 0.1};
    std::vector<G4double> lxe_RIND = {1.59, 1.57, 1.54};
    std::vector<G4double> lxe_ABSL = {35. * cm, 35. * cm, 35. * cm};
    auto fLXe_mt = new G4MaterialPropertiesTable();
    fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT1", lxe_Energy, lxe_SCINT);
    fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT2", lxe_Energy, lxe_SCINT);
    fLXe_mt->AddProperty("RINDEX", lxe_Energy, lxe_RIND);
    fLXe_mt->AddProperty("ABSLENGTH", lxe_Energy, lxe_ABSL);
    fLXe_mt->AddConstProperty("SCINTILLATIONYIELD", 12000. / MeV);
    fLXe_mt->AddConstProperty("RESOLUTIONSCALE", 1.0);
    fLXe_mt->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 20. * ns);
    fLXe_mt->AddConstProperty("SCINTILLATIONTIMECONSTANT2", 45. * ns);
    fLXe_mt->AddConstProperty("SCINTILLATIONYIELD1", 1.0);
    fLXe_mt->AddConstProperty("SCINTILLATIONYIELD2", 0.0);
    fLXe->SetMaterialPropertiesTable(fLXe_mt);

    // Set the Birks Constant for the LXe scintillator
    fLXe->GetIonisation()->SetBirksConstant(0.126 * mm / MeV);

    auto nist = G4NistManager::Instance();
    bool checkOverlaps = true;

    double worldSize = 1500 * mm;

    auto solidWorld = new G4Box("World", 0.5 * worldSize, 0.5 * worldSize, 0.5 * worldSize);
    auto logicWorld = new G4LogicalVolume(solidWorld, nist->FindOrBuildMaterial("G4_Galactic"), solidWorld->GetName());
    logicWorld->SetVisAttributes(G4VisAttributes(false));  // invisible

    fWorld = new G4PVPlacement(nullptr,                // rotation
                               G4ThreeVector(),        // position
                               logicWorld,             // its logical volume
                               logicWorld->GetName(),  // its name
                               nullptr,                // its mother  volume
                               false,                  // no boolean operation
                               0,                      // copy number
                               checkOverlaps);         // overlaps checking

    double scintillatorLength = 800 * mm;
    double scintillatorWidth = 200 * mm;
    double scintillatorThickness = 50 * mm;
    auto solidScintillator = new G4Box("Scintillator", scintillatorWidth / 2, scintillatorThickness / 2, scintillatorLength / 2);
    auto LogicScintillator = new G4LogicalVolume(solidScintillator, fLXe, solidScintillator->GetName());
    new G4PVPlacement(nullptr, G4ThreeVector(), LogicScintillator->GetName(), LogicScintillator, fWorld, false, 0);

    return fWorld;
}

Perhaps the problem is with the physics list? I have only initialized the optical physics list, I am doing nothing fancy, just RegisterPhysics(new G4OpticalPhysics); and nothing else.

I couldn’t also make it to work using the GDML file for the optical novice example (from the v11.0.0 repo) geant4/NoviceExample.gdml at 6399a014b611a4aa09ecba225418222dac261ca1 · Geant4/geant4 · GitHub in the geant4 verison v10.7.2. I only get Cerenkov photons. This file is not available for v10.7.2.

This is really puzzling, I am literally copying the DetectorConstruciton and PhysicsList initialization from the OpNovice example and cannot see Scintillation photons, however if I compile and run the example, they appear. (and this only happens in v10.7.2, in v11.0.0 everything goes fine). I must be doing something, but no idea where it can be at this point.

Sorry for the delay. In 10.6 and earlier the scintillation material properties are named FAST and SLOW. See the manual under “methods available up to 10.6”. In 11.0 the properties are named 1, 2, and 3.

In 10.7 both naming schemes are available, The default is FAST/SLOW. To use 1,2,3, set useEnhancedTimeConstants to true (either in code or macro.)

See the OpNovice2 example and electron.mac.

1 Like

THANK YOU! that was it.

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.