BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
TofEnergyCalib.cxx
Go to the documentation of this file.
1
2extern "C" {}
3#include <fstream>
4#include <iostream>
5
6#include "CLHEP/Vector/ThreeVector.h"
7#include "EventModel/Event.h"
8#include "EventModel/EventHeader.h"
9#include "EventModel/EventModel.h"
10#include "EvtRecEvent/EvtRecEvent.h"
11#include "EvtRecEvent/EvtRecTrack.h"
12#include "GaudiKernel/Bootstrap.h"
13#include "GaudiKernel/IDataProviderSvc.h"
14#include "GaudiKernel/IHistogramSvc.h"
15#include "GaudiKernel/INTupleSvc.h"
16#include "GaudiKernel/ISvcLocator.h"
17#include "GaudiKernel/MsgStream.h"
18#include "GaudiKernel/NTuple.h"
19#include "GaudiKernel/PropertyMgr.h"
20#include "GaudiKernel/SmartDataPtr.h"
21#include "TMath.h"
22using CLHEP::Hep3Vector;
23#include "CLHEP/Vector/LorentzVector.h"
24using CLHEP::HepLorentzVector;
25#include "CLHEP/Vector/TwoVector.h"
26using CLHEP::Hep2Vector;
27#include "CLHEP/Geometry/Point3D.h"
28#ifndef ENABLE_BACKWARDS_COMPATIBILITY
29typedef HepGeom::Point3D<double> HepPoint3D;
30#endif
31#include "TofEnergyCalib.h"
32#include "VertexFit/KinematicFit.h"
33#include "VertexFit/VertexFit.h"
34// #include "AnalEvent/BParticle.h"
35// #include "AnalEvent/BTrack.h"
36#include "Identifier/TofID.h"
37#include "RawDataProviderSvc/IRawDataProviderSvc.h"
38#include "RawDataProviderSvc/TofData.h"
39#include "RawEvent/RawDataUtil.h"
40#include "TofCaliSvc/ITofCaliSvc.h"
41#include "TofQCorrSvc/ITofQCorrSvc.h"
42#include "TofQElecSvc/ITofQElecSvc.h"
43#include "TofRawEvent/TofDigi.h"
44#include "TofRecEvent/RecBTofCalHit.h"
45#include "TofRecEvent/RecETofCalHit.h"
46#include <vector>
47typedef std::vector<int> Vint;
48
49/////////////////////////////////////////////////////////////////////////////
51TofEnergyCalib::TofEnergyCalib( const std::string& name, ISvcLocator* pSvcLocator )
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}
63
64// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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}
105
106// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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
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
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
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
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}
371
372// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
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}
double p2[4]
double p1[4]
DECLARE_COMPONENT(BesBdkRc)
HepGeom::Point3D< double > HepPoint3D
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)
EvtRecTrackCol::iterator EvtRecTrackIterator
DOUBLE_PRECISION count[3]
std::vector< int > Vint
Definition Gam4pikp.cxx:37
INTupleSvc * ntupleSvc()
IMessageSvc * msgSvc()
ITofQElecSvc * tofQElecSvc
ITofQCorrSvc * tofQCorrSvc
IRawDataProviderSvc * tofDigiSvc
ITofCaliSvc * tofCaliSvc
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
TofEnergyCalib(const std::string &name, ISvcLocator *pSvcLocator)
StatusCode initialize()
StatusCode finalize()
StatusCode execute()
static int phi_module(const Identifier &id)
Definition TofID.cxx:65
static int layer(const Identifier &id)
Definition TofID.cxx:59