/[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.3 - (hide annotations) (download)
Thu Dec 18 21:05:53 2008 UTC (16 years, 1 month ago) by mocchiut
Branch: MAIN
Changes since 1.2: +12 -0 lines
Method SplitInto(int,int) added

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

  ViewVC Help
Powered by ViewVC 1.1.23