/[PAMELA software]/PamCut/CaloAxis2.h
ViewVC logotype

Annotation of /PamCut/CaloAxis2.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.4 - (hide annotations) (download)
Fri Feb 19 16:27:25 2010 UTC (14 years, 9 months ago) by pam-fi
Branch: MAIN
Changes since 1.3: +1 -1 lines
File MIME type: text/plain
Bug in overloaded version of FitShower fixed.

1 pam-fi 1.1 #ifndef CALOAXIS2_H_
2     #define CALOAXIS2_H_
3    
4     #if !defined(__CINT__) || defined(__MAKECINT__)
5    
6     #include <TString.h>
7     #include <TH1F.h>
8     #include <TH2F.h>
9     #include <TMath.h>
10     #include <TLine.h>
11     #include <TPolyMarker.h>
12     #include <TSelector.h>
13     #include <TFile.h>
14    
15     #include <stdlib.h>
16     #include <iostream>
17     using namespace std;
18    
19     #include <PamLevel2.h>
20     //#include <CaloEvent.h>
21    
22     #endif // !defined(__CINT__) || defined(__MAKECINT__)
23     //===============================================================================
24     //
25     //
26     //
27     //
28     //===============================================================================
29 pam-fi 1.2 class CaloEvent {
30 pam-fi 1.1
31     public:
32 pam-fi 1.2 // calo event
33     // ------------------------------
34     // hit strips
35     // ------------------------------
36     vector<int> ids; //strip 0-95
37     vector<int> idp; //plane 0-21
38     vector<float> q; // signal
39     vector<float> zcoord;
40     vector<float> xycoord;
41    
42     // ------------------------------
43     // methods
44     // ------------------------------
45     void Add(int iis, int iip, float fq, float fz, float fxy) {
46     ids.push_back(iis);
47     idp.push_back(iip);
48     q.push_back(fq);
49     zcoord.push_back(fz);
50     xycoord.push_back(fxy);
51     }
52     ;
53    
54     int GetN() {
55     return (int) (q.size());
56     }
57     ;
58    
59     void Reset() {
60     ids.clear();
61     idp.clear();
62     q.clear();
63     zcoord.clear();
64     xycoord.clear();
65     }
66     ;
67    
68     void Delete() {
69     Reset();
70     }
71     ;
72    
73     ~CaloEvent() {
74     Delete();
75     }
76     ;
77    
78     CaloEvent() {
79     }
80     ;
81    
82     CaloEvent(CaloLevel1* calo, int view, Bool_t usemechanicalalignement) {
83     Set(calo, view, usemechanicalalignement);
84     }
85     ;
86    
87     CaloEvent(CaloLevel1* calo, int view) {
88     Set(calo, view);
89     }
90     ;
91    
92     void Set(CaloLevel1* calo, int view, Bool_t usemechanicalalignement) {
93    
94     Reset();
95     // cout << " CaloEvent::Set()"<<endl;
96     CaloStrip cstrip;
97     cstrip = CaloStrip(calo, usemechanicalalignement);
98    
99     for (int ih = 0; ih < calo->istrip; ih++) {
100     int iv = -1;
101     int ip = -1;
102     int is = -1;
103     calo->DecodeEstrip(ih, iv, ip, is);
104     if (iv == view) {
105     cstrip.Set(view, ip, is);
106     float fxy = 0.;
107     if (!view)
108     fxy = cstrip.GetX();
109     else
110     fxy = cstrip.GetY();
111     float fz = cstrip.GetZ();
112     float fq = cstrip.GetE();
113     if (fq > 0)
114     Add(is, ip, fq, fz, fxy);
115     }
116     }
117    
118     }
119     ;
120     void Set(CaloLevel1* calo, int view) {
121     Set(calo, view, 0);
122     }
123     ;
124 pam-fi 1.1
125     };
126     //===============================================================================
127     //
128     //
129     //
130     //
131     //===============================================================================
132     class CaloAxis {
133    
134     public:
135    
136 pam-fi 1.2 CaloEvent *cevent;
137 pam-fi 1.1
138 pam-fi 1.2 // ------------------------------
139     // selected points along the axis
140     // ------------------------------
141     // fitted points
142     vector<float> x;// independent coordinates (z)
143     vector<float> y;// dependente coordinate (x/y)
144     vector<float> w;// fit weight
145     vector<float> q;// signal
146    
147     // ------------------------------
148     // axis parameters
149     // ------------------------------
150     Float_t par[2];
151     Float_t covpar[2][2];
152    
153     // ------------------------------
154     // general variables
155     // ------------------------------
156     float cog[22];// baricenter
157     float qpl[22]; // charge in each plane
158    
159     // ------------------------------
160     // objects to draw the axis
161     // ------------------------------
162     TPolyMarker *sel;
163     TLine *axis;
164    
165     // ------------------------------
166     // methods
167     // ------------------------------
168     void Init() {
169     for (Int_t i = 0; i < 2; i++) {
170     par[i] = 0;
171     for (Int_t j = 0; j < 2; j++)
172     covpar[i][j] = 0;
173     };
174     sel = 0;
175     axis = 0;
176     for (Int_t i = 0; i < 22; i++) {
177     cog[i] = 0;
178     qpl[i] = 0;
179     }
180     // if(cevent)cevent->Reset();
181     }
182    
183     void Set(CaloLevel1* calo, Int_t view) {
184     cevent->Set(calo, view, 0);
185     }
186     ;
187     void Set(CaloLevel1* calo, Int_t view, Bool_t usemechanicalalignement) {
188     cevent->Set(calo, view, usemechanicalalignement);
189     }
190     ;
191    
192     CaloAxis() {
193     cevent = new CaloEvent();
194     Init();
195     }
196     ;
197    
198     CaloAxis(CaloLevel1* calo, Int_t view) {
199     cevent = new CaloEvent();
200     Init();
201     Set(calo, view);
202     }
203     ;
204     CaloAxis(CaloLevel1* calo, Int_t view, Bool_t usemechanicalalignement) {
205     cevent = new CaloEvent();
206     Init();
207     Set(calo, view, usemechanicalalignement);
208     }
209     ;
210    
211     void Reset() {
212     // cout << " CaloAxis::Reset()"<<endl;
213     x.clear();
214     y.clear();
215     w.clear();
216     q.clear();
217     // cout << sel << endl;
218     if (sel)
219     sel->Delete();
220     // cout << axis << endl;
221     if (axis)
222     axis->Delete();
223     // if(cevent)cevent->Reset();
224     Init();
225     }
226    
227     void Delete() {
228     Reset();
229     delete cevent;
230     }
231     ;
232    
233     ~CaloAxis() {
234     Delete();
235     }
236     ;
237    
238     void Add(float xin, float yin) {
239     x.push_back(xin);
240     y.push_back(yin);
241     w.push_back(1.);
242     q.push_back(0.);
243     /* Int_t nin = x.size(); */
244     /* if(nin>2)Fit(); */
245     }
246     ;
247     void Add(float xin, float yin, float qin) {
248     x.push_back(xin);
249     y.push_back(yin);
250     q.push_back(qin);
251     w.push_back(1.);
252     /* Int_t nin = x.size(); */
253     /* if(nin>2)Fit(); */
254     }
255     ;
256     void Add(float xin, float yin, float qin, float win) {
257     x.push_back(xin);
258     y.push_back(yin);
259     w.push_back(win);
260     q.push_back(qin);
261     /* Int_t nin = x.size(); */
262     /* if(nin>2)Fit(); */
263     }
264     ;
265    
266     int Fit() {
267    
268     // cout << " CaloAxis::Fit()"<<endl;
269     Float_t SSS = 0;
270     Float_t SSX = 0;
271     Float_t SXX = 0;
272    
273     Float_t SSY = 0;
274     Float_t SXY = 0;
275    
276     Int_t np = 0;
277     for (Int_t i = 0; i < (int) (x.size()); i++) {
278     SSS += w[i] * w[i];
279     SSX += x[i] * w[i] * w[i];
280     SXX += x[i] * x[i] * w[i] * w[i];
281     SSY += y[i] * w[i] * w[i];
282     SXY += x[i] * y[i] * w[i] * w[i];
283     if (w[i])
284     np++;
285     }
286     Float_t det = SSS * SXX - SSX * SSX;
287     if (det == 0)
288     return 0;
289     if (np < 3)
290     return 0;
291     // cout << np << " points fitted -- ok "<<endl;
292     par[0] = (SSY * SXX - SXY * SSX) / det;
293     par[1] = (SXY * SSS - SSY * SSX) / det;
294     return 1;
295     }
296     ;
297    
298     void Print() {
299     // useful for debug for(Int_t i=0; i<(int)(x.size()); i++)if(w[i])cout << x[i] << " - "<<y[i]<<endl;
300     }
301    
302     float GetPar(Int_t i) {
303     return par[i];
304     }
305     ;
306    
307     int GetN() {
308     return (int) (x.size());
309     }
310     ;
311    
312     float* GetX() {
313     float *xout = new float[(int) (x.size())];
314     for (Int_t i = 0; i < (int) (x.size()); i++)
315     xout[i] = x[i];
316     return xout;
317     }
318    
319     float* GetY() {
320     float *yout = new float[(int) (y.size())];
321     for (Int_t i = 0; i < (int) (y.size()); i++)
322     yout[i] = y[i];
323     return yout;
324     }
325    
326     float* GetQ() {
327     float *qout = new float[(int) (q.size())];
328     for (int i = 0; i < (int) (q.size()); i++)
329     qout[i] = q[i];
330     return qout;
331     }
332    
333     float GetChi2() {
334     float chi2 = 0;
335     int nchi = 0;
336     for (Int_t i = 0; i < (int) (y.size()); i++) {
337     chi2 += w[i] * w[i] * (y[i] - par[0] - par[1] * x[i]) * (y[i] - par[0] - par[1] * x[i]);
338     nchi += (int) w[i];
339     };
340    
341     if (nchi < 3)
342     return -999; // original
343 pam-fi 1.3 // if(nchi<3 || chi2==0)return -999; // modified by Sergio
344 pam-fi 1.2
345     chi2 = chi2 / (nchi - 2);
346     return chi2;
347     }
348    
349     float GetQaxis() {
350     float qaxis = 0;
351     for (Int_t i = 0; i < (int) (q.size()); i++)
352     qaxis += q[i];
353     // for(Int_t i=0; i<(int)(q.size()); i++) cout<<q[i]<<endl;
354     return qaxis;
355     }
356    
357     float GetQaxis(float toll) {
358     float qaxis = 0;
359     for (int ih = 0; ih < cevent->GetN(); ih++) {
360     float x = cevent->xycoord[ih];
361     float z = cevent->zcoord[ih];
362     float q = cevent->q[ih];
363     //int ip = cevent->idp[ih];
364     float d = fabs(x - par[0] - par[1] * z) / sqrt(par[1] * par[1] + 1);
365     if (d < toll)
366     qaxis += q;
367     }
368     return qaxis;
369     }
370    
371     float GetCOG(Int_t ip) {
372     if (ip >= 0 && ip < 22)
373     return cog[ip];
374     else
375     return 0;
376     }
377    
378     float GetQ(Int_t ip) {
379     if (ip >= 0 && ip < 22)
380     return qpl[ip];
381     else
382     return 0;
383     }
384    
385     float GetQstrip() {
386    
387     float qaxis = 0;
388     for (Int_t i = 0; i < (int) (q.size()); i++)
389     qaxis += q[i];
390     if (q.size() == 0)
391     return 0.;
392     return qaxis / q.size();
393     }
394    
395     float GetYfit(float x) {
396     return par[0] + x * par[1];
397     }
398    
399     float GetXmin() {
400     float zmin = 9999;
401     for (Int_t i = 0; i < (int) (x.size()); i++)
402     if (x[i] < zmin)
403     zmin = x[i];
404     return zmin;
405     }
406     float GetXmax() {
407     float zmax = -9999;
408     for (Int_t i = 0; i < (int) (x.size()); i++)
409     if (x[i] > zmax)
410     zmax = x[i];
411     return zmax;
412    
413     }
414    
415     void Draw() {
416    
417     // cout << " CaloAxis::Draw()"<<endl;
418     if (GetN() < 3)
419     return;
420    
421     sel = new TPolyMarker(GetN(), GetY(), GetX());
422     sel->SetMarkerSize(0.3);
423     sel->SetMarkerColor(5);
424    
425     axis = new TLine(par[0] + GetXmin() * par[1], GetXmin(), par[0] + GetXmax() * par[1], GetXmax());
426     axis->SetLineWidth(1);
427     axis->SetLineColor(5);
428    
429     // cout << sel << endl;
430     // cout << axis << endl;
431    
432     sel->Draw();
433     axis->Draw();
434     }
435     ;
436    
437     //-----------------------------------------------------------------
438     // fit the axis (optimized for non-interacting patterns)
439     //-----------------------------------------------------------------
440 pam-fi 1.3 int FitAxis(CaloLevel1* calo, Int_t view, Float_t toll, Int_t nPlanes = 22, Bool_t usemechanicalalignement = 0) {
441 pam-fi 1.2
442     // cout << "CaloAxis::FitAxis(...)"<<endl;
443    
444     Set(calo, view, usemechanicalalignement);
445    
446     // ------------------------------
447     // first : all hits included, w=1
448     // ------------------------------
449     for (int ih = 0; ih < cevent->GetN(); ih++) {
450     float x = cevent->xycoord[ih];
451     float z = cevent->zcoord[ih];
452     float q = cevent->q[ih];
453     Add(z, x, q);
454     }
455    
456     if (GetN() < 3)
457     return 0;
458     Fit();
459     // useful for debug cout << "(1)"<<endl;
460     // cout << " n. hits :"<<GetN()<<endl;
461     // cout << " P0 P1 :"<<par[0]<< " "<<par[1]<<endl;
462     // cout << " Chi2 :"<<GetChi2()<<endl;
463     // cout << " Q axis :"<<GetQaxis()<<endl;
464     // cout << " Q strip :"<<GetQstrip()<<endl;
465    
466     float P0;
467     float P1;
468     int dof;
469    
470     // ---------------------------
471     // second : iteration
472     // ---------------------------
473     int niter = 0; // number of iterations
474 pam-fi 1.3 int pok[nPlanes];
475 pam-fi 1.2
476     // prova
477     // pesi lineari
478     float W22 = 1.;
479     float W1 = 10.;
480 pam-fi 1.3 float b = (W22 - W1) / ((float) nPlanes - 1.);// (w22 - w1)/(22-1)
481 pam-fi 1.2 float a = W1 - b;
482    
483 pam-fi 1.3 for (int i = 0; i < nPlanes; i++)
484 pam-fi 1.2 pok[i] = 0;
485     do {
486     niter++;
487     float ttoll = toll; //tolerance (cm)
488     if (niter == 1)
489     ttoll = 10. * toll;
490     dof = GetN(); //previous fit
491     P0 = par[0];
492     P1 = par[1];
493     Reset(); //fit reset
494     for (int ih = 0; ih < cevent->GetN(); ih++) {//loop over selected hits
495 pam-fi 1.3 if (cevent->idp[ih] < nPlanes) {
496     float x = cevent->xycoord[ih];
497     float z = cevent->zcoord[ih];
498     float q = cevent->q[ih];
499     int ip = cevent->idp[ih];
500     float d = fabs(x - P0 - P1 * z) / sqrt(P1 * P1 + 1);//distance to axis
501     // cout<<d<<endl;
502     if (d < ttoll && (niter == 1 || (niter > 1 && pok[ip] == 1))) {
503     // if( d < ttoll ){
504     float W = a + b * (ip + 1);
505     // cout << ip << " "<<W<<endl;
506     Add(z, x, q, W);
507     pok[ip] = 1;
508     }
509 pam-fi 1.2 }
510     }
511     // break the track if more than 3 planes are missing
512     int nmissing = 0;
513 pam-fi 1.3 for (int ip = 0; ip < nPlanes; ip++) {
514 pam-fi 1.2 if (pok[ip] == 0) {
515     nmissing++;
516     }
517     else {
518     nmissing = 0;
519     }
520     if (nmissing == 3) {
521 pam-fi 1.3 for (int ipp = ip + 1; ipp < nPlanes; ipp++)
522 pam-fi 1.2 pok[ipp] = 0;
523     break;
524     }
525     }
526    
527     if (niter == 100)
528     break;
529     if (GetN() < 3)
530     break;
531     Fit();
532     } while (niter == 1 || GetN() != dof);
533     // cout << " >>> "<<GetN()<<endl;
534     if (GetN() < 3)
535     return 0;
536     Fit();
537     // cout << "(2)"<<endl;
538     // cout << " n. hits :"<<GetN()<<endl;
539     // cout << " P0 P1 :"<<par[0]<< " "<<par[1]<<endl;
540     // cout << " Chi2 :"<<GetChi2()<<endl;
541     // cout << " Q axis :"<<GetQaxis()<<endl;
542     // cout << " Q strip :"<<GetQstrip()<<endl;
543    
544     // ---------------------------------------------
545     // third : selecting only closest strip-clusters
546     // and fit baricenters
547     // ---------------------------------------------
548     P0 = par[0];
549     P1 = par[1];
550     Reset();
551    
552 pam-fi 1.3 float dmin[nPlanes];
553     int closest[nPlanes];
554     for (int ip = 0; ip < nPlanes; ip++) {
555 pam-fi 1.2 dmin[ip] = 999;
556     closest[ip] = -1;
557     }
558     for (int ih = 0; ih < cevent->GetN(); ih++) {
559 pam-fi 1.3 if (cevent->idp[ih] < nPlanes) {
560     float x = cevent->xycoord[ih];
561     float z = cevent->zcoord[ih];
562     //float q = cevent->q[ih];
563     int ip = cevent->idp[ih];
564     //int is = cevent->ids[ih];
565     float d = fabs(x - P0 - P1 * z) / sqrt(P1 * P1 + 1);
566     if (d < toll && d < dmin[ip] && pok[ip] == 1) {
567     // Add(z,x,q,q);
568     closest[ip] = ih;
569     // cog[ip] += x*q;
570     // qpl[ip] += q;
571     }
572 pam-fi 1.2 }
573     }
574 pam-fi 1.3 for (Int_t ip = 0; ip < nPlanes; ip++) {
575 pam-fi 1.2 if (closest[ip] != -1) {
576     float x = cevent->xycoord[closest[ip]];
577     float z = cevent->zcoord[closest[ip]];
578     float q = cevent->q[closest[ip]];
579     //int is = cevent->ids[closest[ip]];
580     Add(z, x, q, q);
581     cog[ip] += x * q;
582     qpl[ip] += q;
583     // cout << ip << " -o- "<<is<<endl;
584     }
585     }
586     // -----------------
587     // add +/- one strip
588     // -----------------
589     for (int ih = 0; ih < cevent->GetN(); ih++) {
590 pam-fi 1.3 if (cevent->idp[ih] < nPlanes) {
591 pam-fi 1.2 float x = cevent->xycoord[ih];
592     float z = cevent->zcoord[ih];
593     float q = cevent->q[ih];
594     int ip = cevent->idp[ih];
595     int is = cevent->ids[ih];
596     if (closest[ip] != -1) {
597     int isc = cevent->ids[closest[ip]];
598     if (is == isc + 1 || is == isc - 1) {
599     Add(z, x, q, q);
600     cog[ip] += x * q;
601     qpl[ip] += q;
602     // cout << ip << " -+- "<<is<<endl;
603     }
604 pam-fi 1.3 }}
605 pam-fi 1.2 }
606     Fit();
607    
608     if (GetN() < 3)
609     return 0;
610 pam-fi 1.3 for (int ip = 0; ip < nPlanes; ip++) {
611 pam-fi 1.2 if (qpl[ip] != 0) {
612     cog[ip] = cog[ip] / qpl[ip];
613     // Add(z,cog[ip],cog[ip],0.7);
614     }
615     }
616    
617     // cout << "(3)"<<endl;
618     // cout << " n. hits :"<<GetN()<<endl;
619     // cout << " P0 P1 :"<<par[0]<< " "<<par[1]<<endl;
620     // cout << " Chi2 :"<<GetChi2()<<endl;
621     // cout << " Q axis :"<<GetQaxis()<<endl;
622     // cout << " Q strip :"<<GetQstrip()<<endl;
623     // cout << " ---------------------------"<<endl;
624     return 1;
625     }
626     ;
627    
628 pam-fi 1.3 /*int FitAxis(CaloLevel1* calo, Int_t view, Float_t toll, Int_t nPlanes = 22) {
629     return FitAxis(calo, view, toll, 0, nPlanes);
630 pam-fi 1.2 }
631 pam-fi 1.3 ;*/
632 pam-fi 1.2
633     //-----------------------------------------------------------------
634     // fit the axis (optimized for interacting patterns?? ...forse)
635     //-----------------------------------------------------------------
636     int FitShower(CaloLevel1* calo, Int_t view, Float_t toll, Bool_t usemechanicalalignement) {
637    
638     // cout << "CaloAxis::FitAxis(...)"<<endl;
639    
640     Set(calo, view, usemechanicalalignement);
641    
642     // ------------------------------
643     // first :
644     // ------------------------------
645     for (int ih = 0; ih < cevent->GetN(); ih++) {
646     float x = cevent->xycoord[ih];
647     //float z = cevent->zcoord[ih];
648     float q = cevent->q[ih];
649     int ip = cevent->idp[ih];
650     cog[ip] += x * q;
651     qpl[ip] += q;
652     // Add(z,x,q);
653     }
654     for (int ip = 0; ip < 22; ip++) {
655     if (qpl[ip] != 0)
656     cog[ip] = cog[ip] / qpl[ip];
657     // cout << ip << " > "<<qpl[ip]<<" "<<cog[ip]<<endl;
658     }
659     // ----------------
660     // plane of maximum
661     // ----------------
662     float qplmax = 1;
663     int ipmax = -1;
664     float dmin[22];
665     int closest[22];
666     for (int ip = 0; ip < 22; ip++)
667     if (qpl[ip] > qplmax) {
668     ipmax = ip;
669     qplmax = qpl[ip];
670     dmin[ip] = 1000.;//init
671     closest[ip] = -1;//init
672     }
673     for (int ih = 0; ih < cevent->GetN(); ih++) {
674     float x = cevent->xycoord[ih];
675     float z = cevent->zcoord[ih];
676     float q = cevent->q[ih];
677     int ip = cevent->idp[ih];
678     // if( (ipmax>3 && ip<=ipmax) || ipmax<=3 )Add(z,x,q);
679     if (ip <= ipmax || ip <= 3) {
680     Add(z, x, q);
681     }
682     }
683     if (GetN() < 3)
684     return 0;
685     Fit();
686     // cout << " n. hits :"<<GetN()<<endl;
687     // cout << " P0 P1 :"<<par[0]<< " "<<par[1]<<endl;
688     // cout << " Chi2 :"<<GetChi2()<<endl;
689     // cout << " Q axis :"<<GetQaxis()<<endl;
690     // cout << " Q strip :"<<GetQstrip()<<endl;
691    
692     float P0;
693     float P1;
694     int dof;
695    
696     // ---------------------------
697     // second : iteration
698     // ---------------------------
699     int niter = 0; // number of iterations
700     int pok[22];
701     // prova
702     // pesi lineari
703     float W22 = 1.;
704     float W1 = 10.;
705     float b = (W22 - W1) / (22. - 1.);// (w22 - w1)/(22-1)
706     float a = W1 - b;
707    
708     for (int i = 0; i < 22; i++) {
709     pok[i] = 0;
710     }
711     do {
712     niter++;
713     float ttoll = toll; //tolerance (cm)
714     if (niter == 1)
715     ttoll = 10. * toll;
716     dof = GetN(); //previous fit
717     P0 = par[0];
718     P1 = par[1];
719     Reset(); //fit reset
720     for (int i = 0; i < 22; i++) {
721     cog[i] = 0;
722     qpl[i] = 0;
723     }
724     for (int ih = 0; ih < cevent->GetN(); ih++) {
725     float x = cevent->xycoord[ih];
726     float z = cevent->zcoord[ih];
727     float q = cevent->q[ih];
728     int ip = cevent->idp[ih];
729     float d = fabs(x - P0 - P1 * z) / sqrt(P1 * P1 + 1);
730     // cout<<d<<endl;
731     if ((niter == 1 || (niter > 1 && pok[ip] == 1)) && (ip <= ipmax || ip <= 3) &&
732     // ((ipmax>3 && ip<=ipmax) || ipmax<=3) &&
733     true) {
734    
735     if (niter == 1 && d < dmin[ip]) {
736     dmin[ip] = d;
737     closest[ip] = ih;
738     }
739    
740     float W = a + b * (ip + 1);
741     // cout << ip << " "<<W<<endl;
742     if (d < ttoll || (niter == 2 && ih == closest[ip])) {
743     /* if(ip==ipmax && ipmax>1)Add(z,x,q,W*q); */
744     /* else Add(z,x,q,W); */
745     cog[ip] += x * q;
746     qpl[ip] += q;
747     Add(z, x, q, W);
748     pok[ip] = 1;
749     cout << ip << " " << qpl[ip] << endl;
750     }
751     }
752     }
753     // break the track if more than 3 planes are missing
754     int nmissing = 0;
755     for (int ip = 0; ip < 22; ip++) {
756     if (pok[ip] == 0) {
757     nmissing++;
758     }
759     else {
760     nmissing = 0;
761     }
762     if (nmissing == 6) {
763     for (int ipp = ip + 1; ipp < 22; ipp++)
764     pok[ipp] = 0;
765     break;
766     }
767     }
768    
769     for (int ip = 0; ip < 22; ip++)
770     cout << qpl[ip] << " ";
771     cout << endl;
772    
773     for (int ip = 0; ip < 22; ip++)
774     if (qpl[ip] != 0)
775     cog[ip] = cog[ip] / qpl[ip];
776    
777     if (niter == 100)
778     break;
779     if (GetN() < 3)
780     break;
781    
782     Fit();
783    
784     } while (niter == 1 || GetN() != dof);
785     // cout << " >>> "<<GetN()<<endl;
786     if (GetN() < 3)
787     return 0;
788     Fit();
789     /* // cout << " n. hits :"<<GetN()<<endl; */
790     /* // cout << " P0 P1 :"<<par[0]<< " "<<par[1]<<endl; */
791     /* // cout << " Chi2 :"<<GetChi2()<<endl; */
792     /* // cout << " Q axis :"<<GetQaxis()<<endl; */
793     /* // cout << " Q strip :"<<GetQstrip()<<endl; */
794    
795     /* // --------------------------------------------- */
796     /* // third : selecting only closest strip-clusters */
797     /* // and fit baricenters */
798     /* // --------------------------------------------- */
799     /* P0 = par[0]; */
800     /* P1 = par[1]; */
801     /* Reset(); */
802    
803     /* float dmin[22]; */
804     /* int closest[22]; */
805     /* for(int ip=0; ip<22; ip++){ */
806     /* dmin[ip]=999; */
807     /* closest[ip]=-1; */
808     /* } */
809     /* for(int ih=0;ih<cevent->GetN(); ih++){ */
810     /* float x = cevent->xycoord[ih]; */
811     /* float z = cevent->zcoord[ih]; */
812     /* float q = cevent->q[ih]; */
813     /* int ip = cevent->idp[ih]; */
814     /* int is = cevent->ids[ih]; */
815     /* float d = fabs(x-P0-P1*z)/sqrt(P1*P1+1); */
816     /* if( d < toll && d<dmin[ip] && pok[ip]==1 ){ */
817     /* // Add(z,x,q,q); */
818     /* closest[ip]=ih; */
819     /* // cog[ip] += x*q; */
820     /* // qpl[ip] += q; */
821     /* } */
822     /* } */
823     /* for(Int_t ip=0; ip<22; ip++){ */
824     /* if(closest[ip]!=-1){ */
825     /* float x = cevent->xycoord[closest[ip]]; */
826     /* float z = cevent->zcoord[closest[ip]]; */
827     /* float q = cevent->q[closest[ip]]; */
828     /* int is = cevent->ids[closest[ip]]; */
829     /* Add(z,x,q,q); */
830     /* cog[ip] += x*q; */
831     /* qpl[ip] += q; */
832     /* // cout << ip << " -o- "<<is<<endl; */
833     /* } */
834     /* } */
835     /* // add +/- one strip */
836     /* for(int ih=0;ih<cevent->GetN(); ih++){ */
837     /* float x = cevent->xycoord[ih]; */
838     /* float z = cevent->zcoord[ih]; */
839     /* float q = cevent->q[ih]; */
840     /* int ip = cevent->idp[ih]; */
841     /* int is = cevent->ids[ih]; */
842     /* if( closest[ip]!=-1 ){ */
843     /* int isc = cevent->ids[closest[ip]]; */
844     /* if( is == isc+1 || is == isc-1 ){ */
845     /* Add(z,x,q,q); */
846     /* cog[ip] += x*q; */
847     /* qpl[ip] += q; */
848     /* // cout << ip << " -+- "<<is<<endl; */
849     /* } */
850     /* } */
851     /* } */
852     /* Fit(); */
853    
854     /* if(GetN()<3)return 0; */
855     /* for(int ip=0; ip<22; ip++){ */
856     /* if(qpl[ip]!=0){ */
857     /* cog[ip]=cog[ip]/qpl[ip]; */
858     /* // Add(z,cog[ip],cog[ip],0.7); */
859     /* } */
860     /* } */
861    
862     // cout << " n. hits :"<<GetN()<<endl;
863     // cout << " P0 P1 :"<<par[0]<< " "<<par[1]<<endl;
864     // cout << " Chi2 :"<<GetChi2()<<endl;
865     // cout << " Q axis :"<<GetQaxis()<<endl;
866     // cout << " Q strip :"<<GetQstrip()<<endl;
867     // cout << " ---------------------------"<<endl;
868     return 1;
869     }
870     ;
871    
872     int FitShower(CaloLevel1* calo, Int_t view, Float_t toll) {
873 pam-fi 1.4 return FitShower(calo, view, toll, 0);
874 pam-fi 1.2 }
875     ;
876 pam-fi 1.1
877     };
878    
879     //===============================================================================
880     //
881     //
882     //
883     //
884     //===============================================================================
885    
886     #endif // CALOAXIS2_H_

  ViewVC Help
Powered by ViewVC 1.1.23