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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide annotations) (download)
Thu May 31 10:10:52 2007 UTC (17 years, 6 months ago) by mocchiut
Branch: MAIN
Changes since 1.6: +10 -1 lines
Bug fixed

1 mocchiut 1.1 #include <CaloNuclei.h>
2    
3     //--------------------------------------
4     /**
5     * Default constructor
6     */
7     CaloNuclei::CaloNuclei(){
8     Clear();
9     };
10    
11     CaloNuclei::CaloNuclei(PamLevel2 *l2p){
12     //
13     Clear();
14     //
15     L2 = l2p;
16     //
17     if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
18     //
19     OBT = 0;
20     PKT = 0;
21     atime = 0;
22     N = 5;
23 mocchiut 1.2 R = 3;
24 mocchiut 1.1 //
25 mocchiut 1.4 debug = false;
26 mocchiut 1.5 usetrack = true;
27 mocchiut 1.4 //
28 mocchiut 1.1 };
29    
30     void CaloNuclei::Clear(){
31     //
32 mocchiut 1.3 tr = 0;
33 mocchiut 1.5 sntr = 0;
34 mocchiut 1.1 interplane = 0;
35     preq = 0.;
36     postq = 0.;
37     dedx1 = 0.;
38     dedx3 = 0.;
39     qpremean = 0.;
40     qpremeanN = 0.;
41     //
42     multhit = false;
43     gap = false;
44     //
45     };
46    
47     void CaloNuclei::Print(){
48     //
49 mocchiut 1.2 Process();
50     //
51 mocchiut 1.3 printf("========================================================================\n");
52 mocchiut 1.5 printf(" OBT: %u PKT: %u ATIME: %u Track %i Use track %i \n",OBT,PKT,atime,tr,usetrack);
53     printf(" interplane [number of available dE/dx before interaction]:.. %i\n",interplane);
54     printf(" ethr [threshold used to determine interplane]:.............. %f \n",ethr);
55     printf(" dedx1 [dE/dx from the first calorimeter plane]:............. %f \n",dedx1);
56     printf(" stdedx1 [dE/dx from the first calorimeter plane standalone]: %f \n",stdedx1);
57     printf(" dedx3 [dE/dx (average) if the first 3 Si planes]:........... %f \n",dedx3);
58     printf(" multhit [true if interplane determined by multiple hits]:... %i \n",multhit);
59     printf(" gap [true if interplane determined by a gap]:............... %i \n",gap);
60     printf(" preq [total energy in MIP before the interaction plane]:.... %f \n",preq);
61     printf(" postq [total energy in MIP after the interaction plane]:.... %f \n",postq);
62     printf(" qpremean [truncated mean using 3 planes and 3 strips]:...... %f \n",qpremean);
63     printf(" N [no of used plane]:....................................... %i \n",N);
64     printf(" R [no strip used per plane ]:............................... %i \n",R);
65     printf(" qpremeanN [truncated mean using N planes and R strips]:..... %f \n",qpremeanN);
66 mocchiut 1.3 printf("========================================================================\n");
67 mocchiut 1.1 //
68     };
69    
70     void CaloNuclei::Delete(){
71     Clear();
72     //delete this;
73     };
74    
75    
76     void CaloNuclei::Process(){
77 mocchiut 1.3 Process(0);
78     };
79    
80     void CaloNuclei::Process(Int_t ntr){
81     //
82 mocchiut 1.1 if ( !L2 ){
83     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
84     printf(" ERROR: CaloNuclei variables not filled \n");
85     return;
86     };
87     //
88     Bool_t newentry = false;
89     //
90     if ( L2->IsORB() ){
91 mocchiut 1.5 if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime || ntr != sntr ){
92 mocchiut 1.1 newentry = true;
93     OBT = L2->GetOrbitalInfo()->OBT;
94     PKT = L2->GetOrbitalInfo()->pkt_num;
95     atime = L2->GetOrbitalInfo()->absTime;
96 mocchiut 1.5 sntr = ntr;
97 mocchiut 1.1 };
98     } else {
99     newentry = true;
100     };
101     //
102     if ( !newentry ) return;
103     //
104 mocchiut 1.3 tr = ntr;
105     //
106 mocchiut 1.4 if ( debug ) printf(" Processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
107 mocchiut 1.1 //
108     Clear();
109 mocchiut 1.6 if ( debug ) printf(" Always calculate stdedx1 \n");
110 mocchiut 1.1 //
111 mocchiut 1.5 // Always calculate stdedx1
112 mocchiut 1.1 //
113     Int_t view = 0;
114     Int_t plane = 0;
115     Int_t strip = 0;
116 mocchiut 1.5 Int_t indx = 0;
117     Float_t vfpl[96];
118     Int_t stfpl[96];
119     memset(vfpl, 0, 96*sizeof(Float_t));
120     memset(stfpl, 0, 96*sizeof(Int_t));
121 mocchiut 1.1 Float_t mip = 0.;
122 mocchiut 1.5 for ( Int_t i=0; i<L2->GetCaloLevel1()->istrip; i++ ){
123     //
124     mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
125     //
126     // put in vfpl vector the energy release on the first plane
127     //
128     if ( strip != -1 && view == 1 && plane == 0 ) {
129     stfpl[indx] = strip;
130     vfpl[indx] = mip;
131     indx++;
132     };
133     //
134     };
135     //
136 mocchiut 1.6 if ( debug ) printf(" find energy released along the strip of maximum on the first plane and on the two neighbour strips \n");
137     //
138 mocchiut 1.5 // find energy released along the strip of maximum on the first plane and on the two neighbour strips
139     //
140     if ( indx > 0 ){
141     Int_t mindx = (Int_t)TMath::LocMax(indx,stfpl);
142     for (Int_t ii=0; ii<indx; ii++){
143     if ( stfpl[ii] == stfpl[mindx] ) stdedx1 += vfpl[ii];
144     if ( (mindx-1)>=0 && stfpl[ii] == stfpl[mindx-1] ) stdedx1 += vfpl[ii];
145     if ( (mindx+1)<96 && stfpl[ii] == stfpl[mindx+1] ) stdedx1 += vfpl[ii];
146     };
147     } else {
148     stdedx1 = 0.;
149     };
150     //
151 mocchiut 1.6 if ( debug ) printf(" if ( !usetrack ) return: usetrack %i ntr %i \n",usetrack,ntr);
152 mocchiut 1.5 //
153     //
154     if ( !usetrack ) return;
155     //
156     PamTrack *ptrack = 0;
157     CaloTrkVar *track = 0;
158     if ( ntr >= 0 ){
159     ptrack = L2->GetTrack(ntr);
160 mocchiut 1.6 if ( ptrack ) track = ptrack->GetCaloTrack();
161 mocchiut 1.5 } else {
162     track = L2->GetCaloStoredTrack(ntr);
163     };
164     //
165     if ( !track && ntr >= 0 ){
166     printf(" ERROR: cannot find any track!\n");
167     printf(" ERROR: CaloNuclei variables not completely filled \n");
168     return;
169     };
170     //
171 mocchiut 1.1 // Float_t defethr = 6. * 0.90;
172     Float_t defethr = 6.25; // = (sqrt(9) - 0.5) ** 2.;
173     //
174     // Calculate dedx1 and dedx3
175     //
176     for ( Int_t i=0; i<L2->GetCaloLevel1()->istrip; i++ ){
177     //
178     mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
179     //
180 mocchiut 1.5 if ( ntr >= 0 ){
181     //
182     if ( strip != -1 &&
183     view == 1 &&
184     plane == 0 &&
185     ( strip == (track->tibar[0][1]-1) || strip == (track->tibar[0][1]-2) || strip == (track->tibar[0][1]) )
186     && true ){
187     dedx1 += mip;
188     };
189     if ( strip != -1 &&
190     (( view == 1 && ( plane == 0 || plane == 1 ) ) ||
191     ( view == 0 && plane == 0 )) &&
192     (( view == 0 && ( strip == track->tibar[0][0] || strip == (track->tibar[0][0]-1) || strip == (track->tibar[0][0]-2) )) ||
193     ( view == 1 && ( strip == track->tibar[0][1] || strip == (track->tibar[0][1]-1) || strip == (track->tibar[0][1]-2) )) ||
194     ( view == 1 && ( strip == track->tibar[1][1] || strip == (track->tibar[1][1]-1) || strip == (track->tibar[1][1]-2) ))) &&
195     true ){
196     dedx3 += mip;
197     };
198     } else {
199     //
200     if ( strip != -1 &&
201     view == 1 &&
202     plane == 0 &&
203     ( strip == (L2->GetCaloLevel2()->cibar[0][1]-1) || strip == (L2->GetCaloLevel2()->cibar[0][1]-2) || strip == (L2->GetCaloLevel2()->cibar[0][1]) )
204     && true ){
205     dedx1 += mip;
206     };
207     if ( strip != -1 &&
208     (( view == 1 && ( plane == 0 || plane == 1 ) ) ||
209     ( view == 0 && plane == 0 )) &&
210     (( view == 0 && ( strip == L2->GetCaloLevel2()->cibar[0][0] || strip == (L2->GetCaloLevel2()->cibar[0][0]-1) || strip == (L2->GetCaloLevel2()->cibar[0][0]-2) )) ||
211     ( view == 1 && ( strip == L2->GetCaloLevel2()->cibar[0][1] || strip == (L2->GetCaloLevel2()->cibar[0][1]-1) || strip == (L2->GetCaloLevel2()->cibar[0][1]-2) )) ||
212     ( view == 1 && ( strip == L2->GetCaloLevel2()->cibar[1][1] || strip == (L2->GetCaloLevel2()->cibar[1][1]-1) || strip == (L2->GetCaloLevel2()->cibar[1][1]-2) ))) &&
213     true ){
214     dedx3 += mip;
215     };
216 mocchiut 1.1 };
217     //
218     };
219     //
220     dedx3 /= 3.;
221     // Float_t mesethr = dedx1 * 0.90;
222     Float_t mesethr = 0.;
223     if ( dedx1 > 0. ) mesethr = (sqrt(dedx1) - 0.50)*(sqrt(dedx1) - 0.50);
224     Bool_t aldone = false;
225     //
226     retry:
227     //
228 mocchiut 1.4 if ( debug ) printf("retry\n");
229 mocchiut 1.1 //
230     interplane = 0;
231     //
232     ethr = TMath::Max(defethr,mesethr);
233     //
234     // Find the interaction plane "interplane"
235     //
236     Int_t gapth = 3;
237     Int_t nhit[2] = {0,0};
238     Int_t splane[2] = {-1,-1};
239     Int_t sview[2] = {-1,-1};
240     Int_t interpl[2] = {-1,-1};
241     Int_t interv[2] = {-1,-1};
242     Bool_t wmulthit[2] = {false,false};
243     Bool_t wgap[2] = {false,false};
244     Int_t ii = 0;
245     while ( ii<L2->GetCaloLevel1()->istrip ){
246     //
247     mip = L2->GetCaloLevel1()->DecodeEstrip(ii,view,plane,strip);
248     //
249 mocchiut 1.5 if ( ntr >= 0 ){
250     if ( strip != -1 && mip > ethr && !wmulthit[view] && !wgap[view] &&
251     ( strip == (track->tibar[plane][view]-1) || strip == (track->tibar[plane][view]-2) || strip == (track->tibar[plane][view]) )
252     && true ){
253     if ( debug ) printf(" inside loop: ii %i mip %f view %i plane %i strip %i tibar %i nhit %i splane %i sview %i \n",ii,mip,view,plane,strip,track->tibar[plane][view]-1,nhit[view],splane[view],sview[view]);
254     interpl[view] = plane;
255     interv[view] = view;
256     if ( splane[view] != plane || sview[view] != view ){
257     if ( nhit[view] > 1 ){
258     wmulthit[view] = true;
259     // if ( splane[view] == -1 ) splane[view] = 0; //
260     // if ( sview[view] == -1 ) sview[view] = view; //
261     interpl[view] = splane[view];
262     interv[view] = sview[view];
263     };
264     if ( plane > splane[view]+gapth ){
265     wgap[view] = true;
266     // if ( splane[view] == -1 ) splane[view] = 0;//
267     // if ( sview[view] == -1 ) sview[view] = view; //
268     interpl[view] = splane[view];
269     interv[view] = sview[view];
270     };
271     splane[view] = plane;
272     sview[view] = view;
273     nhit[view] = 1;
274     } else {
275     nhit[view]++;
276     };
277     };
278     } else {
279     if ( strip != -1 && mip > ethr && !wmulthit[view] && !wgap[view] &&
280     ( strip == (L2->GetCaloLevel2()->cibar[plane][view]-1) || strip == (L2->GetCaloLevel2()->cibar[plane][view]-2) || strip == (L2->GetCaloLevel2()->cibar[plane][view]) )
281     && true ){
282     if ( debug ) printf(" inside loop: ii %i mip %f view %i plane %i strip %i cibar %i nhit %i splane %i sview %i \n",ii,mip,view,plane,strip,L2->GetCaloLevel2()->cibar[plane][view]-1,nhit[view],splane[view],sview[view]);
283     interpl[view] = plane;
284     interv[view] = view;
285     if ( splane[view] != plane || sview[view] != view ){
286     if ( nhit[view] > 1 ){
287     wmulthit[view] = true;
288     // if ( splane[view] == -1 ) splane[view] = 0; //
289     // if ( sview[view] == -1 ) sview[view] = view; //
290     interpl[view] = splane[view];
291     interv[view] = sview[view];
292 mocchiut 1.1 };
293 mocchiut 1.5 if ( plane > splane[view]+gapth ){
294     wgap[view] = true;
295     // if ( splane[view] == -1 ) splane[view] = 0;//
296     // if ( sview[view] == -1 ) sview[view] = view; //
297     interpl[view] = splane[view];
298     interv[view] = sview[view];
299     };
300     splane[view] = plane;
301     sview[view] = view;
302     nhit[view] = 1;
303     } else {
304     nhit[view]++;
305 mocchiut 1.1 };
306     };
307     };
308     //
309     ii++;
310     //
311     };
312     //
313 mocchiut 1.4 if (debug ) printf("conversion interpl %i interv %i multhit %i interplane %i \n",interpl[0],interv[0],multhit,interplane);
314 mocchiut 1.1 Int_t winterplane[2] = {-1,-1};
315     //
316     for ( Int_t view = 0; view < 2; view++){
317     //
318     if ( nhit[view] > 1 && !wmulthit[view] && !wgap[view] ){
319     wmulthit[view] = true;
320     interpl[view] = splane[view];
321     interv[view] = sview[view];
322     };
323     //
324     if ( wmulthit[view] ) multhit = true;
325     if ( wgap[view] ) gap = true;
326     //
327     // convert view and plane number of interaction plane into number of available dE/dx measurements before the interaction plane
328     //
329     if ( interpl[view] >= 0 ) {
330     if ( interv[view] == 0 ){
331     winterplane[view] = (1 + interpl[view]) * 2;
332     } else {
333     winterplane[view] = (1 + interpl[view]) + (1 + interpl[view] - 1);
334     };
335     if ( wmulthit[view] ) winterplane[view]--;
336     };
337     };
338     if ( winterplane[0] > 0 && winterplane[1] > 0 ){
339     if ( multhit ){
340     interplane = TMath::Min(winterplane[0],winterplane[1]);
341     } else {
342     interplane = TMath::Max(winterplane[0],winterplane[1]);
343     };
344     } else {
345     if ( !winterplane[0] || !winterplane[1] ){
346     interplane = 0;
347     } else {
348     interplane = TMath::Max(winterplane[0],winterplane[1]);
349     };
350     };
351     //
352 mocchiut 1.4 if ( debug ) printf("2conversion interpl %i interv %i multhit %i interplane %i \n",interpl[1],interv[1],multhit,interplane);
353     if ( debug ) printf("3conversion winterpl0 %i winterpl1 %i \n",winterplane[0],winterplane[1]);
354 mocchiut 1.1 //
355     Int_t ipl = 0;
356     if ( interplane > 0 ){
357     //
358     // Calculate preq, postq, qpremean
359     //
360     ii = 0;
361     Int_t ind = -1;
362     Int_t qsplane = -1;
363     Int_t qsview = -1;
364 mocchiut 1.2 Int_t ind2 = -1;
365     Int_t qsplane2 = -1;
366     Int_t qsview2 = -1;
367 mocchiut 1.1 Float_t qme[200];
368     memset(qme,0,200*sizeof(Float_t));
369 mocchiut 1.2 Float_t qme2[2112];
370     memset(qme2,0,2112*sizeof(Float_t));
371 mocchiut 1.1 //
372     while ( ii<L2->GetCaloLevel1()->istrip ){
373     //
374     mip = L2->GetCaloLevel1()->DecodeEstrip(ii,view,plane,strip);
375     //
376     if ( strip != -1 ){
377     if ( view == 0 ){
378     ipl = (1 + plane) * 2;
379     } else {
380     ipl = (1 + plane) + (1 + plane - 1 );
381     };
382     if ( ipl > interplane ){
383     postq += mip;
384     } else {
385     preq += mip;
386 mocchiut 1.5 if ( ntr >= 0 ){
387     if ( strip == (track->tibar[plane][view]-1) || strip == (track->tibar[plane][view]-2) || strip == (track->tibar[plane][view]) ){
388     if ( qsplane != plane || qsview != view ){
389     qsplane = plane;
390     qsview = view;
391     ind++;
392     if ( debug && ind > 199 ) printf(" AAAGH!! \n");
393     qme[ind] = 0.;
394     };
395     qme[ind] += mip;
396 mocchiut 1.1 };
397 mocchiut 1.5 for ( Int_t ns = 0; ns < R ; ns++){
398     Int_t ms = track->tibar[plane][view] - 1 - ns + (R - 1)/2;
399     if ( strip == ms ){
400     if ( qsplane2 != plane || qsview2 != view ){
401     qsplane2 = plane;
402     qsview2 = view;
403     ind2++;
404     if ( debug && ind2 > 2112 ) printf(" AAAGH!! \n");
405     qme2[ind2] = 0.;
406     };
407     qme2[ind2] += mip;
408     };
409     };
410     } else {
411     if ( strip == (L2->GetCaloLevel2()->cibar[plane][view]-1) || strip == (L2->GetCaloLevel2()->cibar[plane][view]-2) || strip == (L2->GetCaloLevel2()->cibar[plane][view]) ){
412     if ( qsplane != plane || qsview != view ){
413     qsplane = plane;
414     qsview = view;
415     ind++;
416     if ( debug && ind > 199 ) printf(" AAAGH!! \n");
417     qme[ind] = 0.;
418 mocchiut 1.2 };
419 mocchiut 1.5 qme[ind] += mip;
420 mocchiut 1.2 };
421 mocchiut 1.5 for ( Int_t ns = 0; ns < R ; ns++){
422     Int_t ms = L2->GetCaloLevel2()->cibar[plane][view] - 1 - ns + (R - 1)/2;
423     if ( strip == ms ){
424     if ( qsplane2 != plane || qsview2 != view ){
425     qsplane2 = plane;
426     qsview2 = view;
427     ind2++;
428     if ( debug && ind2 > 2112 ) printf(" AAAGH!! \n");
429     qme2[ind2] = 0.;
430     };
431     qme2[ind2] += mip;
432     };
433     };
434     };
435 mocchiut 1.1 };
436     //
437     };
438     //
439     ii++;
440     //
441     };
442     //
443     // here we must calculate qpremean, order vector qme, select 3 lowest measurements and caculate the mean...
444     //
445 mocchiut 1.4 if ( debug ){
446     for (Int_t l=0; l < interplane; l++){
447     printf(" qme[%i] = %f \n",l,qme[l]);
448     };
449     };
450     //
451 mocchiut 1.1 Long64_t work[200];
452     ind = 0;
453     Int_t l = 0;
454 mocchiut 1.5 Int_t RN = 0;
455 mocchiut 1.1 Float_t qm = 0.;
456 mocchiut 1.2 Float_t qm2 = 0.;
457     //
458     Float_t qmt = ethr*0.8; // *0.9
459     //
460 mocchiut 1.1 Int_t uplim = TMath::Max(3,N);
461 mocchiut 1.2 //
462 mocchiut 1.1 while ( l < uplim && ind < interplane ){
463     qm = TMath::KOrdStat(interplane,qme,ind,work);
464 mocchiut 1.2 if ( qm >= qmt ){
465 mocchiut 1.5 if ( l < 3 ){
466     qpremean += qm;
467     RN++;
468     };
469 mocchiut 1.1 l++;
470 mocchiut 1.4 if ( debug ) printf(" value no %i qm %f qmt %f \n",l,qm,qmt);
471 mocchiut 1.2 };
472     ind++;
473     };
474     //
475 mocchiut 1.5 qpremean /= (Float_t)RN;
476 mocchiut 1.4 //
477 mocchiut 1.2 ind = 0;
478     l = 0;
479 mocchiut 1.5 RN = 0;
480 mocchiut 1.2 while ( l < uplim && ind < interplane ){
481     qm2 = TMath::KOrdStat(interplane,qme2,ind,work);
482     if ( qm2 >= qmt ){
483 mocchiut 1.5 if ( l < N ){
484     qpremeanN += qm2;
485     RN++;
486     };
487 mocchiut 1.2 l++;
488 mocchiut 1.5 if ( debug ) printf(" qm2 value no %i qm %f qmt %f RN %i \n",l,qm2,qmt,RN);
489 mocchiut 1.1 };
490     ind++;
491     };
492     //
493 mocchiut 1.5 qpremeanN /= (Float_t)RN;
494 mocchiut 1.1 //
495 mocchiut 1.4 if ( debug ) printf(" charge is %f \n",sqrt(qpremean));
496 mocchiut 1.1 //
497     if ( mesethr != ethr && interplane >= 3 && !aldone ){
498     Float_t mesethr2 = (sqrt(qpremean) - 0.50)*(sqrt(qpremean) - 0.50);
499     if ( mesethr2 < mesethr*0.90 ){
500     mesethr = (sqrt(dedx1) - 0.25)*(sqrt(dedx1) - 0.25);
501     } else {
502     mesethr = mesethr2;
503     };
504     aldone = true;
505 mocchiut 1.7 if ( mesethr > defethr ){
506     interplane = 0;
507     preq = 0.;
508     postq = 0.;
509     qpremean = 0.;
510     qpremeanN = 0.;
511     multhit = false;
512     gap = false;
513     goto retry;
514     };
515 mocchiut 1.1 };
516     };
517     //
518 mocchiut 1.5 if ( debug ) this->Print();
519 mocchiut 1.4 if ( debug ) printf(" esci \n");
520 mocchiut 1.1 //
521     };

  ViewVC Help
Powered by ViewVC 1.1.23