/[PAMELA software]/calo/flight/CaloEnergy/src/CaloEnergy.cpp
ViewVC logotype

Contents of /calo/flight/CaloEnergy/src/CaloEnergy.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (show annotations) (download)
Thu Aug 13 15:56:57 2009 UTC (15 years, 4 months ago) by mocchiut
Branch: MAIN
Changes since 1.8: +12 -2 lines
New features

1 #include <CaloEnergy.h>
2 #include <PamLevel2.h>
3
4 //--------------------------------------
5 /**
6 * Default constructor
7 */
8 CaloEnergy::CaloEnergy(){
9 Clear();
10 }
11
12 CaloEnergy::CaloEnergy(PamLevel2 *l2p){
13 //
14 Clear();
15 //
16 L2 = l2p;
17 //
18 if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
19 //
20 fSimu = false;
21 this->Set();
22 //
23 }
24
25 CaloEnergy::CaloEnergy(PamLevel2 *l2p, Bool_t simulation){
26 //
27 Clear();
28 //
29 L2 = l2p;
30 //
31 if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
32 //
33 fSimu = simulation;
34 this->Set();
35 //
36 }
37
38 void CaloEnergy::UseCaloPreSampler(){
39 //
40 // use the presampler setting forcefitmode to 1000 means to force the DV routine to find the track inside the calorimeter using the "shower" approach developed for electrons
41 //
42 if ( !cp ) cp = new CaloPreSampler(L2);
43 cp->SplitInto(0,22);
44 cp->SetForceFitMode(1000);
45 // cp->UseTracker(false);
46 // cp->ForceCaloFit();
47 // cp->SetDebug(true);
48 // cp->Process();
49 if ( clong ) clong->SetCaloLevel2Pointer(cp->GetLevel2Pointer());
50 }
51
52
53 void CaloEnergy::UseLongFit(){
54 fPl = 0;
55 fLong = true;
56 if ( !clong ){
57 clong = new CaloLong(L2);
58 if ( cp ) clong->SetCaloLevel2Pointer(cp->GetLevel2Pointer());
59 clong->SplitInto(0,22);
60 };
61 //
62 }
63
64 void CaloEnergy::Set(){
65 //
66 // set default values, NB default conversion factor for energy is just very approximated!
67 //
68 OBT = 0;
69 PKT = 0;
70 atime = 0;
71 sntr = "start";
72 //
73 AOBT = 0;
74 APKT = 0;
75 aatime = 0;
76 asntr = "start";
77 //
78 debug = false;
79 //
80 indep = false;
81 //
82 fLong = false;
83 fPl = 1;
84 fRad = -1;
85 cp = NULL;
86 clong = NULL;
87 x0max = -1.;
88 //
89 this->DefineGeometry();
90 fXosel =true;
91 fXesel = true;
92 fYosel = true;
93 fYesel = true;
94 fConv_rxe = 44.4;
95 fConv_rxo = 44.4;
96 fConv_ryo = 44.4;
97 fConv_rye = 44.4;
98 fXomin = 1000;
99 fXemin = 1000;
100 fYomin = 1000;
101 fYemin = 1000;
102 }
103
104 void CaloEnergy::SetMinimumContainment(TString section, Int_t plane){
105 section.ToUpper();
106 if ( section.Contains("XO") ) fXomin = plane;
107 if ( section.Contains("XE") ) fXemin = plane;
108 if ( section.Contains("YO") ) fYomin = plane;
109 if ( section.Contains("YE") ) fYemin = plane;
110 }
111
112 void CaloEnergy::SetMinimumContainment(Int_t plane){
113 this->SetMinimumContainment("XEXOYEYO",plane);
114 }
115
116 Int_t CaloEnergy::GetMinimumContainment(TString section){
117 section.ToUpper();
118 if ( section.Contains("XO") ) return(fXomin);
119 if ( section.Contains("XE") ) return(fXemin);
120 if ( section.Contains("YE") ) return(fYemin);
121 if ( section.Contains("YO") ) return(fYomin);
122 printf(" ERROR: section not recognized \n");
123 return(-1000);
124 }
125
126 void CaloEnergy::SetConversionFactor(TString section, Float_t conv){
127 section.ToUpper();
128 if ( section.Contains("XO") ) fConv_rxo = conv;
129 if ( section.Contains("XE") ) fConv_rxe = conv;
130 if ( section.Contains("YO") ) fConv_ryo = conv;
131 if ( section.Contains("YE") ) fConv_rye = conv;
132 }
133
134 void CaloEnergy::SetConversionFactor(Float_t conv){
135 this->SetConversionFactor("XEXOYEYO",conv);
136 }
137
138 Float_t CaloEnergy::GetConversionFactor(TString section){
139 section.ToUpper();
140 if ( section.Contains("XO") ) return(fConv_rxo);
141 if ( section.Contains("XE") ) return(fConv_rxe);
142 if ( section.Contains("YO") ) return(fConv_ryo);
143 if ( section.Contains("YE") ) return(fConv_rye);
144 printf(" ERROR: section not recognized \n");
145 return(-1000.);
146 }
147
148 Int_t CaloEnergy::GetMaxplane(TString section){
149 section.ToUpper();
150 if ( section.Contains("XO") ) return fMax_planexo;
151 if ( section.Contains("XE") ) return fMax_planexe;
152 if ( section.Contains("YO") ) return fMax_planeyo;
153 if ( section.Contains("YE") ) return fMax_planeye;
154 return(-1);
155 }
156
157 Float_t CaloEnergy::GetEnergyAtMaxplane(TString section){
158 section.ToUpper();
159 if ( section.Contains("XO") ) return xomax_en;
160 if ( section.Contains("XE") ) return xemax_en;
161 if ( section.Contains("YO") ) return yomax_en;
162 if ( section.Contains("YE") ) return yemax_en;
163 return(-1);
164 }
165
166 Float_t CaloEnergy::GetMaxEnergy(TString section){
167 section.ToUpper();
168 if ( fLong ){
169 this->Process(section);
170 return fXOen_maxplane;
171 } else {
172 if ( section.Contains("XO") ) return fXOen_maxplane;
173 if ( section.Contains("XE") ) return fXEen_maxplane;
174 if ( section.Contains("YO") ) return fYOen_maxplane;
175 if ( section.Contains("YE") ) return fYEen_maxplane;
176 };
177 return(-1);
178 }
179
180 Float_t CaloEnergy::GetMaxEnergy(){
181 if ( fLong ){
182 if ( debug ) printf(" oh! call process! with asntr %s and sntr %s \n",asntr.Data(),sntr.Data());
183 this->Process(asntr);
184 };
185 return((fXEen_maxplane+fYOen_maxplane+fYEen_maxplane+fXOen_maxplane));
186 }
187
188 void CaloEnergy::DefineGeometry(){
189 //
190 // Use CaloStrip to determine once the position of border strips for each section
191 //
192 //
193 fM = 2. + 0.096; // real position from cbar
194 fM1 = 2. - 0.122 - 0.096; // due to calculation of xe1 etc.
195 if ( fM1 < 0. ) fM1 = 0.;
196 //
197 CaloStrip *cs = new CaloStrip(fSimu);
198 //
199 // view y plane 0 strip 0
200 cs->Set(1,0,0);
201 xe1= cs->GetY();
202 // z1= cs->GetZ();
203 // view y plane 0 strip 31
204 cs->Set(1,0,31);
205 xe2= cs->GetY();
206 // view y plane 0 strip 32
207 cs->Set(1,0,32);
208 xe3= cs->GetY();
209 // view y plane 0 strip 63
210 cs->Set(1,0,63);
211 xe4= cs->GetY();
212 // view y plane 0 strip 64
213 cs->Set(1,0,64);
214 xe5= cs->GetY();
215 // view y plane 0 strip 95
216 cs->Set(1,0,95);
217 xe6= cs->GetY();
218
219 // view x plane 0 strip 0
220 cs->Set(0,0,0);
221 yo1= cs->GetX();
222 // z2= cs->GetZ();
223 // view x plane 0 strip 31
224 cs->Set(0,0,31);
225 yo2= cs->GetX();
226 // view x plane 0 strip 32
227 cs->Set(0,0,32);
228 yo3= cs->GetX();
229 // view x plane 0 strip 63
230 cs->Set(0,0,63);
231 yo4= cs->GetX();
232 // view x plane 0 strip 64
233 cs->Set(0,0,64);
234 yo5= cs->GetX();
235 // view x plane 0 strip 95
236 cs->Set(0,0,95);
237 yo6= cs->GetX();
238
239
240 // view y plane 1 strip 0
241 cs->Set(1,1,0);
242 xo1= cs->GetY();
243 // z3= cs->GetZ();
244 // view y plane 1 strip 31
245 cs->Set(1,1,31);
246 xo2= cs->GetY();
247 // view y plane 1 strip 32
248 cs->Set(1,1,32);
249 xo3= cs->GetY();
250 // view y plane 1 strip 63
251 cs->Set(1,1,63);
252 xo4= cs->GetY();
253 // view y plane 1 strip 64
254 cs->Set(1,1,64);
255 xo5= cs->GetY();
256 // view y plane 1 strip 95
257 cs->Set(1,1,95);
258 xo6= cs->GetY();
259
260 // view x plane 1 strip 0
261 cs->Set(0,1,0);
262 ye1= cs->GetX();
263 // z4= cs->GetZ();
264 // view x plane 1 strip 31
265 cs->Set(0,1,31);
266 ye2= cs->GetX();
267 // view x plane 1 strip 32
268 cs->Set(0,1,32);
269 ye3= cs->GetX();
270 // view x plane 1 strip 63
271 cs->Set(0,1,63);
272 ye4= cs->GetX();
273 // view x plane 1 strip 64
274 cs->Set(0,1,64);
275 ye5= cs->GetX();
276 // view x plane 1 strip 95
277 cs->Set(0,1,95);
278 ye6= cs->GetX();
279
280 //
281 for (Int_t p = 0; p<22; p ++){
282 for (Int_t v = 0; v<2; v++ ){
283 cs->Set(v,p,0);
284 trk_z[p][v]= cs->GetZ(); // Z coord for each plane
285 };
286 };
287 //
288 delete cs;
289 //
290 }
291
292 void CaloEnergy::Clear(){
293 //
294 // clear variables
295 //
296 fPartsel = false;
297 fSel = false;
298 fXosel = false;
299 fXesel = false;
300 fYosel = false;
301 fYesel = false;
302 fCount = 0.;
303 fEnergy = 0.;
304 fEnergyxe = 0.;
305 fEnergyxo = 0.;
306 fEnergyye = 0.;
307 fEnergyyo = 0.;
308 fMax_plane = 0;
309 fMax_planexo = 0;
310 fMax_planexe = 0;
311 fMax_planeyo = 0;
312 fMax_planeye = 0;
313 xomax_en= 0.;
314 xemax_en= 0.;
315 yomax_en= 0.;
316 yemax_en= 0.;
317 //
318 memset(enstrip,0,2*22*96*(sizeof(Float_t)));
319 en = 0.;
320 view = 0;
321 plane = 0;
322 strip = 0;
323 energyxe = 0.;
324 energyyo = 0.;
325 energyxo = 0.;
326 energyye = 0.;
327 fYoout = 0;
328 fYeout = 0;
329 fXoout = 0;
330 fXeout = 0;
331 fXEen_maxplane = 0.;
332 fXOen_maxplane = 0.;
333 fYEen_maxplane = 0.;
334 fYOen_maxplane = 0.;
335 memset(en_xep,0,11*sizeof(Float_t));
336 memset(en_yep,0,11*sizeof(Float_t));
337 memset(en_xop,0,11*sizeof(Float_t));
338 memset(en_yop,0,11*sizeof(Float_t));
339 //
340 }
341
342 void CaloEnergy::Print(){
343 //
344 printf("========================================================================\n");
345 printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime);
346 printf(" fEnergy :.............. %f \n",fEnergy);
347 printf(" fMax_plane :........... %f \n",fMax_plane);
348 printf(" fMax_planexo :......... %i \n",fMax_planexo);
349 printf(" fMax_planexe :......... %i \n",fMax_planexe);
350 printf(" fMax_planeyo :......... %i \n",fMax_planeyo);
351 printf(" fMax_planeye :......... %i \n",fMax_planeye);
352 printf(" fCount :.............. %f \n",fCount);
353 printf(" fSel :.............. %i \n",fSel);
354 printf(" fPartsel:.............. %i \n",fPartsel);
355 printf(" fXesel :.............. %i \n",fXesel);
356 printf(" fXosel :.............. %i \n",fXosel);
357 printf(" fYesel :.............. %i \n",fYesel);
358 printf(" fYosel :.............. %i \n",fYosel);
359 printf(" fXemin :.............. %i \n",fXemin);
360 printf(" fXomin :.............. %i \n",fXomin);
361 printf(" fYemin :.............. %i \n",fYemin);
362 printf(" fYomin :.............. %i \n",fYomin);
363 printf(" fXeout :.............. %i \n",fXeout);
364 printf(" fXoout :.............. %i \n",fXoout);
365 printf(" fYeout :.............. %i \n",fYeout);
366 printf(" fYoout :.............. %i \n",fYoout);
367 printf(" fSimu :.............. %i \n",fSimu);
368 printf(" fM :.............. %f \n",fM);
369 printf(" fM1 :.............. %f \n",fM1);
370 printf(" fRad :.............. %i \n",fRad);
371 printf(" fPl :.............. %i \n",fPl);
372 printf(" fConv_rxe ............. %f \n",fConv_rxe);
373 printf(" fConv_rxo ............. %f \n",fConv_rxo);
374 printf(" fConv_ryo ............. %f \n",fConv_ryo);
375 printf(" fConv_rye ............. %f \n",fConv_rye);
376 printf(" fLong :.............. %i \n",fLong);
377 printf(" energyxe:.............. %f \n",energyxe);
378 printf(" energyxo:.............. %f \n",energyxo);
379 printf(" energyye:.............. %f \n",energyye);
380 printf(" energyyo:.............. %f \n",energyyo);
381 printf(" fXEen_maxplane:........ %f \n",fXEen_maxplane);
382 printf(" fXOen_maxplane:........ %f \n",fXOen_maxplane);
383 printf(" fYEen_maxplane:........ %f \n",fYEen_maxplane);
384 printf(" fYOen_maxplane:........ %f \n",fYOen_maxplane);
385 printf(" x0max :.............. %f \n",x0max);
386 printf(" debug :.............. %i \n",debug);
387
388 printf("========================================================================\n");
389 //
390 }
391
392 void CaloEnergy::Delete(){
393 Clear();
394 delete this;
395 }
396
397
398 Bool_t CaloEnergy::IsInsideAcceptance(TString section){
399 //
400 // check if the event is inside the acceptance of the given section(s)
401 //
402 TString ntr = section;
403 if ( !L2 ){
404 printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
405 printf(" ERROR: CaloEnergy variables not filled \n");
406 return false;
407 };
408 //
409 Bool_t newentry = false;
410 //
411 if ( L2->IsORB() ){
412 if ( L2->GetOrbitalInfo()->pkt_num != APKT || L2->GetOrbitalInfo()->OBT != AOBT || L2->GetOrbitalInfo()->absTime != aatime || strcmp(ntr.Data(),asntr.Data()) ){
413 newentry = true;
414 AOBT = L2->GetOrbitalInfo()->OBT;
415 APKT = L2->GetOrbitalInfo()->pkt_num;
416 aatime = L2->GetOrbitalInfo()->absTime;
417 asntr = ntr;
418 };
419 } else {
420 newentry = true;
421 };
422 //
423 // if we have already called this method for this event and no input changed then return fSel and exit
424 //
425 if ( !newentry ) return fSel;
426 //
427 // process the event
428 //
429 if ( debug ) printf(" ########## IsInsideAcceptance ######### \n");
430 //
431 // clear variables
432 //
433 this->Clear();
434 //
435 section.ToUpper();
436 //
437 // Count the number of section(s) given as input
438 //
439 Int_t fNumSec = Int_t(section.Contains("XO"))+Int_t(section.Contains("XE"))+Int_t(section.Contains("YO"))+Int_t(section.Contains("YE"));
440 if ( !fNumSec ){
441 printf(" ERROR: section must be XO or XE or YO or YE while it is %s \n",section.Data());
442 return false;
443 };
444 //
445 // If the presampler object exists then use the presampler output instead of the level2 output
446 //
447 CaloLevel2 *cl2 = NULL;
448 if ( cp ){
449 cl2 = cp->GetCaloLevel2();
450 } else {
451 cl2 = L2->GetCaloLevel2();
452 };
453 //
454 // get the energy for every strip of the calorimeter
455 //
456 for (Int_t ch=0; ch< L2->GetCaloLevel1()->istrip; ch++){
457 en = L2->GetCaloLevel1()->DecodeEstrip(ch,view,plane,strip);
458 enstrip[view][plane][strip]=en;
459 };
460 //
461 // sum energy plane by plane for each sections
462 //
463 for (Int_t i=0;i<11;i++){
464 for(strip=0; strip<96; strip++) {
465 if ( fRad < 0 ){
466 //
467 // run over all the strips of the plane
468 //
469 en_xep[i] += enstrip[1][2*i][strip];
470 en_yop[i] += enstrip[0][2*i][strip];
471 en_xop[i] += enstrip[1][(2*i)+1][strip];
472 en_yep[i] += enstrip[0][(2*i)+1][strip];
473 } else {
474 //
475 // use only the strips inside a cylinder of given radius fRad
476 //
477 if ( strip >= cl2->cibar[2*i][1]-1-fRad && strip <= cl2->cibar[2*i][1]-1+fRad ) en_xep[i] += enstrip[1][2*i][strip];
478 if ( strip >= cl2->cibar[2*i][0]-1-fRad && strip <= cl2->cibar[2*i][0]-1+fRad ) en_yop[i] += enstrip[0][2*i][strip];
479 if ( strip >= cl2->cibar[(2*i)+1][1]-1-fRad && strip <= cl2->cibar[(2*i)+1][1]-1+fRad ) en_xop[i] += enstrip[1][(2*i)+1][strip];
480 if ( strip >= cl2->cibar[(2*i)+1][0]-1-fRad && strip <= cl2->cibar[(2*i)+1][0]-1+fRad ) en_yep[i] += enstrip[0][(2*i)+1][strip];
481 };
482 };
483 energyxe += en_xep[i];
484 energyyo += en_yop[i];
485 energyxo += en_xop[i];
486 energyye += en_yep[i];
487 };
488 //
489 // Find the plane of maximum for each section
490 //
491 //
492 Int_t xen = 0;
493 Int_t yon = 0;
494 Int_t xon = 0;
495 Int_t yen = 0;
496 //
497 if ( section.Contains("XE") ){
498 yon++;
499 xon++;
500 yen++;
501 for (Int_t ipl =0; ipl < 11; ipl ++) {
502 if(en_xep[ipl] > xemax_en) {
503 xemax_en = en_xep[ipl];
504 fMax_planexe = ipl;
505 };
506 };
507 };
508 //
509 if ( section.Contains("YO") ){
510 xon++;
511 yen++;
512 for (Int_t ipl =0; ipl < 11; ipl ++) {
513 if(en_yop[ipl] > yomax_en) {
514 yomax_en = en_yop[ipl];
515 fMax_planeyo = ipl;
516 };
517 };
518 };
519 //
520 if ( section.Contains("XO") ){
521 yen++;
522 for (Int_t ipl =0; ipl < 11; ipl ++) {
523 if(en_xop[ipl] > xomax_en) {
524 xomax_en = en_xop[ipl];
525 fMax_planexo = ipl;
526 };
527 };
528 };
529 //
530 if ( section.Contains("YE") ){
531 for (Int_t ipl =0; ipl < 11; ipl ++) {
532 if(en_yep[ipl] > yemax_en) {
533 yemax_en = en_yep[ipl];
534 fMax_planeye = ipl;
535 };
536 };
537 };
538 //
539 // the maximum is given externally as X0, convert it to plane and section
540 //
541 if ( x0max > 0. ){
542 if ( debug ) printf(" CALCULATE MAX PLANE GIVEN X0 ASSUMING PERPENDICULAR TRACK \n");
543 Int_t wpl = (Int_t)roundf(x0max/0.76);
544 Bool_t isY = false;
545 if ( ((x0max/0.76)-(Float_t)wpl) > 0. ) isY = true;
546 xomax_en = 0.;
547 yemax_en = 0.;
548 xemax_en = 0.;
549 yomax_en = 0.;
550 //
551 if ( !(wpl%2) ){
552 // 0, 2, 4, ...
553 if ( isY ){
554 if ( section.Contains("YO") ) yomax_en = 1000.;
555 if ( section.Contains("XE") ) xemax_en = 500.;
556 fMax_planeyo=wpl/2;
557 fMax_planexe=wpl/2;
558 if ( section.Contains("XO") ) xomax_en = 10.;
559 if ( section.Contains("YE") ) yemax_en = 5.;
560 } else {
561 if ( section.Contains("YO") ) yomax_en = 500.;
562 if ( section.Contains("XE") ) xemax_en = 1000.;
563 fMax_planeyo=wpl/2;
564 fMax_planexe=wpl/2;
565 if ( section.Contains("XO") ) xomax_en = 5.;
566 if ( section.Contains("YE") ) yemax_en = 10.;
567 };
568 } else {
569 // 1, 3, 5, ...
570 if ( isY ){
571 if ( section.Contains("YE") ) yemax_en = 1000.;
572 if ( section.Contains("XO") ) xomax_en = 500.;
573 fMax_planeye=(wpl-1)/2;
574 fMax_planexo=(wpl-1)/2;
575 if ( section.Contains("XE") ) xemax_en = 10.;
576 if ( section.Contains("YO") ) yomax_en = 5.;
577 } else {
578 if ( section.Contains("YE") ) yemax_en = 500.;
579 if ( section.Contains("XO") ) xomax_en = 1000.;
580 fMax_planeye=(wpl-1)/2;
581 fMax_planexo=(wpl-1)/2;
582 if ( section.Contains("XE") ) xemax_en = 5.;
583 if ( section.Contains("YO") ) yomax_en = 10.;
584 };
585 };
586 if ( debug ) printf(" x0max %f x0max/0.76 %f wpl %i isY %i yomax_en %f xemax_en %f yemax_en %f xomax_en %f fMaxplane %i %i %i %i\n",x0max,(x0max/0.76),wpl,isY,yomax_en,xemax_en,yemax_en,xomax_en,fMax_planeyo,fMax_planexe,fMax_planeye,fMax_planexo);
587 };
588 //
589 Int_t nPl = fPl;
590 //
591 // Set the maximum in case of coherent mode was selected
592 //
593 if ( !indep ){
594 nPl = 0;
595 if ( debug ) printf(" A: Check maximum, coherent mode: xoen %f yoen %f xeen %f yeen %f xomax %i yomax %i xemax %i yemax %i\n",xomax_en,yomax_en,xemax_en,yemax_en,fMax_planexo,fMax_planeyo,fMax_planexe,fMax_planeye);
596 Int_t nummod = 0;
597 Int_t numexpl = 0;
598 if ( xomax_en > xemax_en && xomax_en > yemax_en && xomax_en > yomax_en ){
599 //
600 // Section XO contains the maximum energy release per plane of the whole calorimeter
601 //
602 if ( debug ) printf(" XO is MAX %i %i %i %i\n",xen,yon,xon,yen);
603 //
604 // fMax_plane is the plane of maximum + number of additional dE/dx measurement counting planes from 0 to 43
605 //
606 fMax_plane = (fNumSec * fMax_planexo) +(Float_t)xon + fPl;
607 //
608 // nummod is the integer part of the number of modules in which the maximum is contained
609 //
610 nummod = (Int_t)(((Float_t)fMax_plane)/(Float_t)fNumSec);
611 //
612 // numexpl is the number of additional planes (0,1,2) inside the module
613 //
614 numexpl = (Int_t)((Float_t)fMax_plane-(Float_t)fNumSec*(Float_t)nummod);
615 //
616 };
617 if ( xemax_en > xomax_en && xemax_en > yemax_en && xemax_en > yomax_en ){
618 if ( debug ) printf(" XE is MAX %i %i %i %i\n",xen,yon,xon,yen);
619 fMax_plane = (fNumSec * fMax_planexe) +(Float_t)xen + fPl;
620 nummod = (Int_t)(((Float_t)fMax_plane)/(Float_t)fNumSec);
621 numexpl = (Int_t)((Float_t)fMax_plane-(Float_t)fNumSec*(Float_t)nummod);
622 //
623 };
624
625 if ( yemax_en > xomax_en && yemax_en > xemax_en && yemax_en > yomax_en ){
626 if ( debug ) printf(" YE is MAX %i %i %i %i\n",xen,yon,xon,yen);
627 fMax_plane = (fNumSec * fMax_planeye) +(Float_t)yen + fPl;
628 nummod = (Int_t)(((Float_t)fMax_plane)/(Float_t)fNumSec);
629 numexpl = (Int_t)((Float_t)fMax_plane-(Float_t)fNumSec*(Float_t)nummod);
630 //
631 };
632 if ( yomax_en > xemax_en && yomax_en > yemax_en && yomax_en > xomax_en ){
633 if ( debug ) printf(" YO is MAX %i %i %i %i\n",xen,yon,xon,yen);
634 fMax_plane = (fNumSec * fMax_planeyo) +(Float_t)yon + fPl;
635 nummod = (Int_t)(((Float_t)fMax_plane)/(Float_t)fNumSec);
636 numexpl = (Int_t)((Float_t)fMax_plane-(Float_t)fNumSec*(Float_t)nummod);
637 //
638 };
639 //
640 // find the plane up to which is necessary to integrate the energy for each section
641 //
642 Int_t a = 0;
643 Int_t b = 0;
644 Int_t c = 0;
645 if ( numexpl > xen ) a = 1;
646 if ( numexpl > yon ) b = 1;
647 if ( numexpl > xon ) c = 1;
648 fMax_planexe = nummod;
649 fMax_planeyo = nummod - 1 + a;
650 fMax_planexo = nummod - 1 + b;
651 fMax_planeye = nummod - 1 + c;
652 if ( debug ) printf(" fMax_plane %f nummod %i numexpl %i a %i b %i c %i \n",fMax_plane,nummod,numexpl,a,b,c);
653 if ( debug ) printf(" DONE: Check maximum, coherent mode: xoen %f yoen %f xeen %f yeen %f xomax %i yomax %i xemax %i yemax %i\n",xomax_en,yomax_en,xemax_en,yemax_en,fMax_planexo,fMax_planeyo,fMax_planexe,fMax_planeye);
654 };
655 //
656 // for each plane of the calorimeter find the position of the track in the direction along the strip (where we do not have a measurement from the selected plane) by looking at the plane above/below of the other view and extrapolating the trajectory to the given plane
657 //
658 Float_t track_coordx[22][2];
659 Float_t track_coordy[22][2];
660 //
661 Float_t tgx_cl2;
662 Float_t tgy_cl2;
663 tgx_cl2 = cl2->tanx[0];
664 tgy_cl2 = cl2->tany[0];
665 //
666 for (Int_t p=0; p<22; p++){
667 track_coordy[p][1] = cl2->cbar[p][1];
668 track_coordx[p][1] = cl2->cbar[p][0] - fabs(trk_z[p][1]-trk_z[p][0])*tgx_cl2;
669 track_coordx[p][0] = cl2->cbar[p][0];
670 track_coordy[p][0] = cl2->cbar[p][1] - fabs(trk_z[p][1]-trk_z[p][0])*tgy_cl2;
671 if ( debug ) printf(" p %i track_coordy[p][1] %f track_coordx[p][1] %f track_coordx[p][0] %f track_coordy[p][0] %f \n",p,track_coordy[p][1],track_coordx[p][1],track_coordx[p][0],track_coordy[p][0]);
672 };
673 //
674 if ( debug ) printf(" acceptance fNumSec %i tgx %f tgy %f\n",fNumSec,tgx_cl2,tgy_cl2);
675 //
676 if ( section.Contains("XO") ){
677 //
678 // check event is inside XO acceptance
679 //
680 for (Int_t i=0; i<11; i++) {
681 if
682 (
683 (((track_coordx[(2*i)+1][1]>=(-12.054+fM))&&
684 (track_coordx[(2*i)+1][1]<=(-4.246-fM)))&&
685 (((cl2->cbar[(2*i)+1][1]>=xo1 + fM1)&&
686 (cl2->cbar[(2*i)+1][1]<=xo2 - fM1 ))||
687 ((cl2->cbar[(2*i)+1][1]>=xo3 + fM1)&&
688 (cl2->cbar[(2*i)+1][1]<=xo4 - fM1 ))||
689 ((cl2->cbar[(2*i)+1][1]>=xo5 + fM1)&&
690 (cl2->cbar[(2*i)+1][1]<=xo6 - fM1 ))))||
691
692 (((track_coordx[(2*i)+1][1]>=(-4.004+fM))&&
693 (track_coordx[(2*i)+1][1]<=(3.804-fM)))&&
694 (((cl2->cbar[(2*i)+1][1]>=xo1 + fM1)&&
695 (cl2->cbar[(2*i)+1][1]<=xo2 - fM1 ))||
696 ((cl2->cbar[(2*i)+1][1]>=xo3 + fM1)&&
697 (cl2->cbar[(2*i)+1][1]<=xo4 - fM1))||
698 ((cl2->cbar[(2*i)+1][1]>=xo5 + fM1)&&
699 (cl2->cbar[(2*i)+1][1]<=xo6 - fM1 ))))||
700
701 (((track_coordx[(2*i)+1][1]>=(4.046+fM))&&
702 (track_coordx[(2*i)+1][1]<=(11.854-fM)))&&
703 (((cl2->cbar[(2*i)+1][1]>=xo1 + fM1)&&
704 (cl2->cbar[(2*i)+1][1]<=xo2 - fM1))||
705 ((cl2->cbar[(2*i)+1][1]>=xo3 + fM1)&&
706 (cl2->cbar[(2*i)+1][1]<=xo4 - fM1 ))||
707 ((cl2->cbar[(2*i)+1][1]>=xo5 + fM1)&&
708 (cl2->cbar[(2*i)+1][1]<=xo6 - fM1 ))))
709 ){
710 fXosel = true;
711 fXoout = i;
712 } else {
713 fXosel = false;
714 break;
715 };
716 };
717 //
718 // if it goes out of the acceptance BUT the plane up to which we are integrating the energy is contained then the event is "partially" contained
719 //
720 if ( !fXosel && fXoout >= fXomin && fXoout >= (Int_t)(fMax_planexo+nPl) ){
721 if ( debug ) printf(" XO: this event is only partially contained: fXoout %i fXomin %i fMax_planexo + nPl %i \n",fXoout,fXomin,(Int_t)(fMax_planexo+nPl));
722 fPartsel = true;
723 fXosel = true;
724 };
725 //
726 // event is contained (or partially contained) hence we can integrate energy up to the maximum and calculate the energy as measured by this section
727 //
728 if ( fXosel ){
729 for (Int_t iplm=0;iplm<=TMath::Min(10,(Int_t)(fMax_planexo+nPl)) ;iplm++){
730 fXOen_maxplane += en_xop[iplm];
731 if ( debug ) printf(" XO iplm %i fXOen_maxplane %f en_xop[iplm] %f\n",iplm,fXOen_maxplane,en_xop[iplm]);
732 };
733 fEnergyxo = fXOen_maxplane/fConv_rxo;
734 };
735 };
736 //
737 if ( section.Contains("XE") ){
738 for (Int_t i=0; i<11; i++) {
739 if
740 (
741 (((track_coordx[2*i][1]>=(-11.854+fM))&&
742 (track_coordx[2*i][1]<=(-4.046-fM)))&&
743 (((cl2->cbar[2*i][1]>=xe1 + fM1)&&
744 (cl2->cbar[2*i][1]<=xe2 - fM1 ))||
745 ((cl2->cbar[2*i][1]>=xe3 + fM1)&&
746 (cl2->cbar[2*i][1]<=xe4 - fM1 ))||
747 ((cl2->cbar[2*i][1]>=xe5 + fM1)&&
748 (cl2->cbar[2*i][1]<=xe6 - fM1 ))))||
749
750 (((track_coordx[2*i][1]>=(-3.804+fM))&&
751 (track_coordx[2*i][1]<=(4.004-fM)))&&
752 (((cl2->cbar[2*i][1]>=xe1 + fM1)&&
753 (cl2->cbar[2*i][1]<=xe2 - fM1 ))||
754 ((cl2->cbar[2*i][1]>=xe3 + fM1)&&
755 (cl2->cbar[2*i][1]<=xe4 - fM1))||
756 ((cl2->cbar[2*i][1]>=xe5 + fM1)&&
757 (cl2->cbar[2*i][1]<=xe6 - fM1 ))))||
758
759 (((track_coordx[2*i][1]>=(4.246+fM))&&
760 (track_coordx[2*i][1]<=(12.054-fM)))&&
761 (((cl2->cbar[2*i][1]>=xe1 + fM1)&&
762 (cl2->cbar[2*i][1]<=xe2 - fM1))||
763 ((cl2->cbar[2*i][1]>=xe3 + fM1)&&
764 (cl2->cbar[2*i][1]<=xe4 - fM1 ))||
765 ((cl2->cbar[2*i][1]>=xe5 + fM1)&&
766 (cl2->cbar[2*i][1]<=xe6 - fM1 ))))
767 ){
768 fXesel = true;
769 fXeout = i;
770 } else {
771 fXesel = false;
772 break;
773 };
774 };
775 if ( !fXesel && fXeout >= fXemin && fXeout >= (Int_t)(fMax_planexe+nPl) ){
776 if ( debug ) printf(" XE: this event is only partially contained: fXeout %i fXemin %i fMax_planexe + nPl %i \n",fXeout,fXemin,(Int_t)(fMax_planexe+nPl));
777 fPartsel = true;
778 fXesel = true;
779 };
780 if ( fXesel ){
781 for (Int_t iplm=0;iplm<=TMath::Min(10,(Int_t)(fMax_planexe+nPl)) ;iplm++){
782 fXEen_maxplane += en_xep[iplm];
783 if ( debug ) printf(" XE iplm %i fXOen_maxplane %f en_xop[iplm] %f\n",iplm,fXEen_maxplane,en_xep[iplm]);
784 };
785 fEnergyxe = fXEen_maxplane/fConv_rxe;
786 };
787 };
788 //
789 if ( section.Contains("YE") ){
790 for (Int_t i=0; i<11; i++) {
791 if
792 (
793 (((track_coordy[(2*i)+1][0]>=(-12.154+fM))&&
794 (track_coordy[(2*i)+1][0]<=(-4.346-fM)))&&
795 (((cl2->cbar[(2*i)+1][0]>=ye1 + fM1)&&
796 (cl2->cbar[(2*i)+1][0]<=ye2 - fM1 ))||
797 ((cl2->cbar[(2*i)+1][0]>=ye3 + fM1)&&
798 (cl2->cbar[(2*i)+1][0]<=ye4 - fM1 ))||
799 ((cl2->cbar[(2*i)+1][0]>=ye5 + fM1)&&
800 (cl2->cbar[(2*i)+1][0]<=ye6 - fM1 ))))||
801
802 (((track_coordy[(2*i)+1][0]>=(-4.104+fM))&&
803 (track_coordy[(2*i)+1][0]<=(3.704-fM)))&&
804 (((cl2->cbar[(2*i)+1][0]>=ye1 + fM1)&&
805 (cl2->cbar[(2*i)+1][0]<=ye2 - fM1 ))||
806 ((cl2->cbar[(2*i)+1][0]>=ye3 + fM1)&&
807 (cl2->cbar[(2*i)+1][0]<=ye4 - fM1))||
808 ((cl2->cbar[(2*i)+1][0]>=ye5 + fM1)&&
809 (cl2->cbar[(2*i)+1][0]<=ye6 - fM1 ))))||
810
811 (((track_coordy[(2*i)+1][0]>=(3.946+fM))&&
812 (track_coordy[(2*i)+1][0]<=(11.754-fM)))&&
813 (((cl2->cbar[(2*i)+1][0]>=ye1 + fM1)&&
814 (cl2->cbar[(2*i)+1][0]<=ye2 - fM1))||
815 ((cl2->cbar[(2*i)+1][0]>=ye3 + fM1)&&
816 (cl2->cbar[(2*i)+1][0]<=ye4 - fM1 ))||
817 ((cl2->cbar[(2*i)+1][0]>=ye5 + fM1)&&
818 (cl2->cbar[(2*i)+1][0]<=ye6 - fM1 ))))
819 ){
820 fYesel = true;
821 fYeout = i;
822 } else {
823 fYesel = false;
824 break;
825 };
826 };
827 if ( !fYesel && fYeout >= fYemin && fYeout >= (Int_t)(fMax_planeye+nPl) ){
828 if ( debug ) printf(" YE: this event is only partially contained: fYeout %i fYemin %i fMax_planeye + nPl %i \n",fYeout,fYemin,(Int_t)(fMax_planeye+nPl));
829 fPartsel = true;
830 fYesel = true;
831 };
832 if ( fYesel ){
833 for (Int_t iplm=0;iplm<=TMath::Min(10,(Int_t)(fMax_planeye+nPl)) ;iplm++) fYEen_maxplane += en_yep[iplm];
834 fEnergyye = fYEen_maxplane/fConv_rye;
835 };
836 };
837 //
838 if ( section.Contains("YO") ){
839 for (Int_t i=0; i<11; i++) {
840 if ( debug ) printf(" i %i track_coordy[2*i][0] %f cl2->cbar[2*i][0] %f \n",i,track_coordy[2*i][0],cl2->cbar[2*i][0]);
841 if ( debug ) printf(" i %i fm %f fm1 %f yo1 %g yo2 %f yo3 %f yo4 %f yo5 %f yo6 %f \n",i,fM,fM1,yo1,yo2,yo3,yo4,yo5,yo6);
842 if
843 (
844 (((track_coordy[2*i][0]>=(-11.954+fM))&&
845 (track_coordy[2*i][0]<=(-4.146-fM)))&&
846 (((cl2->cbar[2*i][0]>=yo1 + fM1)&&
847 (cl2->cbar[2*i][0]<=yo2 - fM1 ))||
848 ((cl2->cbar[2*i][0]>=yo3 + fM1)&&
849 (cl2->cbar[2*i][0]<=yo4 - fM1 ))||
850 ((cl2->cbar[2*i][0]>=yo5 + fM1)&&
851 (cl2->cbar[2*i][0]<=yo6 - fM1 ))))||
852
853 (((track_coordy[2*i][0]>=(-3.904+fM))&&
854 (track_coordy[2*i][0]<=(+3.904-fM)))&&
855 (((cl2->cbar[2*i][0]>=yo1 + fM1)&&
856 (cl2->cbar[2*i][0]<=yo2 - fM1 ))||
857 ((cl2->cbar[2*i][0]>=yo3 + fM1)&&
858 (cl2->cbar[2*i][0]<=yo4 - fM1))||
859 ((cl2->cbar[2*i][0]>=yo5 + fM1)&&
860 (cl2->cbar[2*i][0]<=yo6 - fM1 ))))||
861
862 (((track_coordy[2*i][0]>=(4.146+fM))&&
863 (track_coordy[2*i][0]<=(11.954-fM)))&&
864 (((cl2->cbar[2*i][0]>=yo1 + fM1)&&
865 (cl2->cbar[2*i][0]<=yo2 - fM1))||
866 ((cl2->cbar[2*i][0]>=yo3 + fM1)&&
867 (cl2->cbar[2*i][0]<=yo4 - fM1 ))||
868 ((cl2->cbar[2*i][0]>=yo5 + fM1)&&
869 (cl2->cbar[2*i][0]<=yo6 - fM1 ))))
870 ){
871 fYosel = true;
872 fYoout = i;
873 } else {
874 fYosel = false;
875 break;
876 };
877 };
878 if ( !fYosel && fYoout >= fYomin && fYoout >= (Int_t)(fMax_planeyo+nPl) ){
879 if ( debug ) printf(" YO: this event is only partially contained: fYoout %i fYomin %i fMax_planeyo + nPl %i \n",fYoout,fYomin,(Int_t)(fMax_planeyo+nPl));
880 fPartsel = true;
881 fYosel = true;
882 };
883 if ( fYosel ){
884 for (Int_t iplm=0;iplm<=TMath::Min(10,(Int_t)(fMax_planeyo+nPl)) ;iplm++) fYOen_maxplane += en_yop[iplm];
885 fEnergyyo = fYOen_maxplane/fConv_ryo;
886 };
887 };
888 //
889 // Count the number of sections in which the event is contained
890 //
891 fCount = (Float_t)((Int_t)fXesel+(Int_t)fXosel+(Int_t)fYesel+(Int_t)fYosel);
892 //
893 if ( indep ){
894 //
895 // independent mode, average the energy measurement and max plane of the contained sections
896 //
897 fSel = ( fXesel || fYesel || fXosel || fYosel );
898 fMax_plane = (Float_t)(fMax_planeyo+fMax_planeye+fMax_planexo+fMax_planexe)/fCount;
899 fEnergy = (fEnergyxe+fEnergyyo+fEnergyye+fEnergyxo)/fCount;
900 //
901 } else {
902 //
903 // coherent mode, sum the energy [MIP] of the given sections and convert using fConv_rxo. **** NB: it is assumed that the conversion factor is unique and the method SetConvertionFactor(Float_t) has been used**** The event is selected only if it is contained in all the given sections
904 //
905 if ( fCount != fNumSec ){
906 fSel = false;
907 } else {
908 fSel = true;
909 };
910 fEnergy = (fXEen_maxplane+fYOen_maxplane+fYEen_maxplane+fXOen_maxplane)/fConv_rxo;
911 };
912 //
913 if ( debug ) printf("sel %i indep %i fMax_plane %f conv_r %f en_maxplane %f encalo %f \n",fSel,indep,fMax_plane,fConv_rxo,fXOen_maxplane,fEnergy);
914 if ( debug ) printf(" IsInside XE %i XO %i YE %i YO %i => SEL %i \n",fXesel,fXosel,fYesel,fYosel,fSel);
915 //
916 // finish exit
917 //
918 return fSel;
919 //
920 }
921
922 void CaloEnergy::Process(){
923 TString xo = "XO";
924 this->Process(xo);
925 }
926
927
928 void CaloEnergy::Process(TString section){
929 //
930 // process the event
931 //
932 TString ntr = section;
933 if ( !L2 ){
934 printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
935 printf(" ERROR: CaloEnergy variables not filled \n");
936 return;
937 };
938 //
939 Bool_t newentry = false;
940 //
941 if ( L2->IsORB() ){
942 if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime || strcmp(ntr.Data(),sntr.Data()) ){
943 newentry = true;
944 OBT = L2->GetOrbitalInfo()->OBT;
945 PKT = L2->GetOrbitalInfo()->pkt_num;
946 atime = L2->GetOrbitalInfo()->absTime;
947 sntr = ntr;
948 };
949 } else {
950 newentry = true;
951 };
952 //
953 // if we have already called this method for this event and no input changed then return fSel and exit
954 //
955 if ( !newentry ) return;
956 //
957 // process the event
958 //
959 if ( debug ) printf(" Processing event at OBT %u PKT %u time %u section %s\n",OBT,PKT,atime,section.Data());
960 //
961 // check if the cylinder of integration can go out of the sensor given the frame which has been set (if we use all the calorimeter fRad is < 0 and the printout is suppressed)
962 //
963 if ( (fM1+0.122-0.244*(Float_t)fRad) < 0. ) printf("Error: (fM1+0.122-0.244*(Float_t)fRad) < 0. fM1 %f fRad %i %f \n",fM1,fRad,(fM1+0.122-0.244*(Float_t)fRad));
964 //
965 if ( fLong ){
966 if ( debug ) printf(" ==================================================================> LONGITUDINAL FIT! \n");
967 //
968 // use long fit to measure energy
969 //
970 if ( this->IsInsideAcceptance(section) ){
971 //
972 if ( debug ) printf(" ==================================================================> LONG INSIDE! \n");
973 //
974 Float_t myene[2][22];
975 memset(myene,0,(sizeof(Float_t))*2*22);
976 for (Int_t j=0; j<11; j++){
977 if ( section.Contains("XE") ) myene[1][2*j] = en_xep[j];
978 if ( section.Contains("YO") ) myene[0][2*j] = en_yop[j];
979 if ( section.Contains("XO") ) myene[1][(2*j)+1] = en_xop[j];
980 if ( section.Contains("YE") ) myene[0][(2*j)+1] = en_yep[j];
981 };
982 clong->UnMaskSections();
983 if ( !(section.Contains("YE")) ) clong->MaskSection("YE");
984 if ( !(section.Contains("YO")) ) clong->MaskSection("YO");
985 if ( !(section.Contains("XO")) ) clong->MaskSection("XO");
986 if ( !(section.Contains("XE")) ) clong->MaskSection("XE");
987 clong->ForceNextFit();
988 clong->SetEnergies(myene);
989 if ( debug ){
990 clong->Fit(true);
991 } else {
992 clong->Fit();
993 };
994 if ( clong->GetLowerLimit() != 0. || clong->GetUpperLimit() != 0. ){
995 fXOen_maxplane = clong->Get_defE0();
996 } else {
997 fXOen_maxplane = clong->Get_E0();
998 };
999 fYOen_maxplane = 0.;
1000 fYEen_maxplane = 0.;
1001 fXEen_maxplane = 0.;
1002 fEnergy=fXOen_maxplane/fConv_rxo;
1003 if ( fEnergy != fEnergy || clong->Get_fitresult() != 0 ) fEnergy = -1.;
1004 // if ( fEnergy != fEnergy ) fEnergy = 1.;
1005 //
1006 } else {
1007 //
1008 // if the event is not in the acceptance, return a negative energy.
1009 //
1010 if ( debug ) printf(" Outside acceptance \n");
1011 fEnergy *= -1.;
1012 //
1013 };
1014 //
1015 } else {
1016 //
1017 // use the energy measurement
1018 //
1019 if ( this->IsInsideAcceptance(section) ){
1020 //
1021 // the event is good
1022 //
1023 if ( debug ) printf(" XE %i XO %i YE %i YO %i \n",fXesel,fXosel,fYesel,fYosel);
1024 //
1025 } else {
1026 //
1027 // if the event is not in the acceptance, return a negative energy.
1028 //
1029 if ( debug ) printf(" Outside acceptance \n");
1030 fEnergy *= -1.;
1031 //
1032 };
1033 };
1034 //
1035 }

  ViewVC Help
Powered by ViewVC 1.1.23