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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.7 - (hide annotations) (download)
Tue Aug 4 15:05:21 2009 UTC (15 years, 5 months ago) by mocchiut
Branch: MAIN
Changes since 1.6: +19 -3 lines
Bugs fixed

1 mocchiut 1.1 #include <CaloProfile.h>
2 mocchiut 1.2 //
3     ClassImp(CaloLat);
4     ClassImp(CaloLong);
5     ClassImp(Calo2D);
6 mocchiut 1.1
7     ////////////////////////////////////////////////////////////////////////
8     /**
9     * 1-dimension function describing lateral distribution of the
10     * shower as viewed by calorimeter
11     * (projection of 3d function in one direction)
12     *
13     * xi[0] = x or y coordinate relative to shower axis
14     * parmin[0] = rt
15     * parmin[1] = p
16     * parmin[2] = rc
17     *
18     */
19     ////////////////////////////////////////////////////////////////////////
20     Double_t cfradx(Double_t *xi, Double_t *parmin) {
21    
22     double fradxmin2,p,rt,rc,es,x,pig,norm,c;
23     x=*xi;
24     pig = acos(-1.);
25     rt=parmin[0];
26     p=parmin[1];
27     rc=parmin[2];
28     norm=parmin[3];
29     c=parmin[4];
30     x=x-c;
31     es=1.5;
32     fradxmin2=p*pig*pow(rc,2)/pow((pow(x,2)+pow(rc,2)),es);
33     fradxmin2=fradxmin2+(1-p)*pig*pow(rt,2)/pow((pow(x,2)+pow(rt,2)),es);
34     fradxmin2=norm*fradxmin2/(2*pig);
35     //cout<<"x,fradxmin2 "<< x<<" "<<fradxmin2 <<endl;
36     return fradxmin2;
37     }
38    
39    
40     Double_t cfunc(Double_t *tin,Double_t *par)
41     {
42    
43     Double_t gaa,a,tm,et,value,t,t0;
44     t=*tin;
45     et=par[0];
46     a=par[1];
47     tm=par[2];
48     t0=par[3];
49     gaa=TMath::Gamma(a);
50    
51     value=et*((a-1)/(tm*gaa))*pow(((a-1)*(t-t0)/tm),(a-1))*exp(-(a-1)*(t-t0)/tm);
52     return value;
53     }
54    
55    
56     //--------------------------------------
57     /**
58     * Default constructor
59     */
60     CaloLat::CaloLat(){
61     Clear();
62     };
63    
64     /**
65     * Default constructor
66     */
67 mocchiut 1.2 Calo2D::Calo2D(){
68 mocchiut 1.1 Clear();
69     };
70    
71     CaloLat::CaloLat(PamLevel2 *l2p){
72     //
73     Clear();
74     //
75     L2 = l2p;
76     //
77     if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
78     //
79     OBT = 0;
80     PKT = 0;
81     atime = 0;
82     //
83     debug = false;
84     //
85     };
86    
87 mocchiut 1.2 Calo2D::Calo2D(PamLevel2 *l2p){
88 mocchiut 1.1 //
89     Clear();
90     //
91     L2 = l2p;
92     //
93     if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
94     //
95     OBT = 0;
96     PKT = 0;
97     atime = 0;
98     //
99     debug = false;
100     //
101     };
102    
103     void CaloLat::Clear(){
104     //
105     };
106    
107 mocchiut 1.2 void Calo2D::Clear(){
108 mocchiut 1.1 //
109     };
110    
111     void CaloLat::Print(){
112     //
113     Process();
114     //
115     printf("==================== Calorimeter Lateral Profile =======================\n");
116     printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime);
117     // printf(" nx [number of X combination]:.. %i\n",nx);
118     // printf(" ny [number of Y combination]:.. %i\n",ny);
119     printf("========================================================================\n");
120     //
121     };
122    
123 mocchiut 1.2 void Calo2D::Print(){
124 mocchiut 1.1 //
125     Process();
126     //
127 mocchiut 1.2 printf("==================== Calorimeter 2D Profile =======================\n");
128 mocchiut 1.1 printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime);
129     // printf(" nx [number of X combination]:.. %i\n",nx);
130     // printf(" ny [number of Y combination]:.. %i\n",ny);
131     printf("========================================================================\n");
132     //
133     };
134    
135     void CaloLat::Draw(){
136     //
137     Process();
138     Draw(-1,-1);
139     };
140    
141 mocchiut 1.2 void Calo2D::Draw(){
142 mocchiut 1.1 //
143     Process();
144     Draw(-1);
145     };
146    
147     void CaloLat::Draw(Int_t view,Int_t plane){
148     //
149     Int_t minv = 0;
150     Int_t maxv = 0;
151     Int_t minp = 0;
152     Int_t maxp = 0;
153     //
154     if ( view == -1 ){
155     minv = 0;
156     maxv = 2;
157     } else {
158     minv = view;
159     maxv = view+1;
160     };
161    
162     if ( plane == -1 ){
163     minp = 0;
164     maxp = 22;
165     } else {
166     minp = plane;
167     maxp = plane+1;
168     };
169     //
170     Process();
171     //
172     gStyle->SetLabelSize(0.04);
173     gStyle->SetNdivisions(510,"XY");
174     //
175     for (Int_t v=minv; v<maxv;v++){
176     for (Int_t p=minp; p<maxp;p++){
177     TString hid = Form("clatv%ip%i",v,p);
178     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
179     if ( tc ){
180     // tc->Clear();
181     } else {
182     tc = new TCanvas(hid,hid);
183     };
184     //
185     TString thid = Form("hlatv%ip%i",v,p);
186     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
187     if ( th ) th->Delete();
188     // th->Clear();
189     // th->Reset();
190     // } else {
191     th = new TH1F(thid,thid,96,-0.5,95.5);
192     // };
193     tc->cd();
194     //
195     for (Int_t st=0;st<96;st++){
196     th->Fill(st,estrip[v][p][st]);
197     };
198     th->Draw();
199     tc->Modified();
200     tc->Update();
201     };
202     };
203     //
204     gStyle->SetLabelSize(0);
205     gStyle->SetNdivisions(1,"XY");
206     //
207     };
208    
209 mocchiut 1.2 void Calo2D::Draw(Int_t plane){
210 mocchiut 1.1 //
211 mocchiut 1.2 Int_t minp = 0;
212     Int_t maxp = 0;
213 mocchiut 1.1 //
214 mocchiut 1.2 if ( plane == -1 ){
215     minp = 0;
216     maxp = 23;
217 mocchiut 1.1 } else {
218 mocchiut 1.2 minp = plane;
219     maxp = plane+1;
220 mocchiut 1.1 };
221     //
222     Process();
223     //
224     gStyle->SetLabelSize(0.04);
225     gStyle->SetNdivisions(510,"XY");
226     //
227 mocchiut 1.2 for (Int_t p=minp; p<maxp;p++){
228     TString hid = Form("c2dp%i",p);
229     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
230     if ( tc ){
231     // tc->Clear();
232     } else {
233     tc = new TCanvas(hid,hid);
234     };
235     //
236     TString thid = Form("h2dp%i",p);
237     TH2F *th = dynamic_cast<TH2F*>(gDirectory->FindObject(thid));
238     if ( th ) th->Delete();
239     // th->Clear();
240     // th->Reset();
241     // } else {
242     Int_t minx = smax[p] - 10;
243     if ( minx < 0 ) minx = 0;
244     Int_t maxx = minx + 20;
245     if ( maxx > 95 ){
246     maxx = 95;
247     minx = 75;
248     };
249     Int_t miny = smay[p] - 10;
250     if ( miny < 0 ) miny = 0;
251     Int_t maxy = miny + 20;
252     if ( maxy > 95 ){
253     maxy = 95;
254     miny = 75;
255     };
256     th = new TH2F(thid,thid,20,(Float_t)minx-0.5,(Float_t)maxx-0.5,20,(Float_t)miny-0.5,(Float_t)maxy-0.5);
257     // th = new TH2F(thid,thid,96,-0.5,95.5,96,-0.5,95.5);
258     // };
259     tc->cd();
260     //
261     for (Int_t stx=minx;stx<maxx+1;stx++){
262     for (Int_t sty=miny;sty<maxy+1;sty++){
263     th->Fill(stx,sty,estrip[p][stx][sty]);
264     };
265     };
266     gStyle->SetPalette(1);
267     // tc->SetLogz();
268     // th->Draw("colbox");
269     th->Draw("cont4");
270     tc->Modified();
271     tc->Update();
272 mocchiut 1.1 };
273     //
274     gStyle->SetLabelSize(0);
275     gStyle->SetNdivisions(1,"XY");
276     //
277     };
278    
279     void CaloLat::Delete(){
280     Clear();
281     //delete this;
282     };
283    
284 mocchiut 1.2 void Calo2D::Delete(){
285 mocchiut 1.1 Clear();
286     //delete this;
287     };
288    
289 mocchiut 1.2
290 mocchiut 1.1 void CaloLat::Process(){
291     //
292     if ( !L2 ){
293     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
294     printf(" ERROR: CaloHough variables not filled \n");
295     return;
296     };
297     //
298     Bool_t newentry = false;
299     //
300     if ( L2->IsORB() ){
301     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
302     newentry = true;
303     OBT = L2->GetOrbitalInfo()->OBT;
304     PKT = L2->GetOrbitalInfo()->pkt_num;
305     atime = L2->GetOrbitalInfo()->absTime;
306     };
307     } else {
308     newentry = true;
309     };
310     //
311     if ( !newentry ) return;
312     //
313     if ( debug ) printf(" Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
314     //
315     Clear();
316     //
317     // let's start
318     //
319     memset(estrip,0, 4224*sizeof(Float_t));
320     Float_t mip1 = 0.;
321     Int_t view1 = 0;
322     Int_t plane1 = 0;
323     Int_t strip1 = 0;
324     //
325     for (Int_t i=0; i<L2->GetCaloLevel1()->istrip ; i++){
326     mip1 = L2->GetCaloLevel1()->DecodeEstrip(i,view1,plane1,strip1);
327     estrip[view1][plane1][strip1] = mip1;
328     };
329     //
330     if ( debug ) this->Print();
331     if ( debug ) printf(" exit \n");
332     //
333     };
334    
335 mocchiut 1.2 void Calo2D::Process(){
336     //
337     if ( !L2 ){
338     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
339     printf(" ERROR: CaloHough variables not filled \n");
340     return;
341     };
342     //
343     Bool_t newentry = false;
344     //
345     if ( L2->IsORB() ){
346     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
347     newentry = true;
348     OBT = L2->GetOrbitalInfo()->OBT;
349     PKT = L2->GetOrbitalInfo()->pkt_num;
350     atime = L2->GetOrbitalInfo()->absTime;
351     };
352     } else {
353     newentry = true;
354     };
355     //
356     if ( !newentry ) return;
357     //
358     if ( debug ) printf(" Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
359     //
360     Clear();
361     //
362     // let's start
363     //
364     Float_t es[2][22][96];
365     memset(es,0, 4224*sizeof(Float_t));
366     memset(estrip,0, 4224*sizeof(Float_t));
367     Float_t mip1 = 0.;
368     Int_t view1 = 0;
369     Int_t plane1 = 0;
370     Int_t strip1 = 0;
371     //
372     for (Int_t i=0; i<L2->GetCaloLevel1()->istrip ; i++){
373     mip1 = L2->GetCaloLevel1()->DecodeEstrip(i,view1,plane1,strip1);
374     es[view1][plane1][strip1] = mip1;
375     };
376     //
377     Int_t plane2 = 0;
378     Float_t emax[23];
379     memset(emax,0,sizeof(Float_t)*23);
380     memset(smax,0,sizeof(Int_t)*23);
381     memset(smay,0,sizeof(Int_t)*23);
382     //
383     //
384     for (Int_t p=0; p < 23 ; p++){
385     //
386     plane1 = p-1;
387     plane2 = p;
388     //
389     if ( p == 0 ){
390     plane1 = -1;
391     plane2 = 0;
392     };
393     if ( p == 22 ){
394     plane1 = 21;
395     plane2 = -1;
396     };
397     //
398     for (Int_t s=0; s < 96 ; s++){ // x
399     for (Int_t ss=0; ss < 96 ; ss++){ // y
400     if ( p == 0 ){
401     estrip[p][s][ss] += es[1][plane2][ss];
402     if ( (es[1][plane2][ss]) > emax[p] ){
403     smax[p] = 45;
404     smay[p] = ss;
405     emax[p] = es[1][plane2][ss] ;
406     };
407     };
408     if ( p > 0 && p < 22 ){
409     estrip[p][s][ss] += es[0][plane1][s] + es[1][plane2][ss];
410     if ( (es[0][plane1][s] + es[1][plane2][ss]) > emax[p] ){
411     smax[p] = s;
412     smay[p] = ss;
413     emax[p] = es[0][plane1][s] + es[1][plane2][ss] ;
414     };
415     };
416     if ( p == 22 ){
417     estrip[p][s][ss] += es[0][plane1][s];
418     if ( (es[1][plane2][s]) > emax[p] ){
419     smax[p] = s;
420     smay[p] = 45;
421     emax[p] = es[1][plane2][s] ;
422     };
423     };
424     };
425     };
426     //
427     };
428     //
429     if ( debug ) this->Print();
430     if ( debug ) printf(" exit \n");
431     //
432     };
433    
434    
435     /**
436     * Default constructor
437     */
438     CaloLong::CaloLong(){
439     Clear();
440     };
441    
442     CaloLong::CaloLong(PamLevel2 *l2p){
443     //
444     Clear();
445     //
446     L2 = l2p;
447     //
448     if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
449     //
450     OBT = 0;
451     PKT = 0;
452     atime = 0;
453     //
454     sel = true;
455     cont = false;
456     N = 0;
457     NC = 22;
458     mask18b = -1;
459     //
460     no18x = true;
461     debug = false;
462 mocchiut 1.5 maskXE = false;
463     maskXO = false;
464     maskYE = false;
465     maskYO = false;
466 mocchiut 1.2 //
467     };
468    
469 mocchiut 1.5 void CaloLong::MaskSection(TString sec){
470     sec.ToUpper();
471     if ( sec.Contains("XO") ) maskXO = true;
472     if ( sec.Contains("YO") ) maskYO = true;
473     if ( sec.Contains("XE") ) maskXE = true;
474     if ( sec.Contains("YE") ) maskYE = true;
475     }
476    
477 mocchiut 1.2 void CaloLong::Clear(){
478     //
479     memset(eplane,0, 2*22*sizeof(Float_t));
480     //
481     chi2 = 0.;
482     ndf = 0.;
483     E0 = 0.;
484     a = 0.;
485     b = 0.;
486     errE0 = 0.;
487     erra = 0.;
488     errb = 0.;
489     etmax = 0.;
490     asymm = 0.;
491     fitresult = 0;
492     //
493     X0pl = 0.76;
494     //
495     };
496    
497     void CaloLong::Print(){
498     //
499 mocchiut 1.6 Fit();
500 mocchiut 1.2 //
501     printf("==================== Calorimeter Longitudinal Profile =======================\n");
502     printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime);
503     printf(" fitresult:.. %i\n",fitresult);
504     printf(" chi2 :.. %f\n",chi2);
505     printf(" ndf :.. %f\n",ndf);
506     printf(" nchi2 :.. %f\n",chi2/ndf);
507     printf(" E0 :.. %f\n",E0);
508     printf(" E0/260. :.. %f\n",E0/260.);
509     printf(" a :.. %f\n",a);
510     printf(" b :.. %f\n",b);
511     printf(" errE0 :.. %f\n",errE0);
512     printf(" erra :.. %f\n",erra);
513     printf(" errb :.. %f\n",errb);
514     printf(" asymm :.. %f\n",asymm);
515     printf(" tmax :.. %f\n",((a-1.)/b));
516     printf(" etmax :.. %f\n",etmax);
517     printf(" X0pl :.. %f\n",X0pl);
518     printf("========================================================================\n");
519     //
520     };
521    
522     void CaloLong::SetNoWpreSampler(Int_t n){
523     //
524     if ( NC+n <= 22 && NC+n >= 0 ){
525     N = n;
526     } else {
527     printf(" ERROR! Calorimeter is made of 22 W planes\n");
528     printf(" you are giving N presampler = %i and N calo = %i \n",n,NC);
529     printf(" WARNING: using default values NWpre = 0, NWcalo = 22\n");
530     NC = 22;
531     N = 0;
532     };
533     }
534    
535     void CaloLong::SetNoWcalo(Int_t n){
536     if ( N+n <= 22 && N+n >= 0 ){
537     NC = n;
538     } else {
539     printf(" ERROR! Calorimeter is made of 22 W planes\n");
540     printf(" you are giving N W presampler = %i and N W calo = %i \n",N,n);
541     printf(" WARNING: using default values NWpre = 0, NWcalo = 22\n");
542     NC = 22;
543     N = 0;
544     };
545     }
546    
547 mocchiut 1.3 void CaloLong::SplitInto(Int_t NoWpreSampler, Int_t NoWcalo){
548     this->SetNoWpreSampler(0);
549     this->SetNoWcalo(0);
550     if ( NoWpreSampler < NoWcalo ){
551     this->SetNoWpreSampler(NoWpreSampler);
552     this->SetNoWcalo(NoWcalo);
553     } else {
554     this->SetNoWcalo(NoWcalo);
555     this->SetNoWpreSampler(NoWpreSampler);
556     };
557     }
558    
559 mocchiut 1.1 void CaloLong::Process(){
560     //
561     if ( !L2 ){
562     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
563     printf(" ERROR: CaloHough variables not filled \n");
564     return;
565     };
566     //
567     Bool_t newentry = false;
568     //
569     if ( L2->IsORB() ){
570     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
571     newentry = true;
572     OBT = L2->GetOrbitalInfo()->OBT;
573     PKT = L2->GetOrbitalInfo()->pkt_num;
574     atime = L2->GetOrbitalInfo()->absTime;
575     };
576     } else {
577     newentry = true;
578     };
579     //
580     if ( !newentry ) return;
581     //
582     if ( debug ) printf(" Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
583     //
584     Clear();
585     //
586     // let's start
587     //
588 mocchiut 1.2 if ( cont ){
589     for (Int_t i=0; i<22; i++){
590     if ( i == (18+N) ){
591     mask18b = 18 + N;
592     break;
593     };
594     };
595     };
596     //
597     if ( sel ){
598     for (Int_t i=0; i<22; i++){
599     if ( i == (18-N) ){
600     mask18b = 18 - N;
601     break;
602     };
603     };
604     };
605     //
606     // if ( mask18b == 18 ) mask18b = -1;
607 mocchiut 1.1 //
608 mocchiut 1.2 Int_t view = 0;
609     Int_t plane = 0;
610     Int_t strip = 0;
611     Float_t mip = 0.;
612 mocchiut 1.5 Bool_t gof = true;
613 mocchiut 1.2 for (Int_t i=0; i < L2->GetCaloLevel1()->istrip; i++){
614     mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
615 mocchiut 1.5 gof = true;
616     if ( maskXE && (plane%2)==0 && view==1 ) gof = false;
617     if ( maskXO && (plane%2)!=0 && view==1 ) gof = false;
618     if ( maskYE && (plane%2)!=0 && view==0 ) gof = false;
619     if ( maskYO && (plane%2)==0 && view==0 ) gof = false;
620     if ( gof ) eplane[view][plane] += mip;
621 mocchiut 1.2 };
622     //
623 mocchiut 1.4 // inclination factor (stolen from Daniele's code)
624 mocchiut 1.2 //
625     Float_t ytgx = 0;
626     Float_t ytgy = 0;
627     ytgx = 0.76 * L2->GetCaloLevel2()->tanx[0];
628     ytgy = 0.76 * L2->GetCaloLevel2()->tany[0];
629     X0pl = sqrt( pow(0.76,2.) + pow(ytgx,2.) + pow(ytgy,2.) );
630     //
631     // Find experimental plane of maximum
632     //
633     Int_t pmax = 0;
634     Int_t vmax = 0;
635     Float_t emax = 0.;
636 mocchiut 1.1 for (Int_t v=0; v<2; v++){
637     for (Int_t i=0; i<22; i++){
638 mocchiut 1.2 if ( eplane[v][i] > emax ){
639     emax = eplane[v][i];
640     vmax = v;
641     pmax = i;
642     };
643 mocchiut 1.1 };
644     };
645     //
646 mocchiut 1.2 //
647     //
648     if ( vmax == 0 ) pmax++;
649     etmax = pmax * X0pl;
650     //
651 mocchiut 1.1 if ( debug ) this->Print();
652     if ( debug ) printf(" exit \n");
653     //
654     };
655    
656 mocchiut 1.2
657     Double_t ccurve(Double_t *ti,Double_t *par){
658     //
659     Double_t t = *ti;
660     Double_t cE0 = par[0];
661     Double_t ca = par[1];
662     Double_t cb = par[2];
663     Double_t gammaa = TMath::Gamma(ca);
664     //
665     Double_t value = cE0 * cb * ( pow((cb * t),(ca - 1)) * exp( -cb * t ) ) / gammaa;
666     //
667     return value;
668     //
669     }
670    
671     void CaloLong::Fit(){
672     this->Fit(false);
673     };
674    
675     void CaloLong::Fit(Bool_t draw){
676     //
677     Process();
678     //
679     //
680     if ( !L2 ){
681     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
682     printf(" ERROR: CaloHough variables not filled \n");
683     return;
684     };
685     //
686     Bool_t newentry = false;
687     //
688     if ( L2->IsORB() ){
689     if ( L2->GetOrbitalInfo()->pkt_num != fPKT || L2->GetOrbitalInfo()->OBT != fOBT || L2->GetOrbitalInfo()->absTime != fatime ){
690     newentry = true;
691     fOBT = L2->GetOrbitalInfo()->OBT;
692     fPKT = L2->GetOrbitalInfo()->pkt_num;
693     fatime = L2->GetOrbitalInfo()->absTime;
694     };
695     } else {
696     newentry = true;
697     };
698     //
699     if ( !newentry ) return;
700     //
701     if ( debug ) printf(" Start fitting event at OBT %u PKT %u time %u \n",fOBT,fPKT,fatime);
702     //
703     if ( draw ){
704     gStyle->SetLabelSize(0.04);
705     gStyle->SetNdivisions(510,"XY");
706     };
707     //
708     TString hid = Form("clongfit");
709     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
710     // if ( tc ) tc->Delete();
711     // if ( tc ) tc->Close();
712     if ( !tc && draw ){
713     tc = new TCanvas(hid,hid);
714     } else {
715     if ( tc ) tc->cd();
716     };
717     //
718     TString thid = Form("hlongfit");
719     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
720     if ( th ) th->Delete();
721     Float_t xpos = 0.;
722     Float_t enemip = 0.;
723     Float_t xmax = NC * X0pl + 0.2;
724     // th = new TH1F(thid,thid,int(NC*1.5),-0.2,xmax);
725     th = new TH1F(thid,thid,100,-0.2,xmax);
726     //
727 mocchiut 1.4 // AGH, BUG!
728     //
729     Int_t mmin = 0;
730     Int_t mmax = 0;
731     if ( cont ){
732     mmin = N;
733     mmax = NC+N;
734     } else {
735     mmin = 0;
736     mmax = NC;
737     };
738     //
739     Float_t qtotparz = 0.;
740     for (Int_t st=mmin;st<mmax+1;st++){
741 mocchiut 1.2 enemip = 0.;
742 mocchiut 1.4 xpos = (st - mmin) * X0pl;
743     if ( st > mmin && st < mmax ){
744 mocchiut 1.2 if ( no18x && ( st == 18+1 || st == mask18b+1 )){
745 mocchiut 1.7 if ( !maskYO ){
746     enemip = 2. * eplane[1][st];
747     } else {
748     enemip = eplane[1][st];
749     };
750 mocchiut 1.2 } else {
751     enemip = eplane[0][st-1] + eplane[1][st];
752     };
753     } else {
754 mocchiut 1.7 if ( st == mmin ){
755     if ( !maskYE ){
756     enemip = 2. * eplane[1][st];
757     } else {
758     enemip = eplane[1][st];
759     };
760     };
761     if ( st == mmax ){
762     if ( !maskXE ){
763     enemip = 2. * eplane[0][st-1];
764     } else {
765     enemip = eplane[0][st-1];
766     };
767     };
768 mocchiut 1.2 };
769     //
770 mocchiut 1.4 qtotparz += enemip;
771 mocchiut 1.2 if ( enemip > 0. ){
772     th->Fill(xpos,enemip);
773     if ( debug ) printf(" Filling: st %i xpos %f energy %f \n",st,xpos,enemip);
774     };
775     //
776     // for (Int_t v=1; v>=0;v--)// {
777     // //
778     // if ( v == 1 ){
779     // xpos = (st - N) * X0pl;
780     // } else {
781     // xpos = (st + 1 - N) * X0pl;
782     // };
783     // //
784     // if ( no18x && st == 18 && v == 0 ){
785     // // skip plane 18x
786     // } else {
787     // if ( v == 1 && st == mask18b ){
788     // // emulate plane 18x
789     // } else {
790     // if ( eplane[v][st] > 0. ){
791     // th->Fill(xpos,eplane[v][st]);
792     // if ( debug ) printf(" Filling: st %i v %i xpos %f energy %f \n",st,v,xpos,eplane[v][st]);
793     // };
794     // };
795     // };
796     // //
797     // };
798     };
799     //
800     TF1 *lfit = new TF1("lfit",ccurve,0.,xmax,3);
801 mocchiut 1.4 if ( debug ) printf("qtot %f qtotparz %f \n",L2->GetCaloLevel2()->qtot,qtotparz);
802     E0 = qtotparz;
803     // E0 = L2->GetCaloLevel2()->qtot;
804 mocchiut 1.2 a = 5.;
805     b = 0.5;
806     if ( debug ) printf(" STARTING PARAMETERS: E0 %f a %f b %f \n",E0,a,b);
807     lfit->SetParameters(E0,a,b);
808     // lfit->SetParLimits(0,0.,1000.);
809     // lfit->SetParLimits(1,-1.,80.);
810     // lfit->SetParLimits(2,-1.,10.);
811     TString optio;
812     if ( debug ){
813     // optio = "MERBOV";
814     // optio = "MEROV";
815     // optio = "EROV";
816     optio = "RNOV";
817     if ( draw ) optio = "ROV";
818     } else {
819     // optio = "MERNOQ";
820     // optio = "ERNOQ";
821     optio = "RNOQ";
822     if ( draw ) optio = "ROQ";
823     };
824     //
825     if ( debug ) printf(" OK, start the fitting procedure...\n");
826     //
827     fitresult = th->Fit("lfit",optio);
828     //
829     if ( debug ) printf(" the fit is done! result: %i \n",fitresult);
830     //
831     E0 = lfit->GetParameter(0);
832     a = lfit->GetParameter(1);
833     b = lfit->GetParameter(2);
834     errE0 = lfit->GetParError(0);
835     erra = lfit->GetParError(1);
836     errb = lfit->GetParError(2);
837     chi2 = lfit->GetChisquare();
838     ndf = lfit->GetNDF();
839     Float_t tmax = 0.;
840     if ( debug ) printf(" Parameters are retrieved \n");
841     if ( b != 0 ) tmax = (a - 1.)/b;
842     //
843     if ( fitresult != 0 ){
844     if ( debug ) printf(" The fit failed, no integrals calculation and asymm is set to -1. \n");
845     asymm = -1.;
846     } else {
847     Int_t npp = 1000;
848     double *xp=new double[npp];
849     double *wp=new double[npp];
850     lfit->CalcGaussLegendreSamplingPoints(npp,xp,wp,1e-12);
851     Float_t imax = lfit->IntegralFast(npp,xp,wp,0.,tmax);
852     // Float_t imax = lfit->Integral(0.,tmax);
853     if ( debug ) printf(" Integral till maximum (%f): %f \n",tmax,imax);
854     Int_t np = 1000;
855     double *x=new double[np];
856     double *w=new double[np];
857     lfit->CalcGaussLegendreSamplingPoints(np,x,w,1e-12);
858     Float_t i10max = lfit->IntegralFast(np,x,w,0.,10.*tmax);
859     delete x;
860     delete w;
861     delete xp;
862     delete wp;
863     // Float_t i10max = lfit->Integral(0.,10.*tmax);
864     if ( debug ) printf(" Integral: %f \n",i10max);
865     //
866     if ( i10max != imax ){
867     asymm = imax / (i10max-imax);
868     } else {
869     if ( debug ) printf(" i10max == imax, asymm undefined\n");
870     asymm = -2.;
871     };
872 mocchiut 1.4 if ( asymm != asymm ){
873     if ( debug ) printf(" asymm is nan \n");
874     asymm = -3.;
875     };
876 mocchiut 1.2 //lfit->Integral(0.,tmax)/(lfit->Integral(0.,10.*tmax)-lfit->Integral(0.,tmax));
877     if ( debug ) printf(" Asymmetry has been calculated \n");
878     };
879     //
880 mocchiut 1.4 if ( asymm < 0. || ndf <= 0. || chi2 < 0. || tmax < 0. ){
881     if ( debug ) printf(" Funny asymm||ndf||chi2||tmax values, fit failed \n");
882     fitresult = 100;
883     };
884     //
885 mocchiut 1.2 if ( draw ){
886     //
887     tc->cd();
888     // gStyle->SetOptStat(11111);
889     tc->SetTitle();
890     th->SetTitle("");
891     th->SetName("");
892     th->SetMarkerStyle(20);
893     // axis titles
894     th->SetXTitle("Depth [X0]");
895     th->SetYTitle("Energy [MIP]");
896     th->DrawCopy("Perror");
897     lfit->Draw("same");
898     tc->Modified();
899     tc->Update();
900     //
901     gStyle->SetLabelSize(0);
902     gStyle->SetNdivisions(1,"XY");
903     //
904 mocchiut 1.4 } else {
905     if ( th ) th->Delete();
906 mocchiut 1.2 };
907     //
908     delete lfit;
909     //
910     };
911    
912     void CaloLong::Draw(){
913     //
914     Process();
915     Draw(-1);
916     };
917    
918     void CaloLong::Draw(Int_t view){
919     //
920     Int_t minv = 0;
921     Int_t maxv = 0;
922     //
923     if ( view == -1 ){
924     maxv = -1;
925     } else {
926     minv = view;
927     maxv = view+1;
928     };
929     //
930     Process();
931     //
932     gStyle->SetLabelSize(0.04);
933     gStyle->SetNdivisions(510,"XY");
934     //
935     if ( maxv != -1 ){
936     for (Int_t v=minv; v<maxv;v++){
937     TString hid = Form("clongv%i",v);
938     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
939     if ( tc ){
940     // tc->Clear();
941     } else {
942     tc = new TCanvas(hid,hid);
943     };
944     //
945     TString thid = Form("hlongv%i",v);
946     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
947     if ( th ) th->Delete();
948     // th->Clear();
949     // th->Reset();
950     // } else {
951     th = new TH1F(thid,thid,22,-0.5,21.5);
952     // };
953     tc->cd();
954     //
955     for (Int_t st=0;st<22;st++){
956     th->Fill(st,eplane[v][st]);
957     };
958     th->Draw();
959     tc->Modified();
960     tc->Update();
961     };
962     } else {
963     //
964     TString hid = Form("clongvyvx");
965     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
966     if ( tc ){
967     } else {
968     tc = new TCanvas(hid,hid);
969     };
970     //
971     TString thid = Form("hlongvyvx");
972     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
973     if ( th ) th->Delete();
974     th = new TH1F(thid,thid,44,-0.5,43.5);
975     tc->cd();
976     Int_t pp=0;
977     for (Int_t st=0;st<22;st++){
978     for (Int_t v=1; v>=0;v--){
979     //
980     th->Fill(pp,eplane[v][st]);
981     //
982     pp++;
983     };
984     };
985     th->Draw();
986     tc->Modified();
987     tc->Update();
988     };
989     //
990     gStyle->SetLabelSize(0);
991     gStyle->SetNdivisions(1,"XY");
992     //
993     };
994    
995     void CaloLong::Delete(){
996     Clear();
997     //delete this;
998     };

  ViewVC Help
Powered by ViewVC 1.1.23