/* ecalBasic.cpp
A basic simulation of a Electromagnetic CALorimeter to see
detector effects on the photons.
Prints four-momenta of photons originating from a pi0 decay and
two-photon invariant mass of two photons with and without ECAL simulation.
Note that, the decay channel of pi0 is:
pi0 -> gamma1 + gamma2
An example output is:
Four-momenta of each gammas and their invariant mass:
Before entering ECAL:
P4( gamma1 ) = (0.472459, 0.0657655, 0.0146966, 0.477240)
P4( gamma2 ) = (0.527541, -0.0657655, -0.0146966, 0.531828)
m = 0.134977
After entering ECAL:
P4( gamma1 ) = (0.445518, 0.0620154, 0.0138586, 0.450027)
P4( gamma2 ) = (0.495100, -0.0617213, -0.0137929, 0.499123)
m = 0.126978
*/
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
#include "Random.h"
#include "Particle.h"
#include "Detector.h"
// returns invariant mass of particles p1 and p2
double invm2(double* p1, double* p2){
double m2 = pow(p1[3]+p2[3],2.) -
pow(p1[0]+p2[0],2.) -
pow(p1[1]+p2[1],2.) -
pow(p1[2]+p2[2],2.);
double mass = (m2>0.0) ? sqrt(m2) : 0.0;
return mass;
}
int main(){
double m;
Particle pi0(0.1349766), gamma1(0.0), gamma2(0.0);
Detector det;
for(int iEvent = 1; iEvent<50; iEvent++)
{
cout << "Event # " << iEvent << endl;
// Set pi0 momentum in the Lab frame
double px = 1.0;
double py = 0.0;
double pz = 0.0;
double p = sqrt(px*px + py*py + pz*pz);
double e = sqrt(p*p+pi0.m*pi0.m);
pi0.p4(px, py, pz, e);
// do a two-body decay
pi0.twoBodyDecay(gamma1, gamma2);
// boost gammas
gamma1.boost(pi0);
gamma2.boost(pi0);
// calculate invariant mass of two gammas
m = invm2(gamma1.p, gamma2.p);
cout << "Four-momenta of each gammas and their invariant mass:" << endl;
cout << "Before entering ECAL:" << endl;
cout << "P4( gamma1 ) = "; gamma1.print();
cout << "P4( gamma2 ) = "; gamma2.print();
cout << "m = " << m << endl << endl;
// smear four momenta of each gamma tracks
det.ecalFast(gamma1, 0.05,0.0,2.5);
det.ecalFast(gamma2, 0.05,0.0,2.5);
// re-calculate invariant mass
m = invm2(gamma1.p, gamma2.p);
cout << "After entering ECAL:" << endl;
cout << "P4( gamma1 ) = "; gamma1.print();
cout << "P4( gamma2 ) = "; gamma2.print();
cout << "m = " << m << endl;
cout << "_________________________________________________________________" << endl;
}
return 0;
}