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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.5 - (show 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 #include <CaloProfile.h>
2 //
3 ClassImp(CaloLat);
4 ClassImp(CaloLong);
5 ClassImp(Calo2D);
6
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 Calo2D::Calo2D(){
68 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 Calo2D::Calo2D(PamLevel2 *l2p){
88 //
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 void Calo2D::Clear(){
108 //
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 void Calo2D::Print(){
124 //
125 Process();
126 //
127 printf("==================== Calorimeter 2D Profile =======================\n");
128 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 void Calo2D::Draw(){
142 //
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 void Calo2D::Draw(Int_t plane){
210 //
211 Int_t minp = 0;
212 Int_t maxp = 0;
213 //
214 if ( plane == -1 ){
215 minp = 0;
216 maxp = 23;
217 } else {
218 minp = plane;
219 maxp = plane+1;
220 };
221 //
222 Process();
223 //
224 gStyle->SetLabelSize(0.04);
225 gStyle->SetNdivisions(510,"XY");
226 //
227 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 };
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 void Calo2D::Delete(){
285 Clear();
286 //delete this;
287 };
288
289
290 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 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 maskXE = false;
463 maskXO = false;
464 maskYE = false;
465 maskYO = false;
466 //
467 };
468
469 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 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 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 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 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 //
608 Int_t view = 0;
609 Int_t plane = 0;
610 Int_t strip = 0;
611 Float_t mip = 0.;
612 Bool_t gof = true;
613 for (Int_t i=0; i < L2->GetCaloLevel1()->istrip; i++){
614 mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
615 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 };
622 //
623 // inclination factor (stolen from Daniele's code)
624 //
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 for (Int_t v=0; v<2; v++){
637 for (Int_t i=0; i<22; i++){
638 if ( eplane[v][i] > emax ){
639 emax = eplane[v][i];
640 vmax = v;
641 pmax = i;
642 };
643 };
644 };
645 //
646 //
647 //
648 if ( vmax == 0 ) pmax++;
649 etmax = pmax * X0pl;
650 //
651 if ( debug ) this->Print();
652 if ( debug ) printf(" exit \n");
653 //
654 };
655
656
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 // 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 enemip = 0.;
742 xpos = (st - mmin) * X0pl;
743 if ( st > mmin && st < mmax ){
744 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 if ( st == mmin ) enemip = 2. * eplane[1][st];
751 if ( st == mmax ) enemip = 2. * eplane[0][st-1];
752 };
753 //
754 qtotparz += enemip;
755 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 if ( debug ) printf("qtot %f qtotparz %f \n",L2->GetCaloLevel2()->qtot,qtotparz);
786 E0 = qtotparz;
787 // E0 = L2->GetCaloLevel2()->qtot;
788 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 if ( asymm != asymm ){
857 if ( debug ) printf(" asymm is nan \n");
858 asymm = -3.;
859 };
860 //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 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 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 } else {
889 if ( th ) th->Delete();
890 };
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