#include <TH1F.h>
#include <TH2I.h>
#include <TGraph.h>
+#include <TExec.h>
#include <TStyle.h>
+#include <TString.h>
+#include <TSystem.h>
#include <TGrid.h>
#include <TLine.h>
#include <TCanvas.h>
//
// Origin: F. Prino (prino@to.infn.it)
-void ShowCalibrationSDD(Int_t iMod=0, Char_t *filnam="$ALICE_ROOT/ITS/Calib/CalibSDD/Run0_9999999_v0_s0.root"){
+void MakePalette(){
+ Int_t palette[3]={kGray,2,3};
+ gStyle->SetPalette(3,palette);
+}
+
+void ShowCalibrationSDD(Char_t *filnam="$ALICE_ROOT/OCDB/ITS/Calib/CalibSDD/Run0_9999999_v0_s0.root", Int_t iMod=0){
TFile *f=TFile::Open(filnam);
hlay4->GetYaxis()->SetTitle("Ladder");
hlay4->SetStats(0);
hlay4->SetMinimum(-1);
+ TH2I* hdeadlay3=new TH2I("hdlay3","Layer 3",6,-0.5,5.5,14,-0.5,13.5);
+ hdeadlay3->GetXaxis()->SetTitle("Detector");
+ hdeadlay3->GetYaxis()->SetTitle("Ladder");
+ hdeadlay3->GetXaxis()->SetTickLength(0);
+ hdeadlay3->GetYaxis()->SetTickLength(0);
+ hdeadlay3->SetStats(0);
+ hdeadlay3->SetMinimum(-1.);
+ TH2I* hdeadlay4=new TH2I("hdlay4","Layer 4",8,-0.5,7.5,22,-0.5,21.5);
+ hdeadlay4->GetXaxis()->SetTitle("Detector");
+ hdeadlay4->GetYaxis()->SetTitle("Ladder");
+ hdeadlay4->GetXaxis()->SetTickLength(0);
+ hdeadlay4->GetYaxis()->SetTickLength(0);
+ hdeadlay4->GetYaxis()->SetTitle("Ladder");
+ hdeadlay4->SetStats(0);
+ hdeadlay4->SetMinimum(-1.);
TObjArray *calSDD = (TObjArray *)ent->GetObject();
printf("Entries in array=%d\n",calSDD->GetEntriesFast());
TH1F* hmodstatus=new TH1F("hmodstatus","",260,0.5,260.5);
TH1F* hnbadch=new TH1F("hnbadch","",260,0.5,260.5);
TH1F* hbase=new TH1F("hbase","",60,0.5,120.5);
+ TH2F* hbasemod=new TH2F("hbasemod","",260,239.5,499.5,50,0.,100.);
TH1F* hnoise=new TH1F("hnoise","",100,0.,7.);
+ TH2F* hnoisemod=new TH2F("hnoisemod","",260,239.5,499.5,50,0.,10.);
TH1F* hgain=new TH1F("hgain","",100,0.,4.);
+ TH2F* hgainmod=new TH2F("hgainmod","",260,239.5,499.5,50,0.,4.);
TH1F* hchstatus=new TH1F("hchstatus","",2,-0.5,1.5);
+
+
AliITSCalibrationSDD *cal;
Int_t badModCounter3=0;
Int_t badModCounter4=0;
+ Int_t badHybridCounter3=0;
+ Int_t badHybridCounter4=0;
Int_t badAnodeCounter3=0;
Int_t badAnodeCounter4=0;
Int_t badAnodeCounterGoodMod3=0;
Int_t badAnodeCounterGoodMod4=0;
+ Int_t badAnodeCounterGoodHybrid3=0;
+ Int_t badAnodeCounterGoodHybrid4=0;
Int_t badAnodeCounterGoodModAndChip3=0;
Int_t badAnodeCounterGoodModAndChip4=0;
Int_t badChipCounter3=0;
printf("BAD\t");
if(lay==3){
badModCounter3++;
+ badHybridCounter3+=2;
hlay3->SetBinContent(index,lad,0);
hlay3->SetBinContent(index+1,lad,0);
}else if(lay==4){
badModCounter4++;
+ badHybridCounter4+=2;
hlay4->SetBinContent(index,lad,0);
hlay4->SetBinContent(index+1,lad,0);
}
badAnodeCounterGoodMod3+=cal->GetDeadChannels();
if(cal->IsChipBad(0) && cal->IsChipBad(1) && cal->IsChipBad(2) && cal->IsChipBad(3)){
hlay3->SetBinContent(index,lad,0);
+ badHybridCounter3++;
}else{
hlay3->SetBinContent(index,lad,1);
+ for(Int_t iAn=0; iAn<256; iAn++){
+ if(cal->IsBadChannel(iAn)) badAnodeCounterGoodHybrid3++;
+ }
}
if(cal->IsChipBad(4) && cal->IsChipBad(5) && cal->IsChipBad(6) && cal->IsChipBad(7)){
hlay3->SetBinContent(index+1,lad,0);
+ badHybridCounter3++;
}else{
hlay3->SetBinContent(index+1,lad,1);
+ for(Int_t iAn=256; iAn<512; iAn++){
+ if(cal->IsBadChannel(iAn)) badAnodeCounterGoodHybrid3++;
+ }
}
}else{
badAnodeCounterGoodMod4+=cal->GetDeadChannels();
if(cal->IsChipBad(0) && cal->IsChipBad(1) && cal->IsChipBad(2) && cal->IsChipBad(3)){
hlay4->SetBinContent(index,lad,0);
+ badHybridCounter4++;
}else{
hlay4->SetBinContent(index,lad,1);
+ for(Int_t iAn=0; iAn<256; iAn++){
+ if(cal->IsBadChannel(iAn)) badAnodeCounterGoodHybrid4++;
+ }
}
if(cal->IsChipBad(4) && cal->IsChipBad(5) && cal->IsChipBad(6) && cal->IsChipBad(7)){
hlay4->SetBinContent(index+1,lad,0);
+ badHybridCounter4++;
}else{
hlay4->SetBinContent(index+1,lad,1);
+ for(Int_t iAn=256; iAn<512; iAn++){
+ if(cal->IsBadChannel(iAn)) badAnodeCounterGoodHybrid4++;
+ }
}
}
- }
+ }
printf(" Chip Status (0=OK, 1=BAD): ");
for(Int_t ic=0; ic<8;ic++){
printf("%d ",cal->IsChipBad(ic));
else badChipCounter4++;
}
}
+ printf(" # bad anodes = %d ",cal->GetDeadChannels());
if(cal->IsAMAt20MHz()) printf(" 20 MHz sampling");
else printf(" 40 MHz sampling");
- printf("\n");
+ printf(" Threshold L %d %d H %d %d\n",cal->GetZSLowThreshold(0),cal->GetZSLowThreshold(1),cal->GetZSHighThreshold(0),cal->GetZSHighThreshold(1));
if(i<84) badAnodeCounter3+=cal->GetDeadChannels();
else badAnodeCounter4+=cal->GetDeadChannels();
hnbadch->SetBinContent(i+1,cal->GetDeadChannels());
+ if(lay==3) hdeadlay3->SetBinContent(det,lad,cal->GetDeadChannels());
+ if(lay==4) hdeadlay4->SetBinContent(det,lad,cal->GetDeadChannels());
for(Int_t iAn=0; iAn<512; iAn++){
Int_t ic=cal->GetChip(iAn);
if(!cal->IsChipBad(ic) && !cal->IsBad() && cal->IsBadChannel(iAn)){
if(cal->IsBadChannel(iAn)) hchstatus->Fill(0);
if(!cal->IsBadChannel(iAn) && !cal->IsChipBad(ic) && !cal->IsBad() ){
hbase->Fill(base);
+ hbasemod->Fill(i+240,base);
hchstatus->Fill(1);
hnoise->Fill(noise);
+ hnoisemod->Fill(i+240,noise);
hgain->Fill(gain);
+ hgainmod->Fill(i+240,gain);
}
}
}
Int_t totbad3=badModCounter3*512+badChipCounter3*64+badAnodeCounterGoodModAndChip3;
Int_t tot3=6*14*512;
Float_t fracbad3=(Float_t)totbad3/(Float_t)tot3;
+ Float_t fracgm3=(Float_t)(84.-badModCounter3)/84.;
+ Float_t fracgm4=(Float_t)(176.-badModCounter4)/176.;
+ Float_t fracgh3=(Float_t)(84.*2.-badHybridCounter3)/84./2.;
+ Float_t fracgh4=(Float_t)(176.*2-badHybridCounter4)/176./2.;
+ Float_t fraccgm3=1.-(Float_t)(badAnodeCounterGoodModAndChip3+badChipCounter3*64)/(512.*(Float_t)(84.-badModCounter3));
+ Float_t fraccgm4=1.-(Float_t)(badAnodeCounterGoodModAndChip4+badChipCounter4*64)/(512.*(Float_t)(176.-badModCounter4));
+ Float_t fraccgh3=1.-(Float_t)badAnodeCounterGoodHybrid3/(256.*(84.*2.-badHybridCounter3));
+ Float_t fraccgh4=1.-(Float_t)badAnodeCounterGoodHybrid4/(256.*(176.*2.-badHybridCounter4));
Int_t totbad4=badModCounter4*512+badChipCounter4*64+badAnodeCounterGoodModAndChip4;
Int_t tot4=8*22*512;
Float_t fracbad4=(Float_t)totbad4/(Float_t)tot4;
printf("---- Layer 3 ----\n");
printf("# of bad modules = %d\n",badModCounter3);
printf("# of bad chips in good modules = %d\n",badChipCounter3);
- printf("# of bad anodes in good modules+chips = %d\n",badAnodeCounterGoodModAndChip3);
- printf("Fraction of bads (anodes+chips+mod) = %f\n",fracbad3);
+ printf("# of bad hybrids = %d\n",badHybridCounter3);
+ printf("# of bad anodes in good hybrids = %d\n",badAnodeCounterGoodHybrid3);
+ printf("Fraction of Good modules=%f\n",fracgm3);
+ printf("Fraction of Good hybrids=%f\n",fracgh3);
+ printf("Fraction of good anodes in good modules = %f\n",fraccgm3);
+ printf("Fraction of good anodes in good hybrids = %f\n",fraccgh3);
+ printf("Fraction of bads (anodes+chips+mod) = %f\n",fracbad3);
printf("---- Layer 4 ----\n");
printf("# of bad modules = %d\n",badModCounter4);
printf("# of bad chips in good modules = %d\n",badChipCounter4);
- printf("# of bad anodes in good modules+chips = %d\n",badAnodeCounterGoodModAndChip4);
- printf("Fraction of bads (anodes+chips+mod) = %f\n",fracbad4);
+ printf("# of bad hybrids = %d\n",badHybridCounter4);
+ printf("# of bad anodes in good hybrids = %d\n",badAnodeCounterGoodHybrid4);
+ printf("Fraction of Good modules=%f\n",fracgm4);
+ printf("Fraction of Good hybrids=%f\n",fracgh4);
+ printf("Fraction of good anodes in good modules = %f\n",fraccgm4);
+ printf("Fraction of good anodes in good hybrids = %f\n",fraccgh4);
+ printf("Fraction of bads (anodes+chips+mod) = %f\n",fracbad4);
printf("---- Total ----\n");
printf("# of bad modules = %d\n",badModCounter3+badModCounter4);
printf("# of bad chips in good modules = %d\n",badChipCounter3+badChipCounter4);
printf("---------------------------------------------------\n");
- TCanvas *c0=new TCanvas("c0","Module status",800,800);
- c0->Divide(1,2);
- c0->cd(1);
- hmodstatus->Draw();
- hmodstatus->GetXaxis()->SetTitle("Module number");
- hmodstatus->GetYaxis()->SetTitle("Module status (1=OK, 0=BAD)");
- c0->cd(2);
- hnbadch->Draw();
- hnbadch->GetXaxis()->SetTitle("Module number");
- hnbadch->GetYaxis()->SetTitle("Number of bad anodes");
-
- TCanvas *c1=new TCanvas("c1","Anode calibration",800,800);
- c1->Divide(2,2);
- c1->cd(1);
- hbase->Draw();
- hbase->GetXaxis()->SetTitle("Baseline after equalization");
- hbase->GetXaxis()->CenterTitle();
- c1->cd(2);
- hnoise->Draw();
- hnoise->GetXaxis()->SetTitle("Noise");
- hnoise->GetXaxis()->CenterTitle();
- c1->cd(3);
- hgain->Draw();
- hgain->GetXaxis()->SetTitle("Gain");
- hgain->GetXaxis()->CenterTitle();
- c1->cd(4);
- hchstatus->Draw();
- hchstatus->GetXaxis()->SetTitle("Anode status (0=bad, 1=OK)");
- hchstatus->GetXaxis()->CenterTitle();
- Int_t palette[3]={kGray,2,3};
- gStyle->SetPalette(3,palette);
-
TLine* lin=new TLine(0,0,0,23);
+ TExec *ex1 = new TExec("ex1","MakePalette();");
+ TExec *ex2 = new TExec("ex2","gStyle->SetPalette(1);");
+
TCanvas* clay=new TCanvas("clay","Layer status",900,600);
clay->Divide(2,1);
clay->cd(1);
hlay3->Draw("col");
+ ex1->Draw();
+ hlay3->DrawCopy("col same");
for(Int_t i=0;i<6;i++){
lin->SetY1(-0.5);
lin->SetY2(13.5);
lin->DrawClone();
}
clay->cd(2);
- hlay4->Draw("col");
+ hlay4->DrawCopy("col");
for(Int_t i=0;i<8;i++){
lin->SetY1(-0.5);
lin->SetY2(21.5);
+ TCanvas *c0b=new TCanvas("c0b","Bad Channels",900,600);
+ c0b->Divide(2,1);
+ c0b->cd(1);
+ hdeadlay3->DrawCopy("colz");
+ ex2->Draw();
+ hdeadlay3->DrawCopy("colz same");
+ for(Int_t i=0;i<6;i++){
+ lin->SetY1(-0.5);
+ lin->SetY2(13.5);
+ lin->SetX1(i+0.5);
+ lin->SetX2(i+0.5);
+ lin->DrawClone();
+ }
+ for(Int_t i=0;i<14;i++){
+ lin->SetX1(-0.5);
+ lin->SetX2(5.5);
+ lin->SetY1(i+0.5);
+ lin->SetY2(i+0.5);
+ lin->DrawClone();
+ }
+ c0b->cd(2);
+ hdeadlay4->DrawCopy("colz");
+ ex2->Draw();
+ hdeadlay4->DrawCopy("colz same");
+ for(Int_t i=0;i<8;i++){
+ lin->SetY1(-0.5);
+ lin->SetY2(21.5);
+ lin->SetX1(i+0.5);
+ lin->SetX2(i+0.5);
+ lin->DrawClone();
+ }
+ for(Int_t i=0;i<22;i++){
+ lin->SetX1(-0.5);
+ lin->SetX2(7.5);
+ lin->SetY1(i+0.5);
+ lin->SetY2(i+0.5);
+ lin->DrawClone();
+ }
+
+
+
+ TCanvas *c1=new TCanvas("c1","Anode calibration",800,800);
+ c1->Divide(2,2);
+ c1->cd(1);
+ hbase->Draw();
+ hbase->GetXaxis()->SetTitle("Baseline after equalization");
+ hbase->GetXaxis()->CenterTitle();
+ c1->cd(2);
+ hnoise->Draw();
+ hnoise->GetXaxis()->SetTitle("Noise");
+ hnoise->GetXaxis()->CenterTitle();
+ c1->cd(3);
+ hgain->Draw();
+ hgain->GetXaxis()->SetTitle("Gain");
+ hgain->GetXaxis()->CenterTitle();
+ c1->cd(4);
+ hchstatus->Draw();
+ hchstatus->GetXaxis()->SetTitle("Anode status (0=bad, 1=OK)");
+ hchstatus->GetXaxis()->CenterTitle();
+
+ TCanvas *c1m=new TCanvas("c1m","Calib. vs. mod",1000,800);
+ c1m->Divide(2,2);
+ c1m->cd(1);
+ gPad->SetRightMargin(0.14);
+ hbasemod->SetStats(0);
+ hbasemod->Draw("colz");
+ hbasemod->GetXaxis()->SetTitle("Module Number");
+ hbasemod->GetYaxis()->SetTitle("Baseline");
+ c1m->cd(2);
+ gPad->SetRightMargin(0.14);
+ hnoisemod->SetStats(0);
+ hnoisemod->Draw("colz");
+ hnoisemod->GetXaxis()->SetTitle("Module Number");
+ hnoisemod->GetYaxis()->SetTitle("Noise");
+ c1m->cd(3);
+ gPad->SetRightMargin(0.14);
+ hgainmod->SetStats(0);
+ hgainmod->Draw("colz");
+ hgainmod->GetXaxis()->SetTitle("Module Number");
+ hgainmod->GetYaxis()->SetTitle("Gain");
+ c1m->cd(4);
+ hnbadch->Scale(1/512.);
+ hnbadch->SetMarkerStyle(20);
+ hnbadch->SetMarkerSize(0.8);
+ hnbadch->SetStats(0);
+ hnbadch->Draw("P");
+ hnbadch->GetXaxis()->SetTitle("Module number");
+ hnbadch->GetYaxis()->SetTitle("Fraction of bad anodes");
+
+
+
+
+
+
+
+
// Plot quantities for specified module
cal=(AliITSCalibrationSDD*)calSDD->At(iMod);
gbad->GetYaxis()->SetTitle("Anode Status (1=OK, 0=bad)");
}
-void ShowCalibrationSDD(Int_t nrun, Int_t nv, Int_t year=2009, Int_t nmod=0){
+void ShowCalibrationSDD(Int_t nrun, Int_t year=2010, Int_t nmod=0){
TGrid::Connect("alien:",0,0,"t");
- Char_t filnam[200];
- sprintf(filnam,"alien:///alice/data/%d/OCDB/ITS/Calib/CalibSDD/Run%d_999999999_v%d_s0.root",year,nrun,nv);
- printf("Open file: %s\n",filnam);
- ShowCalibrationSDD(nmod,filnam);
+ TString cmd=Form("gbbox find \"/alice/data/%d/OCDB/ITS/Calib/CalibSDD\" \"Run%d*.root\" > run.txt",year,nrun);
+ gSystem->Exec(cmd.Data());
+ Char_t filnam[200],filnamalien[200];
+ FILE* runtxt=fopen("run.txt","r");
+ fscanf(runtxt,"%s\n",filnam);
+ if(!strstr(filnam,"/alice/data/")){
+ printf("Bad run number\n");
+ gSystem->Exec("rm run.txt");
+ return;
+ }
+ sprintf(filnamalien,"alien://%s",filnam);
+
+ printf("Open file: %s\n",filnamalien);
+ ShowCalibrationSDD(filnamalien,nmod);
+ fclose(runtxt);
+ gSystem->Exec("rm run.txt");
}