1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 /* History of cvs commits:
20 * Revision 1.7 2007/06/20 08:50:14 gustavo
21 * Change wrong directory data name from EmcGainPedestals to Data
23 * Revision 1.6 2007/04/29 15:06:19 gustavo
24 * New return value, and some minor fixes
26 * Revision 1.5 2007/02/01 15:02:42 gustavo
27 * Added log message in case there are no source files
29 * Revision 1.4 2007/01/24 16:57:14 gustavo
30 * Calibratio file sources machines are now not hardcoded but retreived from shuttle
32 * Revision 1.3 2006/12/20 10:53:28 gustavo
33 * Change const char * by TString, change AliInfos per AliPreprocessor::Log or AliDebug
35 * Revision 1.2 2006/12/12 17:16:09 gustavo
36 * Detector name hardcoded in Preprocesor with new detector name notation (3 letters). New way to take reference histogram to avoid problems in case of low number of entries or no existing histogram. Change return 0 by return 1
38 * Revision 1.1 2006/12/07 16:32:16 gustavo
39 * First shuttle code, online calibration histograms producer, EMCAL preprocessor
43 ///////////////////////////////////////////////////////////////////////////////
44 // EMCAL Preprocessor class. It runs by Shuttle at the end of the run,
45 // calculates calibration coefficients and dead/bad channels
46 // to be posted in OCDB
48 // Author: Boris Polichtchouk, 4 October 2006
49 // Adapted for EMCAL by Gustavo Conesa Balbastre, October 2006
50 ///////////////////////////////////////////////////////////////////////////////
60 #include "TObjString.h"
63 #include "AliEMCALPreprocessor.h"
65 #include "AliCDBMetaData.h"
66 #include "AliEMCALCalibData.h"
68 ClassImp(AliEMCALPreprocessor)
70 //_______________________________________________________________________________________
71 AliEMCALPreprocessor::AliEMCALPreprocessor() :
72 AliPreprocessor("EMC",0)
77 //_______________________________________________________________________________________
78 AliEMCALPreprocessor::AliEMCALPreprocessor(AliShuttleInterface* shuttle):
79 AliPreprocessor("EMC",shuttle)
82 AddRunType("PHYSICS");
83 AddRunType("STANDALONE");
87 //_______________________________________________________________________________________
88 UInt_t AliEMCALPreprocessor::Process(TMap* /*valueSet*/)
90 // process data retrieved by the Shuttle
92 // The fileName with the histograms which have been produced by
93 // AliEMCALCalibHistoProducer.
94 // It is a responsibility of the SHUTTLE framework to form the fileName
96 gRandom->SetSeed(0); //the seed is set to the current machine clock!
97 AliEMCALCalibData calibData;
100 TList* list = GetFileSources(kDAQ, "AMPLITUDES");
102 Log("Sources list not found, exit.");
106 AliInfo("The following sources produced files with the id AMPLITUDES");
112 while ((source = dynamic_cast<TObjString *> (iter.Next()))) {
113 AliInfo(Form("found source %s", source->String().Data()));
115 TString fileName = GetFile(kDAQ, "AMPLITUDES", source->GetName());
116 Log(Form("Got filename: %s",fileName.Data()));
121 Log(Form("File %s is not opened, something goes wrong!",fileName.Data()));
126 const Int_t nMod=12; // 1:5 modules
127 const Int_t nCol=48; //1:56 columns in each module
128 Int_t nRow=24; //1:64 rows in each module
129 const Int_t nRowHalfSM = 12; //Supermodules 11 and 12 are half supermodules
135 //Get reference histogram
136 TList * keylist = f.GetListOfKeys();
137 Int_t nkeys = f.GetNkeys();
140 TString refHistoName= "";
143 TH1F* hRef = new TH1F();
145 //Check if the file contains any histogram
148 Log(Form("Not enough histograms for calibration, nhist = %d",nkeys));
153 ikey = gRandom->Integer(nkeys);
154 key = (TKey*)keylist->At(ikey);
155 refHistoName = key->GetName();
156 hRef = (TH1F*)f.Get(refHistoName);
158 // Check if the reference has too little statistics and
159 // if the histogram has the correct name (2 kinds, mod#col#row for
160 // reference here, and mod#, see AliEMCALHistoProducer.
161 if(refHistoName.Contains("col") && hRef->GetEntries()>2 && hRef->GetMean()>0)
163 if(!ok && counter >= nMod*nCol*nRow+nMod){
164 Log("No histogram with enough statistics for reference");
169 Double_t refMean=hRef->GetMean();
171 // Calculates relative calibration coefficients for all non-zero channels
173 for(Int_t mod=0; mod<nMod; mod++) {
174 if(mod > 10) nRow = nRowHalfSM ;
175 for(Int_t col=0; col<nCol; col++) {
176 for(Int_t row=0; row<nRow; row++) {
177 sprintf(hnam,"mod%dcol%drow%d",mod,col,row);
178 histo = (TH1F*)f.Get(hnam);
179 //TODO: dead channels exclusion!
180 if(histo && histo->GetMean() > 0) {
181 coeff = histo->GetMean()/refMean;
182 calibData.SetADCchannel(mod+1,col+1,row+1,1./coeff);
183 AliDebug(1,Form("mod %d col %d row %d coeff %f\n",mod,col,row,coeff));
186 calibData.SetADCchannel(mod+1,col+1,row+1,-111);
193 //Store EMCAL calibration data
195 AliCDBMetaData emcalMetaData;
196 Bool_t emcalOK = Store("Calib", "Data", &calibData, &emcalMetaData);
198 if(emcalOK) return 0;