AliMUONDigitCalibrator
authorlaphecet <laphecet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 28 Jun 2009 16:06:00 +0000 (16:06 +0000)
committerlaphecet <laphecet@f7af4fe6-9843-0410-8265-dc069ae4e863>
Sun, 28 Jun 2009 16:06:00 +0000 (16:06 +0000)
Adding a new calibration option : INJECTIONGAIN, where we use capacitances and gain, but with the
 "injection" gain, aka Emelec gain, i.e. the gain from the factory.
At the same time, make sure that whatever the calibration option chosen, the computed charge is always in the same unit, mV.
Before, the charge was in ADC when no gain was applied, and in fC^-1 (?) otherwise.

Other changes :

Just a propagation of the introduction of this new option, mainly in mchview-related classes.

Alberto B. and Jean-Luc C.

MUON/AliMUONDigitCalibrator.cxx
MUON/AliMUONDigitCalibrator.h
MUON/AliMUONMchViewApplication.cxx
MUON/AliMUONMchViewApplication.h
MUON/AliMUONPainterDataSourceFrame.cxx
MUON/AliMUONPainterDataSourceFrame.h
MUON/AliMUONQADataMakerRec.h
MUON/AliMUONRecoParam.cxx
MUON/AliMUONRecoParam.h
MUON/AliMUONTrackerDataMaker.cxx
MUON/MUONOfflineShift.C

index d30c35b..f37f4d8 100644 (file)
@@ -1,17 +1,17 @@
 /**************************************************************************
-* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
-*                                                                        *
-* Author: The ALICE Off-line Project.                                    *
-* Contributors are mentioned in the code where appropriate.              *
-*                                                                        *
-* Permission to use, copy, modify and distribute this software and its   *
-* documentation strictly for non-commercial purposes is hereby granted   *
-* without fee, provided that the above copyright notice appears in all   *
-* copies and that both the copyright notice and this permission notice   *
-* appear in the supporting documentation. The authors make no claims     *
-* about the suitability of this software for any purpose. It is          *
-* provided "as is" without express or implied warranty.                  *
-**************************************************************************/
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Author: The ALICE Off-line Project.                                    *
+ * Contributors are mentioned in the code where appropriate.              *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
 
 // $Id$
 
@@ -62,6 +62,7 @@ ClassImp(AliMUONDigitCalibrator)
 const Int_t AliMUONDigitCalibrator::fgkNoGain(0);
 const Int_t AliMUONDigitCalibrator::fgkGainConstantCapa(1);
 const Int_t AliMUONDigitCalibrator::fgkGain(2);
+const Int_t AliMUONDigitCalibrator::fgkInjectionGain(3);
 
 //_____________________________________________________________________________
 AliMUONDigitCalibrator::AliMUONDigitCalibrator(const AliMUONCalibrationData& calib,
@@ -130,21 +131,26 @@ AliMUONDigitCalibrator::Ctor(const char* calibMode,
     fApplyGains = fgkGain;
     AliInfo("Will apply gain correction, with measured capacitances");
   }
+  else if ( cMode == "INJECTIONGAIN")
+       {
+               fApplyGains = fgkInjectionGain;
+    AliInfo("Will apply injection gain correction, with EMELEC factory gains");
+       }  
   else
   {
     AliError(Form("Invalid calib mode = %s. Will use NOGAIN instead",calibMode));
     fApplyGains = fgkNoGain;
   }
-       
+  
   // Load mapping manu store
   if ( ! AliMpCDB::LoadManuStore() ) {
     AliFatal("Could not access manu store from OCDB !");
   }
-
+  
   fStatusMaker = new AliMUONPadStatusMaker(calib);
   
   // Set default values, as loose as reasonable
-
+  
   fChargeSigmaCut = 3.0;
   
        Int_t mask(0x8080); // reject pads where ped *or* hv are missing
@@ -173,10 +179,10 @@ AliMUONDigitCalibrator::Ctor(const char* calibMode,
   fStatusMapMaker = new AliMUONPadStatusMapMaker(*fStatusMaker,mask,deferredInitialization);
   
   fPedestals = calib.Pedestals();
-
+  
   fGains = calib.Gains(); // we get gains whatever the calibMode is, in order
   // to get the saturation value...
-
+  
   if ( fApplyGains == fgkGain ) 
   {
     fCapacitances = calib.Capacitances();
@@ -192,7 +198,7 @@ AliMUONDigitCalibrator::~AliMUONDigitCalibrator()
   
   AliInfo("Summary of messages:");
   fLogger->Print();
-
+  
        AliInfo(Form("We have seen %g pads, and rejected %g (%7.2f %%)",
                                                         fNumberOfPads,fNumberOfBadPads,
                                                         ( fNumberOfPads > 0 ) ? fNumberOfBadPads*100.0/fNumberOfPads : 0 ));
@@ -207,7 +213,7 @@ AliMUONDigitCalibrator::Calibrate(AliMUONVDigitStore& digitStore)
   /// Calibrate the digits contained in digitStore  
   TIter next(digitStore.CreateTrackerIterator());
   AliMUONVDigit* digit;
-
+  
   fStatusMapMaker->RefreshRejectProbabilities(); // this will do something only for simulations
   // (and only for those simulations where the reject list contain probabilities which are
   // different from zero or one)
@@ -227,11 +233,11 @@ AliMUONDigitCalibrator::Calibrate(AliMUONVDigitStore& digitStore)
     Float_t charge(0.0);
     Int_t statusMap;
     Bool_t isSaturated(kFALSE);
-
+    
     ++fNumberOfPads;
-
+    
     Bool_t ok = IsValidDigit(digit->DetElemId(),digit->ManuId(),digit->ManuChannel(),&statusMap);
-
+    
     digit->SetStatusMap(statusMap);
     
     if (ok)
@@ -245,7 +251,7 @@ AliMUONDigitCalibrator::Calibrate(AliMUONVDigitStore& digitStore)
                       digit->DetElemId(),digit->ManuId(),digit->ManuChannel(),
                       digit->ADC(),statusMap,
                       fStatusMaker->AsString(fStatusMaker->PadStatus(digit->DetElemId(),digit->ManuId(),digit->ManuChannel())).Data()));
-
+      
       ++fNumberOfBadPads;
       
     }
@@ -291,39 +297,41 @@ AliMUONDigitCalibrator::CalibrateDigit(Int_t detElemId, Int_t manuId, Int_t manu
   }
   
   Float_t padc = adc-pedestal->ValueAsFloat(manuChannel,0);
-  Float_t charge(0);
-  Float_t capa(1.0);
   
-  if ( fApplyGains == fgkGainConstantCapa ) 
-  {
-    capa = 0.2; // pF
-  }
-  else if ( fApplyGains == fgkGain ) 
+       // Gain (mV/fC) = 1/(a0*capa) with a0~1.25 and capa~0.2 
+  Float_t charge(0);
+  Float_t capa(0.2); // capa = 0.2 and a0 = 1.25
+       Float_t a0(1.25);  // is equivalent to gain = 4 mV/fC
+       Float_t a1(0);
+       Float_t adc2mv(0.61); // 1 ADC channel = 0.61 mV
+       Float_t injGain(4); // By default the gain is set to 4 mV/fC
+       
+  if ( fApplyGains == fgkGain || fApplyGains == fgkInjectionGain ) 
   {
-    
-
     Int_t serialNumber 
-      = AliMpManuStore::Instance()->GetManuSerial(detElemId, manuId);
+    = AliMpManuStore::Instance()->GetManuSerial(detElemId, manuId);
     
     AliMUONVCalibParam* param = static_cast<AliMUONVCalibParam*>(fCapacitances->FindObject(serialNumber));
     
     if ( param )
     {
-      capa = param->ValueAsFloat(manuChannel);
+      capa = param->ValueAsFloat(manuChannel,0);
+                       injGain = param->ValueAsFloat(manuChannel,1);
     }
     else
     {
-      fLogger->Log(Form("No capa found for serialNumber=%d",serialNumber));
-      capa = 0.0;
+      // If capa not found in the OCDB we use default value
+           fLogger->Log(Form("No capa (injGain) found for serialNumber=%d",serialNumber));
+                       return 0.0;
     }
   }
   
   if ( padc > nsigmas*pedestal->ValueAsFloat(manuChannel,1) ) 
   {
-    if ( fApplyGains != fgkNoGain ) 
+    if ( fApplyGains == fgkGain || fApplyGains == fgkGainConstantCapa ) 
     {
-      Float_t a0 = gain->ValueAsFloat(manuChannel,0);
-      Float_t a1 = gain->ValueAsFloat(manuChannel,1);
+      a0 = gain->ValueAsFloat(manuChannel,0);
+      a1 = gain->ValueAsFloat(manuChannel,1);
       Int_t thres = gain->ValueAsInt(manuChannel,2);
       if ( padc < thres ) 
       {
@@ -333,24 +341,28 @@ AliMUONDigitCalibrator::CalibrateDigit(Int_t detElemId, Int_t manuId, Int_t manu
       {
         charge = a0*thres + a0*(padc-thres) + a1*(padc-thres)*(padc-thres);
       }
+                       charge *= capa*adc2mv;
     }
-    else
+    else if ( fApplyGains == fgkInjectionGain ) 
     {
-      charge = padc;
+                       
+      charge = padc*adc2mv/injGain;
     }
+               else
+               {
+                       charge = a0*padc*capa*adc2mv;
+               }
   }
   
-  charge *= capa;
-  
   if ( isSaturated ) 
   {
     Int_t saturation(3000);
-  
+    
     if ( gain && ( fApplyGains != fgkNoGain ) )
     {
       saturation = gain->ValueAsInt(manuChannel,4);
     }
-  
+    
     if ( padc >= saturation )
     {
       *isSaturated = kTRUE;
index fec1e1e..9ee49b2 100644 (file)
@@ -78,6 +78,7 @@ private:
        static const Int_t fgkNoGain; //!< do not apply gain calib at all
        static const Int_t fgkGainConstantCapa; //!< apply gain (from OCDB) with constant capa
        static const Int_t fgkGain; //!< apply gain and capa (from OCDB)
+       static const Int_t fgkInjectionGain; //!< apply injection gain (from OCDB)
        
   ClassDef(AliMUONDigitCalibrator,9) // Calibrate raw digit
 };
index 3dcac5c..5832a31 100644 (file)
@@ -353,6 +353,11 @@ AliMUONMchViewApplication::ReleaseNotes()
   
   TGTextView* rn = new TGTextView(t);
 
+  rn->AddLine("0.97");
+  rn->AddLine("");
+  rn->AddLine("Adding calibration option with Emelec (aka injection) gain");
+  rn->AddLine("");
+  
   rn->AddLine("0.96a");
   rn->AddLine("");
   rn->AddLine("Internal reorganization of the contour computations, that lead to improved performance. ");
index 0a54dbd..90f47c5 100644 (file)
@@ -30,7 +30,7 @@ public:
   void HandleMenu(Int_t i);
 
   /// Return the version number of the mchview application
-  static const char* Version() { return "0.96"; }
+  static const char* Version() { return "0.97"; }
   
   /// Return the SVN revision  and version number of the mchview application
   static const char* FullVersion() { return Form("mchview Version %s ($Id$)",Version()); }
index 1866ebd..d8864d7 100644 (file)
@@ -64,9 +64,10 @@ AliMUONPainterDataSourceFrame::AliMUONPainterDataSourceFrame(const TGWindow* p,
   fRawSelector21(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
   fRawSelector22(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
   fRawSelector23(new TGCompositeFrame(fRawSelector2,w,h,kHorizontalFrame)),
-  fCalibrateNoGain(new TGCheckButton(fRawSelector22,"Ped subraction")),
-  fCalibrateGainConstantCapa(new TGCheckButton(fRawSelector22,"Ped subraction + gain (capa cste)")),
-  fCalibrateGain(new TGCheckButton(fRawSelector22,"Full calib (Ped subraction + gain with capa)")),
+  fCalibrateNoGain(new TGCheckButton(fRawSelector22,"Ped sub")),
+  fCalibrateGainConstantCapa(new TGCheckButton(fRawSelector22,"Ped sub+gain (capa cste)")),
+  fCalibrateGain(new TGCheckButton(fRawSelector22,"Full calib (Ped sub+gain w/ capa)")),
+  fCalibrateEmelecGain(new TGCheckButton(fRawSelector22,"Full calib (Ped sub+inj gain w/ capa)")),
   fHistogramButton(new TGCheckButton(fRawSelector23,"Histogram")),
   fHistoMin(new TGNumberEntry(fRawSelector23,0)),
   fHistoMax(new TGNumberEntry(fRawSelector23,4096)),
@@ -137,6 +138,7 @@ AliMUONPainterDataSourceFrame::AliMUONPainterDataSourceFrame(const TGWindow* p,
     fRawSelector22->AddFrame(fCalibrateNoGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
     fRawSelector22->AddFrame(fCalibrateGainConstantCapa, new TGLayoutHints(kLHintsTop,5,5,5,5));
     fRawSelector22->AddFrame(fCalibrateGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
+    fRawSelector22->AddFrame(fCalibrateEmelecGain, new TGLayoutHints(kLHintsTop,5,5,5,5));
     fRawSelector22->AddFrame(fRawOCDBPath, new TGLayoutHints(kLHintsExpandX | kLHintsTop,5,5,5,5));
     fRawOCDBPath->SetEnabled(kFALSE);
     
@@ -158,6 +160,7 @@ AliMUONPainterDataSourceFrame::AliMUONPainterDataSourceFrame(const TGWindow* p,
     fCalibrateNoGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
     fCalibrateGainConstantCapa->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
     fCalibrateGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
+  fCalibrateEmelecGain->Connect("Clicked()","AliMUONPainterDataSourceFrame",this,"CalibrateButtonClicked()");
 
     openButton->Connect("Clicked()",
                         "AliMUONPainterDataSourceFrame",
@@ -280,7 +283,8 @@ AliMUONPainterDataSourceFrame::CalibrateButtonClicked()
   
   if ( fCalibrateNoGain->IsOn() ||
        fCalibrateGainConstantCapa->IsOn() ||
-       fCalibrateGain->IsOn() ) 
+       fCalibrateGain->IsOn() || 
+       fCalibrateEmelecGain->IsOn() ) 
   {
     fRawOCDBPath->SetEnabled(kTRUE);
     fRawOCDBPath->SetFocus();
@@ -471,6 +475,12 @@ AliMUONPainterDataSourceFrame::CreateRawDataSource()
     calibMode = "GAINCONSTANTCAPA";
     name = "CALG";
   }
+
+  if ( fCalibrateEmelecGain->IsOn() ) 
+  {
+    calibMode = "INJECTIONGAIN";
+    name = "CALE";
+  }
   
   if ( fCalibrateNoGain->IsOn() ) 
   {
index 7f1b3cd..c6733ec 100644 (file)
@@ -85,6 +85,7 @@ private:
   TGCheckButton* fCalibrateNoGain; ///< to trig calibration of raw data (only 0 suppression)
   TGCheckButton* fCalibrateGainConstantCapa; ///< to trig calibration of raw data (0-supp and gain w/ constant capacitance)
   TGCheckButton* fCalibrateGain; ///< to trig calibration of raw data (full blown calibration)
+  TGCheckButton* fCalibrateEmelecGain; ///< to trig calibration of raw data (full blown calibration but with factory gains)
   TGCheckButton* fHistogramButton; ///< to trig histogramming of raw data
   TGNumberEntry* fHistoMin; ///< xmin of histo to make
   TGNumberEntry* fHistoMax; ///< xmax of histo to make
@@ -106,7 +107,7 @@ private:
   static const char* fgkNumberOfDataSourcesKey; ///< key used to store the # of data sources in the resource file
   static const char* fgkDataSourceURIKey; ///< key usde to store the data source URIs in the resource file
 
-  ClassDef(AliMUONPainterDataSourceFrame,3) // Data source selection frame
+  ClassDef(AliMUONPainterDataSourceFrame,4) // Data source selection frame
 };
 
 #endif
index f444f09..a559a84 100644 (file)
@@ -166,11 +166,6 @@ private:
   /// Return reco parameters
   const AliMUONRecoParam* GetMUONRecoParam() const { return dynamic_cast<const AliMUONRecoParam *>(fRecoParam); }
   
-  Bool_t  fIsInitRaws;       //!<  info if InitRaws() went ok
-  Bool_t  fIsInitRecPointsTracker;  //!<  info if InitRecPoints() went ok
-  Bool_t  fIsInitRecPointsTrigger;  //!<  info if InitRecPoints() went ok
-  Bool_t  fIsInitESDs;       //!<  info if InitESDs() went ok
-  
   AliMUONVDigitStore*   fDigitStore; //!< pointer to digits store
   AliMUONVTriggerStore* fTriggerStore; //!< pointer to trigger store
   AliMUONDigitMaker*    fDigitMaker;  //!< pointer to digit maker
@@ -178,7 +173,7 @@ private:
        
   AliMUONVTrackerDataMaker* fTrackerDataMaker; //!< tracker data accumulation
   
-  ClassDef(AliMUONQADataMakerRec,5)  // MUON Quality assurance data maker
+  ClassDef(AliMUONQADataMakerRec,6)  // MUON Quality assurance data maker
 
 };
 #endif
index 4e99779..f18654f 100644 (file)
@@ -106,6 +106,7 @@ AliMUONRecoParam::GetCalibrationMode() const
   /// NOGAIN : only do pedestal subtraction
   /// GAIN : do pedestal subtraction, and apply gain correction, but with a
   ///        single capacitance value for all channels
+  /// INJECTIONGAIN : as GAIN, but with gain values taken as EMELEC factory values
   /// GAINCONSTANTCAPA : as GAIN, but with a channel-dependent capacitance value
   
   return fCalibrationMode.Data();
index 829f233..2b0e060 100644 (file)
@@ -343,7 +343,7 @@ class AliMUONRecoParam : public AliDetectorRecoParam
   
   Bool_t     fSaveFullClusterInESD; ///< kTRUE to save all cluster info (including pads) in ESD
   
-  /// calibration mode:  GAIN, NOGAIN, GAINCONSTANTCAPA
+  /// calibration mode:  GAIN, NOGAIN, GAINCONSTANTCAPA, INJECTIONGAIN
   TString    fCalibrationMode; ///<\brief calibration mode
   
   Int_t      fBypassSt45; ///< non-zero to use trigger tracks to generate "fake" clusters in St 4 and 5. Can be 0, 4, 5 or 45 only
index eacfe10..1af7f1f 100644 (file)
@@ -181,6 +181,7 @@ AliMUONTrackerDataMaker::Ctor(const AliMUONRecoParam* recoParam,
     if ( scalib == "GAIN" ) type = "CALC";
     if ( scalib == "NOGAIN" ) type = "CALZ";
     if ( scalib == "GAINCONSTANTCAPA") type = "CALG";
+    if ( scalib == "INJECTIONGAIN" ) type = "CALE";
   }
   
   if ( !fRunNumber ) 
index 995ba75..22c35d0 100644 (file)
@@ -49,7 +49,7 @@
 #include "AliCDBEntry.h"
 #include "AliCDBManager.h"
 #include "AliCodeTimer.h"
-#include "AliMUONPainterRegistry.h"
+#include "AliMUONPainterDataRegistry.h"
 #include "AliMUONRecoParam.h"
 #include "AliMUONTrackerDataMaker.h"
 #include "AliMUONVTrackerData.h"
@@ -103,7 +103,7 @@ Int_t DataMakerReading(const char* input,
     dm = new AliMUONTrackerDataMaker(rawReader,histogram);
   }
   
-  AliMUONPainterRegistry::Instance()->Register(dm);
+  AliMUONPainterDataRegistry::Instance()->Register(dm);
 
   timer.Start(kTRUE);
   Int_t n(0);
@@ -146,7 +146,7 @@ void Occupancy(ostream& outfile)
   
   const Int_t occIndex = 2;
   
-  AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
+  AliMUONPainterDataRegistry* reg = AliMUONPainterDataRegistry::Instance();
 
   Int_t nofDataSources = reg->NumberOfDataSources();
 
@@ -237,6 +237,7 @@ void MUONOfflineShift(const char* input="alien:///alice/data/2009/LHC09a/0000674
   TStopwatch timer2;
   TStopwatch timer3;
   TStopwatch timer4;
+  TStopwatch timer5;
   
   Int_t n1 = DataMakerReading(input,timer1,"","",kTRUE,0,0);
 
@@ -246,12 +247,15 @@ void MUONOfflineShift(const char* input="alien:///alice/data/2009/LHC09a/0000674
 
   Int_t n4 = DataMakerReading(input,timer4,ocdbPath,"GAIN");
 
+  Int_t n5 = DataMakerReading(input,timer5,ocdbPath,"INJECTIONGAIN");
+
   Print("DataMakerReading(HRAW)",timer1,n1);  
   Print("DataMakerReading(HCALZ)",timer2,n2);
   Print("DataMakerReading(HCALG)",timer3,n3);
   Print("DataMakerReading(HCALC)",timer4,n4);
+  Print("DataMakerReading(HCALE)",timer5,n5);
   
-  AliMUONPainterRegistry* reg = AliMUONPainterRegistry::Instance();
+  AliMUONPainterDataRegistry* reg = AliMUONPainterDataRegistry::Instance();
   
   TFile f(gSystem->ExpandPathName(Form("%s.root",outputBase)),"RECREATE");
   ofstream out(gSystem->ExpandPathName(Form("%s.log",outputBase)));