/[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.5 - (hide annotations) (download)
Tue Jun 16 14:30:09 2009 UTC (15 years, 7 months ago) by mocchiut
Branch: MAIN
Changes since 1.4: +19 -1 lines
Mask calorimeter sections feature added in CaloLong class

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     Process();
500     //
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     enemip = 2. * eplane[1][st];
746     } else {
747     enemip = eplane[0][st-1] + eplane[1][st];
748     };
749     } else {
750 mocchiut 1.4 if ( st == mmin ) enemip = 2. * eplane[1][st];
751     if ( st == mmax ) enemip = 2. * eplane[0][st-1];
752 mocchiut 1.2 };
753     //
754 mocchiut 1.4 qtotparz += enemip;
755 mocchiut 1.2 if ( enemip > 0. ){
756     th->Fill(xpos,enemip);
757     if ( debug ) printf(" Filling: st %i xpos %f energy %f \n",st,xpos,enemip);
758     };
759     //
760     // for (Int_t v=1; v>=0;v--)// {
761     // //
762     // if ( v == 1 ){
763     // xpos = (st - N) * X0pl;
764     // } else {
765     // xpos = (st + 1 - N) * X0pl;
766     // };
767     // //
768     // if ( no18x && st == 18 && v == 0 ){
769     // // skip plane 18x
770     // } else {
771     // if ( v == 1 && st == mask18b ){
772     // // emulate plane 18x
773     // } else {
774     // if ( eplane[v][st] > 0. ){
775     // th->Fill(xpos,eplane[v][st]);
776     // if ( debug ) printf(" Filling: st %i v %i xpos %f energy %f \n",st,v,xpos,eplane[v][st]);
777     // };
778     // };
779     // };
780     // //
781     // };
782     };
783     //
784     TF1 *lfit = new TF1("lfit",ccurve,0.,xmax,3);
785 mocchiut 1.4 if ( debug ) printf("qtot %f qtotparz %f \n",L2->GetCaloLevel2()->qtot,qtotparz);
786     E0 = qtotparz;
787     // E0 = L2->GetCaloLevel2()->qtot;
788 mocchiut 1.2 a = 5.;
789     b = 0.5;
790     if ( debug ) printf(" STARTING PARAMETERS: E0 %f a %f b %f \n",E0,a,b);
791     lfit->SetParameters(E0,a,b);
792     // lfit->SetParLimits(0,0.,1000.);
793     // lfit->SetParLimits(1,-1.,80.);
794     // lfit->SetParLimits(2,-1.,10.);
795     TString optio;
796     if ( debug ){
797     // optio = "MERBOV";
798     // optio = "MEROV";
799     // optio = "EROV";
800     optio = "RNOV";
801     if ( draw ) optio = "ROV";
802     } else {
803     // optio = "MERNOQ";
804     // optio = "ERNOQ";
805     optio = "RNOQ";
806     if ( draw ) optio = "ROQ";
807     };
808     //
809     if ( debug ) printf(" OK, start the fitting procedure...\n");
810     //
811     fitresult = th->Fit("lfit",optio);
812     //
813     if ( debug ) printf(" the fit is done! result: %i \n",fitresult);
814     //
815     E0 = lfit->GetParameter(0);
816     a = lfit->GetParameter(1);
817     b = lfit->GetParameter(2);
818     errE0 = lfit->GetParError(0);
819     erra = lfit->GetParError(1);
820     errb = lfit->GetParError(2);
821     chi2 = lfit->GetChisquare();
822     ndf = lfit->GetNDF();
823     Float_t tmax = 0.;
824     if ( debug ) printf(" Parameters are retrieved \n");
825     if ( b != 0 ) tmax = (a - 1.)/b;
826     //
827     if ( fitresult != 0 ){
828     if ( debug ) printf(" The fit failed, no integrals calculation and asymm is set to -1. \n");
829     asymm = -1.;
830     } else {
831     Int_t npp = 1000;
832     double *xp=new double[npp];
833     double *wp=new double[npp];
834     lfit->CalcGaussLegendreSamplingPoints(npp,xp,wp,1e-12);
835     Float_t imax = lfit->IntegralFast(npp,xp,wp,0.,tmax);
836     // Float_t imax = lfit->Integral(0.,tmax);
837     if ( debug ) printf(" Integral till maximum (%f): %f \n",tmax,imax);
838     Int_t np = 1000;
839     double *x=new double[np];
840     double *w=new double[np];
841     lfit->CalcGaussLegendreSamplingPoints(np,x,w,1e-12);
842     Float_t i10max = lfit->IntegralFast(np,x,w,0.,10.*tmax);
843     delete x;
844     delete w;
845     delete xp;
846     delete wp;
847     // Float_t i10max = lfit->Integral(0.,10.*tmax);
848     if ( debug ) printf(" Integral: %f \n",i10max);
849     //
850     if ( i10max != imax ){
851     asymm = imax / (i10max-imax);
852     } else {
853     if ( debug ) printf(" i10max == imax, asymm undefined\n");
854     asymm = -2.;
855     };
856 mocchiut 1.4 if ( asymm != asymm ){
857     if ( debug ) printf(" asymm is nan \n");
858     asymm = -3.;
859     };
860 mocchiut 1.2 //lfit->Integral(0.,tmax)/(lfit->Integral(0.,10.*tmax)-lfit->Integral(0.,tmax));
861     if ( debug ) printf(" Asymmetry has been calculated \n");
862     };
863     //
864 mocchiut 1.4 if ( asymm < 0. || ndf <= 0. || chi2 < 0. || tmax < 0. ){
865     if ( debug ) printf(" Funny asymm||ndf||chi2||tmax values, fit failed \n");
866     fitresult = 100;
867     };
868     //
869 mocchiut 1.2 if ( draw ){
870     //
871     tc->cd();
872     // gStyle->SetOptStat(11111);
873     tc->SetTitle();
874     th->SetTitle("");
875     th->SetName("");
876     th->SetMarkerStyle(20);
877     // axis titles
878     th->SetXTitle("Depth [X0]");
879     th->SetYTitle("Energy [MIP]");
880     th->DrawCopy("Perror");
881     lfit->Draw("same");
882     tc->Modified();
883     tc->Update();
884     //
885     gStyle->SetLabelSize(0);
886     gStyle->SetNdivisions(1,"XY");
887     //
888 mocchiut 1.4 } else {
889     if ( th ) th->Delete();
890 mocchiut 1.2 };
891     //
892     delete lfit;
893     //
894     };
895    
896     void CaloLong::Draw(){
897     //
898     Process();
899     Draw(-1);
900     };
901    
902     void CaloLong::Draw(Int_t view){
903     //
904     Int_t minv = 0;
905     Int_t maxv = 0;
906     //
907     if ( view == -1 ){
908     maxv = -1;
909     } else {
910     minv = view;
911     maxv = view+1;
912     };
913     //
914     Process();
915     //
916     gStyle->SetLabelSize(0.04);
917     gStyle->SetNdivisions(510,"XY");
918     //
919     if ( maxv != -1 ){
920     for (Int_t v=minv; v<maxv;v++){
921     TString hid = Form("clongv%i",v);
922     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
923     if ( tc ){
924     // tc->Clear();
925     } else {
926     tc = new TCanvas(hid,hid);
927     };
928     //
929     TString thid = Form("hlongv%i",v);
930     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
931     if ( th ) th->Delete();
932     // th->Clear();
933     // th->Reset();
934     // } else {
935     th = new TH1F(thid,thid,22,-0.5,21.5);
936     // };
937     tc->cd();
938     //
939     for (Int_t st=0;st<22;st++){
940     th->Fill(st,eplane[v][st]);
941     };
942     th->Draw();
943     tc->Modified();
944     tc->Update();
945     };
946     } else {
947     //
948     TString hid = Form("clongvyvx");
949     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
950     if ( tc ){
951     } else {
952     tc = new TCanvas(hid,hid);
953     };
954     //
955     TString thid = Form("hlongvyvx");
956     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
957     if ( th ) th->Delete();
958     th = new TH1F(thid,thid,44,-0.5,43.5);
959     tc->cd();
960     Int_t pp=0;
961     for (Int_t st=0;st<22;st++){
962     for (Int_t v=1; v>=0;v--){
963     //
964     th->Fill(pp,eplane[v][st]);
965     //
966     pp++;
967     };
968     };
969     th->Draw();
970     tc->Modified();
971     tc->Update();
972     };
973     //
974     gStyle->SetLabelSize(0);
975     gStyle->SetNdivisions(1,"XY");
976     //
977     };
978    
979     void CaloLong::Delete(){
980     Clear();
981     //delete this;
982     };

  ViewVC Help
Powered by ViewVC 1.1.23