/[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.19 - (hide annotations) (download)
Tue May 18 04:03:29 2010 UTC (14 years, 8 months ago) by mocchiut
Branch: MAIN
CVS Tags: HEAD
Changes since 1.18: +5 -4 lines
Small update

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 mocchiut 1.9
8     int isempty(struct stack *s){
9     return (s->top == EMPTY) ? 1 : 0;
10     }
11    
12     void emptystack(struct stack* s){
13     s->top=EMPTY;
14     strcpy(s->data," ");
15     }
16    
17     void push(struct stack* s,int item){
18     if(s->top == (MAX-1)){
19     printf("\n ERROR! STACK FULL (too many digits in SetLower/UpperLimit)\n");
20     } else {
21     s->data[++s->top]=(char)item;
22     };
23     }
24    
25     char pop(struct stack* s){
26     char ret=(char)EMPTY;
27     if(!isempty(s)){
28     ret= s->data[s->top--];
29     };
30     return ret;
31     }
32    
33    
34     int ipop(struct stack* s){
35     int ret=EMPTY;
36     if(s->top == EMPTY)
37     printf("\n ERROR! STACK EMPTY (too few digits in SetLower/UpperLimit)\n");
38     else {
39     ret= s->data[s->top--];
40     };
41     return ret;
42     }
43    
44    
45     void display(struct stack s){
46     int ss = s.top;
47     while(s.top != EMPTY){
48     printf("\n%d",s.data[s.top--]);
49     };
50     printf(" s.top %i \n",ss);
51     }
52    
53     int isoperator(char e){
54     if(e == '+' || e == '-' || e == '*' || e == '/' || e == '%')
55     return 1;
56     else
57     return 0;
58     }
59    
60    
61     int priority(char e){
62     int pri = 0;
63     if(e == '*' || e == '/' || e =='%')
64     pri = 2;
65     else {
66     if(e == '+' || e == '-') pri = 1;
67     };
68     return pri;
69     }
70    
71     void infix2postfix(char* infix, char * postfix, int insertspace){
72     char *i,*p;
73     struct stack X;
74     char n1;
75     emptystack(&X);
76     i = &infix[0];
77     p = &postfix[0];
78     while(*i){
79     while(*i == ' ' || *i == '\t' ){
80     i++;
81     };
82     TString c=i;
83     if( isdigit(*i) || isalpha(*i) || c.BeginsWith(".") ){
84     while( isdigit(*i) || isalpha(*i) || c.BeginsWith(".") ){
85     *p = *i;
86     p++;
87     i++;
88     c=i;
89     };
90     /*SPACE CODE*/
91     if(insertspace){
92     *p = ' ';
93     p++;
94     };
95     /*END SPACE CODE*/
96     };
97     if( *i == '(' ){
98     push(&X,*i);
99     i++;
100     };
101     if( *i == ')'){
102     n1 = pop(&X);
103     while( n1 != '(' ){
104     *p = n1;
105     p++;
106     /*SPACE CODE*/
107     if(insertspace){
108     *p = ' ';
109     p++;
110     };
111     /*END SPACE CODE*/
112     n1 = pop(&X);
113     };
114     i++;
115     };
116     if( isoperator(*i) ){
117     if(isempty(&X)){
118     push(&X,*i);
119     } else {
120     n1 = pop(&X);
121     while( priority(n1) >= priority(*i) ){
122     *p = n1;
123     p++;
124     /*SPACE CODE*/
125     if(insertspace){
126     *p = ' ';
127     p++;
128     };
129     /*END SPACE CODE*/
130     n1 = pop(&X);
131     };
132     push(&X,n1);
133     push(&X,*i);
134     };
135     i++;
136     };
137     };
138     while(!isempty(&X)){
139     n1 = pop(&X);
140     *p = n1;
141     p++;
142     /*SPACE CODE*/
143     if(insertspace){
144     *p = ' ';
145     p++;
146     };
147     /*END SPACE CODE*/
148     };
149     *p = '\0';
150     }
151    
152    
153     Float_t evaluate(char *postfix){
154     //
155     Float_t op1 = 0.;
156     Float_t op2 = 0.;
157     Float_t result = 0.;
158     //
159     TString e = postfix;
160     Float_t st[50];
161     memset(st,0,50*sizeof(Float_t));
162     TObjArray *ae = e.Tokenize(" ");
163     Int_t o = 0;
164     Int_t a = 0;
165     Int_t ap = 0;
166     //
167     while ( o < ae->GetEntries() ){
168     if ( ((TString)(((TObjString*)ae->At(o))->GetString())).IsFloat() ){
169     st[a] = (Float_t)((TString)(((TObjString*)ae->At(o))->GetString())).Atof();;
170     a++;
171     } else {
172     ap = a-1;
173     op1 = st[ap--];
174     op2 = st[ap];
175     const char *p=((TString)(((TObjString*)ae->At(o))->GetString())).Data();
176     switch(*p){
177     case '+':
178     result = op2 + op1;
179     break;
180     case '-':
181     result = op2 - op1;
182     break;
183     case '/':
184     result = op2 / op1;
185     break;
186     case '*':
187     result = op2 * op1;
188     break;
189     case '%':
190     result = (Int_t)round(op2) % (Int_t)round(op1);
191     break;
192     default:
193     printf("\nInvalid Operator: %s \n",((TString)(((TObjString*)ae->At(o))->GetString())).Data());
194     return 0;
195     };
196     st[ap] = result;
197     a = ap+1;
198     //
199     };
200     o++;
201     };
202     return result;
203     //
204     }
205    
206    
207    
208 mocchiut 1.1 ////////////////////////////////////////////////////////////////////////
209     /**
210     * 1-dimension function describing lateral distribution of the
211     * shower as viewed by calorimeter
212     * (projection of 3d function in one direction)
213     *
214     * xi[0] = x or y coordinate relative to shower axis
215     * parmin[0] = rt
216     * parmin[1] = p
217     * parmin[2] = rc
218     *
219     */
220     ////////////////////////////////////////////////////////////////////////
221     Double_t cfradx(Double_t *xi, Double_t *parmin) {
222    
223     double fradxmin2,p,rt,rc,es,x,pig,norm,c;
224     x=*xi;
225     pig = acos(-1.);
226     rt=parmin[0];
227     p=parmin[1];
228     rc=parmin[2];
229     norm=parmin[3];
230     c=parmin[4];
231     x=x-c;
232     es=1.5;
233     fradxmin2=p*pig*pow(rc,2)/pow((pow(x,2)+pow(rc,2)),es);
234     fradxmin2=fradxmin2+(1-p)*pig*pow(rt,2)/pow((pow(x,2)+pow(rt,2)),es);
235     fradxmin2=norm*fradxmin2/(2*pig);
236     //cout<<"x,fradxmin2 "<< x<<" "<<fradxmin2 <<endl;
237     return fradxmin2;
238     }
239    
240    
241     Double_t cfunc(Double_t *tin,Double_t *par)
242     {
243    
244     Double_t gaa,a,tm,et,value,t,t0;
245     t=*tin;
246     et=par[0];
247     a=par[1];
248     tm=par[2];
249     t0=par[3];
250     gaa=TMath::Gamma(a);
251    
252     value=et*((a-1)/(tm*gaa))*pow(((a-1)*(t-t0)/tm),(a-1))*exp(-(a-1)*(t-t0)/tm);
253     return value;
254     }
255    
256    
257     //--------------------------------------
258     /**
259     * Default constructor
260     */
261     CaloLat::CaloLat(){
262     Clear();
263     };
264    
265     /**
266     * Default constructor
267     */
268 mocchiut 1.2 Calo2D::Calo2D(){
269 mocchiut 1.1 Clear();
270     };
271    
272     CaloLat::CaloLat(PamLevel2 *l2p){
273     //
274     Clear();
275     //
276     L2 = l2p;
277     //
278     if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
279     //
280     OBT = 0;
281     PKT = 0;
282     atime = 0;
283     //
284 mocchiut 1.13 suf = "";
285 mocchiut 1.1 debug = false;
286 mocchiut 1.17 usepl18x = false;
287 mocchiut 1.1 //
288     };
289    
290 mocchiut 1.2 Calo2D::Calo2D(PamLevel2 *l2p){
291 mocchiut 1.1 //
292     Clear();
293     //
294     L2 = l2p;
295     //
296     if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
297     //
298     OBT = 0;
299     PKT = 0;
300     atime = 0;
301     //
302 mocchiut 1.13 suf = "";
303 mocchiut 1.1 debug = false;
304 mocchiut 1.17 usepl18x = false;
305 mocchiut 1.1 //
306     };
307    
308     void CaloLat::Clear(){
309     //
310     };
311    
312 mocchiut 1.2 void Calo2D::Clear(){
313 mocchiut 1.1 //
314     };
315    
316     void CaloLat::Print(){
317     //
318     Process();
319     //
320     printf("==================== Calorimeter Lateral Profile =======================\n");
321     printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime);
322     // printf(" nx [number of X combination]:.. %i\n",nx);
323     // printf(" ny [number of Y combination]:.. %i\n",ny);
324     printf("========================================================================\n");
325     //
326     };
327    
328 mocchiut 1.2 void Calo2D::Print(){
329 mocchiut 1.1 //
330     Process();
331     //
332 mocchiut 1.2 printf("==================== Calorimeter 2D Profile =======================\n");
333 mocchiut 1.1 printf(" OBT: %u PKT: %u ATIME: %u \n",OBT,PKT,atime);
334     // printf(" nx [number of X combination]:.. %i\n",nx);
335     // printf(" ny [number of Y combination]:.. %i\n",ny);
336     printf("========================================================================\n");
337     //
338     };
339    
340     void CaloLat::Draw(){
341     //
342     Process();
343     Draw(-1,-1);
344     };
345    
346 mocchiut 1.2 void Calo2D::Draw(){
347 mocchiut 1.1 //
348     Process();
349     Draw(-1);
350     };
351    
352     void CaloLat::Draw(Int_t view,Int_t plane){
353     //
354     Int_t minv = 0;
355     Int_t maxv = 0;
356     Int_t minp = 0;
357     Int_t maxp = 0;
358     //
359     if ( view == -1 ){
360     minv = 0;
361     maxv = 2;
362     } else {
363     minv = view;
364     maxv = view+1;
365     };
366    
367     if ( plane == -1 ){
368     minp = 0;
369     maxp = 22;
370     } else {
371     minp = plane;
372     maxp = plane+1;
373     };
374     //
375     Process();
376     //
377     gStyle->SetLabelSize(0.04);
378     gStyle->SetNdivisions(510,"XY");
379     //
380     for (Int_t v=minv; v<maxv;v++){
381     for (Int_t p=minp; p<maxp;p++){
382 mocchiut 1.13 TString hid = Form("clatv%ip%i%s",v,p,suf.Data());
383 mocchiut 1.1 TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
384     if ( tc ){
385     // tc->Clear();
386     } else {
387     tc = new TCanvas(hid,hid);
388     };
389     //
390 mocchiut 1.13 TString thid = Form("hlatv%ip%i%s",v,p,suf.Data());
391 mocchiut 1.1 TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
392     if ( th ) th->Delete();
393     // th->Clear();
394     // th->Reset();
395     // } else {
396     th = new TH1F(thid,thid,96,-0.5,95.5);
397     // };
398     tc->cd();
399     //
400     for (Int_t st=0;st<96;st++){
401     th->Fill(st,estrip[v][p][st]);
402     };
403     th->Draw();
404     tc->Modified();
405     tc->Update();
406     };
407     };
408     //
409     gStyle->SetLabelSize(0);
410     gStyle->SetNdivisions(1,"XY");
411     //
412     };
413    
414 mocchiut 1.2 void Calo2D::Draw(Int_t plane){
415 mocchiut 1.1 //
416 mocchiut 1.2 Int_t minp = 0;
417     Int_t maxp = 0;
418 mocchiut 1.1 //
419 mocchiut 1.2 if ( plane == -1 ){
420     minp = 0;
421     maxp = 23;
422 mocchiut 1.1 } else {
423 mocchiut 1.2 minp = plane;
424     maxp = plane+1;
425 mocchiut 1.1 };
426     //
427     Process();
428     //
429     gStyle->SetLabelSize(0.04);
430     gStyle->SetNdivisions(510,"XY");
431     //
432 mocchiut 1.2 for (Int_t p=minp; p<maxp;p++){
433 mocchiut 1.13 TString hid = Form("c2dp%i%s",p,suf.Data());
434 mocchiut 1.2 TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
435     if ( tc ){
436     // tc->Clear();
437     } else {
438     tc = new TCanvas(hid,hid);
439     };
440     //
441 mocchiut 1.13 TString thid = Form("h2dp%i%s",p,suf.Data());
442 mocchiut 1.2 TH2F *th = dynamic_cast<TH2F*>(gDirectory->FindObject(thid));
443     if ( th ) th->Delete();
444     // th->Clear();
445     // th->Reset();
446     // } else {
447     Int_t minx = smax[p] - 10;
448     if ( minx < 0 ) minx = 0;
449     Int_t maxx = minx + 20;
450     if ( maxx > 95 ){
451     maxx = 95;
452     minx = 75;
453     };
454     Int_t miny = smay[p] - 10;
455     if ( miny < 0 ) miny = 0;
456     Int_t maxy = miny + 20;
457     if ( maxy > 95 ){
458     maxy = 95;
459     miny = 75;
460     };
461     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);
462     // th = new TH2F(thid,thid,96,-0.5,95.5,96,-0.5,95.5);
463     // };
464     tc->cd();
465     //
466     for (Int_t stx=minx;stx<maxx+1;stx++){
467     for (Int_t sty=miny;sty<maxy+1;sty++){
468     th->Fill(stx,sty,estrip[p][stx][sty]);
469     };
470     };
471     gStyle->SetPalette(1);
472     // tc->SetLogz();
473     // th->Draw("colbox");
474     th->Draw("cont4");
475     tc->Modified();
476     tc->Update();
477 mocchiut 1.1 };
478     //
479     gStyle->SetLabelSize(0);
480     gStyle->SetNdivisions(1,"XY");
481     //
482     };
483    
484     void CaloLat::Delete(){
485     Clear();
486     //delete this;
487     };
488    
489 mocchiut 1.2 void Calo2D::Delete(){
490 mocchiut 1.1 Clear();
491     //delete this;
492     };
493    
494 mocchiut 1.2
495 mocchiut 1.1 void CaloLat::Process(){
496     //
497     if ( !L2 ){
498     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
499     printf(" ERROR: CaloHough variables not filled \n");
500     return;
501     };
502     //
503     Bool_t newentry = false;
504     //
505     if ( L2->IsORB() ){
506     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
507     newentry = true;
508     OBT = L2->GetOrbitalInfo()->OBT;
509     PKT = L2->GetOrbitalInfo()->pkt_num;
510     atime = L2->GetOrbitalInfo()->absTime;
511     };
512     } else {
513     newentry = true;
514     };
515     //
516     if ( !newentry ) return;
517     //
518     if ( debug ) printf(" Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
519     //
520     Clear();
521     //
522     // let's start
523     //
524     memset(estrip,0, 4224*sizeof(Float_t));
525     Float_t mip1 = 0.;
526     Int_t view1 = 0;
527     Int_t plane1 = 0;
528     Int_t strip1 = 0;
529     //
530     for (Int_t i=0; i<L2->GetCaloLevel1()->istrip ; i++){
531     mip1 = L2->GetCaloLevel1()->DecodeEstrip(i,view1,plane1,strip1);
532 mocchiut 1.17 //
533     if ( !usepl18x && view1==0 && plane1==18 ) mip1 = 0.;
534     //
535 mocchiut 1.1 estrip[view1][plane1][strip1] = mip1;
536     };
537     //
538     if ( debug ) this->Print();
539     if ( debug ) printf(" exit \n");
540     //
541     };
542    
543 mocchiut 1.2 void Calo2D::Process(){
544     //
545     if ( !L2 ){
546     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
547     printf(" ERROR: CaloHough variables not filled \n");
548     return;
549     };
550     //
551     Bool_t newentry = false;
552     //
553     if ( L2->IsORB() ){
554     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
555     newentry = true;
556     OBT = L2->GetOrbitalInfo()->OBT;
557     PKT = L2->GetOrbitalInfo()->pkt_num;
558     atime = L2->GetOrbitalInfo()->absTime;
559     };
560     } else {
561     newentry = true;
562     };
563     //
564     if ( !newentry ) return;
565     //
566     if ( debug ) printf(" Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
567     //
568     Clear();
569     //
570     // let's start
571     //
572     Float_t es[2][22][96];
573     memset(es,0, 4224*sizeof(Float_t));
574     memset(estrip,0, 4224*sizeof(Float_t));
575     Float_t mip1 = 0.;
576     Int_t view1 = 0;
577     Int_t plane1 = 0;
578     Int_t strip1 = 0;
579     //
580     for (Int_t i=0; i<L2->GetCaloLevel1()->istrip ; i++){
581     mip1 = L2->GetCaloLevel1()->DecodeEstrip(i,view1,plane1,strip1);
582 mocchiut 1.17 //
583     if ( !usepl18x && view1==0 && plane1==18 ) mip1 = 0.;
584     //
585 mocchiut 1.2 es[view1][plane1][strip1] = mip1;
586     };
587     //
588     Int_t plane2 = 0;
589     Float_t emax[23];
590     memset(emax,0,sizeof(Float_t)*23);
591     memset(smax,0,sizeof(Int_t)*23);
592     memset(smay,0,sizeof(Int_t)*23);
593     //
594     //
595     for (Int_t p=0; p < 23 ; p++){
596     //
597     plane1 = p-1;
598     plane2 = p;
599     //
600     if ( p == 0 ){
601     plane1 = -1;
602     plane2 = 0;
603     };
604     if ( p == 22 ){
605     plane1 = 21;
606     plane2 = -1;
607     };
608     //
609     for (Int_t s=0; s < 96 ; s++){ // x
610     for (Int_t ss=0; ss < 96 ; ss++){ // y
611     if ( p == 0 ){
612     estrip[p][s][ss] += es[1][plane2][ss];
613     if ( (es[1][plane2][ss]) > emax[p] ){
614     smax[p] = 45;
615     smay[p] = ss;
616     emax[p] = es[1][plane2][ss] ;
617     };
618     };
619     if ( p > 0 && p < 22 ){
620     estrip[p][s][ss] += es[0][plane1][s] + es[1][plane2][ss];
621     if ( (es[0][plane1][s] + es[1][plane2][ss]) > emax[p] ){
622     smax[p] = s;
623     smay[p] = ss;
624     emax[p] = es[0][plane1][s] + es[1][plane2][ss] ;
625     };
626     };
627     if ( p == 22 ){
628     estrip[p][s][ss] += es[0][plane1][s];
629     if ( (es[1][plane2][s]) > emax[p] ){
630     smax[p] = s;
631     smay[p] = 45;
632     emax[p] = es[1][plane2][s] ;
633     };
634     };
635     };
636     };
637     //
638     };
639     //
640     if ( debug ) this->Print();
641     if ( debug ) printf(" exit \n");
642     //
643     };
644    
645    
646     /**
647     * Default constructor
648     */
649     CaloLong::CaloLong(){
650     Clear();
651     };
652    
653     CaloLong::CaloLong(PamLevel2 *l2p){
654     //
655     Clear();
656     //
657     L2 = l2p;
658     //
659     if ( !L2->IsORB() ) printf(" WARNING: OrbitalInfo Tree is needed, the plugin could not work properly without it \n");
660     //
661     OBT = 0;
662     PKT = 0;
663     atime = 0;
664     //
665 mocchiut 1.8 clp = L2->GetCaloLevel2();
666     //
667 mocchiut 1.2 sel = true;
668     cont = false;
669     N = 0;
670     NC = 22;
671     mask18b = -1;
672     //
673     no18x = true;
674 mocchiut 1.17 usepl18x = !no18x;
675 mocchiut 1.2 debug = false;
676 mocchiut 1.5 maskXE = false;
677     maskXO = false;
678     maskYE = false;
679     maskYO = false;
680 mocchiut 1.2 //
681 mocchiut 1.9 lmax = 0.;
682     umax = 100.;
683     slmax = "";
684     sumax = "";
685 mocchiut 1.13 suf = "";
686 mocchiut 1.11 xyaverage = true;
687 mocchiut 1.9 //
688 mocchiut 1.14 letmax = -1;
689     heavytail = false;
690 mocchiut 1.16 // lmipth = 100.;
691     lmipth = 0.;
692 mocchiut 1.14 //
693 mocchiut 1.19 lfit = 0;
694 mocchiut 1.2 };
695    
696 mocchiut 1.18 TF1 *CaloLong::GetFit(){
697 mocchiut 1.19 // TString fnam=Form("lfit%s",suf.Data());
698     // TF1 *lfit = dynamic_cast<TF1*>(gDirectory->FindObject(fnam));
699 mocchiut 1.18 if ( lfit ) return lfit;
700     return NULL;
701     }
702    
703 mocchiut 1.5 void CaloLong::MaskSection(TString sec){
704     sec.ToUpper();
705     if ( sec.Contains("XO") ) maskXO = true;
706     if ( sec.Contains("YO") ) maskYO = true;
707     if ( sec.Contains("XE") ) maskXE = true;
708     if ( sec.Contains("YE") ) maskYE = true;
709     }
710    
711 mocchiut 1.8 void CaloLong::UnMaskSections(){
712     this->UnMaskSection("XEXOYEYO");
713     }
714    
715     void CaloLong::UnMaskSection(TString sec){
716     sec.ToUpper();
717     if ( sec.Contains("XO") ) maskXO = false;
718     if ( sec.Contains("YO") ) maskYO = false;
719     if ( sec.Contains("XE") ) maskXE = false;
720     if ( sec.Contains("YE") ) maskYE = false;
721     }
722    
723 mocchiut 1.2 void CaloLong::Clear(){
724     //
725 mocchiut 1.15 if ( debug ) printf(" Clear called \n");
726     //
727 mocchiut 1.2 memset(eplane,0, 2*22*sizeof(Float_t));
728     //
729     chi2 = 0.;
730     ndf = 0.;
731     E0 = 0.;
732 mocchiut 1.9 defE0 = 0.;
733 mocchiut 1.2 a = 0.;
734     b = 0.;
735     errE0 = 0.;
736     erra = 0.;
737     errb = 0.;
738     etmax = 0.;
739     asymm = 0.;
740     fitresult = 0;
741     //
742     X0pl = 0.76;
743     //
744     };
745    
746     void CaloLong::Print(){
747     //
748 mocchiut 1.6 Fit();
749 mocchiut 1.2 //
750     printf("==================== Calorimeter Longitudinal Profile =======================\n");
751 mocchiut 1.19 printf(" OBT: %u PKT: %u ATIME: %u suf %s \n",OBT,PKT,atime,suf.Data());
752 mocchiut 1.2 printf(" fitresult:.. %i\n",fitresult);
753     printf(" chi2 :.. %f\n",chi2);
754     printf(" ndf :.. %f\n",ndf);
755     printf(" nchi2 :.. %f\n",chi2/ndf);
756     printf(" E0 :.. %f\n",E0);
757     printf(" E0/260. :.. %f\n",E0/260.);
758 mocchiut 1.9 printf(" defE0 :.. %f\n",defE0);
759     printf(" lower :.. %f\n",lmax);
760     printf(" upper :.. %f\n",umax);
761     printf(" s lower :.. %s\n",slmax.Data());
762     printf(" s upper :.. %s\n",sumax.Data());
763 mocchiut 1.2 printf(" a :.. %f\n",a);
764     printf(" b :.. %f\n",b);
765     printf(" errE0 :.. %f\n",errE0);
766     printf(" erra :.. %f\n",erra);
767     printf(" errb :.. %f\n",errb);
768     printf(" asymm :.. %f\n",asymm);
769     printf(" tmax :.. %f\n",((a-1.)/b));
770     printf(" etmax :.. %f\n",etmax);
771     printf(" X0pl :.. %f\n",X0pl);
772     printf("========================================================================\n");
773     //
774     };
775    
776     void CaloLong::SetNoWpreSampler(Int_t n){
777     //
778     if ( NC+n <= 22 && NC+n >= 0 ){
779     N = n;
780     } else {
781     printf(" ERROR! Calorimeter is made of 22 W planes\n");
782     printf(" you are giving N presampler = %i and N calo = %i \n",n,NC);
783     printf(" WARNING: using default values NWpre = 0, NWcalo = 22\n");
784     NC = 22;
785     N = 0;
786     };
787     }
788    
789     void CaloLong::SetNoWcalo(Int_t n){
790     if ( N+n <= 22 && N+n >= 0 ){
791     NC = n;
792     } else {
793     printf(" ERROR! Calorimeter is made of 22 W planes\n");
794     printf(" you are giving N W presampler = %i and N W calo = %i \n",N,n);
795     printf(" WARNING: using default values NWpre = 0, NWcalo = 22\n");
796     NC = 22;
797     N = 0;
798     };
799     }
800    
801 mocchiut 1.3 void CaloLong::SplitInto(Int_t NoWpreSampler, Int_t NoWcalo){
802     this->SetNoWpreSampler(0);
803     this->SetNoWcalo(0);
804     if ( NoWpreSampler < NoWcalo ){
805     this->SetNoWpreSampler(NoWpreSampler);
806     this->SetNoWcalo(NoWcalo);
807     } else {
808     this->SetNoWcalo(NoWcalo);
809     this->SetNoWpreSampler(NoWpreSampler);
810     };
811     }
812    
813 mocchiut 1.1 void CaloLong::Process(){
814     //
815     if ( !L2 ){
816     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
817     printf(" ERROR: CaloHough variables not filled \n");
818     return;
819     };
820     //
821     Bool_t newentry = false;
822     //
823     if ( L2->IsORB() ){
824     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
825     newentry = true;
826     OBT = L2->GetOrbitalInfo()->OBT;
827     PKT = L2->GetOrbitalInfo()->pkt_num;
828     atime = L2->GetOrbitalInfo()->absTime;
829     };
830     } else {
831     newentry = true;
832     };
833     //
834     if ( !newentry ) return;
835     //
836     if ( debug ) printf(" Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
837     //
838     Clear();
839     //
840     // let's start
841     //
842 mocchiut 1.2 if ( cont ){
843     for (Int_t i=0; i<22; i++){
844     if ( i == (18+N) ){
845     mask18b = 18 + N;
846     break;
847     };
848     };
849     };
850     //
851     if ( sel ){
852     for (Int_t i=0; i<22; i++){
853     if ( i == (18-N) ){
854     mask18b = 18 - N;
855     break;
856     };
857     };
858     };
859     //
860     // if ( mask18b == 18 ) mask18b = -1;
861 mocchiut 1.1 //
862 mocchiut 1.2 Int_t view = 0;
863     Int_t plane = 0;
864     Int_t strip = 0;
865     Float_t mip = 0.;
866 mocchiut 1.5 Bool_t gof = true;
867 mocchiut 1.2 for (Int_t i=0; i < L2->GetCaloLevel1()->istrip; i++){
868     mip = L2->GetCaloLevel1()->DecodeEstrip(i,view,plane,strip);
869 mocchiut 1.17 //
870     if ( !usepl18x && view==0 && plane==18 ) mip = 0.;
871     //
872 mocchiut 1.5 gof = true;
873     if ( maskXE && (plane%2)==0 && view==1 ) gof = false;
874     if ( maskXO && (plane%2)!=0 && view==1 ) gof = false;
875     if ( maskYE && (plane%2)!=0 && view==0 ) gof = false;
876     if ( maskYO && (plane%2)==0 && view==0 ) gof = false;
877     if ( gof ) eplane[view][plane] += mip;
878 mocchiut 1.2 };
879     //
880 mocchiut 1.4 // inclination factor (stolen from Daniele's code)
881 mocchiut 1.2 //
882 mocchiut 1.15 Float_t ytgx = 0.;
883     Float_t ytgy = 0.;
884 mocchiut 1.8 ytgx = 0.76 * clp->tanx[0];
885     ytgy = 0.76 * clp->tany[0];
886 mocchiut 1.2 X0pl = sqrt( pow(0.76,2.) + pow(ytgx,2.) + pow(ytgy,2.) );
887     //
888     // Find experimental plane of maximum
889     //
890     Int_t pmax = 0;
891     Int_t vmax = 0;
892     Float_t emax = 0.;
893 mocchiut 1.1 for (Int_t v=0; v<2; v++){
894     for (Int_t i=0; i<22; i++){
895 mocchiut 1.2 if ( eplane[v][i] > emax ){
896     emax = eplane[v][i];
897     vmax = v;
898     pmax = i;
899     };
900 mocchiut 1.1 };
901     };
902     //
903 mocchiut 1.2 //
904     //
905     if ( vmax == 0 ) pmax++;
906     etmax = pmax * X0pl;
907     //
908 mocchiut 1.1 if ( debug ) this->Print();
909     if ( debug ) printf(" exit \n");
910     //
911     };
912    
913 mocchiut 1.8 void CaloLong::SetEnergies(Float_t myene[][22]){
914     //
915     if ( !L2 ){
916     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
917     printf(" ERROR: CaloHough variables not filled \n");
918     return;
919     };
920     //
921     Bool_t newentry = false;
922     //
923     if ( L2->IsORB() ){
924     if ( L2->GetOrbitalInfo()->pkt_num != PKT || L2->GetOrbitalInfo()->OBT != OBT || L2->GetOrbitalInfo()->absTime != atime ){
925     newentry = true;
926     OBT = L2->GetOrbitalInfo()->OBT;
927     PKT = L2->GetOrbitalInfo()->pkt_num;
928     atime = L2->GetOrbitalInfo()->absTime;
929     };
930     } else {
931     newentry = true;
932     };
933     //
934     if ( !newentry ) return;
935     //
936     if ( debug ) printf(" SET ENERGIES Start processing event at OBT %u PKT %u time %u \n",OBT,PKT,atime);
937     //
938     Clear();
939     //
940     // let's start
941     //
942     if ( cont ){
943     for (Int_t i=0; i<22; i++){
944     if ( i == (18+N) ){
945     mask18b = 18 + N;
946     break;
947     };
948     };
949     };
950     //
951     if ( sel ){
952     for (Int_t i=0; i<22; i++){
953     if ( i == (18-N) ){
954     mask18b = 18 - N;
955     break;
956     };
957     };
958     };
959     //
960     // if ( mask18b == 18 ) mask18b = -1;
961     //
962     Int_t view = 0;
963     Int_t plane = 0;
964     Bool_t gof = true;
965     for (view=0; view < 2; view++){
966     for (plane=0; plane < 22; plane++){
967     gof = true;
968     if ( maskXE && (plane%2)==0 && view==1 ) gof = false;
969     if ( maskXO && (plane%2)!=0 && view==1 ) gof = false;
970     if ( maskYE && (plane%2)!=0 && view==0 ) gof = false;
971     if ( maskYO && (plane%2)==0 && view==0 ) gof = false;
972     if ( gof ) eplane[view][plane] = myene[view][plane];
973     if ( debug ) printf(" XE %i XO %i YE %i YO %i eplane %i %i = %f ........... myene %i %i = %f\n", maskXE, maskXO, maskYE, maskYO,view,plane,eplane[view][plane],view,plane,myene[view][plane]);
974     };
975     };
976     //
977 mocchiut 1.15 if ( !clp && debug ) printf(" ERROR!! no CaloLevel2 obj!!\n");
978     //
979 mocchiut 1.8 // inclination factor (stolen from Daniele's code)
980     //
981 mocchiut 1.15 Float_t ytgx = 0.;
982     Float_t ytgy = 0.;
983 mocchiut 1.8 ytgx = 0.76 * clp->tanx[0];
984     ytgy = 0.76 * clp->tany[0];
985     X0pl = sqrt( pow(0.76,2.) + pow(ytgx,2.) + pow(ytgy,2.) );
986 mocchiut 1.15 if ( debug ) printf(" X0pl %f tanx %f tany %f \n",X0pl,ytgx,ytgy);
987 mocchiut 1.8 //
988     // Find experimental plane of maximum
989     //
990     Int_t pmax = 0;
991     Int_t vmax = 0;
992     Float_t emax = 0.;
993     for (Int_t v=0; v<2; v++){
994     for (Int_t i=0; i<22; i++){
995     if ( eplane[v][i] > emax ){
996     emax = eplane[v][i];
997     vmax = v;
998     pmax = i;
999     };
1000     };
1001     };
1002     //
1003     //
1004     //
1005     if ( vmax == 0 ) pmax++;
1006     etmax = pmax * X0pl;
1007 mocchiut 1.15 letmax = etmax;
1008 mocchiut 1.8 //
1009     if ( debug ) this->Print();
1010     if ( debug ) printf(" exit \n");
1011     //
1012     };
1013 mocchiut 1.2
1014     Double_t ccurve(Double_t *ti,Double_t *par){
1015     //
1016     Double_t t = *ti;
1017     Double_t cE0 = par[0];
1018     Double_t ca = par[1];
1019     Double_t cb = par[2];
1020     Double_t gammaa = TMath::Gamma(ca);
1021     //
1022     Double_t value = cE0 * cb * ( pow((cb * t),(ca - 1)) * exp( -cb * t ) ) / gammaa;
1023     //
1024     return value;
1025     //
1026     }
1027    
1028     void CaloLong::Fit(){
1029     this->Fit(false);
1030     };
1031    
1032 mocchiut 1.12 Float_t CaloLong::Evaluate(TString s, Float_t tmax, Float_t X0pl){
1033 mocchiut 1.9 /* SAMPLE OUTPUT:
1034     Enter Infix Expression : A + B + C / (E - F)
1035     Postfix Expression is : A B + C E F - / +
1036     */
1037 mocchiut 1.12 if ( !s.Contains("tmax") && !s.Contains("X0pl") ){
1038 mocchiut 1.9 printf(" ERROR, the input formula must contain \"t\"\n");
1039     return 0.;
1040     };
1041 mocchiut 1.10 if ( tmax != tmax ){
1042     printf(" ERROR, tmax is nan! \n");
1043     return 0.;
1044     };
1045 mocchiut 1.9 TString g=Form("%f",tmax);
1046 mocchiut 1.12 TString h=Form("%f",X0pl);
1047 mocchiut 1.9 TString *ts= new TString("");
1048     ts->Prepend(s.Data());
1049 mocchiut 1.12 ts->ReplaceAll("tmax",4,g.Data(),g.Capacity());
1050     ts->ReplaceAll("X0pl",4,h.Data(),h.Capacity());
1051 mocchiut 1.9 ts->Prepend("(");
1052     ts->Append(")");
1053     if ( debug ) printf(" ts %s tssize %i capac %i s %s g %s \n",ts->Data(),ts->Sizeof(),ts->Capacity(),s.Data(),g.Data());
1054     char in[50],post[50];
1055     strcpy(&in[0]," ");
1056     strcpy(&in[0],ts->Data());
1057     strcpy(&post[0]," ");
1058     if ( debug ) printf("Infix Expression is : ##%s##\n",&in[0]);
1059     infix2postfix(&in[0],&post[0],1);
1060     if ( debug ) printf("Postfix Expression is : ##%s##\n",&post[0]);
1061     /* SAMPLE OUTPUT:
1062     Enter Postfix Expression : 3 5 + 2 /
1063     3 5 + 2 / EQUALS 4
1064     */
1065     Float_t res = evaluate(&post[0]);
1066     if ( debug ) printf("%s EQUALS %f\n",post,res);
1067     return res;
1068     }
1069    
1070 mocchiut 1.2 void CaloLong::Fit(Bool_t draw){
1071     //
1072     Process();
1073     //
1074     //
1075     if ( !L2 ){
1076     printf(" ERROR: cannot find PamLevel2 object, use the correct constructor or check your program!\n");
1077     printf(" ERROR: CaloHough variables not filled \n");
1078     return;
1079     };
1080     //
1081     Bool_t newentry = false;
1082     //
1083     if ( L2->IsORB() ){
1084     if ( L2->GetOrbitalInfo()->pkt_num != fPKT || L2->GetOrbitalInfo()->OBT != fOBT || L2->GetOrbitalInfo()->absTime != fatime ){
1085     newentry = true;
1086     fOBT = L2->GetOrbitalInfo()->OBT;
1087     fPKT = L2->GetOrbitalInfo()->pkt_num;
1088     fatime = L2->GetOrbitalInfo()->absTime;
1089     };
1090     } else {
1091     newentry = true;
1092     };
1093     //
1094     if ( !newentry ) return;
1095     //
1096     if ( debug ) printf(" Start fitting event at OBT %u PKT %u time %u \n",fOBT,fPKT,fatime);
1097     //
1098     if ( draw ){
1099     gStyle->SetLabelSize(0.04);
1100     gStyle->SetNdivisions(510,"XY");
1101     };
1102     //
1103 mocchiut 1.13 TString hid = Form("clongfit%s",suf.Data());
1104 mocchiut 1.2 TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
1105     // if ( tc ) tc->Delete();
1106     // if ( tc ) tc->Close();
1107     if ( !tc && draw ){
1108     tc = new TCanvas(hid,hid);
1109     } else {
1110     if ( tc ) tc->cd();
1111     };
1112     //
1113 mocchiut 1.13 TString thid = Form("hlongfit%s",suf.Data());
1114 mocchiut 1.11 TH2F *th = dynamic_cast<TH2F*>(gDirectory->FindObject(thid));
1115 mocchiut 1.2 if ( th ) th->Delete();
1116 mocchiut 1.11 //
1117 mocchiut 1.13 TString ghid = Form("glongfit%s",suf.Data());
1118 mocchiut 1.11 TGraphErrors *gh = dynamic_cast<TGraphErrors*>(gDirectory->FindObject(ghid));
1119     if ( gh ) gh->Delete();
1120     //
1121 mocchiut 1.2 Float_t xpos = 0.;
1122     Float_t enemip = 0.;
1123     Float_t xmax = NC * X0pl + 0.2;
1124 mocchiut 1.11 //
1125     Double_t xxx[50];
1126     Double_t exx[50];
1127     Double_t yyy[50];
1128     Double_t eyy[50];
1129     Int_t numpo = 0;
1130     memset(xxx,0,50*sizeof(Double_t));
1131     memset(exx,0,50*sizeof(Double_t));
1132     memset(yyy,0,50*sizeof(Double_t));
1133     memset(eyy,0,50*sizeof(Double_t));
1134 mocchiut 1.2 //
1135 mocchiut 1.4 // AGH, BUG!
1136     //
1137     Int_t mmin = 0;
1138     Int_t mmax = 0;
1139     if ( cont ){
1140     mmin = N;
1141     mmax = NC+N;
1142     } else {
1143     mmin = 0;
1144     mmax = NC;
1145     };
1146     //
1147 mocchiut 1.11 Float_t emax = 0.;
1148 mocchiut 1.4 Float_t qtotparz = 0.;
1149     for (Int_t st=mmin;st<mmax+1;st++){
1150 mocchiut 1.2 enemip = 0.;
1151 mocchiut 1.4 xpos = (st - mmin) * X0pl;
1152 mocchiut 1.11 //
1153     if ( xyaverage ){
1154     //
1155     if ( st > mmin && st < mmax ){
1156     if ( no18x && ( st == 18+1 || st == mask18b+1 )){
1157     if ( !maskYO ){
1158     enemip = 2. * eplane[1][st];
1159     } else {
1160     enemip = eplane[1][st];
1161     };
1162 mocchiut 1.7 } else {
1163 mocchiut 1.11 enemip = eplane[0][st-1] + eplane[1][st];
1164 mocchiut 1.7 };
1165 mocchiut 1.2 } else {
1166 mocchiut 1.11 if ( st == mmin ){
1167     if ( !maskYE ){
1168     enemip = 2. * eplane[1][st];
1169     } else {
1170     enemip = eplane[1][st];
1171     };
1172     };
1173     if ( st == mmax ){
1174     if ( !maskXE ){
1175     enemip = 2. * eplane[0][st-1];
1176     } else {
1177     enemip = eplane[0][st-1];
1178     };
1179     };
1180     };
1181     //
1182     qtotparz += enemip;
1183     if ( enemip > emax ) emax = enemip;
1184     if ( enemip > 0. ){
1185     xxx[numpo] = xpos;
1186     exx[numpo] = 0.1;
1187     yyy[numpo] = enemip;
1188     eyy[numpo] = sqrt(enemip*3.)+sqrt(5.);
1189 mocchiut 1.17 //if ( xpos > letmax && enemip > lmipth && heavytail) eyy[numpo] = (sqrt(enemip*3.)+sqrt(5.))/numpo;
1190 mocchiut 1.16 if ( xpos > letmax && enemip > lmipth && heavytail) eyy[numpo] = sqrt(enemip)/5.;
1191     if ( xpos > letmax-1 && xpos < letmax+1 && heavytail ) eyy[numpo] /= 5.;
1192     //if ( xpos > letmax-2 && xpos < letmax+1 && heavytail ) eyy[numpo] /= 7.;
1193     if ( xpos < 3. && heavytail ) eyy[numpo] /= 5.;
1194 mocchiut 1.11 numpo++;
1195     // th->Fill(xpos,enemip);
1196 mocchiut 1.15 if ( debug ) printf(" AVE Filling: st %i xpos %f energy %f error %f letmax %f lmpith %f \n",st,xpos,enemip,eyy[numpo-1],letmax,lmipth);
1197 mocchiut 1.2 };
1198     } else {
1199 mocchiut 1.11 for (Int_t jj=0; jj<2; jj++){
1200     if ( st > mmin && st < mmax ){
1201     if ( jj == 0 && no18x && ( st == 18+1 || st == mask18b+1 )){
1202     enemip = eplane[1][st];
1203     } else {
1204     if ( jj == 0 ){
1205     enemip = eplane[jj][st-1];
1206     } else {
1207     enemip = eplane[jj][st];
1208     };
1209     };
1210 mocchiut 1.7 } else {
1211 mocchiut 1.11 if ( st == mmin && jj == 1 ){
1212     enemip = eplane[jj][st];
1213     };
1214     if ( st == mmax && jj == 0){
1215     enemip = eplane[jj][st-1];
1216     };
1217 mocchiut 1.7 };
1218 mocchiut 1.11 //
1219     qtotparz += enemip;
1220     if ( enemip > emax ) emax = enemip;
1221     if ( enemip > 0. ){
1222     xxx[numpo] = xpos;
1223     exx[numpo] = 0.1;
1224     yyy[numpo] = enemip;
1225     eyy[numpo] = sqrt(enemip*3.)+sqrt(5.);
1226 mocchiut 1.17 //if ( xpos > letmax && enemip > lmipth && heavytail) eyy[numpo] = (sqrt(enemip*3.)+sqrt(5.))/numpo;
1227     //if ( xpos > letmax && enemip > lmipth && heavytail ) eyy[numpo] = (sqrt(enemip*3.)+sqrt(5.))/numpo;
1228     if ( xpos > letmax && enemip > lmipth && heavytail) eyy[numpo] = sqrt(enemip)/5.;
1229     if ( xpos > letmax-1 && xpos < letmax+1 && heavytail ) eyy[numpo] /= 5.;
1230     //if ( xpos > letmax-2 && xpos < letmax+1 && heavytail ) eyy[numpo] /= 7.;
1231     if ( xpos < 3. && heavytail ) eyy[numpo] /= 5.;
1232 mocchiut 1.11 // eyy[numpo] = sqrt(enemip)/(st*0.95);
1233     numpo++;
1234     // th->Fill(xpos,enemip);
1235     if ( debug ) printf(" XY Filling: st %i xpos %f energy %f \n",st,xpos,enemip);
1236 mocchiut 1.7 };
1237 mocchiut 1.11 };
1238 mocchiut 1.2 };
1239 mocchiut 1.11
1240 mocchiut 1.2 //
1241     // for (Int_t v=1; v>=0;v--)// {
1242     // //
1243     // if ( v == 1 ){
1244     // xpos = (st - N) * X0pl;
1245     // } else {
1246     // xpos = (st + 1 - N) * X0pl;
1247     // };
1248     // //
1249     // if ( no18x && st == 18 && v == 0 ){
1250     // // skip plane 18x
1251     // } else {
1252     // if ( v == 1 && st == mask18b ){
1253     // // emulate plane 18x
1254     // } else {
1255     // if ( eplane[v][st] > 0. ){
1256     // th->Fill(xpos,eplane[v][st]);
1257     // if ( debug ) printf(" Filling: st %i v %i xpos %f energy %f \n",st,v,xpos,eplane[v][st]);
1258     // };
1259     // };
1260     // };
1261     // //
1262     // };
1263     };
1264     //
1265 mocchiut 1.11 // th = new TH2F(thid,thid,int(NC*1.5),-0.2,xmax);
1266     th = new TH2F(thid,thid,1000,-0.2,xmax,1000,0.,emax*1.2);
1267     gh = new TGraphErrors(numpo,xxx,yyy,exx,eyy);
1268 mocchiut 1.13 TString fnam=Form("lfit%s",suf.Data());
1269 mocchiut 1.19 // TF1 *lfit = dynamic_cast<TF1*>(gDirectory->FindObject(fnam));
1270 mocchiut 1.11 if ( lfit ) lfit->Delete();
1271 mocchiut 1.13 lfit = new TF1(fnam,ccurve,0.,xmax,3);
1272 mocchiut 1.15 // if ( !lfit ){
1273     // lfit = new TF1(fnam,ccurve,0.,xmax,3);
1274     // };
1275     // lfit->Clear();
1276     // lfit->SetName(fnam);
1277     // lfit->SetRange(0.,xmax);
1278     // lfit->Print();
1279     //
1280 mocchiut 1.8 if ( debug ) printf("qtot %f qtotparz %f \n",clp->qtot,qtotparz);
1281 mocchiut 1.4 E0 = qtotparz;
1282 mocchiut 1.8 // E0 = clp->qtot;
1283 mocchiut 1.2 a = 5.;
1284     b = 0.5;
1285     if ( debug ) printf(" STARTING PARAMETERS: E0 %f a %f b %f \n",E0,a,b);
1286     lfit->SetParameters(E0,a,b);
1287     // lfit->SetParLimits(0,0.,1000.);
1288     // lfit->SetParLimits(1,-1.,80.);
1289     // lfit->SetParLimits(2,-1.,10.);
1290 mocchiut 1.14 // TString optio = "ROW"; // "RO"
1291 mocchiut 1.11 TString optio = "RO"; // "RO"
1292 mocchiut 1.2 if ( debug ){
1293 mocchiut 1.11 optio += "NV";
1294     if ( draw ) optio += "V";
1295     } else {
1296     optio += "NQ";
1297     if ( draw ) optio += "Q";
1298 mocchiut 1.2 };
1299     //
1300 mocchiut 1.14 if ( debug ) printf(" OK, start the fitting procedure... options: %s \n",optio.Data());
1301 mocchiut 1.2 //
1302 mocchiut 1.11 // fitresult = th->Fit("lfit",optio);
1303 mocchiut 1.15 // lfit->Update();
1304 mocchiut 1.11 fitresult = gh->Fit("lfit",optio);
1305 mocchiut 1.15 // fitresult = gh->Fit("lfit","ROQW");
1306 mocchiut 1.2 //
1307     if ( debug ) printf(" the fit is done! result: %i \n",fitresult);
1308     //
1309     E0 = lfit->GetParameter(0);
1310     a = lfit->GetParameter(1);
1311     b = lfit->GetParameter(2);
1312     errE0 = lfit->GetParError(0);
1313     erra = lfit->GetParError(1);
1314     errb = lfit->GetParError(2);
1315     chi2 = lfit->GetChisquare();
1316     ndf = lfit->GetNDF();
1317     Float_t tmax = 0.;
1318     if ( debug ) printf(" Parameters are retrieved \n");
1319     if ( b != 0 ) tmax = (a - 1.)/b;
1320     //
1321     if ( fitresult != 0 ){
1322     if ( debug ) printf(" The fit failed, no integrals calculation and asymm is set to -1. \n");
1323     asymm = -1.;
1324 mocchiut 1.9 defE0 = -1.;
1325 mocchiut 1.2 } else {
1326 mocchiut 1.12 if ( slmax.MaybeRegexp() ) lmax = this->Evaluate(slmax,tmax,X0pl);
1327     if ( sumax.MaybeRegexp() ) umax = this->Evaluate(sumax,tmax,X0pl);
1328 mocchiut 1.2 Int_t npp = 1000;
1329 mocchiut 1.9 double *xpp=new double[npp];
1330     double *wpp=new double[npp];
1331     lfit->CalcGaussLegendreSamplingPoints(npp,xpp,wpp,1e-12);
1332     defE0 = lfit->IntegralFast(npp,xpp,wpp,lmax,umax);
1333     //
1334 mocchiut 1.2 double *xp=new double[npp];
1335     double *wp=new double[npp];
1336     lfit->CalcGaussLegendreSamplingPoints(npp,xp,wp,1e-12);
1337     Float_t imax = lfit->IntegralFast(npp,xp,wp,0.,tmax);
1338     // Float_t imax = lfit->Integral(0.,tmax);
1339     if ( debug ) printf(" Integral till maximum (%f): %f \n",tmax,imax);
1340     Int_t np = 1000;
1341     double *x=new double[np];
1342     double *w=new double[np];
1343     lfit->CalcGaussLegendreSamplingPoints(np,x,w,1e-12);
1344     Float_t i10max = lfit->IntegralFast(np,x,w,0.,10.*tmax);
1345     delete x;
1346     delete w;
1347     delete xp;
1348     delete wp;
1349 mocchiut 1.15 delete xpp;
1350     delete wpp;
1351 mocchiut 1.2 // Float_t i10max = lfit->Integral(0.,10.*tmax);
1352     if ( debug ) printf(" Integral: %f \n",i10max);
1353     //
1354     if ( i10max != imax ){
1355     asymm = imax / (i10max-imax);
1356     } else {
1357     if ( debug ) printf(" i10max == imax, asymm undefined\n");
1358     asymm = -2.;
1359     };
1360 mocchiut 1.4 if ( asymm != asymm ){
1361     if ( debug ) printf(" asymm is nan \n");
1362     asymm = -3.;
1363     };
1364 mocchiut 1.2 //lfit->Integral(0.,tmax)/(lfit->Integral(0.,10.*tmax)-lfit->Integral(0.,tmax));
1365     if ( debug ) printf(" Asymmetry has been calculated \n");
1366     };
1367     //
1368 mocchiut 1.4 if ( asymm < 0. || ndf <= 0. || chi2 < 0. || tmax < 0. ){
1369     if ( debug ) printf(" Funny asymm||ndf||chi2||tmax values, fit failed \n");
1370     fitresult = 100;
1371     };
1372     //
1373 mocchiut 1.2 if ( draw ){
1374     //
1375     tc->cd();
1376     // gStyle->SetOptStat(11111);
1377     tc->SetTitle();
1378     th->SetTitle("");
1379     th->SetName("");
1380     th->SetMarkerStyle(20);
1381     // axis titles
1382     th->SetXTitle("Depth [X0]");
1383     th->SetYTitle("Energy [MIP]");
1384 mocchiut 1.11 // th->DrawCopy("Perror");
1385     th->DrawCopy();
1386     gh->SetMarkerSize(1.);
1387     gh->SetMarkerStyle(21);
1388     // gh->SetMarkerColor(kRed);
1389     gh->Draw("Psame");
1390 mocchiut 1.2 lfit->Draw("same");
1391     tc->Modified();
1392     tc->Update();
1393     //
1394     gStyle->SetLabelSize(0);
1395     gStyle->SetNdivisions(1,"XY");
1396     //
1397 mocchiut 1.4 } else {
1398     if ( th ) th->Delete();
1399 mocchiut 1.2 };
1400     //
1401 mocchiut 1.15 // gMinuit->SetPrintLevel(1);
1402     // gMinuit->mnamin();
1403     // // gMinuit->mnfree(0);
1404     // gMinuit->mncler();
1405     // gMinuit->mnrset(1);
1406     // gMinuit->Delete();
1407     //ROOT::Math::Minimizer::Clear();
1408     // gMinuit->mnhelp("*");
1409     //
1410 mocchiut 1.11 // delete lfit;
1411 mocchiut 1.2 //
1412     };
1413    
1414     void CaloLong::Draw(){
1415     //
1416     Process();
1417     Draw(-1);
1418     };
1419    
1420     void CaloLong::Draw(Int_t view){
1421     //
1422     Int_t minv = 0;
1423     Int_t maxv = 0;
1424     //
1425     if ( view == -1 ){
1426     maxv = -1;
1427     } else {
1428     minv = view;
1429     maxv = view+1;
1430     };
1431     //
1432     Process();
1433     //
1434     gStyle->SetLabelSize(0.04);
1435     gStyle->SetNdivisions(510,"XY");
1436     //
1437     if ( maxv != -1 ){
1438     for (Int_t v=minv; v<maxv;v++){
1439 mocchiut 1.13 TString hid = Form("clongv%i%s",v,suf.Data());
1440 mocchiut 1.2 TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
1441     if ( tc ){
1442     // tc->Clear();
1443     } else {
1444     tc = new TCanvas(hid,hid);
1445     };
1446     //
1447 mocchiut 1.13 TString thid = Form("hlongv%i%s",v,suf.Data());
1448 mocchiut 1.2 TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
1449     if ( th ) th->Delete();
1450     // th->Clear();
1451     // th->Reset();
1452     // } else {
1453     th = new TH1F(thid,thid,22,-0.5,21.5);
1454     // };
1455     tc->cd();
1456     //
1457     for (Int_t st=0;st<22;st++){
1458     th->Fill(st,eplane[v][st]);
1459     };
1460     th->Draw();
1461     tc->Modified();
1462     tc->Update();
1463     };
1464     } else {
1465     //
1466 mocchiut 1.13 TString hid = Form("clongvyvx%s",suf.Data());
1467 mocchiut 1.2 TCanvas *tc = dynamic_cast<TCanvas*>(gDirectory->FindObject(hid));
1468     if ( tc ){
1469     } else {
1470     tc = new TCanvas(hid,hid);
1471     };
1472     //
1473 mocchiut 1.13 TString thid = Form("hlongvyvx%s",suf.Data());
1474 mocchiut 1.2 TH1F *th = dynamic_cast<TH1F*>(gDirectory->FindObject(thid));
1475     if ( th ) th->Delete();
1476     th = new TH1F(thid,thid,44,-0.5,43.5);
1477     tc->cd();
1478     Int_t pp=0;
1479     for (Int_t st=0;st<22;st++){
1480     for (Int_t v=1; v>=0;v--){
1481     //
1482     th->Fill(pp,eplane[v][st]);
1483     //
1484     pp++;
1485     };
1486     };
1487     th->Draw();
1488     tc->Modified();
1489     tc->Update();
1490     };
1491     //
1492     gStyle->SetLabelSize(0);
1493     gStyle->SetNdivisions(1,"XY");
1494     //
1495     };
1496    
1497     void CaloLong::Delete(){
1498     Clear();
1499     //delete this;
1500     };
1501 mocchiut 1.9
1502    
1503    
1504    
1505    
1506    
1507    
1508    
1509    
1510    
1511    
1512    
1513    
1514    
1515    
1516    
1517    
1518    
1519    
1520    

  ViewVC Help
Powered by ViewVC 1.1.23