BOSS 7.1.0
BESIII Offline Software System
Loading...
Searching...
No Matches
rhopi.cxx
Go to the documentation of this file.
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"
7
9#include "EventModel/Event.h"
10
15
16#include "TMath.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
30#endif
31
33#include "VertexFit/VertexFit.h"
35
37
38#include <vector>
39
40const double mpi0c = 0.1349766;
41const double mpi = 0.13957;
42const double ecms = 3.097;
43const double mk = 0.493677;
44const double xmass[5] = {0.000511, 0.105658, 0.139570,0.493677, 0.938272};
45// e mu pi K p
46
47typedef std::vector<int> Vint;
48typedef std::vector<HepLorentzVector> Vp4;
49
50/////////////////////////////////////////////////////////////////////////////
51// //
52// J/psi-->rho + pi //
53// |-->pi pi //
54// //
55// Final : (2Gamma + 2pi) xugf 2008.09 //
56/////////////////////////////////////////////////////////////////////////////
57DECLARE_COMPONENT(rhopi)
58rhopi::rhopi(const std::string& name, ISvcLocator* pSvcLocator) :
59 Algorithm(name, pSvcLocator) {
60
61 m_tuple4 = 0;
62 m_tuple5 = 0;
63
64 for(int i = 0; i < 12; i++) m_pass[i] = 0;
65
66//Declare the properties
67 declareProperty("Vr0cut", m_vr0cut=5.0);
68 declareProperty("Vz0cut", m_vz0cut=15.0);
69 declareProperty("EnergyThreshold", m_energyThreshold=0.03);
70 declareProperty("GammaPhiCut", m_gammaPhiCut=20.0);
71 declareProperty("GammaThetaCut", m_gammaThetaCut=20.0);
72}
73
74// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
75StatusCode rhopi::initialize(){
76 MsgStream log(msgSvc(), name());
77
78 log << MSG::INFO << "in initialize()" << endmsg;
79
80 StatusCode status;
81
82 status = service("THistSvc", m_thistsvc);
83 if(status.isFailure() ){
84 log << MSG::INFO << "Unable to retrieve pointer to THistSvc" << endreq;
85 return status;
86 }
87 m_pi_vx = new TH1F( "pi_vx", "pi_vx", 100,-1.0,1.0 );
88 status = m_thistsvc->regHist("/VAL/PHY/pi_vx", m_pi_vx);
89 m_pi_vy = new TH1F( "pi_vy", "pi_vy", 100,-1.0,1.0 );
90 status = m_thistsvc->regHist("/VAL/PHY/pi_vy", m_pi_vy);
91 m_pi_vz = new TH1F( "pi_vz", "pi_vz", 100,-6.0,6.0 );
92 status = m_thistsvc->regHist("/VAL/PHY/pi_vz", m_pi_vz);
93 m_pip_mom = new TH1F( "pip_mom", "pip_moment", 100,0.0,1.6 );
94 status = m_thistsvc->regHist("/VAL/PHY/pip_mom", m_pip_mom);
95 m_pim_mom = new TH1F( "pim_mom", "pim_moment", 100,0.0,1.6 );
96 status = m_thistsvc->regHist("/VAL/PHY/pim_mom", m_pim_mom);
97 m_rhop_mass = new TH1F( "rhop_mass", "rhop_mass", 100,0.0,1.5 );
98 status = m_thistsvc->regHist("/VAL/PHY/rhop_mass", m_rhop_mass);
99 m_rhom_mass = new TH1F( "rhom_mass", "rhom_mass", 100,0.0,1.5 );
100 status = m_thistsvc->regHist("/VAL/PHY/rhom_mass", m_rhom_mass);
101 m_rho0_mass = new TH1F( "rho0_mass", "rho0_mass", 100,0.0,1.5 );
102 status = m_thistsvc->regHist("/VAL/PHY/rho0_mass", m_rho0_mass);
103 m_pi0_mass = new TH1F( "pi0_mass", "pi0_mass", 100,0.0,0.5 );
104 status = m_thistsvc->regHist("/VAL/PHY/pi0_mass", m_pi0_mass);
105 m_chisq_4c = new TH1F( "chisq_4c", "chisq_4c", 100,0.0,150. );
106 status = m_thistsvc->regHist("/VAL/PHY/chisq_4c", m_chisq_4c);
107 m_chisq_5c = new TH1F( "chisq_5c", "chisq_5c", 100,0.0,150. );
108 status = m_thistsvc->regHist("/VAL/PHY/chisq_5c", m_chisq_5c);
109
110 m_cos_pip = new TH1F( "cos_pip", "cos_pip", 100, -1.0,1.0);
111 status = m_thistsvc->regHist("/VAL/PHY/cos_pip", m_cos_pip);
112 m_cos_pim = new TH1F( "cos_pim", "cos_pim", 100, -1.0,1.0);
113 status = m_thistsvc->regHist("/VAL/PHY/cos_pim", m_cos_pim);
114
115 m_chipi_dedx = new TH1F( "chipi_dedx", "chipi_dedx", 60,-5.0,10. );
116 status = m_thistsvc->regHist("/VAL/PHY/chipi_dedx", m_chipi_dedx);
117 m_chie_dedx = new TH1F( "chie_dedx", "chie_dedx", 60,-15.0,5. );
118 status = m_thistsvc->regHist("/VAL/PHY/chie_dedx", m_chie_dedx);
119 m_chimu_dedx = new TH1F( "chimu_dedx", "chimu_dedx", 60,-5.0,10. );
120 status = m_thistsvc->regHist("/VAL/PHY/chimu_dedx", m_chimu_dedx);
121 m_chik_dedx = new TH1F( "chik_dedx", "chik_dedx", 100,-20.0,10. );
122 status = m_thistsvc->regHist("/VAL/PHY/chik_dedx", m_chik_dedx);
123 m_chip_dedx = new TH1F( "chip_dedx", "chip_dedx", 100,-20.0,5. );
124 status = m_thistsvc->regHist("/VAL/PHY/chip_dedx", m_chip_dedx);
125
126 NTuplePtr nt4(ntupleSvc(), "FILE1/h4");
127 if ( nt4 ) m_tuple4 = nt4;
128 else {
129 m_tuple4 = ntupleSvc()->book ("FILE1/h4", CLID_ColumnWiseTuple, "4gam6pi Ntuple");
130 if ( m_tuple4 ) {
131 status = m_tuple4->addItem ("ngam", m_ngoodneu);
132 status = m_tuple4->addItem ("npip", m_npip);
133 status = m_tuple4->addItem ("npim", m_npim);
134 status = m_tuple4->addItem ("ngoodch", m_ngoodch);
135 status = m_tuple4->addItem ("chisq4c", m_chisq4c);
136 status = m_tuple4->addItem ("ppi04c", m_ppi0);
137 status = m_tuple4->addItem ("mpi04c", m_mpi0);
138 status = m_tuple4->addItem ("chisq5c", m_chisq5c);
139 status = m_tuple4->addItem ("ppi05c", m_ppi0fit);
140 status = m_tuple4->addItem ("mpi05c", m_mpi0fit);
141 status = m_tuple4->addItem ("g1inpi0the", m_g1inpi0the);
142 status = m_tuple4->addItem ("g2inpi0the", m_g2inpi0the);
143 status = m_tuple4->addItem ("theta2pi", m_theta2pi);
144 status = m_tuple4->addItem ("ppip", m_ppip);
145 status = m_tuple4->addItem ("ppim", m_ppim);
146 status = m_tuple4->addItem ("p2pi", m_p2pi);
147 status = m_tuple4->addItem ("m2pi", m_m2pi);
148 status = m_tuple4->addItem ("ppip0", m_ppip0);
149 status = m_tuple4->addItem ("mpip0", m_mpip0);
150 status = m_tuple4->addItem ("ppim0", m_ppim0);
151 status = m_tuple4->addItem ("mpim0", m_mpim0);
152 status = m_tuple4->addItem ("eneumiss", m_eneumiss);
153 status = m_tuple4->addItem ("pneumiss", m_pneumiss);
154 status = m_tuple4->addItem ("mneumiss", m_mneumiss);
155// status = m_tuple4->addIndexedItem ("kal_cos", m_ngoodch , m_kal_cos);
156 }
157 else {
158 log << MSG::ERROR << " Cannot book N-tuple:" << long(m_tuple4) << endmsg;
159 return StatusCode::FAILURE;
160 }
161 }
162
163 NTuplePtr nt5(ntupleSvc(), "FILE1/h5");
164 if ( nt5 ) m_tuple5 = nt5;
165 else {
166 m_tuple5 = ntupleSvc()->book ("FILE1/h5", CLID_ColumnWiseTuple, "4gam6pi Ntuple");
167 if ( m_tuple5 ) {
168 status = m_tuple5->addItem ("m2graw", m_m2graw);
169 status = m_tuple5->addItem ("emiss", m_emiss);
170 status = m_tuple5->addItem ("pmiss", m_pmiss);
171 status = m_tuple5->addItem ("mmiss", m_mmiss);
172 status = m_tuple5->addItem ("prho0", m_prho0);
173 status = m_tuple5->addItem ("mrho0", m_mrho0);
174 status = m_tuple5->addItem ("pmrho0", m_pmrho0);
175 status = m_tuple5->addItem ("mmrho0", m_mmrho0);
176 status = m_tuple5->addItem ("prhop", m_prhop);
177 status = m_tuple5->addItem ("mrhop", m_mrhop);
178 status = m_tuple5->addItem ("pmrhom", m_pmrhom);
179 status = m_tuple5->addItem ("mmrhom", m_mmrhom);
180 status = m_tuple5->addItem ("prhom", m_prhom);
181 status = m_tuple5->addItem ("ppipraw", m_ppipraw);
182 status = m_tuple5->addItem ("mrhom", m_mrhom);
183
184 }
185 else {
186 log << MSG::ERROR << " Cannot book N-tuple:" << long(m_tuple4) << endmsg;
187 return StatusCode::FAILURE;
188 }
189 }
190
191
192 //
193 //--------end of book--------
194 //
195
196 log << MSG::INFO << "successfully return from initialize()" <<endmsg;
197 return StatusCode::SUCCESS;
198
199}
200
201// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
202StatusCode rhopi::execute() {
203
204 StatusCode sc = StatusCode::SUCCESS;
205
206 MsgStream log(msgSvc(), name());
207// log << MSG::INFO << "in execute()" << endreq;
208
209 m_pass[0] += 1;
210
211 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
212 //SmartDataPtr<EvtRecEvent> evtRecEvent(eventSvc(), EventModel::Recon::EvtRecEvent);
213 SmartDataPtr<EvtRecEvent> evtRecEvent(eventSvc(), EventModel::EvtRec::EvtRecEvent);
214
215// SmartDataPtr<EvtRecTrackCol> evtRecTrkCol(eventSvc(), EventModel::Recon::EvtRecTrackCol);
216 SmartDataPtr<EvtRecTrackCol> evtRecTrkCol(eventSvc(), EventModel::EvtRec::EvtRecTrackCol);
217 //
218 // check x0, y0, z0, r0
219 // suggest cut: |z0|<10 && r0<5
220 //
221
222 Vint ipip, ipim, iGood;
223 iGood.clear();
224 ipip.clear();
225 ipim.clear();
226
227 Vp4 ppip, ppim;
228 ppip.clear();
229 ppim.clear();
230
231 int TotCharge = 0;
232 for(int i = 0; i < evtRecEvent->totalCharged(); i++){
233 EvtRecTrackIterator itTrk=evtRecTrkCol->begin() + i;
234 if(!(*itTrk)->isMdcTrackValid()) continue;
235 RecMdcTrack *mdcTrk = (*itTrk)->mdcTrack();
236
237 m_pi_vx->Fill(mdcTrk->x());
238 m_pi_vy->Fill(mdcTrk->y());
239 m_pi_vz->Fill(mdcTrk->z());
240
241 if(fabs(mdcTrk->z()) >= m_vz0cut) continue;
242 if(mdcTrk->r() >= m_vr0cut) continue;
243 iGood.push_back((*itTrk)->trackId());
244 TotCharge += mdcTrk->charge();
245 }
246 //
247 // Finish Good Charged Track Selection
248 //
249 int nGood = iGood.size();
250 m_ngoodch = nGood;
251
252 Vint iGam;
253 iGam.clear();
254 for(int i = evtRecEvent->totalCharged(); i< evtRecEvent->totalTracks(); i++) {
255 EvtRecTrackIterator itTrk=evtRecTrkCol->begin() + i;
256 if(!(*itTrk)->isEmcShowerValid()) continue;
257 RecEmcShower *emcTrk = (*itTrk)->emcShower();
258 Hep3Vector emcpos(emcTrk->x(), emcTrk->y(), emcTrk->z());
259 // find the nearest charged track
260 double dthe = 200.;
261 double dphi = 200.;
262 double dang = 200.;
263 for(int j = 0; j < evtRecEvent->totalCharged(); j++) {
264 EvtRecTrackIterator jtTrk = evtRecTrkCol->begin() + j;
265 if(!(*jtTrk)->isExtTrackValid()) continue;
266 RecExtTrack *extTrk = (*jtTrk)->extTrack();
267 if(extTrk->emcVolumeNumber() == -1) continue;
268 Hep3Vector extpos = extTrk->emcPosition();
269 // double ctht = extpos.cosTheta(emcpos);
270 double angd = extpos.angle(emcpos);
271 double thed = extpos.theta() - emcpos.theta();
272 double phid = extpos.deltaPhi(emcpos);
273 thed = fmod(thed+CLHEP::twopi+CLHEP::twopi+pi, CLHEP::twopi) - CLHEP::pi;
274 phid = fmod(phid+CLHEP::twopi+CLHEP::twopi+pi, CLHEP::twopi) - CLHEP::pi;
275 angd = fmod(angd, CLHEP::twopi);
276
277 if(angd < dang){
278 dang = angd;
279 dthe = thed;
280 dphi = phid;
281 }
282 }
283
284 if(dang >= 200.) continue;
285
286 double eraw = emcTrk->energy();
287 dthe = dthe * 180 / (CLHEP::pi);
288 dphi = dphi * 180 / (CLHEP::pi);
289 dang = dang * 180 / (CLHEP::pi);
290 if(eraw < m_energyThreshold) continue;
291// if((fabs(dthe) < m_gammaThetaCut) && (fabs(dphi)<m_gammaPhiCut) ) continue;
292 //
293 // good photon cut will be set here
294 //
295 iGam.push_back((*itTrk)->trackId());
296 }
297 //
298 // Finish Good Photon Selection
299 //
300 int nGam = iGam.size();
301 m_ngoodneu = nGam;
302 //
303 // Assign 4-momentum to each photon
304 //
305
306 HepLorentzVector ptcharg, ptneu, ptchargp, ptchargm;
307 Vp4 pGam;
308 pGam.clear();
309 for(int i = 0; i < nGam; i++) {
310 EvtRecTrackIterator itTrk = evtRecTrkCol->begin() + iGam[i];
311 RecEmcShower* emcTrk = (*itTrk)->emcShower();
312 double eraw = emcTrk->energy();
313 double phi = emcTrk->phi();
314 double the = emcTrk->theta();
315 HepLorentzVector ptrk;
316 ptrk.setPx(eraw*sin(the)*cos(phi));
317 ptrk.setPy(eraw*sin(the)*sin(phi));
318 ptrk.setPz(eraw*cos(the));
319 ptrk.setE(eraw);
320 pGam.push_back(ptrk);
321 }
322
323//
324// Dedx Check ================
325//
326 for(int i = 0; i < nGood; i++) {
327 EvtRecTrackIterator itTrk = evtRecTrkCol->begin() + iGood[i];
328 if(!(*itTrk)->isMdcTrackValid()) continue;
329 if(!(*itTrk)->isMdcDedxValid())continue;
330 RecMdcTrack* mdcTrk = (*itTrk)->mdcTrack();
331 RecMdcDedx* dedxTrk = (*itTrk)->mdcDedx();
332 m_chie_dedx -> Fill(dedxTrk->chiE());
333 m_chimu_dedx -> Fill(dedxTrk->chiMu());
334 m_chipi_dedx -> Fill(dedxTrk->chiPi());
335 m_chik_dedx -> Fill(dedxTrk->chiK());
336 m_chip_dedx -> Fill(dedxTrk->chiP());
337 }
338
339 //
340 // Assign 4-momentum to each charged track
341 //
342
343 int TotQ = 0;
344
346 for(int i = 0; i < nGood; i++) {
347 EvtRecTrackIterator itTrk = evtRecTrkCol->begin() + iGood[i];
348 // if(pid) delete pid;
349 pid->init();
350 pid->setMethod(pid->methodProbability());
351 pid->setChiMinCut(4);
352 pid->setRecTrack(*itTrk);
353 pid->usePidSys(pid->useDedx() | pid->useTof1() | pid->useTof2()); // use PID sub-system
354 pid->identify(pid->onlyPion() | pid->onlyKaon()); // seperater Pion/Kaon
355 pid->calculate();
356 if(!(pid->IsPidInfoValid())) continue;
357
358 if(!(*itTrk)->isMdcKalTrackValid()) continue ;
359 RecMdcKalTrack* mdcKalTrk = (*itTrk)->mdcKalTrack();
360 RecMdcTrack* mdcTrk = (*itTrk)->mdcTrack();
361
362 TotQ += mdcKalTrk->charge();
363
364// RecMdcTrack* mdcTrk = (*itTrk)->mdcTrack();
365
366// if(pid->probPion() < 0.001 || (pid->probPion() < pid->probKaon())) continue;
367 if(pid->probPion() < pid->probKaon()) continue;
369 HepLorentzVector ptrk;
370 ptrk.setPx(mdcKalTrk->px());
371 ptrk.setPy(mdcKalTrk->py());
372 ptrk.setPz(mdcKalTrk->pz());
373 double p3 = ptrk.mag();
374 ptrk.setE(sqrt(p3*p3+mpi*mpi));
375 if(mdcTrk->charge() >0) {
376 ipip.push_back(iGood[i]);
377 ppip.push_back(ptrk);
378 } else {
379 ipim.push_back(iGood[i]);
380 ppim.push_back(ptrk);
381 }
382 }
383
384 int npip = ipip.size();
385 int npim = ipim.size();
386 m_npip = npip;
387 m_npim = npim;
388
389 if(nGood != 2 || TotCharge!=0) return sc;
390 m_pass[1] += 1;
391 if(nGam<2 ) return sc;
392 m_pass[2] += 1;
393
394// if(npip != 1) return sc;
395// if(npip*npim != 1) return sc;
396
397 HepLorentzVector BoostP(0.0,0.0,0.0,ecms);
398 BoostP[0] = 2*sin(0.011)*(ecms/2);
399 Hep3Vector u_Boost = -BoostP.boostVector();
400
401 if(npip == 1) {
402//
403//---- Find the Best Pi0 -----
404//
405 HepLorentzVector p2g, ppi0;
406 double delmpi = 999.;
407 int ig11=-1, ig21=-1;
408
409 for(int i = 0; i < nGam - 1; i++){
410 for(int j = i+1; j < nGam; j++) {
411 HepLorentzVector ppi0 = pGam[i] + pGam[j];
412 if(fabs(ppi0.m()-mpi0c) > delmpi) continue;
413 if(ppi0.m() > 0.2) continue;
414 delmpi = fabs(ppi0.m()-mpi0c);
415 ig11 = i;
416 ig21 = j;
417 }
418 }
419 if(ig11==-1 || ig21== -1) return sc;
420 p2g = pGam[ig11] + pGam[ig21];
421 m_m2graw = p2g.m();
422
423 HepLorentzVector Ppip1 = ppip[0];
424 Ppip1.boost(u_Boost);
425 p2g.boost(u_Boost);
426//
427// ----- Pion Efficiency -----
428//
429//
430//------ Missing pi-
431//
432 HepLorentzVector Pmiss = -Ppip1 - p2g;
433 m_pmiss = Pmiss.rho();
434 double emiss = ecms - Ppip1.e() - p2g.e();
435 m_emiss = emiss;
436 m_mmiss = sqrt(fabs(emiss*emiss - Pmiss.rho()*Pmiss.rho()));
437
438 HepLorentzVector Prho0, Prhop, Prhom, pmisspi, ptot;
439 pmisspi.setPx(Pmiss.px());
440 pmisspi.setPy(Pmiss.py());
441 pmisspi.setPz(Pmiss.pz());
442 pmisspi.setE(emiss);
443
444 Prho0 = Ppip1 + pmisspi;
445 Prhop = Ppip1 + p2g;
446 Prhom = pmisspi + p2g;
447 ptot = Ppip1 + pmisspi + p2g;
448
449 m_pmrho0 = Prho0.rho();
450 m_mmrho0 = Prho0.m();
451// m_prho0 = (Ppip1 + Ppim1).rho();
452// m_mrho0 = (Ppip1 + Ppim1).m();
453 m_prhop = Prhop.rho();
454 m_mrhop = Prhop.m();
455// m_prhom = (p2g + Ppim1).rho();
456// m_mrhom = (p2g + Ppim1).m();
457 m_pmrhom = Prhom.rho();
458 m_mmrhom = Prhom.m();
459 m_ppipraw = Ppip1.rho();
460
461 m_tuple5->write();
462 }
463
464 if(npip*npim != 1) return sc;
465 m_pass[3] += 1;
466
467 HepLorentzVector Ppim1 = ppim[0];
468 Ppim1.boost(u_Boost);
469 HepLorentzVector Ppip1 = ppip[0];
470 Ppip1.boost(u_Boost);
471
472 HepLorentzVector Pneumiss = -(Ppim1 + Ppip1);
473 m_pneumiss = Pneumiss.rho();
474 double eneumiss = ecms - Ppim1.e() - Ppip1.e();
475 m_eneumiss = eneumiss;
476 m_mneumiss = sqrt(fabs(eneumiss*eneumiss - Pneumiss.rho()*Pneumiss.rho()));
477
478//
479// Let's play vertex fit here
480//
481 HepPoint3D vx(0., 0., 0.);
482 HepSymMatrix Evx(3, 0);
483 double bx = 1E+6;
484 double by = 1E+6;
485 double bz = 1E+6;
486 Evx[0][0] = bx*bx;
487 Evx[1][1] = by*by;
488 Evx[2][2] = bz*bz;
489
490 VertexParameter vxpar;
491 vxpar.setVx(vx);
492 vxpar.setEvx(Evx);
493
494 VertexFit* vtxfit = VertexFit::instance();
496
497 RecMdcKalTrack *pipTrk = (*(evtRecTrkCol->begin()+ipip[0]))->mdcKalTrack();
499 WTrackParameter wpip0(mpi, pipTrk->helix(), pipTrk->err());
500
502 WTrackParameter wkp0(mk, pipTrk->helix(), pipTrk->err());
503
504 RecMdcKalTrack *pimTrk = (*(evtRecTrkCol->begin()+ipim[0]))->mdcKalTrack();
506 WTrackParameter wpim0(mpi, pimTrk->helix(), pimTrk->err());
507
509 WTrackParameter wkm0(mk, pimTrk->helix(), pimTrk->err());
510
511
512 vtxfit->init();
513 vtxfit->AddTrack(0, wpip0);
514 vtxfit->AddTrack(1, wpim0);
515 vtxfit->AddVertex(0, vxpar,0, 1);
516 if(!vtxfit->Fit(0)) return sc;
517
518
519
520 m_pass[4] += 1;
521
522 WTrackParameter wpip = vtxfit->wtrk(0);
523 WTrackParameter wpim = vtxfit->wtrk(1);
524
525//
526// Apply Kinematic 4C fit
527//
528
529 double chisq4c = 9999.;
530
531 int ig1 = -1;
532 int ig2 = -1;
533
534 for(int i = 0; i < nGam-1; i++) {
535 RecEmcShower *g1Trk = (*(evtRecTrkCol->begin()+iGam[i]))->emcShower();
536 for(int j = i+1; j < nGam; j++) {
537 RecEmcShower *g2Trk = (*(evtRecTrkCol->begin()+iGam[j]))->emcShower();
538
539 kmfit->init();
540 kmfit->AddTrack(0, wpip);
541 kmfit->AddTrack(1, wpim);
542 kmfit->AddTrack(2, 0.0, g1Trk);
543 kmfit->AddTrack(3, 0.0, g2Trk);
544 kmfit->AddFourMomentum(0, BoostP);
545
546 if(!kmfit->Fit()) continue;
547 double chi2 = kmfit->chisq();
548 if(chi2 > chisq4c) continue;
549 chisq4c = chi2;
550 ig1 = i;
551 ig2 = j;
552 } // gamma1
553 } // gamma2
554
555
556 if(chisq4c > 500 || ig1 < 0) return sc;
557 RecEmcShower *g1Trk = (*(evtRecTrkCol->begin()+iGam[ig1]))->emcShower();
558 RecEmcShower *g2Trk = (*(evtRecTrkCol->begin()+iGam[ig2]))->emcShower();
559
560 kmfit->init();
561 kmfit->AddTrack(0, wpip);
562 kmfit->AddTrack(1, wpim);
563 kmfit->AddTrack(2, 0.0, g1Trk);
564 kmfit->AddTrack(3, 0.0, g2Trk);
565 kmfit->AddFourMomentum(0, BoostP);
566 if(!kmfit->Fit()) return sc;
567 double chi = kmfit->chisq();
568 m_chisq4c = chi;
569 m_chisq_4c -> Fill(chi);
570
571 HepLorentzVector p2gam = kmfit->pfit(2) + kmfit->pfit(3);
572 m_ppi0=p2gam.rho();
573 m_mpi0=p2gam.m();
574
575 m_pi0_mass -> Fill(p2gam.m());
576
577 m_pass[5] += 1;
578
579//
580// Apply Kinematic 5C fit
581//
582//
583// 5c for J/psi-->pi+pi-pi0
584//
585 kmfit->init();
586 kmfit->AddTrack(0, wpip);
587 kmfit->AddTrack(1, wpim);
588 kmfit->AddTrack(2, 0.0, g1Trk);
589 kmfit->AddTrack(3, 0.0, g2Trk);
590 kmfit->AddResonance(0,mpi0c,2,3);
591 kmfit->AddFourMomentum(1, BoostP);
592 if(!kmfit->Fit()) return sc;
593 double chis = kmfit->chisq();
594
595 m_pass[6] += 1;
596//
597// 5c for J/psi-->K+K-pi0
598//
599 double chisk5c = 9999.;
600
601 vtxfit->init();
602 vtxfit->AddTrack(0, wkp0);
603 vtxfit->AddTrack(1, wkm0);
604 vtxfit->AddVertex(0, vxpar,0, 1);
605
606 if(vtxfit->Fit(0)){
607
608 WTrackParameter wkp = vtxfit->wtrk(0);
609 WTrackParameter wkm = vtxfit->wtrk(1);
610
611 kmfit->init();
612 kmfit->AddTrack(0, wkp);
613 kmfit->AddTrack(1, wkm);
614 kmfit->AddTrack(2, 0.0, g1Trk);
615 kmfit->AddTrack(3, 0.0, g2Trk);
616 kmfit->AddResonance(0,mpi0c,2,3);
617 kmfit->AddFourMomentum(1, BoostP);
618 if(kmfit->Fit()) chisk5c = kmfit->chisq();
619 }
620 if(chisk5c<chis) return sc;
621
622 m_pass[7] += 1;
623 //
624 // 5c Fit again for J/psi-->pi+pi-pi0
625 //
626 kmfit->init();
627 kmfit->AddTrack(0, wpip);
628 kmfit->AddTrack(1, wpim);
629 kmfit->AddTrack(2, 0.0, g1Trk);
630 kmfit->AddTrack(3, 0.0, g2Trk);
631 kmfit->AddResonance(0,mpi0c,2,3);
632 kmfit->AddFourMomentum(1, BoostP);
633 if(!kmfit->Fit(0)) return sc;
634 if(!kmfit->Fit()) return sc;
635
636 m_pass[8] += 1;
637 m_chisq5c = kmfit->chisq();
638
639 m_chisq_5c -> Fill(kmfit->chisq());
640
641 HepLorentzVector ppi1 = kmfit->pfit(0);
642 HepLorentzVector ppi2 = kmfit->pfit(1);
643 HepLorentzVector pgam1 = kmfit->pfit(2);
644 HepLorentzVector pgam2 = kmfit->pfit(3);
645 HepLorentzVector p2gam1 = kmfit->pfit(2) + kmfit->pfit(3);
646 HepLorentzVector p2pi = kmfit->pfit(0) + kmfit->pfit(1);
647 m_ppi0fit = p2gam1.rho();
648 m_mpi0fit = p2gam1.m();
649 m_ppip = ppi1.rho();
650 m_ppim = ppi2.rho();
651 m_p2pi = p2pi.rho();
652 m_m2pi = p2pi.m();
653 m_ppip0 = (ppi1+p2gam1).rho();
654 m_mpip0 = (ppi1+p2gam1).m();
655 m_ppim0 = (ppi2+p2gam1).rho();
656 m_mpim0 = (ppi2+p2gam1).m();
657
658 m_pip_mom -> Fill(ppi1.rho());
659 m_pim_mom -> Fill(ppi2.rho());
660 m_rho0_mass -> Fill(p2pi.m());
661 m_rhop_mass -> Fill((ppi1+p2gam1).m());
662 m_rhom_mass -> Fill((ppi2+p2gam1).m());
663
664 //--------------Angle between two charged pions ---------
665 double theta2pi= ppi1.px()*ppi2.px()+ppi1.py()*ppi2.py()+ppi1.pz()*ppi2.pz();
666 double time2pi = ppi1.rho()*ppi2.rho();
667 if(time2pi == 0.) return sc;
668
669 m_pass[9] += 1;
670
671 theta2pi = theta2pi/time2pi;
672
673 // cout <<"time2pi=====" << time2pi <<endl;
674
675 if(theta2pi <= -1.) theta2pi=180.;
676 else if(theta2pi >= 1.) theta2pi=0.;
677 else if(fabs(theta2pi) < 1.) theta2pi = acos(theta2pi)*180./3.14159;
678 m_theta2pi=theta2pi;
679
680 //----- Theta angle of gamma in pi0 system --------
681 HepLorentzVector pg1inpi0, pg2inpi0;
682
683 // HepLorentzVector betapi0 = p2gam1/(p2gam1.e());
684 double betapi0 = p2gam1.beta();
685 // ==================================
686 Hep3Vector twogam(p2gam.px(),p2gam.py(),p2gam.pz());
687 // CLHEP::boostOf(pg1inpi0,gam1,betapi0);
688 m_g1inpi0the = ((boostOf(pgam1,twogam/p2gam.rho(),betapi0)).theta())*180./3.14159;
689 m_g2inpi0the = ((boostOf(pgam2,twogam/p2gam.rho(),betapi0)).theta())*180./3.14159;
690 /*
691 //
692 // ----- Pion Efficiency -----
693 //
694 HepLorentzVector p2g = pGam[ig1] + pGam[ig2];
695 m_m2graw = p2g.m();
696 p2g.boost(u_Boost);
697 //
698 //------ Missing pi-
699 //
700 HepLorentzVector Pmiss = -Ppip1 - p2g;
701 m_pmiss = Pmiss.rho();
702 double emiss = ecms - Ppip1.e() - p2g.e();
703 m_emiss = emiss;
704 m_mmiss = sqrt(fabs(emiss*emiss - Pmiss.rho()*Pmiss.rho()));
705
706 HepLorentzVector Prho0, Prhop, Prhom, pmisspi, ptot;
707 pmisspi.setPx(Pmiss.px());
708 pmisspi.setPy(Pmiss.py());
709 pmisspi.setPz(Pmiss.pz());
710 pmisspi.setE(emiss);
711
712 Prho0 = Ppip1 + pmisspi;
713 Prhop = Ppip1 + p2g;
714 Prhom = pmisspi + p2g;
715 ptot = Ppip1 + pmisspi + p2g;
716
717 m_pmrho0 = Prho0.rho();
718 m_mmrho0 = Prho0.m();
719 m_prho0 = (Ppip1 + Ppim1).rho();
720 m_mrho0 = (Ppip1 + Ppim1).m();
721 m_prhop = Prhop.rho();
722 m_mrhop = Prhop.m();
723 m_prhom = (p2g + Ppim1).rho();
724 m_mrhom = (p2g + Ppim1).m();
725 m_pmrhom = Prhom.rho();
726 m_mmrhom = Prhom.m();
727 */
728 m_tuple4->write();
729
730 return StatusCode::SUCCESS;
731}
732
733// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
734StatusCode rhopi::finalize() {
735
736 MsgStream log(msgSvc(), name());
737 log << MSG::ALWAYS << "Total Entries : " << m_pass[0] << endreq;
738 log << MSG::ALWAYS << "Ncharge=2 Cut : " << m_pass[1] << endreq;
739 log << MSG::ALWAYS << "Ngam<2 cut : " << m_pass[2] << endreq;
740 log << MSG::ALWAYS << "Nch+=1,Nch-=1 cut : " << m_pass[3] << endreq;
741 log << MSG::ALWAYS << "Vertex Fit : " << m_pass[4] << endreq;
742 log << MSG::ALWAYS << "4c-Fit : " << m_pass[5] << endreq;
743 log << MSG::ALWAYS << "5c-Fit : " << m_pass[6] << endreq;
744 log << MSG::ALWAYS << "chi3pi<chikkpi cut : " << m_pass[7] << endreq;
745 log << MSG::ALWAYS << "5c-Fit Again: " << m_pass[8] << endreq;
746 log << MSG::ALWAYS << "Final : " << m_pass[9] << endreq;
747 return StatusCode::SUCCESS;
748}
749
double sin(const BesAngle a)
Definition: BesAngle.h:210
double cos(const BesAngle a)
Definition: BesAngle.h:213
curve Fill()
EvtRecTrackCol::iterator EvtRecTrackIterator
Definition: EvtRecTrack.h:111
std::vector< HepLorentzVector > Vp4
Definition: Gam4pikp.cxx:53
const double mk
Definition: Gam4pikp.cxx:48
const double mpi
Definition: Gam4pikp.cxx:47
std::vector< int > Vint
Definition: Gam4pikp.cxx:52
INTupleSvc * ntupleSvc()
IMessageSvc * msgSvc()
double theta() const
Definition: DstEmcShower.h:38
double phi() const
Definition: DstEmcShower.h:39
double x() const
Definition: DstEmcShower.h:35
double z() const
Definition: DstEmcShower.h:37
double energy() const
Definition: DstEmcShower.h:45
double y() const
Definition: DstEmcShower.h:36
const Hep3Vector emcPosition() const
Definition: DstExtTrack.h:126
const int emcVolumeNumber() const
Definition: DstExtTrack.h:132
double chiE() const
Definition: DstMdcDedx.h:59
double chiPi() const
Definition: DstMdcDedx.h:61
double chiK() const
Definition: DstMdcDedx.h:62
double chiMu() const
Definition: DstMdcDedx.h:60
double chiP() const
Definition: DstMdcDedx.h:63
const HepVector & helix() const
const double px() const
static void setPidType(PidType pidType)
const double pz() const
const double py() const
const HepSymMatrix & err() const
const int charge() const
const double r() const
Definition: DstMdcTrack.h:64
const int charge() const
Definition: DstMdcTrack.h:53
const double z() const
Definition: DstMdcTrack.h:63
const double y() const
Definition: DstMdcTrack.h:62
const double x() const
Definition: DstMdcTrack.h:61
static KinematicFit * instance()
void AddResonance(int number, double mres, std::vector< int > tlis)
double chisq() const
Definition: KinematicFit.h:150
void AddFourMomentum(int number, HepLorentzVector p4)
HepLorentzVector pfit(int n) const
Definition: KinematicFit.h:154
int useTof2() const
int methodProbability() const
int useDedx() const
int onlyKaon() const
int onlyPion() const
int useTof1() const
void setChiMinCut(const double chi=4)
void setRecTrack(EvtRecTrack *trk)
double probKaon() const
Definition: ParticleID.h:124
void setMethod(const int method)
Definition: ParticleID.h:94
void identify(const int pidcase)
Definition: ParticleID.h:103
void usePidSys(const int pidsys)
Definition: ParticleID.h:97
static ParticleID * instance()
Definition: ParticleID.cxx:22
bool IsPidInfoValid() const
double probPion() const
Definition: ParticleID.h:123
void calculate()
Definition: ParticleID.cxx:97
void init()
Definition: ParticleID.cxx:27
void AddTrack(const int number, const double mass, const RecMdcTrack *trk)
Definition: TrackPool.cxx:22
WTrackParameter wtrk(int n) const
Definition: VertexFit.h:79
void init()
Definition: VertexFit.cxx:29
void AddVertex(int number, VertexParameter vpar, std::vector< int > lis)
Definition: VertexFit.cxx:89
static VertexFit * instance()
Definition: VertexFit.cxx:15
bool Fit()
Definition: VertexFit.cxx:301
void setEvx(const HepSymMatrix &eVx)
void setVx(const HepPoint3D &vx)
Definition: UserDIY.cc:60
StatusCode initialize()
Definition: rhopi.cxx:75
StatusCode execute()
Definition: rhopi.cxx:202
StatusCode finalize()
Definition: rhopi.cxx:734
const double ecms
Definition: inclkstar.cxx:42
_EXTERN_ std::string EvtRecEvent
Definition: EventModel.h:116
_EXTERN_ std::string EvtRecTrackCol
Definition: EventModel.h:117
float ptrk
double double * p3
Definition: qcdloop1.h:76
HepGeom::Point3D< double > HepPoint3D
Definition: rhopi.cxx:29
std::vector< HepLorentzVector > Vp4
Definition: rhopi.cxx:48
const double xmass[5]
Definition: rhopi.cxx:44
const double mk
Definition: rhopi.cxx:43
const double mpi0c
Definition: rhopi.cxx:40
const double mpi
Definition: rhopi.cxx:41
const double ecms
Definition: rhopi.cxx:42
std::vector< int > Vint
Definition: rhopi.cxx:47
const float pi
Definition: vector3.h:133