1#include "GaudiKernel/MsgStream.h"
2#include "GaudiKernel/AlgFactory.h"
3#include "GaudiKernel/ISvcLocator.h"
4#include "GaudiKernel/SmartDataPtr.h"
5#include "GaudiKernel/IDataProviderSvc.h"
6#include "GaudiKernel/PropertyMgr.h"
17#include "GaudiKernel/INTupleSvc.h"
18#include "GaudiKernel/NTuple.h"
19#include "GaudiKernel/Bootstrap.h"
20#include "GaudiKernel/IHistogramSvc.h"
21#include "CLHEP/Vector/ThreeVector.h"
22#include "CLHEP/Vector/LorentzVector.h"
23#include "CLHEP/Vector/TwoVector.h"
24using CLHEP::Hep3Vector;
25using CLHEP::Hep2Vector;
26using CLHEP::HepLorentzVector;
27#include "CLHEP/Geometry/Point3D.h"
28#ifndef ENABLE_BACKWARDS_COMPATIBILITY
40const double mpi = 0.13957;
42const double mk = 0.493677;
43const double xmass[5] = {0.000511, 0.105658, 0.139570,0.493677, 0.938272};
46typedef std::vector<int>
Vint;
47typedef std::vector<HepLorentzVector>
Vp4;
57 Algorithm(name, pSvcLocator) {
62 for(
int i = 0; i < 12; i++) m_pass[i] = 0;
65 declareProperty(
"Vr0cut", m_vr0cut=5.0);
66 declareProperty(
"Vz0cut", m_vz0cut=15.0);
67 declareProperty(
"EnergyThreshold", m_energyThreshold=0.03);
68 declareProperty(
"GammaPhiCut", m_gammaPhiCut=20.0);
69 declareProperty(
"GammaThetaCut", m_gammaThetaCut=20.0);
74 MsgStream log(
msgSvc(), name());
76 log << MSG::INFO <<
"in initialize()" << endmsg;
80 status = service(
"THistSvc", m_thistsvc);
81 if(status.isFailure() ){
82 log << MSG::INFO <<
"Unable to retrieve pointer to THistSvc" << endreq;
85 m_pi_vx =
new TH1F(
"pi_vx",
"pi_vx", 100,-1.0,1.0 );
86 status = m_thistsvc->regHist(
"/VAL/PHY/pi_vx", m_pi_vx);
87 m_pi_vy =
new TH1F(
"pi_vy",
"pi_vy", 100,-1.0,1.0 );
88 status = m_thistsvc->regHist(
"/VAL/PHY/pi_vy", m_pi_vy);
89 m_pi_vz =
new TH1F(
"pi_vz",
"pi_vz", 100,-6.0,6.0 );
90 status = m_thistsvc->regHist(
"/VAL/PHY/pi_vz", m_pi_vz);
91 m_pip_mom =
new TH1F(
"pip_mom",
"pip_moment", 100,0.0,1.6 );
92 status = m_thistsvc->regHist(
"/VAL/PHY/pip_mom", m_pip_mom);
93 m_pim_mom =
new TH1F(
"pim_mom",
"pim_moment", 100,0.0,1.6 );
94 status = m_thistsvc->regHist(
"/VAL/PHY/pim_mom", m_pim_mom);
95 m_rhop_mass =
new TH1F(
"rhop_mass",
"rhop_mass", 100,0.0,1.5 );
96 status = m_thistsvc->regHist(
"/VAL/PHY/rhop_mass", m_rhop_mass);
97 m_rhom_mass =
new TH1F(
"rhom_mass",
"rhom_mass", 100,0.0,1.5 );
98 status = m_thistsvc->regHist(
"/VAL/PHY/rhom_mass", m_rhom_mass);
99 m_rho0_mass =
new TH1F(
"rho0_mass",
"rho0_mass", 100,0.0,1.5 );
100 status = m_thistsvc->regHist(
"/VAL/PHY/rho0_mass", m_rho0_mass);
101 m_pi0_mass =
new TH1F(
"pi0_mass",
"pi0_mass", 100,0.0,0.5 );
102 status = m_thistsvc->regHist(
"/VAL/PHY/pi0_mass", m_pi0_mass);
103 m_chisq_4c =
new TH1F(
"chisq_4c",
"chisq_4c", 100,0.0,150. );
104 status = m_thistsvc->regHist(
"/VAL/PHY/chisq_4c", m_chisq_4c);
105 m_chisq_5c =
new TH1F(
"chisq_5c",
"chisq_5c", 100,0.0,150. );
106 status = m_thistsvc->regHist(
"/VAL/PHY/chisq_5c", m_chisq_5c);
108 m_cos_pip =
new TH1F(
"cos_pip",
"cos_pip", 100, -1.0,1.0);
109 status = m_thistsvc->regHist(
"/VAL/PHY/cos_pip", m_cos_pip);
110 m_cos_pim =
new TH1F(
"cos_pim",
"cos_pim", 100, -1.0,1.0);
111 status = m_thistsvc->regHist(
"/VAL/PHY/cos_pim", m_cos_pim);
113 m_chipi_dedx =
new TH1F(
"chipi_dedx",
"chipi_dedx", 60,-5.0,10. );
114 status = m_thistsvc->regHist(
"/VAL/PHY/chipi_dedx", m_chipi_dedx);
115 m_chie_dedx =
new TH1F(
"chie_dedx",
"chie_dedx", 60,-15.0,5. );
116 status = m_thistsvc->regHist(
"/VAL/PHY/chie_dedx", m_chie_dedx);
117 m_chimu_dedx =
new TH1F(
"chimu_dedx",
"chimu_dedx", 60,-5.0,10. );
118 status = m_thistsvc->regHist(
"/VAL/PHY/chimu_dedx", m_chimu_dedx);
119 m_chik_dedx =
new TH1F(
"chik_dedx",
"chik_dedx", 100,-20.0,10. );
120 status = m_thistsvc->regHist(
"/VAL/PHY/chik_dedx", m_chik_dedx);
121 m_chip_dedx =
new TH1F(
"chip_dedx",
"chip_dedx", 100,-20.0,5. );
122 status = m_thistsvc->regHist(
"/VAL/PHY/chip_dedx", m_chip_dedx);
125 if ( nt4 ) m_tuple4 = nt4;
127 m_tuple4 =
ntupleSvc()->book (
"FILE1/h4", CLID_ColumnWiseTuple,
"4gam6pi Ntuple");
129 status = m_tuple4->addItem (
"ngam", m_ngoodneu);
130 status = m_tuple4->addItem (
"npip", m_npip);
131 status = m_tuple4->addItem (
"npim", m_npim);
132 status = m_tuple4->addItem (
"ngoodch", m_ngoodch);
133 status = m_tuple4->addItem (
"chisq4c", m_chisq4c);
134 status = m_tuple4->addItem (
"ppi04c", m_ppi0);
135 status = m_tuple4->addItem (
"mpi04c", m_mpi0);
136 status = m_tuple4->addItem (
"chisq5c", m_chisq5c);
137 status = m_tuple4->addItem (
"ppi05c", m_ppi0fit);
138 status = m_tuple4->addItem (
"mpi05c", m_mpi0fit);
139 status = m_tuple4->addItem (
"g1inpi0the", m_g1inpi0the);
140 status = m_tuple4->addItem (
"g2inpi0the", m_g2inpi0the);
141 status = m_tuple4->addItem (
"theta2pi", m_theta2pi);
142 status = m_tuple4->addItem (
"ppip", m_ppip);
143 status = m_tuple4->addItem (
"ppim", m_ppim);
144 status = m_tuple4->addItem (
"p2pi", m_p2pi);
145 status = m_tuple4->addItem (
"m2pi", m_m2pi);
146 status = m_tuple4->addItem (
"ppip0", m_ppip0);
147 status = m_tuple4->addItem (
"mpip0", m_mpip0);
148 status = m_tuple4->addItem (
"ppim0", m_ppim0);
149 status = m_tuple4->addItem (
"mpim0", m_mpim0);
150 status = m_tuple4->addItem (
"eneumiss", m_eneumiss);
151 status = m_tuple4->addItem (
"pneumiss", m_pneumiss);
152 status = m_tuple4->addItem (
"mneumiss", m_mneumiss);
156 log << MSG::ERROR <<
" Cannot book N-tuple:" << long(m_tuple4) << endmsg;
157 return StatusCode::FAILURE;
162 if ( nt5 ) m_tuple5 = nt5;
164 m_tuple5 =
ntupleSvc()->book (
"FILE1/h5", CLID_ColumnWiseTuple,
"4gam6pi Ntuple");
166 status = m_tuple5->addItem (
"m2graw", m_m2graw);
167 status = m_tuple5->addItem (
"emiss", m_emiss);
168 status = m_tuple5->addItem (
"pmiss", m_pmiss);
169 status = m_tuple5->addItem (
"mmiss", m_mmiss);
170 status = m_tuple5->addItem (
"prho0", m_prho0);
171 status = m_tuple5->addItem (
"mrho0", m_mrho0);
172 status = m_tuple5->addItem (
"pmrho0", m_pmrho0);
173 status = m_tuple5->addItem (
"mmrho0", m_mmrho0);
174 status = m_tuple5->addItem (
"prhop", m_prhop);
175 status = m_tuple5->addItem (
"mrhop", m_mrhop);
176 status = m_tuple5->addItem (
"pmrhom", m_pmrhom);
177 status = m_tuple5->addItem (
"mmrhom", m_mmrhom);
178 status = m_tuple5->addItem (
"prhom", m_prhom);
179 status = m_tuple5->addItem (
"ppipraw", m_ppipraw);
180 status = m_tuple5->addItem (
"mrhom", m_mrhom);
184 log << MSG::ERROR <<
" Cannot book N-tuple:" << long(m_tuple4) << endmsg;
185 return StatusCode::FAILURE;
194 log << MSG::INFO <<
"successfully return from initialize()" <<endmsg;
195 return StatusCode::SUCCESS;
202 StatusCode sc = StatusCode::SUCCESS;
204 MsgStream log(
msgSvc(), name());
209 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),
"/Event/EventHeader");
220 Vint ipip, ipim, iGood;
230 for(
int i = 0; i < evtRecEvent->totalCharged(); i++){
232 if(!(*itTrk)->isMdcTrackValid())
continue;
235 m_pi_vx->Fill(mdcTrk->
x());
236 m_pi_vy->Fill(mdcTrk->
y());
237 m_pi_vz->Fill(mdcTrk->
z());
239 if(fabs(mdcTrk->
z()) >= m_vz0cut)
continue;
240 if(mdcTrk->
r() >= m_vr0cut)
continue;
241 iGood.push_back((*itTrk)->trackId());
242 TotCharge += mdcTrk->
charge();
247 int nGood = iGood.size();
252 for(
int i = evtRecEvent->totalCharged(); i< evtRecEvent->totalTracks(); i++) {
254 if(!(*itTrk)->isEmcShowerValid())
continue;
256 Hep3Vector emcpos(emcTrk->
x(), emcTrk->
y(), emcTrk->
z());
261 for(
int j = 0; j < evtRecEvent->totalCharged(); j++) {
263 if(!(*jtTrk)->isExtTrackValid())
continue;
268 double angd = extpos.angle(emcpos);
269 double thed = extpos.theta() - emcpos.theta();
270 double phid = extpos.deltaPhi(emcpos);
271 thed = fmod(thed+CLHEP::twopi+CLHEP::twopi+
pi, CLHEP::twopi) - CLHEP::pi;
272 phid = fmod(phid+CLHEP::twopi+CLHEP::twopi+
pi, CLHEP::twopi) - CLHEP::pi;
273 angd = fmod(angd, CLHEP::twopi);
282 if(dang >= 200.)
continue;
284 double eraw = emcTrk->
energy();
285 dthe = dthe * 180 / (CLHEP::pi);
286 dphi = dphi * 180 / (CLHEP::pi);
287 dang = dang * 180 / (CLHEP::pi);
288 if(eraw < m_energyThreshold)
continue;
293 iGam.push_back((*itTrk)->trackId());
298 int nGam = iGam.size();
304 HepLorentzVector ptcharg, ptneu, ptchargp, ptchargm;
307 for(
int i = 0; i < nGam; i++) {
310 double eraw = emcTrk->
energy();
311 double phi = emcTrk->
phi();
312 double the = emcTrk->
theta();
313 HepLorentzVector
ptrk;
318 pGam.push_back(
ptrk);
324 for(
int i = 0; i < nGood; i++) {
326 if(!(*itTrk)->isMdcTrackValid())
continue;
327 if(!(*itTrk)->isMdcDedxValid())
continue;
330 m_chie_dedx ->
Fill(dedxTrk->
chiE());
333 m_chik_dedx ->
Fill(dedxTrk->
chiK());
334 m_chip_dedx ->
Fill(dedxTrk->
chiP());
344 for(
int i = 0; i < nGood; i++) {
356 if(!(*itTrk)->isMdcKalTrackValid()) continue ;
360 TotQ += mdcKalTrk->
charge();
367 HepLorentzVector
ptrk;
368 ptrk.setPx(mdcKalTrk->
px());
369 ptrk.setPy(mdcKalTrk->
py());
370 ptrk.setPz(mdcKalTrk->
pz());
371 double p3 =
ptrk.mag();
374 ipip.push_back(iGood[i]);
375 ppip.push_back(
ptrk);
377 ipim.push_back(iGood[i]);
378 ppim.push_back(
ptrk);
382 int npip = ipip.size();
383 int npim = ipim.size();
387 if(nGood != 2 || TotCharge!=0)
return sc;
389 if(nGam<2 )
return sc;
395 HepLorentzVector BoostP(0.0,0.0,0.0,
ecms);
396 BoostP[0] = 2*
sin(0.011)*(
ecms/2);
397 Hep3Vector u_Boost = -BoostP.boostVector();
403 HepLorentzVector p2g, ppi0;
404 double delmpi = 999.;
405 int ig11=-1, ig21=-1;
407 for(
int i = 0; i < nGam - 1; i++){
408 for(
int j = i+1; j < nGam; j++) {
409 HepLorentzVector ppi0 = pGam[i] + pGam[j];
410 if(fabs(ppi0.m()-
mpi0c) > delmpi)
continue;
411 if(ppi0.m() > 0.2)
continue;
412 delmpi = fabs(ppi0.m()-
mpi0c);
417 if(ig11==-1 || ig21== -1)
return sc;
418 p2g = pGam[ig11] + pGam[ig21];
421 HepLorentzVector Ppip1 = ppip[0];
422 Ppip1.boost(u_Boost);
430 HepLorentzVector Pmiss = -Ppip1 - p2g;
431 m_pmiss = Pmiss.rho();
432 double emiss =
ecms - Ppip1.e() - p2g.e();
434 m_mmiss = sqrt(fabs(emiss*emiss - Pmiss.rho()*Pmiss.rho()));
436 HepLorentzVector Prho0, Prhop, Prhom, pmisspi, ptot;
437 pmisspi.setPx(Pmiss.px());
438 pmisspi.setPy(Pmiss.py());
439 pmisspi.setPz(Pmiss.pz());
442 Prho0 = Ppip1 + pmisspi;
444 Prhom = pmisspi + p2g;
445 ptot = Ppip1 + pmisspi + p2g;
447 m_pmrho0 = Prho0.rho();
448 m_mmrho0 = Prho0.m();
451 m_prhop = Prhop.rho();
455 m_pmrhom = Prhom.rho();
456 m_mmrhom = Prhom.m();
457 m_ppipraw = Ppip1.rho();
462 if(npip*npim != 1)
return sc;
465 HepLorentzVector Ppim1 = ppim[0];
466 Ppim1.boost(u_Boost);
467 HepLorentzVector Ppip1 = ppip[0];
468 Ppip1.boost(u_Boost);
470 HepLorentzVector Pneumiss = -(Ppim1 + Ppip1);
471 m_pneumiss = Pneumiss.rho();
472 double eneumiss =
ecms - Ppim1.e() - Ppip1.e();
473 m_eneumiss = eneumiss;
474 m_mneumiss = sqrt(fabs(eneumiss*eneumiss - Pneumiss.rho()*Pneumiss.rho()));
480 HepSymMatrix Evx(3, 0);
495 RecMdcKalTrack *pipTrk = (*(evtRecTrkCol->begin()+ipip[0]))->mdcKalTrack();
502 RecMdcKalTrack *pimTrk = (*(evtRecTrkCol->begin()+ipim[0]))->mdcKalTrack();
514 if(!vtxfit->
Fit(0))
return sc;
527 double chisq4c = 9999.;
532 for(
int i = 0; i < nGam-1; i++) {
533 RecEmcShower *g1Trk = (*(evtRecTrkCol->begin()+iGam[i]))->emcShower();
534 for(
int j = i+1; j < nGam; j++) {
535 RecEmcShower *g2Trk = (*(evtRecTrkCol->begin()+iGam[j]))->emcShower();
544 if(!kmfit->
Fit())
continue;
545 double chi2 = kmfit->
chisq();
546 if(chi2 > chisq4c)
continue;
554 if(chisq4c > 500 || ig1 < 0)
return sc;
555 RecEmcShower *g1Trk = (*(evtRecTrkCol->begin()+iGam[ig1]))->emcShower();
556 RecEmcShower *g2Trk = (*(evtRecTrkCol->begin()+iGam[ig2]))->emcShower();
564 if(!kmfit->
Fit())
return sc;
565 double chi = kmfit->
chisq();
567 m_chisq_4c ->
Fill(chi);
569 HepLorentzVector p2gam = kmfit->
pfit(2) + kmfit->
pfit(3);
573 m_pi0_mass ->
Fill(p2gam.m());
590 if(!kmfit->
Fit())
return sc;
591 double chis = kmfit->
chisq();
597 double chisk5c = 9999.;
616 if(kmfit->
Fit()) chisk5c = kmfit->
chisq();
618 if(chisk5c<chis)
return sc;
631 if(!kmfit->
Fit(0))
return sc;
632 if(!kmfit->
Fit())
return sc;
635 m_chisq5c = kmfit->
chisq();
639 HepLorentzVector ppi1 = kmfit->
pfit(0);
640 HepLorentzVector ppi2 = kmfit->
pfit(1);
641 HepLorentzVector pgam1 = kmfit->
pfit(2);
642 HepLorentzVector pgam2 = kmfit->
pfit(3);
643 HepLorentzVector p2gam1 = kmfit->
pfit(2) + kmfit->
pfit(3);
644 HepLorentzVector p2pi = kmfit->
pfit(0) + kmfit->
pfit(1);
645 m_ppi0fit = p2gam1.rho();
646 m_mpi0fit = p2gam1.m();
651 m_ppip0 = (ppi1+p2gam1).rho();
652 m_mpip0 = (ppi1+p2gam1).m();
653 m_ppim0 = (ppi2+p2gam1).rho();
654 m_mpim0 = (ppi2+p2gam1).m();
656 m_pip_mom ->
Fill(ppi1.rho());
657 m_pim_mom ->
Fill(ppi2.rho());
658 m_rho0_mass ->
Fill(p2pi.m());
659 m_rhop_mass ->
Fill((ppi1+p2gam1).m());
660 m_rhom_mass ->
Fill((ppi2+p2gam1).m());
663 double theta2pi= ppi1.px()*ppi2.px()+ppi1.py()*ppi2.py()+ppi1.pz()*ppi2.pz();
664 double time2pi = ppi1.rho()*ppi2.rho();
665 if(time2pi == 0.)
return sc;
669 theta2pi = theta2pi/time2pi;
673 if(theta2pi <= -1.) theta2pi=180.;
674 else if(theta2pi >= 1.) theta2pi=0.;
675 else if(fabs(theta2pi) < 1.) theta2pi = acos(theta2pi)*180./3.14159;
679 HepLorentzVector pg1inpi0, pg2inpi0;
682 double betapi0 = p2gam1.beta();
684 Hep3Vector twogam(p2gam.px(),p2gam.py(),p2gam.pz());
686 m_g1inpi0the = ((boostOf(pgam1,twogam/p2gam.rho(),betapi0)).theta())*180./3.14159;
687 m_g2inpi0the = ((boostOf(pgam2,twogam/p2gam.rho(),betapi0)).theta())*180./3.14159;
728 return StatusCode::SUCCESS;
734 MsgStream log(
msgSvc(), name());
735 log << MSG::ALWAYS <<
"Total Entries : " << m_pass[0] << endreq;
736 log << MSG::ALWAYS <<
"Ncharge=2 Cut : " << m_pass[1] << endreq;
737 log << MSG::ALWAYS <<
"Ngam<2 cut : " << m_pass[2] << endreq;
738 log << MSG::ALWAYS <<
"Nch+=1,Nch-=1 cut : " << m_pass[3] << endreq;
739 log << MSG::ALWAYS <<
"Vertex Fit : " << m_pass[4] << endreq;
740 log << MSG::ALWAYS <<
"4c-Fit : " << m_pass[5] << endreq;
741 log << MSG::ALWAYS <<
"5c-Fit : " << m_pass[6] << endreq;
742 log << MSG::ALWAYS <<
"chi3pi<chikkpi cut : " << m_pass[7] << endreq;
743 log << MSG::ALWAYS <<
"5c-Fit Again: " << m_pass[8] << endreq;
744 log << MSG::ALWAYS <<
"Final : " << m_pass[9] << endreq;
745 return StatusCode::SUCCESS;
double sin(const BesAngle a)
double cos(const BesAngle a)
EvtRecTrackCol::iterator EvtRecTrackIterator
std::vector< HepLorentzVector > Vp4
const Hep3Vector emcPosition() const
const int emcVolumeNumber() const
const HepVector & helix() const
static void setPidType(PidType pidType)
const HepSymMatrix & err() const
static KinematicFit * instance()
void AddResonance(int number, double mres, std::vector< int > tlis)
void AddFourMomentum(int number, HepLorentzVector p4)
HepLorentzVector pfit(int n) const
int methodProbability() const
void setChiMinCut(const double chi=4)
void setRecTrack(EvtRecTrack *trk)
void setMethod(const int method)
void identify(const int pidcase)
void usePidSys(const int pidsys)
static ParticleID * instance()
bool IsPidInfoValid() const
void AddTrack(const int number, const double mass, const RecMdcTrack *trk)
WTrackParameter wtrk(int n) const
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
static VertexFit * instance()
void setEvx(const HepSymMatrix &eVx)
void setVx(const HepPoint3D &vx)
rhopi(EvtVector4R pd1, EvtVector4R pd2, EvtVector4R pd3)
_EXTERN_ std::string EvtRecEvent
_EXTERN_ std::string EvtRecTrackCol
HepGeom::Point3D< double > HepPoint3D
std::vector< HepLorentzVector > Vp4