// - can be given a set of run numbers (which need not necessarily exist) // - Determines [and plots] tdc offsets (after subtraction of walk effect) for each of the L20 PMTs // - [ TDC_raw - ( TDC_param(p0,p1) + Offset ) = 1000, where // TDC_param(p0,p1) = p0/sqrt(ADC-ADC_pedestal-p1) ] // - ADC pedestals and TDC walk effect parameterization are read from datafiles // - Reads in Walk/L20-walk.dat for walkparameters and Pedestals/L20-adc-ped-####.dat for pedestals // - Writes to L20_cal-####.dat (format like blast.sc_cal) // and to L20-tdc-after-walk-####.dat (walk-corrected) and L20-tdc-####.dat (uncorrected) // - Uses gRaw->GetL20 in TBLRaw.cc with cut on flasher events // Revisions: // - Original code updated (4/9/04) { gROOT->Reset(); // read in the data file numbers, put them in list[] char tmp[250]; int i, j, k, n1, n2, list[2000], nl, il; int arc=gApplication->Argc(); char** arv=gApplication->Argv(); for (i=0;i 0) list[nl++] = n1; if (k == 2 && n1 > 0 && n2>n1) for (int j=n1;jnList();il++) { // ********** read in ADC pedestals ********** int ped[2][2][16]; // left=0,right=1 / top=0,bottom=1 / bars 0-15 int ped_pmt[28][2]; double par_pmt[28][2][3]; char pedfilename[100]; sprintf(pedfilename,"../Pedestals/data/L20-adc-ped-%d.dat",list[il]); FILE *test; test = fopen(pedfilename,"rb"); if (test==NULL) { cout<DataFile(il),"rb"); if (test2==NULL) { cout<DataFile(il)<<" not found."<DataFile(il)<<" ...\n"<Open(gOpt->DataFile(il)); gRaw->ReadNext(1); int nL20; for (int ctr=0 ; !gRaw->ReadNext() && ctr < gOpt->StopAtEvent(); ctr++) { if (ctr%50000==0) printf("\n%9d ", ctr); else if (ctr%10000==0) cout<<":"<GetL20nhits(); // cout<<" ************* L20 hits "<GetL15nhits()<GetL20sector(k); pad = gRaw->GetL20paddle(k); tb = gRaw->GetL20tb(k); //patch for new LADS numbering if (pad < 14) { sect = 0; } else if (pad > 13 && pad < 28) { pad -= 14; } // **** raw TDC flasher offset **** if (sect == 0 && tb == 0 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcrawLEFT_top[pad]->Fill(gRaw->GetL20tdc(k)); } else if (sect == 0 && tb == 1 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcrawLEFT_bot[pad]->Fill(gRaw->GetL20tdc(k)); } else if (sect == 1 && tb == 0 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcrawRIGHT_top[pad]->Fill(gRaw->GetL20tdc(k)); } else if (sect == 1 && tb == 1 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcrawRIGHT_bot[pad]->Fill(gRaw->GetL20tdc(k)); } // **** walk corrected TDC flasher offset **** double tdc_sqrt2 = gRaw->GetL20adc(k)-ped[sect][tb][pad]-walk_par1[sect][tb][pad]; if (tdc_sqrt2>0) { if (sect == 0 && tb == 0 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcLEFT_top[pad]->Fill(gRaw->GetL20tdc(k)-walk_par0[sect][tb][pad]/sqrt(tdc_sqrt2)-1000); } else if (sect == 0 && tb == 1 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcLEFT_bot[pad]->Fill(gRaw->GetL20tdc(k)-walk_par0[sect][tb][pad]/sqrt(tdc_sqrt2)-1000); } else if (sect == 1 && tb == 0 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcRIGHT_top[pad]->Fill(gRaw->GetL20tdc(k)-walk_par0[sect][tb][pad]/sqrt(tdc_sqrt2)-1000); } else if (sect == 1 && tb == 1 ) { // && gRaw->GetL20tdc(k) > 0 && gRaw->GetL20tdc(k) < 4095) { tdcRIGHT_bot[pad]->Fill(gRaw->GetL20tdc(k)-walk_par0[sect][tb][pad]/sqrt(tdc_sqrt2)-1000); } // cout<CodaRead.closedatafile(); } // end of check if data file exists // **** data file output **** TString outfile("data/L20-tdc-after-walk-"); outfile += list[il]; outfile += ".dat"; ofstream out(outfile, ios::out); TString outfile3("data/L20-tdc-"); outfile3 += list[il]; outfile3 += ".dat"; ofstream outraw(outfile3, ios::out); int mean = 0; side_t side = 0; pmt_t pmt = 0; char txt[200]; char txt2[200]; // TCanvas *c6 = new TCanvas("l20.LEFT.top.tdc.offset","l20.LEFT_top_tdc", 10, 10, 960, 720); // c6->Divide(4,4); // c6->Iconify(); char head[100]; sprintf(head,"lr\ttb\tbar\tgausmax\tmax-err\tgaus-sigma"); out<<"! L20 left top : TDC offset (after walk effect correction)"<cd(k+1); mean = tdcLEFT_top[k]->GetMaximumBin();// GetMean(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); // gaus1->SetLineColor(kBlue); tdcLEFT_top[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); // gPad->Modified(); // tdcLEFT_top[k]->Draw(); tdcLEFT_top[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); // int posmax = par[1]; // double posmaxerr = gaus1->GetParError(1); // double sigma = par[2]; // char postext[30]; // sprintf(postext,"%d +/- %.2f",posmax,posmaxerr); // int maxi = tdcLEFT_top[k]->GetMaximum(); // pave = new TPaveText(mean-48,maxi*.9,mean-15,maxi); // pave->SetFillColor(22); // TText *t1=pave->AddText(postext); // t1->SetTextSize(.05); // pave->Draw(); sprintf(txt,"0\t0\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); out<GetMaximumBin(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); tdcrawLEFT_top[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); tdcrawLEFT_top[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); sprintf(txt,"0\t0\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); outraw<Divide(4,4); // c7->Iconify(); out<<"!"<cd(k+1); mean = tdcLEFT_bot[k]->GetMaximumBin();// GetMean(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); // gaus1->SetLineColor(kBlue); // tdcLEFT_bot[k]->Draw(); tdcLEFT_bot[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); // gPad->Modified(); tdcLEFT_bot[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); // int posmax = par[1]; // double posmaxerr = gaus1->GetParError(1); // double sigma = par[2]; // sprintf(postext,"%d +/- %.2f",posmax,posmaxerr); // int maxi = tdcLEFT_bot[k]->GetMaximum(); // pave = new TPaveText(mean-48,maxi*.9,mean-15,maxi); // pave->SetFillColor(22); // TText *t1=pave->AddText(postext); // t1->SetTextSize(.05); // pave->Draw(); sprintf(txt,"0\t1\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); out<GetMaximumBin(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); tdcrawLEFT_bot[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); tdcrawLEFT_bot[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); sprintf(txt,"0\t1\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); outraw<Divide(4,4); // c8->Iconify(); out<<"!"<cd(k+1); mean = tdcRIGHT_top[k]->GetMaximumBin();// GetMean(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); // gaus1->SetLineColor(kBlue); // tdcRIGHT_top[k]->Draw(); tdcRIGHT_top[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); // gPad->Modified(); tdcRIGHT_top[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); // int posmax = par[1]; // double posmaxerr = gaus1->GetParError(1); // double sigma = par[2]; // sprintf(postext,"%d +/- %.2f",posmax,posmaxerr); // int maxi = tdcRIGHT_top[k]->GetMaximum(); // pave = new TPaveText(mean-48,maxi*.9,mean-15,maxi); // pave->SetFillColor(22); // TText *t1=pave->AddText(postext); // t1->SetTextSize(.05); // pave->Draw(); sprintf(txt,"1\t0\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); out<GetMaximumBin();// GetMean(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); tdcrawRIGHT_top[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); tdcrawRIGHT_top[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); sprintf(txt,"1\t0\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); outraw<Divide(4,4); // c9->Iconify(); out<<"!"<cd(k+1); mean = tdcRIGHT_bot[k]->GetMaximumBin();// GetMean(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); // gaus1->SetLineColor(kBlue); // tdcRIGHT_bot[k]->Draw(); tdcRIGHT_bot[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); // gPad->Modified(); tdcRIGHT_bot[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); // int posmax = par[1]; // double posmaxerr = gaus1->GetParError(1); // double sigma = par[2]; // sprintf(postext,"%d +/- %.2f",posmax,posmaxerr); // int maxi = tdcRIGHT_bot[k]->GetMaximum(); // pave = new TPaveText(mean-48,maxi*.9,mean-15,maxi); // pave->SetFillColor(22); // TText *t1=pave->AddText(postext); // t1->SetTextSize(.05); // pave->Draw(); sprintf(txt,"1\t1\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); out<GetMaximumBin(); gaus1 = new TF1("gaus1","gaus",mean-60,mean+60); tdcrawRIGHT_bot[k]->GetXaxis()->SetRangeUser(mean-50,mean+50); tdcrawRIGHT_bot[k]->Fit("gaus1","WRN"); Double_t par[5]; gaus1->GetParameters(par); sprintf(txt,"1\t1\t%d\t%d\t%.3f\t%.3f",k,par[1],gaus1->GetParError(1),par[2]); outraw<