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

Annotation of /calo/flight/CaloElectron/src/CaloElectron.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Fri Mar 13 15:23:20 2009 UTC (15 years, 9 months ago) by pam-fi
Branch: MAIN
Branch point for: pamela
Initial revision

1 pam-fi 1.1 #include <CaloElectron.h>
2    
3     ////////////////////////////////////////////////////////////
4     /// INITIALIZATIONS & GLOBAL PARAMETERS
5     ////////////////////////////////////////////////////////////
6    
7     CaloElectron_parameters * CaloElectron_parameters::_parameters = 0;
8    
9     /**
10     * Set external parameters to default values
11     */
12     void CaloElectron_parameters::SetDefault(){
13     cout << "CaloElectron --> SET DEFAULT PARAMETERS" << endl;
14    
15     isimu = 0;
16     dolongfit = 1;
17     dolatcorr = 1;
18     calibmode = 0;
19    
20     debug = false;
21    
22     // dodrawlong = false;
23     // dodrawq0q1 = false;
24     // dodrawlat = false;
25    
26     TAUMAX = 5.;
27     RMAX = 40.;//4.; //temporaneo???
28     RMAXsp = 40.;
29    
30     // cout << "Shower cuts:"<<endl;
31     // cout << "TAUMAX = "<<TAUMAX<<endl;
32     // cout << "RMAX = "<<RMAX<<" cm"<<endl;
33    
34     for(int ip=0; ip<22; ip++)
35     for(int iv=0; iv<2; iv++)
36     maskpl[ip][iv] = false;
37     //
38     h_qtot[0] = NULL;
39     h_qtot[1] = NULL;
40     //
41     h_qfit[0] = NULL;
42     h_qfit[1] = NULL;
43     //
44     cl1 = NULL;
45    
46     //
47     for(int i=0; i<NTAUBINMAX; i++){
48     for(int j=0; j<3; j++){
49     h_qtot_tau[i][j] = NULL;
50     h_qtot_tau_wav[i][j] = NULL;
51     for(int ii=0; ii<CALIBNBIN; ii++){
52     summW[i][j][ii] = 0.;
53     summWF[i][j][ii] = 0.;
54     }
55     }
56     }
57    
58     SetCalo(0,0);
59     SetPar();
60    
61     Dump();
62    
63     };
64     /**
65     * Set external parameters to default values
66     */
67     void CaloElectron_parameters::Dump(){
68     cout << "CaloElectron --> DUMP PARAMETERS" << endl;
69     cout << endl;
70     cout << "Shower cuts (for energy determination):"<<endl;
71     cout << " TAUMAX = "<<TAUMAX<<" TAU=t/T"<<endl;
72     cout << " RMAX = "<<RMAX<<" cm"<<endl;
73     // cout << endl;
74     cout << "MASKED PLANES:"<<endl;
75     cout << " X -> ";
76     for(int ip=0; ip<22; ip++)cout << maskpl[ip][0];
77     cout << endl;
78     cout << " Y -> ";
79     for(int ip=0; ip<22; ip++)cout << maskpl[ip][1];
80     cout << endl;
81     cout << " ipmin = "<<ipmin<<endl;
82     cout << " ipmax = "<<ipmax<<endl;
83     // cout << endl;
84     cout << "Flags:"<<endl;
85     cout << " lateral correction ? "<<dolatcorr<<endl;
86     cout << " longitudinal correction ? "<<dolongfit<<endl;
87     cout << " simulation ? "<<isimu<<endl;
88     cout << " calibration mode ? "<<calibmode<<endl;
89     cout << endl;
90    
91     };
92     /**
93     * Set calorimeter masks and book histograms.
94     * @icalo Calorimeter configuration (icalo=0 --> all planes included)
95     * @notused Num.of planes exluded (icalo=1 excludes bottom planes, icalo=2 exclude top planes)
96     * NB: plane 19x is always excluded
97     *
98     */
99     void CaloElectron_parameters::SetCalo(int icalo,int notused){
100    
101    
102     if(icalo==0){
103     maskpl[18][0]=true;
104     ipmin=0;
105     ipmax=22;
106     }
107     if(icalo==1){
108     maskpl[18][0]=true;
109     ipmin=0;
110     ipmax=22-notused;
111     if(18-notused>=0)maskpl[18-notused][0]=true;
112     }
113     if(icalo==2){
114     maskpl[18][0]=true;
115     ipmin=notused;
116     ipmax=22;
117     if(18+notused<22)maskpl[18+notused][0]=true;
118     }
119    
120     // cout << "MASKED PLANES:"<<endl;
121     // cout << "X -> ";
122     // for(int ip=0; ip<22; ip++)cout << maskpl[ip][0];
123     // cout << endl;
124     // cout << "Y -> ";
125     // for(int ip=0; ip<22; ip++)cout << maskpl[ip][1];
126     // cout << endl;
127     // cout << "ipmin = "<<ipmin<<endl;
128     // cout << "ipmax = "<<ipmax<<endl;
129    
130     // histos for kolmogorov test
131     // if(h_qtot)h_qtot->Delete();
132     // if(h_qfit)h_qfit->Delete();
133     // h_qtot[0] = new TH2F("htot0","Matrix of energy releases (measured)",192,-0.5,191.5,22,-0.5,21.5);
134     // h_qfit[0] = new TH2F("hfit0","Matrix of energy releases (fit)", 192,-0.5,191.5,22,-0.5,21.5);
135     // h_qtot[1] = new TH2F("htot1","Matrix of energy releases (measured)",192,-0.5,191.5,22,-0.5,21.5);
136     // h_qfit[1] = new TH2F("hfit1","Matrix of energy releases (fit)", 192,-0.5,191.5,22,-0.5,21.5);
137    
138     // binnaggio in funzione della coordinata, relativo al margine del piano
139     int nbin = 100;
140     double xbin[101];
141     // retrieve the coordinate of the bottom-left corner of the plane
142     xbin[0]=0.;
143     int ibin = 0;
144     for(int ise=0; ise<3; ise++){//sensors
145     ibin++;
146     if(ise==0) xbin[ibin] = xbin[ibin-1] + DEAD;
147     if(ise==1||ise==2) xbin[ibin] = xbin[ibin-1] + DEAD + GLUE + DEAD;
148     for(int is=0; is<32; is++){//strip
149     ibin++;
150     xbin[ibin] = xbin[ibin-1] + PITCH;
151     }
152     }
153     ibin++;
154     xbin[ibin] = xbin[ibin-1] + DEAD;
155    
156     if(h_qtot[0])h_qtot[0]->Delete();
157     if(h_qtot[1])h_qtot[1]->Delete();
158     if(h_qfit[0])h_qfit[0]->Delete();
159     if(h_qfit[1])h_qfit[1]->Delete();
160    
161     h_qtot[0] = new TH2F("htot0","Matrix of energy releases (measured)",nbin,xbin,22,-0.5,21.5);
162     h_qfit[0] = new TH2F("hfit0","Matrix of energy releases (fit)", nbin,xbin,22,-0.5,21.5);
163     h_qtot[1] = new TH2F("htot1","Matrix of energy releases (measured)",nbin,xbin,22,-0.5,21.5);
164     h_qfit[1] = new TH2F("hfit1","Matrix of energy releases (fit)", nbin,xbin,22,-0.5,21.5);
165    
166     }
167     /**
168     * Set external parameters to default values
169     */
170     void CaloElectron_parameters::SetPar(){
171    
172     // ---------------
173     // lateral profile (hardcoded parameters )
174     // ---------------
175     TString pathx,pathy,pathyd,pathyp;
176     TString dir = gSystem->Getenv("PAM_CALIB");
177     if(isimu==0){
178     pathx=dir+"/cal-param/parxdati.txt";
179     pathyd=dir+"/cal-param/paryddati.txt";
180     pathyp=dir+"/cal-param/parypdati.txt";
181     }else{
182     pathx=dir+"/cal-param/parxsimu.txt";
183     pathyd=dir+"/cal-param/parydsimu.txt";
184     pathyp=dir+"/cal-param/parypsimu.txt";
185     }
186    
187     cout << "Load LATERAL PARAMETERS "<<endl;
188     cout << " X from "<<pathx << endl;
189     cout << " Y-ODD from "<<pathyd << endl;
190     cout << " Y-EVEN from "<<pathyp << endl;
191    
192     SetPar(pathx,pathyd,pathyp);
193    
194     }
195     /**
196     * Set external parameters from input files
197     */
198     void CaloElectron_parameters::SetPar(TString pathx,TString pathyd,TString pathyp){
199    
200     //these parameter are directly the values of rp,rt,p in each taubin
201     //they are obtained from the simulation in different taubin up to tau=3
202     ifstream file;
203     for(int iv=0;iv<2;iv++){
204     if(iv==0){
205     ifstream file(pathx);
206     for(int i=0;i<12;i++)file>>file_tau[i]>>file_p[i][iv]>>file_rt[i][iv]>>file_rc[i][iv];
207     }
208     if(iv==1){
209     ifstream filep(pathyp);
210     for(int i=0;i<12;i++)filep>>file_tau[i]>>file_p[i][iv]>>file_rt[i][iv]>>file_rc[i][iv];
211     ifstream filed(pathyd);
212     for(int i=0;i<12;i++)filed>>file_tau[i]>>file_p[i][iv+1]>>file_rt[i][iv+1]>>file_rc[i][iv+1];
213     }
214     }
215    
216     };
217    
218     /**
219     * Set calibration tools.
220     * Create histos for lateral profile parameterization
221     */
222     void CaloElectron_parameters::Calibration_SetTools(int ntau, float* taubin){
223    
224     if(!calibmode)return;
225    
226     cout << "CaloElectron --> Set calibration tools "<<endl;
227     if( ntau > NTAUBINMAX ){
228     ntau = NTAUBINMAX;
229     cout << "(NB: max allowed n.tau-bins = "<<NTAUBINMAX<<")"<<endl;
230     };
231     par_ntau = ntau;
232     for(int i=0; i<=par_ntau; i++)par_taubin[i]=taubin[i];
233     //
234     cout << "Set TAU binning:"<<endl;
235     cout << par_ntau<<" bins, from "<<par_taubin[0]<<" to "<<par_taubin[par_ntau]<<endl;
236     cout << endl;
237     //
238     // create histos
239     //
240     TString htitle,hid;
241     for(int i=0; i<par_ntau; i++){
242     for(int j=0; j<3; j++){
243     //
244     hid.Form("hqtottau_%i_%i",i,j);
245     htitle.Form("Lateral profile - view %i - tau-bin %i",j,i);
246     cout <<hid<<" --> "<< htitle<<" "<<h_qtot_tau[i][j]<<endl;
247     if( h_qtot_tau[i][j] )h_qtot_tau[i][j]->Delete();
248     h_qtot_tau[i][j] = new TH2F(hid.Data(),htitle.Data(),CALIBNBIN,-1*CALIBRANGE,1*CALIBRANGE,5000,0.,10.);
249     //
250     hid.Form("hqtottauwav_%i_%i",i,j);
251     htitle.Form("Lateral profile - view %i - tau-bin %i (weighted average)",j,i);
252     cout <<hid<<" --> "<< htitle<<" "<<h_qtot_tau_wav[i][j]<<endl;
253     if( h_qtot_tau_wav[i][j] )h_qtot_tau_wav[i][j]->Delete();
254     h_qtot_tau_wav[i][j] = new TH1F(hid.Data(),htitle.Data(),CALIBNBIN,-1*CALIBRANGE,1*CALIBRANGE);
255     }
256     }
257    
258     return;
259     };
260     /**
261     * Set calibration tools
262     * Create histos for lateral profile parameterization
263     */
264     void CaloElectron_parameters::Calibration_SetTools(){
265    
266     if(!calibmode)return;
267    
268     int ntau = 12;
269     float fromtau = 0.;
270     float totau = 3.;
271     float dtau = (totau-fromtau)/(float)ntau;
272     vector<float> taubin;
273     float *pt_taubin = taubin.get_allocator().allocate(ntau+1);
274     pt_taubin[0]=fromtau;
275     for(int i=1; i<=ntau; i++)pt_taubin[i]=(pt_taubin[0]+i*dtau);
276     Calibration_SetTools(ntau,pt_taubin);
277     return;
278     };
279     /**
280     * Fit calibration histos
281     */
282     void CaloElectron_parameters::Calibration_Fit(){
283    
284     if(!calibmode)return;
285    
286     TF1* frad = new TF1("frad",fradpro,-5.,5.,4);
287     //
288     // int nt_tau = CaloElectron_parameters::Get()->par_ntau;
289     int ntau = par_ntau;
290     //
291     for(int itau = 0; itau<ntau; itau++){ //loop over tau-bins
292     for(int j=0; j<3; j++){
293     //
294     // TProfile* hh = 0;
295     // if( !h_qtot_tau[itau][j] )continue;
296     // cout << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
297     // cout << " fitting profile histo "<<h_qtot_tau[itau][j]->GetName()<<endl;
298     // cout << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
299    
300     // hh = h_qtot_tau[itau][j]->ProfileX("hh");
301     // frad->SetParameter(0,1.5);//rt
302     // frad->SetParameter(1,0.5);//p
303     // frad->SetParameter(2,0.4);//rc
304     // frad->SetParameter(3,.01);//nrom
305     // hh->Fit(frad,"R","",-2,2);
306     // hh->Fit(frad,"R","",-5,5);
307     // hh->Delete();
308     //
309     if( !h_qtot_tau_wav[itau][j] )continue;
310     cout << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
311     cout << " fitting profile histo "<<h_qtot_tau_wav[itau][j]->GetName()<<endl;
312     cout << " ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "<<endl;
313    
314     TH1F *hh = h_qtot_tau_wav[itau][j];
315     frad->SetParameter(0,1.5);//rt
316     frad->SetParameter(1,0.5);//p
317     frad->SetParameter(2,0.4);//rc
318     frad->SetParameter(3,.01);//nrom
319     hh->Fit(frad,"R","",-2,2);
320     hh->Fit(frad,"R","",-5,5);
321     hh->Delete();
322    
323     };
324     };
325     frad->Delete();
326    
327     return;
328     };
329     /**
330     * Write calibration output to file
331     */
332     void CaloElectron_parameters::Calibration_Save(TFile* file){
333    
334     if(!calibmode)return;
335    
336     if( !file || (file&&file->IsZombie()) )return;
337     file->cd();
338     //
339     // int ntau = CaloElectron_parameters::Get()->par_ntau;
340     int ntau = par_ntau;
341     for(int itau=0; itau<ntau; itau++){
342     for(int j=0; j<3; j++){
343    
344     //
345     // fill weighted-average histogram
346     //
347     for(int ibin=0; ibin<CALIBNBIN; ibin++){
348     if(summW[itau][j][ibin]==0.)continue;
349     h_qtot_tau_wav[itau][j]->SetBinContent(ibin+1,summWF[itau][j][ibin]/summW[itau][j][ibin]);
350     h_qtot_tau_wav[itau][j]->SetBinError(ibin+1,1./sqrt(summW[itau][j][ibin]));
351     }
352    
353     if(h_qtot_tau[itau][j]) h_qtot_tau[itau][j]->Write();
354     if(h_qtot_tau_wav[itau][j]) h_qtot_tau_wav[itau][j]->Write();
355     }
356     }
357    
358     return;
359     };
360     /**
361     * Load calibration output histos from existing file
362     */
363     void CaloElectron_parameters::Calibration_Load(TFile* file){
364    
365    
366     if( !file || (file&&file->IsZombie()) )return;
367     file->cd();
368     cout <<" File: "<<file->GetName();
369    
370     //
371     TString hid;
372     par_ntau=0;
373     for(int i=0; i<100; i++){
374     for(int j=0; j<3; j++){
375     //
376     hid.Form("hqtottau_%i_%i",i,j);
377     TH2F* hh = (TH2F*)file->Get(hid.Data());
378     if(!hh)continue;
379     cout<<"histo --> "<<hid<<endl;
380     h_qtot_tau[i][j]=hh;
381     //
382     hid.Form("hqtottauwav_%i_%i",i,j);
383     TH1F* hhh = (TH1F*)file->Get(hid.Data());
384     if(!hhh)continue;
385     cout<<"histo --> "<<hid<<endl;
386     h_qtot_tau_wav[i][j]=hhh;
387     //
388     par_ntau=i+1;
389     }
390     }
391    
392     calibmode = 1;
393    
394     return;
395     };
396    
397    
398    
399     ////////////////////////////////////////////////////////////
400     /// CLASS IMPLEMENTATION
401     ////////////////////////////////////////////////////////////
402     /**
403     * Reset event
404     * it has to be called for each event
405     */
406     void CaloElectron::Reset(){
407    
408    
409     for(int ip=0; ip<22; ip++){
410     for(int iv=0; iv<2; iv++){
411     trkcoordx[ip][iv] = 0.;
412     trkcoordy[ip][iv] = 0.;
413     // trkcoordz[ip][iv] = 0.;
414     trkstrip[ip][iv] = 0.;
415     qplane0[ip][iv] = 0.;
416     qplane1[ip][iv] = 0.;
417     qplanefit[ip][iv] = 0.;
418     tplane[ip][iv] = -100.;
419    
420     RMS[ip][iv] = 0.;
421     SKEW[ip][iv] = 0.;
422     KURT[ip][iv] = 0.;
423     TAU[ip][iv] = 0.;
424     }
425     }
426    
427     qtot = 0.;
428    
429     tg = 0.;
430     tgx = 0.;
431     tgy = 0.;
432    
433     corr__l = 1.;
434     err__l = 0;
435     chi2__l = 0.;
436     chi2 = 0.;
437     for(int i=0; i<4; i++)par__l[i]=0.;
438    
439     }
440     /**
441     * \brief GetQ
442     * Method to retrieve the total collected charge (within RMAX and TAUMAX).
443     * @param icorr Correction level
444     * 0 = no correction
445     * 1 = lateral correction
446     * 2 = longitudinal correction
447     * 3 = ??
448     */
449     float CaloElectron::GetQ(int icorr){
450    
451     float qx,qy,qtotc;
452    
453    
454     qx = GetQView(icorr,0);
455     qy = GetQView(icorr,1);
456     qtotc = qx+qy;
457    
458     // if(qy<0.7*(qtotc/2.)){
459     // cout<<"qx "<<qx<<" qy "<<qy<<" qtotc "<<qtotc<<endl;
460     // cout<<"maybe this is image track???"<<endl;
461     // qtotc=-100.;
462     // }
463    
464     return qtotc;
465    
466     };
467     /**
468     * \brief GetQview
469     * Method to retrieve the total collected charge in each view
470     * @param icorr Correction level (0= no correction, 1=lateral correction, 2=longitudinal correction)
471     * @param iv (0=xview, 1=yview)
472     */
473     float CaloElectron::GetQView(int icorr,int iv){
474    
475    
476     float TAUMAX = CaloElectron_parameters::Get()->TAUMAX;
477     int ipmin = CaloElectron_parameters::Get()->ipmin;
478     int ipmax = CaloElectron_parameters::Get()->ipmax;
479    
480     float qqqq=0;
481    
482     // if(onlyy && iv==0) return qqqq;
483    
484    
485     float idmax,ipmaxl;
486     //se faccio così idmax deve essere rispetto al piano da cui inizio davvero
487     idmax = GetShowerMaximum(icorr);
488     // ***BUG??***
489     ipmaxl = idmax*TAUMAX+iv;
490     // ***BUG??***
491     // ipmaxl = idmax*TAUMAX;
492     if( ipmaxl>(ipmax-ipmin) ) ipmaxl=ipmax-ipmin;
493    
494     //if(ipmaxl<22) cout<<"GetQView icorr "<<icorr<<" ipmaxl="<<ipmaxl<<endl;
495    
496     // ----------------------
497     // total collected charge
498     // ----------------------
499     if(icorr==0){
500     for(int ip=ipmin; ip<ipmin+ipmaxl; ip++){
501     qqqq += qplane0[ip][iv];
502     }
503     }
504     // -------------------------------------
505     // total charge after lateral correction
506     // -------------------------------------
507     else if(icorr==1){
508     for(int ip=ipmin; ip<ipmin+ipmaxl; ip++){
509     qqqq += qplane1[ip][iv];
510     }
511     }
512     // ------------------------------------------
513     // total charge after longitudinal correction
514     // ------------------------------------------
515     else if(icorr==2){
516     for(int ip=ipmin; ip<ipmin+ipmaxl; ip++){
517     qqqq += qplane1[ip][iv];
518     }
519     qqqq=qqqq*corr__l;
520     }
521     // ------------------------------------------
522     // total charge from longitudinal fit
523     // ------------------------------------------
524     else if(icorr==3){
525     for(int ip=ipmin; ip<ipmin+ipmaxl; ip++){
526     qqqq += qplanefit[ip][iv];
527     }
528     }
529     // cout << "**** "<<ipmin << " "<<ipmin+ipmaxl<<" "<<qqqq<<" -- "<<qtot<<endl;
530    
531    
532     return qqqq;
533     };
534     /**
535     * \brief Evaluate shower maximum
536     * It gives the number of W-layers traversed at shower maximum.
537     * The charge deposited in each layer is evaluated as the averege
538     * between the adjacent x and y planes.
539     * NB: the shower depth is evaluated relative to ipmin.
540     * It goes from 0 to 22 (more generally, from 0 to ipmax-ipmin ).
541     */
542     float CaloElectron::GetShowerMaximum(float qplane[][2]){
543    
544     int ipmin = CaloElectron_parameters::Get()->ipmin;
545     int ipmax = CaloElectron_parameters::Get()->ipmax;
546    
547     int maxlayer = 0;
548     float maxq = qplane[0][1]; //0Y - first active layer
549     float q;
550     for(int il=1; il<22; il++){
551     q=0.;
552     int nxy=0;
553     float qx = qplane[il-1][0];
554     float qy = qplane[il][1];
555     bool ISHIT = true;
556     bool maskpl_x = CaloElectron_parameters::Get()->maskpl[il-1][0];
557     bool maskpl_y = CaloElectron_parameters::Get()->maskpl[il][1];
558     if( tplane[il-1][0] <0 || tplane[il][1]<0 )ISHIT=false;
559     if(ISHIT){
560     // if( !maskpl[il-1][0] )nxy++;
561     // if( !maskpl[il][1] )nxy++;
562     if( !maskpl_x )nxy++;
563     if( !maskpl_y )nxy++;
564     if(nxy>0)q=(qx+qy)/nxy;
565     if(q>maxq){
566     maxq=q;
567     maxlayer=il;
568     }
569     }
570     }
571     if( tplane[21][0] > 0 ){
572     q = qplane[21][0]; //21X - last active layer
573     if(q>maxq){
574     maxq=q;
575     maxlayer=22;
576     }
577     }
578    
579     maxlayer=maxlayer-ipmin;
580     if(maxlayer<0) maxlayer=0;
581     if(maxlayer>ipmax-ipmin) maxlayer=ipmax-ipmin;
582     return (float)maxlayer;
583     }
584    
585     /**
586     * \brief Evaluate shower maximum (id of shower maximum plane)
587     */
588     float CaloElectron::GetShowerMaximum(int icorr){
589     // ------------------------------------
590     // shower maximum before any correction
591     // ------------------------------------
592     if(icorr==0) return GetShowerMaximum(qplane0);
593     // ---------------------------------------
594     // shower maximum after lateral correction
595     // ---------------------------------------
596     if(icorr==1) return GetShowerMaximum(qplane1);
597     // ---------------------------------------
598    
599     // ---------------------------------------
600     // shower maximum from longitudinal fit
601     // ---------------------------------------
602     if(icorr==2 || icorr==3){
603     if( err__l==0 ){
604     return par__l[2]*cos(atan(tg))/(WTICK/WX0);
605     }else{
606     return GetShowerMaximum(qplane1);
607     }
608     }
609    
610     return 0.;
611    
612     }
613     /**
614     * \brief Evaluate shower maximum (in X0 unit, considering track inclination angle)
615     */
616     float CaloElectron::GetShowerMaximumX0(int icorr){
617    
618     float maxX0=0;
619     if(icorr==0 || icorr==1) maxX0=(GetShowerMaximum(icorr)/cos(atan(tg)))*(WTICK/WX0);
620     if(icorr==2 || icorr==3) maxX0=par__l[2];
621    
622     return maxX0;
623    
624     }
625    
626     float CaloElectron::GetShowerMaximumViewX0(int view,int icorr){
627    
628     float maxX0=0;
629     if(icorr==0 || icorr==1) maxX0=(GetShowerMaximumView(view,icorr)/cos(atan(tg)))*(WTICK/WX0);
630     if(icorr==2 || icorr==3) maxX0=par__l[2];
631    
632     return maxX0;
633    
634     }
635     float CaloElectron::GetShowerMaximumView(int view,float qplane[][2]){
636    
637     int ipmin = CaloElectron_parameters::Get()->ipmin;
638     int ipmax = CaloElectron_parameters::Get()->ipmax;
639     int maxlayer = 0;
640     float maxq = qplane[0][view];
641     for(int il=1; il<22; il++){
642     if(qplane[il][view]>maxq){
643     maxq = qplane[il][view];
644     maxlayer = il+1-view;
645     }
646     }
647     maxlayer=maxlayer-ipmin;
648     if(maxlayer<0) maxlayer=0;
649     if(maxlayer>ipmax-ipmin) maxlayer=ipmax-ipmin;
650     return (float)maxlayer;
651    
652     }
653     float CaloElectron::GetShowerMaximumView(int view,int icorr){
654     // ------------------------------------
655     // shower maximum before any correction
656     // ------------------------------------
657     if(icorr==0) return GetShowerMaximumView(view,qplane0);
658     // ---------------------------------------
659     // shower maximum after lateral correction
660     // ---------------------------------------
661     if(icorr==1) return GetShowerMaximumView(view,qplane1);
662     // ---------------------------------------
663    
664     // ---------------------------------------
665     // shower maximum from longitudinal fit
666     // ---------------------------------------
667     if(icorr==2 || icorr==3){
668     if(err__l==0){
669     return par__l[2]*cos(atan(tg))/(WTICK/WX0);
670     }else{
671     return GetShowerMaximumView(view,qplane1);
672     }
673     }
674    
675     return 0.;
676    
677     }
678    
679    
680     /**
681     * \brief Set event
682     */
683     bool CaloElectron::Set(CaloLevel1 *cl1,float trackcoordinate[][2]){
684    
685     if(!cl1 || !trackcoordinate ){
686     cout <<" void CaloElectron::Set(CaloLevel1 *cl1, float tracoo[22][2]) -- ERROR -- input == NULL"<<endl;
687     return false;
688     }
689     //
690     CaloElectron_parameters::Get()->cl1 = cl1; //set CaloLevel1 event
691     CaloStrip cstrip;
692    
693    
694     // -------------------
695     // retrieve parameters
696     // -------------------
697     bool debug = CaloElectron_parameters::Get()->debug;
698     float RMAX = CaloElectron_parameters::Get()->RMAX;
699     int dolatcorr = CaloElectron_parameters::Get()->dolatcorr;
700     int dolongfit = CaloElectron_parameters::Get()->dolongfit;
701     int ipmin = CaloElectron_parameters::Get()->ipmin;
702     int ipmax = CaloElectron_parameters::Get()->ipmax;
703    
704     int calibmode = CaloElectron_parameters::Get()->calibmode;
705    
706     // gBenchmark->Start("conta");
707    
708     // --------------------------
709     // reset energy-deposit plots
710     // --------------------------
711     TH2F* h_qtot[2];
712     for(int iv=0; iv<2; iv++){
713     h_qtot[iv] = CaloElectron_parameters::Get()->h_qtot[iv];
714     if(!h_qtot[iv])return false;
715     h_qtot[iv]->Reset();
716     }
717    
718     // cout <<"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "<< CaloElectron_parameters::Get() << endl;
719     // cout <<"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "<< CaloElectron_parameters::Get()->cl1 << endl;
720     // cout <<"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% "<< cl1 << endl;
721    
722    
723     if( cl1->istrip < 5 )return false;
724    
725    
726     // float trkstrip[22][2]; // strip traversed by the track
727     //
728     for(int ip=0; ip<22; ip++){
729     for(int iv=0; iv<2; iv++){
730     // --------------------------------------
731     // determine strip traversed by the track
732     // --------------------------------------
733     // Float_t coo(0),lad(0),stri(0);
734     // Float_t xcorner,ycorner;
735     // GetCornerCoord(ip,iv,xcorner,ycorner);
736     // if(iv==0) coo = (trackcoordinate[ip][iv]-xcorner)*10.;
737     // if(iv==1) coo = (trackcoordinate[ip][iv]-ycorner)*10.;
738     // if(coo<80.25) lad=1;
739     // if(coo>80.25 && coo<160.75) lad=2;
740     // if(coo>160.75) lad=3;
741     // stri=32*(lad-1)+(coo-(lad-1)*80.5-0.96)/2.44;
742     // Int_t trkstripnew = (Int_t)stri;
743     // if(stri-trkstripnew>0.5) trkstripnew=trkstripnew+1;
744     // trkstrip[ip][iv]=trkstripnew;
745     // if(coo<0. || coo> 241.)trkstrip[ip][iv]=-1.;
746     //
747     // non so perche` ma mi sembra che sia sbagliato...
748     // ci riprovo a modo mio:
749     //
750     trkstrip[ip][iv]=-1.;
751     float xy[2];
752     for(int is=0; is<96; is++){
753     cstrip.Set(iv,ip,is);
754     xy[0] = cstrip.GetX();
755     xy[1] = cstrip.GetY();
756     if(
757     trackcoordinate[ip][iv] >= xy[iv] - 0.5*PITCH &&
758     trackcoordinate[ip][iv] < xy[iv] + 0.5*PITCH &&
759     true){
760     trkstrip[ip][iv] = is;
761     break;
762     }
763     };
764     }
765     }
766    
767    
768     // cout << " 1 ------------------ init"<<endl;
769     // gBenchmark->Print("conta");
770    
771    
772     //<><><><><><><><><><><><><><><><><><><><><><><><>
773     // LOOP OVER HIT STRIPS
774     // - to set charge collected in each plane
775     // - to fill energy-deposit plot (if required)
776     //<><><><><><><><><><><><><><><><><><><><><><><><>
777    
778     int isimu = CaloElectron_parameters::Get()->isimu;
779     if(isimu==0)cstrip = CaloStrip(cl1,false);//conferma da Emiliano
780     if(isimu==1)cstrip = CaloStrip(cl1,true);
781    
782     float xy[2];
783     for(int ih=0;ih<cl1->istrip;ih++){
784     int iv=-1;
785     int ip=-1;
786     int is=-1;
787     cl1->DecodeEstrip(ih,iv,ip,is);
788     cstrip.Set(iv,ip,is);
789     // enestr[is][ip][iv] = cstrip.GetE();
790     xy[0] = cstrip.GetX();
791     xy[1] = cstrip.GetY();
792     if( TMath::Abs(trackcoordinate[ip][iv]-xy[iv]) < RMAX )
793     qplane0[ip][iv] += cstrip.GetE(); //<< QPLANE0
794     bool maskpl = CaloElectron_parameters::Get()->maskpl[ip][iv];
795     if(
796     ip>=ipmin &&
797     ip<ipmax &&
798     !maskpl &&
799     true){
800     qtot += cstrip.GetE();//<< QTOT
801     //
802     // h_qtot[iv]->Fill( (float)(is+iv*96), (float)ip, cstrip.GetE());
803     // retrieve the coordinate of the bottom-left corner of the plane
804     float corner[] = {0.,0.};
805     GetCornerCoord(ip,iv,corner[0],corner[1]);
806     h_qtot[iv]->Fill( xy[iv]-corner[iv], (float)ip, cstrip.GetE());
807     }
808     // cout <<(float)(is+iv*96)<<(float)ip<<cstrip.GetE()<<endl;
809     }
810    
811     // cout << " 2 ------------------ read charge"<<endl;
812     // gBenchmark->Print("conta");
813    
814     // ------------------------------------------------
815     // set track intersection coordinate in each plane
816     // and evaluate shower depth
817     // ------------------------------------------------
818    
819     float trkcoordz[22][2]; ///< track coordinates (PAMELA r.s.)
820    
821     for(int ip=0; ip<22; ip++){
822     for(int iv=0; iv<2; iv++){
823     cstrip.Set(iv,ip,0);
824     trkcoordz[ip][iv] = cstrip.GetZ();
825     }
826     }
827     tgx = (trackcoordinate[0][0]-trackcoordinate[21][0])/(trkcoordz[0][0]-trkcoordz[21][0]);
828     tgy = (trackcoordinate[0][1]-trackcoordinate[21][1])/(trkcoordz[0][1]-trkcoordz[21][1]);
829     tg = sqrt(pow(trackcoordinate[0][1]-trackcoordinate[21][1],2)+pow(trackcoordinate[0][0]-trackcoordinate[21][0],2))/(trkcoordz[0][1]-trkcoordz[21][1]);
830    
831     bool TRACK_OUT = false;
832     for(int ip=0; ip<22; ip++){
833     for(int iv=1; iv>=0; iv--){
834     if(iv==0){
835     trkcoordx[ip][0] = trackcoordinate[ip][0]; //track intersection coordinate
836     trkcoordy[ip][0] = trackcoordinate[ip][1] + (trkcoordz[ip][0]-trkcoordz[ip][1])*tgy; //track intersection coordinate
837     }else{
838     trkcoordx[ip][1] = trackcoordinate[ip][0] + (trkcoordz[ip][1]-trkcoordz[ip][0])*tgx; //track intersection coordinate
839     trkcoordy[ip][1] = trackcoordinate[ip][1]; //track intersection coordinate
840     }
841     // ---------------------------------------------
842     // if the track go out of the calorimeter, break
843     // ---------------------------------------------
844     if( trkstrip[ip][iv] == -1 ){
845     //TRACK_OUT = true;
846     if(debug)cout << "ip="<<ip <<" iv="<<iv<<" --> TRACK OUT";
847     }
848     if( !TRACK_OUT ){
849     // shower depth in units of radiation length (TO BE CHECKED)
850     tplane[ip][iv] = GetNWLayers(ip,iv) * sqrt(tgx*tgx+tgy*tgy+1) * WTICK/WX0;//sqrt(tgx*tgx+tgy*tgy+1)=1/cos(atan(tg)
851     qplane1[ip][iv] = qplane0[ip][iv]; // initialize qplane1
852     }else return false;
853     }
854     }
855    
856     // cout << " 3 ------------------ get track coordinates"<<endl;
857     // gBenchmark->Print("conta");
858    
859     if(GetQ(0)<1){
860     cout<<"Don't go on ..GetQ(0) "<<GetQ(0)<<endl;
861     return false;
862     }
863     if(GetShowerMaximum(0)<1 || GetShowerMaximum(0)>21){
864     cout<<"Don't go on ..GetShowerMaximum(0) "<<GetShowerMaximum(0)<<endl;
865     return false;
866     }
867    
868     // -----------------------------------------
869     // fill calibration histograms (if required)
870     // -----------------------------------------
871    
872     if( calibmode )Calibration_Fill();
873    
874     // -----------------------------------------
875     // apply lateral correction
876     // -----------------------------------------
877    
878     if(dolatcorr==0) return true;
879    
880     float maxlayer;
881     int niter;
882     float corr;
883    
884     maxlayer = 0.;
885     corr = 0.;
886     niter = 0;
887     do{
888     niter++;
889     maxlayer = GetShowerMaximum(1);
890     corr = ApplyLateralCorrection(maxlayer);
891     }while( maxlayer != GetShowerMaximum(1) && niter < 3);
892    
893     if(debug && niter>1)cout<<"WARNING! - lateral correction iterated "<<niter<<" times"<<endl;
894    
895     if(debug)cout << "LATERAL CORRECTION FACTOR = "<<corr<<endl;
896    
897     // cout << " 4 ------------------ lateral correction"<<endl;
898     // gBenchmark->Print("conta");
899    
900     if(GetQ(1)<1){
901     cout<<"Don't go on ..GetQ(1) "<<GetQ(1)<<endl;
902     return false;
903     }
904    
905     // -----------------------------------------
906     // apply longitudinal correction
907     //possible dolongfit values are:
908     //-1 don't apply longitudinal correction
909     //0 apply to q0 (charge collected by each plane inside RMAX)
910     //1 apply to q1 (charge collected by each plane with lateral collection inside RMAX )
911     // -----------------------------------------
912    
913     if(dolongfit<0) return true;
914    
915     int ret = ApplyLongitudinalFit(dolongfit);
916    
917     // cout << " 5 ------------------ longitudinal fit"<<endl;
918     // gBenchmark->Print("conta");
919    
920     if( ret==0 ){
921     corr = ApplyLateralCorrection( GetShowerMaximum(2) );
922     ret = ApplyLongitudinalFit(dolongfit);
923     corr__l = GetLongitudinalCorrection();
924     chi2 = ProfileTest();
925     }
926     if(debug){
927     cout << "LATERAL CORRECTION FACTOR (iterated) = "<<corr<<endl;
928     cout << "LONGITUDINAL CORRECTION FACTOR = "<<corr__l<<endl;
929     }
930     // cout << " 6 ------------------ iteration"<<endl;
931     // gBenchmark->Print("conta");
932    
933     // if(ret==0 || ret==10){
934     // if(debug)cout << ">> Longitudinal correction from level "<<dolongfit<<" corr__l "<<corr__l<<endl;
935     // if(GetLongitudinalFcnout()>600){
936     // cout<< "too big GetLongitudinalFcnout() "<<GetLongitudinalFcnout()<<endl;
937     // //return false;
938     // }
939     // }else{
940     // cout<< ">> problems with Longitudinal correction!"<<endl;
941     // //return false;
942     // }
943    
944    
945    
946     return true;
947    
948     }
949     /**
950     * \brief Set event
951     */
952     bool CaloElectron::Set(CaloLevel1 *cl1, CaloTrkVar* ctrk){
953    
954     if(!cl1 ||!ctrk){
955     cout <<" void CaloElectron::Set(CaloLevel1 *cl1, CaloTrkVar* ctrk) -- ERROR -- input == NULL"<<endl;
956     return false;
957     }
958    
959     float trackcoordinate[22][2];
960    
961     for(int ip=0; ip<22; ip++){
962     for(int iv=0; iv<2; iv++){
963     trackcoordinate[ip][iv]=ctrk->tbar[ip][iv];
964     // trkstrip[ip][iv]=ctrk->tibar[ip][iv];
965     }
966     }
967     return Set(cl1,trackcoordinate);
968    
969     };
970     /**
971     * \brief Set event
972     */
973     bool CaloElectron::Set(PamLevel2 *l2, int ntr){
974    
975     CaloLevel1* cl1 = l2->GetCaloLevel1();
976     CaloTrkVar* ctrk = 0;
977     if( ntr < l2->GetTrkLevel2()->GetNTracks() )ctrk = l2->GetTrack(ntr)->GetCaloTrack();
978     return Set(cl1,ctrk);
979    
980     };
981    
982    
983     /**
984     * \brief Method to apply lateral correction
985     * @param maxl shower maximum, in units of W-layers
986     */
987     float CaloElectron::ApplyLateralCorrection( float maxl ){
988    
989     bool debug = CaloElectron_parameters::Get()->debug;
990     float TAUMAX = CaloElectron_parameters::Get()->TAUMAX;
991     // float RMAX = CaloElectron_parameters::Get()->RMAX;
992     int ipmin = CaloElectron_parameters::Get()->ipmin;
993     int ipmax = CaloElectron_parameters::Get()->ipmax;
994    
995     if( debug ) cout << "CaloElectron::ApplyLateralCorrection(maxl="<<maxl<<")"<<endl;
996    
997     if( maxl <=0 )return 0.;
998     if( GetQ(0) <=0 )return 0.;
999    
1000     for(int ip=ipmin; ip<ipmax; ip++){
1001     for(int iv=1; iv>=0; iv--){
1002    
1003     double corr=1.;
1004     // evaluate the shower-depth of the plane
1005     float nlayer = (float)GetNWLayers(ip,iv);
1006     double tau = (double)(nlayer-ipmin)/(double)maxl;
1007     int ibintau = (int)(tau/0.25);
1008     if( ibintau>=12 ) ibintau=11;
1009     // retrieve the coordinate of the bottom-left corner of the plane
1010     float xcorner = 0;
1011     float ycorner = 0;
1012     GetCornerCoord(ip,iv,xcorner,ycorner);
1013     // evaluate track coordinate relative to the plane corner
1014     double xpl = (double)trkcoordx[ip][iv] - (double)xcorner;
1015     double ypl = (double)trkcoordy[ip][iv] - (double)ycorner;
1016     // trkcoordxpl[ip][iv] = xpl;
1017     // trkcoordypl[ip][iv] = ypl;
1018     //cout<<"ip "<<ip<<" iv "<<iv<<" xpl "<<xpl<<" ypl "<<ypl<<" trkcoordx "<<trkcoordx[ip][iv]<<" trkcoordy "<<trkcoordy[ip][iv]<<endl;
1019     // -----------------------------------------------------
1020     // evaluate lateral correction if:
1021     // - the plane is traversed by the track (tplane!=-100)
1022     // - the plane is not the first active layer (tplane =0)
1023     // - the plane correspond to tau lower then TAUMAX
1024     // -----------------------------------------------------
1025     corr=1.;//correction has no effect if tau>TAUMAX
1026     bool maskpl = CaloElectron_parameters::Get()->maskpl[ip][iv];
1027     // if( !maskpl[ip][iv] ){
1028     if( !maskpl ){
1029     if( tplane[ip][iv] > 0 && tau<TAUMAX ){
1030     int iiv=0;
1031     if(iv==0) iiv=0;
1032     if(iv==1 && ip%2) iiv=1;
1033     if(iv==1 && !ip%2) iiv=2;
1034     corr = GetLateralCorrection(xpl,ypl,ibintau,iiv);
1035     }
1036     }
1037     qplane1[ip][iv] = qplane0[ip][iv] / corr;
1038     // if(debug && corr<0.5){
1039     // cout <<" qp0 "<<qplane0[ip][iv];
1040     // cout <<" qp1 "<<qplane1[ip][iv];
1041     // cout <<" ip "<<ip<<" iv "<<iv<<" tau "<<tau<<endl;
1042     // }
1043     }
1044     }
1045    
1046     return GetQ(1)/GetQ(0);
1047    
1048     // corr = GetQ(1)/GetQ(0);
1049    
1050     // //questo disegna due grafici con la carica rilasciata nelle viste x e y prima e dopo la correzione
1051     // if(dodrawq0q1){
1052    
1053     // Double_t tgx[22],tgy[22],qx[22],qy[22],qx1[22],qy1[22];
1054    
1055     // for(int ip=0; ip<22; ip++){
1056     // tgx[ip]=tplane[ip][0];
1057     // tgy[ip]=tplane[ip][1];
1058     // qx[ip]=qplane0[ip][0];
1059     // qy[ip]=qplane0[ip][1];
1060     // qx1[ip]=qplane1[ip][0];
1061     // qy1[ip]=qplane1[ip][1];
1062     // }
1063    
1064     // TGraph *gqx= new TGraph(22,tgx,qx);
1065     // TGraph *gqy= new TGraph(22,tgy,qy);
1066     // TGraph *gqx1= new TGraph(22,tgx,qx1);
1067     // TGraph *gqy1= new TGraph(22,tgy,qy1);
1068     // TCanvas a;a.Divide(2,1);a.cd(1);
1069     // a.cd(1);
1070     // gqx1->SetMarkerColor(2);gqx1->SetMarkerStyle(7);gqx1->Draw("AP");
1071     // gqx->SetMarkerColor(1);gqx->SetMarkerStyle(7);gqx->Draw("Psame");
1072     // a.cd(2);
1073     // gqy1->SetMarkerColor(2);gqy1->SetMarkerStyle(7);gqy1->Draw("AP");
1074     // gqy->SetMarkerColor(1);gqy->SetMarkerStyle(7);gqy->Draw("Psame");
1075     // a.Update();
1076     // int salvalo;
1077     // cout<<"save dodrawq0q1 (1 yes, 0 no)??";
1078     // cin>>salvalo;
1079     // if(salvalo>1) a.Print(Form("./gq0q1_%d.root",salvalo));
1080     // else if(salvalo==1) a.Print("electronq0q1.root");
1081    
1082     // }// end of if(dodrawq0q1)
1083    
1084     // //questo disegna la distribuzione laterale sul un certo piano e vista
1085     // //con la posizione dei gap e la funzione usata per correggere
1086     // if(dodrawq0q1){
1087    
1088     // int iv,ip,iiv(0);
1089     // float iwmax,iw;
1090     // cout<<"which plane and view?"<<endl;
1091     // cin>>ip>>iv;
1092     // if(iv==0)iiv=0;
1093     // if(iv==1 && ip%2) iiv=1;
1094     // if(iv==1 && !ip%2) iiv=2;
1095     // iwmax=GetShowerMaximum(0);
1096     // iw=ip+(iv-1);
1097     // int ibintau=(int)((iw/iwmax)/0.25);
1098     // cout<<"plane "<<ip<<" iv "<<iv<<" iiv "<<iiv<<" iwmax "<<iwmax<<" iw "<<iw<<" ibintau "<<(iw/iwmax)/0.25<<" "<<ibintau<<" ..setting parameter "<<endl;
1099     // cout<<file_rt[ibintau][iiv]<<" "<<file_p[ibintau][iiv]<<" "<<file_rc[ibintau][iiv]<<endl;
1100     // if(ibintau>=12) ibintau=11;
1101     // int nparam=5;
1102     // TF1 ff = TF1("fradpro",fradpro,-RMAXsp,RMAXsp,nparam);
1103     // Double_t param[5];
1104     // param[0]=file_rt[ibintau][iiv];
1105     // param[1]=file_p[ibintau][iiv];
1106     // param[2]=file_rc[ibintau][iiv];
1107     // param[3]=qplane0[ip][iv];
1108     // //param[4]=trkcoordx[ip][iv];
1109     // param[4]=0.;
1110     // cout<<"plane "<<ip<<" iv "<<iv<<" ibintau "<<ibintau<<" ..setting parameter "<<endl;
1111     // for(int i=0;i<nparam;i++){
1112     // ff.SetParameter(i,param[i]);
1113     // cout<<" "<<i<<" -> "<<param[i]<<endl;
1114     // }
1115    
1116    
1117     // CaloStrip st = CaloStrip();
1118     // CaloStrip st1 = CaloStrip();
1119     // CaloStrip st2 = CaloStrip();
1120     // if(isimu==0)st.UseStandardAlig();
1121     // if(isimu==1)st.UseMechanicalAlig();
1122     // TH1F *hgap=new TH1F("hgap","hgap",34,-RMAXsp,RMAXsp);
1123     // float posgap1(0),posgap2(0);
1124     // st1.Set(iv,ip,31);st2.Set(iv,ip,32);
1125     // if (iv==0) posgap1=(st1.GetX()+st2.GetX())/2.-trkcoordx[ip][iv];
1126     // if (iv==1) posgap1=(st1.GetY()+st2.GetY())/2.-trkcoordy[ip][iv];
1127     // st1.Set(iv,ip,63);st2.Set(iv,ip,64);
1128     // if (iv==0) posgap2=(st1.GetX()+st2.GetX())/2.-trkcoordx[ip][iv];
1129     // if (iv==1) posgap2=(st1.GetY()+st2.GetY())/2.-trkcoordy[ip][iv];
1130    
1131     // hgap->Fill(posgap1,100.);
1132     // hgap->Fill(posgap2,100.);
1133    
1134    
1135     // TH1F *h=new TH1F("h","h",34,-RMAXsp,RMAXsp);
1136     // float binsize=8./34.;
1137     // double e(0),d(0),etot(0);
1138     // for(int is=0;is<96;is++){
1139     // e=enestr[is][ip][iv];
1140     // if(e>0.){
1141     // st.Set(iv,ip,is);
1142     // if (iv==0) d=st.GetX()-trkcoordx[ip][iv];
1143     // if (iv==1) d=st.GetY()-trkcoordy[ip][iv];
1144     // if(TMath::Abs(d)<RMAXsp){
1145     // etot=etot+e;
1146     // cout<<"filling is "<<is<<" d "<<d<<" e "<<e<<endl;
1147     // h->Fill(d,e/binsize);
1148     // }
1149     // }
1150     // }
1151     // TCanvas a;a.Divide(2,1);a.cd(1);
1152     // h->Draw();//ff.Draw("same");
1153     // a.cd(2);ff.Draw(); h->Draw("same");hgap->SetFillColor(2);hgap->Draw("same");
1154     // a.Update();
1155     // cout<<"plane "<<ip<<" iv "<<iv<<" corr "<<qplane1[ip][iv]/qplane0[ip][iv]<<endl;
1156     // cout<<" h->Integral(width) "<<h->Integral("width")<<" h->Integral() "<<h->Integral()<<" ff.Integral() "<<ff.Integral(-12.,12.,param,1.e-12)<<" etot "<<etot<<endl;
1157    
1158     // int salvalo;
1159     // cout<<"save dodrawlat (1 yes, 0 no)??";
1160     // cin>>salvalo;
1161     // //potrei provare a calcolare il fattore di correzione su ogni piano da questo confronto e
1162     // //confrontarlo con quello che viene dal mio metodo
1163    
1164     // }
1165    
1166     // return corr;
1167    
1168     }
1169     ////////////////////////////////////////////////////////////////////////
1170     /**
1171     * 1-dimension function describing lateral distribution of the
1172     * shower as viewed by calorimeter
1173     * (projection of 3d function in one direction)
1174     *
1175     * xi[0] = x or y coordinate relative to shower axis
1176     * parmin[0] = rt
1177     * parmin[1] = p
1178     * parmin[2] = rc
1179     * parmin[3] = norm
1180     * parmin[4] = x0,y0
1181     *
1182     */
1183     ////////////////////////////////////////////////////////////////////////
1184     double fradpro(Double_t *xi, Double_t *parmin) {
1185    
1186     double fradpromin2,p,rt,rc,es,x,pig,norm,c;
1187     x = *xi;
1188     pig = acos(-1.);
1189    
1190     rt = parmin[0];
1191     p = parmin[1];
1192     rc = parmin[2];
1193    
1194     norm = parmin[3];
1195     c = parmin[4];
1196     x = x-c;
1197     es = 1.5;
1198     fradpromin2 = p*pig*pow(rc,2)/pow((pow(x,2)+pow(rc,2)),es);
1199     fradpromin2 = fradpromin2+(1-p)*pig*pow(rt,2)/pow((pow(x,2)+pow(rt,2)),es);
1200     fradpromin2 = norm*fradpromin2/(2*pig);
1201     //cout<<"x,fradpromin2 "<< x<<" "<<fradpromin2 <<endl;
1202     return fradpromin2;
1203     }
1204     ////////////////////////////////////////////////////////////////////////
1205     /**
1206     * 2-dimension function describing lateral distribution of the shower
1207     *
1208     * xyi[0] = x coordinate relative to shower axis
1209     * xyi[1] = y coordinate relative to shower axis
1210     * parmin[0] = rt
1211     * parmin[1] = p
1212     * parmin[2] = rc
1213     *
1214     */
1215     ////////////////////////////////////////////////////////////////////////
1216     double frad(double *xyi, double *parmin) {
1217    
1218     double fradout,p,rt,rc,pig,r2;
1219    
1220     r2 = pow(xyi[0],2)+pow(xyi[1],2);
1221     pig = acos(-1.);
1222    
1223     rt = parmin[0];
1224     p = parmin[1];
1225     rc = parmin[2];
1226    
1227     fradout = p*2*pow(rc,2)/pow((r2+pow(rc,2)),2);
1228     fradout = fradout+(1-p)*2*pow(rt,2)/pow((r2+pow(rt,2)),2);
1229     fradout = fradout/(2*pig);
1230    
1231     return fradout;
1232     };
1233     ////////////////////////////////////////////////////////////////////////
1234     /**
1235     * 2-dimension function describing lateral distribution of the shower, with
1236     * the second variable implemented as a parameter
1237     *
1238     * xyi[0] = x or y coordinate relative to shower axis
1239     * parmin[0] = rt
1240     * parmin[1] = p
1241     * parmin[2] = rc
1242     * parmin[3] = other coordinate
1243     *
1244     */
1245     ////////////////////////////////////////////////////////////////////////
1246     double fradx(double *xyi, double *parmin) {
1247    
1248     double fradout,p,rt,rc,pig,r2;
1249    
1250     r2 = pow(xyi[0],2)+pow(parmin[3],2);
1251     pig = acos(-1.);
1252    
1253     rt = parmin[0];
1254     p = parmin[1];
1255     rc = parmin[2];
1256    
1257     fradout = p*2*pow(rc,2)/pow((r2+pow(rc,2)),2);
1258     fradout = fradout+(1-p)*2*pow(rt,2)/pow((r2+pow(rt,2)),2);
1259     fradout = fradout/(2*pig);
1260    
1261     return fradout;
1262     };
1263    
1264    
1265     /**
1266     * \brief Evaluate lateral correction factor
1267     */
1268     double CaloElectron::GetLateralCorrection(double xpl, double ypl, int ibintau, int iv){
1269    
1270     TF2 ff = TF2("frad",frad,-25.,25.,-25.,25.,3);
1271    
1272     int ivqui = iv;
1273    
1274     float file_rt = CaloElectron_parameters::Get()->file_rt[ibintau][ivqui];
1275     float file_p = CaloElectron_parameters::Get()->file_p[ibintau][ivqui];
1276     float file_rc = CaloElectron_parameters::Get()->file_rc[ibintau][ivqui];
1277    
1278     ff.SetParameter(0,file_rt);
1279     ff.SetParameter(1,file_p);
1280     ff.SetParameter(2,file_rc);
1281    
1282     double corr = GetLateralCorrection(xpl,ypl,&ff,iv);
1283     return corr;
1284     };
1285     /**
1286     * \brief Evaluate lateral correction factor
1287     */
1288     double CaloElectron::GetLateralCorrection(double xpl, double ypl, TF2* ff,int iv){
1289    
1290     float RMAXsp = CaloElectron_parameters::Get()->RMAXsp;
1291     float RMAX = CaloElectron_parameters::Get()->RMAX;
1292    
1293     double x1,x2,x3,x4,x5,x6,ps[3];
1294     x1 = DEAD;
1295     x2 = x1 + PITCH*32;
1296     x3 = x2 + DEAD + GLUE + DEAD;
1297     x4 = x3 + PITCH*32;
1298     x5 = x4 + DEAD + GLUE + DEAD;
1299     x6 = x5 + PITCH*32;
1300     ps[0] = x1;
1301     ps[1] = x3;
1302     ps[2] = x5;
1303     double integgap(0),integgaptmp(0),integnogap(0),correggif(0);
1304     double epsil=0.0001;
1305     for (Int_t ii=0;ii<3;ii++){
1306     for (Int_t jj=0;jj<3;jj++){
1307     double xmi = ps[ii] - xpl;
1308     double xma = xmi + PITCH*32;
1309     double ymi = ps[jj] - ypl;
1310     double yma = ymi + PITCH*32;
1311     int dointeg=1;
1312     if(iv==0){
1313     if(xmi<-RMAXsp && xma>-RMAXsp) xmi=-RMAXsp;
1314     if(xma>RMAXsp && xmi<RMAXsp) xma=RMAXsp;
1315     if(xmi>RMAXsp || xma<-RMAXsp)dointeg=0;
1316     }
1317     if(iv==1 || iv==2){
1318     if(ymi<-RMAXsp && yma>-RMAXsp) ymi=-RMAXsp;
1319     if(yma>RMAXsp && ymi<RMAXsp) yma=RMAXsp;
1320     if(ymi>RMAXsp || yma<-RMAXsp)dointeg=0;
1321     }
1322     if(dointeg==1){
1323     integgaptmp=ff->Integral(xmi,xma,ymi,yma,epsil);
1324     integgap += integgaptmp;
1325     }
1326     }
1327     }
1328    
1329     double RPMAX=40.;
1330     double xmin(0),xmax(0),ymin(0),ymax(0);
1331     if(iv==0){
1332     ymin=-RPMAX;
1333     ymax=RPMAX;
1334     xmin=-RMAX;
1335     xmax=RMAX;
1336     }
1337     if(iv==1 || iv==2){
1338     xmin=-RPMAX;
1339     xmax=RPMAX;
1340     ymin=-RMAX;
1341     ymax=RMAX;
1342     }
1343     integnogap=ff->Integral(xmin,xmax,ymin,ymax,epsil);
1344    
1345     correggif=integgap/integnogap;
1346    
1347     return correggif;
1348    
1349     }
1350     // ---------------------------------------------------------------------
1351     // TMinuit does not allow fcn to be a member function, and the function
1352     // arguments are fixed, so the one of the only ways to bring the data
1353     // into fcn is to declare the data as global.
1354     // ---------------------------------------------------------------------
1355     //
1356     Int_t iuse;
1357     Double_t zfit[44],tfit[44],errorzfit[44],errortfit[44];
1358     //Float_t corr,m,q,lp1m,lp2m,sig1,sig2;Float_t parglobali[4];
1359     //______________________________________________________________________________
1360     Double_t func(Double_t *tin,Double_t *par)
1361     {
1362    
1363     Double_t gaa,a,tm,et,value,t,t0;
1364     t = *tin;
1365     et = par[0];
1366     a = par[1];
1367     tm = par[2];
1368     t0 = par[3];
1369     gaa = TMath::Gamma(a);
1370    
1371     value = et*((a-1)/(tm*gaa))*pow(((a-1)*(t-t0)/tm),(a-1))*exp(-(a-1)*(t-t0)/tm);
1372    
1373     return value;
1374     }
1375     //______________________________________________________________________________
1376     // fcn passes back f = chisq the function to be minimized.
1377     void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
1378     {
1379    
1380     int iusequi=0;
1381     Double_t chisq = 0.;
1382     for (int i=0;i<iuse; i++) {
1383     if(tfit[i]>=par[3]){
1384     iusequi++;
1385     Double_t fu=func(&tfit[i],par);
1386     Double_t delta = (zfit[i]-fu)/errorzfit[i];
1387     chisq += delta*delta;
1388     }
1389     }
1390    
1391     //cout<<"iusequi,par,fcn "<<iusequi<<" "<<par[0]<<" "<<par[1]<<" "<<par[2]<<" "<<chisq<<endl;
1392     f = chisq;
1393    
1394     }
1395    
1396     /**
1397     * \brief Method to apply longitudinal correction
1398     * @param longto Fit options:
1399     * -1 don't apply longitudinal correction
1400     * 0 apply to q0 (charge collected by each plane inside RMAX)
1401     * 1 apply to q1 (charge collected by each plane with lateral collection inside RMAX )
1402     */
1403     int CaloElectron::ApplyLongitudinalFit(int longto){
1404    
1405     cout << "CaloElectron::ApplyLongitudinalFit("<<longto<<") ---> temporarily commented (problems with TMinuit!!)"<<endl;
1406    
1407     // bool debug = CaloElectron_parameters::Get()->debug;
1408     // float TAUMAX = CaloElectron_parameters::Get()->TAUMAX;
1409     // // float RMAX = CaloElectron_parameters::Get()->RMAX;
1410     // int ipmin = CaloElectron_parameters::Get()->ipmin;
1411     // int ipmax = CaloElectron_parameters::Get()->ipmax;
1412    
1413     // if( debug ) cout << "CaloElectron::ApplyLongitudinalFit("<<longto<<")"<<endl;
1414    
1415     // float ipmaxl = ipmax-ipmin;
1416    
1417     // /// ?????
1418     // if(GetShowerMaximum(longto)*TAUMAX<ipmax-ipmin){
1419     // corr__l = 1;
1420     // err__l = 10;
1421     // if(debug){
1422     // cout<<"GetShowerMaximum(longto) "<<GetShowerMaximum(longto)<<" TAUMAX "<<TAUMAX<<" ipmax-ipmin "<<ipmax-ipmin<<endl;
1423     // }else{
1424     // return err__l;
1425     // }
1426     // }
1427    
1428     // // initialize TMinuit with a maximum of 5 params
1429     // TMinuit *minuit = new TMinuit(4);
1430    
1431     // // cout << minuit << endl;
1432     // if(!debug) minuit->SetPrintLevel(-1);
1433     // if( debug) minuit->SetPrintLevel(-1);
1434     // minuit->SetFCN(fcn);
1435    
1436    
1437     // // cout << "<><><><><><><><><><><><><"<<endl;
1438     // // --------------------------------------------
1439     // // Set layers to be used for the fit
1440     // // --------------------------------------------
1441     // Double_t arglist[10];
1442     // Int_t ierflg = 0;
1443     // iuse = 0;//n.layers included in the fit
1444     // for(int ip=ipmin; ip<ipmin+ipmaxl; ip++){
1445     // //for(int iv=0; iv<2; iv++){
1446     // for(int iv=1; iv>=0; iv--){
1447     // bool maskpl = CaloElectron_parameters::Get()->maskpl[ip][iv];
1448     // if(!maskpl){
1449     // if(longto==0) zfit[iuse] = qplane0[ip][iv];
1450     // if(longto==1) zfit[iuse] = qplane1[ip][iv];
1451     // tfit[iuse] = (double)tplane[ip][iv]-(double)tplane[ipmin][1];
1452     // errortfit[iuse] = 0.01;
1453     // errorzfit[iuse] = sqrt( zfit[iuse] );
1454     // if(zfit[iuse]<0.0001) errorzfit[iuse] = 1.;
1455     // // if(debug)cout<<"iuse,ip,iv,tplane,t,z "<<iuse<<" "<<ip<<" "<<iv<<" "<<tplane[ip][iv]<<" "<<tfit[iuse]<<" "<<zfit[iuse]<<endl;
1456     // iuse++;
1457     // }
1458     // }
1459     // }
1460     // if(debug)cout << "N.layers inlcuded in the fit: "<<iuse<<endl;
1461    
1462     // // --------------------------------------------
1463     // // Set starting values and step sizes for param
1464     // // --------------------------------------------
1465     // Double_t size = (double)tplane[2][1]-(double)tplane[1][1];
1466     // Double_t initpar0 = 0;
1467     // for(int ip=ipmin+1; ip<ipmin+ipmaxl; ip++)
1468     // initpar0 = initpar0 + size*(zfit[ip*2]+zfit[ip*2-1])/2;
1469     // Double_t initpar2 = GetShowerMaximumX0(longto);
1470     // Double_t initpar1 = pow(initpar2,0.9);
1471     // Double_t initpar3 = 0.;
1472    
1473     // Double_t vstart[4] = {initpar0, initpar1, initpar2, initpar3};
1474     // Double_t step[4] = {1.,0.1,1.,0.1};
1475     // Double_t limmin[4] = {0,0.,0.,0};
1476     // Double_t limmax[4] = {0,20.,20.,0};
1477     // string parname[4] = {"E","alpha","tm","t0"};
1478    
1479     // // --------------------------------------------
1480     // // Now ready for minimization step with limits
1481     // // --------------------------------------------
1482     // if(debug)cout << "--------------------- First step (with limits): "<<endl;
1483     // for (int i=0; i<4; i++)
1484     // minuit->mnparm(i, parname[i].c_str(),vstart[i],step[i],limmin[i],limmax[i],ierflg);
1485     // minuit->FixParameter(3);//fix starting point
1486     // arglist[0] = 500;
1487     // minuit->mnexcm("MIGRAD", arglist ,1,ierflg);
1488     // err__l = ierflg;
1489     // if(ierflg>0){
1490     // if(debug){
1491     // cout<<"ierflg "<<ierflg<<" ma prova ad andare avanti"<<endl;
1492     // }else{
1493     // return err__l;
1494     // }
1495     // }
1496    
1497     // Double_t vstart2[4];
1498     // Double_t vend[4],errvend[4];
1499    
1500     // for(int i=0; i<4; i++){
1501     // minuit->GetParameter(i,vend[i],errvend[i]);
1502     // if(debug)cout<<setw(7)<<parname[i].c_str()<<" v-start "<<setw(10)<<vstart[i]<<" --> v-end "<<setw(10)<<vend[i]<<" +- "<<errvend[i]<<endl;
1503    
1504     // }
1505    
1506     // // // ===========================================
1507     // // // NB NB NB !!!!!!!!!!!!!
1508     // // // temporaneamente eseguo il secondo step
1509     // // // solo in modalita` debug
1510     // // // (chiedere spiegazioni a elena)
1511     // // // ===========================================
1512     // // if( debug && err__l ){
1513    
1514     // // --------------------------------------------
1515     // // Now ready for minimization step without limits
1516     // // --------------------------------------------
1517     // if(debug)cout << "--------------------- Second step (without limits): "<<endl;
1518     // minuit->mnfree(0); //restore all fixed parameters
1519     // for (int i=0; i<4; i++){
1520     // vstart[i] = vend[i];
1521     // minuit->mnparm(i, parname[i].c_str(),vstart[i],step[i],0.,0.,ierflg);
1522     // }
1523     // minuit->FixParameter(3);//fix starting point
1524     // arglist[0] = 500;
1525     // minuit->mnexcm("MIGRAD", arglist ,1,ierflg);
1526     // err__l = ierflg;
1527     // if(ierflg>0){
1528     // if(debug){
1529     // cout<<"ierflg "<<ierflg<<" ma prova ad andare avanti"<<endl;
1530     // }else{
1531     // return err__l;
1532     // }
1533     // }
1534     // for(int i=0; i<4; i++){
1535     // minuit->GetParameter(i,vend[i],errvend[i]);
1536     // if(debug)cout<<setw(7)<<parname[i].c_str()<<" v-start "<<setw(10)<<vstart[i]<<" --> v-end "<<setw(10)<<vend[i]<<" +- "<<errvend[i]<<endl;
1537     // }
1538    
1539     // // }
1540    
1541     // // --------------------------------------------
1542     // // retrive parameters
1543     // // --------------------------------------------
1544     // // Double_t tup = TAUMAX*initpar2;
1545     // // TF1 *ffunc = new TF1("ffunc",func,0.,tup,4);
1546     // // ffunc->SetLineWidth(1);
1547     // for(int i=0; i<4; i++){
1548     // par__l[i] = vend[i];
1549     // if(par__l[i]<0 || par__l[2]>22 || par__l[1]>50){
1550     // cout<<" converge a valori assurdi... escluso"<<endl;
1551     // err__l = 5;
1552     // return err__l;
1553     // }
1554     // }
1555    
1556     // if(debug)cout << "--------------------- DONE! "<<endl;
1557    
1558    
1559     // for(int ip=0; ip<22; ip++){
1560     // for(int iv=0; iv<2; iv++){
1561     // bool maskpl = CaloElectron_parameters::Get()->maskpl[ip][iv];
1562     // if(!maskpl){
1563     // double tpla = (double)tplane[ip][iv];
1564     // Double_t fu1=func(&tpla,vend);
1565     // qplanefit[ip][iv] = fu1;
1566     // }
1567     // }
1568     // }
1569    
1570     // Double_t graddummy[4];
1571     // double outfcn;
1572     // minuit->Eval(4,graddummy,outfcn,vend,1);
1573    
1574     // if(iuse>3)chi2__l = (float)outfcn/(float)(iuse-3);
1575     // else chi2__l = 0.;
1576    
1577     // delete minuit;
1578    
1579     return err__l;
1580    
1581     }
1582     /*
1583     * \brief Evaluate longitudinal correction
1584     */
1585     float CaloElectron::GetLongitudinalCorrection(){
1586    
1587     bool debug = CaloElectron_parameters::Get()->debug;
1588     float TAUMAX = CaloElectron_parameters::Get()->TAUMAX;
1589     int ipmin = CaloElectron_parameters::Get()->ipmin;
1590     int ipmax = CaloElectron_parameters::Get()->ipmax;
1591     // --------------------------------------------
1592     // evaluate longitudinal
1593     // --------------------------------------------
1594     Double_t corr = 0.;
1595     Double_t t3,intecalo3,intecalo,tmaxcalo;
1596     if( err__l == 0 ){
1597     t3 = par__l[3] + TAUMAX*par__l[2];
1598     TF1 *ffunc = GetFunc_Longitudinal();
1599     intecalo3 = ffunc->Integral(par__l[3],t3);
1600     // if(debug)cout<<"integro da "<<par__l[3]<<" fino a t3 "<<t3<<" trovo intecalo3 "<<intecalo3<<endl;
1601     tmaxcalo = (double)tplane[ipmax-1][0]-(double)tplane[ipmin][1];
1602     if(t3<tmaxcalo){//if(t3<tplane[21][0]){
1603     intecalo=intecalo3;
1604     // if(debug)cout<<"siccome tmaxcalo "<<tmaxcalo<<" >t3 "<<" intecalo=intecalo3 "<<endl;
1605     }else{
1606     intecalo=ffunc->Integral(par__l[3],tmaxcalo);
1607     // if(debug)cout<<"integro da "<<par__l[3]<<" fino a tmaxcalo "<<tmaxcalo<<" trovo intecalo3 "<<intecalo<<endl;
1608     }
1609     corr = intecalo3/intecalo;
1610     }else{
1611     corr=0;
1612     }
1613    
1614     corr__l = (float)corr;
1615    
1616     if(debug) cout<<"Longitudinal correction: "<<corr__l<<endl;
1617    
1618     return corr__l;
1619    
1620     }
1621     /////////////////////////////////////////////////////////////////////
1622     //
1623     //
1624     //
1625     //
1626     /////////////////////////////////////////////////////////////////////
1627     TGraphErrors *CaloElectron::GetGraph_Longitudinal(){
1628     TGraphErrors *graph = new TGraphErrors(iuse ,tfit,zfit,errortfit,errorzfit);
1629     graph->SetMarkerSize(0.8);
1630     graph->SetMarkerStyle(20);
1631     return graph;
1632     }
1633     //
1634     TGraphErrors *CaloElectron::GetGraph_Longitudinal_Fit(){
1635     double zfunc[44];
1636     double errorzfunc[44];
1637     TF1 *fu = new TF1("fu",func,0.,tfit[iuse-1],4);
1638     for(int i=0; i<4; i++)fu->SetParameter(i,par__l[i]);
1639     for(int i=0; i<iuse; i++){
1640     zfunc[i] = fu->Eval(tfit[i]);;
1641     errorzfunc[i] = 0.;
1642     if(zfunc[i]>0.)errorzfunc[i] = sqrt(zfunc[i]);
1643     }
1644     delete fu;
1645     TGraphErrors *graph = new TGraphErrors(iuse,tfit,zfunc,errortfit,errorzfunc);
1646     graph->SetMarkerSize(0.8);
1647     graph->SetMarkerColor(2);
1648     graph->SetMarkerStyle(20);
1649     return graph;
1650     }
1651     //
1652     TGraphErrors *CaloElectron::GetGraph_Longitudinal_Integral(){
1653     double zfitint[44];
1654     double errorzfitint[44];
1655     zfitint[0] = zfit[0];
1656     for(int i=1; i<iuse; i++){
1657     zfitint[i] = zfitint[i-1]+zfit[i];
1658     errorzfitint[i] = sqrt(zfitint[i]);
1659     }
1660     TGraphErrors *graph = new TGraphErrors(iuse,tfit,zfitint,errortfit,errorzfitint);
1661     graph->SetMarkerSize(0.8);
1662     graph->SetMarkerStyle(24);
1663     return graph;
1664     }
1665     //
1666     TGraphErrors *CaloElectron::GetGraph_Longitudinal_Integral_Fit(){
1667     double zfunc[44];
1668     double errorzfunc[44];
1669     TF1 *fu = new TF1("fu",func,0.,tfit[iuse-1],4);
1670     for(int i=0; i<4; i++)fu->SetParameter(i,par__l[i]);
1671     zfunc[0] = fu->Eval(tfit[0]);;
1672     for(int i=1; i<iuse; i++){
1673     zfunc[i] = zfunc[i-1] + fu->Eval(tfit[i]);;
1674     errorzfunc[i] = 0.;
1675     if(zfunc[i]>0.)errorzfunc[i] = sqrt(zfunc[i]);
1676     }
1677     delete fu;
1678     TGraphErrors *graph = new TGraphErrors(iuse,tfit,zfunc,errortfit,errorzfunc);
1679     graph->SetMarkerSize(0.8);
1680     graph->SetMarkerStyle(24);
1681     graph->SetMarkerColor(2);
1682     graph->SetLineColor(2);
1683     return graph;
1684     }
1685     //
1686     TF1 *CaloElectron::GetFunc_Longitudinal(){
1687     TF1 *fu = new TF1("longitudinalprofile",func,0.,tfit[iuse-1],4);
1688     for(int i=0; i<4; i++)fu->SetParameter(i,par__l[i]);
1689     fu->SetLineColor(2);
1690     // fu->Draw();
1691     // if(err__l!=0)fu->SetLineStyle(12);
1692     return fu;
1693     }
1694     //
1695     TGraphErrors *CaloElectron::GetGraph_Lateral(int ipp, int ivv){
1696    
1697     cout << "TGraphErrors *CaloElectron::GetGraph_Lateral("<<ipp<<","<<ivv<<") "<<endl;
1698     // cout <<"ooooooooo%%%%%%%%%%%%%%%%%%%%% "<< CaloElectron_parameters::Get() << endl;
1699     // cout <<"ooooooooo%%%%%%%%%%%%%%%%%%%%% "<< CaloElectron_parameters::Get()->cl1 << endl;
1700     CaloLevel1* cl1 = CaloElectron_parameters::Get()->cl1;
1701     if(!cl1)return NULL;
1702    
1703     float xx[96];
1704     float qq[96];
1705     float errxx[96];
1706     float errqq[96];
1707     CaloStrip cstrip;
1708     for(int is=0; is<96; is++){
1709     cstrip.Set(ivv,ipp,is);
1710     float xy[2];
1711     xy[0] = cstrip.GetX() - trkcoordx[ipp][ivv];
1712     xy[1] = cstrip.GetY() - trkcoordy[ipp][ivv];
1713     qq[is] = 0.;
1714     xx[is] = xy[ivv];
1715     errqq[is] = 0.;
1716     errxx[is] = 0.5*PITCH;
1717     }
1718     // -----------------------------------
1719     // set charge collected in each plane
1720     // -----------------------------------
1721     int isimu = CaloElectron_parameters::Get()->isimu;
1722     if(isimu==0)cstrip = CaloStrip(cl1,false);
1723     if(isimu==1)cstrip = CaloStrip(cl1,true);
1724     for(int ih=0;ih<cl1->istrip;ih++){
1725     int iv=-1;
1726     int ip=-1;
1727     int is=-1;
1728     cl1->DecodeEstrip(ih,iv,ip,is);
1729     cstrip.Set(iv,ip,is);
1730     float xy[2];
1731     xy[0] = cstrip.GetX() - trkcoordx[ip][iv];
1732     xy[1] = cstrip.GetY() - trkcoordy[ip][iv];
1733     if( ip==ipp && iv==ivv ){
1734     qq[is] = cstrip.GetE();
1735     xx[is] = xy[iv];
1736     if(qq[is]>0)errqq[is] = sqrt( qq[is] );
1737     }
1738     }
1739     TGraphErrors *graph = new TGraphErrors(96,xx,qq,errxx,errqq);
1740     graph->SetMarkerSize(0.8);
1741     graph->SetMarkerStyle(20);
1742     return graph;
1743     }
1744     //
1745     // TF1 *CaloElectron::GetFunc_Lateral(int ip, int iv, int icorr){
1746    
1747    
1748     // int iiv(0);
1749     // if(iv==0)iiv=0;
1750     // if(iv==1 && ip%2) iiv=1;
1751     // if(iv==1 && !ip%2) iiv=2;
1752    
1753     // float iwmax,iw;
1754     // iwmax = GetShowerMaximum(icorr);
1755     // iw = ip+(iv-1);
1756     // int ibintau = (int)((iw/iwmax)/0.25);
1757     // if(ibintau>=12) ibintau=11;
1758    
1759    
1760     // float file_rt = CaloElectron_parameters::Get()->file_rt[ibintau][iiv];
1761     // float file_p = CaloElectron_parameters::Get()->file_p[ibintau][iiv];
1762     // float file_rc = CaloElectron_parameters::Get()->file_rc[ibintau][iiv];
1763     // float RMAXsp = CaloElectron_parameters::Get()->RMAXsp;
1764    
1765     // int nparam=5;
1766     // TF1 *ff = new TF1("fradpro",fradpro,-RMAX,RMAX,nparam);
1767     // Double_t param[5];
1768     // param[0] = file_rt;
1769     // param[1] = file_p;
1770     // param[2] = file_rc;
1771     // param[3] = qplanefit[ip][iv];//qplane0[ip][iv];
1772     // param[4] = 0.;
1773     // for(int i=0;i<nparam;i++){
1774     // ff->SetParameter(i,param[i]);
1775     // // cout<<" "<<i<<" -> "<<param[i]<<endl;
1776     // }
1777     // return ff;
1778    
1779     // }
1780     /*
1781     * Return a graph with the integral of the 2-dimentional profile (normalized) over
1782     * each strip (taking into account the gaps).
1783     */
1784     TGraphErrors *CaloElectron::GetFunc_Lateral(int ip, int iv){
1785    
1786     cout << "TGraphErrors *CaloElectron::GetFunc_Lateral("<<ip<<","<<iv<<",) "<<endl;
1787    
1788     float xx[96];
1789     float qq[96];
1790     float errxx[96];
1791     float errqq[96];
1792     GetProfile(ip,iv,xx,qq,errxx,errqq);
1793    
1794    
1795     TGraphErrors *graph = new TGraphErrors(96,xx,qq,errxx,errqq);
1796     // graph->SetMarkerSize(0.8);
1797     // graph->SetMarkerStyle(1);
1798     graph->SetLineColor(2);
1799     return graph;
1800    
1801     }
1802     /**
1803     * evaluate the expected average profile, by integrating the expected charge distribution
1804     * over each strip
1805     *
1806     */
1807     void CaloElectron::GetProfile(int ip, int iv, float xx[], float qq[],float errxx[], float errqq[] ){
1808    
1809     // bool debug = CaloElectron_parameters::Get()->debug;
1810     // float xx[96];
1811     // float qq[96];
1812     // float errxx[96];
1813     // float errqq[96];
1814     CaloLevel1* cl1 = CaloElectron_parameters::Get()->cl1;
1815     if(!cl1)cout << " ERROR -- CaloLevel1* cl1 == NULL"<<endl;
1816     if(!cl1)return;
1817    
1818     // x y-even or y-odd
1819     int iiv(0);
1820     if(iv==0) iiv = 0;
1821     if(iv==1 && ip%2) iiv = 1;
1822     if(iv==1 && !ip%2) iiv = 2;
1823    
1824     // shower maximum ==> tau-bin
1825     // float iwmax,iw;
1826     // iwmax = GetShowerMaximum(icorr);
1827     // // iw = ip+(iv-1); //!!!!!!!!!!!!! BUG!?!?!
1828     // iw = ip-(iv-1);
1829     // int ibintau = (int)((iw/iwmax)/0.25);
1830     // if(ibintau>=12) ibintau=11;
1831     // cout << " maximum (W)"<<iwmax<<endl;
1832     // cout << " ip (W)"<<iw<<endl;
1833     // cout << " tau "<<iw/iwmax<<" tau-bin "<<ibintau<<endl;
1834     int ipmin = CaloElectron_parameters::Get()->ipmin;
1835     float maxl = GetShowerMaximum(2);
1836     float nlayer = (float)GetNWLayers(ip,iv);
1837     double tau = (double)(nlayer-ipmin)/(double)maxl;
1838     int ibintau = (int)(tau/0.25);
1839     if(ibintau>=12) ibintau=11;
1840     // if(debug){
1841     // cout << " maximum (W)"<<maxl<<endl;
1842     // cout << " ip (W)"<<nlayer<<endl;
1843     // cout << " tau "<<tau<<" tau-bin "<<ibintau<<endl;
1844     // }
1845     // retrieve lateral-profile parameters
1846     float file_rt = CaloElectron_parameters::Get()->file_rt[ibintau][iiv];
1847     float file_p = CaloElectron_parameters::Get()->file_p[ibintau][iiv];
1848     float file_rc = CaloElectron_parameters::Get()->file_rc[ibintau][iiv];
1849     float RMAXsp = CaloElectron_parameters::Get()->RMAXsp;
1850     // if(debug){
1851     // cout << " RT "<<file_rt<<endl;
1852     // cout << " RC "<<file_rc<<endl;
1853     // cout << " p "<<file_p<<endl;
1854     // }
1855     // 2-dimentional function
1856     TF2 ff = TF2("frad",frad,-25.,25.,-25.,25.,3);
1857     ff.SetParameter(0,file_rt);
1858     ff.SetParameter(1,file_p);
1859     ff.SetParameter(2,file_rc);
1860    
1861     // 1-dimentional function
1862     TF1 fx = TF1("fradx",fradx,-25.,25.,4);
1863     fx.SetParameter(0,file_rt);
1864     fx.SetParameter(1,file_p);
1865     fx.SetParameter(2,file_rc);
1866    
1867     // sensitive area
1868     double x1,x2,x3,x4,x5,x6,ps[3];
1869     x1 = DEAD;
1870     x2 = x1 + PITCH*32;
1871     x3 = x2 + DEAD + GLUE + DEAD;
1872     x4 = x3 + PITCH*32;
1873     x5 = x4 + DEAD + GLUE + DEAD;
1874     x6 = x5 + PITCH*32;
1875     ps[0] = x1;
1876     ps[1] = x3;
1877     ps[2] = x5;
1878    
1879     // retrieve the coordinate of the bottom-left corner of the plane
1880     float corner[] = {0.,0.};
1881     GetCornerCoord(ip,iv,corner[0],corner[1]);
1882    
1883    
1884     // integral over each strip
1885     double integgap;
1886     double epsil = 0.0001;
1887     CaloStrip cstrip;
1888    
1889     //
1890     for(int is=0; is<96; is++){ //loop over strips
1891     cstrip.Set(iv,ip,is);
1892     float xy[2];
1893     float trkcoord[2];
1894     trkcoord[0] = trkcoordx[ip][iv]; //track coordinate
1895     trkcoord[1] = trkcoordy[ip][iv];
1896     xy[0] = cstrip.GetX() - trkcoordx[ip][iv];//strip coordinate (relative to track)
1897     xy[1] = cstrip.GetY() - trkcoordy[ip][iv];
1898     //
1899     qq[is] = 0.;
1900     xx[is] = xy[iv];
1901     errqq[is] = 0.;
1902     errxx[is] = 0.5*PITCH;
1903     //
1904     integgap = 0.;
1905     for (Int_t jj=0;jj<3;jj++){ //loop over the 3 sensors
1906     //
1907     double ymi = ps[jj] + (double)corner[iv] - (double)trkcoord[iv];
1908     double yma = ymi + PITCH*32;
1909     double xmi = (double)xx[is]-(double)errxx[is];//strip size
1910     double xma = (double)xx[is]+(double)errxx[is];
1911     //
1912     int dointeg=1;
1913     if(iv==0){
1914     if(xmi<-RMAXsp && xma>-RMAXsp) xmi = -RMAXsp;
1915     if(xma>RMAXsp && xmi<RMAXsp) xma = RMAXsp;
1916     if(xmi>RMAXsp || xma<-RMAXsp) dointeg = 0;
1917     }
1918     if(iv==1 || iv==2){
1919     if(ymi<-RMAXsp && yma>-RMAXsp) ymi = -RMAXsp;
1920     if(yma>RMAXsp && ymi<RMAXsp) yma = RMAXsp;
1921     if(ymi>RMAXsp || yma<-RMAXsp) dointeg = 0;
1922     }
1923     if(dointeg==0) continue;
1924    
1925     //
1926     bool DOFAST = false;
1927     if(fabs(xx[is])>2.)DOFAST=true;
1928    
1929     double integral = 0.;
1930    
1931     if(DOFAST){
1932     //
1933     // integrale veloce
1934     //
1935    
1936     double fmi,fma,k,c;
1937     fx.SetParameter(3,xmi);
1938     fmi = fx.Integral(ymi,yma);
1939     fx.SetParameter(3,xma);
1940     fma = fx.Integral(ymi,yma);
1941     k = 0.;
1942     if(fmi>0.&&fma>0.&&(xma-xmi)>0.)k=log(fma/fmi)/(xma-xmi);
1943     c = log(fmi)-k*xmi;
1944     if(fabs(k)>1.e-6)integral += (fma-fmi)/k;
1945    
1946     }else{
1947     //
1948     // integrale lento ma piu` preciso
1949     //
1950     integral = ff.Integral(xmi,xma,ymi,yma,epsil);
1951    
1952     }
1953    
1954     integgap += integral;
1955    
1956     // cout << setw(2)<<jj<<setw(15)<<xmi<<setw(15)<<ymi<< setw(15)<<integral << setw(15)<<integgaptmp<<endl;
1957     }
1958    
1959     qq[is] = integgap * qplanefit[ip][iv];
1960     // if( qq[is]>0 )errqq[is] = sqrt(qq[is]);
1961     }
1962     }
1963     /**
1964     *
1965     */
1966     float CaloElectron::ProfileTest(){
1967    
1968     int ipmin = CaloElectron_parameters::Get()->ipmin;
1969     int ipmax = CaloElectron_parameters::Get()->ipmax;
1970     float RMAX = CaloElectron_parameters::Get()->RMAX;
1971     // float TAUMAX = CaloElectron_parameters::Get()->TAUMAX;
1972    
1973     TH2F* h_qfit[2];
1974     TH2F* h_qtot[2];
1975     //
1976     // retrieve histrograms of shower lateral profile
1977     //
1978     for(int iv=0; iv<2; iv++){
1979     h_qfit[iv] = CaloElectron_parameters::Get()->h_qfit[iv]; //average
1980     if(!h_qfit[iv])return 0.;
1981     h_qfit[iv]->Reset(); //-->reset
1982    
1983     h_qtot[iv] = CaloElectron_parameters::Get()->h_qtot[iv]; //data
1984     if(!h_qtot[iv])return 0.;
1985     }
1986    
1987     // float maxl = GetShowerMaximum(2);
1988     //
1989     double chi2tmp = 0.;
1990     int ndof = 0;
1991     // cout << "<><><><><><><><><><><><><><>"<<endl;
1992     // cout << setw(3) << "IP" << setw(3) << "IV" ;
1993     // cout << setw(10) << "TAU";
1994     // cout << setw(10) << "RMS";
1995     // cout << setw(10) << "SKEW";
1996     // cout << setw(10) << "KURT";
1997     // cout << endl;
1998     //
1999     for(int ip=0; ip<22; ip++){ // loop over planes
2000     for(int iv=1; iv>=0; iv--){ // loop over views
2001     bool maskpl = CaloElectron_parameters::Get()->maskpl[ip][iv];
2002     float corner[] = {0.,0.};
2003     GetCornerCoord(ip,iv,corner[0],corner[1]);
2004     if(
2005     ip >= ipmin &&
2006     ip < ipmax &&
2007     !maskpl &&
2008     true){
2009     //
2010     float xx[96];
2011     float qq[96];
2012     float errxx[96];
2013     float errqq[96];
2014     //
2015     float trkcoord[2];
2016     trkcoord[0] = trkcoordx[ip][iv];
2017     trkcoord[1] = trkcoordy[ip][iv];
2018     //
2019     GetProfile(ip,iv,xx,qq,errxx,errqq); //<<< average profile
2020     // float nlayer = (float)GetNWLayers(ip,iv);
2021     // double tau = (double)(nlayer-ipmin)/(double)maxl;
2022     for(int is=0; is<96; is++) {
2023     if(
2024     fabs(xx[is]) < RMAX &&
2025     // tau<TAUMAX &&
2026     true){
2027     // h_qfit[iv]->Fill( (float)(is+iv*96), (float)ip, qq[is]);
2028     h_qfit[iv]->Fill( xx[is]+trkcoord[iv]-corner[iv], (float)ip, qq[is]);
2029     float qqq = h_qtot[iv]->GetBinContent((is+iv*96+1),ip+1);
2030     // cout << setw(15)<< qqq<<setw(15)<<qq[is]<<setw(15)<<pow(qq[is]-qqq,2.)<< endl;
2031     if(qq[is]>0) chi2tmp += pow((double)(qq[is]-qqq),2.)/sqrt((double)qq[is]);
2032     ndof++;
2033     }
2034     }
2035     // cout << "<><><><><><><><><><><><><><>"<<endl;
2036     // cout << ip << " - "<<iv << endl;
2037     // TH1D* hfitpro = h_qfit[iv]->ProjectionX("hfitpx",ip+1,ip+2);
2038     TH1D* htotpro = h_qtot[iv]->ProjectionX("htotpx",ip+1,ip+2);
2039     // cout <<"Mean "<< setw(10)<<htotpro->GetMean() << setw(10)<<hfitpro->GetMean() << endl;
2040     // cout <<"RMS "<< setw(10)<<htotpro->GetRMS() << setw(10)<<hfitpro->GetRMS() << endl;
2041     // cout <<"Skew "<< setw(10)<<htotpro->GetSkewness() << setw(10)<<hfitpro->GetSkewness() << endl;
2042     // cout <<"Kurt "<< setw(10)<<htotpro->GetKurtosis() << setw(10)<<hfitpro->GetKurtosis() << endl;
2043     if(GetShowerMaximumX0(2)>0.)
2044     TAU[ip][iv] = tplane[ip][iv]/GetShowerMaximumX0(2);
2045     if(htotpro->GetEntries()>4){
2046     RMS[ip][iv] = htotpro->GetRMS();
2047     SKEW[ip][iv] = htotpro->GetSkewness();
2048     KURT[ip][iv] = htotpro->GetKurtosis();
2049     }
2050     // cout << setw(3) << ip << setw(3) << iv ;
2051     // cout << setw(10) << TAU[ip][iv];
2052     // cout << setw(10) << RMS[ip][iv];
2053     // cout << setw(10) << SKEW[ip][iv];
2054     // cout << setw(10) << KURT[ip][iv];
2055     // cout << endl;
2056     // hfitpro->Delete();
2057     htotpro->Delete();
2058     // cout << "<><><><><><><><><><><><><><>"<<endl;
2059     }
2060     }
2061     }
2062     // cout << "<><><><><><><><><><><><><><>"<<endl;
2063    
2064     // double kolp = h_qfit->KolmogorovTest(h_qtot,"ND");
2065     // double kold = h_qfit->KolmogorovTest(h_qtot,"NDM");
2066     // h_qfit->Sumw2();
2067     // h_qtot->Sumw2();
2068     // double kolp = h_qfit->KolmogorovTest(h_qtot,"D");
2069     // double kold = h_qfit->KolmogorovTest(h_qtot,"DM");
2070     // double chi2tmp = h_qfit->Chi2Test(h_qtot,"WWP");
2071     // cout << "KKKKK "<<kolp << endl;
2072     // cout << "KKKKK "<<kold << endl;
2073     // cout << "KKKKK "<<chi2 << " "<<ndof<<" "<<chi2/(double)(ndof)<< endl;
2074     if( ndof>3 )chi2 = (float)(chi2tmp/(double)(ndof-3));
2075     else chi2 = 0.;
2076    
2077     return chi2;
2078    
2079     }
2080     /**
2081     *
2082     */
2083     float CaloElectron::GetMaxResidual(){
2084     float max = 0;
2085     for(int iv=0; iv<2; iv++){
2086     for(int ip=0; ip<22; ip++){
2087     if(
2088     // qplane1[ip][iv] > 0. &&
2089     // fabs(qplane1[ip][iv]-qplanefit[ip][iv])/sqrt(qplane1[ip][iv]) > fabs(max) &&
2090     fabs(qplane1[ip][iv]-qplanefit[ip][iv]) > fabs(max) &&
2091     true){
2092     max = qplane1[ip][iv]-qplanefit[ip][iv];
2093     }
2094     }
2095     }
2096     return max;
2097     }
2098     int CaloElectron::GetNRun(){
2099     bool POS = true;
2100     bool NEG = true;
2101     int nrun = 0;
2102     for(int ip=0; ip<22; ip++){
2103     for(int iv=1; iv>=0; iv--){
2104     if( qplane1[ip][iv] > qplanefit[ip][iv] && NEG ){
2105     nrun++;
2106     POS = true; NEG = !POS;
2107     }
2108     if( qplane1[ip][iv] <= qplanefit[ip][iv] && POS ){
2109     nrun++;
2110     NEG = true; POS = !NEG;
2111     }
2112     }
2113     }
2114     return nrun;
2115     }
2116     float CaloElectron::GetMaxRun(){
2117     bool POS = true;
2118     bool NEG = true;
2119     int nrun = 0;
2120     float sum[44]; for(int ip=0; ip<44; ip++)sum[ip]=0.;
2121     //
2122     for(int ip=0; ip<22; ip++){
2123     for(int iv=1; iv>=0; iv--){
2124     if( qplane1[ip][iv] > qplanefit[ip][iv] && NEG ){
2125     nrun++;
2126     POS = true; NEG = !POS;
2127     }
2128     if( qplane1[ip][iv] <= qplanefit[ip][iv] && POS ){
2129     nrun++;
2130     NEG = true; POS = !NEG;
2131     }
2132     sum[nrun-1] += qplane1[ip][iv]-qplanefit[ip][iv];
2133     }
2134     }
2135     //
2136     float max=0;
2137     for(int ip=0; ip<44; ip++)
2138     if( fabs(sum[ip]) > fabs(max) )max=sum[ip];
2139    
2140     return max;
2141     }
2142     /**
2143     * \brief Method to retrieve the coordinates of the plane bottom-left corner
2144     * (l'angolo è dell'inizio del rivelatore compreso il dead)
2145     */
2146     void CaloElectron::GetCornerCoord(int ip, int iv, float& xorig, float& yorig){
2147    
2148     // coordinate meccaniche dei piani in cm
2149    
2150     CaloStrip st = CaloStrip();
2151     int isimu = CaloElectron_parameters::Get()->isimu;
2152     if(isimu==0)st.UseStandardAlig();
2153     if(isimu==1)st.UseMechanicalAlig();
2154    
2155     yorig = -0.1*st.GetYalig()+0.1;
2156     xorig = -0.1*st.GetXalig();
2157    
2158     if(ip%2!=1){
2159     //ip 0,2,4,6,...,20
2160     if(iv==0){
2161     yorig = yorig;
2162     xorig = xorig+0.05;
2163     }else{
2164     yorig = yorig-0.05;
2165     xorig = xorig+0.1;
2166     }
2167     }else{
2168     //ip 1,3,5,..,21
2169     if(iv==0){
2170     yorig = yorig-0.2;
2171     xorig = xorig-0.05;
2172     }else{
2173     yorig = yorig-0.15;
2174     xorig = xorig-0.1;
2175     }
2176     }
2177    
2178    
2179    
2180    
2181    
2182    
2183     }
2184     /**
2185     * \brief Print the event
2186     */
2187     void CaloElectron::Print(){
2188    
2189     int ipmin = CaloElectron_parameters::Get()->ipmin;
2190     int ipmax = CaloElectron_parameters::Get()->ipmax;
2191     // cout<<"Print idiev "<<idiev<<endl;
2192     cout << " n. W-layers - qx0 qy0 -------> qx1 qy1 -------> qx(fit) qy(fit)"<<endl;
2193     float qx0,qy0,qx1,qy1,qx2,qy2;
2194     qx0=0.;
2195     qy0=0.;
2196     qx1=0.;
2197     qy1=0.;
2198     qx2=0.;
2199     qy2=0.;
2200     for(int il=ipmin; il<=ipmax; il++){
2201     if(il>ipmin){
2202     qx0 = qplane0[il-1][0];
2203     qy0 = qplane0[il][1];
2204     qx1 = qplane1[il-1][0];
2205     qy1 = qplane1[il][1];
2206     qx2 = qplanefit[il-1][0];
2207     qy2 = qplanefit[il][1];
2208     }
2209     if(il==ipmin){
2210     // qx0 = 0;
2211     qy0 = qplane0[ipmin][1];
2212     // qx1 = 0;
2213     qy1 = qplane1[ipmin][1];
2214     // qx2 = 0;
2215     qy2 = qplanefit[ipmin][1];
2216     }
2217     if(il==ipmax){
2218     qx0 = qplane0[ipmax-1][0];
2219     // qy0 = 0.;
2220     qx1 = qplane1[ipmax-1][0];
2221     // qy1 = 0.;
2222     qx2 = qplanefit[ipmax-1][0];
2223     // qy2 = 0.;
2224     }
2225     cout << " "<<setw(2)<<il<<" - "<<setw(10)<<qx0<<setw(10)<<qy0<<" "<<setw(10)<<qx1<<setw(10)<<qy1<<" "<<setw(10)<<qx2<<setw(10)<<qy2<<endl;
2226     }
2227     cout<<" "<<endl;
2228     float TAUMAX = CaloElectron_parameters::Get()->TAUMAX;
2229     float RMAX = CaloElectron_parameters::Get()->RMAX;
2230     cout << "Total collectced charge (mip) "<<qtot<<endl;
2231     cout << "Charge outside cylinder ( RMAX="<<RMAX<<" ,TAUMAX="<<TAUMAX<<" )";
2232     cout << qtot - GetQ(0);
2233     if(qtot>0.)cout <<" ( "<< 100.*(qtot-GetQ(0))/qtot<<" % )"<<endl;
2234     for(int icorr=0;icorr<4;icorr++){
2235     cout << " ---------------------------------------------- "<<icorr;
2236     if(icorr==0)cout <<"(no corr.)"<<endl;
2237     if(icorr==1)cout <<"(lateral corr.)"<<endl;
2238     if(icorr==2)cout <<"(lateral+longitudinal corr.)"<<endl;
2239     if(icorr==3)cout <<"(fit)"<<endl;
2240     cout << " - Collected charge (mip) "<<GetQ(icorr)<<endl;
2241     cout << " - Shower maximum (W-layer, X0) "<<GetShowerMaximum(icorr)<<" "<<GetShowerMaximumX0(icorr)<<endl;
2242     cout << " - Energy (GeV) "<<GetEnergy(icorr)<<endl;
2243     }
2244     cout << "Longitudinal parameters:"<<endl;
2245     cout << "- E :"<<par__l[0]<<endl;
2246     cout << "- alpha :"<<par__l[1]<<endl;
2247     cout << "- Tm :"<<par__l[2]<<endl;
2248     cout << "- T0 :"<<par__l[3]<<endl;
2249     cout << "- chi2 :"<<chi2__l<<endl;
2250     cout << "- minuit status :"<<err__l<<endl;
2251     cout << endl ;
2252     cout << "- chi2 (global) :"<<chi2<<endl;
2253     cout << endl ;
2254    
2255     // cout<<" rigidity "<<rig<<" qtotlevel2 "<<qtotl2<<endl;
2256    
2257     }
2258     //______________________________________________________________________________
2259     Double_t paraloss(Double_t *tin,Double_t *par)
2260     {
2261    
2262     Double_t t,p0,p1,p2,p3,t0,value;
2263     t=*tin;
2264     p0=par[0];
2265     p1=par[1];
2266     p2=par[2];
2267     p3=par[3];
2268     t0=1.7;//t0=1.5;
2269     Double_t paralossdit0=1.00659;
2270     if(t<t0) return paralossdit0;
2271     value=p0+p1*t+p2*pow(t,2)+p3*pow(t,3);
2272     return value;
2273     }
2274    
2275     /**
2276     * \brief Collect corrected charge to energy
2277     */
2278     float CaloElectron::GetEnergy(int icorr){
2279    
2280     float energy = 0;
2281     float collectedq = 0;
2282     float p0 = 0;
2283     float p1 = 0;
2284    
2285     if(icorr == 0){
2286     // ---------------------------------------
2287     // before any correction
2288     // ---------------------------------------
2289    
2290     //the same as energy 1.. not to be used
2291     p0=24.14;
2292     p1=253.3;
2293    
2294     }else if(icorr == 1 || icorr == 3){
2295     // ---------------------------------------
2296     // after lateral correction 4 giugno 2007
2297     // ---------------------------------------
2298    
2299     //linear (only with fit of points 5-15gev where longitudinal containment is satisfactory)
2300     //we expect a sistematic error for greater energies that has to be corrected by longitudinal fit
2301    
2302     //10-9-07
2303     p0=24.14;
2304     p1=253.3;
2305    
2306     }else if(icorr == 2){
2307     // ---------------------------------------
2308     // after longitudinal fit
2309     // ---------------------------------------
2310    
2311     //10-9-07
2312     p0=-13.86;
2313     p1=264.4;
2314    
2315    
2316     }else{
2317    
2318     return energy;
2319    
2320     }
2321    
2322     collectedq=GetQ(icorr);
2323     // if(onlyy)collectedq=collectedq*2;
2324    
2325     energy = (collectedq-p0)/p1;
2326    
2327     if(GetQ(icorr)<=0) energy=0.;
2328    
2329     if(icorr == 3){
2330     TF1 *f4=new TF1("f4",paraloss,0.,3.,4);//f1->FixParameter(2,1.3);
2331     f4->SetParameter(0,-0.8013231);
2332     f4->SetParameter(1,2.276176);
2333     f4->SetParameter(2,-0.8295547);
2334     f4->SetParameter(3,0.06835571);
2335     float lnmax=TMath::Log(par__l[2]);
2336     float lnmax1=TMath::Log(GetShowerMaximumX0(1));
2337     if(lnmax>2.4 || GetIerflg()>0){
2338     cout<<"max "<<GetShowerMaximumX0(1)<<" "<<GetShowerMaximumX0(2)<<" lnmax "<<lnmax<<" ier "<<GetIerflg()<<endl;
2339     lnmax=lnmax1;
2340     }
2341     float corrparaloss=f4->Eval(lnmax);
2342     //cout<<"icorr 3...lnmax "<<lnmax<<" corrparaloss "<<corrparaloss<<endl;
2343     energy=energy/corrparaloss;
2344     }
2345    
2346     return energy;
2347    
2348     };
2349    
2350     /*
2351     defined cuts to have gaussian error from calorimeter reconstruction for alignement purpose
2352     */
2353     bool CaloElectron::IsInsideFiducial(int level){
2354    
2355    
2356     // float ma=GetShowerMaximum(1);
2357     // if(ma>=20 || ma<=4)return false;
2358     // int ima=(int)ma+ipmin;
2359     // float strima=0;
2360     // for(int iv=0;iv<=1;iv++){
2361     // strima=GetStripW(ima,iv);
2362     // if(strima<11 || strima>86 || strima==33 || strima==32 || strima==65 || strima==64) return false;
2363     // }
2364    
2365     // if(level==1) return true;
2366    
2367     // if(outfcn>600) return false;
2368     // if(minuitierflg>0) return false;
2369     // float lma1=log(par__l[1]);
2370     // float lma2=log(par__l[2]);
2371     // float lma1expected=0.92*lma2;
2372     // if(lma2<1.3 || lma2>2.3) return false;
2373     // if(TMath::Abs(lma1-lma1expected)>0.5) return false;
2374    
2375     return true;
2376    
2377     }
2378    
2379     //////////////////////////////////////////////////////////////////////////
2380    
2381     /**
2382     * Fill calibration histos
2383     */
2384     void CaloElectron::Calibration_Fill(){
2385    
2386     bool debug = CaloElectron_parameters::Get()->debug;
2387     float TAUMAX = CaloElectron_parameters::Get()->TAUMAX;
2388     float RMAX = CaloElectron_parameters::Get()->RMAX;
2389     int ntau = CaloElectron_parameters::Get()->par_ntau;
2390     float *taubin = CaloElectron_parameters::Get()->par_taubin;
2391     CaloLevel1* cl1 = CaloElectron_parameters::Get()->cl1;
2392     //
2393     if(!cl1)cout << "NB --> missing CaloLevel1, needed for calibration !!"<<endl;
2394     if(!cl1)return;
2395     //
2396     int isimu = CaloElectron_parameters::Get()->isimu;
2397    
2398     // /////////////////////////////////////
2399     // some parameters to select good shower
2400     // /////////////////////////////////////
2401     float stoll_g = 5;//maximum n.strips from gaps
2402     float stoll_b = 10;//maximum n.strips from borders
2403     float toll = stoll_b*PITCH;//3.;//(cm) distance of shower axis from border on the last silicon plane
2404     float qmin = 10;//(mip)minimum energy deposit per plane
2405     //
2406    
2407     // ---------------
2408     // lateral profile
2409     // ---------------
2410     CaloStrip cstrip;
2411     if(isimu==0)cstrip = CaloStrip(cl1,false);
2412     if(isimu==1)cstrip = CaloStrip(cl1,true);
2413     if(debug)cout << "====== n.strip "<<cl1->istrip<<endl;
2414     if(debug)cout << "====== s.max (X0) "<<GetShowerMaximumX0(0);
2415     float showermax = GetShowerMaximumX0(0);
2416    
2417     // -------------------------------
2418     // containment conditions (global)
2419     // -------------------------------
2420     // shower axis must be contained within 3 cm (on the last plane)
2421     // (otherwise the shower maximum could be not properly evaluated)
2422     bool CONTAINED = false;
2423     //
2424     // last silicon plane
2425     //
2426     int ip = 21;
2427     int iv = 0;//x
2428     cstrip.Set(iv,ip,0);
2429     float xcorner_l = cstrip.GetX();
2430     float ycorner_l = cstrip.GetY();
2431     cstrip.Set(iv,ip,95);
2432     float xcorner_r = cstrip.GetX();
2433     float ycorner_r = cstrip.GetY();
2434     //
2435     if(
2436     trkcoordx[ip][iv] > xcorner_l + toll &&
2437     trkcoordx[ip][iv] < xcorner_r - toll &&
2438     trkcoordy[ip][iv] > ycorner_l + toll &&
2439     trkcoordy[ip][iv] < ycorner_r - toll &&
2440     true)CONTAINED = true;
2441     //
2442     // if(!CONTAINED)return; // discard event if shower is not contained
2443    
2444     // -----------------------------------------------
2445     // first loop over planes to determine the tau-bin
2446     // and verify some general conditions:
2447     // - shower axis in each plane far from gaps
2448     // - minimal energy deposit
2449     // -----------------------------------------------
2450     int ibintau[22][2];
2451     //
2452     for(int ip=0; ip<22; ip++){
2453     for(int iv=0; iv<2; iv++){
2454     //
2455     ibintau[ip][iv]=-1;
2456     // ------------
2457     // shower depth
2458     // ------------
2459     float tau = tplane[ip][iv]/showermax;
2460     if(debug)cout <<" --> plane "<<ip<<" view "<<iv<<" tau "<<tau<<endl;
2461     //
2462     if(tau>TAUMAX)continue; // discard plane if tau exceed TAUMAX
2463     //
2464     // ---------------------------------------
2465     // containment conditions (plane by plane)
2466     // ---------------------------------------
2467     // shower axis should be far from gaps
2468     //
2469     if(qplane0[ip][iv]<qmin)continue;//discard plane if energy deposit is low
2470     //
2471     bool CONTAINED = false;
2472     //
2473     if(
2474     ( trkstrip[ip][iv] >= stoll_b && trkstrip[ip][iv] < 32 - stoll_g )||
2475     ( trkstrip[ip][iv] >= 32 + stoll_g && trkstrip[ip][iv] < 64 - stoll_g )||
2476     ( trkstrip[ip][iv] >= 64 + stoll_g && trkstrip[ip][iv] < 96 - stoll_b )||
2477     false)CONTAINED = true;
2478     //
2479     if(!CONTAINED)continue; // discard plane if shower traverses gaps
2480     //
2481     for(int itau = 0; itau<ntau; itau++){
2482     if(taubin[0]>tau)break;
2483     if(taubin[itau+1]>=tau){
2484     ibintau[ip][iv]=itau;
2485     break;
2486     }
2487     }
2488     if(debug)cout << " --> tau-bin "<<ibintau<<endl;
2489     //
2490     }
2491     }
2492     // ----------------------------------------------------
2493     // then loop over hit strips to fill profile histograms
2494     // ----------------------------------------------------
2495     // for(int ih=0;ih<cl1->istrip;ih++){//loop over hit strips
2496     // int iv=-1;
2497     // int ip=-1;
2498     // int is=-1;
2499     // cl1->DecodeEstrip(ih,iv,ip,is);
2500     //
2501     // NBNB --> credo di dover riempire con TUTTE le strisce
2502     //
2503     for(int ip=0; ip<22; ip++){
2504     for(int iv=0; iv<2; iv++){
2505    
2506     int ivv=iv; //x (0) and yeven (1)
2507     if(ip%2)ivv=2; //yodd (2)
2508     //
2509     if(ibintau[ip][iv]==-1)continue; //outside tau range or plane discarded
2510     //
2511     for(int is=0; is<96; is++){
2512    
2513     cl1->GetEstrip(iv,ip,is);
2514     cstrip.Set(iv,ip,is);
2515     //
2516     float xy[2];
2517     xy[0] = cstrip.GetX() - trkcoordx[ip][iv];
2518     xy[1] = cstrip.GetY() - trkcoordy[ip][iv];
2519     //
2520     if( TMath::Abs(xy[iv]) >= RMAX )continue;// discard strip if exceed TAUMAX
2521     //
2522     // FRACTION OF CHARGE COLLECTED BY THE STRIP
2523     //
2524     float pitch = 1.;//PITCH;
2525     float F = cstrip.GetE();
2526     F = F / qplane0[ip][iv]; // normalized to total charge
2527     F = F / pitch; // per unit length
2528     //
2529     // weigths
2530     //
2531     double calo_noise = 0.2; //MIP
2532     // if(F==0.)calo_noise = 0.7; //MIP (threshold)
2533     double DF2 = 0.;
2534     DF2 += pow(calo_noise/cstrip.GetE(),2.)*pow((double)F,2.);
2535     // DF2 += pow((double)F,2.)/(double)qplane0[ip][iv];//sbagliato
2536     double W = 1./DF2;
2537     // -----------
2538     // fill histos
2539     // -----------
2540     TH2F* h_qtot_tau = CaloElectron_parameters::Get()->h_qtot_tau[ibintau[ip][iv]][ivv];
2541     if( !h_qtot_tau )
2542     CaloElectron_parameters::Get()->Calibration_SetTools();
2543     //
2544     if( !h_qtot_tau )return;;
2545     h_qtot_tau->Fill(xy[iv],F);
2546     // -------------------------
2547     // evaluate weighted average
2548     // -------------------------
2549     int ibin;
2550     for(ibin=-1; ibin<CALIBNBIN; ibin++){
2551     if( -1*CALIBRANGE + (ibin+1)*2*CALIBRANGE/CALIBNBIN >= xy[iv] )break;
2552     }
2553     if(ibin==-1)continue;//strip out of range
2554     //
2555     // problema: quando il segnale e` 0. in realta` e` <0.7
2556     // quindi si introduce un bias... che spero pero` sia piccolo
2557     //
2558     //
2559     CaloElectron_parameters::Get()->summW[ibintau[ip][iv]][ivv][ibin]
2560     += W;
2561     CaloElectron_parameters::Get()->summWF[ibintau[ip][iv]][ivv][ibin]
2562     += W*(double)F;
2563    
2564     }
2565     }
2566     }
2567    
2568    
2569     return;
2570     };
2571    
2572     ClassImp(CaloElectron);
2573     ClassImp(CaloElectron_parameters);
2574    
2575    

  ViewVC Help
Powered by ViewVC 1.1.23