// compile with: // g++ -o plotchipbits.exe plotchipbits.cpp `root-config --cflags --glibs` // #include "TH1F.h" #include "TProfile.h" #include "TMath.h" #include "TF1.h" #include "TLegend.h" #include "TCanvas.h" // #include "TROOT.h" //#include "TStyle.h" #include "TTree.h" #include "TFile.h" #include "TGraphErrors.h" #include "TStyle.h" #include #include #include #include #include #include // #include #include #include using namespace std; int plotchipbits(int mcm = 0,const int iEvent = 1, int chip = 0, int saltronb = 0, const char *dir = "",const char *filename = "", const char *title = "") { char name[100]; unsigned int ErrorCode[16] = {0}; unsigned int WarningCode[16] = {0}; int item = 0; Char_t iChan; // Channel number Char_t iChip; // Channel number UShort_t iMcm; // MCM/FEC number UShort_t iClLength; //number of samples UShort_t iClTime; UInt_t iEventnb; Int_t iSamples[1024]; // Samples int nChan = 0; TH1F* hEvent[16]; TH1F* hEvents[16]; TH1F* hSignal[16]; TH1F* hBits[16]; int vschan[16]; TCanvas *c1 = new TCanvas("c1","Single cluster",600,600); sprintf(name, "%s/%s.root",dir,filename); TFile *inFile = new TFile(name); TTree *tree = (TTree*) inFile->Get("tree"); if(!tree) { cerr << "Tree SALTRO events was not found: " << name << "\n"; return 1; } FILE *limitfile; sprintf(name, "%s.txt","plotchipbits"); limitfile = fopen(name,"r"); if (limitfile == NULL) { return 4; } while (fgets(name,sizeof(name),limitfile) != NULL) { if (name[0] != '#') { switch(item) { case 0: break; case 1: break; case 2: break; case 3: break; } item++; } } fclose(limitfile); if (item == 0) { } else return 5; // Assign variables to branches tree->SetBranchAddress("iEventnb",&iEventnb); tree->SetBranchAddress("iSamples",&iSamples); tree->SetBranchAddress("iChan",&iChan); tree->SetBranchAddress("iChip",&iChip); tree->SetBranchAddress("iMcm",&iMcm); tree->SetBranchAddress("iClLength",&iClLength); tree->SetBranchAddress("iClTime",&iClTime); for (Int_t j = 0; j < 16; j++) { vschan[j] = 0; } Int_t nentries = tree->GetEntries(); printf("ENTRIES %d\n",nentries); for (Int_t j = 0; j < 16; j++) { sprintf(name, "hSignal_%d", j); hSignal[j] = ((TH1F *)(gROOT->FindObject(name))); if (hSignal[j]) delete hSignal[j]; hSignal[j] = new TH1F(name, "",1024,-0.5,1023.5); hSignal[j]->SetMinimum(0); sprintf(name, "hBits_%d", j); hBits[j] = ((TH1F *)(gROOT->FindObject(name))); if (hBits[j]) delete hBits[j]; hBits[j] = new TH1F(name, "",10,-0.5,9.5); hBits[j]->SetMinimum(0); // hSignal[j]->SetMaximum(1024); } for (Int_t j = 0; j < 16; j++) { sprintf(name, "hEvent_%d", j); hEvent[j] = ((TH1F *)(gROOT->FindObject(name))); if (hEvent[j]) delete hEvent[j]; hEvent[j] = new TH1F(name, "",1024,-0.5,1023.5); hEvent[j]->SetMinimum(0); hEvent[j]->SetStats(0); } for (Int_t j = 0; j < 16; j++) { sprintf(name, "hEvents_%d", j); hEvents[j] = ((TH1F *)(gROOT->FindObject(name))); if (hEvents[j]) delete hEvents[j]; hEvents[j] = new TH1F(name, "",1024,-0.5,1023.5); hEvents[j]->SetMinimum(0); hEvents[j]->SetStats(0); } gStyle->SetOptStat(0); int nbsamples = 0; int nbempty = 0; for (Int_t j = 0; j < nentries; j++) { tree->GetEntry(j); vschan[iChan]++; nbsamples = 0; if (iEventnb == iEvent) { for(Int_t l = 0; l < iClLength; l++) { hEvent[iChan]->AddBinContent(iClTime-l, iSamples[l]); } } for(Int_t l = 0; l < iClLength; l++) { if ((iSamples[l] > 0) && (iSamples[l] < 1023)) { nbsamples++; hEvents[iChan]->AddBinContent(iClTime-l, iSamples[l]); } } for(Int_t l = 0; l < iClLength; l++) { hSignal[iChan]->Fill(iSamples[l]); if ((iSamples[l] > 0) && (iSamples[l] < 1023)) { for(Int_t k = 0; k < 10; k++) { if (iSamples[l] & ( 1 << k)) hBits[iChan]->Fill(k,1.0/nbsamples); } } if ((iChan == 0) && ((iSamples[l] == 0) || (iSamples[l] == 1023))) nbempty++; } } Int_t oldLevel = gErrorIgnoreLevel; gErrorIgnoreLevel = kWarning; for (Int_t j = 0; j < 16; j++) { c1->cd(iChan+1); sprintf(name, "Event %d Channel %d",iEvent,j); hEvent[j]->SetTitle(name); hEvent[j]->GetXaxis()->SetTitle("Sample #"); hEvent[j]->GetYaxis()->SetTitle("ADC value"); hEvent[j]->SetAxisRange(200, 600, "X"); hEvent[j]->Draw(); if (j == 0) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-event%d-%s.pdf(",dir,saltronb,saltronb,mcm,chip,iEvent,title); else if ( j == 15) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-event%d-%s.pdf)",dir,saltronb,saltronb,mcm,chip,iEvent,title); else sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-event%d-%s.pdf",dir,saltronb,saltronb,mcm,chip,iEvent,title); c1->SaveAs(name,"pdf"); } for (Int_t j = 0; j < 16; j++) { c1->cd(iChan+1); sprintf(name, "Events channel %d",j); hEvents[j]->SetTitle(name); hEvents[j]->GetXaxis()->SetTitle("Sample #"); hEvents[j]->GetYaxis()->SetTitle("ADC value"); hEvents[j]->Draw(); if (j == 0) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-events-%s.pdf(",dir,saltronb,saltronb,mcm,chip,title); else if ( j == 15) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-events-%s.pdf)",dir,saltronb,saltronb,mcm,chip,title); else sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-events-%s.pdf",dir,saltronb,saltronb,mcm,chip,title); c1->SaveAs(name,"pdf"); } for (Int_t j = 0; j < 16; j++) { //hSignal[j]->Scale(1.0/vschan[j]); c1->cd(j+1); // c1->cd(); sprintf(name, "Adcs ch %d chip %d %s", j,chip,title); hSignal[j]->SetTitle(name); hSignal[j]->GetYaxis()->SetTitle("Entries/events"); hSignal[j]->GetXaxis()->SetTitle("ADC value"); //hSignal[j]->SetAxisRange(0, 1.0, "Y"); // hSignal[j]->SetAxisRange(40, 1023, "X"); hSignal[j]->SetAxisRange(0, 500, "Y"); // hSignal[j]->SetAxisRange(0, 200, "X"); hSignal[j]->Draw(); if (j == 0) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-adcvalues-%s.pdf(",dir,saltronb,saltronb,mcm,chip,title); else if (j==15) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-adcvalues-%s.pdf)",dir,saltronb,saltronb,mcm,chip,title); else sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-adcvalues-%s.pdf",dir,saltronb,saltronb,mcm,chip,title); c1->SaveAs(name,"pdf"); } for (Int_t j = 0; j < 16; j++) { // hBits[j]->Scale(1.0/vschan[j]); hBits[j]->Scale(100.0/iEventnb); c1->cd(j+1); // c1->cd(); sprintf(name, "Bits ch %d chip %d %s", j,chip,title); hBits[j]->SetTitle(name); hBits[j]->GetYaxis()->SetTitle("Entries/events"); hBits[j]->GetXaxis()->SetTitle("Bit"); hBits[j]->SetAxisRange(0, 100, "Y"); // hBits[j]->SetAxisRange(40, 1023, "X"); //hBits[j]->SetAxisRange(0, 1000, "Y"); //hBits[j]->SetAxisRange(0, 500, "X"); hBits[j]->Draw(); if (j == 0) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-%s.pdf(",dir,saltronb,saltronb,mcm,chip,title); else if (j==15) sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-%s.pdf)",dir,saltronb,saltronb,mcm,chip,title); else sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-%s.pdf",dir,saltronb,saltronb,mcm,chip,title); c1->SaveAs(name,"pdf"); } printf("EMPTY %d %d %d\n",nbempty, iEventnb,nbempty / iEventnb); printf("EMPTY %d %d %d\n",nbsamples, iEventnb,nbsamples / iEventnb); gErrorIgnoreLevel = oldLevel; FILE *csvfile; sprintf(name,"%s/chip%d/saltro%d-mcm%d-c%d-bits-%s.csv",dir,saltronb,saltronb,mcm,chip,title); struct stat fileBuffer; int csvexist = 0; if (stat (name, &fileBuffer) == 0) csvexist = 1; printf("CSV EXIST %d\n",csvexist); csvfile = fopen(name,"a"); if (csvfile == NULL) { return 3; } if (csvexist == 0) { fprintf(csvfile,"Channel,"); for (int j = 0; j < 10; j++) { fprintf(csvfile,"Bit%d,",j); } fprintf(csvfile,"Error,Warning\n"); } Double_t value; for (int j = 0; j < 16; j++) { fprintf(csvfile,"%d,",j+iChip*16); for (int k = 1; k<=10; k++) { value=hBits[j]->GetBinContent(k); fprintf(csvfile,"%.2f,",value); } fprintf(csvfile,"%08X,%08X\n",ErrorCode[j],WarningCode[j]); } fclose(csvfile); return 0; } int main (int argc, char *argv[]) { int iret = 0; if (argc!=8) { printf("not enough arguments: argc = %d\nSyntax should be:\n./plotchipbits.exe eventnb,saltro mcm chip dir filename title\n",argc); return -1; } int eventnb = atoi(argv[1]); int saltronb = atoi(argv[2]); int mcm = atoi(argv[3]); int chip = atoi(argv[4]); iret = plotchipbits(mcm,eventnb,chip,saltronb,argv[5],argv[6],argv[7]); return iret; }