]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/macrosSDD/TrendQAtrainSDD.C
bugfix in filling of NJ and OC histos
[u/mrichter/AliRoot.git] / ITS / macrosSDD / TrendQAtrainSDD.C
index 0f99a50ffba3acfed995b51458f31905d7eee619..730a606b71980be9614c143fbd65ea711cc2db2d 100644 (file)
@@ -26,8 +26,9 @@ void MakePlots(TString ntupleFileName);
 
 void TrendQAtrainSDD(TString period,
                     TString recoPass,
-                    TString qaTrain1,
-                    TString qaTrain2,
+                    TString qaTrain="QA",
+                    Bool_t useOnlyMerged=kFALSE,
+                    TString runListFile="",
                     Int_t firstRun=0,
                     Int_t lastRun=999999999,
                     TString fileName="QAresults.root"){
@@ -41,45 +42,70 @@ void TrendQAtrainSDD(TString period,
   else if(period.Contains("LHC10")) year=2010;
   else if(period.Contains("LHC11")) year=2011;
 
-  TString outFilNam=Form("TrendingSDD_%s_%s_%s.root",period.Data(),recoPass.Data(),qaTrain1.Data());
+  Bool_t useExternalList=kFALSE;
+  Int_t runList[10000];
+  Int_t totRuns=0;
+  if(runListFile.Length()>0){
+    if(!gSystem->Exec(Form("ls -l %s > /dev/null 2>&1",runListFile.Data()))){
+      printf("Use Run List from %s  --- runs to be analyzed:\n",runListFile.Data());
+      useExternalList=kTRUE;
+      FILE* rfil=fopen(runListFile.Data(),"r");
+      Int_t nrun;
+      while(!feof(rfil)){
+       fscanf(rfil,"%d, ",&nrun);
+       if(feof(rfil)) break;
+       runList[totRuns++]=nrun;
+      }
+      for(Int_t ir=0; ir<totRuns; ir++){
+       printf("%d\n",runList[ir]);
+      }
+    }else{
+      printf("File with run list does not exist\n");
+    }
+  }
+
+  TString outFilNam=Form("TrendingSDD_%s_%s_%s.root",period.Data(),recoPass.Data(),qaTrain.Data());
 
 
-  const Int_t nVariables=27;
-  TNtuple* ntsdd=new TNtuple("ntsdd","SDD trending","nrun:fracTrackWithClu1:errfracTrackWithClu1:fracTrackWithClu2:errfracTrackWithClu2:fracTrackWithClu3:errfracTrackWithClu3:fracTrackWithClu4:errfracTrackWithClu4:fracTrackWithClu5:errfracTrackWithClu5:fracTrackWithClu6:errfracTrackWithClu6:meanTrPts3:errmeanTrPts3:meanTrPts4:errmeanTrPts4:minDrTime:errminDrTime:meanDrTime:errmeanDrTime:fracExtra:errfracExtra:meandEdxTB0:errmeandEdxTB0:meandEdxTB5:errmeandEdxTB5");
+
+  const Int_t nVariables=35;
+  TNtuple* ntsdd=new TNtuple("ntsdd","SDD trending","nrun:fracTrackWithClu1:errfracTrackWithClu1:fracTrackWithClu2:errfracTrackWithClu2:fracTrackWithClu3:errfracTrackWithClu3:fracTrackWithClu4:errfracTrackWithClu4:fracTrackWithClu5:errfracTrackWithClu5:fracTrackWithClu6:errfracTrackWithClu6:meanTrPts3:errmeanTrPts3:meanTrPts4:errmeanTrPts4:minDrTime:errminDrTime:meanDrTime:errmeanDrTime:fracExtra:errfracExtra:meandEdxLay3:errmeandEdxLay3:meandEdxLay4:errmeandEdxLay4:meandEdxTB0:errmeandEdxTB0:meandEdxTB5:errmeandEdxTB5:nMod95:nMod80:nMod60:nModEmpty");
   Float_t xnt[nVariables];
 
   TBits* readRun=new TBits(999999);
   readRun->ResetAllBits();
-  if(!gSystem->Exec(Form("ls -l %s > /dev/null 2>&1",outFilNam.Data()))){
-    TFile* oldfil=new TFile(outFilNam.Data());
-    TNtuple* ntmp=(TNtuple*)oldfil->Get("ntsdd");
-    Bool_t isOK=kFALSE;
-    if(ntmp){
-      if(ntmp->GetNvar()==ntsdd->GetNvar()){
-       isOK=kTRUE;
-       TObjArray* arr1=(TObjArray*)ntsdd->GetListOfBranches();
-       TObjArray* arr2=(TObjArray*)ntmp->GetListOfBranches();
-       for(Int_t iV=0; iV<ntmp->GetNvar(); iV++){
-         TString vnam1=arr1->At(iV)->GetName();
-         TString vnam2=arr2->At(iV)->GetName();
-         if(vnam1!=vnam2) isOK=kFALSE;
-         ntmp->SetBranchAddress(vnam2.Data(),&xnt[iV]);
-       }
-       if(isOK){
-         for(Int_t nE=0; nE<ntmp->GetEntries(); nE++){
-           ntmp->GetEvent(nE);
-           Int_t theRun=(Int_t)(xnt[0]+0.0001);
-           readRun->SetBitNumber(theRun);
-           ntsdd->Fill(xnt);
+  if(!useExternalList){
+    if(!gSystem->Exec(Form("ls -l %s > /dev/null 2>&1",outFilNam.Data()))){
+      TFile* oldfil=new TFile(outFilNam.Data());
+      TNtuple* ntmp=(TNtuple*)oldfil->Get("ntsdd");
+      Bool_t isOK=kFALSE;
+      if(ntmp){
+       if(ntmp->GetNvar()==ntsdd->GetNvar()){
+         isOK=kTRUE;
+         TObjArray* arr1=(TObjArray*)ntsdd->GetListOfBranches();
+         TObjArray* arr2=(TObjArray*)ntmp->GetListOfBranches();
+         for(Int_t iV=0; iV<ntmp->GetNvar(); iV++){
+           TString vnam1=arr1->At(iV)->GetName();
+           TString vnam2=arr2->At(iV)->GetName();
+           if(vnam1!=vnam2) isOK=kFALSE;
+           ntmp->SetBranchAddress(vnam2.Data(),&xnt[iV]);
+         }
+         if(isOK){
+           for(Int_t nE=0; nE<ntmp->GetEntries(); nE++){
+             ntmp->GetEvent(nE);
+             Int_t theRun=(Int_t)(xnt[0]+0.0001);
+             readRun->SetBitNumber(theRun);
+             ntsdd->Fill(xnt);
+           }
          }
        }
       }
+      if(!isOK){
+       printf("Ntuple in local file not OK -> will be recreated\n");
+      }
+      oldfil->Close();
+      delete oldfil;
     }
-    if(!isOK){
-      printf("Ntuple in local file not OK -> will be recreated\n");
-    }
-    oldfil->Close();
-    delete oldfil;
   }
 
   if(!gGrid||!gGrid->IsConnected()) {
@@ -87,32 +113,49 @@ void TrendQAtrainSDD(TString period,
     return;
   }
 
-  TString  path=Form("/alice/data/%d/%s/",year,period.Data(),recoPass.Data());
+  TString  path=Form("/alice/data/%d/%s/",year,period.Data());
   TGridResult *gr = gGrid->Query(path,fileName);
   Int_t nFiles = gr->GetEntries();
   printf("================>%d files found\n", nFiles);
   if (nFiles < 1) return;
 
-
+  Int_t nAnalyzedFiles=0;
   if (nFiles > 1){
     for (Int_t iFil = 0; iFil <nFiles ; iFil++) { 
       TString fileNameLong=Form("%s",gr->GetKey(iFil,"turl"));
       if(!fileNameLong.Contains(recoPass.Data())) continue;
-      if(!fileNameLong.Contains(qaTrain1.Data()) &&
-        !fileNameLong.Contains(qaTrain2.Data())) continue;
-      if(!fileNameLong.Contains(Form("%s/%s",qaTrain1.Data(),fileName.Data())) &&
-        !fileNameLong.Contains(Form("%s/%s",qaTrain2.Data(),fileName.Data()))) continue;
+      if(!fileNameLong.Contains(qaTrain.Data())) continue;
       TString runNumber=fileNameLong;
       runNumber.ReplaceAll(Form("alien:///alice/data/%d/%s/",year,period.Data()),"");
       runNumber.Remove(9,runNumber.Sizeof());
    
       Int_t iRun=atoi(runNumber.Data());
+      if(useExternalList){
+       Bool_t keepRun=kFALSE;
+       for(Int_t ir=0; ir<totRuns; ir++){
+         if(iRun==runList[ir]){
+           keepRun=kTRUE;
+           break;
+         }
+       }
+       if(!keepRun) continue;
+      }
       if(readRun->TestBitNumber(iRun)){ 
        printf("Run %d aleady in local ntuple -> skipping it\n",iRun);
        continue;
       }
       if(iRun<firstRun) continue;
-      if(iRun>lastRun) continue;
+      if(iRun>lastRun) continue;    
+
+      if(useOnlyMerged){
+       TString isMerged=fileNameLong;
+       isMerged.Remove(isMerged.Sizeof()-16); 
+       isMerged.Remove(0,isMerged.Sizeof()-5);
+       if(!isMerged.Contains("QA")) continue;
+      }
+      printf("Open File %s  Run %d\n",fileNameLong.Data(),iRun);
+      
+
 
       TFile* f=TFile::Open(fileNameLong.Data());  
 
@@ -126,6 +169,10 @@ void TrendQAtrainSDD(TString period,
        printf("Run %d coutputRP TList MISSING -> Exit\n",iRun);
        continue;
       }  
+
+      nAnalyzedFiles++;
+      if(!useOnlyMerged) readRun->SetBitNumber(iRun);
+
       TH1F* hcllay=(TH1F*)l->FindObject("hCluInLay");
       Float_t fracT[6]={0.,0.,0.,0.,0.,0.};
       Float_t efracT[6]={0.,0.,0.,0.,0.,0.};
@@ -156,7 +203,7 @@ void TrendQAtrainSDD(TString period,
       if(nTrigEvents>0){ 
        nEvents=nTrigEvents;
       }
-
+      if(nTotEvents==0) continue;
       Int_t nModGood3=0;
       Int_t nModGood4=0;
       Int_t nModBadAn=0;
@@ -186,6 +233,31 @@ void TrendQAtrainSDD(TString period,
        }
       }
 
+      TH1F* hapmod=(TH1F*)l->FindObject("hAllPmod");
+      TH1F* hgpmod=(TH1F*)l->FindObject("hGoodPmod");
+      //     TH1F* hmpmod=(TH1F*)l->FindObject("hMissPmod");
+      TH1F* hbrmod=(TH1F*)l->FindObject("hBadRegmod");
+      TH1F* hskmod=(TH1F*)l->FindObject("hSkippedmod");
+      TH1F* hoamod=(TH1F*)l->FindObject("hOutAccmod");
+      TH1F* hnrmod=(TH1F*)l->FindObject("hNoRefitmod");
+      Int_t nBelow95=0;
+      Int_t nBelow80=0;
+      Int_t nBelow60=0;
+      Int_t nZeroP=0;
+      for(Int_t imod=0; imod<260;imod++){
+       Float_t numer=hgpmod->GetBinContent(imod+1)+hbrmod->GetBinContent(imod+1)+hoamod->GetBinContent(imod+1)+hnrmod->GetBinContent(imod+1)+hskmod->GetBinContent(imod+1);
+       Float_t denom=hapmod->GetBinContent(imod+1);
+       if(denom>0){
+         Float_t eff=numer/denom;
+         if(eff<0.95) nBelow95++;
+         if(eff<0.80) nBelow80++;
+         if(eff<0.60) nBelow60++;
+       }
+       if(hmodT->GetBinContent(imod+1)<1.){
+         nZeroP++;
+       }       
+      }
+
       TH1F* htimT=(TH1F*)l->FindObject("hDrTimTPAll");
       TH1F* htimTe=(TH1F*)l->FindObject("hDrTimTPExtra");
       
@@ -216,6 +288,10 @@ void TrendQAtrainSDD(TString period,
          }
        }
       }
+      TH2F* hdedxmod=(TH2F*)l->FindObject("hdEdxVsMod");
+      TH1D* hdedxLay3=hdedxmod->ProjectionY("hdedxLay3",1,84);
+      TH1D* hdedxLay4=hdedxmod->ProjectionY("hdedxLay4",85,260);
+      
       TH1F* hSigTim0=(TH1F*)l->FindObject("hSigTimeInt0");
       TH1F* hSigTim5=(TH1F*)l->FindObject("hSigTimeInt5");
 
@@ -243,22 +319,31 @@ void TrendQAtrainSDD(TString period,
       xnt[index++]=htimT->GetMeanError();
       xnt[index++]=fracExtra;
       xnt[index++]=errFracExtra;
+      xnt[index++]=hdedxLay3->GetMean();
+      xnt[index++]=hdedxLay3->GetMeanError();
+      xnt[index++]=hdedxLay4->GetMean();
+      xnt[index++]=hdedxLay4->GetMeanError();
       xnt[index++]=hSigTim0->GetMean();
       xnt[index++]=hSigTim0->GetMeanError();
       xnt[index++]=hSigTim5->GetMean();
       xnt[index++]=hSigTim5->GetMeanError();
-      
+      xnt[index++]=(Float_t)nBelow95;
+      xnt[index++]=(Float_t)nBelow80;
+      xnt[index++]=(Float_t)nBelow60;
+      xnt[index++]=(Float_t)nZeroP;
       ntsdd->Fill(xnt);
     }
   }
-
-  TFile* outfil=new TFile(outFilNam.Data(),"recreate");
-  outfil->cd();
-  ntsdd->Write();
-  outfil->Close();
-
-  MakePlots(outFilNam);
-
+  printf("Number of analyzed files = %d\n",nAnalyzedFiles);
+
+  if(nAnalyzedFiles>0){
+    TFile* outfil=new TFile(outFilNam.Data(),"recreate");
+    outfil->cd();
+    ntsdd->Write();
+    outfil->Close();
+    
+    MakePlots(outFilNam);
+  }
 }
 
 void MakePlots(TString ntupleFileName){
@@ -276,8 +361,10 @@ void MakePlots(TString ntupleFileName){
   Float_t fracTrackWithClu3,fracTrackWithClu4,errfracTrackWithClu3,errfracTrackWithClu4;
   Float_t fracTrackWithClu5,fracTrackWithClu6,errfracTrackWithClu5,errfracTrackWithClu6;
   Float_t fracExtra,errfracExtra;
+  Float_t meandEdxLay3,errmeandEdxLay3,meandEdxLay4,errmeandEdxLay4;
   Float_t meandEdxTB0,errmeandEdxTB0,meandEdxTB5,errmeandEdxTB5;
-
+  Float_t nMod95,nMod80,nMod60,nModEmpty;
+  
   ntsdd->SetBranchAddress("nrun",&nrun);
   ntsdd->SetBranchAddress("fracTrackWithClu1",&fracTrackWithClu1);
   ntsdd->SetBranchAddress("errfracTrackWithClu1",&errfracTrackWithClu1);
@@ -291,6 +378,10 @@ void MakePlots(TString ntupleFileName){
   ntsdd->SetBranchAddress("errfracTrackWithClu5",&errfracTrackWithClu5);
   ntsdd->SetBranchAddress("fracTrackWithClu6",&fracTrackWithClu6);
   ntsdd->SetBranchAddress("errfracTrackWithClu6",&errfracTrackWithClu6);
+  ntsdd->SetBranchAddress("nMod95",&nMod95);
+  ntsdd->SetBranchAddress("nMod80",&nMod80);
+  ntsdd->SetBranchAddress("nMod60",&nMod60);
+  ntsdd->SetBranchAddress("nModEmpty",&nModEmpty);
 
   ntsdd->SetBranchAddress("meanTrPts3",&meanTrPts3);
   ntsdd->SetBranchAddress("errmeanTrPts3",&errmeanTrPts3);
@@ -306,6 +397,10 @@ void MakePlots(TString ntupleFileName){
   ntsdd->SetBranchAddress("errmeandEdxTB0",&errmeandEdxTB0);
   ntsdd->SetBranchAddress("meandEdxTB5",&meandEdxTB5);
   ntsdd->SetBranchAddress("errmeandEdxTB5",&errmeandEdxTB5);
+  ntsdd->SetBranchAddress("meandEdxLay3",&meandEdxLay3);
+  ntsdd->SetBranchAddress("errmeandEdxLay3",&errmeandEdxLay3);
+  ntsdd->SetBranchAddress("meandEdxLay4",&meandEdxLay4);
+  ntsdd->SetBranchAddress("errmeandEdxLay4",&errmeandEdxLay4);
 
   TH1F* histotrp3=new TH1F("histotrp3","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
   TH1F* histotrp4=new TH1F("histotrp4","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
@@ -314,6 +409,8 @@ void MakePlots(TString ntupleFileName){
   TH1F* histofracExtra=new TH1F("histofracExtra","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
   TH1F* histodEdxTB0=new TH1F("histodEdxTB0","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
   TH1F* histodEdxTB5=new TH1F("histodEdxTB5","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
+  TH1F* histodEdxLay3=new TH1F("histodEdxLay3","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
+  TH1F* histodEdxLay4=new TH1F("histodEdxLay4","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
   TH1F* histoTrackClu1=new TH1F("histoTrackClu1","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
   TH1F* histoTrackClu2=new TH1F("histoTrackClu2","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
   TH1F* histoTrackClu3=new TH1F("histoTrackClu3","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
@@ -321,6 +418,10 @@ void MakePlots(TString ntupleFileName){
   TH1F* histoTrackClu5=new TH1F("histoTrackClu5","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
   TH1F* histoTrackClu6=new TH1F("histoTrackClu6","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
 
+  TH1F* histoNmodEffBelow95=new TH1F("histoNmodEffBelow95","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
+  TH1F* histoNmodEffBelow80=new TH1F("histoNmodEffBelow80","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
+  TH1F* histoNmodEffBelow60=new TH1F("histoNmodEffBelow60","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
+  TH1F* histoNmodEmpty=new TH1F("histoNmodEmpty","",(Int_t)ntsdd->GetEntries(),0.,ntsdd->GetEntries());
 
   for(Int_t i=0; i<ntsdd->GetEntries();i++){
     ntsdd->GetEvent(i);
@@ -363,6 +464,25 @@ void MakePlots(TString ntupleFileName){
     histodEdxTB5->SetBinContent(i+1,meandEdxTB5);
     histodEdxTB5->SetBinError(i+1,errmeandEdxTB5);
     histodEdxTB5->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
+    histodEdxLay3->SetBinContent(i+1,meandEdxLay3);
+    histodEdxLay3->SetBinError(i+1,errmeandEdxLay3);
+    histodEdxLay3->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
+    histodEdxLay4->SetBinContent(i+1,meandEdxLay4);
+    histodEdxLay4->SetBinError(i+1,errmeandEdxLay4);
+    histodEdxLay4->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
+
+    histoNmodEffBelow95->SetBinContent(i+1,nMod95);
+    histoNmodEffBelow95->SetBinError(i+1,0.0000001);
+    histoNmodEffBelow95->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
+    histoNmodEffBelow80->SetBinContent(i+1,nMod80);
+    histoNmodEffBelow80->SetBinError(i+1,0.0000001);
+    histoNmodEffBelow80->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
+    histoNmodEffBelow60->SetBinContent(i+1,nMod60);
+    histoNmodEffBelow60->SetBinError(i+1,0.0000001);
+    histoNmodEffBelow60->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
+    histoNmodEmpty->SetBinContent(i+1,nModEmpty);
+    histoNmodEmpty->SetBinError(i+1,0.000001);
+    histoNmodEmpty->GetXaxis()->SetBinLabel(i+1,Form("%d",(Int_t)nrun));
   }
 
   gStyle->SetOptStat(0);
@@ -422,6 +542,24 @@ void MakePlots(TString ntupleFileName){
   leg2->Draw();
   c4->Update();
 
+  TCanvas* c4b=new TCanvas("c4b","Charge per Layer");
+  histodEdxLay3->SetLineColor(1);
+  histodEdxLay3->SetMarkerStyle(20);
+  histodEdxLay3->Draw();
+  histodEdxLay3->SetMinimum(0.);
+  histodEdxLay4->SetLineColor(4);
+  histodEdxLay4->SetMarkerColor(4);
+  histodEdxLay4->SetMarkerStyle(23);
+  histodEdxLay4->Draw("same");
+  histodEdxLay3->GetYaxis()->SetTitle("<dE/dx> (keV/300 #mum)");
+  TLegend* leg2b=new TLegend(0.6,0.15,0.88,0.35);
+  ent=leg2b->AddEntry(histodEdxLay3,"Layer 3","PL");
+  ent=leg2b->AddEntry(histodEdxLay4,"Layer 4","PL");
+  ent->SetTextColor(histodEdxLay4->GetMarkerColor());
+  leg2b->SetFillStyle(0);
+  leg2b->Draw();
+  c4b->Update();
+
   TCanvas* c5=new TCanvas("c5","TrackWithSDD");
   histoTrackClu3->Draw();
   histoTrackClu3->SetLineColor(1);
@@ -467,6 +605,38 @@ void MakePlots(TString ntupleFileName){
   leg3->Draw();
   c5->Update();
 
+  TCanvas* c6=new TCanvas("c6","Modules with low eff",800,1000);
+  c6->Divide(1,4);
+  c6->cd(1);
+  histoNmodEffBelow95->SetMinimum(histoNmodEffBelow95->GetMinimum()-2);
+  histoNmodEffBelow95->SetMaximum(histoNmodEffBelow95->GetMaximum()+2);
+  histoNmodEffBelow95->Draw("E");
+  histoNmodEffBelow95->GetYaxis()->SetTitle("N. modules with eff<0.95");
+  histoNmodEffBelow95->GetYaxis()->SetTitleSize(0.075);
+  histoNmodEffBelow95->GetYaxis()->SetTitleOffset(0.5);
+  c6->cd(2);
+  histoNmodEffBelow80->SetMinimum(histoNmodEffBelow80->GetMinimum()-2);
+  histoNmodEffBelow80->SetMaximum(histoNmodEffBelow80->GetMaximum()+2);
+  histoNmodEffBelow80->Draw("E");
+  histoNmodEffBelow80->GetYaxis()->SetTitle("N. modules with eff<0.80");
+  histoNmodEffBelow80->GetYaxis()->SetTitleSize(0.075);
+  histoNmodEffBelow80->GetYaxis()->SetTitleOffset(0.5);
+  c6->cd(3);
+  histoNmodEffBelow60->SetMinimum(histoNmodEffBelow60->GetMinimum()-2);
+  histoNmodEffBelow60->SetMaximum(histoNmodEffBelow60->GetMaximum()+2);
+  histoNmodEffBelow60->Draw("E");
+  histoNmodEffBelow60->GetYaxis()->SetTitle("N. modules with eff<0.60");
+  histoNmodEffBelow60->GetYaxis()->SetTitleSize(0.075);
+  histoNmodEffBelow60->GetYaxis()->SetTitleOffset(0.5);
+  c6->cd(4);
+  histoNmodEmpty->SetMinimum(histoNmodEmpty->GetMinimum()-2);
+  histoNmodEmpty->SetMaximum(histoNmodEmpty->GetMaximum()+2);
+  histoNmodEmpty->Draw("E");
+  histoNmodEmpty->GetYaxis()->SetTitle("N. modules with no points");
+  histoNmodEmpty->GetYaxis()->SetTitleSize(0.075);
+  histoNmodEmpty->GetYaxis()->SetTitleOffset(0.5);
+
+
 }
 
 Double_t LangausFun(Double_t *x, Double_t *par) {