/[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.2 - (hide annotations) (download)
Mon Sep 22 20:08:25 2008 UTC (16 years, 4 months ago) by mocchiut
Branch: MAIN
Changes since 1.1: +616 -70 lines
Added -m32 flag for cross compilation on 64bit machines

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     //
463     };
464    
465     void CaloLong::Clear(){
466     //
467     memset(eplane,0, 2*22*sizeof(Float_t));
468     //
469     chi2 = 0.;
470     ndf = 0.;
471     E0 = 0.;
472     a = 0.;
473     b = 0.;
474     errE0 = 0.;
475     erra = 0.;
476     errb = 0.;
477     etmax = 0.;
478     asymm = 0.;
479     fitresult = 0;
480     //
481     X0pl = 0.76;
482     //
483     };
484    
485     void CaloLong::Print(){
486     //
487     Process();
488     //
489     printf("==================== Calorimeter Longitudinal Profile =======================\n");
490     printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime);
491     printf(" fitresult:.. %i\n",fitresult);
492     printf(" chi2 :.. %f\n",chi2);
493     printf(" ndf :.. %f\n",ndf);
494     printf(" nchi2 :.. %f\n",chi2/ndf);
495     printf(" E0 :.. %f\n",E0);
496     printf(" E0/260. :.. %f\n",E0/260.);
497     printf(" a :.. %f\n",a);
498     printf(" b :.. %f\n",b);
499     printf(" errE0 :.. %f\n",errE0);
500     printf(" erra :.. %f\n",erra);
501     printf(" errb :.. %f\n",errb);
502     printf(" asymm :.. %f\n",asymm);
503     printf(" tmax :.. %f\n",((a-1.)/b));
504     printf(" etmax :.. %f\n",etmax);
505     printf(" X0pl :.. %f\n",X0pl);
506     printf("========================================================================\n");
507     //
508     };
509    
510     void CaloLong::SetNoWpreSampler(Int_t n){
511     //
512     if ( NC+n <= 22 && NC+n >= 0 ){
513     N = n;
514     } else {
515     printf(" ERROR! Calorimeter is made of 22 W planes\n");
516     printf(" you are giving N presampler = %i and N calo = %i \n",n,NC);
517     printf(" WARNING: using default values NWpre = 0, NWcalo = 22\n");
518     NC = 22;
519     N = 0;
520     };
521     }
522    
523     void CaloLong::SetNoWcalo(Int_t n){
524     if ( N+n <= 22 && N+n >= 0 ){
525     NC = n;
526     } else {
527     printf(" ERROR! Calorimeter is made of 22 W planes\n");
528     printf(" you are giving N W presampler = %i and N W calo = %i \n",N,n);
529     printf(" WARNING: using default values NWpre = 0, NWcalo = 22\n");
530     NC = 22;
531     N = 0;
532     };
533     }
534    
535 mocchiut 1.1 void CaloLong::Process(){
536     //
537     if ( !L2 ){
538     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
539     printf(" ERROR: CaloHough variables not filled \n");
540     return;
541     };
542     //
543     Bool_t newentry = false;
544     //
545     if ( L2->IsORB() ){
546     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
547     newentry = true;
548     OBT = L2->GetOrbitalInfo()->OBT;
549     PKT = L2->GetOrbitalInfo()->pkt_num;
550     atime = L2->GetOrbitalInfo()->absTime;
551     };
552     } else {
553     newentry = true;
554     };
555     //
556     if ( !newentry ) return;
557     //
558     if ( debug ) printf(" Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
559     //
560     Clear();
561     //
562     // let's start
563     //
564 mocchiut 1.2 if ( cont ){
565     for (Int_t i=0; i<22; i++){
566     if ( i == (18+N) ){
567     mask18b = 18 + N;
568     break;
569     };
570     };
571     };
572     //
573     if ( sel ){
574     for (Int_t i=0; i<22; i++){
575     if ( i == (18-N) ){
576     mask18b = 18 - N;
577     break;
578     };
579     };
580     };
581     //
582     // if ( mask18b == 18 ) mask18b = -1;
583 mocchiut 1.1 //
584 mocchiut 1.2 Int_t view = 0;
585     Int_t plane = 0;
586     Int_t strip = 0;
587     Float_t mip = 0.;
588     for (Int_t i=0; i < L2->GetCaloLevel1()->istrip; i++){
589     mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
590     eplane[view][plane] += mip;
591     };
592     //
593     // inclination factor (steal from Daniele's code)
594     //
595     Float_t ytgx = 0;
596     Float_t ytgy = 0;
597     ytgx = 0.76 * L2->GetCaloLevel2()->tanx[0];
598     ytgy = 0.76 * L2->GetCaloLevel2()->tany[0];
599     X0pl = sqrt( pow(0.76,2.) + pow(ytgx,2.) + pow(ytgy,2.) );
600     //
601     // Find experimental plane of maximum
602     //
603     Int_t pmax = 0;
604     Int_t vmax = 0;
605     Float_t emax = 0.;
606 mocchiut 1.1 for (Int_t v=0; v<2; v++){
607     for (Int_t i=0; i<22; i++){
608 mocchiut 1.2 if ( eplane[v][i] > emax ){
609     emax = eplane[v][i];
610     vmax = v;
611     pmax = i;
612     };
613 mocchiut 1.1 };
614     };
615     //
616 mocchiut 1.2 //
617     //
618     if ( vmax == 0 ) pmax++;
619     etmax = pmax * X0pl;
620     //
621 mocchiut 1.1 if ( debug ) this->Print();
622     if ( debug ) printf(" exit \n");
623     //
624     };
625    
626 mocchiut 1.2
627     Double_t ccurve(Double_t *ti,Double_t *par){
628     //
629     Double_t t = *ti;
630     Double_t cE0 = par[0];
631     Double_t ca = par[1];
632     Double_t cb = par[2];
633     Double_t gammaa = TMath::Gamma(ca);
634     //
635     Double_t value = cE0 * cb * ( pow((cb * t),(ca - 1)) * exp( -cb * t ) ) / gammaa;
636     //
637     return value;
638     //
639     }
640    
641     void CaloLong::Fit(){
642     this->Fit(false);
643     };
644    
645     void CaloLong::Fit(Bool_t draw){
646     //
647     Process();
648     //
649     //
650     if ( !L2 ){
651     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
652     printf(" ERROR: CaloHough variables not filled \n");
653     return;
654     };
655     //
656     Bool_t newentry = false;
657     //
658     if ( L2->IsORB() ){
659     if ( L2->GetOrbitalInfo()->pkt_num != fPKT || L2->GetOrbitalInfo()->OBT != fOBT || L2->GetOrbitalInfo()->absTime != fatime ){
660     newentry = true;
661     fOBT = L2->GetOrbitalInfo()->OBT;
662     fPKT = L2->GetOrbitalInfo()->pkt_num;
663     fatime = L2->GetOrbitalInfo()->absTime;
664     };
665     } else {
666     newentry = true;
667     };
668     //
669     if ( !newentry ) return;
670     //
671     if ( debug ) printf(" Start fitting event at OBT %u PKT %u time %u \n",fOBT,fPKT,fatime);
672     //
673     if ( draw ){
674     gStyle->SetLabelSize(0.04);
675     gStyle->SetNdivisions(510,"XY");
676     };
677     //
678     TString hid = Form("clongfit");
679     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
680     // if ( tc ) tc->Delete();
681     // if ( tc ) tc->Close();
682     if ( !tc && draw ){
683     tc = new TCanvas(hid,hid);
684     } else {
685     if ( tc ) tc->cd();
686     };
687     //
688     TString thid = Form("hlongfit");
689     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
690     if ( th ) th->Delete();
691     Float_t xpos = 0.;
692     Float_t enemip = 0.;
693     Float_t xmax = NC * X0pl + 0.2;
694     // th = new TH1F(thid,thid,int(NC*1.5),-0.2,xmax);
695     th = new TH1F(thid,thid,100,-0.2,xmax);
696     //
697     for (Int_t st=N;st<(N+NC);st++){
698     enemip = 0.;
699     xpos = (st - N) * X0pl;
700     if ( st > N && st < (N+NC-1) ){
701     if ( no18x && ( st == 18+1 || st == mask18b+1 )){
702     enemip = 2. * eplane[1][st];
703     } else {
704     enemip = eplane[0][st-1] + eplane[1][st];
705     };
706     } else {
707     if ( st == N ) enemip = 2. * eplane[1][st];
708     if ( st == (N+NC-1) ) enemip = 2. * eplane[0][st];
709     };
710     //
711     if ( enemip > 0. ){
712     th->Fill(xpos,enemip);
713     if ( debug ) printf(" Filling: st %i xpos %f energy %f \n",st,xpos,enemip);
714     };
715     //
716     // for (Int_t v=1; v>=0;v--)// {
717     // //
718     // if ( v == 1 ){
719     // xpos = (st - N) * X0pl;
720     // } else {
721     // xpos = (st + 1 - N) * X0pl;
722     // };
723     // //
724     // if ( no18x && st == 18 && v == 0 ){
725     // // skip plane 18x
726     // } else {
727     // if ( v == 1 && st == mask18b ){
728     // // emulate plane 18x
729     // } else {
730     // if ( eplane[v][st] > 0. ){
731     // th->Fill(xpos,eplane[v][st]);
732     // if ( debug ) printf(" Filling: st %i v %i xpos %f energy %f \n",st,v,xpos,eplane[v][st]);
733     // };
734     // };
735     // };
736     // //
737     // };
738     };
739     //
740     TF1 *lfit = new TF1("lfit",ccurve,0.,xmax,3);
741     E0 = L2->GetCaloLevel2()->qtot;
742     a = 5.;
743     b = 0.5;
744     if ( debug ) printf(" STARTING PARAMETERS: E0 %f a %f b %f \n",E0,a,b);
745     lfit->SetParameters(E0,a,b);
746     // lfit->SetParLimits(0,0.,1000.);
747     // lfit->SetParLimits(1,-1.,80.);
748     // lfit->SetParLimits(2,-1.,10.);
749     TString optio;
750     if ( debug ){
751     // optio = "MERBOV";
752     // optio = "MEROV";
753     // optio = "EROV";
754     optio = "RNOV";
755     if ( draw ) optio = "ROV";
756     } else {
757     // optio = "MERNOQ";
758     // optio = "ERNOQ";
759     optio = "RNOQ";
760     if ( draw ) optio = "ROQ";
761     };
762     //
763     if ( debug ) printf(" OK, start the fitting procedure...\n");
764     //
765     fitresult = th->Fit("lfit",optio);
766     //
767     if ( debug ) printf(" the fit is done! result: %i \n",fitresult);
768     //
769     E0 = lfit->GetParameter(0);
770     a = lfit->GetParameter(1);
771     b = lfit->GetParameter(2);
772     errE0 = lfit->GetParError(0);
773     erra = lfit->GetParError(1);
774     errb = lfit->GetParError(2);
775     chi2 = lfit->GetChisquare();
776     ndf = lfit->GetNDF();
777     Float_t tmax = 0.;
778     if ( debug ) printf(" Parameters are retrieved \n");
779     if ( b != 0 ) tmax = (a - 1.)/b;
780     //
781     if ( fitresult != 0 ){
782     if ( debug ) printf(" The fit failed, no integrals calculation and asymm is set to -1. \n");
783     asymm = -1.;
784     } else {
785     Int_t npp = 1000;
786     double *xp=new double[npp];
787     double *wp=new double[npp];
788     lfit->CalcGaussLegendreSamplingPoints(npp,xp,wp,1e-12);
789     Float_t imax = lfit->IntegralFast(npp,xp,wp,0.,tmax);
790     // Float_t imax = lfit->Integral(0.,tmax);
791     if ( debug ) printf(" Integral till maximum (%f): %f \n",tmax,imax);
792     Int_t np = 1000;
793     double *x=new double[np];
794     double *w=new double[np];
795     lfit->CalcGaussLegendreSamplingPoints(np,x,w,1e-12);
796     Float_t i10max = lfit->IntegralFast(np,x,w,0.,10.*tmax);
797     delete x;
798     delete w;
799     delete xp;
800     delete wp;
801     // Float_t i10max = lfit->Integral(0.,10.*tmax);
802     if ( debug ) printf(" Integral: %f \n",i10max);
803     //
804     if ( i10max != imax ){
805     asymm = imax / (i10max-imax);
806     } else {
807     if ( debug ) printf(" i10max == imax, asymm undefined\n");
808     asymm = -2.;
809     };
810     //lfit->Integral(0.,tmax)/(lfit->Integral(0.,10.*tmax)-lfit->Integral(0.,tmax));
811     if ( debug ) printf(" Asymmetry has been calculated \n");
812     };
813     //
814     if ( draw ){
815     //
816     tc->cd();
817     // gStyle->SetOptStat(11111);
818     tc->SetTitle();
819     th->SetTitle("");
820     th->SetName("");
821     th->SetMarkerStyle(20);
822     // axis titles
823     th->SetXTitle("Depth [X0]");
824     th->SetYTitle("Energy [MIP]");
825     th->DrawCopy("Perror");
826     lfit->Draw("same");
827     tc->Modified();
828     tc->Update();
829     //
830     gStyle->SetLabelSize(0);
831     gStyle->SetNdivisions(1,"XY");
832     //
833     };
834     //
835     delete lfit;
836     //
837     };
838    
839     void CaloLong::Draw(){
840     //
841     Process();
842     Draw(-1);
843     };
844    
845     void CaloLong::Draw(Int_t view){
846     //
847     Int_t minv = 0;
848     Int_t maxv = 0;
849     //
850     if ( view == -1 ){
851     maxv = -1;
852     } else {
853     minv = view;
854     maxv = view+1;
855     };
856     //
857     Process();
858     //
859     gStyle->SetLabelSize(0.04);
860     gStyle->SetNdivisions(510,"XY");
861     //
862     if ( maxv != -1 ){
863     for (Int_t v=minv; v<maxv;v++){
864     TString hid = Form("clongv%i",v);
865     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
866     if ( tc ){
867     // tc->Clear();
868     } else {
869     tc = new TCanvas(hid,hid);
870     };
871     //
872     TString thid = Form("hlongv%i",v);
873     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
874     if ( th ) th->Delete();
875     // th->Clear();
876     // th->Reset();
877     // } else {
878     th = new TH1F(thid,thid,22,-0.5,21.5);
879     // };
880     tc->cd();
881     //
882     for (Int_t st=0;st<22;st++){
883     th->Fill(st,eplane[v][st]);
884     };
885     th->Draw();
886     tc->Modified();
887     tc->Update();
888     };
889     } else {
890     //
891     TString hid = Form("clongvyvx");
892     TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
893     if ( tc ){
894     } else {
895     tc = new TCanvas(hid,hid);
896     };
897     //
898     TString thid = Form("hlongvyvx");
899     TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
900     if ( th ) th->Delete();
901     th = new TH1F(thid,thid,44,-0.5,43.5);
902     tc->cd();
903     Int_t pp=0;
904     for (Int_t st=0;st<22;st++){
905     for (Int_t v=1; v>=0;v--){
906     //
907     th->Fill(pp,eplane[v][st]);
908     //
909     pp++;
910     };
911     };
912     th->Draw();
913     tc->Modified();
914     tc->Update();
915     };
916     //
917     gStyle->SetLabelSize(0);
918     gStyle->SetNdivisions(1,"XY");
919     //
920     };
921    
922     void CaloLong::Delete(){
923     Clear();
924     //delete this;
925     };

  ViewVC Help
Powered by ViewVC 1.1.23