13 #include <TDirectoryFile.h>
14 #include <TLorentzVector.h>
16 #include <JANA/JApplication.h>
17 #include <JANA/JEventLoop.h>
23 #include <PID/DPhoton.h>
53 TDirectory *
dir =
new TDirectoryFile(
"INV_MASS",
"INV_MASS");
57 mm_gp_to_pX =
new TH1D(
"mm_gp_to_pX",
"Missing mass from #gamma p -> p X",4001, 0.0, 4.0);
58 mm_gp_to_pX->SetXTitle(
"Missing mass (GeV)");
60 mass_2gamma =
new TH1D(
"mass_2gamma",
"2 #gamma invariant mass",4001, 0.0, 4.0);
61 mass_2gamma->SetXTitle(
"Invariant Mass (GeV/c^{2})");
63 mass_4gamma =
new TH1D(
"mass_4gamma",
"4 #gamma invariant mass",4001, 0.0, 4.0);
64 mass_4gamma->SetXTitle(
"Invariant Mass (GeV/c^{2})");
66 mass_pip_pim =
new TH1D(
"mass_pip_pim",
"invariant mass of #pi^{+} and #pi^{-}",4001, 0.0, 4.0);
67 mass_pip_pim->SetXTitle(
"Invariant Mass (GeV/c^{2})");
69 t_pX =
new TH1D(
"t_pX",
"-t for #gammap->pX",20, 0.0, 6.0);
70 t_pX->SetXTitle(
"-t (GeV)");
72 sqrt_s =
new TH1D(
"sqrt_s",
"Center of mass energy #sqrt{s}",2001, 0.0, 6.0);
73 sqrt_s->SetXTitle(
"#sqrt{s} C.M. energy (GeV)");
78 pthread_mutex_init(&mutex, NULL);
89 vector<const DBeamPhoton*> beam_photons;
90 vector<const DPhoton*> photons;
91 vector<const DChargedTrack*> chargedtracks;
93 loop->Get(beam_photons);
95 loop->Get(chargedtracks);
98 TLorentzVector target(0.0, 0.0, 0.0, 0.93827);
101 vector<TLorentzVector> rec_photons;
102 for(
unsigned int j=0; j<photons.size(); j++)rec_photons.push_back(MakeTLorentz(photons[j], 0.0));
105 vector<TLorentzVector> rec_piplus;
106 vector<TLorentzVector> rec_piminus;
107 vector<TLorentzVector> rec_protons;
111 for(
unsigned int j=0; j<chargedtracks.size(); j++){
112 if(chargedtracks[j]->hypotheses.size()<1)
continue;
117 if(fabs(trk->
mass()-0.13957)<0.01){
118 type = trk->
charge()<0.0 ? 9:8;
119 }
else if(fabs(trk->
mass()-0.93827)<0.01 && trk->
charge()==1.0){
125 case 8: rec_piplus.push_back(MakeTLorentz(trk, 0.13957));
break;
126 case 9: rec_piminus.push_back(MakeTLorentz(trk, 0.13957));
break;
127 case 14: rec_protons.push_back(MakeTLorentz(trk, 0.93827));
break;
129 cout<<
"Unknown particle mass: "<<trk->
mass()<<
" for charge "<<trk->
charge()<<endl;
136 if(beam_photons.size()==0){
144 beam_photons.push_back(&beam);
150 pthread_mutex_lock(&mutex);
153 for(
unsigned int i=0; i<beam_photons.size(); i++){
156 TLorentzVector beam_photon = MakeTLorentz(beam_photons[i], 0.0);
159 sqrt_s->Fill((beam_photon+target).M());
162 if(rec_protons.size()==1){
163 TLorentzVector missing = beam_photon + target - rec_protons[0];
164 mm_gp_to_pX->Fill(missing.M());
175 for(
unsigned int j=1; j<rec_photons.size(); j++){
176 for(
unsigned int k=0; k<j; k++){
177 TLorentzVector
sum = rec_photons[j] + rec_photons[k];
178 mass_2gamma->Fill(sum.M());
183 for(
unsigned int j=3; j<rec_photons.size(); j++){
184 for(
unsigned int k=2; k<j; k++){
185 for(
unsigned int l=1; l<k; l++){
186 for(
unsigned int m=0; m<l; m++){
187 TLorentzVector
sum = rec_photons[j] + rec_photons[k] + rec_photons[l] + rec_photons[m];
188 mass_4gamma->Fill(sum.M());
195 for(
unsigned int j=0; j<rec_piplus.size(); j++){
196 for(
unsigned int k=0; k<rec_piminus.size(); k++){
197 mass_pip_pim->Fill( (rec_piplus[j] + rec_piminus[k]).M() );
202 if(rec_protons.size()==1){
203 TLorentzVector beam_photon = beam_photons.size()>0 ? MakeTLorentz(beam_photons[0], 0.0):TLorentzVector(0.0, 0.0, 0.0, 9.0);
204 TLorentzVector &proton = rec_protons[0];
205 TLorentzVector p3 = beam_photon + target - proton;
206 double t = (beam_photon - p3).Mag2();
210 pthread_mutex_unlock(&mutex);
226 double theta = kd->
momentum().Theta();
228 double px = p*
sin(theta)*cos(phi);
230 double pz = p*cos(theta);
231 double E =
sqrt(mass*mass + p*p);
233 return TLorentzVector(px,py,pz,E);
void setMomentum(const DVector3 &aMomentum)
jerror_t init(void)
Invoked via DEventProcessor virtual method.
TLorentzVector MakeTLorentz(const DKinematicData *track, double mass)
jerror_t fini(void)
Invoked via DEventProcessor virtual method.
jerror_t evnt(JEventLoop *loop, uint64_t eventnumber)
Invoked via DEventProcessor virtual method.
double charge(void) const
const DVector3 & momentum(void) const
jerror_t erun(void)
Invoked via DEventProcessor virtual method.
void setPosition(const DVector3 &aPosition)