/[PAMELA software]/DarthVader/ToFLevel2/src/ToFLevel2.cpp
ViewVC logotype

Contents of /DarthVader/ToFLevel2/src/ToFLevel2.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.46 - (show annotations) (download)
Tue May 19 10:49:14 2015 UTC (9 years, 6 months ago) by pam-fi
Branch: MAIN
Changes since 1.45: +6 -2 lines
bug in ToFLevel2::GetdEdx(...) and ToFLevel2::GetdEdxPaddle(...) methods fixed

1 /**
2 * \file ToFLevel2.cpp
3 * \author Gianfranca DeRosa, Wolfgang Menn
4 *
5 * WM dec 2008: Description of "GetdEdx" changed
6 * WM dec 2008: "GetdEdxPaddle" modified: Now includes saturation limit
7 * PMTs higher than the saturation limit are not used for dEdx
8 * WM apr 2009: bug found by Nicola in method "GetPaddlePlane"
9 */
10
11 #include <ToFLevel2.h>
12 using namespace std;
13 ClassImp(ToFPMT);
14 ClassImp(ToFdEdx);
15 ClassImp(ToFGeom);
16 ClassImp(ToFTrkVar);
17 ClassImp(ToFLevel2);
18
19 ToFPMT::ToFPMT(){
20 pmt_id = 0;
21 adc = 0.;
22 tdc_tw = 0.;
23 tdc = 0.;
24 l0flag_adc = 0.;
25 l0flag_tdc = 0.;
26 }
27
28 ToFPMT::ToFPMT(const ToFPMT &t){
29 pmt_id = t.pmt_id;
30 adc = t.adc;
31 tdc_tw = t.tdc_tw;
32 tdc = t.tdc;
33 }
34
35 void ToFPMT::Clear(Option_t *t){
36 pmt_id = 0;
37 adc = 0.;
38 tdc_tw = 0.;
39 tdc = 0.;
40 }
41
42
43
44 ToFTrkVar::ToFTrkVar() {
45 trkseqno = 0;
46 npmttdc = 0;
47 npmtadc = 0;
48 pmttdc = TArrayI(48);
49 pmtadc = TArrayI(48);
50 tdcflag = TArrayI(48); // gf: 30 Nov 2006
51 adcflag = TArrayI(48); // gf: 30 Nov 2006
52 dedx = TArrayF(48);
53 //
54 //
55 memset(beta, 0, 13*sizeof(Float_t));
56 memset(xtofpos, 0, 3*sizeof(Float_t));
57 memset(ytofpos, 0, 3*sizeof(Float_t));
58 memset(xtr_tof, 0, 6*sizeof(Float_t));
59 memset(ytr_tof, 0, 6*sizeof(Float_t));
60 //
61 };
62
63 void ToFTrkVar::Clear(Option_t *t) {
64 trkseqno = 0;
65 npmttdc = 0;
66 npmtadc = 0;
67 pmttdc.Reset();
68 pmtadc.Reset();
69 tdcflag.Reset(); // gf: 30 Nov 2006
70 adcflag.Reset(); // gf: 30 Nov 2006
71 dedx.Reset();
72 //
73 memset(beta, 0, 13*sizeof(Float_t));
74 memset(xtofpos, 0, 3*sizeof(Float_t));
75 memset(ytofpos, 0, 3*sizeof(Float_t));
76 memset(xtr_tof, 0, 6*sizeof(Float_t));
77 memset(ytr_tof, 0, 6*sizeof(Float_t));
78 //
79 };
80
81 ToFTrkVar::ToFTrkVar(const ToFTrkVar &t){
82
83 trkseqno = t.trkseqno;
84 //
85 npmttdc = t.npmttdc;
86 npmtadc = t.npmtadc;
87 (t.pmttdc).Copy(pmttdc);
88 (t.pmtadc).Copy(pmtadc);
89 (t.tdcflag).Copy(tdcflag); // gf: 30 Nov 2006
90 (t.adcflag).Copy(adcflag); // gf: 30 Nov 2006
91 (t.dedx).Copy(dedx);
92 //
93 memcpy(beta,t.beta,sizeof(beta));
94 memcpy(xtofpos,t.xtofpos,sizeof(xtofpos));
95 memcpy(ytofpos,t.ytofpos,sizeof(ytofpos));
96 memcpy(xtr_tof,t.xtr_tof,sizeof(xtr_tof));
97 memcpy(ytr_tof,t.ytr_tof,sizeof(ytr_tof));
98 //
99 };
100
101 ToFLevel2::ToFLevel2() {
102 //
103 // PMT = new TClonesArray("ToFPMT",12); //ELENA
104 // ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
105 PMT = 0; //ELENA
106 ToFTrk = 0; //ELENA
107 //
108 this->Clear();
109 //
110 };
111
112 void ToFLevel2::Set(){//ELENA
113 if(!PMT)PMT = new TClonesArray("ToFPMT",12); //ELENA
114 if(!ToFTrk)ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
115 }//ELENA
116 //--------------------------------------
117 //
118 //
119 //--------------------------------------
120 void ToFLevel2::SetTrackArray(TClonesArray *track){//ELENA
121 if(track && strcmp(track->GetClass()->GetName(),"ToFTrkVar")==0){
122 if(ToFTrk)ToFTrk->Clear("C");
123 ToFTrk = track;
124 }
125 }
126
127 void ToFLevel2::Clear(Option_t *t){
128 //
129 if(ToFTrk)ToFTrk->Delete(); //ELENA
130 if(PMT)PMT->Delete(); //ELENA
131 memset(tof_j_flag, 0, 6*sizeof(Int_t));
132 unpackError = 0;
133 unpackWarning = 0;
134 //
135 };
136
137 void ToFLevel2::Delete(Option_t *t){ //ELENA
138 //
139 if(ToFTrk){
140 ToFTrk->Delete(); //ELENA
141 delete ToFTrk; //ELENA
142 }
143 if(PMT){
144 PMT->Delete(); //ELENA
145 delete PMT; //ELENA
146 } //ELENA
147 //
148 }; //ELENA
149
150 ToFTrkVar *ToFLevel2::GetToFTrkVar(Int_t itrk){
151 //
152 if(itrk >= ntrk()){
153 printf(" ToFLevel2 ERROR: track related variables set %i does not exists! \n",itrk);
154 printf(" stored track related variables = %i \n",ntrk());
155 return(NULL);
156 }
157 //
158 if(!ToFTrk)return 0; //ELENA
159 TClonesArray &t = *(ToFTrk);
160 ToFTrkVar *toftrack = (ToFTrkVar*)t[itrk];
161 return toftrack;
162 }
163
164 /**
165 * Retrieves the tof track matching the seqno-th tracker stored track.
166 *
167 */
168 ToFTrkVar *ToFLevel2::GetToFStoredTrack(int seqno){
169
170 if( ntrk()==0 ){
171 printf("ToFLevel2::GetToFStoredTrack(int) : requested tracker SeqNo %i but no ToFrimeter tracks are stored\n",seqno);
172 return NULL;
173 };
174
175 ToFTrkVar *c = 0;
176 Int_t it_tof=0;
177
178 do {
179 c = GetToFTrkVar(it_tof);
180 it_tof++;
181 } while( c && seqno != c->trkseqno && it_tof < ntrk());
182
183 if(!c || seqno != c->trkseqno){
184 c = 0;
185 if(seqno!=-1 ) printf("ToFLevel2::GetToFStoredTrack(int) : requested tracker SeqNo %i does not match ToFrimeter stored tracks\n",seqno);
186 };
187 return c;
188
189 }
190
191
192 ToFPMT *ToFLevel2::GetToFPMT(Int_t ihit){
193 //
194 if(ihit >= npmt()){
195 printf(" ToFLevel2 ERROR: pmt variables set %i does not exists! \n",ihit);
196 printf(" stored pmt variables = %i \n",npmt());
197 return(NULL);
198 }
199 //
200 if(!PMT)return 0; //ELENA
201 TClonesArray &t = *(PMT);
202 ToFPMT *tofpmt = (ToFPMT*)t[ihit];
203 return tofpmt;
204 }
205 //--------------------------------------
206 //
207 //
208 //--------------------------------------
209 /**
210 * Method to get the plane ID (11 12 21 22 31 32) from the plane index (0 1 2 3 4 5)
211 * @param Plane index (0,1,2,3,4,5).
212 */
213 Int_t ToFLevel2::GetToFPlaneID(Int_t ip){
214 if(ip>=0 && ip<6)return 10*((int)(ip/2+1.1))+(ip%2)+1;
215 else return -1;
216 };
217 /**
218 * Method to get the plane index (0 1 2 3 4 5) from the plane ID (11 12 21 22 31 32)
219 * @param plane Plane ID (11, 12, 21, 22, 31, 32)
220 */
221 Int_t ToFLevel2::GetToFPlaneIndex(Int_t plane_id){
222 if(
223 plane_id == 11 ||
224 plane_id == 12 ||
225 plane_id == 21 ||
226 plane_id == 22 ||
227 plane_id == 31 ||
228 plane_id == 32 ||
229 false)return (Int_t)(plane_id/10)*2-1- plane_id%2;
230 else return -1;
231 };
232 /**
233 * Method to know if a given ToF paddle was hit, that is there is a TDC signal
234 * from both PMTs. The method uses the "tof_j_flag" variable.
235 * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
236 * @param paddle_id Paddle ID.
237 * @return 1 if the paddle was hit.
238 */
239 Bool_t ToFLevel2::HitPaddle(Int_t plane, Int_t paddle_id){ //<<< NEW
240 Int_t ip = -1;
241 if (plane>=6 ) ip = GetToFPlaneIndex(plane);
242 else if(plane>=0 && plane < 6) ip = plane;
243 Int_t flag=0;
244 if(ip != -1)flag = tof_j_flag[ip] & (int)pow(2.,(double)paddle_id);
245 if(
246 (ip == 0 && paddle_id < 8 && flag) ||
247 (ip == 1 && paddle_id < 6 && flag) ||
248 (ip == 2 && paddle_id < 2 && flag) ||
249 (ip == 3 && paddle_id < 2 && flag) ||
250 (ip == 4 && paddle_id < 3 && flag) ||
251 (ip == 5 && paddle_id < 3 && flag) ||
252 false) return true;
253 else return false;
254 };
255
256 /**
257 * Strict method to get the number of hit paddles on a ToF plane.
258 * The method uses "HitPaddle" which checks if there is a TDC signal
259 * from both PMTs.
260 * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
261 */
262 Int_t ToFLevel2::GetNHitPaddles(Int_t plane){
263 Int_t npad=0;
264 for(Int_t i=0; i<8; i++)npad = npad + (int)HitPaddle(plane,i);
265 return npad;
266 };
267
268 /**
269 * Optional method to get the number of hit paddles on a ToF plane.
270 * The method does NOT check if there is a signal from both PMTs, it only
271 * checks if there is some PMT signal in a paddle
272 * @param plane Plane ID (11, 12, 21, 22, 31, 32) or Plane index (0,1,2,3,4,5).
273 */
274 Int_t ToFLevel2::GetTrueNHitPaddles(Int_t plane){
275 Int_t npad=0;
276 TClonesArray* Pmt = this->PMT;
277 int paddle[24];
278 memset(paddle,0, 24*sizeof(int));
279 for(int i=0; i<Pmt->GetEntries(); i++) { //loop per vedere quale TOF è colpito
280 ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
281 int pplane = -1;
282 int ppaddle = -1;
283 GetPMTPaddle(pmthit->pmt_id,pplane,ppaddle);
284 if ( pplane == plane ) paddle[ppaddle]++;
285 }
286 for(int i=0;i<24;i++) if ( paddle[i]>0 ) npad++;
287
288 return npad;
289 };
290
291 //new, wm Feb 15
292 //wm Nov 08
293 //gf Apr 07
294 /**
295 * Method to get the mean dEdx from a ToF layer
296 * By definition there should be PMTs with dEdx values only in one paddle of a layer
297 * (the paddle hitted by the track), this method looks for the hitted paddle
298 * and gives the mean dEdx of that paddle as the output
299 * The method was modified for the "ToF-standalone" part in february 2015
300 * The "adcfl" option is not very useful (an artificial dEdx is per
301 * definition= 1 mip and not a real measurement), anyway left in the code
302 * @param notrack Track Number
303 * @param plane Plane index (0,1,2,3,4,5)
304 * @param adcflag in the plane (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
305 */
306 Float_t ToFLevel2::GetdEdx(Int_t notrack, Int_t plane, Int_t adcfl){
307 // ToFTrkVar *trk = GetToFTrkVar(notrack);
308 ToFTrkVar *trk = GetToFStoredTrack(notrack);//Elena 2015
309 return this->GetdEdx(trk, plane, adcfl);
310 }
311
312 //new, wm Feb 15
313 //wm Nov 08
314 //gf Apr 07
315 /**
316 * Method to get the mean dEdx from a ToF layer
317 * By definition there should be PMTs with dEdx values only in one paddle of a layer
318 * (the paddle hitted by the track), this method looks for the hitted paddle
319 * and gives the mean dEdx of that paddle as the output
320 * The method was modified for the "ToF-standalone" part in february 2015
321 * The "adcfl" option is not very useful (an artificial dEdx is per
322 * definition= 1 mip and not a real measurement), anyway left in the code
323 * @param trk Pointer to TofTrkVar object
324 * @param plane Plane index (0,1,2,3,4,5)
325 * @param adcflag in the plane (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
326 */
327 Float_t ToFLevel2::GetdEdx(ToFTrkVar *trk, Int_t plane, Int_t adcfl){
328
329 Float_t dedx = 0.;
330 Float_t PadEdx =0.;
331 Int_t SatWarning;
332 Int_t pad=-1;
333 //
334 if(!trk) cout << "ToFLevel2::GetdEdx(...) ---> NULL ToFTrkVar obj "<<endl;
335 if(!trk) return 0; //ELENA
336 //
337 // ToF standalone part
338 //
339 if ( trk->trkseqno == -1 ){
340
341 // ToFTrkVar *t_tof = trk;
342
343 // Find the hitted paddle (two good TDC values) using the tof_j_flag (from tofl2com.for)
344
345 Int_t Ipaddle=-1;
346 // if tof_j_flag == 0: no paddle was hitted. Otherwise decode tof_j_flag to get the paddle
347 if (this->tof_j_flag[plane] > 0) Ipaddle = (Int_t)log2(this->tof_j_flag[plane]) ;
348
349 Ipaddle = (Int_t)log2(this->tof_j_flag[plane]) ;
350
351 // Get the dEdx of this paddle using "GetdEdxPaddle"
352 if (Ipaddle>-1) {
353 Int_t pad = GetPaddleid(plane,Ipaddle);
354 GetdEdxPaddle(trk, pad, adcfl, PadEdx, SatWarning);
355 dedx = PadEdx;
356 }
357
358 // If there was no correct hitted paddle, but there was one (and only one) paddle with some
359 // PMT entries in the PMT-class (found with "GetTrueNHitPaddles", use the dEdx of this paddle
360
361 if ((Ipaddle<0) && (GetTrueNHitPaddles(plane)==1)) {
362 // find the paddle by looping over the paddles in each layer
363 // since GetTrueNHitPaddles==1 this is OK
364 for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
365 Int_t paddleid=ii;
366 Int_t pad = GetPaddleid(plane,paddleid);
367 GetdEdxPaddle(trk, pad, adcfl, PadEdx, SatWarning);
368 dedx += PadEdx;
369 }
370 }
371 } else {
372 // track dependent dEdx: simple, there will be only one paddle hitted in each layer
373 // so just loop over the paddles in each layer
374 for (Int_t ii=0; ii<GetNPaddle(plane); ii++){
375 Int_t paddleid=ii;
376 pad = GetPaddleid(plane,paddleid);
377 GetdEdxPaddle(trk, pad, adcfl, PadEdx, SatWarning);
378 dedx += PadEdx;
379 }
380 }
381 //
382 return(dedx);
383 }
384
385 /**
386 * Method to fill the ADC_C 4x12 matrix with the dEdx values and the TDC 4x12 matrix
387 * with the time-walk corrected TDC values.
388 * @param notrack Track Number
389 * @param adc ADC_C matrix with dEdx values
390 * @param tdc TDC matrix
391 */
392 void ToFLevel2::GetMatrix(Int_t notrack, Float_t adc[4][12], Float_t tdc[4][12]){
393 //
394 for (Int_t aa=0; aa<4;aa++){
395 for (Int_t bb=0; bb<12;bb++){
396 adc[aa][bb] = 1000.;
397 tdc[aa][bb] = 4095.;
398 };
399 };
400 //
401 Int_t pmt_id = 0;
402 Int_t hh = 0;
403 Int_t kk = 0;
404 //
405 ToFTrkVar *trk = GetToFTrkVar(notrack);
406 if(!trk)return; //ELENA
407 //
408 for (Int_t i=0; i<trk->npmtadc; i++){
409 //
410 pmt_id = (trk->pmtadc).At(i);
411 //
412 GetPMTIndex(pmt_id,hh,kk);
413 adc[kk][hh] = (trk->dedx).At(i);
414 //
415 };
416 //
417 for (Int_t i=0; i<npmt(); i++){
418 //
419 ToFPMT *pmt = GetToFPMT(i);
420 if(!pmt)break; //ELENA
421 //
422 GetPMTIndex(pmt->pmt_id,hh,kk);
423 //
424 tdc[kk][hh] = pmt->tdc_tw;
425 //
426 };
427 //
428 return;
429 };
430
431
432 /**
433 * Method to get the plane index (0 - 5) for the PMT_ID as input
434 * @param pmt_id PMT_ID (0 - 47)
435 */
436 Int_t ToFLevel2::GetPlaneIndex(Int_t pmt_id){
437 TString pmtname = GetPMTName(pmt_id);
438 pmtname.Resize(3);
439 if ( !strcmp(pmtname,"S11") ) return(0);
440 if ( !strcmp(pmtname,"S12") ) return(1);
441 if ( !strcmp(pmtname,"S21") ) return(2);
442 if ( !strcmp(pmtname,"S22") ) return(3);
443 if ( !strcmp(pmtname,"S31") ) return(4);
444 if ( !strcmp(pmtname,"S32") ) return(5);
445 return(-1);
446 };
447
448
449 /**
450 * Method to get the PMT_ID if the index (4,12) is given. We have 4 channels on
451 * each of the 12 half-boards, this method decodes which PMT is cables to which
452 * channel.
453 * @param hh Channel
454 * @param kk HalfBoard
455 */
456 Int_t ToFLevel2::GetPMTid(Int_t hh, Int_t kk){
457 //
458 static const short tof[4][24] = {
459 {4, 4, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 2, 3, 3, 3, 3, 4},
460 {1, 3, 5, 7, 10, 12, 2, 4, 2, 4, 6, 8, 10, 12, 1, 5, 3, 9, 7, 9, 11, 1, 5, 9},
461 {2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 2, 1, 2, 1, 2, 2, 2, 3, 3, 4},
462 {6, 8, 12, 10, 8, 6, 4, 2, 12, 10, 8, 6, 4, 2, 9, 7, 11, 11, 5, 3, 1, 3, 7, 11}
463 };
464 //
465 Int_t ind = 0;
466 Int_t k = 0;
467 while (k < 24){
468 Int_t j = 0;
469 while (j < 2){
470 Int_t ch = tof[2*j][k] - 1;
471 Int_t hb = tof[2*j + 1][k] - 1;
472 /* tofEvent->tdc[ch][hb] */
473 if( ch == hh && hb == kk ){
474 ind = 2*k + j;
475 break;
476 };
477 j++;
478 };
479 k++;
480 };
481 return ind;
482 };
483
484
485 /**
486 * Method to get the PMT index if the PMT ID is given. This method is the
487 * "reverse" of method "GetPMTid"
488 * @param ind PMT_ID (0 - 47)
489 * @param hb HalfBoard
490 * @param ch Channel
491 */
492 void ToFLevel2::GetPMTIndex(Int_t ind, Int_t &hb, Int_t &ch){
493 //
494 static const short tof[4][24] = {
495 {4, 4, 4, 4, 1, 1, 2, 2, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 2, 3, 3, 3, 3, 4},
496 {1, 3, 5, 7, 10, 12, 2, 4, 2, 4, 6, 8, 10, 12, 1, 5, 3, 9, 7, 9, 11, 1, 5, 9},
497 {2, 2, 2, 2, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 2, 1, 2, 1, 2, 2, 2, 3, 3, 4},
498 {6, 8, 12, 10, 8, 6, 4, 2, 12, 10, 8, 6, 4, 2, 9, 7, 11, 11, 5, 3, 1, 3, 7, 11}
499 };
500 //
501 Int_t k = 0;
502 while (k < 24){
503 Int_t j = 0;
504 while (j < 2){
505 /* tofEvent->tdc[ch][hb] */
506 if( ind == 2*k + j ){
507 ch = tof[2*j][k] - 1;
508 hb = tof[2*j + 1][k] - 1;
509 return;
510 };
511 j++;
512 };
513 k++;
514 };
515 return;
516 };
517
518
519
520 // wm Nov 08 revision - saturation values included
521 /// gf Apr 07
522 /**
523 * Method to get the dEdx from a given ToF paddle.
524 * If two PMTs are good, the mean dEdx of both PMTs is taken, otherwise
525 * just the dEdx of the "good" PMT. If both PMTs are above saturation => dEdx=1000
526 * @param notrack Track Number
527 * @param Paddle index (0,1,...,23).
528 * @param adcflag in the paddle (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
529 * @param PadEdx dEdx from a given ToF paddle
530 * @param SatWarning 1 if the PMT ios near saturation region (adcraw ~3000)
531 */
532 void ToFLevel2::GetdEdxPaddle(Int_t notrack, Int_t paddleid, Int_t adcfl, Float_t &PadEdx, Int_t &SatWarning){
533
534 // ToFTrkVar *trk = GetToFTrkVar(notrack);
535 ToFTrkVar *trk = GetToFStoredTrack(notrack); //Elena 2015
536 this->GetdEdxPaddle(trk, paddleid, adcfl, PadEdx, SatWarning);
537
538 };
539
540 //
541 // wm Nov 08 revision - saturation values included
542 /// gf Apr 07
543 /**
544 * Method to get the dEdx from a given ToF paddle.
545 * If two PMTs are good, the mean dEdx of both PMTs is taken, otherwise
546 * just the dEdx of the "good" PMT. If both PMTs are above saturation => dEdx=1000
547 * @param notrack Track Number
548 * @param Paddle index (0,1,...,23).
549 * @param adcflag in the paddle (100<-> independent of the adcflag; !=0&&!=100 <-> at least one PMT with adcflag!=0; )
550 * @param PadEdx dEdx from a given ToF paddle
551 * @param SatWarning 1 if the PMT ios near saturation region (adcraw ~3000)
552 */
553 void ToFLevel2::GetdEdxPaddle(ToFTrkVar *trk, Int_t paddleid, Int_t adcfl, Float_t &PadEdx, Int_t &SatWarning){
554
555 /*
556 Float_t PMTsat[48] = {
557 3162.14, 3165.48, 3153.85, 3085.73, 3089.65, 3107.64, 3097.52, 3078.37,
558 3130.05, 3087.07, 3112.22, 3102.92, 3080.58, 3092.55, 3087.94, 3125.03,
559 3094.09, 3143.16, 3125.51, 3181.27, 3092.09, 3124.98, 3069.3, 3095.53,
560 3097.11, 3133.53, 3114.73, 3113.01, 3091.19, 3097.99, 3033.84, 3134.98,
561 3081.37, 3111.04, 3066.77, 3108.17, 3133, 3111.06, 3052.52, 3140.66,
562 3106.33, 3094.85, 3150.85, 3118.8, 3096.24, 3118.47,3111.36, 3117.11 } ;
563 */
564
565 // new values from Napoli dec 2008
566 Float_t PMTsat[48] = {
567 3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
568 3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
569 3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
570 3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
571 3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
572 3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
573
574 for (Int_t i=0; i<48;i++) PMTsat[i] = PMTsat[i] - 5.; // safety margin
575
576
577 PadEdx = 0.;
578 // SatWarning = 1000;
579 SatWarning = 0; // 0=good, increase for each bad PMT
580
581 Float_t dEdx[48] = {0};
582 Int_t pmt_id = -1;
583 Float_t adcraw[48];
584 //
585 if(!trk)cout << "ToFLevel2::GetdEdxPaddle(...) ---> NULL ToFTrkVar obj "<<endl;
586 if(!trk) return; //ELENA
587 //
588
589 Int_t pmtleft=-1;
590 Int_t pmtright=-1;
591 GetPaddlePMT(paddleid, pmtleft, pmtright);
592
593 adcraw[pmtleft] = 4095;
594 adcraw[pmtright] = 4095;
595
596
597 for (Int_t jj=0; jj<npmt(); jj++){
598
599 ToFPMT *pmt = GetToFPMT(jj);
600 if(!pmt)break; //ELENA
601
602 pmt_id = pmt->pmt_id;
603 if(pmt_id==pmtleft){
604 adcraw[pmtleft] = pmt->adc;
605 }
606
607 if(pmt_id==pmtright){
608 adcraw[pmtright] = pmt->adc;
609 }
610 }
611
612
613 for (Int_t i=0; i<trk->npmtadc; i++){
614
615 if((trk->adcflag).At(i)==0 || adcfl==100){
616 if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = (trk->dedx).At(i);
617 if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = (trk->dedx).At(i);
618 }else{
619 if((trk->pmtadc).At(i) == pmtleft)dEdx[pmtleft] = 0.;
620 if((trk->pmtadc).At(i) == pmtright)dEdx[pmtright] = 0.;
621 }
622 }
623
624
625 // if( adcraw[pmtleft] >3000 || adcraw[pmtright] >3000)SatWarning=1; //old version
626
627 // Increase SatWarning Counter for each PMT>Sat
628 if( adcraw[pmtleft] > PMTsat[pmtleft])SatWarning++;
629 if( adcraw[pmtright] > PMTsat[pmtright])SatWarning++;
630
631 // if ADC > sat set dEdx=1000
632 if( adcraw[pmtleft] > PMTsat[pmtleft]) dEdx[pmtleft] = 1000.;
633 if( adcraw[pmtright] > PMTsat[pmtright]) dEdx[pmtright] = 1000. ;
634
635 // if two PMT are good, take mean dEdx, otherwise only the good dEdx
636 if(dEdx[pmtleft]<1000 && dEdx[pmtright]<1000) PadEdx = (dEdx[pmtleft]+dEdx[pmtright])*0.5;
637 if(dEdx[pmtleft]==1000 && dEdx[pmtright]<1000) PadEdx = dEdx[pmtright];
638 if(dEdx[pmtleft]<1000 && dEdx[pmtright]==1000) PadEdx = dEdx[pmtleft];
639
640 };
641
642 // gf Apr 07
643
644 /**
645 * Method to get the PMT name (like "S11_1A") if the PMT_ID is given.
646 * Indexes of corresponding plane, paddle and pmt are also given as output.
647 * @param ind PMT_ID (0 - 47)
648 * @param iplane plane index (0 - 5)
649 * @param ipaddle paddle index (relative to the plane)
650 * @param ipmt pmt index (0(A), 1(B))
651 */
652 TString ToFLevel2::GetPMTName(Int_t ind, Int_t &iplane, Int_t &ipaddle,Int_t &ipmt){
653
654 TString pmtname = " ";
655
656 static const TString photoS[48] = {
657 "S11_1A", "S11_1B", "S11_2A", "S11_2B", "S11_3A", "S11_3B", "S11_4A",
658 "S11_4B",
659 "S11_5A", "S11_5B", "S11_6A", "S11_6B", "S11_7A", "S11_7B", "S11_8A",
660 "S11_8B",
661 "S12_1A", "S12_1B", "S12_2A", "S12_2B", "S12_3A", "S12_3B", "S12_4A",
662 "S12_4B", "S12_5A", "S12_5B", "S12_6A", "S12_6B",
663 "S21_1A", "S21_1B", "S21_2A", "S21_2B",
664 "S22_1A", "S22_1B", "S22_2A", "S22_2B",
665 "S31_1A", "S31_1B", "S31_2A", "S31_2B", "S31_3A", "S31_3B",
666 "S32_1A", "S32_1B", "S32_2A", "S32_2B", "S32_3A", "S32_3B"
667 };
668
669
670 pmtname = photoS[ind].Data();
671
672 TString ss = pmtname(1,2);
673 iplane = (int)(atoi(ss.Data())/10)*2-3+atoi(ss.Data())%10;
674 ss = pmtname(4);
675 ipaddle = atoi(ss.Data())-1 ;
676 if( pmtname.Contains("A") )ipmt=0;
677 if( pmtname.Contains("B") )ipmt=1;
678
679 return pmtname;
680 };
681 /**
682 * Method to get the PMT name (like "S11_1A") if the PMT_ID is given
683 * @param ind PMT_ID (0 - 47)
684 */
685 TString ToFLevel2::GetPMTName(Int_t ind){
686
687 Int_t iplane = -1;
688 Int_t ipaddle = -1;
689 Int_t ipmt = -1;
690 return GetPMTName(ind,iplane,ipaddle,ipmt);
691
692 };
693
694 // wm jun 08
695 Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane){
696 return GetPaddleIdOfTrack(xtr ,ytr ,plane, 0.4);
697 }
698
699 // gf Apr 07
700 Int_t ToFLevel2::GetPaddleIdOfTrack(Float_t xtr, Float_t ytr, Int_t plane, Float_t margin){
701
702 Double_t xt,yt,xl,xh,yl,yh;
703
704 Float_t tof11_x[8] = {-17.85,-12.75,-7.65,-2.55,2.55,7.65,12.75,17.85};
705 Float_t tof12_y[6] = { -13.75,-8.25,-2.75,2.75,8.25,13.75};
706 Float_t tof21_y[2] = { 3.75,-3.75};
707 Float_t tof22_x[2] = { -4.5,4.5};
708 Float_t tof31_x[3] = { -6.0,0.,6.0};
709 Float_t tof32_y[3] = { -5.0,0.0,5.0};
710
711 // S11 8 paddles 33.0 x 5.1 cm
712 // S12 6 paddles 40.8 x 5.5 cm
713 // S21 2 paddles 18.0 x 7.5 cm
714 // S22 2 paddles 15.0 x 9.0 cm
715 // S31 3 paddles 15.0 x 6.0 cm
716 // S32 3 paddles 18.0 x 5.0 cm
717
718 Int_t paddleidoftrack=-1;
719 //
720
721 //--- S11 ------
722
723 if(plane==0){
724 xt = xtr;
725 yt = ytr;
726 paddleidoftrack=-1;
727 yl = -33.0/2. ;
728 yh = 33.0/2. ;
729 if ((yt>yl)&&(yt<yh)) {
730 for (Int_t i1=0; i1<8;i1++){
731 xl = tof11_x[i1] - (5.1-margin)/2. ;
732 xh = tof11_x[i1] + (5.1-margin)/2. ;
733 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
734 }
735 }
736 }
737 // cout<<"S11 "<<paddleidoftrack[0]<<"\n";
738
739 //--- S12 -------
740 if(plane==1){
741 xt = xtr;
742 yt = ytr;
743 paddleidoftrack=-1;
744 xl = -40.8/2. ;
745 xh = 40.8/2. ;
746
747 if ((xt>xl)&&(xt<xh)) {
748 for (Int_t i1=0; i1<6;i1++){
749 yl = tof12_y[i1] - (5.5-margin)/2. ;
750 yh = tof12_y[i1] + (5.5-margin)/2. ;
751 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
752 }
753 }
754 }
755
756 //--- S21 ------
757
758 if(plane==2){
759 xt = xtr;
760 yt = ytr;
761 paddleidoftrack=-1;
762 xl = -18./2. ;
763 xh = 18./2. ;
764
765 if ((xt>xl)&&(xt<xh)) {
766 for (Int_t i1=0; i1<2;i1++){
767 yl = tof21_y[i1] - (7.5-margin)/2. ;
768 yh = tof21_y[i1] + (7.5-margin)/2. ;
769 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
770 }
771 }
772 }
773
774 //--- S22 ------
775 if(plane==3){
776 xt = xtr;
777 yt = ytr;
778 paddleidoftrack=-1;
779 yl = -15./2. ;
780 yh = 15./2. ;
781
782 if ((yt>yl)&&(yt<yh)) {
783 for (Int_t i1=0; i1<2;i1++){
784 xl = tof22_x[i1] - (9.0-margin)/2. ;
785 xh = tof22_x[i1] + (9.0-margin)/2. ;
786 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
787 }
788 }
789 }
790
791 //--- S31 ------
792 if(plane==4){
793 xt = xtr;
794 yt = ytr;
795 paddleidoftrack=-1;
796 yl = -15.0/2. ;
797 yh = 15.0/2. ;
798
799 if ((yt>yl)&&(yt<yh)) {
800 for (Int_t i1=0; i1<3;i1++){
801 xl = tof31_x[i1] - (6.0-margin)/2. ;
802 xh = tof31_x[i1] + (6.0-margin)/2. ;
803 if ((xt>xl)&&(xt<xh)) paddleidoftrack=i1;
804 }
805 }
806 }
807
808 //--- S32 ------
809 if(plane==5){
810 xt = xtr;
811 yt = ytr;
812 paddleidoftrack=-1;
813 xl = -18.0/2. ;
814 xh = 18.0/2. ;
815
816 if ((xt>xl)&&(xt<xh)) {
817 for (Int_t i1=0; i1<3;i1++){
818 yl = tof32_y[i1] - (5.0-margin)/2. ;
819 yh = tof32_y[i1] + (5.0-margin)/2. ;
820 if ((yt>yl)&&(yt<yh)) paddleidoftrack=i1;
821 }
822 }
823 }
824
825 return paddleidoftrack;
826
827 }
828
829 //
830
831 // gf Apr 07
832
833 void ToFLevel2::GetPMTPaddle(Int_t pmt_id, Int_t &plane, Int_t &paddle){
834
835 plane = GetPlaneIndex(pmt_id);
836
837 if(plane == 0){
838 if(pmt_id==0 || pmt_id==1)paddle=0;
839 if(pmt_id==2 || pmt_id==3)paddle=1;
840 if(pmt_id==4 || pmt_id==5)paddle=2;
841 if(pmt_id==6 || pmt_id==7)paddle=3;
842 if(pmt_id==8 || pmt_id==9)paddle=4;
843 if(pmt_id==10 || pmt_id==11)paddle=5;
844 if(pmt_id==12 || pmt_id==13)paddle=6;
845 if(pmt_id==14 || pmt_id==15)paddle=7;
846 }
847
848 if(plane == 1){
849 if(pmt_id==16 || pmt_id==17)paddle=0;
850 if(pmt_id==18 || pmt_id==19)paddle=1;
851 if(pmt_id==20 || pmt_id==21)paddle=2;
852 if(pmt_id==22 || pmt_id==23)paddle=3;
853 if(pmt_id==24 || pmt_id==25)paddle=4;
854 if(pmt_id==26 || pmt_id==27)paddle=5;
855 }
856
857 if(plane == 2){
858 if(pmt_id==28 || pmt_id==29)paddle=0;
859 if(pmt_id==30 || pmt_id==31)paddle=1;
860 }
861
862 if(plane == 3){
863 if(pmt_id==32 || pmt_id==33)paddle=0;
864 if(pmt_id==34 || pmt_id==35)paddle=1;
865 }
866
867 if(plane == 4){
868 if(pmt_id==36 || pmt_id==37)paddle=0;
869 if(pmt_id==38 || pmt_id==39)paddle=1;
870 if(pmt_id==40 || pmt_id==41)paddle=2;
871 }
872
873 if(plane == 5){
874 if(pmt_id==42 || pmt_id==43)paddle=0;
875 if(pmt_id==44 || pmt_id==45)paddle=1;
876 if(pmt_id==46 || pmt_id==47)paddle=2;
877 }
878 return;
879 }
880
881 //
882
883 // gf Apr 07
884
885 void ToFLevel2::GetPaddlePMT(Int_t paddle, Int_t &pmtleft, Int_t &pmtright){
886 pmtleft=paddle*2;
887 pmtright= pmtleft+1;
888 return;
889 }
890
891 //
892
893
894
895 // // gf Apr 07
896
897 void ToFLevel2::GetPaddleGeometry(Int_t plane, Int_t paddle, Float_t &xleft, Float_t &xright, Float_t &yleft, Float_t &yright){
898
899 Int_t i1;
900
901 Float_t tof11_x[8] = {-17.85,-12.75,-7.65,-2.55,2.55,7.65,12.75,17.85};
902 Float_t tof12_y[6] = { -13.75,-8.25,-2.75,2.75,8.25,13.75};
903 Float_t tof21_y[2] = { 3.75,-3.75};
904 Float_t tof22_x[2] = { -4.5,4.5};
905 Float_t tof31_x[3] = { -6.0,0.,6.0};
906 Float_t tof32_y[3] = { -5.0,0.0,5.0};
907
908 // S11 8 paddles 33.0 x 5.1 cm
909 // S12 6 paddles 40.8 x 5.5 cm
910 // S21 2 paddles 18.0 x 7.5 cm
911 // S22 2 paddles 15.0 x 9.0 cm
912 // S31 3 paddles 15.0 x 6.0 cm
913 // S32 3 paddles 18.0 x 5.0 cm
914
915 if(plane==0)
916 {
917 for (i1=0; i1<8;i1++){
918 if(i1 == paddle){
919 xleft = tof11_x[i1] - 5.1/2.;
920 xright = tof11_x[i1] + 5.1/2.;
921 yleft = -33.0/2.;
922 yright = 33.0/2.;
923 }
924 }
925 }
926
927 if(plane==1)
928 {
929 for (i1=0; i1<6;i1++){
930 if(i1 == paddle){
931 xleft = -40.8/2.;
932 xright = 40.8/2.;
933 yleft = tof12_y[i1] - 5.5/2.;
934 yright = tof12_y[i1] + 5.5/2.;
935 }
936 }
937 }
938
939 if(plane==2)
940 {
941 for (i1=0; i1<2;i1++){
942 if(i1 == paddle){
943 xleft = -18./2.;
944 xright = 18./2.;
945 yleft = tof21_y[i1] - 7.5/2.;
946 yright = tof21_y[i1] + 7.5/2.;
947 }
948 }
949 }
950
951 if(plane==3)
952 {
953 for (i1=0; i1<2;i1++){
954 if(i1 == paddle){
955 xleft = tof22_x[i1] - 9.0/2.;
956 xright = tof22_x[i1] + 9.0/2.;
957 yleft = -15./2.;
958 yright = 15./2.;
959 }
960 }
961 }
962
963
964 if(plane==4)
965 {
966 for (i1=0; i1<3;i1++){
967 if(i1 == paddle){
968 xleft = tof31_x[i1] - 6.0/2.;
969 xright = tof31_x[i1] + 6.0/2.;
970 yleft = -15./2.;
971 yright = 15./2.;
972 }
973 }
974 }
975
976 if(plane==5)
977 {
978 for (i1=0; i1<3;i1++){
979 if(i1 == paddle){
980 xleft = -18.0/2.;
981 xright = 18.0/2.;
982 yleft = tof32_y[i1] - 5.0/2.;
983 yright = tof32_y[i1] + 5.0/2.;
984 }
985 }
986 }
987 return;
988 }
989
990 // gf Apr 07
991 /**
992 * Method to get the paddle index (0,...23) if the plane ID and the paddle id in the plane is given.
993 * This method is the
994 * "reverse" of method "GetPaddlePlane"
995 * @param plane (0 - 5)
996 * @param paddle (plane=0, paddle = 0,...5)
997 * @param padid (0 - 23)
998 */
999 Int_t ToFLevel2::GetPaddleid(Int_t plane, Int_t paddle)
1000 {
1001 Int_t padid=-1;
1002 Int_t pads[6]={8,6,2,2,3,3};
1003
1004 int somma=0;
1005 int np=plane;
1006 for(Int_t j=0; j<np; j++){
1007 somma+=pads[j];
1008 }
1009 padid=paddle+somma;
1010 return padid;
1011
1012 }
1013
1014
1015 // gf Apr 07
1016 /**
1017 * Method to get the plane ID and the paddle id in the plane if the paddle index (0,...23) is given.
1018 * This method is the
1019 * "reverse" of method "GetPaddleid"
1020 * @param pad (0 - 23)
1021 * @param plane (0 - 5)
1022 * @param paddle (plane=0, paddle = 0,...5)
1023 */
1024 void ToFLevel2::GetPaddlePlane(Int_t pad, Int_t &plane, Int_t &paddle)
1025 {
1026
1027 Int_t pads11=8;
1028 Int_t pads12=6;
1029 Int_t pads21=2;
1030 Int_t pads22=2;
1031 Int_t pads31=3;
1032 // Int_t pads32=3;
1033
1034 if(pad<8){
1035 plane=0;
1036 paddle=pad;
1037 return;
1038 }
1039
1040 if((7<pad)&&(pad<14)){
1041 plane=1;
1042 paddle=pad-pads11;
1043 return;
1044 }
1045
1046 if((13<pad)&&(pad<16)){
1047 plane=2;
1048 paddle=pad-pads11-pads12;
1049 return;
1050 }
1051
1052 if((15<pad)&&(pad<18)){
1053 plane=3;
1054 paddle=pad-pads11-pads12-pads21;
1055 return;
1056 }
1057
1058 if((17<pad)&&(pad<21)){
1059 plane=4;
1060 paddle=pad-pads11-pads12-pads21-pads22;
1061 return;
1062 }
1063
1064 if((20<pad)&&(pad<24)){
1065 plane=5;
1066 paddle=pad-pads11-pads12-pads21-pads22-pads31;
1067 return;
1068 }
1069
1070 }
1071
1072
1073 Int_t ToFLevel2::GetNPaddle(Int_t plane){
1074
1075 Int_t npaddle=-1;
1076
1077 Int_t pads11=8;
1078 Int_t pads12=6;
1079 Int_t pads21=2;
1080 Int_t pads22=2;
1081 Int_t pads31=3;
1082 Int_t pads32=3;
1083
1084 if(plane==0)npaddle=pads11;
1085 if(plane==1)npaddle=pads12;
1086 if(plane==2)npaddle=pads21;
1087 if(plane==3)npaddle=pads22;
1088 if(plane==4)npaddle=pads31;
1089 if(plane==5)npaddle=pads32;
1090
1091 return npaddle;
1092
1093 }
1094
1095
1096
1097 /// wm feb 08
1098
1099 /**
1100 * Method to calculate Beta from the 12 single measurements
1101 * we check the individual weights for artificial TDC values, then calculate
1102 * am mean beta for the first time. In a second step we loop again through
1103 * the single measurements, checking for the residual from the mean
1104 * The cut on the residual reject measurements > "x"-sigma. A chi2 value is
1105 * calculated, furthermore a "quality" value by adding the weights which
1106 * are finally used. If all measurements are taken, "quality" will be = 22.47.
1107 * A chi2 cut around 3-4 and a quality-cut > 20 is needed for clean beta
1108 * measurements like antiprotons etc.
1109 * The Level2 output is derived in the fortran routines using: 10.,10.,20.
1110 * @param notrack Track Number
1111 * @param cut on residual: difference between single measurement and mean
1112 * @param cut on "quality"
1113 * @param cut on chi2
1114 */
1115
1116
1117 Float_t ToFTrkVar::CalcBeta( Float_t resmax, Float_t qualitycut, Float_t chi2cut){
1118
1119
1120 Float_t bxx = 100.;
1121 //
1122 ToFTrkVar *trk = this;
1123
1124
1125 Float_t chi2,xhelp,beta_mean;
1126 Float_t w_i[12],quality,sw,sxw,res,betachi,beta_mean_inv;
1127 Float_t b[12],tdcfl;
1128 Int_t pmt_id,pmt_plane;
1129
1130 for (Int_t i=0; i<12; i++){
1131 b[i] = trk->beta[i];
1132 }
1133
1134
1135 //========================================================================
1136 //--- Find out ToF layers with artificial TDC values & fill vector ---
1137 //========================================================================
1138
1139 Float_t w_il[6];
1140
1141 for (Int_t jj=0; jj<6;jj++) {
1142 w_il[jj] = 1000.;
1143 }
1144
1145
1146 for (Int_t i=0; i<trk->npmttdc; i++){
1147 //
1148 pmt_id = (trk->pmttdc).At(i);
1149 pmt_plane = ToFLevel2::GetPlaneIndex(pmt_id);
1150 tdcfl = (trk->tdcflag).At(i);
1151 if (w_il[pmt_plane] != 1.) w_il[pmt_plane] = tdcfl; //tdcflag
1152 };
1153
1154 //========================================================================
1155 //--- Set weights for the 12 measurements using information for top and bottom:
1156 //--- if no measurements: weight = set to very high value=> not used
1157 //--- top or bottom artificial: weight*sqrt(2)
1158 //--- top and bottom artificial: weight*sqrt(2)*sqrt(2)
1159 //========================================================================
1160
1161 Int_t itop[12] = {0,0,1,1,2,2,3,3,0,0,1,1};
1162 Int_t ibot[12] = {4,5,4,5,4,5,4,5,2,3,2,3};
1163
1164 xhelp= 1E09;
1165
1166 for (Int_t jj=0; jj<12;jj++) {
1167 if (jj<4) xhelp = 0.11; // S1-S3
1168 if ((jj>3)&&(jj<8)) xhelp = 0.18; // S2-S3
1169 if (jj>7) xhelp = 0.28; // S1-S2
1170 if ((w_il[itop[jj]] == 1000.) && (w_il[ibot[jj]] == 1000.)) xhelp = 1E09;
1171 if ((w_il[itop[jj]] == 1) || (w_il[ibot[jj]] == 1.)) xhelp = xhelp*1.414 ;
1172 if ((w_il[itop[jj]] == 1) && (w_il[ibot[jj]] == 1.)) xhelp = xhelp*2. ;
1173
1174 w_i[jj] = 1./xhelp;
1175 }
1176
1177
1178 //========================================================================
1179 //--- Calculate mean beta for the first time -----------------------------
1180 //--- We are using "1/beta" since its error is gaussian ------------------
1181 //========================================================================
1182
1183 Int_t icount=0;
1184 sw=0.;
1185 sxw=0.;
1186 beta_mean=100.;
1187
1188 for (Int_t jj=0; jj<12;jj++){
1189 if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.))
1190 {
1191 icount= icount+1;
1192 sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1193 sw =sw + w_i[jj]*w_i[jj] ;
1194
1195 }
1196 }
1197
1198 if (icount>0) beta_mean=1./(sxw/sw);
1199 beta_mean_inv = 1./beta_mean;
1200
1201 //========================================================================
1202 //--- Calculate beta for the second time, use residuals of the single
1203 //--- measurements to get a chi2 value
1204 //========================================================================
1205
1206 icount=0;
1207 sw=0.;
1208 sxw=0.;
1209 betachi = 100.;
1210 chi2 = 0.;
1211 quality=0.;
1212
1213
1214 for (Int_t jj=0; jj<12;jj++){
1215 if ((fabs(1./b[jj])>0.1)&&(fabs(1./b[jj])<15.)&&(w_i[jj]>0.01)) {
1216 res = beta_mean_inv - (1./b[jj]) ;
1217 if (fabs(res*w_i[jj])<resmax) {;
1218 chi2 = chi2 + pow((res*w_i[jj]),2) ;
1219 icount= icount+1;
1220 sxw=sxw + (1./b[jj])*w_i[jj]*w_i[jj] ;
1221 sw =sw + w_i[jj]*w_i[jj] ;
1222 }
1223 }
1224 }
1225 quality = sqrt(sw) ;
1226
1227 if (icount==0) chi2 = 1000.;
1228 if (icount>0) chi2 = chi2/(icount) ;
1229 if (icount>0) betachi=1./(sxw/sw);
1230
1231 bxx = 100.;
1232 if ((chi2 < chi2cut)&&(quality>qualitycut)) bxx = betachi;
1233 //
1234 return(bxx);
1235 };
1236 ////////////////////////////////////////////////////
1237 ////////////////////////////////////////////////////
1238 /**
1239 * See ToFTrkVar::CalcBeta(Float_t,Float_t, Float_t).
1240 */
1241 Float_t ToFLevel2::CalcBeta(Int_t notrack, Float_t resmax, Float_t qualitycut, Float_t chi2cut){
1242
1243 // cout<<" in CalcBeta "<<resmax<<" "<<chi2cut<<" "<<qualitycut<<endl;
1244
1245 ToFTrkVar *trk = GetToFTrkVar(notrack);
1246 if(!trk) return 0; //ELENA
1247
1248 return trk->CalcBeta(resmax,qualitycut,chi2cut);
1249
1250 };
1251
1252
1253 ////////////////////////////////////////////////////
1254 ////////////////////////////////////////////////////
1255
1256
1257 /**
1258 * Fills a struct cToFLevel2 with values from a ToFLevel2 object (to put data into a F77 common).
1259 */
1260 void ToFLevel2::GetLevel2Struct(cToFLevel2 *l2) const{
1261
1262 for(Int_t i=0;i<6;i++)
1263 l2->tof_j_flag[i]=tof_j_flag[i];
1264
1265 if(ToFTrk){ //ELENA
1266 l2->ntoftrk = ToFTrk->GetEntries();
1267 for(Int_t j=0;j<l2->ntoftrk;j++){
1268 l2->toftrkseqno[j]= ((ToFTrkVar*)ToFTrk->At(j))->trkseqno;
1269 l2->npmttdc[j]= ((ToFTrkVar*)ToFTrk->At(j))->npmttdc;
1270 for(Int_t i=0;i<l2->npmttdc[j];i++){
1271 l2->pmttdc[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->pmttdc.At(i);
1272 l2->tdcflag[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->tdcflag.At(i); // gf: 30 Nov 2006
1273 }
1274 for(Int_t i=0;i<13;i++)
1275 l2->beta[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->beta[i];
1276
1277 l2->npmtadc[j]= ((ToFTrkVar*)ToFTrk->At(j))->npmtadc;
1278 for(Int_t i=0;i<l2->npmtadc[j];i++){
1279 l2->pmtadc[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->pmtadc.At(i);
1280 l2->adcflag[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->adcflag.At(i); // gf: 30 Nov 2006
1281 l2->dedx[i][j] = ((ToFTrkVar*)ToFTrk->At(j))->dedx.At(i);
1282 }
1283 for(Int_t i=0;i<3;i++){
1284 l2->xtofpos[i][j]=((ToFTrkVar*)ToFTrk->At(j))->xtofpos[i];
1285 l2->ytofpos[i][j]=((ToFTrkVar*)ToFTrk->At(j))->ytofpos[i];
1286 }
1287 for(Int_t i=0;i<6;i++){
1288 l2->xtr_tof[i][j]=((ToFTrkVar*)ToFTrk->At(j))->xtr_tof[i];
1289 l2->ytr_tof[i][j]=((ToFTrkVar*)ToFTrk->At(j))->ytr_tof[i];
1290 }
1291 }
1292 } //ELENA
1293
1294 if(PMT){ //ELENA
1295 l2->npmt = PMT->GetEntries();
1296 for(Int_t j=0;j<l2->npmt;j++){
1297 l2->pmt_id[j] = ((ToFPMT*)PMT->At(j))->pmt_id;
1298 l2->adc[j] =((ToFPMT*)PMT->At(j))->adc;
1299 l2->tdc_tw[j] =((ToFPMT*)PMT->At(j))->tdc_tw;
1300 }
1301 } //ELENA
1302 }
1303
1304
1305 //
1306 // Reprocessing tool // Emiliano 08/04/07
1307 //
1308 Int_t ToFLevel2::Process(TrkLevel2 *trk, TrigLevel2 *trg, GL_RUN *run, OrbitalInfo *orb, Bool_t force){
1309 //
1310 // Copiare qui qualcosa di simile a calonuclei per evitare di riprocessare sempre tutto
1311 //
1312 printf("\n\n\n ERROR: NOT IMPLEMENTED ANYMORE, write Emiliano if you need this method (Emiliano.Mocchiutti@ts.infn.it) \n\n\n");
1313 return(-1);
1314 // //
1315 // // structures to communicate with F77
1316 // //
1317 // extern struct ToFInput tofinput_;
1318 // extern struct ToFOutput tofoutput_;
1319 // //
1320 // // DB connection
1321 // //
1322 // TString host;
1323 // TString user;
1324 // TString psw;
1325 // const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
1326 // const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
1327 // const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
1328 // if ( !pamdbhost ) pamdbhost = "";
1329 // if ( !pamdbuser ) pamdbuser = "";
1330 // if ( !pamdbpsw ) pamdbpsw = "";
1331 // if ( strcmp(pamdbhost,"") ) host = pamdbhost;
1332 // if ( strcmp(pamdbuser,"") ) user = pamdbuser;
1333 // if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
1334 // //
1335 // //
1336 // TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
1337 // if ( !dbc->IsConnected() ) return 1;
1338 // stringstream myquery;
1339 // myquery.str("");
1340 // myquery << "SET time_zone='+0:00';";
1341 // dbc->Query(myquery.str().c_str());
1342 // delete dbc->Query("SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';");
1343 // GL_PARAM *glparam = new GL_PARAM();
1344 // glparam->Query_GL_PARAM(1,1,dbc); // parameters stored in DB in GL_PRAM table
1345 // trk->LoadField(glparam->PATH+glparam->NAME);
1346 // //
1347 // Bool_t defcal = true;
1348 // Int_t error=glparam->Query_GL_PARAM(run->RUNHEADER_TIME,201,dbc); // parameters stored in DB in GL_PRAM table
1349 // if ( error<0 ) {
1350 // return(1);
1351 // };
1352 // printf(" Reading ToF parameter file: %s \n",(glparam->PATH+glparam->NAME).Data());
1353 // if ( (UInt_t)glparam->TO_TIME != (UInt_t)4294967295UL ) defcal = false;
1354 // //
1355 // Int_t nlen = (Int_t)(glparam->PATH+glparam->NAME).Length();
1356 // rdtofcal((char *)(glparam->PATH+glparam->NAME).Data(),&nlen);
1357 // //
1358 // Int_t adc[4][12];
1359 // Int_t tdc[4][12];
1360 // Float_t tdcc[4][12];
1361 // //
1362 // // process tof data
1363 // //
1364 // for (Int_t hh=0; hh<12;hh++){
1365 // for (Int_t kk=0; kk<4;kk++){
1366 // adc[kk][hh] = 4095;
1367 // tdc[kk][hh] = 4095;
1368 // tdcc[kk][hh] = 4095.;
1369 // tofinput_.adc[hh][kk] = 4095;
1370 // tofinput_.tdc[hh][kk] = 4095;
1371 // };
1372 // };
1373 // Int_t ntrkentry = 0;
1374 // Int_t npmtentry = 0;
1375 // Int_t gg = 0;
1376 // Int_t hh = 0;
1377 // Int_t adcf[48];
1378 // memset(adcf, 0, 48*sizeof(Int_t));
1379 // Int_t tdcf[48];
1380 // memset(tdcf, 0, 48*sizeof(Int_t));
1381 // for (Int_t pm=0; pm < this->ntrk() ; pm++){
1382 // ToFTrkVar *ttf = this->GetToFTrkVar(pm);
1383 // for ( Int_t nc=0; nc < ttf->npmttdc; nc++){
1384 // if ( (ttf->tdcflag).At(nc) != 0 ) tdcf[(ttf->pmttdc).At(nc)] = 1;
1385 // };
1386 // for ( Int_t nc=0; nc < ttf->npmtadc; nc++){
1387 // if ( (ttf->adcflag).At(nc) != 0 ) adcf[(ttf->pmtadc).At(nc)] = 1;
1388 // };
1389 // };
1390 // //
1391 // for (Int_t pm=0; pm < this->npmt() ; pm++){
1392 // ToFPMT *pmt = this->GetToFPMT(pm);
1393 // this->GetPMTIndex(pmt->pmt_id, gg, hh);
1394 // if ( adcf[pmt->pmt_id] == 0 ){
1395 // tofinput_.adc[gg][hh] = (int)pmt->adc;
1396 // adc[hh][gg] = (int)pmt->adc;
1397 // };
1398 // if ( tdcf[pmt->pmt_id] == 0 ){
1399 // tofinput_.tdc[gg][hh] = (int)pmt->tdc;
1400 // tdc[hh][gg] = (int)pmt->tdc;
1401 // };
1402 // tdcc[hh][gg] = (float)pmt->tdc_tw;
1403 // // Int_t pppid = this->GetPMTid(hh,gg);
1404 // // printf(" pm %i pmt_id %i pppid %i hh %i gg %i tdcc %f tdc %f adc %f \n",pm,pmt->pmt_id,pppid,hh,gg,pmt->tdc_tw,pmt->tdc,pmt->adc);
1405 // };
1406 // //
1407 // Int_t unpackError = this->unpackError;
1408 // //
1409 // for (Int_t hh=0; hh<5;hh++){
1410 // tofinput_.patterntrig[hh]=trg->patterntrig[hh];
1411 // };
1412 // //
1413 // this->Clear();
1414 // //
1415 // Int_t pmt_id = 0;
1416 // ToFPMT *t_pmt = new ToFPMT();
1417 // if(!(this->PMT)) this->PMT = new TClonesArray("ToFPMT",12); //ELENA
1418 // TClonesArray &tpmt = *this->PMT;
1419 // ToFTrkVar *t_tof = new ToFTrkVar();
1420 // if(!(this->ToFTrk)) this->ToFTrk = new TClonesArray("ToFTrkVar",2); //ELENA
1421 // TClonesArray &t = *this->ToFTrk;
1422 // //
1423 // //
1424 // // Here we have calibrated data, ready to be passed to the FORTRAN routine which will extract common and track-related variables.
1425 // //
1426 // npmtentry = 0;
1427 // //
1428 // ntrkentry = 0;
1429 // //
1430 // // Calculate tracks informations from ToF alone
1431 // //
1432 // tofl2com();
1433 // //
1434 // memcpy(this->tof_j_flag,tofoutput_.tof_j_flag,6*sizeof(Int_t));
1435 // //
1436 // t_tof->trkseqno = -1;
1437 // //
1438 // // and now we must copy from the output structure to the level2 class:
1439 // //
1440 // t_tof->npmttdc = 0;
1441 // //
1442 // for (Int_t hh=0; hh<12;hh++){
1443 // for (Int_t kk=0; kk<4;kk++){
1444 // if ( tofoutput_.tofmask[hh][kk] != 0 ){
1445 // pmt_id = this->GetPMTid(kk,hh);
1446 // t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1447 // t_tof->tdcflag.AddAt(tofoutput_.tdcflagtof[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1448 // t_tof->npmttdc++;
1449 // };
1450 // };
1451 // };
1452 // for (Int_t kk=0; kk<13;kk++){
1453 // t_tof->beta[kk] = tofoutput_.betatof_a[kk];
1454 // }
1455 // //
1456 // t_tof->npmtadc = 0;
1457 // for (Int_t hh=0; hh<12;hh++){
1458 // for (Int_t kk=0; kk<4;kk++){
1459 // if ( tofoutput_.adctof_c[hh][kk] < 1000 ){
1460 // t_tof->dedx.AddAt(tofoutput_.adctof_c[hh][kk],t_tof->npmtadc);
1461 // pmt_id = this->GetPMTid(kk,hh);
1462 // t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1463 // t_tof->adcflag.AddAt(tofoutput_.adcflagtof[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1464 // t_tof->npmtadc++;
1465 // };
1466 // };
1467 // };
1468 // //
1469 // memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1470 // memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1471 // memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1472 // memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1473 // //
1474 // new(t[ntrkentry]) ToFTrkVar(*t_tof);
1475 // ntrkentry++;
1476 // t_tof->Clear();
1477 // //
1478 // //
1479 // //
1480 // t_pmt->Clear();
1481 // //
1482 // for (Int_t hh=0; hh<12;hh++){
1483 // for (Int_t kk=0; kk<4;kk++){
1484 // // new WM
1485 // if ( tofoutput_.tdc_c[hh][kk] < 4095 || adc[kk][hh] < 4095 || tdc[kk][hh] < 4095 ){
1486 // // if ( tdcc[kk][hh] < 4095. || adc[kk][hh] < 4095 || tdc[kk][hh] < 4095 ){
1487 // //
1488 // t_pmt->pmt_id = this->GetPMTid(kk,hh);
1489 // t_pmt->tdc_tw = tofoutput_.tdc_c[hh][kk];
1490 // t_pmt->adc = (Float_t)adc[kk][hh];
1491 // t_pmt->tdc = (Float_t)tdc[kk][hh];
1492 // //
1493 // new(tpmt[npmtentry]) ToFPMT(*t_pmt);
1494 // npmtentry++;
1495 // t_pmt->Clear();
1496 // };
1497 // };
1498 // };
1499 // //
1500 // // Calculate track-related variables
1501 // //
1502 // if ( trk->ntrk() > 0 ){
1503 // //
1504 // // We have at least one track
1505 // //
1506 // //
1507 // // Run over tracks
1508 // //
1509 // for(Int_t nt=0; nt < trk->ntrk(); nt++){
1510 // //
1511 // TrkTrack *ptt = trk->GetStoredTrack(nt);
1512 // //
1513 // // Copy the alpha vector in the input structure
1514 // //
1515 // for (Int_t e = 0; e < 5 ; e++){
1516 // tofinput_.al_pp[e] = ptt->al[e];
1517 // };
1518 // //
1519 // // Get tracker related variables for this track
1520 // //
1521 // toftrk();
1522 // //
1523 // // Copy values in the class from the structure (we need to use a temporary class to store variables).
1524 // //
1525 // t_tof->npmttdc = 0;
1526 // for (Int_t hh=0; hh<12;hh++){
1527 // for (Int_t kk=0; kk<4;kk++){
1528 // if ( tofoutput_.tofmask[hh][kk] != 0 ){
1529 // pmt_id = this->GetPMTid(kk,hh);
1530 // t_tof->pmttdc.AddAt(pmt_id,t_tof->npmttdc);
1531 // t_tof->tdcflag.AddAt(tofoutput_.tdcflag[hh][kk],t_tof->npmttdc); // gf: Jan 09/07
1532 // t_tof->npmttdc++;
1533 // };
1534 // };
1535 // };
1536 // for (Int_t kk=0; kk<13;kk++){
1537 // t_tof->beta[kk] = tofoutput_.beta_a[kk];
1538 // };
1539 // //
1540 // t_tof->npmtadc = 0;
1541 // for (Int_t hh=0; hh<12;hh++){
1542 // for (Int_t kk=0; kk<4;kk++){
1543 // if ( tofoutput_.adc_c[hh][kk] < 1000 ){
1544 // t_tof->dedx.AddAt(tofoutput_.adc_c[hh][kk],t_tof->npmtadc);
1545 // pmt_id = this->GetPMTid(kk,hh);
1546 // t_tof->pmtadc.AddAt(pmt_id,t_tof->npmtadc);
1547 // t_tof->adcflag.AddAt(tofoutput_.adcflag[hh][kk],t_tof->npmtadc); // gf: Jan 09/07
1548 // t_tof->npmtadc++;
1549 // };
1550 // };
1551 // };
1552 // //
1553 // memcpy(t_tof->xtofpos,tofoutput_.xtofpos,sizeof(t_tof->xtofpos));
1554 // memcpy(t_tof->ytofpos,tofoutput_.ytofpos,sizeof(t_tof->ytofpos));
1555 // memcpy(t_tof->xtr_tof,tofoutput_.xtr_tof,sizeof(t_tof->xtr_tof));
1556 // memcpy(t_tof->ytr_tof,tofoutput_.ytr_tof,sizeof(t_tof->ytr_tof));
1557 // //
1558 // // Store the tracker track number in order to be sure to have shyncronized data during analysis
1559 // //
1560 // t_tof->trkseqno = nt;
1561 // //
1562 // // create a new object for this event with track-related variables
1563 // //
1564 // new(t[ntrkentry]) ToFTrkVar(*t_tof);
1565 // ntrkentry++;
1566 // t_tof->Clear();
1567 // //
1568 // }; // loop on all the tracks
1569 // //
1570 // this->unpackError = unpackError;
1571 // if ( defcal ){
1572 // this->default_calib = 1;
1573 // } else {
1574 // this->default_calib = 0;
1575 // };
1576 //};
1577 // return(0);
1578 }
1579
1580 bool ToFLevel2::bit(int decimal, char pos){
1581 return( (decimal>>pos)%2 );
1582 }
1583
1584 bool ToFLevel2::checkPMT(TString givenpmt){
1585 TClonesArray* Pmt = this->PMT;
1586 // printf(" ou %s entries %i \n",givenpmt.Data(),Pmt->GetEntries());
1587 for(int i=0; i<Pmt->GetEntries(); i++) {
1588 ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1589 TString pmtname = this->GetPMTName(pmthit->pmt_id);
1590 // printf(" name %s \n",pmtname.Data());
1591 if ( !strcmp(pmtname.Data(),givenpmt.Data()) )
1592 return true;
1593 }
1594 // printf(" PMT %s missing \n",givenpmt.Data());
1595 return false;
1596 }
1597
1598 bool ToFLevel2::checkPMTpatternPMThit(TrigLevel2 *trg, int &pmtpattern, int &pmtnosignal){
1599 UInt_t *patterntrig = trg->patterntrig;
1600 pmtpattern = 0;
1601 pmtnosignal = 0;
1602 bool good = true;
1603 //S3
1604 if ( this->bit(patterntrig[2],0) ){ pmtpattern++; if ( !this->checkPMT("S31_1A")){ pmtnosignal++; good = false;}}
1605 if ( this->bit(patterntrig[2],1) ){ pmtpattern++; if ( !this->checkPMT("S31_2A")){ pmtnosignal++; good = false;}}
1606 if ( this->bit(patterntrig[2],2) ){ pmtpattern++; if ( !this->checkPMT("S31_3A")){ pmtnosignal++; good = false;}}
1607 if ( this->bit(patterntrig[2],3) ){ pmtpattern++; if ( !this->checkPMT("S31_1B")){ pmtnosignal++; good = false;}}
1608 if ( this->bit(patterntrig[2],4) ){ pmtpattern++; if ( !this->checkPMT("S31_2B")){ pmtnosignal++; good = false;}}
1609 if ( this->bit(patterntrig[2],5) ){ pmtpattern++; if ( !this->checkPMT("S31_3B")){ pmtnosignal++; good = false;}}
1610 if ( this->bit(patterntrig[2],6) ){ pmtpattern++; if ( !this->checkPMT("S32_1A")){ pmtnosignal++; good = false;}}
1611 if ( this->bit(patterntrig[2],7) ){ pmtpattern++; if ( !this->checkPMT("S32_2A")){ pmtnosignal++; good = false;}}
1612 if ( this->bit(patterntrig[2],8) ){ pmtpattern++; if ( !this->checkPMT("S32_3A")){ pmtnosignal++; good = false;}}
1613 if ( this->bit(patterntrig[2],9) ){ pmtpattern++; if ( !this->checkPMT("S32_1B")){ pmtnosignal++; good = false;}}
1614 if ( this->bit(patterntrig[2],10) ){ pmtpattern++; if ( !this->checkPMT("S32_2B")){ pmtnosignal++; good = false;}}
1615 if ( this->bit(patterntrig[2],11) ){ pmtpattern++; if ( !this->checkPMT("S32_3B")){ pmtnosignal++; good = false;}}
1616 //S2
1617 if ( this->bit(patterntrig[3],0) ){ pmtpattern++; if ( !this->checkPMT("S21_1A")){ pmtnosignal++; good = false;}}
1618 if ( this->bit(patterntrig[3],1) ){ pmtpattern++; if ( !this->checkPMT("S21_2A")){ pmtnosignal++; good = false;}}
1619 if ( this->bit(patterntrig[3],2) ){ pmtpattern++; if ( !this->checkPMT("S21_1B")){ pmtnosignal++; good = false;}}
1620 if ( this->bit(patterntrig[3],3) ){ pmtpattern++; if ( !this->checkPMT("S21_2B")){ pmtnosignal++; good = false;}}
1621 if ( this->bit(patterntrig[3],4) ){ pmtpattern++; if ( !this->checkPMT("S22_1A")){ pmtnosignal++; good = false;}}
1622 if ( this->bit(patterntrig[3],5) ){ pmtpattern++; if ( !this->checkPMT("S22_2A")){ pmtnosignal++; good = false;}}
1623 if ( this->bit(patterntrig[3],6) ){ pmtpattern++; if ( !this->checkPMT("S22_1B")){ pmtnosignal++; good = false;}}
1624 if ( this->bit(patterntrig[3],7) ){ pmtpattern++; if ( !this->checkPMT("S22_2B")){ pmtnosignal++; good = false;}}
1625 //S12
1626 if ( this->bit(patterntrig[4],0) ){ pmtpattern++; if ( !this->checkPMT("S12_1A")){ pmtnosignal++; good = false;}}
1627 if ( this->bit(patterntrig[4],1) ){ pmtpattern++; if ( !this->checkPMT("S12_2A")){ pmtnosignal++; good = false;}}
1628 if ( this->bit(patterntrig[4],2) ){ pmtpattern++; if ( !this->checkPMT("S12_3A")){ pmtnosignal++; good = false;}}
1629 if ( this->bit(patterntrig[4],3) ){ pmtpattern++; if ( !this->checkPMT("S12_4A")){ pmtnosignal++; good = false;}}
1630 if ( this->bit(patterntrig[4],4) ){ pmtpattern++; if ( !this->checkPMT("S12_5A")){ pmtnosignal++; good = false;}}
1631 if ( this->bit(patterntrig[4],5) ){ pmtpattern++; if ( !this->checkPMT("S12_6A")){ pmtnosignal++; good = false;}}
1632 if ( this->bit(patterntrig[4],6) ){ pmtpattern++; if ( !this->checkPMT("S12_1A")){ pmtnosignal++; good = false;}}
1633 if ( this->bit(patterntrig[4],7) ){ pmtpattern++; if ( !this->checkPMT("S12_2A")){ pmtnosignal++; good = false;}}
1634 if ( this->bit(patterntrig[4],8) ){ pmtpattern++; if ( !this->checkPMT("S12_3A")){ pmtnosignal++; good = false;}}
1635 if ( this->bit(patterntrig[4],9) ){ pmtpattern++; if ( !this->checkPMT("S12_4B")){ pmtnosignal++; good = false;}}
1636 if ( this->bit(patterntrig[4],10) ){ pmtpattern++; if ( !this->checkPMT("S12_5B")){ pmtnosignal++; good = false;}}
1637 if ( this->bit(patterntrig[4],11) ){ pmtpattern++; if ( !this->checkPMT("S12_6B")){ pmtnosignal++; good = false;}}
1638 //S11
1639 if ( this->bit(patterntrig[5],0) ){ pmtpattern++; if ( !this->checkPMT("S11_1A")){ pmtnosignal++; good = false;}}
1640 if ( this->bit(patterntrig[5],1) ){ pmtpattern++; if ( !this->checkPMT("S11_2A")){ pmtnosignal++; good = false;}}
1641 if ( this->bit(patterntrig[5],2) ){ pmtpattern++; if ( !this->checkPMT("S11_3A")){ pmtnosignal++; good = false;}}
1642 if ( this->bit(patterntrig[5],3) ){ pmtpattern++; if ( !this->checkPMT("S11_4A")){ pmtnosignal++; good = false;}}
1643 if ( this->bit(patterntrig[5],4) ){ pmtpattern++; if ( !this->checkPMT("S11_5A")){ pmtnosignal++; good = false;}}
1644 if ( this->bit(patterntrig[5],5) ){ pmtpattern++; if ( !this->checkPMT("S11_6A")){ pmtnosignal++; good = false;}}
1645 if ( this->bit(patterntrig[5],6) ){ pmtpattern++; if ( !this->checkPMT("S11_7A")){ pmtnosignal++; good = false;}}
1646 if ( this->bit(patterntrig[5],7) ){ pmtpattern++; if ( !this->checkPMT("S11_8A")){ pmtnosignal++; good = false;}}
1647 if ( this->bit(patterntrig[5],8) ){ pmtpattern++; if ( !this->checkPMT("S11_1B")){ pmtnosignal++; good = false;}}
1648 if ( this->bit(patterntrig[5],9) ){ pmtpattern++; if ( !this->checkPMT("S11_2B")){ pmtnosignal++; good = false;}}
1649 if ( this->bit(patterntrig[5],10) ){ pmtpattern++; if ( !this->checkPMT("S11_3B")){ pmtnosignal++; good = false;}}
1650 if ( this->bit(patterntrig[5],11) ){ pmtpattern++; if ( !this->checkPMT("S11_4B")){ pmtnosignal++; good = false;}}
1651 if ( this->bit(patterntrig[5],12) ){ pmtpattern++; if ( !this->checkPMT("S11_5B")){ pmtnosignal++; good = false;}}
1652 if ( this->bit(patterntrig[5],13) ){ pmtpattern++; if ( !this->checkPMT("S11_6B")){ pmtnosignal++; good = false;}}
1653 if ( this->bit(patterntrig[5],14) ){ pmtpattern++; if ( !this->checkPMT("S11_7B")){ pmtnosignal++; good = false;}}
1654 if ( this->bit(patterntrig[5],15) ){ pmtpattern++; if ( !this->checkPMT("S11_8B")){ pmtnosignal++; good = false;}}
1655
1656 return good;
1657 }
1658
1659 bool ToFLevel2::checkPMTpmttrig(TrigLevel2 *trg){
1660 // UInt_t *patterntrig = trg->patterntrig;
1661 int rS11 = 0;
1662 int rS12 = 0;
1663 int rS21 = 0;
1664 int rS22 = 0;
1665 int rS31 = 0;
1666 int rS32 = 0;
1667
1668 // trigger configuration for the event from saved pmts
1669 TClonesArray* Pmt = this->PMT;
1670 for(int i=0; i<Pmt->GetEntries(); i++) {
1671 ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1672 TString pmtname = this->GetPMTName(pmthit->pmt_id);
1673 if ( pmtname.Contains("S11") ) rS11++;
1674 if ( pmtname.Contains("S12") ) rS12++;
1675 if ( pmtname.Contains("S21") ) rS21++;
1676 if ( pmtname.Contains("S22") ) rS22++;
1677 if ( pmtname.Contains("S31") ) rS31++;
1678 if ( pmtname.Contains("S32") ) rS32++;
1679 }
1680 int rTOF1 = (rS11 + rS12) * (rS21 + rS22) * (rS31 + rS32);
1681 int rTOF2 = (rS11 * rS12) * (rS21 * rS22) * (rS31 * rS32);
1682
1683 int rTOF3 = (rS21 + rS22) * (rS31 + rS32);
1684 int rTOF4 = (rS21 * rS22) * (rS31 * rS32);
1685
1686 int rTOF5 = rS12 * (rS21 * rS22);
1687
1688 int rTOF6 = (rS11 + rS12) * (rS31 + rS32);
1689 int rTOF7 = (rS11 * rS12) * (rS31 * rS32);
1690
1691
1692 // trigger configuration of the run
1693 bool TCTOF1 = false;
1694 bool TCTOF2 = false;
1695 bool TCTOF3 = false;
1696 bool TCTOF4 = false;
1697 bool TCTOF5 = false;
1698 bool TCTOF6 = false;
1699 bool TCTOF7 = false;
1700 if ( trg->trigconf & (1<<0) ) TCTOF1 = true;
1701 if ( trg->trigconf & (1<<1) ) TCTOF2 = true;
1702 if ( trg->trigconf & (1<<2) ) TCTOF3 = true;
1703 if ( trg->trigconf & (1<<3) ) TCTOF4 = true;
1704 if ( trg->trigconf & (1<<4) ) TCTOF5 = true;
1705 if ( trg->trigconf & (1<<5) ) TCTOF6 = true;
1706 if ( trg->trigconf & (1<<6) ) TCTOF7 = true;
1707
1708 // do patterntrig pmts match the trigger configuration?
1709 bool pmtsconf_trigconf_match = true;
1710 if ( rTOF1 == 0 && TCTOF1 ) pmtsconf_trigconf_match = false;
1711 if ( rTOF2 == 0 && TCTOF2 ) pmtsconf_trigconf_match = false;
1712 if ( rTOF3 == 0 && TCTOF3 ) pmtsconf_trigconf_match = false;
1713 if ( rTOF4 == 0 && TCTOF4 ) pmtsconf_trigconf_match = false;
1714 if ( rTOF5 == 0 && TCTOF5 ) pmtsconf_trigconf_match = false;
1715 if ( rTOF6 == 0 && TCTOF6 ) pmtsconf_trigconf_match = false;
1716 if ( rTOF7 == 0 && TCTOF7 ) pmtsconf_trigconf_match = false;
1717
1718 return pmtsconf_trigconf_match;
1719 }
1720
1721 void ToFLevel2::printPMT(){
1722 TClonesArray* Pmt = this->PMT;
1723 for(int i=0; i<Pmt->GetEntries(); i++) {
1724 ToFPMT* pmthit = (ToFPMT*)Pmt->At(i);
1725 TString pmtname = this->GetPMTName(pmthit->pmt_id);
1726 printf(" PMT hit: %s \n",pmtname.Data());
1727 }
1728 }
1729
1730
1731 ToFdEdx::ToFdEdx()
1732 {
1733 memset(conn,0,12*sizeof(Bool_t));
1734 memset(ts,0,12*sizeof(UInt_t));
1735 memset(te,0,12*sizeof(UInt_t));
1736 eDEDXpmt = new TArrayF(48);
1737 Define_PMTsat();
1738 Clear();
1739 }
1740
1741 ToFdEdx::~ToFdEdx(){
1742 Clear();
1743 Delete();
1744 }
1745
1746 void ToFdEdx::Delete(Option_t *option){
1747 if ( eDEDXpmt ){
1748 eDEDXpmt->Set(0);
1749 if ( eDEDXpmt) delete eDEDXpmt;
1750 }
1751 }
1752
1753 //------------------------------------------------------------------------
1754 void ToFdEdx::CheckConnectors(UInt_t atime, GL_PARAM *glparam, TSQLServer *dbc)
1755 {
1756 for(int i=0; i<12; i++){
1757 if(atime<=ts[i] || atime>te[i]){
1758 Int_t error=glparam->Query_GL_PARAM(atime,210+i,dbc); // parameters stored in DB in GL_PRAM table
1759 if ( error<0 ) {
1760 conn[i]=false;
1761 ts[i]=0;
1762 te[i]=numeric_limits<UInt_t>::max();
1763 };
1764 if ( !error ){
1765 conn[i]=true;
1766 ts[i]=glparam->FROM_TIME;
1767 te[i]=glparam->TO_TIME;
1768 }
1769 if ( error>0 ){
1770 conn[i]=false;
1771 ts[i]=glparam->TO_TIME;
1772 TSQLResult *pResult;
1773 TSQLRow *row;
1774 TString query= Form("SELECT FROM_TIME FROM GL_PARAM WHERE TYPE=%i AND FROM_TIME>=%i ORDER BY FROM_TIME ASC LIMIT 1;",210+i,atime);
1775 pResult=dbc->Query(query.Data());
1776 if(!pResult->GetRowCount()){
1777 te[i]=numeric_limits<UInt_t>::max();
1778 }else{
1779 row=pResult->Next();
1780 te[i]=(UInt_t)atoll(row->GetField(0));
1781 }
1782 }
1783 //
1784
1785 }
1786 }
1787
1788 }
1789 //------------------------------------------------------------------------
1790 void ToFdEdx::Clear(Option_t *option)
1791 {
1792 //
1793 // Set arrays and initialize structure
1794 // eDEDXpmt.Set(48); eDEDXpmt.Reset(-1); // Set array size and reset structure
1795 eDEDXpmt->Set(48); eDEDXpmt->Reset(-1); // Set array size and reset structure
1796 //
1797 };
1798
1799 //------------------------------------------------------------------------
1800 void ToFdEdx::Print(Option_t *option)
1801 {
1802 //
1803 printf("========================================================================\n");
1804
1805 };
1806
1807 //------------------------------------------------------------------------
1808 void ToFdEdx::Init(pamela::tof::TofEvent *tofl0)
1809 {
1810 //
1811 ToFLevel2 tf;
1812 for (Int_t gg=0; gg<4;gg++){
1813 for (Int_t hh=0; hh<12;hh++){
1814 // tofinput_.tdc[hh][gg]=tofEvent->tdc[gg][hh];
1815 int mm = tf.GetPMTid(gg,hh);
1816 adc[mm]= (0xFFF & tofl0->adc[gg][hh]); // EM, exclude warning bits
1817 };
1818 };
1819
1820 };
1821
1822 //------------------------------------------------------------------------
1823 void ToFdEdx::Init(Int_t gg, Int_t hh, Float_t adce)
1824 {
1825 //
1826 ToFLevel2 tf;
1827 // for (Int_t gg=0; gg<4;gg++){
1828 // for (Int_t hh=0; hh<12;hh++){
1829 int mm = tf.GetPMTid(gg,hh);
1830 adc[mm]=adce;
1831
1832 };
1833 //------------------------------------------------------------------------
1834 void ToFdEdx::Process(UInt_t atime, Float_t betamean, Float_t *xtr_tof, Float_t *ytr_tof, Int_t exitat)
1835 {
1836 bool debug = false;
1837 if ( debug ) printf(" INSIDE TOFDEDX PROCESS \n");
1838 // the parameters should be already initialised by InitPar()
1839 // printf(" in process \n");
1840 Clear();
1841
1842 // define angle:
1843 double dx = xtr_tof[1] - xtr_tof[5];
1844 double dy = ytr_tof[0] - ytr_tof[4];
1845 double dr = sqrt(dx*dx+dy*dy);
1846 double theta=atan(dr/76.81);
1847 //
1848 if ( xtr_tof[1] > 99. || xtr_tof[5] > 99. || ytr_tof[0] > 99. || ytr_tof[4] > 99. ) theta = 0.;
1849 for (Int_t ii=0; ii<6; ii++){
1850 if ( xtr_tof[ii] > 99. ) xtr_tof[ii] = 0.;
1851 if ( ytr_tof[ii] > 99. ) ytr_tof[ii] = 0.;
1852 };
1853 //
1854 if ( debug ) printf(" theta %f \n",theta);
1855 if ( debug ) printf(" xtr_tof %.1f %.1f %.1f %.1f %.1f %.1f \n",xtr_tof[0],xtr_tof[1],xtr_tof[2],xtr_tof[3],xtr_tof[4],xtr_tof[5]);
1856 if ( debug ) printf(" ytr_tof %.1f %.1f %.1f %.1f %.1f %.1f \n",ytr_tof[0],ytr_tof[1],ytr_tof[2],ytr_tof[3],ytr_tof[4],ytr_tof[5]);
1857 //--------------------- TABLE OF PERIODS WITH HV PROBLEMS ----------------------------
1858
1859 int Aconn=conn[0]; // PMT 0,20,22,24
1860 int Bconn=conn[1]; // PMT 6,12,26,34
1861 int Cconn=conn[2]; // PMT 4,14,28,32
1862 int Dconn=conn[3]; // PMT 2,8,10,30
1863 int Econn=conn[4]; // PMT 42,43,44,47
1864 int Fconn=conn[5]; // PMT 7,19,23,27
1865 int Gconn=conn[6]; // PMT 3,11,25,33
1866 int Hconn=conn[7]; // PMT 1,9,13,21
1867 int Iconn=conn[8]; // PMT 5,29,31,35
1868 int Lconn=conn[9]; // PMT 37,40,45,46
1869 int Mconn=conn[10]; // PMT 15,16,17,18
1870 int Nconn=conn[11]; // PMT 36,38,39,41
1871 if( false ) cout << Gconn << Iconn << Lconn <<endl; // to avoid compilation warnings
1872
1873 // printf(" size %i \n",eDEDXpmt.GetSize());
1874 for( int ii=0; ii<48; ii++ ) {
1875 //
1876 // eDEDXpmt.SetAt(-1.,ii);
1877 // printf(" ii %i beta %f atime %u xtr 1 %f ytr 1 %f adc %f \n",ii,betamean,atime,xtr_tof[0],ytr_tof[0],adc[ii]);
1878 if ( debug ) printf("II %i adc %f \n",ii,adc[ii]);
1879
1880 if( adc[ii] >= 4095. ){
1881 // eDEDXpmt[ii] = 0.;
1882 eDEDXpmt->AddAt(0.,ii);
1883 if ( debug ) printf(" %i adc>4095 \n",ii);
1884 continue; // EMILIANO
1885 };
1886
1887 if( adc[ii] >= (PMTsat[ii]-5.) && adc[ii] < 4095. ){
1888 eDEDXpmt->AddAt(1000.,ii);
1889 if ( debug ) printf(" %i adc> pmtsat && adc<4095 \n",ii);
1890 continue; // EMILIANO
1891 };
1892
1893 if( adc[ii] <= 0. ) {
1894 eDEDXpmt->AddAt(1500.,ii);
1895 if ( debug ) printf(" %i adc<=0 \n",ii);
1896 continue;
1897 };
1898 //
1899 double adcpC = f_adcPC( adc[ii] ); // - adc conversion in pC
1900 if ( exitat == 0 ){
1901 eDEDXpmt->AddAt((Float_t)adcpC,ii);
1902 continue;
1903 }
1904 // printf(" e qua? \n");
1905
1906 double adccorr = adcpC*fabs(cos(theta));
1907 if ( debug ) printf(" adccorr %f \n",adccorr);
1908 if(adccorr<=0.){
1909 if ( debug ) printf(" %i adccorr<=0 \n",ii);
1910 // eDEDXpmt->AddAt((Float_t)adcpC,ii);//?
1911 continue;
1912 }
1913 if ( exitat == 1 ){
1914 eDEDXpmt->AddAt((Float_t)adccorr,ii);
1915 continue;
1916 }
1917 // printf(" e quo? \n");
1918
1919 // int standard=0;
1920 int S115B_ok=0;
1921 int S115B_break=0;
1922
1923 if(atime<1158720000)S115B_ok=1;
1924 else S115B_break=1;
1925
1926
1927 //------------------------------------------------------------------------
1928 // printf(" e qui? \n");
1929 //---------------------------------------------------- Z reconstruction
1930
1931 double adcHe, adcnorm, adclin, dEdx;//, Zeta; // EM GCC4.7
1932
1933 adcHe=-2;
1934 adcnorm=-2;
1935 adclin=-2;
1936 dEdx=-2;
1937 // Zeta=-2;//EM GCC4.7
1938 Double_t correction = 1.;
1939
1940 if(Aconn==1 && (ii==0 || ii==20 || ii==22 || ii==24)){
1941 correction = 1.675;
1942 }
1943 else if(Bconn==1 && (ii==6 || ii==12 || ii==26 || ii==34)){
1944 correction = 2.482;
1945 }
1946 else if(Cconn==1 && (ii==4 || ii==14 || ii==28 || ii==32)){
1947 correction = 1.464;
1948 }
1949 else if(Dconn==1 && (ii==2 || ii==8 || ii==10 || ii==30)){
1950 correction = 1.995;
1951 }
1952 else if(Econn==1 && (ii==42 || ii==43 || ii==44 || ii==47)){
1953 correction = 1.273;
1954 }
1955 else if(Fconn==1 && (ii==7 || ii==19 || ii==23 || ii==27)){
1956 correction = 1.565;
1957 }
1958 else if(Mconn==1 && (ii==15 || ii==16 || ii==17 || ii==18)){
1959 correction = 1.565;
1960 }
1961 else if(Nconn==1 && (ii==36 || ii==38 || ii==39 || ii==41)){
1962 correction = 1.018;
1963 }
1964 else if(Hconn==1 && (ii==1 || ii==13 || ii==21 || (ii==9&&S115B_ok==1))){
1965 correction = 1.84;
1966 }
1967 else if(S115B_break==1 && ii==9 && Hconn==1){
1968 correction = 1.64;
1969 }
1970 else correction = 1.;
1971
1972 if( ii==9 && S115B_break==1 ){
1973 adcHe = f_att5B( ytr_tof[0] )/correction;
1974 } else {
1975 adcHe = Get_adc_he(ii, xtr_tof, ytr_tof)/correction;
1976 };
1977 if(adcHe<=0){
1978 if ( debug ) printf(" %i adcHe<=0 \n",ii);
1979 // eDEDXpmt->AddAt((Float_t)adccorr,ii); //?
1980 continue;
1981 }
1982 if ( exitat == 2 ){
1983 if(ii==9 && S115B_break==1) eDEDXpmt->AddAt(36.*(Float_t)adccorr/adcHe,ii);
1984 else adclin = 4.*(Float_t)adccorr/adcHe;
1985 continue;
1986 }
1987
1988 if(ii==9 && S115B_break==1) adcnorm = f_pos5B(adccorr);
1989 else adcnorm = f_pos( (parPos[ii]), adccorr);
1990 if(adcnorm<=0){
1991 if ( debug ) printf(" %i adcnorm<=0 \n",ii);
1992 // eDEDXpmt->AddAt((Float_t)adccorr,ii);//?
1993 continue;
1994 }
1995 if ( debug ) printf(" adcnorm %f \n",adcnorm);
1996
1997 if(ii==9 && S115B_break==1) adclin = 36.*adcnorm/adcHe;
1998 else adclin = 4.*adcnorm/adcHe;
1999 if ( debug ) printf(" adclin %f \n",adclin);
2000 if(adclin<=0){
2001 if ( debug ) printf(" %i adclin<=0 \n",ii);
2002 // eDEDXpmt->AddAt((Float_t)adccorr,ii);//?
2003 continue;
2004 }
2005 if ( exitat == 3 ){
2006 if(ii==9 && S115B_break==1) eDEDXpmt->AddAt((Float_t)adclin,ii);
2007 else eDEDXpmt->AddAt((Float_t)adclin,ii);
2008 continue;
2009 }
2010 //
2011 if ( betamean > 99. ){
2012 // eDEDXpmt.AddAt((Float_t)adclin,ii);
2013 eDEDXpmt->AddAt((Float_t)adclin,ii);
2014 // printf(" AAPMT IS %i dedx is %f vector is %f \n",ii,adclin,eDEDXpmt[ii]);
2015 if ( debug ) printf(" %i betamean > 99 \n",ii);
2016 continue;
2017 };
2018 //
2019 double dEdxHe=-2;
2020 if(ii==9 && S115B_break==1){
2021 if( betamean <1. ) dEdxHe = f_BB5B( betamean );
2022 else dEdxHe = 33;
2023 } else {
2024 if( betamean <1. ) dEdxHe = f_BB( (parBBneg[ii]), betamean );
2025 else dEdxHe = parBBpos[ii];
2026 }
2027
2028 if ( debug ) printf(" dEdxHe %f \n",dEdxHe);
2029
2030 if(dEdxHe<=0){
2031 eDEDXpmt->AddAt((Float_t)adclin,ii);
2032 if ( debug ) printf(" %i dEdxHe<=0 \n",ii);
2033 continue;
2034 };
2035
2036 if(ii==9 && S115B_break==1) dEdx = f_desatBB5B( adclin );
2037 else dEdx = f_desatBB((parDesatBB[ii]), adclin );
2038
2039 if(dEdx<=0){
2040 eDEDXpmt->AddAt((Float_t)adclin,ii);
2041 if ( debug ) printf(" %i dEdx<=0 \n",ii);
2042 continue;
2043 };
2044
2045 if ( debug ) printf(" dEdx %f \n",dEdx);
2046 eDEDXpmt->AddAt((Float_t)dEdx,ii);
2047 // eDEDXpmt.AddAt((Float_t)dEdx,ii);
2048
2049 // printf(" PMT IS %i dedx is %f vector is %f \n",ii,dEdx,eDEDXpmt[ii]);
2050
2051 } //end loop on 48 PMT
2052
2053 };
2054
2055
2056 //------------------------------------------------------------------------
2057 void ToFdEdx::Define_PMTsat()
2058 {
2059 Float_t sat[48] = {
2060 3176.35,3178.19,3167.38,3099.73,3117.00,3126.29,3111.44,3092.27,
2061 3146.48,3094.41,3132.13,3115.37,3099.32,3110.97,3111.80,3143.14,
2062 3106.72,3153.44,3136.00,3188.96,3104.73,3140.45,3073.18,3106.62,
2063 3112.48,3146.92,3127.24,3136.52,3109.59,3112.89,3045.15,3147.26,
2064 3095.92,3121.05,3083.25,3123.62,3150.92,3125.30,3067.60,3160.18,
2065 3119.36,3108.92,3164.77,3133.64,3111.47,3131.98,3128.87,3135.56 };
2066 PMTsat.Set(48,sat);
2067 }
2068
2069 //------------------------------------------------------------------------
2070 void ToFdEdx::ReadParBBpos( const char *fname )
2071 {
2072 // printf("read %s\n",fname);
2073 parBBpos.Set(48);
2074 FILE *fattin = fopen( fname , "r" );
2075 for (int i=0; i<48; i++) {
2076 int tid=0;
2077 float tp;
2078 if(fscanf(fattin,"%d %f",
2079 &tid, &tp )!=2) break;
2080 parBBpos[i]=tp;
2081 }
2082 fclose(fattin);
2083 }
2084
2085 //------------------------------------------------------------------------
2086 void ToFdEdx::ReadParDesatBB( const char *fname )
2087 {
2088 // printf("read %s\n",fname);
2089 FILE *fattin = fopen( fname , "r" );
2090 for (int i=0; i<48; i++) {
2091 int tid=0;
2092 float tp[3];
2093 if(fscanf(fattin,"%d %f %f %f",
2094 &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
2095 parDesatBB[i].Set(3,tp);
2096 }
2097 fclose(fattin);
2098 }
2099
2100
2101 //------------------------------------------------------------------------
2102 void ToFdEdx::ReadParBBneg( const char *fname )
2103
2104 {
2105 // printf("read %s\n",fname);
2106 FILE *fattin = fopen( fname , "r" );
2107 for (int i=0; i<48; i++) {
2108 int tid=0;
2109 float tp[3];
2110 if(fscanf(fattin,"%d %f %f %f",
2111 &tid, &tp[0], &tp[1], &tp[2] )!=4) break;
2112 parBBneg[i].Set(3,tp);
2113 }
2114 fclose(fattin);
2115 }
2116
2117 //------------------------------------------------------------------------
2118 void ToFdEdx::ReadParPos( const char *fname )
2119 {
2120 // printf("read %s\n",fname);
2121 FILE *fattin = fopen( fname , "r" );
2122 for (int i=0; i<48; i++) {
2123 int tid=0;
2124 float tp[4];
2125 if(fscanf(fattin,"%d %f %f %f %f",
2126 &tid, &tp[0], &tp[1], &tp[2], &tp[3])!=5) break;
2127 parPos[i].Set(4,tp);
2128 }
2129 fclose(fattin);
2130 }
2131
2132 //------------------------------------------------------------------------
2133 void ToFdEdx::ReadParAtt( const char *fname )
2134 {
2135 // printf("read %s\n",fname);
2136 FILE *fattin = fopen( fname , "r" );
2137 for (int i=0; i<48; i++) {
2138 int tid=0;
2139 float tp[6];
2140 if(fscanf(fattin,"%d %f %f %f %f %f %f",
2141 &tid, &tp[0], &tp[1], &tp[2], &tp[3], &tp[4], &tp[5] )!=7) break;
2142 parAtt[i].Set(6,tp);
2143 }
2144 fclose(fattin);
2145 }
2146
2147
2148
2149
2150
2151
2152 double ToFdEdx::f_att( TArrayF &p, float x )
2153 {
2154 return
2155 p[0] +
2156 p[1]*x +
2157 p[2]*x*x +
2158 p[3]*x*x*x +
2159 p[4]*x*x*x*x +
2160 p[5]*x*x*x*x*x;
2161 }
2162 //------------------------------------------------------------------------
2163 double ToFdEdx::f_att5B( float x )
2164 {
2165 return
2166 101.9409 +
2167 6.643781*x +
2168 0.2765518*x*x +
2169 0.004617647*x*x*x +
2170 0.0006195132*x*x*x*x +
2171 0.00002813734*x*x*x*x*x;
2172 }
2173
2174
2175 double ToFdEdx::f_pos( TArrayF &p, float x )
2176 {
2177 return
2178 p[0] +
2179 p[1]*x +
2180 p[2]*x*x +
2181 p[3]*x*x*x;
2182 }
2183
2184 double ToFdEdx::f_pos5B( float x )
2185 {
2186 return
2187 15.45132 +
2188 0.8369721*x +
2189 0.0005*x*x;
2190 }
2191
2192
2193
2194 double ToFdEdx::f_adcPC( float x )
2195 {
2196 return 28.12+0.6312*x-5.647e-05*x*x+3.064e-08*x*x*x;
2197 }
2198
2199
2200 float ToFdEdx::Get_adc_he( int id, float pl_x[6], float pl_y[6])
2201 {
2202
2203 //
2204 // input: id - pmt [0:47}
2205 // pl_x - coord x of the tof plane
2206 // pl_y - coord y
2207
2208 adc_he = 0;
2209 if( eGeom.GetXY(id)==1 ) adc_he = f_att( (parAtt[id]), pl_x[eGeom.GetPlane(id)] );
2210 if( eGeom.GetXY(id)==2 ) adc_he = f_att( (parAtt[id]), pl_y[eGeom.GetPlane(id)] );
2211 return adc_he;
2212 }
2213
2214 //------------------------------------------------------------------------
2215 double ToFdEdx::f_BB( TArrayF &p, float x )
2216 {
2217 return p[0]/(x*x)*(log(x*x/(1-x*x)) - p[1]*x*x - p[2]);
2218 }
2219
2220 //------------------------------------------------------------------------
2221 double ToFdEdx::f_BB5B( float x )
2222 {
2223 return 0.165797/(x*x)*(log(x*x/(1-x*x)) + 140.481*x*x + 52.9258);
2224 }
2225 //------------------------------------------------------------------------
2226 double ToFdEdx::f_desatBB( TArrayF &p, float x )
2227 {
2228 return
2229 p[0] +
2230 p[1]*x +
2231 p[2]*x*x;
2232 }
2233
2234 //------------------------------------------------------------------------
2235 double ToFdEdx::f_desatBB5B( float x )
2236 {
2237 return
2238 -2.4 +
2239 0.75*x +
2240 0.009*x*x;
2241 }
2242

  ViewVC Help
Powered by ViewVC 1.1.23