BOSS 6.6.4.p03
BESIII Offline Software System
Loading...
Searching...
No Matches
DedxCalibEvent.cxx
Go to the documentation of this file.
1#include "GaudiKernel/MsgStream.h"
2#include "GaudiKernel/StatusCode.h"
3#include "GaudiKernel/INTupleSvc.h"
4#include "GaudiKernel/SmartDataPtr.h"
5
15#include "Identifier/MdcID.h"
16
17#include <TMath.h>
18
20
21typedef std::vector<int> Vint;
22
23using namespace std;
24using CLHEP::HepVector;
25
26
27DedxCalibEvent::DedxCalibEvent(const std::string& name, ISvcLocator* pSvcLocator): DedxCalib(name, pSvcLocator) {}
28
29
31{
32 MsgStream log(msgSvc(), name());
33 log << MSG::INFO << "DedxCalibEvent::initializing()" << endreq;
34
35 StatusCode status;
36 NTuplePtr nt1(ntupleSvc(),"FILE100/n103");
37 if ( nt1 )
38 m_nt1 = nt1;
39 else
40 {
41 m_nt1= ntupleSvc()->book("FILE100/n103",CLID_ColumnWiseTuple,"dEdx per track");
42 if ( m_nt1 )
43 {
44 status = m_nt1->addItem("ptrk",m_ptrk);
45 status = m_nt1->addItem("ptrk_t",m_ptrk_t);
46 status = m_nt1->addItem("sintheta",m_sintheta);
47 status = m_nt1->addItem("costheta",m_costheta);
48 status = m_nt1->addItem("charge",m_charge);
49 status = m_nt1->addItem("runNO",m_runNO);
50 status = m_nt1->addItem("runFlag",m_runFlag);
51 status = m_nt1->addItem("evtNO",m_evtNO);
52 status = m_nt1->addItem("t0",m_t0);
53 status = m_nt1->addItem("trackId",m_trackId);
54 status = m_nt1->addItem("poca_x",m_poca_x);
55 status = m_nt1->addItem("poca_y",m_poca_y);
56 status = m_nt1->addItem("poca_z",m_poca_z);
57 status = m_nt1->addItem("recalg",m_recalg);
58 status = m_nt1->addItem("nhit",m_nhit);
59 status = m_nt1->addItem("nhits",m_nhits);
60 status = m_nt1->addItem("usedhit",m_usedhit);
61
62 status = m_nt1->addItem("ndedxhit",m_nphlisthit,0,100);
63 status = m_nt1->addIndexedItem("dEdx_hit",m_nphlisthit,m_dEdx_hit);
64 status = m_nt1->addIndexedItem("pathlength_hit",m_nphlisthit,m_pathlength_hit);
65 status = m_nt1->addIndexedItem("wid_hit",m_nphlisthit,m_wid_hit);
66 status = m_nt1->addIndexedItem("layid_hit",m_nphlisthit,m_layid_hit);
67 status = m_nt1->addIndexedItem("dd_in_hit",m_nphlisthit,m_dd_in_hit);
68 status = m_nt1->addIndexedItem("eangle_hit",m_nphlisthit,m_eangle_hit);
69 status = m_nt1->addIndexedItem("zhit_hit",m_nphlisthit,m_zhit_hit);
70
71 //status = m_nt1->addItem("dEdx_meas_hit", m_dEdx_meas_hit);
72 status = m_nt1->addItem("dEdx_meas", m_dEdx_meas);
73 //status = m_nt1->addItem("dEdx_meas_esat", m_dEdx_meas_esat);
74 //status = m_nt1->addItem("dEdx_meas_norun", m_dEdx_meas_norun);
75
76 status = m_nt1->addItem("type",m_parttype);
77 status = m_nt1->addItem("chidedx_e",m_chidedxe);
78 status = m_nt1->addItem("chidedx_mu",m_chidedxmu);
79 status = m_nt1->addItem("chidedx_pi",m_chidedxpi);
80 status = m_nt1->addItem("chidedx_k",m_chidedxk);
81 status = m_nt1->addItem("chidedx_p",m_chidedxp);
82 status = m_nt1->addItem("partid",5,m_probpid);
83 status = m_nt1->addItem("expectid",5,m_expectid);
84 status = m_nt1->addItem("sigmaid",5,m_sigmaid);
85 }
86 }
87
88 NTuplePtr nt2(ntupleSvc(),"FILE100/n102");
89 if ( nt2 ) m_nt2 = nt2;
90 else
91 {
92 m_nt2= ntupleSvc()->book("FILE100/n102",CLID_RowWiseTuple,"dE/dx per hit");
93 if ( m_nt2 )
94 {
95 status = m_nt2->addItem("charge",m_charge1);
96 status = m_nt2->addItem("adc_raw",m_phraw);
97 status = m_nt2->addItem("exraw",m_exraw);
98 status = m_nt2->addItem("runNO",m_runNO1);
99 status = m_nt2->addItem("runFlag",m_runFlag1);
100 status = m_nt2->addItem("wire",m_wire);
101 status = m_nt2->addItem("doca_in",m_doca_in);
102 status = m_nt2->addItem("doca_ex",m_doca_ex);
103 status = m_nt2->addItem("driftdist",m_driftdist);
104 status = m_nt2->addItem("eangle",m_eangle);
105 status = m_nt2->addItem("zhit",m_zhit);
106 status = m_nt2->addItem("costheta1",m_costheta1);
107 status = m_nt2->addItem("path_rphi",m_pathL);
108 status = m_nt2->addItem("layer",m_layer);
109 status = m_nt2->addItem("ptrk1",m_ptrk1);
110 status = m_nt2->addItem("ptrk_hit",m_ptrk_hit);
111 status = m_nt2->addItem("t01",m_t01);
112 status = m_nt2->addItem("tdc_raw",m_tdc_raw);
113 status = m_nt2->addItem("driftT",m_driftT);
114 status = m_nt2->addItem("localwid",m_localwid);
115 status = m_nt2->addItem("trackId1",m_trackId1);
116 }
117 }
118}
119
121{
122 MsgStream log(msgSvc(), name());
123 log << MSG::INFO << "DedxCalibEvent::genNtuple()" << endreq;
124
125 SmartDataPtr<Event::EventHeader> eventHeader(eventSvc(),"/Event/EventHeader");
126 if (!eventHeader)
127 {
128 log << MSG::INFO << "Could not find Event Header" << endreq;
129 return;
130 }
131 int eventNO = eventHeader->eventNumber();
132 int runNO = eventHeader->runNumber();
133 log << MSG::INFO << "now begin the event: runNO= "<<runNO<<" eventNO= "<< eventNO<< endreq;
134
135 int runFlag=0; //data type flag
136 if(runNO<RUN0) runFlag =0;
137 if(runNO>=RUN1 && runNO<RUN2) runFlag =1;
138 if(runNO>=RUN2 && runNO<RUN3) runFlag =2;
139 if(runNO>=RUN3 && runNO<RUN4) runFlag =3;
140 if(runNO>=RUN4 && runNO<RUN5) runFlag =4; //jpsi
141 if(runNO>=RUN5 && runNO<RUN6) runFlag =5; //psipp
142 if(runNO>=RUN6 && runNO<RUN7) runFlag =6; //psi4040, psip, jpsi...
143 if(runNO>=RUN7) runFlag =7; //psip
144
145 double tes = -999.0;
146 int esTimeflag = -1;
147 SmartDataPtr<RecEsTimeCol> aevtimeCol(eventSvc(),"/Event/Recon/RecEsTimeCol");
148 if( (!aevtimeCol) || (aevtimeCol->size()==0) ){
149 tes = -9999.0;
150 esTimeflag = -1;
151 }else{
152 RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
153 for(; iter_evt!=aevtimeCol->end(); iter_evt++){
154 tes = (*iter_evt)->getTest();
155 esTimeflag = (*iter_evt)->getStat();
156 }
157 }
158 if(runFlag ==2) {if( tes>1000 ) return;}
159 else if(runFlag ==3 ){if (tes>700 ) return;}
160 else {if (tes>1400 ) return;}
161
162 SmartDataPtr<RecMdcDedxCol> newexCol(eventSvc(),"/Event/Recon/RecMdcDedxCol");
163 if (!newexCol)
164 {
165 log << MSG::FATAL << "Could not find RecMdcDedxCol" << endreq;
166 return;
167 }
168
169 Vint iGood;
170 iGood.clear();
171 int nCharge = 0;
172 double db=0,dz=0,pt0=0,charge0=0;
173 for(RecMdcDedxCol::iterator it = newexCol->begin(); it != newexCol->end(); it++)
174 {
175 HepVector a;
176 if((*it)->getMdcKalTrack())
177 {
178 RecMdcKalTrack* trk = (*it)->getMdcKalTrack();
179 if(ParticleFlag>-1&&ParticleFlag<5)
180 {
181 DstMdcKalTrack* dstTrk = trk;
182 a = dstTrk->getZHelix(ParticleFlag);
183 }
184 else
185 a = trk->getZHelix();
186 }
187 else if((*it)->getMdcTrack())
188 {
189 RecMdcTrack* trk = (*it)->getMdcTrack();
190 a = trk->helix();
191 }
192 else continue;
193 db = a[0];
194 dz = a[3];
195 pt0 = fabs(1.0/a[2]);
196 charge0 = ( a[2] > 0 )? 1 : -1;
197
198 //cout<<"db: "<<db<<" dz: "<<dz<<" pt0: "<<pt0<<" charge0: "<<charge0<<endl;
199 if(fabs(dz) >= VZ0CUT) continue;
200 if(db >= VR0CUT) continue;
201 if(pt0 >= PT0HighCut) continue;
202 if(pt0 <= PT0LowCut) continue;
203 iGood.push_back((*it)->trackId());
204 nCharge += charge0;
205 }
206 //cout<<"iGood.size()= "<<iGood.size()<<" nCharge= "<<nCharge<<endl;
207 if((m_eventType == "isBhabha")||(m_eventType == "isRadBhabha"))
208 {
209 if(iGood.size()!=2 || nCharge!=0 ) return;
210 }
211
212
213 //cout<<"begin to read RecMdcDedxCol!!!!"<<endl;
214 double poca_x=0,poca_y=0,poca_z=0;
215 float sintheta=0,costheta=0,ptrk=0,ptrk_t=0,charge=0,trackId=0;
216 int Nhit=0,usedhit=0,Nhits=0,Nphlisthit=0;
217 double dEdx_meas_hit=0, dEdx_meas=0,dEdx_meas_esat=0,dEdx_meas_norun=0;
218 double dEdx_hit[100]={0},pathlength_hit[100]={0},wid_hit[100]={0},layid_hit[100]={0},dd_in_hit[100]={0},eangle_hit[100]={0},zhit_hit[100]={0};
219 int trk_recalg = -1;
220 Identifier mdcid;
221
222 for(RecMdcDedxCol::iterator it = newexCol->begin(); it != newexCol->end(); it++)
223 {
224 //cout<<"in track iteration!!!!!!!!"<<endl;
225 bool flag = false;
226 for(int i = 0; i < iGood.size(); i++)
227 {
228 if((*it)->trackId()==iGood[i]) flag=true;
229 }
230 if(flag==false) continue;
231
232 HepVector a;
233 HepSymMatrix tkErrM;
234 if((*it)->getMdcKalTrack())
235 {
236 //cout<<"can get MdcKalTrack!!!!!!!!!"<<endl;
237 poca_x = (*it)->getMdcKalTrack()->x(); //get poca, default pid is pion; change pid using setPidType();
238 poca_y = (*it)->getMdcKalTrack()->y();
239 poca_z = (*it)->getMdcKalTrack()->z();
240
241 RecMdcKalTrack* trk = (*it)->getMdcKalTrack();
242 //cout<<"ParticleFlag= "<<ParticleFlag<<endl;
243 if(ParticleFlag>-1&&ParticleFlag<5)
244 {
245 DstMdcKalTrack* dstTrk = trk;
246 a = dstTrk->getFHelix(ParticleFlag);
247 tkErrM = dstTrk->getFError(ParticleFlag);
248 }
249 else
250 {
251 a = trk->getFHelix();
252 tkErrM = trk->getFError();
253 }
254 }
255 else if((*it)->getMdcTrack())
256 {
257 poca_x = (*it)->getMdcTrack()->x();
258 poca_y = (*it)->getMdcTrack()->y();
259 poca_z = (*it)->getMdcTrack()->z();
260
261 RecMdcTrack* trk = (*it)->getMdcTrack();
262 a = trk->helix();
263 tkErrM = trk->err();
264 }
265 else continue;
266
267 sintheta = sin(M_PI_2 - atan(a[4]));
268 costheta = cos(M_PI_2 - atan(a[4]));
269 ptrk_t = 1.0/fabs( a[2] );
270 ptrk = ptrk_t*sqrt(1 + a[4]*a[4]);
271 charge = ( a[2] > 0 )? 1 : -1;
272
273 Nhit = (*it)->numTotalHits(); //total hits on track used as sample;
274 Nhits = ((*it)->getVecDedxHits()).size(); //dedx hits on this track, they are put in phlist if layid>3
275 usedhit = (*it)->numGoodHits(); //hits after truncting phlist and used in cal dE/dx value;
276 trk_recalg = (*it)->status();
277 trackId = (*it)->trackId();
278
279 if(m_eventType == "isBhabha")
280 {
281 if(runFlag ==3 &&(ptrk>1.88 || ptrk<1.80)) continue;
282 if(runFlag ==4 &&(ptrk>1.72 || ptrk<1.45)) continue;
283 if(runFlag ==5 &&(ptrk>2.00 || ptrk<1.70)) continue;
284 if(runFlag ==6 &&(ptrk>1.90 || ptrk<1.00)) continue;
285 if(runFlag ==7 &&(ptrk>1.90 || ptrk<1.40)) continue;
286 if(abs(costheta)>0.9) continue;
287
288 if(Nhit<20) continue;
289 if(usedhit<6) continue;
290 }
291
292
293 int layid=0,localwid=0,w0id=0,wid=0,lr=0;
294 double p_hit=0,adc_raw=0,tdc_raw=0,zhit=0,driftd=0,driftD=0,driftT=0,dd_in=0,dd_ex=0,eangle=0;
295 double ph=0,pathlength=0,rphi_path=0;
296 long k=0;
297
298 DedxHitRefVec gothits = (*it)->getVecDedxHits();
299 DedxHitRefVec::iterator it_gothit = gothits.begin();
300 for(;it_gothit!=gothits.end(); it_gothit++)
301 {
302 //cout<<"in hit iteration!!!!!!!!!!!!!!!!!!"<<endl;
303 if((*it_gothit)->isMdcHitValid())
304 {
305 RecMdcHit* itor = (*it_gothit)->getMdcHit();
306 mdcid = itor->getMdcId();
307 layid = MdcID::layer(mdcid);
308 localwid = MdcID::wire(mdcid);
309 w0id = geosvc->Layer(layid)->Wirst();
310 wid = w0id + localwid;
311 adc_raw = itor->getAdc();
312 tdc_raw = itor->getTdc();
313 zhit = itor->getZhit();
314
315 lr = itor->getFlagLR();
316 if(lr == 2) cout<<"lr = "<<lr<<endl;
317 if(lr == 0 || lr == 2) driftD = itor->getDriftDistLeft();
318 else driftD = itor->getDriftDistRight();
319 driftd = abs(driftD);
320 dd_in = itor->getDoca();
321 dd_ex = itor->getDoca();
322 if(lr == 0 || lr == 2 ) {dd_in = -abs(dd_in);dd_ex = -abs(dd_ex);}
323 if(lr == 1 ) {dd_in = abs(dd_in);dd_ex = abs(dd_ex);}
324 driftT = itor->getDriftT();
325 eangle = itor->getEntra();
326 eangle = eangle/M_PI;
327 }
328 else if((*it_gothit)->isMdcKalHelixSegValid())
329 {
330 RecMdcKalHelixSeg* itor = (*it_gothit)->getMdcKalHelixSeg();
331 HepVector a_hit_in = itor->getHelixIncl();
332 p_hit = 1.0/fabs(a_hit_in(3))*sqrt(1+a_hit_in(5)*a_hit_in(5));
333
334 mdcid = itor->getMdcId();
335 layid = MdcID::layer(mdcid);
336 localwid = MdcID::wire(mdcid);
337 w0id = geosvc->Layer(layid)->Wirst();
338 wid = w0id + localwid;
339 adc_raw = itor->getAdc();
340 tdc_raw = itor->getTdc();
341 zhit = itor->getZhit();
342
343 lr = itor->getFlagLR();
344 if(lr == 2) cout<<"lr = "<<lr<<endl;
345 driftD = itor->getDD();
346 driftd = abs(driftD);
347 driftT = itor->getDT();
348 dd_in = itor->getDocaIncl(); //getDocaIncl() include fit unused hit
349 dd_ex = itor->getDocaExcl(); //getDocaExcl() exclude fit unused hit
350 if(lr==-1 || lr == 2) {dd_in = dd_in; dd_ex = dd_ex;}
351 else if(lr ==1) {dd_in = -dd_in; dd_ex = -dd_ex;}
352 eangle = itor->getEntra();
353 eangle = eangle/M_PI;
354 }
355 else continue;
356
357 pathlength=(*it_gothit)->getPathLength();
358 rphi_path=pathlength*sintheta;
359 ph = (*it_gothit)->getDedx();
360 if(layid>3)
361 {
362 dEdx_hit[k]=adc_raw;
363 pathlength_hit[k]=pathlength;
364 wid_hit[k]=wid;
365 layid_hit[k]=layid;
366 dd_in_hit[k]=dd_in;
367 eangle_hit[k]=eangle;
368 zhit_hit[k]=zhit;
369
370 k++;
371 }
372
373 //cout<<"begin to Fill Ntuple n102!!!!!!!!!"<<endl;
374 m_charge1 = charge;
375 m_t01 = tes;
376 m_driftT = driftT;
377 m_tdc_raw = tdc_raw;
378 m_phraw = adc_raw;
379 m_exraw = ph;
380 m_localwid = localwid;
381 m_wire = wid;
382 m_runNO1 = runNO;
383 m_runFlag1 = runFlag;
384 m_doca_in = dd_in;
385 m_doca_ex = dd_ex;
386 m_driftdist = driftD;
387 m_eangle = eangle;
388 m_zhit = zhit;
389 m_costheta1 = costheta;
390 m_pathL = pathlength;
391 m_layer = layid;
392 m_ptrk1 = ptrk;
393 m_ptrk_hit = p_hit;
394 m_trackId1 = trackId;
395
396 StatusCode status = m_nt2->write();
397 if ( status.isFailure() )
398 log << MSG::ERROR << "Cannot fill Ntuple n102" << endreq;
399 }
400
401 Nphlisthit = k; //dedx hits on this track, exclude the first 3 layers
402 dEdx_meas = (*it)->probPH();
403 //cout<<"dEdx_meas in reconstruction: "<<dEdx_meas<<endl;
404 dEdx_meas_esat = (*it)->getDedxEsat();
405 dEdx_meas_norun = (*it)->getDedxNoRun();
406 dEdx_meas_hit = (*it)->getDedxHit();
407 //cout<<"dEdx_meas in calibration: "<<dEdx_meas<<endl;
408
409 //cout<<"begin to Fill Ntuple n103!!!!!!!"<<endl;
410 m_poca_x = poca_x;
411 m_poca_y = poca_y;
412 m_poca_z = poca_z;
413 m_ptrk_t=ptrk_t;
414 m_ptrk=ptrk;
415 m_sintheta=sintheta;
416 m_costheta=costheta;
417 m_charge=charge;
418 m_runNO = runNO;
419 m_runFlag = runFlag;
420 m_evtNO = eventNO;
421 m_t0 = tes;
422 m_trackId = trackId;
423 m_recalg = trk_recalg;
424
425 m_nhit=Nhit;
426 m_nhits=Nhits;
427 m_nphlisthit=Nphlisthit;
428 m_usedhit=usedhit;
429 for(int j=0; j<Nphlisthit; j++)
430 {
431 m_dEdx_hit[j]=dEdx_hit[j];
432 m_pathlength_hit[j]=pathlength_hit[j];
433 m_wid_hit[j]=wid_hit[j];
434 m_layid_hit[j]=layid_hit[j];
435 m_dd_in_hit[j]=dd_in_hit[j];
436 m_eangle_hit[j]=eangle_hit[j];
437 m_zhit_hit[j]=zhit_hit[j];
438 }
439
440 //m_dEdx_meas_hit = dEdx_meas_hit;
441 m_dEdx_meas = dEdx_meas;
442 //m_dEdx_meas_esat = dEdx_meas_esat;
443 //m_dEdx_meas_norun = dEdx_meas_norun;
444
445 m_parttype = (*it)->particleId();
446 m_chidedxe=(*it)->chiE();
447 m_chidedxmu=(*it)->chiMu();
448 m_chidedxpi=(*it)->chiPi();
449 m_chidedxk=(*it)->chiK();
450 m_chidedxp=(*it)->chiP();
451 for(int i=0;i<5;i++)
452 {
453 m_probpid[i]= (*it)->getPidProb(i);
454 m_expectid[i]= (*it)->getDedxExpect(i);
455 m_sigmaid[i]= (*it)->getSigmaDedx(i);
456 }
457 StatusCode status = m_nt1->write();
458 if ( status.isFailure() )
459 {
460 log << MSG::ERROR << "Cannot fill Ntuple n103" << endreq;
461 }
462 }
463 //cout<<"track iteration ended!!!!!!!!!!"<<endl;
464}
double sin(const BesAngle a)
Definition: BesAngle.h:210
double cos(const BesAngle a)
Definition: BesAngle.h:213
std::vector< int > Vint
const long int RUN5
const double VZ0CUT
const double PT0HighCut
const long int RUN6
const long int RUN2
const long int RUN7
const long int RUN1
const long int RUN4
const double VR0CUT
const double PT0LowCut
const long int RUN3
const long int RUN0
double abs(const EvtComplex &c)
Definition: EvtComplex.hh:212
std::vector< int > Vint
Definition: Gam4pikp.cxx:52
SmartRefVector< RecMdcDedxHit > DedxHitRefVec
Definition: RecMdcDedx.h:27
INTupleSvc * ntupleSvc()
IMessageSvc * msgSvc()
#define M_PI
Definition: TConstant.h:4
DedxCalibEvent(const std::string &name, ISvcLocator *pSvcLocator)
int ParticleFlag
Definition: DedxCalib.h:50
IMdcGeomSvc * geosvc
Definition: DedxCalib.h:29
std::string m_eventType
Definition: DedxCalib.h:53
const HepVector & getZHelix(const int pid) const
const HepSymMatrix & getFError(const int pid) const
const HepVector & getFHelix(const int pid) const
const HepSymMatrix err() const
const HepVector helix() const
......
virtual const MdcGeoLayer *const Layer(unsigned id)=0
int Wirst(void) const
Definition: MdcGeoLayer.h:157
static int layer(const Identifier &id)
Values of different levels (failure returns 0)
Definition: MdcID.cxx:49
static int wire(const Identifier &id)
Definition: MdcID.cxx:54
const int getFlagLR(void) const
Definition: RecMdcHit.h:47
const double getZhit(void) const
Definition: RecMdcHit.h:55
const double getAdc(void) const
Definition: RecMdcHit.h:51
const Identifier getMdcId(void) const
Definition: RecMdcHit.h:49
const double getTdc(void) const
Definition: RecMdcHit.h:50
const double getDriftDistRight(void) const
Definition: RecMdcHit.h:43
const double getDriftT(void) const
Definition: RecMdcHit.h:52
const double getEntra(void) const
Definition: RecMdcHit.h:54
const double getDriftDistLeft(void) const
Definition: RecMdcHit.h:42
const double getDoca(void) const
Definition: RecMdcHit.h:53
Identifier getMdcId(void) const
int getFlagLR(void) const
HepVector & getHelixIncl(void)
double getEntra(void) const
double getDD(void) const
double getDocaIncl(void) const
double getDocaExcl(void) const
double getTdc(void) const
double getZhit(void) const
double getDT(void) const
double getAdc(void) const
const HepVector & getZHelix() const
const HepSymMatrix & getFError() const
const HepVector & getFHelix() const