Introduction of decalibration in the simulations with anchor runs and raw:// OCDB.
authorpolicheh <policheh@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 1 Aug 2011 09:01:23 +0000 (09:01 +0000)
committerpolicheh <policheh@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 1 Aug 2011 09:01:23 +0000 (09:01 +0000)
PHOS/AliPHOSCalibData.cxx
PHOS/AliPHOSCalibData.h
PHOS/AliPHOSDigitizer.cxx
PHOS/AliPHOSEmcCalibData.cxx
PHOS/AliPHOSEmcCalibData.h
PHOS/macros/CalibrationDB/makeDecalibCDB.C [new file with mode: 0644]

index 695b682d454bb7d15c13a8a265bcd58a6bbe68a1..afbe99c32c0c76ced2142d1cda1c009c61c3e683 100644 (file)
@@ -529,3 +529,32 @@ void AliPHOSCalibData::EmcBadChannelIds(Int_t *badIds)
   if(fEmcBadChannelsMap)              
     fEmcBadChannelsMap->BadChannelIds(badIds);
 }
+
+//________________________________________________________________
+Float_t AliPHOSCalibData::GetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row) const
+{
+  // Return random EMC (de)calibration factor O(1) for channel defined by (module,column,row). 
+  // Used in simulation.
+  
+  // module, column,raw should follow the internal PHOS convention:
+  // module 1:5, column 1:56, row 1:64
+  // if CBD instance exists, the value is taken from CDB.
+  // Otherwise it is an ideal one (no decalibration).
+  
+  if(fCalibDataEmc) 
+    return fCalibDataEmc->GetADCchannelEmcDecalib(module,column,row);
+  else
+    return 1.0; // no decalibration by default
+}
+
+//________________________________________________________________
+void AliPHOSCalibData::SetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row, Float_t value)
+{
+  // Set EMC (de)calibration factor for (module,column,row).
+  // Used in simulation.
+  
+  if(!fCalibDataEmc)
+    fCalibDataEmc = new AliPHOSEmcCalibData("PHOS-EMC");
+  
+  fCalibDataEmc->SetADCchannelEmcDecalib(module,column,row,value);
+}
index 4db2c0e178746f0566e2d9e7270b05ce29ce6b37..cd79689c99221b1ff8b72943770d161a380938aa 100644 (file)
@@ -76,6 +76,10 @@ class AliPHOSCalibData: public TNamed {
   Bool_t WriteCpv(Int_t firstRun, Int_t lastRun, AliCDBMetaData *md);
   Bool_t WriteEmcBadChannelsMap(Int_t firstRun, Int_t lastRun, AliCDBMetaData *md);
 
+  //----Decalibration factors for simulation-------------
+  Float_t GetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row) const;
+  void    SetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row, Float_t value);  
+  
  private:
 
   AliPHOSEmcCalibData* fCalibDataEmc; // EMC calibration data
@@ -86,7 +90,7 @@ class AliPHOSCalibData: public TNamed {
   TString fCpvDataPath; // path to CPV calibration data
   TString fEmcBadChannelsMapPath; // path to bad channels map
 
-  ClassDef(AliPHOSCalibData,5)    // PHOS Calibration data
+  ClassDef(AliPHOSCalibData,6)    // PHOS Calibration data
 };
 
 #endif
index 57ad35b3d0dc6dc88f17c4a29101e1ff3cb2c2ef..93d09754cc627b991ea47eb811504205da1e1ba3 100644 (file)
@@ -676,7 +676,8 @@ void AliPHOSDigitizer::Decalibrate(AliPHOSDigit *digit)
   Int_t row   =relId[2];
   Int_t column=relId[3];
   if(relId[1]==0){ //This Is EMC
-    Float_t calibration = fcdb->GetADCchannelEmc(module,column,row);
+    Float_t decalib     = fcdb->GetADCchannelEmcDecalib(module,column,row); // O(1)
+    Float_t calibration = fcdb->GetADCchannelEmc(module,column,row)*decalib;
     Float_t energy = digit->GetEnergy()/calibration;
     digit->SetEnergy(energy); //Now digit measures E in ADC counts
     Float_t time = digit->GetTime() ;
index ddb304d9995165bcdde8d19f92d5d587ffe11870..a3cdc62fad1b27aade52fea8c2d52fae2aad5908 100644 (file)
@@ -62,6 +62,7 @@ AliPHOSEmcCalibData::AliPHOSEmcCalibData(const AliPHOSEmcCalibData& calibda) :
        fHighLowRatioEmc[module][column][row] = calibda.fHighLowRatioEmc[module][column][row];
        fTimeShiftEmc[module][column][row] = calibda.fTimeShiftEmc[module][column][row];
         fAltroOffsets[module][column][row] = calibda.fAltroOffsets[module][column][row];
+       fDecal[module][column][row]        = calibda.fDecal[module][column][row];
       }
     }
   }
@@ -84,7 +85,8 @@ AliPHOSEmcCalibData &AliPHOSEmcCalibData::operator =(const AliPHOSEmcCalibData&
          fADCpedestalEmc[module][column][row] = calibda.fADCpedestalEmc[module][column][row];
          fHighLowRatioEmc[module][column][row] = calibda.fHighLowRatioEmc[module][column][row];
          fTimeShiftEmc[module][column][row] = calibda.fTimeShiftEmc[module][column][row];
-          fAltroOffsets[module][column][row] = calibda.fAltroOffsets[module][column][row]; 
+          fAltroOffsets[module][column][row] = calibda.fAltroOffsets[module][column][row];
+         fDecal[module][column][row]        = calibda.fDecal[module][column][row];
        }
       }
     }
@@ -112,6 +114,7 @@ void AliPHOSEmcCalibData::Reset()
        fHighLowRatioEmc[module][column][row] = 16. ;
        fTimeShiftEmc[module][column][row] = 0. ;
         fAltroOffsets[module][column][row] = 0 ;
+       fDecal[module][column][row] = 1.;
       }
     }
   }
@@ -295,3 +298,21 @@ void AliPHOSEmcCalibData::SetSampleTimeStep(Float_t step)
    fSampleTimeStep = step ;
 }
 
+//________________________________________________________________
+Float_t AliPHOSEmcCalibData::GetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row) const
+{
+  //Return EMC random (de)calibration coefficient O(1). Used in simulation.
+  //module, column,raw should follow the internal PHOS convention:
+  //module 1:5, column 1:56, row 1:64
+
+  return fDecal[module-1][column-1][row-1];
+}
+
+void AliPHOSEmcCalibData::SetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row, Float_t value)
+{
+  //Set EMC (de)calibration coefficient O(1). Used in simulation.
+  //module, column,raw should follow the internal PHOS convention:
+  //module 1:5, column 1:56, row 1:64
+
+  fDecal[module-1][column-1][row-1] = value;
+}
index f28df8ff45d7364fef87136b90264b67938ba9d9..40fb7a277a690c293cd421f0993b584aa1df5093 100644 (file)
@@ -34,16 +34,20 @@ class AliPHOSEmcCalibData: public TNamed {
   void SetTimeShiftEmc(Int_t module, Int_t column, Int_t row, Float_t value);
   void SetAltroOffsetEmc(Int_t module, Int_t column, Int_t row, Int_t value);
   void SetSampleTimeStep(Float_t step) ;
-
- protected:
+  //
+  Float_t GetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row) const;
+  void    SetADCchannelEmcDecalib(Int_t module, Int_t column, Int_t row, Float_t value);
+  
+protected:
   Float_t  fSampleTimeStep ;            // Conversion between ALTRO sample time step and seconds
   Float_t  fADCchannelEmc[5][56][64] ;  // width of one EMC ADC channel in GeV ([mod][col][row])
   Float_t  fADCpedestalEmc[5][56][64] ; // value of the EMC ADC pedestal ([mod][col][row])
   Float_t  fHighLowRatioEmc[5][56][64]; // ratio of High/Low gain ([mod][col][row])
   Float_t  fTimeShiftEmc[5][56][64] ;   // channel-by-channel t0 shift ([mod][col][row])
   UInt_t   fAltroOffsets[5][56][64] ;   // channel-by-channel offsets udes in ZS
+  Float_t  fDecal[5][56][64] ;          // Random decalibrations O(1). Used in simulation.
   //
-  ClassDef(AliPHOSEmcCalibData,4)    // PHOS EMC calibration data
+  ClassDef(AliPHOSEmcCalibData,5)    // PHOS EMC calibration data
 };
 
 #endif
diff --git a/PHOS/macros/CalibrationDB/makeDecalibCDB.C b/PHOS/macros/CalibrationDB/makeDecalibCDB.C
new file mode 100644 (file)
index 0000000..e18b614
--- /dev/null
@@ -0,0 +1,53 @@
+void makeDecalibCDB(Int_t firstRun, Int_t lastRun, Float_t decalib = 0.065)
+{
+  //Generates a random decalibration factors O(1)
+  //to be applied in the anchor run simulations with raw:// .
+  //If decalib<0, no decalibration generated, all factors=1.
+  
+  //Run range is [firstRun,lastRun] and gaussian sigma = decalib.
+  //Author: Boris Polishchuk.
+  
+  AliCDBManager::Instance()->SetDefaultStorage("raw://");
+  AliCDBManager::Instance()->SetRun(firstRun);
+
+  TString emcPath("PHOS/Calib/EmcGainPedestals");
+  AliCDBEntry* entryEmc = AliCDBManager::Instance()->Get(emcPath.Data(),-1);
+
+  AliPHOSEmcCalibData* clb=0;
+
+  if(entryEmc) clb = (AliPHOSEmcCalibData*)entryEmc->GetObject();
+  else { printf("CDB entry not found. Exit.\n"); return; }
+  
+  if(!clb) { printf("Calibration parameters for PHOS EMC not found.\n"); return; }
+  
+  printf("\t\tEMC calibration object found: FirstRun=%d LastRun=%d Version=%d SubVersion=%d\n",
+         entryEmc->GetId().GetFirstRun(), entryEmc->GetId().GetLastRun(),
+         entryEmc->GetId().GetVersion(),entryEmc->GetId().GetSubVersion());
+  
+  
+  TRandom rn;
+  rn.SetSeed(0); //the seed is set to the current  machine clock
+
+  Float_t adcChannelEmc;
+
+  for(Int_t module=1; module<6; module++) {
+    for(Int_t column=1; column<57; column++) {
+      for(Int_t row=1; row<65; row++) {
+
+       if(decalib<0.) adcChannelEmc = 1.;
+       else
+         adcChannelEmc =rn.Gaus(1.,decalib);
+
+        clb->SetADCchannelEmcDecalib(module,column,row,adcChannelEmc);
+      }
+    }
+  }
+
+  AliCDBManager::Instance()->SetDefaultStorage("local://./");
+  AliCDBStorage* storage = AliCDBManager::Instance()->GetDefaultStorage();
+  
+  AliCDBMetaData *md = new AliCDBMetaData();
+  AliCDBId id(emcPath.Data(),firstRun,lastRun);
+  storage->Put(clb,id, md);
+
+}