| Message: Re: Correlated polarized photons in GEANT4 | Not Logged In (login) |
|
Hello Estela,
> I've tried to launch a photon in one direction, and when it is detected in my > detector, to launch the second one from the initial point with opposite > momentum and perpendicular polarization. The problem is that those two photons > are not really correlated, and G4 treats them as completely independent photons > (so the polarization that I get as a result is not correct). Why do you say that 'the polarization that you get as a result of the above procedure is not correct'? In fact, you can immediately start always generating two photons with opposite direction and perpendicular polarization. If the first photon is not detected, don't bother simulating the second photon. Reading my "Feynman Lecture III" chapter 18-3 'The annihilation of positronium' I conclude that you need to simulate the photons such that the linear polarization of photon 2 is always perpendicular to that of photon 1 (i.e. "So there is a unit probability that if you get a photon in your x-polarized detector, the other guy will get a photon in his y-polarized detector."). Thus, for each annihilation event you pick the linear polarization of photon 1 at random phi in a plane perpendicular to its momentum, but you then always fix the linear polarization of photon 2 to be +-90 degrees from it. You need to implement code like:
// Generate random photon direction
G4double cost = 1. - 2.*G4UniformRand();
G4double sint = sqrt((1.-cost)*(1.+cost));
G4double phi = twopi*G4UniformRand();
G4double sinp = sin(phi);
G4double cosp = cos(phi);
G4double px = sint*cosp;
G4double py = sint*sinp;
G4double pz = cost;
// Create photon momentum direction vector
G4ParticleMomentum photonMomentum(px, py, pz);
// Determine polarization of new photon
G4double sx = cost*cosp;
G4double sy = cost*sinp;
G4double sz = -sint;
G4ThreeVector photonPolarization(sx, sy, sz);
G4ThreeVector perp = photonMomentum.cross(photonPolarization);
phi = twopi*G4UniformRand();
sinp = sin(phi);
cosp = cos(phi);
photonPolarization = cosp * photonPolarization + sinp * perp;
photonPolarization = photonPolarization.unit();
// Generate two gammas:
particleGun->SetParticleMomentumDirection(photonMomentum);
particleGun->SetParticlePolarization(photonPolarization);
particleGun->SetParticleEnergy(photonEnergy);
particleGun->GeneratePrimaryVertex(anEvent);
particleGun->SetParticleMomentumDirection(-photonMomentum);
photonPolarization =
photonMomentum.cross(photonPolarization).unit();
particleGun->SetParticlePolarization(photonPolarization);
particleGun->GeneratePrimaryVertex(anEvent); Best regards, Peter
|
| Inline Depth: | Outline Depth: | Add message: |
|
to: |