- //--------------------------------------------------------------------------------------------------------------------------------------------------------
- //
- // This code will append tracking information to a ROOT tree that contains cluster information from a UT DUT
- //
- // To compile
- // > SetupProject LHCb
- // > make
- //
- // Example of how to run interactively:
- //
- // ./combDUTwithTrack -i /data2/pmmannin/BoardA4_redo_v2/Run_Bias_Scan-B1-A-227-8711_Tuple.root -t /data2/sblusk/TB/July2015/TelescopeData/BoardA4/Kepler-tuple.root -o /data2/sblusk/test2.root
- //
- //
- // The Telescope data is on eos at:~/eos/lhcb/testbeam/ut/TelescopeData/July2015/RootFiles/RunXXXX/Output/Kepler-tuple.root
- // where XXXX = run number from TPIX DAQ system (Kepler run #)
- //
- // The DUT data needs to be processed through TbUT and put on eos in a standard area.
- //
- // The easiest, although ot safest way, to get the data directly accessible from eos is to use:
- // eosmount ~/eos
- //--------------------------------------------------------------------------------------------------------------------------------------------------------
-
-
- #include <iostream>
- #include <vector>
- #include <fstream>
- #include <math.h>
- #include <stdlib.h>
- #include "TFile.h"
- #include "TROOT.h"
- #include "TSystem.h"
- #include "TTree.h"
- #include "TH1F.h"
- #include "TH2F.h"
- #include "TF1.h"
- #include "TCanvas.h"
-
- #ifdef __MAKECINT__
- #pragma link C++ class vector<float>+;
- #endif
-
- using namespace std;
-
-
-
- int main(int __argc, char *__argv[]){
-
- gROOT->ProcessLine("#include <vector>");
- const char *calib_filename = "calib.root";
- const char *out_filename = "outputfile.root";
-
- int c;
- extern char* optarg;
- extern int optind;
-
- int channel;
- int type;
- cout << endl;
-
-
- cout << "number of arguments: " << __argc << endl;
- for(int i=0; i < __argc; i++) {
-
- cout << __argv[i] << endl;
- }
- /*____________________________Parse Command Line___________________________*/
- while((c = getopt(__argc,__argv,"i:o:n:t:p")) != -1){
- switch(c){
- case 'h': // help option
- cout << "Example: ./analyzeCalib -i calib.root -o outputfile.root -n channel -t type" << endl;
- return 0;
- break;
- case 'i':
- calib_filename = optarg;
- cout << "---> Calibration ROOT filename: " << calib_filename << endl;
- break;
- case 'o':
- out_filename = optarg;
- cout << "---> Output filename: " << out_filename << endl;
- break;
- case 'n':
- channel = atoi(optarg);
- cout << "Channel: " << channel << endl;
- break;
- case 't':
- type = atoi(optarg);
- cout << "Type: " << type << endl;
- break;
- default: // unknown option flag
- printf("Error!!!! Unknown option -%c\n",c);
- cout << "Example: analyzeCalib -i calib.root -o outputfile.root -n channel -t type" << endl;
- return 0;
- }
- }
-
- cout << endl;
-
- Int_t clusterNumberPerEvent;
- UInt_t clustersTDC;
- ULong64_t timestamps;
- Double_t clustersPosition[10];
- Int_t clustersSeedPosition[10];
- Double_t clustersCharge[10];
- Int_t clustersSize[10];
- Double_t clustersSeedCharge[10];
- Double_t clustersCharge2StripLeft[10];
- Double_t clustersCharge1StripLeft[10];
- Double_t clustersCharge1StripRight[10];
- Double_t clustersCharge2StripRight[10];
-
- // List of branches
- TBranch *b_clusterNumberPerEvent; //!
- TBranch *b_clustersTDC; //!
- TBranch *b_timestamps; //!
- TBranch *b_clustersPosition; //!
- TBranch *b_clustersSeedPosition; //!
- TBranch *b_clustersCharge; //!
- TBranch *b_clustersSize; //!
- TBranch *b_clustersSeedCharge; //!
- TBranch *b_clustersCharge2StripLeft; //!
- TBranch *b_clustersCharge1StripLeft; //!
- TBranch *b_clustersCharge1StripRight; //!
- TBranch *b_clustersCharge2StripRight; //!
-
-
- //dut_filename = "/data2/pmmannin/BoardA4_redo_v2/Run_Bias_Scan-B1-A-227-8711_Tuple.root";
- TFile *f_calib = new TFile(calib_filename,"READONLY");
- TTree* t_dut = (TTree*)f_calib->Get("TbUT/Clusters");
-
- t_dut->SetBranchAddress("clusterNumberPerEvent", &clusterNumberPerEvent, &b_clusterNumberPerEvent);
- t_dut->SetBranchAddress("clustersTDC", &clustersTDC, &b_clustersTDC);
- t_dut->SetBranchAddress("timestamps", ×tamps, &b_timestamps);
- t_dut->SetBranchAddress("clustersPosition", clustersPosition, &b_clustersPosition);
- t_dut->SetBranchAddress("clustersSeedPosition", clustersSeedPosition, &b_clustersSeedPosition);
- t_dut->SetBranchAddress("clustersCharge", clustersCharge, &b_clustersCharge);
- t_dut->SetBranchAddress("clustersSize", clustersSize, &b_clustersSize);
- t_dut->SetBranchAddress("clustersSeedCharge", clustersSeedCharge, &b_clustersSeedCharge);
- t_dut->SetBranchAddress("clustersCharge2StripLeft", clustersCharge2StripLeft, &b_clustersCharge2StripLeft);
- t_dut->SetBranchAddress("clustersCharge1StripLeft", clustersCharge1StripLeft, &b_clustersCharge1StripLeft);
- t_dut->SetBranchAddress("clustersCharge1StripRight", clustersCharge1StripRight, &b_clustersCharge1StripRight);
- t_dut->SetBranchAddress("clustersCharge2StripRight", clustersCharge2StripRight, &b_clustersCharge2StripRight);
-
- int numEvents = t_dut->GetEntriesFast();
- cout << " ------------------------------------------------------" << endl;
- cout << " | Number of events found = " << numEvents << endl;
- cout << " ------------------------------------------------------" << endl;
-
- vector<int> maxStrips;
-
- int nfound=0;
- //out_filename = "/data2/sblusk/test.root";
- TFile *f_out = new TFile(out_filename,"recreate");
-
- //TFile *fileout = new TFile("temp.root","RECREATE");
- TH1F *h_chg = new TH1F("h_chg","Cluster Charge",200,-2000,2000);
- TH1F *h_chgLeft = new TH1F("h_chgLeft","Charge Charge (ch-1)",200,-2000,2000);
- TH1F *h_chgLeft2 = new TH1F("h_chgLeft2","Charge Charge (ch-2)",200,-2000,2000);
- TH1F *h_chgRight = new TH1F("h_chgRight","Charge Charge (ch+1)",200,-2000,2000);
- TH1F *h_chgRight2 = new TH1F("h_chgRight2","Charge Charge (ch+2)",200,-2000,2000);
- TH1F *h_chgDiff = new TH1F("h_chgDiff","Charge_{left}-Charge_{right}",200,-2000,2000);
- TH1F *h_chgDiff2 = new TH1F("h_chgDiff2","Charge_{s-2}-Charge_{s+2}",200,-2000,2000);
- TH1F *h_seed = new TH1F("h_seed","Seed Strip",513,-0.5,512.5);
- TH1F *h_pos = new TH1F("h_pos","Strip",513,-0.5,512.5);
-
- int strip;
- int left;
- int right;
-
- for(int i=0;i < numEvents; i++){
- int nb = t_dut->GetEntry(i);
- if(nb <= 0) break;
- for(int j=0; j < min(clusterNumberPerEvent,10);j++) {
- h_pos->Fill(clustersPosition[j]);
- }
- }
-
-
- /*
- for(int i=1; i < 511; i++) {
- if(h_pos->GetBinContent(i) > 2500) {
- maxStrips.push_back((int)h_pos->GetBinCenter(i));
- cout << (int)h_pos->GetBinCenter(i) << endl;
- }
- }
-
- for(int i=0; i < maxStrips.size(); i++) {
- cout << "Max Strip " << i << ": " << maxStrips.at(i) << endl;
- }
- */
-
-
- if(type == 0) strip = channel+128;
- else if(type == 1) strip = channel;
- else { cout << "Please enter a valid type: 0 for A, 1 for D, 2 for Micron Mini, 3 for Ham Mini" << endl; return 0; }
-
- left = strip-1;
- right = strip+1;
-
- for(int i=0;i < numEvents; i++){
- int nb = t_dut->GetEntry(i);
- if(nb <= 0) break;
- double chgLeft = 0.0;
- double chgRight = 0.0;
- for(int j=0; j < min(clusterNumberPerEvent,10);j++) {
- if(fabs( clustersPosition[j]-strip) < 0.5 ) {
- h_chg->Fill(clustersCharge[j]);
- h_seed->Fill(clustersSeedPosition[j]);
- h_chgLeft->Fill(clustersCharge1StripLeft[j]);
- h_chgRight->Fill(clustersCharge1StripRight[j]);
- h_chgLeft2->Fill(clustersCharge2StripLeft[j]);
- h_chgRight2->Fill(clustersCharge2StripRight[j]);
- h_chgDiff->Fill(clustersCharge1StripLeft[j]-clustersCharge1StripRight[j]);
- h_chgDiff2->Fill(clustersCharge2StripLeft[j]-clustersCharge2StripRight[j]);
- }
- }
- }
-
- TCanvas *c1 = new TCanvas("c","c",1200,800);
-
- c1->Divide(3,3);
- c1->cd(1)->SetLeftMargin(0.13);
- h_chg->SetTitle(TString(Form("Seed Channel %d (strip %d)",channel,strip)));
- h_chg->GetXaxis()->SetTitle("Cluster Charge");
- h_chg->Draw();
-
- c1->cd(2)->SetLeftMargin(0.13);
- h_chgLeft->SetTitle(TString(Form("Left Channel: %d (strip %d)",channel-1,left)));
- h_chgLeft->GetXaxis()->SetTitle("Cluster Charge, N-1");
- h_chgLeft->Draw();
-
- c1->cd(3)->SetLeftMargin(0.13);
- h_chgRight->SetTitle(TString(Form("Right Channel: %d (strip %d)",channel+1,right)));
- h_chgRight->GetXaxis()->SetTitle("Cluster Charge, N+1");
- h_chgRight->Draw();
-
- c1->cd(4)->SetLeftMargin(0.13);
- h_chgLeft2->SetTitle(TString(Form("2^{nd} Left Channel: %d (strip %d)",channel-2,left-1)));
- h_chgLeft2->GetXaxis()->SetTitle("Cluster Charge, N-2");
- h_chgLeft2->Draw();
-
- c1->cd(5)->SetLeftMargin(0.13);
- h_chgRight2->SetTitle(TString(Form("2^{nd} Right Channel: %d (strip %d)",channel+2,right+1)));
- h_chgRight2->GetXaxis()->SetTitle("Cluster Charge, N+2");
- h_chgRight2->Draw();
-
-
- c1->cd(6)->SetLeftMargin(0.13);
- h_chgDiff->GetXaxis()->SetTitle("Cluster Charge Difference (s-1,s+1)");
- h_chgDiff->Draw();
-
- c1->cd(7)->SetLeftMargin(0.13);
- h_chgDiff2->GetXaxis()->SetTitle("Cluster Charge Difference (s-2,s+2)");
- h_chgDiff2->Draw();
-
- c1->cd(8)->SetLeftMargin(0.13);
- h_seed->GetXaxis()->SetTitle("Seed Cluster Position");
- h_seed->GetXaxis()->SetRangeUser(h_seed->GetMaximumBin()-10,h_seed->GetMaximumBin()+10);
- h_seed->Draw();
-
-
-
-
- c1->SaveAs(TString(Form("Calibration_Type%d_Channel%d.png",type,channel)));
-
- // Write and close ROOT file.
- f_out->Write();
- f_out->Close();
-
- return 0;
- }