BOSS 7.0.8
BESIII Offline Software System
Loading...
Searching...
No Matches
TofShower Class Reference

#include <TofShower.h>

Public Member Functions

 TofShower ()
 
 ~TofShower ()
 
vector< IdentifiergetNeighbors (const Identifier &id)
 
vector< IdentifiergetNextNeighbors (const Identifier &id)
 
void energyCalib (vector< TofData * > &tofDataVec, RecTofTrackCol *recTofTrackCol)
 
void findSeed (vector< TofData * > &tofDataVec)
 
void findShower (vector< TofData * > &tofDataVec, RecTofTrackCol *recTofTrackCol, double)
 
void BookNtuple (NTuple::Tuple *&tuple, NTuple::Tuple *&tuple1, NTuple::Tuple *&tuple2)
 
void readCalibPar ()
 
double ecalib (const int nsci) const
 
void setEcalib (const int nsci, const double ecalib)
 
double calib (const int n, const int m) const
 
void setCalib (const int n, const int m, const double ecalib)
 
double calibConst () const
 
void setCalibConst (const double cal)
 
bool isData () const
 
void setIsData (const bool isData)
 

Detailed Description

Definition at line 14 of file TofShower.h.

Constructor & Destructor Documentation

◆ TofShower()

TofShower::TofShower ( )

Definition at line 31 of file TofShower.cxx.

31 :m_output(false),m_isData(true) // m_output wird auf false und m_isData auf true gesetzt
32{
33 IJobOptionsSvc* jobSvc;
34 Gaudi::svcLocator()->service("JobOptionsSvc", jobSvc);
35 jobSvc->setMyProperties("TofShower", &m_propMgr);
36
37}

◆ ~TofShower()

TofShower::~TofShower ( )
inline

Definition at line 17 of file TofShower.h.

17{;}

Member Function Documentation

◆ BookNtuple()

void TofShower::BookNtuple ( NTuple::Tuple *&  tuple,
NTuple::Tuple *&  tuple1,
NTuple::Tuple *&  tuple2 
)

Definition at line 39 of file TofShower.cxx.

40{
41 m_output = true;
42 m_tuple = tuple;
43 if(!m_tuple) {
44 std::cerr << "Invalid ntuple in TofEnergyRec!" << std::endl;
45 } else {
46 m_tuple->addItem ("part", m_part);
47 m_tuple->addItem ("layer", m_layer);
48 m_tuple->addItem ("im", m_im);
49 m_tuple->addItem ("end", m_end);
50 m_tuple->addItem ("zpos", m_zpos);
51 m_tuple->addItem ("adc1", m_adc1);
52 m_tuple->addItem ("adc2", m_adc2);
53 m_tuple->addItem ("tdc1", m_tdc1);
54 m_tuple->addItem ("tdc2", m_tdc2);
55 m_tuple->addItem ("energy", m_energy);
56 }
57
58 m_tuple1 = tuple1;
59 if(!m_tuple1) {
60 std::cerr << "Invalid ntuple1 in TofEnergyRec!" << std::endl;
61 } else {
62 m_tuple1->addItem ("part", m_shower_part);
63 m_tuple1->addItem ("layer", m_shower_layer);
64 m_tuple1->addItem ("im", m_shower_im);
65 m_tuple1->addItem ("zpos", m_shower_zpos);
66 m_tuple1->addItem ("energy", m_shower_energy);
67 }
68
69 m_tuple2 = tuple2;
70 if(!m_tuple2) {
71 std::cerr << "Invalid ntuple2 in TofEnergyRec!" << std::endl;
72 } else {
73 m_tuple2->addItem ("dist", m_seed_dist);
74 }
75}

Referenced by TofEnergyRec::initialize().

◆ calib()

double TofShower::calib ( const int  n,
const int  m 
) const

Definition at line 829 of file TofShower.cxx.

830{
831 if(n<176&&m<4) {
832 return m_calib[n][m];
833 } else {
834 return 0;
835 }
836}
const Int_t n

◆ calibConst()

double TofShower::calibConst ( ) const
inline

Definition at line 38 of file TofShower.h.

38{ return m_calibConst; }

◆ ecalib()

double TofShower::ecalib ( const int  nsci) const

Definition at line 813 of file TofShower.cxx.

814{
815 if(nsci<176) {
816 return m_ecalib[nsci];
817 } else {
818 return 0;
819 }
820}

Referenced by setCalib(), and setEcalib().

◆ energyCalib()

void TofShower::energyCalib ( vector< TofData * > &  tofDataVec,
RecTofTrackCol recTofTrackCol 
)

Definition at line 77 of file TofShower.cxx.

78{
79 //Get TOF Calibtration Service
80 ISvcLocator* svcLocator = Gaudi::svcLocator();
82 StatusCode sc = svcLocator->service("TofCaliSvc", tofCaliSvc);
83 if (sc != StatusCode::SUCCESS) {
84 cout << "TofEnergyRec Get Calibration Service Failed !! " << endl;
85 }
86
88 sc = svcLocator->service("TofQCorrSvc", tofQCorrSvc);
89 if (sc != StatusCode::SUCCESS) {
90 cout << "TofEnergyRec Get QCorr Service Failed !! " << endl;
91 }
92
94 sc = svcLocator->service("TofQElecSvc", tofQElecSvc);
95 if (sc != StatusCode::SUCCESS) {
96 cout << "TofEnergyRec Get QElec Service Failed !! " << endl;
97 }
98
99 ITofEnergyCalibSvc* m_TofEnergyCalibSvc=0;
100 sc = svcLocator->service("TofEnergyCalibSvc", m_TofEnergyCalibSvc);
101 if( sc != StatusCode::SUCCESS){
102 cout << "can not use TofEnergyCalibSvc" << endreq;
103 }
104 else {
105 /*
106 std::cout << "Test TofEnergyCalibSvc getCalibConst= "
107 << m_TofEnergyCalibSvc -> getCalibConst()
108 <<"para1="<<m_TofEnergyCalibSvc -> getPara1()
109 <<"para2="<<m_TofEnergyCalibSvc -> getPara2()
110 <<"para3="<<m_TofEnergyCalibSvc -> getPara3()
111 <<"para4="<<m_TofEnergyCalibSvc -> getPara4()
112 <<"para5="<<m_TofEnergyCalibSvc -> getPara5()
113 << std::endl;
114 */
115 }
116
117
118
119 vector<TofData*>::iterator it;
120 for(it=tofDataVec.begin();
121 it!=tofDataVec.end();
122 it++) {
123
124 Identifier id((*it)->identify());
125 if( TofID::is_scin(id) ) {
126 int barrel_ec = TofID::barrel_ec(id);
127 int layer = TofID::layer(id);
128 int im = TofID::phi_module(id);
129 int end = TofID::end(id);
130
131 if(m_output) {
132 m_part = barrel_ec;
133 m_layer = layer;
134 m_im = im;
135 m_end = end;
136 }
137
138 if((*it)->barrel()) {
139 TofData* bTofData = (*it);
140 bTofData->setZpos(99.);
141 bTofData->setEnergy(0.);
142 if(bTofData->tdc1()<=0||bTofData->tdc1()>8000||bTofData->tdc2()<=0||bTofData->tdc2()>8000) continue;
143
144 double adc1,adc2,tdc1,tdc2;
145 tdc1 = bTofData->tdc1();
146 tdc2 = bTofData->tdc2();
147 adc1 = bTofData->adc1();
148 adc2 = bTofData->adc2();
149
150 //from data CalibSvc
151 double zpos = tofCaliSvc->ZTDC( tdc1, tdc2, bTofData->tofId() );
152 if(fabs(zpos)>115) continue;
153 double tofq = tofCaliSvc->BPh( adc1, adc2, zpos, bTofData->tofId());
154 if(tofq<100||tofq>10000) continue;
155 //double energy = q*0.0036;
156 //double energy = tofq*m_calibConst; //new calibration result in 2009.9.27
157 //cout<< "TofShower Barrel energy " << energy << endl;
158
159 zpos /= 100.; //cm->m
160
161 ///////////////////
162
163
164 double CalibPar[5];
165
166 CalibPar[0]=m_TofEnergyCalibSvc -> getPara1();
167 CalibPar[1]=m_TofEnergyCalibSvc -> getPara2();
168 CalibPar[2]=m_TofEnergyCalibSvc -> getPara3();
169 CalibPar[3]=m_TofEnergyCalibSvc -> getPara4();
170 CalibPar[4]=m_TofEnergyCalibSvc -> getPara5();
171
172 double TofEnCalibConst=CalibPar[0]+CalibPar[1]*zpos+CalibPar[2]*pow(zpos,2)+CalibPar[3]*pow(zpos,3)+CalibPar[4]*pow(zpos,4);
173 double energy = tofq*TofEnCalibConst;
174
175 //cout<<"tofenergy="<<energy<<endl;
176 //cout<<"tofenergy-old="<<tofq*m_calibConst<<endl;
177 ///////////////////
178 bTofData->setZpos(zpos);
179 bTofData->setEnergy(energy);
180
181 if(m_output) {
182 m_part = barrel_ec;
183 m_layer = layer;
184 m_im = im;
185 m_end = end;
186 m_adc1 = bTofData->adc1();
187 m_adc2 = bTofData->adc2();
188 m_tdc1 = bTofData->tdc1();
189 m_tdc2 = bTofData->tdc2();
190 m_zpos = zpos;
191 m_energy = energy;
192 m_tuple->write();
193 }
194
195 }
196 else {
197 //cout<<"endcap"<<endl;
198 //ETofData* eTofData = dynamic_cast<ETofData*>(*it);
199 //TofData* bTofData = (*it);
200 //double energy = 2*eTofData->adcChannel()/140;
201 //eTofData->setEnergy(energy);
202 }
203 }
204 else {
205 int barrel_ec = TofID::barrel_ec(id);
206 int endcap = TofID::endcap(id);
207 int module = TofID::module(id);
208 int strip = TofID::strip(id);
209 int end = TofID::end(id);
210
211 if( barrel_ec!=3 || ( endcap!=0 && endcap!=1 ) ) {
212 cout << "TofEnergyRec Get ETF(MRPC) data ERROR !! barrel_ec:" << barrel_ec << " endcap:" << endcap << endl;
213 }
214
215 if(m_output) {
216 m_part = barrel_ec;
217 m_layer = endcap;
218 m_im = module;
219 m_end = strip;
220 }
221
222 TofData* etfData = (*it);
223 etfData->setZpos(99.);
224 etfData->setEnergy(0.);
225 if(etfData->tdc1()<=0||etfData->tdc1()>8000||etfData->tdc2()<=0||etfData->tdc2()>8000) continue;
226
227 double adc1,adc2,tdc1,tdc2;
228 tdc1 = etfData->tdc1();
229 tdc2 = etfData->tdc2();
230 adc1 = etfData->adc1();
231 adc2 = etfData->adc2();
232
233 //from data CalibSvc
234 double zpos = tofCaliSvc->ZTDC( tdc1, tdc2, etfData->tofId() );
235 if(fabs(zpos)>115) continue;
236 double tofq = tofCaliSvc->BPh( adc1, adc2, zpos, etfData->tofId());
237 if(tofq<100||tofq>10000) continue;
238 //double energy = q*0.0036;
239 double energy = tofq*m_calibConst; //new calibration result in 2009.9.27
240 //cout<< "TofShower Barrel energy " << energy << endl;
241 zpos /= 100.; //cm->m
242
243 etfData->setZpos(zpos);
244 etfData->setEnergy(energy);
245
246 if(m_output) {
247 m_part = barrel_ec;
248 m_layer = endcap;
249 m_im = module;
250 m_end = strip;
251 m_adc1 = etfData->adc1();
252 m_adc2 = etfData->adc2();
253 m_tdc1 = etfData->tdc1();
254 m_tdc2 = etfData->tdc2();
255 m_zpos = zpos;
256 m_energy = energy;
257 m_tuple->write();
258 }
259 }
260 }
261 return;
262}
************Class m_ypar INTEGER m_KeyWgt INTEGER m_KeyIHVP INTEGER m_KeyGPS INTEGER m_IsBeamPolarized INTEGER m_EvtGenInterface DOUBLE PRECISION m_Emin DOUBLE PRECISION m_sphot DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_q2 DOUBLE PRECISION m_PolBeam2 DOUBLE PRECISION m_xErrPb *COMMON c_KK2f $ !CMS energy average $ !Spin Polarization vector first beam $ !Spin Polarization vector second beam $ !Beam energy spread[GeV] $ !minimum hadronization energy[GeV] $ !input READ never touch them !$ !debug facility $ !maximum weight $ !inverse alfaQED $ !minimum real photon energy
Definition: KK2f.h:50
ITofQElecSvc * tofQElecSvc
ITofQCorrSvc * tofQCorrSvc
ITofCaliSvc * tofCaliSvc
virtual const double BPh(double ADC1, double ADC2, double zHit, unsigned int id)=0
virtual const double ZTDC(double tleft, double tright, unsigned id)=0
void setEnergy(double energy)
Definition: TofData.h:210
double adc2()
Definition: TofData.cxx:656
int tofId() const
Definition: TofData.h:130
void setZpos(double zpos)
Definition: TofData.h:209
double tdc2()
Definition: TofData.cxx:665
double tdc1()
Definition: TofData.cxx:647
double adc1()
Definition: TofData.cxx:638
static int endcap(const Identifier &id)
Definition: TofID.cxx:124
static int strip(const Identifier &id)
Definition: TofID.cxx:136
static bool is_scin(const Identifier &id)
Definition: TofID.cxx:102
static int end(const Identifier &id)
Definition: TofID.cxx:79
static int phi_module(const Identifier &id)
Definition: TofID.cxx:73
static int barrel_ec(const Identifier &id)
Values of different levels (failure returns 0)
Definition: TofID.cxx:61
static int layer(const Identifier &id)
Definition: TofID.cxx:66
static int module(const Identifier &id)
Definition: TofID.cxx:130

Referenced by findShower().

◆ findSeed()

void TofShower::findSeed ( vector< TofData * > &  tofDataVec)

Definition at line 434 of file TofShower.cxx.

435{
436 bool max=false;
437 m_seedVec.clear();
438
439 vector<TofData*>::iterator it;
440 for(it=tofDataVec.begin();
441 it!=tofDataVec.end();
442 it++) {
443
444 if( !((*it)->is_mrpc()) ) {
445 if((*it)->barrel()) { //barrel
446 TofData* bTofData = (*it);
447
448 //cout << "Identifier(bTofData->identify()) " << Identifier(bTofData->identify()) << endl;
449 //std::cout << "TofShower bTofData->energy() = " << bTofData->energy() << std::endl;
450 if(bTofData->energy()<5.) continue; //seed energy cut = 6MeV
451
452 max=true;
453 vector<Identifier> NeighborVec=getNextNeighbors(Identifier(bTofData->identify()));
454
455 //const Identifier & help = Identifier(bTofData->identify());
456 //cout << "TofShower::findSeed Barrel Track base "<<TofID::layer(help) << " " << TofID::phi_module(help) << endl;
457
458 vector<Identifier>::iterator iNeigh;
459 for(iNeigh=NeighborVec.begin();
460 iNeigh!=NeighborVec.end();
461 iNeigh++) {
462
463 //const Identifier & help2 = Identifier(*iNeigh);
464 //cout << "TofShower::findSeed Barrel Track neigh "<<TofID::layer(help2) << " " << TofID::phi_module(help2) << endl;
465
466 vector<TofData*>::iterator it2;
467 for(it2=tofDataVec.begin();
468 it2!=tofDataVec.end();
469 it2++) {
470 if((*it2)->identify()==*iNeigh) {
471 TofData* bTofData2 = (*it2);
472 if(bTofData2->energy()>bTofData->energy()) {
473 max=false;
474 }
475 break;
476 }
477 }
478
479 }
480 }
481 else { //endcap
482
483 //cout << "TofShower::findSeed Endcap Track" << endl;
484 TofData* eTofData = (*it);
485 if(eTofData->energy()<5.) continue; //seed energy cut = 5MeV
486 max=true;
487 vector<Identifier> NeighborVec=getNextNeighbors(Identifier(eTofData->identify()));
488 vector<Identifier>::iterator iNeigh;
489 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
490 {
491 vector<TofData*>::iterator it2;
492 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
493 {
494 if((*it2)->identify()==*iNeigh) {
495 TofData* eTofData2 = (*it2);
496 if(eTofData2->energy()>eTofData->energy()) {
497 max=false;
498 }
499 break;
500 }
501 }//close for
502 }//Close for
503 }//close if(!is_mrpc)
504
505 }
506 else
507 {
508
509 TofData* etfData = (*it);
510 if(etfData->energy()<2.) continue; //Seed energy cut = 2 MeV
511 max=true;
512 vector<Identifier> NeighborVec=getNextNeighbors(Identifier(etfData->identify()));
513 vector<Identifier>::iterator iNeigh;
514 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
515 {
516 //cout << "TofShower::findSeed Phimodule MRPC " << TofID::phi_module(*iNeigh) <<endl;
517 vector<TofData*>::iterator it2;
518 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
519 {
520 if((*it2)->identify()==*iNeigh) {
521 TofData* etfData2 = (*it2);
522 if(etfData2->energy()>etfData->energy()) {
523 max=false;
524 }
525 break;
526 }
527 }//close for
528 }//Close for
529 //cout << "TofShower::findSeed Both forloops done" << endl;
530 }//Close else if(is_mrpc)
531
532 if(max) {
533 m_seedVec.push_back(Identifier((*it)->identify()));
534 }
535
536 }//close loop over tofdata
537}//close find seed
double energy() const
Definition: TofData.h:195
unsigned int identify() const
Definition: TofData.h:127
vector< Identifier > getNextNeighbors(const Identifier &id)
Definition: TofShower.cxx:375

Referenced by findShower().

◆ findShower()

void TofShower::findShower ( vector< TofData * > &  tofDataVec,
RecTofTrackCol recTofTrackCol,
double  t0 
)

Definition at line 540 of file TofShower.cxx.

541{
542
543 energyCalib(tofDataVec, recTofTrackCol);
544 //cout << "TofShower::findShower energycalib OK" << endl;
545 findSeed(tofDataVec);
546 //cout << "TofShower::findShower findseed OK" << endl;
547
548 vector<Identifier>::iterator iSeed;
549
550 for(iSeed=m_seedVec.begin(); iSeed!=m_seedVec.end(); iSeed++)
551 {
552
553 bool is_mrpc = TofID::is_mrpc(*iSeed);
554
555 if(!is_mrpc) //Old TofDetector + barrel
556 {
557 int barrel_ec = TofID::barrel_ec(*iSeed);
558 int layer = TofID::layer(*iSeed);
559 int im = TofID::phi_module(*iSeed);
560 im += layer * 88;
561
562 bool neutral=true;
563 //match with Tof charged track
564 int dphi=999;
565 RecTofTrackCol::iterator iTrack, iMatch;
566 for(iTrack=recTofTrackCol->begin(); iTrack!=recTofTrackCol->end(); iTrack++)
567 {
568 TofHitStatus *status = new TofHitStatus;
569 status->setStatus((*iTrack)->status());
570 if( barrel_ec==1 && status->is_barrel() ) {
571 dphi=abs(im-(*iTrack)->tofID());
572 dphi = dphi>=44 ? 88-dphi : dphi;
573 } else if( barrel_ec==2 && !(status->is_barrel()) && ((*iTrack)->tofID()>47) ) {
574 dphi=abs(im-(*iTrack)->tofID()+48);
575 dphi = dphi>=24 ? 48-dphi : dphi;
576 } else if( barrel_ec==0 && !(status->is_barrel()) && ((*iTrack)->tofID()<48) ) {
577 dphi=abs(im-(*iTrack)->tofID());
578 dphi = dphi>=24 ? 48-dphi : dphi;
579 }
580 if(abs(dphi)<=2) {
581 iMatch = iTrack;
582 neutral=false;
583 break;
584 }
585 }
586
587 //energy sum of seed and its neighbors
588 //use avarage mean to calculation position
589 double zpos=0;
590 double energy=0;
591 double seedPos=0;
592
593 //cout << "Energhy =0 " << endl;
594 vector<TofData*>::iterator it;
595 for(it=tofDataVec.begin(); it!=tofDataVec.end(); it++)
596 {
597 if((*it)->identify()==*iSeed) {
598 //cout<<"iSeed="<<*iSeed<<endl;
599 if((*it)->barrel()) {
600 TofData* bTofData = (*it);
601 zpos+=bTofData->zpos()*bTofData->energy();
602 energy+=bTofData->energy();
603 seedPos=bTofData->zpos();
604
605 //cout << "Add energy barrel seed "<< TofID::layer(*iSeed) <<" " << TofID::phi_module(*iSeed) << " " << bTofData->energy() << " ---> "<< energy <<endl;
606 } else {
607 TofData* eTofData = (*it);
608 energy+=eTofData->energy();
609
610 //cout << "Add energy" << endl;
611 }
612 break;
613 }
614 }
615
616 vector<Identifier> NeighborVec=getNextNeighbors(*iSeed);
617 vector<Identifier>::iterator iNeigh;
618 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
619 {
620
621 vector<TofData*>::iterator it2;
622 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
623 {
624 if((*it2)->identify()==*iNeigh) {
625 //cout<<"iNeigh="<<*iNeigh<<endl;
626 if((*it)->barrel()) {
627 TofData* bTofData2 = (*it2);
628
629 if(fabs(bTofData2->zpos())>2) continue;
630 if(m_output) {
631 m_seed_dist = seedPos-bTofData2->zpos();
632 m_tuple2->write();
633 }
634 if(fabs(seedPos-bTofData2->zpos())>0.3) continue;
635 zpos+=bTofData2->zpos()*bTofData2->energy();
636 energy+=bTofData2->energy();
637 //cout << "Add energy barrel neig " << TofID::layer(*iNeigh) <<" " << TofID::phi_module(*iNeigh) << " " << bTofData2->energy() << " ---> "<< energy <<endl;
638 } else {
639 TofData* eTofData2 = (*it2);
640 energy+=eTofData2->energy();
641 }
642 break;
643 }
644 }
645 }
646 if(energy>0) zpos/=energy;
647
648 //for charged track, set energy
649 if(neutral==false) {
650 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {
651 (*iMatch)->setEnergy(energy/1000);
652 }
653 continue;
654 }
655
656 //for neutral track
657 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) { //shower energy cut = 10MeV
658 RecTofTrack* tof = new RecTofTrack;
659 tof->setTofID(*iSeed);
660 TofHitStatus* hitStatus = new TofHitStatus;
661 hitStatus->init();
662 tof->setStatus( hitStatus->value());
663 tof->setZrHit(zpos);
664 tof->setEnergy(energy/1000); //MeV-->GeV
665 recTofTrackCol->push_back(tof);
666
667 if(m_output) {
668 m_shower_part = barrel_ec;
669 m_shower_layer = layer;
670 m_shower_im = im;
671 m_shower_zpos = zpos;
672 m_shower_energy = energy;
673 m_tuple1->write();
674 }
675 }
676 }//close if(!is_mrpc)
677 else // mrpc_case
678 {
679 //Determine wether the track is a neutral one or not:(Compare with charged tracks)
680 //cout << "TofShower::findShower Seed is mrpc" << endl;
681
682 int barrel_ec = TofID::barrel_ec(*iSeed);
683 int endcap = TofID::endcap(*iSeed);
684 int im = TofID::module(*iSeed);
685 int strip = TofID::strip(*iSeed);
686 int end = TofID::end(*iSeed);
687 im += endcap * 36;
688
689 bool neutral=true;
690 //match with Tof charged track
691 int dphi=999, dtheta=999;
692 RecTofTrackCol::iterator iTrack, iMatch;
693 for(iTrack=recTofTrackCol->begin(); iTrack!=recTofTrackCol->end(); iTrack++)
694 {
695 TofHitStatus *status = new TofHitStatus;
696 status->setStatus((*iTrack)->status());
697 if( barrel_ec==3 && endcap==0 && ((*iTrack)->tofID()<36) ) {
698 dphi = abs(im-(*iTrack)->tofID());
699 dphi = dphi>=18 ? 36-dphi : dphi;
700 dtheta = abs( strip - status->layer() );
701 } else if( barrel_ec==3 && endcap==1 && ((*iTrack)->tofID()>35) ) {
702 dphi=abs(im-(*iTrack)->tofID()+36);
703 dphi = dphi>=18 ? 36-dphi : dphi;
704 dtheta = abs( strip - status->layer() );
705 }
706 if( ( abs(dphi)==0 && abs(dtheta)<=2 ) || ( abs(dphi)==1 && abs(dtheta)<=1 ) ) {
707 iMatch = iTrack;
708 neutral = false;
709 break;
710 }
711 }
712
713 //energy sum of seed and its neighbors
714 //use avarage mean to calculation position
715 double zpos=0;
716 double energy=0;
717 double seedPos=0;
718
719 //cout << "Energhy =0 " << endl;
720 vector<TofData*>::iterator it;
721 for(it=tofDataVec.begin(); it!=tofDataVec.end(); it++)
722 {
723 if((*it)->identify()==*iSeed) {
724 TofData* etfData = (*it);
725 zpos+=etfData->zpos()*etfData->energy();
726 energy+=etfData->energy();
727 seedPos=etfData->zpos();
728 break;
729 }
730 }
731
732 vector<Identifier> NeighborVec=getNextNeighbors(*iSeed);
733 vector<Identifier>::iterator iNeigh;
734 for(iNeigh=NeighborVec.begin(); iNeigh!=NeighborVec.end(); iNeigh++)
735 {
736 vector<TofData*>::iterator it2;
737 for(it2=tofDataVec.begin(); it2!=tofDataVec.end(); it2++)
738 {
739 if((*it)->barrel()) continue;
740 if((*it2)->identify()==*iNeigh) {
741 TofData* etfData2 = (*it2);
742 if(fabs(etfData2->zpos())>2) continue;
743 if(m_output) {
744 m_seed_dist = seedPos-etfData2->zpos();
745 m_tuple2->write();
746 }
747 if(fabs(seedPos-etfData2->zpos())>0.3) continue;
748 zpos+=etfData2->zpos()*etfData2->energy();
749 energy+=etfData2->energy();
750 //cout << "Add energy barrel neig " << TofID::layer(*iNeigh) <<" " << TofID::phi_module(*iNeigh) << " " << bTofData2->energy() << " ---> "<< energy <<endl;
751 break;
752 }
753 }
754 }
755 if(energy>0) zpos/=energy;
756
757 //for charged track, set energy
758 if(neutral==false) {
759 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) {
760 (*iMatch)->setEnergy(energy/1000);
761 }
762 continue;
763 }
764
765 //for neutral track
766 if(fabs(zpos)<1.15&&energy>5.&&energy<1000) { //shower energy cut = 10MeV
767 RecTofTrack* tof = new RecTofTrack;
768 tof->setTofID(*iSeed);
769 TofHitStatus* hitStatus = new TofHitStatus;
770 hitStatus->init();
771 tof->setStatus( hitStatus->value());
772 tof->setZrHit(zpos);
773 tof->setEnergy(energy/1000); //MeV-->GeV
774 recTofTrackCol->push_back(tof);
775
776 if(m_output) {
777 m_shower_part = barrel_ec;
778 m_shower_layer = strip;
779 m_shower_im = im;
780 m_shower_zpos = zpos;
781 m_shower_energy = energy;
782 m_tuple1->write();
783 }
784 }
785 }
786
787 }
788}
void setStatus(unsigned int status)
Definition: DstTofTrack.h:93
void setEnergy(double energy)
Definition: DstTofTrack.h:133
void setZrHit(double zrhit)
Definition: DstTofTrack.h:96
void setTofID(int tofID)
Definition: DstTofTrack.h:92
double zpos() const
Definition: TofData.h:194
bool is_barrel() const
Definition: TofHitStatus.h:26
unsigned int layer() const
Definition: TofHitStatus.h:28
unsigned int value() const
Definition: TofHitStatus.h:20
void setStatus(unsigned int status)
static bool is_mrpc(const Identifier &id)
Definition: TofID.cxx:113
void findSeed(vector< TofData * > &tofDataVec)
Definition: TofShower.cxx:434
void energyCalib(vector< TofData * > &tofDataVec, RecTofTrackCol *recTofTrackCol)
Definition: TofShower.cxx:77

Referenced by TofEnergyRec::execute().

◆ getNeighbors()

vector< Identifier > TofShower::getNeighbors ( const Identifier id)

Definition at line 264 of file TofShower.cxx.

265{
266 vector<int> NeighborVec;
267 vector<Identifier> NeighborIdVec;
268 NeighborVec.clear();
269 NeighborIdVec.clear();
270
271 if( TofID::is_scin(id) ) {
272 int barrel_ec = TofID::barrel_ec(id);
273 int layer = TofID::layer(id);
274 int im = TofID::phi_module(id);
275 int end = TofID::end(id);
276
277 if(barrel_ec==1) { //barrel
278 int num = im+layer*88;
279 if(num<88) { //layer1
280 if(num==0) {
281 NeighborVec.push_back(1);
282 NeighborVec.push_back(87);
283 NeighborVec.push_back(88);
284 NeighborVec.push_back(89);
285 } else if(num==87) {
286 NeighborVec.push_back(0);
287 NeighborVec.push_back(86);
288 NeighborVec.push_back(88);
289 NeighborVec.push_back(175);
290 } else {
291 NeighborVec.push_back(num+1);
292 NeighborVec.push_back(num-1);
293 NeighborVec.push_back(num+88);
294 NeighborVec.push_back(num+88+1);
295 }
296 } else {
297 if(num==88) {
298 NeighborVec.push_back(89);
299 NeighborVec.push_back(175);
300 NeighborVec.push_back(0);
301 NeighborVec.push_back(87);
302 } else if(num==175) {
303 NeighborVec.push_back(88);
304 NeighborVec.push_back(174);
305 NeighborVec.push_back(86);
306 NeighborVec.push_back(87);
307 } else {
308 NeighborVec.push_back(num+1);
309 NeighborVec.push_back(num-1);
310 NeighborVec.push_back(num-88);
311 NeighborVec.push_back(num-88-1);
312 }
313 }
314
315 int size=NeighborVec.size();
316 for(int i=0;i<size;i++) {
317 layer = NeighborVec[i]/88;
318 im = NeighborVec[i]%88;
319 NeighborIdVec.push_back(TofID::cell_id(barrel_ec,layer,im,end));
320 }
321 }
322
323 else { //endcap
324 if(im==0) {
325 NeighborVec.push_back(1);
326 NeighborVec.push_back(47);
327 } else if(im==47) {
328 NeighborVec.push_back(0);
329 NeighborVec.push_back(46);
330 } else {
331 NeighborVec.push_back(im-1);
332 NeighborVec.push_back(im+1);
333 }
334
335 int size=NeighborVec.size();
336 for(int i=0;i<size;i++) {
337 im = NeighborVec[i];
338 NeighborIdVec.push_back(TofID::cell_id(barrel_ec,layer,im,end));
339 }
340 }
341 }
342 else { // mrpc
343 int barrel_ec = TofID::barrel_ec(id);
344 int endcap = TofID::endcap(id);
345 int module = TofID::module(id);
346 int strip = TofID::strip(id);
347 int end = TofID::end(id);
348
349 if( module==0 ) {
350 NeighborVec.push_back(1);
351 NeighborVec.push_back(35);
352 } else if( module==35 ) {
353 NeighborVec.push_back(0);
354 NeighborVec.push_back(34);
355 } {
356 NeighborVec.push_back(module-1);
357 NeighborVec.push_back(module+1);
358 }
359
360 int size=NeighborVec.size();
361 for(int i=0;i<size;i++) {
362 int im = NeighborVec[i];
363 for(int j=-2; j<3; j++ ) {
364 int ist = strip + j;
365 if( ist<0 || ist>11 ) continue;
366 NeighborIdVec.push_back(TofID::cell_id(barrel_ec,endcap,module,ist,end));
367 }
368 }
369
370 }
371
372 return NeighborIdVec;
373}
static Identifier cell_id(int barrel_ec, int layer, int phi_module, int end)
For a single crystal.
Definition: TofID.cxx:143

Referenced by getNextNeighbors().

◆ getNextNeighbors()

vector< Identifier > TofShower::getNextNeighbors ( const Identifier id)

Definition at line 375 of file TofShower.cxx.

376{
377 vector<Identifier> NeighborVec,tmpNeighborVec,tmpNextNeighborVec;
378 vector<Identifier>::iterator ci_NV,ci_tmpNV,ci_tmpNNV;
379 NeighborVec=getNeighbors(id);
380 tmpNeighborVec=getNeighbors(id);
381 bool flag=false; //whether NeighborVec already includes this crystal
382 bool flagNeighbor=false; //whether this crystal belongs to NeighborVec
383
384 //------------------------------------------------------------------
385 for(ci_tmpNV=tmpNeighborVec.begin();
386 ci_tmpNV!=tmpNeighborVec.end();
387 ci_tmpNV++){
388 tmpNextNeighborVec=getNeighbors(*ci_tmpNV);
389 //================================================================
390 for(ci_tmpNNV=tmpNextNeighborVec.begin();
391 ci_tmpNNV!=tmpNextNeighborVec.end();
392 ci_tmpNNV++){
393
394 for(ci_NV=NeighborVec.begin();
395 ci_NV!=NeighborVec.end();
396 ci_NV++){
397 if(*ci_tmpNNV==*ci_NV){ //this crystal is already included
398 flag=true;
399 break;
400 }
401 }
402
403 if(!flag){ //find a new crystal
404 //for(ci_tmpNV1=tmpNeighborVec.begin();
405 // ci_tmpNV1!=tmpNeighborVec.end();
406 // ci_tmpNV1++){
407 // if(*ci_tmpNNV==*ci_tmpNV1){ //this crystal belongs to NeighborVec
408 // flagNeighbor=true;
409 // break;
410 // }
411 //}
412
413 if(*ci_tmpNNV==id)
414 flagNeighbor=true;
415
416 if(!flagNeighbor)
417 NeighborVec.push_back(*ci_tmpNNV);
418 else
419 flagNeighbor=false;
420 }
421 else
422 flag=false;
423 }
424 //================================================================
425 }
426 //------------------------------------------------------------------
427
428 return NeighborVec;
429}
vector< Identifier > getNeighbors(const Identifier &id)
Definition: TofShower.cxx:264

Referenced by findSeed(), and findShower().

◆ isData()

bool TofShower::isData ( ) const
inline

Definition at line 41 of file TofShower.h.

41{ return m_isData; }

Referenced by setIsData().

◆ readCalibPar()

void TofShower::readCalibPar ( )

Definition at line 790 of file TofShower.cxx.

791{
792 string paraPath = getenv("TOFENERGYRECROOT");
793 paraPath += "/share/peak.dat";
794 ifstream in;
795 in.open(paraPath.c_str());
796 assert(in);
797 for(int i=0;i<176;i++) {
798 in>>m_ecalib[i];
799 }
800 in.close();
801
802 paraPath = getenv("TOFENERGYRECROOT");
803 paraPath += "/share/calib.dat";
804 ifstream in1;
805 in1.open(paraPath.c_str());
806 assert(in1);
807 for(int i=0;i<176;i++) {
808 in1>>m_calib[i][0]>>m_calib[i][1]>>m_calib[i][2]>>m_calib[i][3];
809 }
810 in1.close();
811}
std::ifstream ifstream
Definition: bpkt_streams.h:44

◆ setCalib()

void TofShower::setCalib ( const int  n,
const int  m,
const double  ecalib 
)

Definition at line 838 of file TofShower.cxx.

839{
840 if(n<176&&m<4) {
841 m_calib[n][m]=ecalib;
842 }
843}
double ecalib(const int nsci) const
Definition: TofShower.cxx:813

◆ setCalibConst()

void TofShower::setCalibConst ( const double  cal)
inline

Definition at line 39 of file TofShower.h.

39{ m_calibConst = cal; }
std::string cal
Definition: CalibModel.cxx:41

Referenced by TofEnergyRec::initialize().

◆ setEcalib()

void TofShower::setEcalib ( const int  nsci,
const double  ecalib 
)

Definition at line 822 of file TofShower.cxx.

823{
824 if(nsci<176) {
825 m_ecalib[nsci]=ecalib;
826 }
827}

◆ setIsData()

void TofShower::setIsData ( const bool  isData)
inline

Definition at line 42 of file TofShower.h.

42{ m_isData = isData; }
bool isData() const
Definition: TofShower.h:41

Referenced by TofEnergyRec::initialize().


The documentation for this class was generated from the following files: