BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TofEnergyCalib Class Reference

#include <TofEnergyCalib.h>

Inheritance diagram for TofEnergyCalib:

Public Member Functions

 TofEnergyCalib (const std::string &name, ISvcLocator *pSvcLocator)
StatusCode initialize ()
StatusCode execute ()
StatusCode finalize ()

Detailed Description

Definition at line 9 of file TofEnergyCalib.h.

Constructor & Destructor Documentation

◆ TofEnergyCalib()

TofEnergyCalib::TofEnergyCalib ( const std::string & name,
ISvcLocator * pSvcLocator )

Definition at line 51 of file TofEnergyCalib.cxx.

52 : Algorithm( name, pSvcLocator ) {
53
54 m_tuple = 0;
55 declareProperty( "Event", m_event = 0 );
56 declareProperty( "IsData", m_isData = true );
57 //////////
58 declareProperty( "fileExt", m_fileExt = "" );
59 declareProperty( "fileDir", m_fileDir = "" );
60 m_num = 0.0;
61 m_EvsQ = 0.0;
62}

Referenced by TofEnergyCalib().

Member Function Documentation

◆ execute()

StatusCode TofEnergyCalib::execute ( )

Definition at line 107 of file TofEnergyCalib.cxx.

107 {
108
109 // if(m_event%1000==0) {
110 // std::cout << "TofEnergyCalib :: " << m_event <<" events executed" << std::endl;
111 // }
112
113 // StatusCode sc = StatusCode::SUCCESS;
114
115 MsgStream log( msgSvc(), name() );
116 log << MSG::INFO << "in execute()" << endmsg;
117
118 SmartDataPtr<Event::EventHeader> eventHeader( eventSvc(), "/Event/EventHeader" );
119 int run = eventHeader->runNumber();
120
121 m_run = run;
122
123 int event = eventHeader->eventNumber();
124 if ( m_event % 1000 == 0 )
125 {
126 std::cout << m_event << "-------------TofEnergyCalib run,event: " << run << "," << event
127 << std::endl;
128 }
129 m_event++;
130
131 SmartDataPtr<EvtRecEvent> evtRecEvent( eventSvc(), EventModel::EvtRec::EvtRecEvent );
132 SmartDataPtr<EvtRecTrackCol> evtRecTrkCol( eventSvc(), EventModel::EvtRec::EvtRecTrackCol );
133 // log << MSG::INFO << "get event tag OK" << endmsg;
134 log << MSG::DEBUG << "ncharg, nneu, tottks = " << evtRecEvent->totalCharged() << " , "
135 << evtRecEvent->totalNeutral() << " , " << evtRecEvent->totalTracks() << endmsg;
136
137 if ( evtRecEvent->totalCharged() != 2 ) { return StatusCode::SUCCESS; }
138
139 // Get TOF Raw Data Provider Service
140 IRawDataProviderSvc* tofDigiSvc;
141 StatusCode sc = service( "RawDataProviderSvc", tofDigiSvc );
142 if ( sc != StatusCode::SUCCESS )
143 {
144 log << MSG::ERROR << "TofRec Get Tof Raw Data Service Failed !! " << endmsg;
145 return StatusCode::SUCCESS;
146 }
147
148 // Get TOF Calibtration Service
149 ITofCaliSvc* tofCaliSvc;
150 StatusCode scc = service( "TofCaliSvc", tofCaliSvc );
151 if ( scc != StatusCode::SUCCESS )
152 {
153 log << MSG::ERROR << "TofRec Get Calibration Service Failed !! " << endmsg;
154 return StatusCode::SUCCESS;
155 }
156 // tofCaliSvc->Dump();
157
158 ITofQCorrSvc* tofQCorrSvc;
159 sc = service( "TofQCorrSvc", tofQCorrSvc );
160 if ( sc != StatusCode::SUCCESS )
161 {
162 log << MSG::ERROR << "TofRec Get QCorr Service Failed !! " << endmsg;
163 return StatusCode::SUCCESS;
164 }
165
166 ITofQElecSvc* tofQElecSvc;
167 sc = service( "TofQElecSvc", tofQElecSvc );
168 if ( sc != StatusCode::SUCCESS )
169 {
170 log << MSG::ERROR << "TofRec Get QElec Service Failed !! " << endmsg;
171 return StatusCode::SUCCESS;
172 }
173
174 // Retrieve Tof Digi Data
175 std::vector<TofData*> tofDataVec;
176 tofDataVec = tofDigiSvc->tofDataVectorTof();
177 const unsigned int ADC_MASK = 0x00001FFF;
178
179 for ( int i = 0; i < evtRecEvent->totalCharged(); i++ )
180 {
181 EvtRecTrackIterator itTrk = evtRecTrkCol->begin() + i;
182
183 if ( !( *itTrk )->isExtTrackValid() ) continue;
184 RecExtTrack* extTrk = ( *itTrk )->extTrack(); // get extTrk
185
186 if ( !( *itTrk )->isTofTrackValid() ) continue;
187 // RecTofTrack *tofTrk = (*itTrk)->TofTrk(); //get tofTrk
188
189 int npart, tof1, tof2; // tof1, tof2 volume number
190 Hep3Vector pos1, pos2; // tof1, tof2 position
191 Hep3Vector p1, p2; // tof1, tof2 momentum;
192
193 tof1 = extTrk->tof1VolumeNumber();
194 tof2 = extTrk->tof2VolumeNumber();
195
196 // cout<<"tof1="<<tof1<<"\ttof2="<<tof2<<endl;
197
198 if ( tof1 >= 0 && tof1 < 88 && tof2 >= 88 && tof2 < 176 )
199 { // barrel
200 npart = 1;
201 }
202 else if ( tof1 >= 176 && tof1 < 224 )
203 { // west endcap
204 tof1 -= 176;
205 npart = 2;
206 }
207 else if ( tof1 >= 224 && tof1 < 272 )
208 { // east endcap
209 tof1 -= 224;
210 npart = 0;
211 }
212 else { continue; }
213
214 pos1 = extTrk->tof1Position();
215 pos2 = extTrk->tof2Position();
216
217 p1 = extTrk->tof1Momentum();
218 p2 = extTrk->tof2Momentum();
219
220 double zpos1 = 0, zpos2 = 0, l1 = 0, l2 = 0, lext = 0;
221 double z1, xy1, z2, xy2;
222
223 if ( npart == 1 )
224 { // barrel
225 // calculate tof direction
226 const double tofDPhi = CLHEP::twopi / 88.;
227 double tofPhi1 = tof1 * tofDPhi + tofDPhi / 2;
228 double tofPhi2 = ( tof2 - 88 ) * tofDPhi;
229
230 // retrive ext direction
231 double extTheta1, extTheta2, extPhi1, extPhi2;
232 extTheta1 = pos1.theta();
233 extTheta2 = pos2.theta();
234 extPhi1 = pos1.phi();
235 extPhi2 = pos2.phi();
236
237 // calculate track length
238 // double z1, xy1, z2, xy2;
239 z1 = 5 / tan( extTheta1 );
240 xy1 = 5 / cos( extPhi1 - tofPhi1 );
241 l1 = sqrt( z1 * z1 + xy1 * xy1 );
242 z2 = 5 / tan( extTheta2 );
243 xy2 = 5 / cos( extPhi2 - tofPhi2 );
244 l2 = sqrt( z2 * z2 + xy2 * xy2 );
245 zpos1 = ( pos1.z() + z1 / 2 ) / 100;
246 zpos2 = ( pos2.z() + z2 / 2 ) / 100;
247
248 // track length in tof from extrapolation
249 lext = extTrk->tof2Path() - extTrk->tof1Path();
250 }
251
252 else
253 { // endcap
254 // retrive ext direction
255 double extTheta1 = pos1.theta();
256 // cout<<"extTheta1: "<<extTheta1<<"\t"<<cos(extTheta1)<<endl;
257
258 // calculate track length
259 l1 = 5. / fabs( cos( extTheta1 ) );
260 zpos1 =
261 ( sqrt( pos1.x() * pos1.x() + pos1.y() * pos1.y() ) + 5. * tan( extTheta1 ) / 2 ) /
262 100;
263 }
264
265 vector<TofData*>::iterator it;
266
267 // if neighbors of extrapolated scintillator have hits, this event is abandoned
268 for ( it = tofDataVec.begin(); it != tofDataVec.end(); it++ )
269 {
270
271 Identifier idd( ( *it )->identify() );
272 int layer = TofID::layer( idd );
273 int im = TofID::phi_module( idd );
274 if ( im + layer * 88 == tof1 - 1 || im + layer * 88 == tof1 + 1 ||
275 im + layer * 88 == tof1 - 2 || im + layer * 88 == tof1 + 2 )
276 {
277 // cout<<"return"<<endl;
278 return StatusCode::SUCCESS;
279 }
280 }
281
282 for ( it = tofDataVec.begin(); it != tofDataVec.end(); it++ )
283 {
284
285 Identifier idd( ( *it )->identify() );
286 int layer = TofID::layer( idd );
287 int im = TofID::phi_module( idd );
288
289 double adc1=0, adc2=0, tdc1=0, tdc2=0, ztdc=0, tofq=0;
290
291 if ( ( *it )->barrel() )
292 {
293 TofData* bTofData = *it;
294 tdc1 = bTofData->tdc1();
295 tdc2 = bTofData->tdc2();
296 adc1 = bTofData->adc1();
297 adc2 = bTofData->adc2();
298
299 ztdc = tofCaliSvc->ZTDC( tdc1, tdc2, bTofData->tofId() );
300 tofq = tofCaliSvc->BPh( adc1, adc2, ztdc, bTofData->tofId() );
301 if ( tofq < 100 || tofq > 10000 ) continue;
302
303 npart = 1;
304 // cout<<"number="<<im+layer*88<<"\tq="<<m_q<<endl;
305 }
306 else
307 {
308 TofData* eTofData = *it;
309 // m_adc0 = (int)(eTofData->adc())&ADC_MASK;
310 adc1 = eTofData->adc();
311 tdc1 = eTofData->tdc();
312 npart = 2;
313 }
314
315 // if(!((*it)->barrel()) || ((*it)->barrel() && im+layer*88==tof1) )
316 if ( im + layer * 88 == tof1 )
317 {
318 m_adc1 = adc1;
319 m_adc2 = adc2;
320 m_tdc1 = tdc1;
321 m_tdc2 = tdc2;
322 m_ztdc = ztdc;
323 m_q = tofq;
324 m_npart = npart;
325 m_number = tof1;
326 m_zpos = zpos1;
327 m_length = l1;
328 m_length_ext = lext;
329 // m_energy = l1*8.9/50.;
330 m_energy = l1 * 10.25 / 5.;
331 m_energy_ext = lext * 10.25 / 5.;
332 // cout<<"zpos1="<<zpos1<<endl;
333
334 if ( abs( m_zpos ) < 0.6 && m_q > 500 && m_q < 4000 )
335 {
336 m_num++;
337 m_EvsQ = m_EvsQ + m_energy / m_q;
338 }
339 m_tuple->write();
340 }
341 else if ( ( *it )->barrel() && im + layer * 88 == tof2 )
342 {
343 m_adc1 = adc1;
344 m_adc2 = adc2;
345 m_tdc1 = tdc1;
346 m_tdc2 = tdc2;
347 m_ztdc = ztdc;
348 m_q = tofq;
349 m_npart = npart;
350 m_number = tof2;
351 m_zpos = zpos2;
352 m_length = l2;
353 m_length_ext = lext;
354 // m_energy = l2*8.9/50.;
355 m_energy = l2 * 10.25 / 5.;
356 m_energy_ext = lext * 10.25 / 5.;
357 // cout<<"zpos2="<<zpos2<<endl;
358 m_tuple->write();
359
360 if ( abs( m_zpos ) < 0.6 && m_q > 500 && m_q < 4000 )
361 {
362 m_num++;
363 m_EvsQ = m_EvsQ + m_energy / m_q;
364 }
365 }
366 }
367 }
368
369 return sc;
370}
double p2[4]
double p1[4]
EvtRecTrackCol::iterator EvtRecTrackIterator
IMessageSvc * msgSvc()
ITofQElecSvc * tofQElecSvc
ITofQCorrSvc * tofQCorrSvc
IRawDataProviderSvc * tofDigiSvc
ITofCaliSvc * tofCaliSvc
virtual TofDataVector & tofDataVectorTof(double estime=0)=0
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
double adc2()
Definition TofData.cxx:567
double adc()
Definition TofData.cxx:579
double tdc2()
Definition TofData.cxx:573
double tdc1()
Definition TofData.cxx:561
double adc1()
Definition TofData.cxx:555
double tdc()
Definition TofData.cxx:585
static int phi_module(const Identifier &id)
Definition TofID.cxx:65
static int layer(const Identifier &id)
Definition TofID.cxx:59

◆ finalize()

StatusCode TofEnergyCalib::finalize ( )

Definition at line 373 of file TofEnergyCalib.cxx.

373 {
374
375 MsgStream log( msgSvc(), name() );
376 log << MSG::INFO << "in finalize()" << endmsg;
377
378 int count;
379 char cnum[10];
380
381 count = sprintf( cnum, "%d", m_run );
382
383 std::string runnum = "";
384 runnum.append( cnum );
385 ofstream etofCalibOut;
386 std::string etofCalibFile = m_fileDir;
387 etofCalibFile += m_fileExt;
388 etofCalibFile += runnum;
389 etofCalibFile += "etofCalib.dat";
390 etofCalibOut.open( etofCalibFile.c_str() );
391 double etofCalib = m_EvsQ / m_num;
392 etofCalibOut << m_run << "\t" << m_num << "\t" << etofCalib << endl;
393
394 etofCalibOut.close();
395
396 return StatusCode::SUCCESS;
397}
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
DOUBLE_PRECISION count[3]

◆ initialize()

StatusCode TofEnergyCalib::initialize ( )

Definition at line 65 of file TofEnergyCalib.cxx.

65 {
66 MsgStream log( msgSvc(), name() );
67
68 log << MSG::INFO << "in initialize()" << endmsg;
69
70 StatusCode status;
71 NTuplePtr nt( ntupleSvc(), "FILE1/dimu" );
72 if ( nt ) m_tuple = nt;
73 else
74 {
75 m_tuple = ntupleSvc()->book( "FILE1/dimu", CLID_ColumnWiseTuple, "ks N-Tuple example" );
76 if ( m_tuple )
77 {
78 status = m_tuple->addItem( "npart", m_npart );
79 status = m_tuple->addItem( "number", m_number );
80 status = m_tuple->addItem( "adc1", m_adc1 );
81 status = m_tuple->addItem( "adc2", m_adc2 );
82 status = m_tuple->addItem( "tdc1", m_tdc1 );
83 status = m_tuple->addItem( "tdc2", m_tdc2 );
84 status = m_tuple->addItem( "zpos", m_zpos );
85 status = m_tuple->addItem( "length", m_length );
86 status = m_tuple->addItem( "energy", m_energy );
87 status = m_tuple->addItem( "lengthext", m_length_ext );
88 status = m_tuple->addItem( "energyext", m_energy_ext );
89 status = m_tuple->addItem( "ztdc", m_ztdc );
90 status = m_tuple->addItem( "q", m_q );
91 }
92 else
93 {
94 log << MSG::ERROR << " Cannot book N-tuple:" << long( m_tuple ) << endmsg;
95 return StatusCode::FAILURE;
96 }
97 }
98 //
99 //--------end of book--------
100 //
101
102 log << MSG::INFO << "successfully return from initialize()" << endmsg;
103 return StatusCode::SUCCESS;
104}
INTupleSvc * ntupleSvc()

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