- ///////////////////////////////////////////////////
- //
- // Macro: plotADCs.C
- // Author: S. Blusk
- // Date: Oct 19, 2015
- //
- // Purpose: To loop over events and look at the CMS ADC distribution vs channel number
- // Can also be run on selected events, liste in a file: "MissingDUTHits.dat", which can
- // be obtained by running ClusterAnaWithTrack
- // with the flag
- // writeEventsWithMissinhHitsToFile = true
- //
- // Note: The cursor needs to be on the event display window to advance to the next event.
- // Hit ENTER to go to next event.
- //
- ///////////////////////////////////////////////////
-
- bool plotSelectedEvents = true;
- bool showEventDisplay = true;
-
- bool fillStatDistribution = true; // Fill summary histogram
-
- int lowCh = 127; // Low Channel number of ADC distribution
- int hiCh = 256; // High Channel number of ADC distribution
-
- int evList[20000];
- double nomStrip[20000];
- double xtrk[20000];
- double ytrk[20000];
- // Various arrays of parameters common to this macro
- double tdcTime = 0;
- double adcs[512] = {0};
- double finalSignal[512] = {0};
-
- int NCluster = 0;
- float ClusterCharge[100] = {0};
- int ClusterSize[100] ={0};
- float ClusterPosY[100] ={0};
- float seedChannel[100] ={0};
-
- int iOffSet = 0; // Offset into tree, to get to specific events
- int printEventDisplays = 0; // Number of event displays to print to file
- float polarity = -1.0;
-
-
- /////////////////////////////////////////////////////////////////////////////////
-
- void plotADCs(){
- gStyle->SetNdivisions(505,"Y");
- gStyle->SetNdivisions(505,"X");
- gStyle->SetOptStat(0);
- gStyle->SetOptFit(1);
- gStyle->SetPadTickX(1);
- gStyle->SetPadTickY(1);
-
- //TString sigFile = getFileToOpen(runNum);
- TString sigFile = "/data2/sblusk/TB/July2015/AnaFiles/BoardA6/Run_Bias_Scan-B6-A-212-8358_Tuple.root";
-
-
- // Open signal file
- TFile *fs = new TFile(sigFile);
- TTree* cmstree = (TTree*)fs->Get("TbUT/CMS");
- TTree* fChain = (TTree*)fs->Get("TbUT/Clusters");
- int nevents = cmstree->GetEntriesFast();
-
- // Strip level data
- Double_t cmsData[512];
- // List of branches
- TBranch *b_cmsData; //!
- cmstree->SetBranchAddress("cmsData", cmsData, &b_cmsData);
-
- // Clusters
- // Declaration of leaf types
- 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];
-
- 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; //!
-
- fChain->SetBranchAddress("clusterNumberPerEvent", &clusterNumberPerEvent, &b_clusterNumberPerEvent);
- fChain->SetBranchAddress("clustersTDC", &clustersTDC, &b_clustersTDC);
- fChain->SetBranchAddress("timestamps", ×tamps, &b_timestamps);
- fChain->SetBranchAddress("clustersPosition", clustersPosition, &b_clustersPosition);
- fChain->SetBranchAddress("clustersSeedPosition", clustersSeedPosition, &b_clustersSeedPosition);
- fChain->SetBranchAddress("clustersCharge", clustersCharge, &b_clustersCharge);
- fChain->SetBranchAddress("clustersSize", clustersSize, &b_clustersSize);
- fChain->SetBranchAddress("clustersSeedCharge", clustersSeedCharge, &b_clustersSeedCharge);
- fChain->SetBranchAddress("clustersCharge2StripLeft", clustersCharge2StripLeft, &b_clustersCharge2StripLeft);
- fChain->SetBranchAddress("clustersCharge1StripLeft", clustersCharge1StripLeft, &b_clustersCharge1StripLeft);
- fChain->SetBranchAddress("clustersCharge1StripRight", clustersCharge1StripRight, &b_clustersCharge1StripRight);
- fChain->SetBranchAddress("clustersCharge2StripRight", clustersCharge2StripRight, &b_clustersCharge2StripRight);
-
- TH1F *h = new TH1F("h","ADC, CM + Step Subtracted",512,0.0,512);
- TH1F *hm1 = new TH1F("hm1","ADC of nomStrip",110,-100.0,1000);
- TH1F *hm = new TH1F("hm","ADC of nomStrip#pm1",110,-100.0,1000);
- h->SetTitle("");
- h->SetNdivisions(510,"X");
-
- TCanvas *theCanvas;
- int nPrint = 0;
-
- char input;
- int nEvents;
-
- int jentry;
- double strip, xp, yp;
-
- std::ifstream infile;
- if(plotSelectedEvents){
- // Read in event list
- TString filename = "MissingDUTHits.dat";
- cout << "------------------------------------------------------------" << endl;
- cout << " You've selected to view events from file: " << filename << endl;
- cout << "------------------------------------------------------------" << endl;
- infile.open(filename);
- if(!infile) { // file couldn't be opened
- cerr << "Error: file could not be opened" << endl;
- exit(1);
- }
- int il = 0;
- while ( !infile.eof() ) { // keep reading until end-of-file
- infile >> jentry >> strip >> xp >> yp;
- if(il>9999) break;
- evList[il] = jentry;
- nomStrip[il] = strip;
- xtrk[il] = xp;
- ytrk[il] = yp;
- il++;
- }
- infile.close();
- nEvents = nevents - 1000;
- }else{
- cout << "How many events do you want to look at ?" << endl;
- cin >> nEvents;
- cout << "--------------------------------------"<<endl;
- }
-
- //------------------------
- // Begin Loop over events
- //------------------------
- il = 0;
- for(int i=iOffSet; i<iOffSet+nEvents; i++){
- //if(i%1==0) cout << "Processing Event " << i << endl;
- if(plotSelectedEvents){
- if(i != evList[il]) continue;
- //if(showEventDisplay){
- // cout << "-------------------------------------------------------------------------------"<<endl;
- // cout << "Found selected event: " << i << ", NomStrip of Missing Hit = " << nomStrip[il] << endl;
- // cout << "-------------------------------------------------------------------------------"<<endl;
- //}
- }
-
- cmstree->GetEntry(i);
- fChain->GetEntry(i);
- int k=0;
-
- //--------------
- // Get CMS data
- //--------------
- for(int j=0; j<512;j++){
- adcs[j] = cmsData[j];
- }
-
- //------------------
- // Get Cluster data
- //------------------
- NCluster = clusterNumberPerEvent;
- if(NCluster>=10) NCluster=10;
- if(showEventDisplay) cout << "# Clusters = " << NCluster << endl;
- for(int j=0; j<NCluster; j++){
- ClusterSize[j] = clustersSize[j];
- ClusterPosY[j] = 1.0*clustersPosition[j];
- ClusterCharge[j] = clustersCharge[j];
- tdcTime = clustersTDC;
- }
-
-
- //-------------------------
- // Get signal distributions
- //-------------------------
- getSignal();
-
- int nstrip = 0;
- double vstrip1 = 0, vstrip3 = 0;
- if(plotSelectedEvents){
- nstrip = nomStrip[il]+0.5;
- vstrip1 = finalSignal[nstrip];
- if(nstrip>1) vstrip3 = vstrip1 + finalSignal[nstrip-1];
- if(nstrip<511) vstrip3 = vstrip3 + finalSignal[nstrip+1];
- vstrip1 = -1.0*vstrip1;
- vstrip3 = -1.0*vstrip3;
-
- }
-
- //------------------------------------------------------------
- // Single Event displays of pedestal & noise subtracted data -
- //------------------------------------------------------------
- if(showEventDisplay){
- theCanvas = plotSingleEvent(i, h, nomStrip[il]);
- cout << "NomStrip = " << nstrip << " .... Charge in nomStrip and nomStrip +- 1: " << vstrip1 << " " << vstrip3 << endl;
- printf("\n <<< ENTER / RETURN to continue >>> \n");
- theCanvas->WaitPrimitive();
- if(nPrint < printEventDisplays){
- theCanvas->Print(Form("./Plots/EventDisplayCorr_%d.png",i));
- theCanvas->Print(Form("./Plots/EventDisplayCorr_%d.pdf",i));
- nPrint++;
- }
- }
-
- //----------------
- // Fill histograms
- //----------------
- if(fillStatDistribution && plotSelectedEvents){
- hm1->Fill(-1.0*vstrip1);
- hm->Fill(-1.0*vstrip3);
- }
-
- if(plotSelectedEvents) il++;
- }
-
-
- // Plot statistical distributions
- TCanvas *c = new TCanvas("c","Plots",500,800);
- c->Divide(1,2);
- c->cd(1);
- hm1->Draw();
- c->cd(2);
- hm->Draw();
- }
-
- void getSignal(){
- // -----------------
- // - Final result -
- // - Here, one could make any "corrections", or flip polarity, etc
- // -----------------
- for(int k=0;k<256;k++){finalSignal[k] = adcs[k];}
- return;
- }
-
-
- TCanvas* plotSingleEvent(int i, TH1F *h, double xstrip)
- {
- //-----------------
- // Final result
- //-----------------
- double low = 1000;
- double hi = -1000;
-
- h->Reset();
- for(int k=0;k<512;k++) {
- h->Fill(k,finalSignal[k]);
- if(finalSignal[k]<low) low = finalSignal[k];
- if(finalSignal[k]>hi) hi = finalSignal[k];
- }
-
- h->SetMinimum(low-100);
- h->SetMaximum(hi+300);
- h->GetXaxis()->SetRangeUser(lowCh,hiCh);
-
- TCanvas *c = new TCanvas("c","",500,0,800,800);
- h->Draw();
- TLine *l = new TLine(lowCh, 0, hiCh, 0);
- TLine *l2 = new TLine(xstrip, low-100, xstrip, hi+150);
- l2->SetLineColor(5); l2->SetLineWidth(4); l2->Draw();
- l->SetLineColor(3); l->SetLineStyle(2); l->SetLineWidth(2); l->Draw();
- h->Draw("same");
-
-
- TLatex *myLatex = new TLatex();
- myLatex->SetTextFont(42); myLatex->SetTextColor(1);
- myLatex->SetTextAlign(12); myLatex->SetNDC(kTRUE); myLatex->SetTextSize(0.065);
- myLatex->DrawLatex(0.14,0.85,Form("Event %d",i));
- TString tdcs = Form("TDC time = %4.1f ns",tdcTime);
- myLatex->SetTextSize(0.045);myLatex->DrawLatex(0.18,0.79,tdcs);
-
-
- float yval = 0.79;
- myLatex->SetTextSize(0.035);
- yval = yval - 0.05;
- for(int k=0;k<NCluster;k++){
- TString clString = Form("Size=%d, Q=%3.0f, Pos=%4.1f",ClusterSize[k],ClusterCharge[k],ClusterPosY[k]);
- myLatex->DrawLatex(0.14,yval,clString);
- yval = yval - 0.05;
- }
-
- return c;
- }
-
-