#define timew_calib_cxx #include "timew_calib.h" #include "TH2.h" #include "TStyle.h" #include "TCanvas.h" #include "TCanvas.h" #include "TGraph.h" #include "TH2.h" #include "TMath.h" #include "TStyle.h" #include #include #include #include #include const int NumBar = 216; const double L = 279.5; char file[50], title[50]; double gx[5000], gy[5000]; const int maxevtnum = 40000; int mynevts, twevts; // const int nparm = 8; const int mparm = nparm*2+1; double q1_trk[maxevtnum], q2_trk[maxevtnum], z1_trk[maxevtnum], z2_trk[maxevtnum], dt_trk[maxevtnum]; double qe1_bar[maxevtnum][NumBar], qe2_bar[maxevtnum][NumBar], qw1_bar[maxevtnum][NumBar], qw2_bar[maxevtnum][NumBar]; double z1_bar[maxevtnum][NumBar], z2_bar[maxevtnum][NumBar], dte_bar[maxevtnum][NumBar], dtw_bar[maxevtnum][NumBar]; void fcntw(int &npar, double *gin, double &f, double *par, int iflag) { const double r2pi = 2.50662827479464932329; double offset = par[0]; double alfa1 = par[1]; double alfa2 = par[2]; double sigma = par[3]; double frac = par[4]; double offsetb = par[5]; double alfab = par[6]; double sigmab = par[7]; double logl = 0.; for ( int indx=0; indx0)logl += log(arg); } f = -2*logl; } void MyFittingFunction(int &npar, double *gin, double &f, double *par, int iflag) { const double r2pi = 2.50662827479464932329; double arg; double logl = 0; for (int i=0; i 0.0) logl += log(arg); } f = -2*logl; } //-------------------------------------------------------------------------- // Event counter //-------------------------------------------------------------------------- void timew_calib::EventCounter() { if (fChain == 0) return; Int_t nentries = Int_t(fChain->GetEntries()); Int_t nbytes = 0, nb = 0; cout << "\n LoopTW: Number of input tracks = " << nentries << " \n" << endl; int currentEvent = -999; int eventCounter = 0; int kentry = 0; int newEvent = 0; for (Int_t jentry=0; jentryGetEntry(jentry); nbytes += nb; if (currentEvent == timewalk_event) newEvent = 0; else { if (currentEvent >= 0) newEvent = 1; currentEvent = timewalk_event; } if ( (jentry%trkPrescale)<10 ) { ++kentry; // Prescaled track count: kentry if (kentry%100000 == 0) printf(" EventCounter:track %8d (run %d) \n",kentry,timewalk_run); if ( newEvent ) ++eventCounter; } // trkPrescale } // for..jentry cout << " Number of input events = " << eventCounter << endl; } //-------------------------------------------------------------------------- // Time walk //-------------------------------------------------------------------------- void timew_calib::LoopTW(int NumEvt, int flag, double cut, char *file_name, char *directory) { if (fChain == 0) return; Int_t nentries = Int_t(fChain->GetEntries()); Int_t nbytes = 0, nb = 0; cout << "\n LoopTW: Number of input tracks = " << nentries << " \n" << endl; if (flag==0) sprintf(file,"%s/root/%s_timew-calib.root",directory,file_name); else sprintf(file,"%s/root/%s_timew-calib_res.root",directory,file_name); TFile *hfile = new TFile(file,"recreate"); gStyle->SetOptFit(111); // Variables int twevtbar[NumBar]; for (int nb = 0; nb No input file // 0 < flag < 100 --> Speed of light + TW input files // flag > 100 --> Speed of light after TW + TW input files //------------------------------------------------------------------------- if (flag > 0) { sprintf(file,"%s/files/%s_timew-calib_e.txt",directory,file_name); twe_result.open(file,ios::in); sprintf(file,"%s/files/%s_timew-calib_w.txt",directory,file_name); tww_result.open(file,ios::in); sprintf(file,"%s/files/%s_timew-alphas_diff_e.txt",directory,file_name); twe_slopes.open(file,ios::in); sprintf(file,"%s/files/%s_timew-alphas_diff_w.txt",directory,file_name); cout << file << endl; tww_slopes.open(file,ios::in); } if (flag < 100) { sprintf(file,"%s/files/%s_speed-calib.txt",directory,file_name); speed_result.open(file,ios::in); } else { sprintf(file,"%s/files/%s_spdtw-calib.txt",directory,file_name); speed_result.open(file,ios::in); } for(int j=0; j> datae[i]; tww_slopes >> dataw[i]; } for(int i=0; i> datasp[i]; resulsp[j][0] = datasp[1]; resulsp[j][1] = datasp[3]; } // for..int j nentries) NumEvt = nentries; for (int jentry=0; jentryGetEntry(jentry); nbytes += nb; if (currentEvent == timewalk_event) newEvent = 0; else { if (currentEvent >= 0) newEvent = 1; currentEvent = timewalk_event; ++rawEvents; } if ( (rawEvents%trkPrescale)<10 ) { // Prescaled event count: kentry ++kentry; //if (kentry%100000 == 0) printf(" LoopTW:track %8d (run %d) \n",kentry,timewalk_run); if ( newEvent ) // Reset for next event { for (int j=0; j216)) continue; if ( (bar2<0) || (bar2>216)) continue; // Track selection if ( (timewalk_track_type != 2) && (timewalk_pt > 0.4) // different from lightspeed && (timewalk_SiPhiHits > 2) && (timewalk_cotAxHits > 10) && (timewalk_cotStHits > 10) && (timewalk_sl8Hits > 4) && (timewalk_inBar == 1) // Is this 1 track per event ?? ) { ++cont1[bar1]; QQDIS->Fill(timewalk_qe1); QQDIS->Fill(timewalk_qw1, timewalk_qw2); Q1DIS->Fill(timewalk_qe1); Q1DIS->Fill(timewalk_qw1); Q2DIS->Fill(timewalk_qe2); Q2DIS->Fill(timewalk_qw2); QRE->Fill( (timewalk_z1+timewalk_z2)/2., timewalk_qe1/timewalk_qe2); QRW->Fill( (timewalk_z1+timewalk_z2)/2., timewalk_qw1/timewalk_qw2); ADC[bar1]->Fill(timewalk_qe1); barst->Fill(timewalk_bar1); if (fabs((timewalk_te1-timewalk_tw1)-(2*timewalk_z1/resulsp[bar1][0]+resulsp[bar1][1])) > cut) continue; if (fabs((timewalk_te2-timewalk_tw2)-(2*timewalk_z2/resulsp[bar2][0]+resulsp[bar2][1])) > cut) continue; // Single track per bar per event if (cont1[bar1] != 1) continue; if ( !finite(timewalk_qe1) ) continue; if ( !finite(timewalk_qe2) ) continue; if (timewalk_qe1<=1e-64 || timewalk_qe2<1e-64) continue; if ( !finite(timewalk_qw1) ) continue; if ( !finite(timewalk_qw2) ) continue; if (timewalk_qw1<=1e-64 || timewalk_qw2<1e-64) continue; if ( !finite(timewalk_te1) ) continue; if ( !finite(timewalk_te2) ) continue; if ( !finite(timewalk_tw1) ) continue; if ( !finite(timewalk_tw2) ) continue; if ( !finite(timewalk_z1) ) continue; if ( !finite(timewalk_z2) ) continue; ++cont[bar1]; adc_comb_e = (sqrt(timewalk_qe1)-sqrt(timewalk_qe2))/ (sqrt(timewalk_qe1)*sqrt(timewalk_qe2)); adc_comb_w = (sqrt(timewalk_qw1)-sqrt(timewalk_qw2))/ (sqrt(timewalk_qw1)*sqrt(timewalk_qw2)); timec_e->Fill(resulte[bar1][0]/sqrt(timewalk_qe1)); timec_w->Fill(resultw[bar1][0]/sqrt(timewalk_qw1)); timec_e->Fill(resulte[bar1][0]/sqrt(timewalk_qe2)); timec_w->Fill(resultw[bar1][0]/sqrt(timewalk_qw2)); if (timewalk_curv > 0) { z1 = timewalk_z1; z2 = timewalk_z2; pl1 = timewalk_path1; } else { z1 = timewalk_z2; z2 = timewalk_z1; pl1 = timewalk_path2; } difft1 = timewalk_te1 - timewalk_te2; difft2 = timewalk_tw1 - timewalk_tw2; if (resulsp[bar1][0] > 0 && resulsp[bar2][0] > 0) { difft1 -= (L/2)*(1.0/resulsp[bar2][0] - 1.0/resulsp[bar1][0]) - (z1/resulsp[bar1][0] - z2/resulsp[bar2][0]) - pl1/timewalk_beta; difft2 -= (L/2)*(1.0/resulsp[bar2][0] - 1.0/resulsp[bar1][0]) + (z1/resulsp[bar1][0] - z2/resulsp[bar2][0]) - pl1/timewalk_beta; } ADC_TDCE_bef_cuts[bar1]->Fill(adc_comb_e,difft1); ADC_TDCE[bar1]->Fill(adc_comb_e,difft1); ADC_TDCW[bar1]->Fill(adc_comb_w,difft2); if (timewalk_curv > 0) { twqp->Fill(adc_comb_e,difft1); twqp->Fill(adc_comb_w,difft2); } else { twqn->Fill(adc_comb_e,difft1); twqn->Fill(adc_comb_w,difft2); } twgx->Fill(adc_comb_e,difft1); twgx->Fill(adc_comb_w,difft2); // Data used in fits tz1_bar[bar1] = timewalk_z1; tz2_bar[bar1] = timewalk_z2; tqe1_bar[bar1] = timewalk_qe1; tqe2_bar[bar1] = timewalk_qe2; tqw1_bar[bar1] = timewalk_qw1; tqw2_bar[bar1] = timewalk_qw2; tdte_bar[bar1] = difft1; tdtw_bar[bar1] = difft2; double e0 = 0., e1 = 0., w0 = 0., w1 = 0.; if (flag==1) { e0 = resulte[bar1][4]/sqrt(timewalk_qe2) - resulte[bar1][2]/sqrt(timewalk_qe1); e1 = resulte[bar1][0]; w0 = resultw[bar1][4]/sqrt(timewalk_qw2) - resultw[bar1][2]/sqrt(timewalk_qw1); w1 = resultw[bar1][0]; } timeza [bar1]->Fill(timewalk_z1,timewalk_te1 - timewalk_tw1); timezb [bar1]->Fill(timewalk_z2,timewalk_te2 - timewalk_tw2); reside [bar1]->Fill(difft1-(e0+e1)); residw [bar1]->Fill(difft2-(w0+w1)); residet[bar1]->Fill(difft1,difft1-(e0+e1)); residwt[bar1]->Fill(difft2,difft2-(w0+w1)); residez[bar1]->Fill(timewalk_z1,difft1-(e0+e1)); residwz[bar1]->Fill(timewalk_z1,difft2-(w0+w1)); resideq[bar1]->Fill(timewalk_qe1, difft1-(e0+e1)); residex[bar1]->Fill(adc_comb_e, difft1-(e0+e1)); residwq[bar1]->Fill(timewalk_qw1, difft2-(w0+w1)); residwx[bar1]->Fill(adc_comb_w, difft2-(w0+w1)); residgq->Fill(timewalk_qe1, difft1-(e0+e1)); residgz->Fill(timewalk_z1, difft1-(e0+e1)); int zbin = int ( (timewalk_z1+L/2)/60. ); double dang = asin((z2-z1)/pl1); int dbin = -1; if (dang<-3.1428/6.) dbin = 0; else if (dang<-3.1428/6.) dbin = 1; else if (dang<0.) dbin = 2; else if (dang<3.1428/6.) dbin = 3; else if (dang<3.1428/12.) dbin = 4; else dbin = 5; if (zbin>=0 && zbin<=4) { resideq_z[bar1][zbin]->Fill(timewalk_qe1, difft1-(e0+e1)); residex_z[bar1][zbin]->Fill(adc_comb_e, difft1-(e0+e1)); residwq_z[bar1][zbin]->Fill(timewalk_qw1, difft2-(w0+w1)); residwx_z[bar1][zbin]->Fill(adc_comb_w, difft2-(w0+w1)); residgq_z[zbin]->Fill(timewalk_qe1, difft1-(e0+e1)); residgq_z[zbin]->Fill(timewalk_qw1, difft2-(w0+w1)); residgx_z[zbin]->Fill(adc_comb_e, difft1-(e0+e1)); residgx_z[zbin]->Fill(adc_comb_w, difft2-(w0+w1)); residegq_z[zbin]->Fill(timewalk_qe1, difft1-(e0+e1)); residwgq_z[zbin]->Fill(timewalk_qw1, difft2-(w0+w1)); residegx_z[zbin]->Fill(adc_comb_e, difft1-(e0+e1)); residwgx_z[zbin]->Fill(adc_comb_w, difft2-(w0+w1)); if (dbin>=0 && dbin<=5) { residegx_z_d[zbin][dbin]->Fill(adc_comb_e, difft1-(e0+e1)); residwgx_z_d[zbin][dbin]->Fill(adc_comb_w, difft2-(w0+w1)); } } int pbin = int ( (pl1)/1.6 ); if (pbin>=0 && pbin<=4) { resideq_p[bar1][pbin]->Fill(timewalk_qe1, difft1-(e0+e1)); residex_p[bar1][pbin]->Fill(adc_comb_e, difft1-(e0+e1)); residwq_p[bar1][pbin]->Fill(timewalk_qw1, difft2-(w0+w1)); residwx_p[bar1][pbin]->Fill(adc_comb_w, difft2-(w0+w1)); residgq_p[pbin]->Fill(timewalk_qe1, difft1-(e0+e1)); residgq_p[pbin]->Fill(timewalk_qw1, difft2-(w0+w1)); residgx_p[pbin]->Fill(adc_comb_e, difft1-(e0+e1)); residgx_p[pbin]->Fill(adc_comb_w, difft2-(w0+w1)); } for (int qbin = 0; qbin<5; qbin++) { if (timewalk_qe2>3000+qbin*250) { residgq_q[qbin]->Fill(timewalk_qe1, difft1-(e0+e1)); residgx_q[qbin]->Fill(adc_comb_e, difft1-(e0+e1)); if (qbin==2) { int binz = -1; if (fabs(timewalk_z1+100.)<10.) binz = 0; if (fabs(timewalk_z1+50.)<10.) binz = 1; if (fabs(timewalk_z1)<10.) binz = 2; if (fabs(timewalk_z1-50.)<10.) binz = 3; if (fabs(timewalk_z1-100.)<10.) binz = 4; if (binz!=-1) { residgq_qz[binz]->Fill(timewalk_qe1, difft1-(e0+e1)); residgx_qz[binz]->Fill(adc_comb_e, difft1-(e0+e1)); } } if (qbin>=2) { int qbin2 = int (timewalk_qe1/800.); if (qbin2>=0 && qbin2<=4) residgz_q[qbin2]->Fill(timewalk_z1, difft1-(e0+e1)); int xbin2 = int ((adc_comb_e+0.05)/0.02); if (xbin2>=0 && xbin2<=4) residgz_x[xbin2]->Fill(timewalk_z1, difft1-(e0+e1)); } } } for (int qbin = 0; qbin<5; qbin++) { if (timewalk_qw2>3000+qbin*250) { residgq_q[qbin]->Fill(timewalk_qw1, difft2-(w0+w1)); residgx_q[qbin]->Fill(adc_comb_w, difft2-(w0+w1)); if (fabs(timewalk_z1)<20.) { residgq_qz[qbin]->Fill(timewalk_qw1, difft2-(w0+w1)); residgx_qz[qbin]->Fill(adc_comb_w, difft2-(w0+w1)); } } } for (int qbin = 0; qbin<5; qbin++) { if (timewalk_qe1>3000+qbin*250) { residgq_q2[qbin]->Fill(timewalk_qe2, difft1-(e0+e1)); } } for (int qbin = 0; qbin<5; qbin++) { if (timewalk_qw1>3000+qbin*250) { residgq_q2[qbin]->Fill(timewalk_qw2, difft2-(w0+w1)); } } } // End track selection } // trkPrescale } // loop over tracks printf(" LoopTW: Tracks used %8d (run %d) \n",kentry,timewalk_run); if (flag==0) { cout << " Performing likelihood fits for time walk" << endl; sprintf(file,"%s/files/%s_timew-alphas_diff_e.txt",directory,file_name); twe_alphas_diff.open(file,ios::out); sprintf(file,"%s/files/%s_timew-alphas_diff_w.txt",directory,file_name); tww_alphas_diff.open(file,ios::out); double parme[NumBar][nparm], eparme[NumBar][nparm]; double parmw[NumBar][nparm], eparmw[NumBar][nparm]; TMinuit *gMinuit = new TMinuit(nparm); int ierr = 0; double arglis[10]; arglis[0] = 1; gMinuit->mnexcm("SET ERR", arglis,1,ierr); arglis[0] = -1; gMinuit->mnexcm("SET PRINT", arglis,1,ierr); gMinuit->mnexcm("SET SETNOWARNINGS",arglis,1,ierr); for (int j=0 ;j slpmax ) eslope = 0.5*(slpmin+slpmax); if ( eoff < offmin || eoff > offmax ) eoff = 0.5*(offmin+offmax); twevts = 0; for (int k=0; k2.) continue; z1_trk[twevts] = z1_bar[k][j]; z2_trk[twevts] = z2_bar[k][j]; q1_trk[twevts] = qe1_bar[k][j]; q2_trk[twevts] = qe2_bar[k][j]; dt_trk[twevts] = dte_bar[k][j]; ADC_TDCE_FIT[j]->Fill((sqrt(q1_trk[twevts])-sqrt(q2_trk[twevts]))/sqrt(q1_trk[twevts]*q2_trk[twevts]),dt_trk[twevts]); twevts++; } // Fit is unstable presumably because signal and background // shape functional forms are very similar. Start them far apart. gMinuit->mncler(); gMinuit->SetFCN(fcntw); gMinuit->mnparm(0,"A",eoff,0.1,offmin,offmax,ierr); gMinuit->mnparm(1,"B",eslope,1,slpmin,slpmax,ierr); gMinuit->mnparm(2,"C",eslope,1,slpmin,slpmax,ierr); gMinuit->mnparm(3,"F",0.3,0.1,0.1,4,ierr); gMinuit->mnparm(4,"K",0.9,0.01,0.6,1,ierr); gMinuit->mnparm(5,"L",0,0.1,offmin,offmax,ierr); gMinuit->mnparm(6,"M",100,0.1,40,150,ierr); gMinuit->mnparm(7,"N",2.0,0.1,0.1,9,ierr); arglis[0] = 1000; arglis[1] = 1; gMinuit->mnexcm("MIGRAD",arglis,1,ierr); for (int p = 0; pGetParameter(p, parme[j][p], eparme[j][p]); if (ierr != 0 ) { cout << " East bar " << j << " tw corr ierr " << ierr << ": "; for (int p = 0; p110) parme[j][1] = -999.; if (parme[j][2]<40. || parme[j][2]>110) parme[j][2] = -999.; twe_alphas_diff << j; for (int p = 0; p slpmax ) wslope = 0.5*(slpmin+slpmax); if ( woff < offmin || woff > offmax ) woff = 0.5*(offmin+offmax); twevts = 0; for (int k=0; k2.) continue; z1_trk[twevts] = z1_bar[k][j]; z2_trk[twevts] = z2_bar[k][j]; q1_trk[twevts] = qw1_bar[k][j]; q2_trk[twevts] = qw2_bar[k][j]; dt_trk[twevts] = dtw_bar[k][j]; ADC_TDCW_FIT[j]->Fill((sqrt(q1_trk[twevts])-sqrt(q2_trk[twevts]))/sqrt(q1_trk[twevts]*q2_trk[twevts]),dt_trk[twevts]); twevts++; } gMinuit->mncler(); gMinuit->SetFCN(fcntw); gMinuit->mnparm(0,"A",woff,0.1,offmin,offmax,ierr); gMinuit->mnparm(1,"B",wslope,1,slpmin,slpmax,ierr); gMinuit->mnparm(2,"C",wslope,1,slpmin,slpmax,ierr); gMinuit->mnparm(3,"F",0.3,0.2,0.1,4,ierr); gMinuit->mnparm(4,"K",0.9,0.01,0.6,1,ierr); gMinuit->mnparm(5,"L",0,0.1,offmin,offmax,ierr); gMinuit->mnparm(6,"M",100,0.1,40,150,ierr); gMinuit->mnparm(7,"N",2.0,0.1,0.1,9,ierr); arglis[0] = 1000; arglis[1] = 1; gMinuit->mnexcm("MIGRAD",arglis,1,ierr); for (int p = 0; pGetParameter(p, parmw[j][p], eparmw[j][p]); if (ierr != 0) { cout << " West bar " << j << " tw corr ierr " << ierr << ": "; for (int p = 0; p110) parmw[j][1] = -999.; if (parmw[j][2]<40. || parmw[j][2]>110) parmw[j][2] = -999.; tww_alphas_diff << j; for (int p = 0; pWrite(); hfile->Close(); } // timew_calib::LoopTW