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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (hide 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 mocchiut 1.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 mocchiut 1.3 this->Set();
22 mocchiut 1.1 //
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 mocchiut 1.3 fSimu = simulation;
34     this->Set();
35     //
36     }
37    
38 mocchiut 1.4 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 mocchiut 1.5 if ( !cp ) cp = new CaloPreSampler(L2);
43 mocchiut 1.4 cp->SplitInto(0,22);
44     cp->SetForceFitMode(1000);
45     // cp->UseTracker(false);
46     // cp->ForceCaloFit();
47     // cp->SetDebug(true);
48     // cp->Process();
49 mocchiut 1.7 if ( clong ) clong->SetCaloLevel2Pointer(cp->GetLevel2Pointer());
50 mocchiut 1.4 }
51    
52 mocchiut 1.5
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 mocchiut 1.3 void CaloEnergy::Set(){
65 mocchiut 1.4 //
66     // set default values, NB default conversion factor for energy is just very approximated!
67     //
68 mocchiut 1.1 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 mocchiut 1.4 indep = false;
81     //
82 mocchiut 1.1 fLong = false;
83     fPl = 1;
84 mocchiut 1.2 fRad = -1;
85 mocchiut 1.4 cp = NULL;
86 mocchiut 1.5 clong = NULL;
87     x0max = -1.;
88 mocchiut 1.1 //
89     this->DefineGeometry();
90     fXosel =true;
91     fXesel = true;
92     fYosel = true;
93     fYesel = true;
94 mocchiut 1.2 fConv_rxe = 44.4;
95     fConv_rxo = 44.4;
96     fConv_ryo = 44.4;
97     fConv_rye = 44.4;
98 mocchiut 1.3 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 mocchiut 1.4 void CaloEnergy::SetMinimumContainment(Int_t plane){
113     this->SetMinimumContainment("XEXOYEYO",plane);
114     }
115    
116 mocchiut 1.3 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 mocchiut 1.1 }
125    
126 mocchiut 1.2 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 mocchiut 1.4 void CaloEnergy::SetConversionFactor(Float_t conv){
135     this->SetConversionFactor("XEXOYEYO",conv);
136     }
137    
138 mocchiut 1.2 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 mocchiut 1.5 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 mocchiut 1.4 Float_t CaloEnergy::GetMaxEnergy(TString section){
167     section.ToUpper();
168 mocchiut 1.5 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 mocchiut 1.4 return(-1);
178     }
179    
180 mocchiut 1.5 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 mocchiut 1.1 void CaloEnergy::DefineGeometry(){
189     //
190 mocchiut 1.4 // Use CaloStrip to determine once the position of border strips for each section
191     //
192     //
193 mocchiut 1.2 fM = 2. + 0.096; // real position from cbar
194     fM1 = 2. - 0.122 - 0.096; // due to calculation of xe1 etc.
195 mocchiut 1.1 if ( fM1 < 0. ) fM1 = 0.;
196     //
197     CaloStrip *cs = new CaloStrip(fSimu);
198 mocchiut 1.4 //
199     // view y plane 0 strip 0
200 mocchiut 1.1 cs->Set(1,0,0);
201     xe1= cs->GetY();
202 mocchiut 1.4 // z1= cs->GetZ();
203     // view y plane 0 strip 31
204 mocchiut 1.1 cs->Set(1,0,31);
205     xe2= cs->GetY();
206 mocchiut 1.4 // view y plane 0 strip 32
207 mocchiut 1.1 cs->Set(1,0,32);
208     xe3= cs->GetY();
209 mocchiut 1.4 // view y plane 0 strip 63
210 mocchiut 1.1 cs->Set(1,0,63);
211     xe4= cs->GetY();
212 mocchiut 1.4 // view y plane 0 strip 64
213 mocchiut 1.1 cs->Set(1,0,64);
214     xe5= cs->GetY();
215 mocchiut 1.4 // view y plane 0 strip 95
216 mocchiut 1.1 cs->Set(1,0,95);
217     xe6= cs->GetY();
218    
219 mocchiut 1.4 // view x plane 0 strip 0
220 mocchiut 1.1 cs->Set(0,0,0);
221     yo1= cs->GetX();
222 mocchiut 1.4 // z2= cs->GetZ();
223     // view x plane 0 strip 31
224 mocchiut 1.1 cs->Set(0,0,31);
225     yo2= cs->GetX();
226 mocchiut 1.4 // view x plane 0 strip 32
227 mocchiut 1.1 cs->Set(0,0,32);
228     yo3= cs->GetX();
229 mocchiut 1.4 // view x plane 0 strip 63
230 mocchiut 1.1 cs->Set(0,0,63);
231     yo4= cs->GetX();
232 mocchiut 1.4 // view x plane 0 strip 64
233 mocchiut 1.1 cs->Set(0,0,64);
234     yo5= cs->GetX();
235 mocchiut 1.4 // view x plane 0 strip 95
236 mocchiut 1.1 cs->Set(0,0,95);
237     yo6= cs->GetX();
238    
239    
240 mocchiut 1.4 // view y plane 1 strip 0
241 mocchiut 1.1 cs->Set(1,1,0);
242     xo1= cs->GetY();
243 mocchiut 1.4 // z3= cs->GetZ();
244     // view y plane 1 strip 31
245 mocchiut 1.1 cs->Set(1,1,31);
246     xo2= cs->GetY();
247 mocchiut 1.4 // view y plane 1 strip 32
248 mocchiut 1.1 cs->Set(1,1,32);
249     xo3= cs->GetY();
250 mocchiut 1.4 // view y plane 1 strip 63
251 mocchiut 1.1 cs->Set(1,1,63);
252     xo4= cs->GetY();
253 mocchiut 1.4 // view y plane 1 strip 64
254 mocchiut 1.1 cs->Set(1,1,64);
255     xo5= cs->GetY();
256 mocchiut 1.4 // view y plane 1 strip 95
257 mocchiut 1.1 cs->Set(1,1,95);
258     xo6= cs->GetY();
259    
260 mocchiut 1.4 // view x plane 1 strip 0
261 mocchiut 1.1 cs->Set(0,1,0);
262     ye1= cs->GetX();
263 mocchiut 1.4 // z4= cs->GetZ();
264     // view x plane 1 strip 31
265 mocchiut 1.1 cs->Set(0,1,31);
266     ye2= cs->GetX();
267 mocchiut 1.4 // view x plane 1 strip 32
268 mocchiut 1.1 cs->Set(0,1,32);
269     ye3= cs->GetX();
270 mocchiut 1.4 // view x plane 1 strip 63
271 mocchiut 1.1 cs->Set(0,1,63);
272     ye4= cs->GetX();
273 mocchiut 1.4 // view x plane 1 strip 64
274 mocchiut 1.1 cs->Set(0,1,64);
275     ye5= cs->GetX();
276 mocchiut 1.4 // view x plane 1 strip 95
277 mocchiut 1.1 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 mocchiut 1.4 trk_z[p][v]= cs->GetZ(); // Z coord for each plane
285 mocchiut 1.1 };
286     };
287     //
288     delete cs;
289     //
290     }
291    
292     void CaloEnergy::Clear(){
293     //
294 mocchiut 1.4 // clear variables
295     //
296 mocchiut 1.3 fPartsel = false;
297     fSel = false;
298     fXosel = false;
299     fXesel = false;
300     fYosel = false;
301     fYesel = false;
302     fCount = 0.;
303 mocchiut 1.1 fEnergy = 0.;
304 mocchiut 1.2 fEnergyxe = 0.;
305     fEnergyxo = 0.;
306     fEnergyye = 0.;
307     fEnergyyo = 0.;
308 mocchiut 1.3 fMax_plane = 0;
309     fMax_planexo = 0;
310     fMax_planexe = 0;
311     fMax_planeyo = 0;
312 mocchiut 1.5 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 mocchiut 1.1 en = 0.;
320     view = 0;
321     plane = 0;
322     strip = 0;
323     energyxe = 0.;
324     energyyo = 0.;
325     energyxo = 0.;
326     energyye = 0.;
327 mocchiut 1.3 fYoout = 0;
328     fYeout = 0;
329     fXoout = 0;
330     fXeout = 0;
331 mocchiut 1.4 fXEen_maxplane = 0.;
332     fXOen_maxplane = 0.;
333     fYEen_maxplane = 0.;
334     fYOen_maxplane = 0.;
335 mocchiut 1.1 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 mocchiut 1.2 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 mocchiut 1.1 printf(" fCount :.............. %f \n",fCount);
353 mocchiut 1.3 printf(" fSel :.............. %i \n",fSel);
354     printf(" fPartsel:.............. %i \n",fPartsel);
355 mocchiut 1.1 printf(" fXesel :.............. %i \n",fXesel);
356     printf(" fXosel :.............. %i \n",fXosel);
357     printf(" fYesel :.............. %i \n",fYesel);
358     printf(" fYosel :.............. %i \n",fYosel);
359 mocchiut 1.3 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 mocchiut 1.1 printf(" fSimu :.............. %i \n",fSimu);
368     printf(" fM :.............. %f \n",fM);
369     printf(" fM1 :.............. %f \n",fM1);
370 mocchiut 1.2 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 mocchiut 1.1 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 mocchiut 1.9 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 mocchiut 1.5 printf(" x0max :.............. %f \n",x0max);
386 mocchiut 1.1 printf(" debug :.............. %i \n",debug);
387    
388     printf("========================================================================\n");
389     //
390     }
391    
392     void CaloEnergy::Delete(){
393     Clear();
394 mocchiut 1.4 delete this;
395 mocchiut 1.1 }
396    
397    
398     Bool_t CaloEnergy::IsInsideAcceptance(TString section){
399     //
400 mocchiut 1.4 // check if the event is inside the acceptance of the given section(s)
401 mocchiut 1.1 //
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 mocchiut 1.4 // if we have already called this method for this event and no input changed then return fSel and exit
424     //
425 mocchiut 1.1 if ( !newentry ) return fSel;
426     //
427 mocchiut 1.4 // process the event
428     //
429 mocchiut 1.1 if ( debug ) printf(" ########## IsInsideAcceptance ######### \n");
430     //
431 mocchiut 1.4 // clear variables
432     //
433 mocchiut 1.3 this->Clear();
434     //
435 mocchiut 1.1 section.ToUpper();
436     //
437 mocchiut 1.4 // 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 mocchiut 1.1 printf(" ERROR: section must be XO or XE or YO or YE while it is %s \n",section.Data());
442 mocchiut 1.3 return false;
443     };
444     //
445 mocchiut 1.4 // 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 mocchiut 1.3 //
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 mocchiut 1.4 //
461     // sum energy plane by plane for each sections
462     //
463 mocchiut 1.3 for (Int_t i=0;i<11;i++){
464     for(strip=0; strip<96; strip++) {
465     if ( fRad < 0 ){
466 mocchiut 1.4 //
467     // run over all the strips of the plane
468     //
469 mocchiut 1.3 en_xep[i] += enstrip[1][2*i][strip];
470     en_yop[i] += enstrip[0][2*i][strip];
471 mocchiut 1.5 en_xop[i] += enstrip[1][(2*i)+1][strip];
472     en_yep[i] += enstrip[0][(2*i)+1][strip];
473 mocchiut 1.3 } else {
474 mocchiut 1.4 //
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 mocchiut 1.5 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 mocchiut 1.3 };
482     };
483     energyxe += en_xep[i];
484     energyyo += en_yop[i];
485     energyxo += en_xop[i];
486     energyye += en_yep[i];
487     };
488     //
489 mocchiut 1.4 // 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 mocchiut 1.3 };
506 mocchiut 1.4 };
507 mocchiut 1.3 };
508     //
509 mocchiut 1.4 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 mocchiut 1.3 };
518     };
519     //
520 mocchiut 1.4 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 mocchiut 1.3 };
528     };
529     //
530 mocchiut 1.4 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 mocchiut 1.5 // 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 mocchiut 1.7 xomax_en = 0.;
547     yemax_en = 0.;
548     xemax_en = 0.;
549     yomax_en = 0.;
550     //
551 mocchiut 1.5 if ( !(wpl%2) ){
552     // 0, 2, 4, ...
553     if ( isY ){
554 mocchiut 1.7 if ( section.Contains("YO") ) yomax_en = 1000.;
555     if ( section.Contains("XE") ) xemax_en = 500.;
556 mocchiut 1.5 fMax_planeyo=wpl/2;
557     fMax_planexe=wpl/2;
558 mocchiut 1.7 if ( section.Contains("XO") ) xomax_en = 10.;
559     if ( section.Contains("YE") ) yemax_en = 5.;
560 mocchiut 1.5 } else {
561 mocchiut 1.7 if ( section.Contains("YO") ) yomax_en = 500.;
562     if ( section.Contains("XE") ) xemax_en = 1000.;
563 mocchiut 1.5 fMax_planeyo=wpl/2;
564     fMax_planexe=wpl/2;
565 mocchiut 1.7 if ( section.Contains("XO") ) xomax_en = 5.;
566     if ( section.Contains("YE") ) yemax_en = 10.;
567 mocchiut 1.5 };
568     } else {
569     // 1, 3, 5, ...
570     if ( isY ){
571 mocchiut 1.7 if ( section.Contains("YE") ) yemax_en = 1000.;
572     if ( section.Contains("XO") ) xomax_en = 500.;
573 mocchiut 1.5 fMax_planeye=(wpl-1)/2;
574     fMax_planexo=(wpl-1)/2;
575 mocchiut 1.7 if ( section.Contains("XE") ) xemax_en = 10.;
576     if ( section.Contains("YO") ) yomax_en = 5.;
577 mocchiut 1.5 } else {
578 mocchiut 1.7 if ( section.Contains("YE") ) yemax_en = 500.;
579     if ( section.Contains("XO") ) xomax_en = 1000.;
580 mocchiut 1.5 fMax_planeye=(wpl-1)/2;
581     fMax_planexo=(wpl-1)/2;
582 mocchiut 1.7 if ( section.Contains("XE") ) xemax_en = 5.;
583     if ( section.Contains("YO") ) yomax_en = 10.;
584 mocchiut 1.5 };
585     };
586 mocchiut 1.7 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 mocchiut 1.5 };
588     //
589 mocchiut 1.4 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 mocchiut 1.3 };
639 mocchiut 1.4 //
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 mocchiut 1.1 };
655     //
656 mocchiut 1.4 // 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 mocchiut 1.1 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 mocchiut 1.4 tgx_cl2 = cl2->tanx[0];
664     tgy_cl2 = cl2->tany[0];
665 mocchiut 1.1 //
666     for (Int_t p=0; p<22; p++){
667 mocchiut 1.4 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 mocchiut 1.1 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 mocchiut 1.4 if ( debug ) printf(" acceptance fNumSec %i tgx %f tgy %f\n",fNumSec,tgx_cl2,tgy_cl2);
675 mocchiut 1.1 //
676     if ( section.Contains("XO") ){
677 mocchiut 1.4 //
678     // check event is inside XO acceptance
679     //
680 mocchiut 1.1 for (Int_t i=0; i<11; i++) {
681     if
682     (
683 mocchiut 1.5 (((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 mocchiut 1.1
692 mocchiut 1.5 (((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 mocchiut 1.1
701 mocchiut 1.5 (((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 mocchiut 1.1 ){
710     fXosel = true;
711 mocchiut 1.3 fXoout = i;
712 mocchiut 1.1 } else {
713     fXosel = false;
714     break;
715     };
716     };
717 mocchiut 1.4 //
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 mocchiut 1.3 fPartsel = true;
723     fXosel = true;
724     };
725 mocchiut 1.4 //
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 mocchiut 1.3 if ( fXosel ){
729 mocchiut 1.9 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 mocchiut 1.4 fEnergyxo = fXOen_maxplane/fConv_rxo;
734 mocchiut 1.3 };
735 mocchiut 1.1 };
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 mocchiut 1.4 (((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 mocchiut 1.1
750     (((track_coordx[2*i][1]>=(-3.804+fM))&&
751     (track_coordx[2*i][1]<=(4.004-fM)))&&
752 mocchiut 1.4 (((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 mocchiut 1.1
759     (((track_coordx[2*i][1]>=(4.246+fM))&&
760     (track_coordx[2*i][1]<=(12.054-fM)))&&
761 mocchiut 1.4 (((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 mocchiut 1.1 ){
768     fXesel = true;
769 mocchiut 1.3 fXeout = i;
770 mocchiut 1.1 } else {
771     fXesel = false;
772     break;
773     };
774     };
775 mocchiut 1.4 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 mocchiut 1.3 fPartsel = true;
778     fXesel = true;
779     };
780     if ( fXesel ){
781 mocchiut 1.9 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 mocchiut 1.4 fEnergyxe = fXEen_maxplane/fConv_rxe;
786 mocchiut 1.3 };
787 mocchiut 1.1 };
788     //
789     if ( section.Contains("YE") ){
790     for (Int_t i=0; i<11; i++) {
791     if
792     (
793 mocchiut 1.5 (((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 mocchiut 1.1
802 mocchiut 1.5 (((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 mocchiut 1.1
811 mocchiut 1.5 (((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 mocchiut 1.1 ){
820     fYesel = true;
821 mocchiut 1.3 fYeout = i;
822 mocchiut 1.1 } else {
823     fYesel = false;
824     break;
825     };
826     };
827 mocchiut 1.4 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 mocchiut 1.3 fPartsel = true;
830     fYesel = true;
831     };
832     if ( fYesel ){
833 mocchiut 1.4 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 mocchiut 1.3 };
836 mocchiut 1.1 };
837     //
838     if ( section.Contains("YO") ){
839     for (Int_t i=0; i<11; i++) {
840 mocchiut 1.4 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 mocchiut 1.1 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 mocchiut 1.4 (((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 mocchiut 1.1
853     (((track_coordy[2*i][0]>=(-3.904+fM))&&
854     (track_coordy[2*i][0]<=(+3.904-fM)))&&
855 mocchiut 1.4 (((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 mocchiut 1.1
862     (((track_coordy[2*i][0]>=(4.146+fM))&&
863     (track_coordy[2*i][0]<=(11.954-fM)))&&
864 mocchiut 1.4 (((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 mocchiut 1.1 ){
871     fYosel = true;
872 mocchiut 1.3 fYoout = i;
873 mocchiut 1.1 } else {
874     fYosel = false;
875     break;
876     };
877     };
878 mocchiut 1.4 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 mocchiut 1.3 fPartsel = true;
881     fYosel = true;
882     };
883     if ( fYosel ){
884 mocchiut 1.4 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 mocchiut 1.3 };
887 mocchiut 1.1 };
888     //
889 mocchiut 1.4 // Count the number of sections in which the event is contained
890     //
891 mocchiut 1.1 fCount = (Float_t)((Int_t)fXesel+(Int_t)fXosel+(Int_t)fYesel+(Int_t)fYosel);
892 mocchiut 1.4 //
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 mocchiut 1.5 if ( debug ) printf(" IsInside XE %i XO %i YE %i YO %i => SEL %i \n",fXesel,fXosel,fYesel,fYosel,fSel);
915 mocchiut 1.4 //
916     // finish exit
917 mocchiut 1.1 //
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 mocchiut 1.4 // process the event
931     //
932 mocchiut 1.1 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 mocchiut 1.4 // if we have already called this method for this event and no input changed then return fSel and exit
954     //
955 mocchiut 1.1 if ( !newentry ) return;
956     //
957 mocchiut 1.4 // process the event
958     //
959 mocchiut 1.1 if ( debug ) printf(" Processing event at OBT %u PKT %u time %u section %s\n",OBT,PKT,atime,section.Data());
960     //
961 mocchiut 1.4 // 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 mocchiut 1.1 //
963 mocchiut 1.2 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 mocchiut 1.1 if ( fLong ){
966 mocchiut 1.5 if ( debug ) printf(" ==================================================================> LONGITUDINAL FIT! \n");
967 mocchiut 1.4 //
968 mocchiut 1.5 // 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 mocchiut 1.8 if ( clong->GetLowerLimit() != 0. || clong->GetUpperLimit() != 0. ){
995     fXOen_maxplane = clong->Get_defE0();
996     } else {
997     fXOen_maxplane = clong->Get_E0();
998     };
999 mocchiut 1.5 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 mocchiut 1.4 //
1015 mocchiut 1.1 } else {
1016     //
1017 mocchiut 1.4 // use the energy measurement
1018     //
1019 mocchiut 1.1 if ( this->IsInsideAcceptance(section) ){
1020     //
1021 mocchiut 1.4 // the event is good
1022     //
1023 mocchiut 1.1 if ( debug ) printf(" XE %i XO %i YE %i YO %i \n",fXesel,fXosel,fYesel,fYosel);
1024     //
1025     } else {
1026 mocchiut 1.4 //
1027     // if the event is not in the acceptance, return a negative energy.
1028     //
1029 mocchiut 1.1 if ( debug ) printf(" Outside acceptance \n");
1030 mocchiut 1.4 fEnergy *= -1.;
1031     //
1032 mocchiut 1.1 };
1033     };
1034     //
1035     }

  ViewVC Help
Powered by ViewVC 1.1.23