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.6 2007/04/29 15:06:19 gustavo
21 * New return value, and some minor fixes
23 * Revision 1.5 2007/02/01 15:02:42 gustavo
24 * Added log message in case there are no source files
26 * Revision 1.4 2007/01/24 16:57:14 gustavo
27 * Calibratio file sources machines are now not hardcoded but retreived from shuttle
29 * Revision 1.3 2006/12/20 10:53:28 gustavo
30 * Change const char * by TString, change AliInfos per AliPreprocessor::Log or AliDebug
32 * Revision 1.2 2006/12/12 17:16:09 gustavo
33 * 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
35 * Revision 1.1 2006/12/07 16:32:16 gustavo
36 * First shuttle code, online calibration histograms producer, EMCAL preprocessor
40 ///////////////////////////////////////////////////////////////////////////////
41 // EMCAL Preprocessor class. It runs by Shuttle at the end of the run,
42 // calculates calibration coefficients and dead/bad channels
43 // to be posted in OCDB
45 // Author: Boris Polichtchouk, 4 October 2006
46 // Adapted for EMCAL by Gustavo Conesa Balbastre, October 2006
47 ///////////////////////////////////////////////////////////////////////////////
57 #include "TObjString.h"
60 #include "AliEMCALPreprocessor.h"
62 #include "AliCDBMetaData.h"
63 #include "AliEMCALCalibData.h"
65 ClassImp(AliEMCALPreprocessor)
67 //_______________________________________________________________________________________
68 AliEMCALPreprocessor::AliEMCALPreprocessor() :
69 AliPreprocessor("EMC",0)
74 //_______________________________________________________________________________________
75 AliEMCALPreprocessor::AliEMCALPreprocessor(AliShuttleInterface* shuttle):
76 AliPreprocessor("EMC",shuttle)
81 //_______________________________________________________________________________________
82 UInt_t AliEMCALPreprocessor::Process(TMap* /*valueSet*/)
84 // process data retrieved by the Shuttle
86 // The fileName with the histograms which have been produced by
87 // AliEMCALCalibHistoProducer.
88 // It is a responsibility of the SHUTTLE framework to form the fileName
90 gRandom->SetSeed(0); //the seed is set to the current machine clock!
91 AliEMCALCalibData calibData;
94 TList* list = GetFileSources(kDAQ, "AMPLITUDES");
96 Log("Sources list not found, exit.");
100 AliInfo("The following sources produced files with the id AMPLITUDES");
106 while ((source = dynamic_cast<TObjString *> (iter.Next()))) {
107 AliInfo(Form("found source %s", source->String().Data()));
109 TString fileName = GetFile(kDAQ, "AMPLITUDES", source->GetName());
110 Log(Form("Got filename: %s",fileName.Data()));
115 Log(Form("File %s is not opened, something goes wrong!",fileName.Data()));
120 const Int_t nMod=12; // 1:5 modules
121 const Int_t nCol=48; //1:56 columns in each module
122 Int_t nRow=24; //1:64 rows in each module
123 const Int_t nRowHalfSM = 12; //Supermodules 11 and 12 are half supermodules
129 //Get reference histogram
130 TList * keylist = f.GetListOfKeys();
131 Int_t nkeys = f.GetNkeys();
134 TString refHistoName= "";
137 TH1F* hRef = new TH1F();
139 //Check if the file contains any histogram
142 Log(Form("Not enough histograms for calibration, nhist = %d",nkeys));
147 ikey = gRandom->Integer(nkeys);
148 key = (TKey*)keylist->At(ikey);
149 refHistoName = key->GetName();
150 hRef = (TH1F*)f.Get(refHistoName);
152 // Check if the reference has too little statistics and
153 // if the histogram has the correct name (2 kinds, mod#col#row for
154 // reference here, and mod#, see AliEMCALHistoProducer.
155 if(refHistoName.Contains("col") && hRef->GetEntries()>2 && hRef->GetMean()>0)
157 if(!ok && counter >= nMod*nCol*nRow+nMod){
158 Log("No histogram with enough statistics for reference");
163 Double_t refMean=hRef->GetMean();
165 // Calculates relative calibration coefficients for all non-zero channels
167 for(Int_t mod=0; mod<nMod; mod++) {
168 if(mod > 10) nRow = nRowHalfSM ;
169 for(Int_t col=0; col<nCol; col++) {
170 for(Int_t row=0; row<nRow; row++) {
171 sprintf(hnam,"mod%dcol%drow%d",mod,col,row);
172 histo = (TH1F*)f.Get(hnam);
173 //TODO: dead channels exclusion!
174 if(histo && histo->GetMean() > 0) {
175 coeff = histo->GetMean()/refMean;
176 calibData.SetADCchannel(mod+1,col+1,row+1,1./coeff);
177 AliDebug(1,Form("mod %d col %d row %d coeff %f\n",mod,col,row,coeff));
180 calibData.SetADCchannel(mod+1,col+1,row+1,-111);
187 //Store EMCAL calibration data
189 AliCDBMetaData emcalMetaData;
190 Bool_t emcalOK = Store("Calib", "Data", &calibData, &emcalMetaData);
192 if(emcalOK) return 0;