]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONGain.cxx
In DAs:
[u/mrichter/AliRoot.git] / MUON / AliMUONGain.cxx
index 998f0ae850f37c549cce681d6eaf78a36485fe1f..0db771274bb97d8dfdd7ec87928dc54b17aeeede 100644 (file)
@@ -34,6 +34,7 @@
 #include <Riostream.h>
 
 #include <sstream>
+#include <cstdio>
 
 #define  NFITPARAMS 4
 
@@ -165,7 +166,7 @@ void AliMUONGain::MakePedStoreForGain(TString shuttleFile)
       // compute and store mean DAC values (like pedestals)
       flatFile = Form("%s.ped",fPrefixDA.Data());
       outputFile=flatFile;
-      cout << "\n" << fPrefixDA.Data() << " : Flat file  generated  : " << flatFile.Data() << "\n";
+      cout << "\n" << fPrefixLDC.Data() << " : Flat file  generated  : " << flatFile.Data() << "\n";
       if (!outputFile.IsNull())  
       {
         ofstream out(outputFile.Data());
@@ -259,17 +260,19 @@ TString AliMUONGain::WriteGainData(Int_t BP, Int_t Manu, Int_t ch, Double_t p1,
 //_______________________________________________________________________________
 void AliMUONGain::MakeGainStore(TString shuttleFile)
 {
+  Int_t status=0;
   /// Store gains in ASCII files
   ofstream fileout;
   ofstream filcouc;
   TString tempstring;  
   TString filename; 
+  char* detail;
 
   Double_t goodA1Min =  0.5;
   Double_t goodA1Max =  2.;
 //   Double_t goodA2Min = -0.5E-03;
 //   Double_t goodA2Max =  1.E-03;
-  Double_t goodA2Min = -0.5E-01; // changed 28/10/2009 (JLC) <=> no condition on a2
+  Double_t goodA2Min = -0.5E-01; // changed 28/10/2009 (JLC) <=> enlarged condition on a2
   Double_t goodA2Max =  1.E-01;
   // Table for uncalibrated  buspatches and manus
   THashList* uncalBuspatchManuTable = new THashList(1000,2);
@@ -316,27 +319,23 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
   Double_t injChargeErr[11];
   for ( Int_t i=0 ; i<11 ; i++) {injCharge[i]=0.;injChargeErr[i]=1.;};
 
-  // some print
-  cout<<"\n ********  MUONTRKGAINda for Gain computing (Last Run = " << fRunNumber << ") ********\n" << endl;
-  cout<<" * Date          : " << fDate->AsString("l") << "\n" << endl;
-  cout << " Entries = " << nEntries << " DAC values \n" << endl; 
-  for (Int_t i = 0; i < nEntries; ++i) {
-    cout<< " Run = " << run[i]->GetFirst() << "    DAC = " << run[i]->GetSecond() << endl;
-    numrun[i] = run[i]->GetFirst();
-    injCharge[i] = run[i]->GetSecond();
-    injChargeErr[i] = 0.01*injCharge[i];
-    if(injChargeErr[i] <= 1.) injChargeErr[i]=1.;
-  }
-  cout << "" << endl;
-
   //  print out in .log file
-
+  detail=Form("\n%s : ------  MUONTRKGAINda for Gain computing (Last Run = %d) ------\n",fPrefixLDC.Data(),fRunNumber); printf("%s",detail);
   (*fFilcout)<<"\n\n//=================================================" << endl;
   (*fFilcout)<<"//    MUONTRKGAINda: Gain Computing  Run = " << fRunNumber << endl;
   (*fFilcout)<<"//    RootDataFile  = "<< fRootDataFileName.Data() << endl;
   (*fFilcout)<<"//=================================================" << endl;
   (*fFilcout)<<"//* Date          : " << fDate->AsString("l") << "\n" << endl;
 
+  (*fFilcout) << " Entries = " << nEntries << " DAC values \n" << endl; 
+  for (Int_t i = 0; i < nEntries; ++i) {
+    (*fFilcout) << " Run = " << run[i]->GetFirst() << "    DAC = " << run[i]->GetSecond() << endl;
+    numrun[i] = run[i]->GetFirst();
+    injCharge[i] = run[i]->GetSecond();
+    injChargeErr[i] = 0.01*injCharge[i];
+    if(injChargeErr[i] <= 1.) injChargeErr[i]=1.;
+  }
+  detail=Form("%s : .... Fitting .... \n",fPrefixLDC.Data()); printf("%s",detail);
 
 
   // why 2 files ? (Ch. F.)  => second file contains detailed results
@@ -344,7 +343,8 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
     if(fPrintLevel>1)
       {
         filename=Form("%s.param",fPrefixDA.Data());
-        cout << " Second fit parameter file        = " << filename.Data() << "\n";
+       detail=Form("%s : Second fit parameter file        = %s\n",fPrefixLDC.Data(),filename.Data()); printf("%s",detail);
+       //       cout << " Second fit parameter file        = " << filename.Data() << "\n";
         pfilen = fopen (filename.Data(),"w");
 
         fprintf(pfilen,"//===================================================================\n");
@@ -367,7 +367,8 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
   if(fPrintLevel>1)
     {
       filename=Form("%s.peak",fPrefixDA.Data());
-      cout << " File containing Peak mean values = " << filename << "\n";
+      detail=Form("%s : File containing Peak mean values = %s\n",fPrefixLDC.Data(),filename.Data()); printf("%s",detail);
+      //      cout << " File containing Peak mean values = " << filename << "\n";
       pfilep = fopen (filename,"w");
 
       fprintf(pfilep,"//==============================================================================================================================\n");
@@ -397,12 +398,11 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
 
   //  plot out 
 
-  TFile* gainFile = 0x0;
   TTree* tg = 0x0;
   if(fPlotLevel>0)
     {
       fHistoFileName=Form("%s.root",fPrefixDA.Data());
-      gainFile = new TFile(fHistoFileName.Data(),"RECREATE","MUON Tracking gains");
+      new TFile(fHistoFileName.Data(),"RECREATE","MUON Tracking gains");
       tg = new TTree("tg","TTree avec class Manu_DiMu");
 
       tg->Branch("bp",&busPatchId, "busPatchId/I");
@@ -482,9 +482,7 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
              fprintf(pfilep,"                   sig= %9.3f%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f \n",pedSigma[0],pedSigma[1],pedSigma[2],pedSigma[3],pedSigma[4],pedSigma[5],pedSigma[6],pedSigma[7],pedSigma[8],pedSigma[9],pedSigma[10]);
            }
 
-         // makegain 
-
-
+         // makegain
          // Fit Method:  Linear fit over gAlinbpf1 points + parabolic fit  over nbpf2  points) 
          // nInit=1 : 1st pt DAC=0 excluded
 
@@ -496,15 +494,17 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
 
          Int_t fitproceed=1;
          Int_t nbpf2Dynamic=nbpf2;
+         Int_t adcLimit=4090; // when RMS < 0.5 (in other cases mean values forced to 4095, see DA_PED)
          for (Int_t j = 0; j < nbs; ++j)
            {
              Int_t k = j + fnInit;
              x[j]    = pedMean[k];
              if(x[j]<=0.){fitproceed=0; break;}
-             if(x[j]>= ADCMax())
+             //              if(x[j]>= ADCMax())
+             if(x[j]>= adcLimit)
                {
                  if(j < nbs-1){fitproceed=0; break;}
-                 else  nbpf2Dynamic=nbpf2-1;
+                 else { nbpf2Dynamic=nbpf2-1; break;}
                }
              xErr[j] = pedSigma[k];
              y[j]    = injCharge[k];
@@ -623,7 +623,7 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
              char bpmanuname[256];
              AliMUONErrorCounter* uncalcounter;
 
-             sprintf(bpmanuname,"bp%dmanu%d",busPatchId,manuId);
+             snprintf(bpmanuname,256,"bp%dmanu%d",busPatchId,manuId);
              if (!(uncalcounter = (AliMUONErrorCounter*)uncalBuspatchManuTable->FindObject(bpmanuname)))
                {
                  // New buspatch_manu name
@@ -657,14 +657,14 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
 
                      graphErr = new TGraphErrors(nEntries,pedMean,injCharge,pedSigma,injChargeErr);
 
-                     sprintf(graphName,"BusPatch_%d_Manu_%d_Ch_%d",busPatchId, manuId,channelId);
+                     snprintf(graphName,256,"BusPatch_%d_Manu_%d_Ch_%d",busPatchId, manuId,channelId);
 
                      graphErr->SetTitle(graphName);
                      graphErr->SetMarkerColor(3);
                      graphErr->SetMarkerStyle(12);
                      graphErr->Write(graphName);
 
-                     sprintf(graphName,"f2_BusPatch_%d_Manu_%d_Ch_%d",busPatchId, manuId,channelId);
+                     snprintf(graphName,256,"f2_BusPatch_%d_Manu_%d_Ch_%d",busPatchId, manuId,channelId);
                      f2Calib->SetTitle(graphName);
                      f2Calib->SetLineColor(4);
                      f2Calib->SetParameters(par);
@@ -681,7 +681,7 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
        }
       nmanu++;
       Int_t step=500;
-      if(nmanu % step == 0)std::cout << " Nb manu = " << nmanu << std::endl;
+      if(nmanu % step == 0)printf("%s : Nb manu = %d\n",fPrefixLDC.Data(),nmanu);
     }
 
   //      print in logfile
@@ -704,36 +704,43 @@ void AliMUONGain::MakeGainStore(TString shuttleFile)
       (*fFilcout) << " Number of bad calibrated channel = " << uncalcountertotal << endl;
        
     }
+  if(nmanu && nGoodChannel) 
+    {
+      Double_t ratio_limit=0.25;
+      Double_t ratio=float (nBadChannel)/float (nmanu*64);
+
+      detail=Form("\n%s : Nb of channels in raw data = %d (%d Manu)",fPrefixLDC.Data(),nmanu*64,nmanu); 
+      (*fFilcout) << detail ; printf("%s",detail);
+      detail=Form("\n%s : Nb of calibrated channel   = %d  (%4.2f <a1< %4.2f and %4.2f <a2< %4.2f)",fPrefixLDC.Data(),nGoodChannel,goodA1Min,goodA1Max, goodA2Min,goodA2Max);
+      (*fFilcout) << detail ; printf("%s",detail);
+      detail=Form("\n%s : Nb of uncalibrated channel = %d  [%6.4f] (%d unfitted channels) ",fPrefixLDC.Data(),nBadChannel,ratio,noFitChannel);
+      (*fFilcout) << detail ; printf("%s",detail);
+
+      if(ratio > ratio_limit) { status=-1;
+       detail=Form("\n%s : !!!!! WARNING : Nb of uncalibrated channels very large : %6.4f > %6.4f (status= %d) ",fPrefixLDC.Data(),ratio,ratio_limit,status);
+       (*fFilcout) << detail ; printf("%s",detail); 
+      }
 
-
-  (*fFilcout) << "\n Nb of channels in raw data = " << nmanu*64 << " (" << nmanu << " Manu)" <<  endl;
-  (*fFilcout) << " Nb of calibrated channel   = " << nGoodChannel << " (" << goodA1Min << "<a1<" << goodA1Max 
-             << " and " << goodA2Min << "<a2<" << goodA2Max << ") " << endl;
-  (*fFilcout) << " Nb of uncalibrated channel = " << nBadChannel << " (" << noFitChannel << " unfitted)" << endl;
-
-  cout << "\n Nb of channels in raw data = " << nmanu*64 << " (" << nmanu << " Manu)" <<  endl;
-  cout << " Nb of calibrated channel   = " << nGoodChannel << " (" << goodA1Min << "<a1<" << goodA1Max 
-       << " and " << goodA2Min << "<a2<" << goodA2Max << ") " << endl;
-  cout << " Nb of uncalibrated channel = " << nBadChannel << " (" << noFitChannel << " unfitted)" << endl;
-
-  Double_t meanA1         = sumA1/(nGoodChannel);
-  Double_t meanProbChi2   = sumProbChi2/(nGoodChannel);
-  Double_t meanA2         = sumA2/(nGoodChannel);
-  Double_t meanProbChi2P2 = sumProbChi2P2/(nGoodChannel);
-
-  Double_t capaManu = 0.2; // pF
-  (*fFilcout) << "\n linear fit   : <a1> = " << meanA1 << "\t  <gain>  = " <<  1./(meanA1*capaManu) 
-             << " mV/fC (capa= " << capaManu << " pF)" << endl;
-  (*fFilcout) <<   "        Prob(chi2)>  = " <<  meanProbChi2 << endl;
-  (*fFilcout) << "\n parabolic fit: <a2> = " << meanA2  << endl;
-  (*fFilcout) <<   "        Prob(chi2)>  = " <<  meanProbChi2P2 << "\n" << endl;
-
-  cout << "\n  <gain>  = " <<  1./(meanA1*capaManu) 
-       << " mV/fC (capa= " << capaManu << " pF)" 
-       <<  "  Prob(chi2)>  = " <<  meanProbChi2 << endl;
-  
+      Double_t meanA1         = sumA1/(nGoodChannel);
+      Double_t meanProbChi2   = sumProbChi2/(nGoodChannel);
+      Double_t meanA2         = sumA2/(nGoodChannel);
+      Double_t meanProbChi2P2 = sumProbChi2P2/(nGoodChannel);
+      Double_t capaManu = 0.2; // pF
+      (*fFilcout) << "\n linear fit   : <a1> = " << meanA1 << "     Prob(chi2)>  = " <<  meanProbChi2 <<  "    <gain>  = " <<  1./(meanA1*capaManu) 
+                 << " mV/fC (capa= " << capaManu << " pF)" << endl;
+      (*fFilcout)   <<" parabolic fit: <a2> = " << meanA2  << "    Prob(chi2)>  = " <<  meanProbChi2P2 << "\n" <<  endl;
+      detail=Form("\n%s : <gain>  = %7.5f  mV/fC (capa= %3.1f pF)  Prob(chi2) = %5.3f\n" ,fPrefixLDC.Data(),1./(meanA1*capaManu),capaManu,meanProbChi2);
+      printf("%s",detail);
+    }
+  else 
+    { status=-1;
+      detail=Form("\n%s : !!!!! ERROR :  Nb of Manu = %d or Nb calibrated channel = %d !!!!! (status= %d)\n",fPrefixLDC.Data(),nmanu,nGoodChannel,status);
+      (*fFilcout) << detail ; printf("%s",detail);
+    }
   pfilew.close();
 
   if(fPlotLevel>0){tg->Write();histoFile->Close();}
   if(fPrintLevel>1){fclose(pfilep); fclose(pfilen);}
+  SetStatusDA(status);
 }