Changed default OCDB from 2009 to 2010
[u/mrichter/AliRoot.git] / MUON / AliMUONPedestalSubprocessor.cxx
CommitLineData
ea199e33 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
15
16// $Id$
17
8d8e920c 18#include "AliMUONPedestalSubprocessor.h"
ea199e33 19
20#include "AliCDBMetaData.h"
042cd64e 21#include "AliCDBEntry.h"
ceecdad2 22#include "AliDAQ.h"
ea199e33 23#include "AliLog.h"
24#include "AliMUON2DMap.h"
8d8e920c 25#include "AliMUON2DStoreValidator.h"
a8f77ca0 26#include "AliMUONCalibParamNF.h"
ea199e33 27#include "AliMUONPreprocessor.h"
81028269 28#include "AliMUONTrackerIO.h"
8d8e920c 29#include "AliMpConstants.h"
7ca4655f 30#include "AliMpDDLStore.h"
a8f77ca0 31#include "TObjString.h"
8d8e920c 32#include <Riostream.h>
33#include <TList.h>
34#include <TObjString.h>
35#include <TSystem.h>
36#include <sstream>
ea199e33 37
3d1463c8 38//-----------------------------------------------------------------------------
ea199e33 39/// \class AliMUONPedestalSubprocessor
40///
41/// Implementation of AliMUONVSubprocessor class to deal with MUON TRK pedestals.
42///
43/// Pedestals are read in from an ascii file, with the format : \n
44///---------------------------------------------------------------------------\n
45/// BUS_PATCH MANU_ADDR CHANNEL MEAN SIGMA \n
46///---------------------------------------------------------------------------\n
47///
48/// \author L. Aphecetche
3d1463c8 49//-----------------------------------------------------------------------------
ea199e33 50
51/// \cond CLASSIMP
52ClassImp(AliMUONPedestalSubprocessor)
53/// \endcond
54
55//_____________________________________________________________________________
56AliMUONPedestalSubprocessor::AliMUONPedestalSubprocessor(AliMUONPreprocessor* master)
57: AliMUONVSubprocessor(master,
58 "Pedestals",
59 "Upload MUON Tracker pedestals to OCDB"),
6c870207 60fPedestals(0x0),
61fConfig(0x0),
62fConfigChanged(kFALSE)
ea199e33 63{
71a2d3aa 64 /// default ctor
ea199e33 65}
66
67//_____________________________________________________________________________
68AliMUONPedestalSubprocessor::~AliMUONPedestalSubprocessor()
69{
71a2d3aa 70 /// dtor
ea199e33 71 delete fPedestals;
6c870207 72 delete fConfig;
ea199e33 73}
74
75//_____________________________________________________________________________
042cd64e 76Bool_t
77AliMUONPedestalSubprocessor::HasConfigChanged(const AliMUONVStore& newConfig) const
78{
79 /// Check whether the config changed.
80 /// Any error will return kTRUE to trig a config upload (safer way).
81
82 AliCDBEntry* entry = Master()->GetFromOCDB("Calib","Config");
83 if (!entry)
84 {
85 AliError("Could not get MUON/Calib/Config entry for current run ! That's not OK !");
86 return kTRUE;
87 }
88 AliMUONVStore* oldConfig = dynamic_cast<AliMUONVStore*>(entry->GetObject());
89 if (!oldConfig)
90 {
91 AliError("Could not get MUON/Calib/Config object for current run (wrong type ?) ! That's not OK !");
92 return kTRUE;
93 }
94
95 if ( oldConfig->GetSize() != newConfig.GetSize() )
96 {
97 return kTRUE;
98 }
99
100 TIter next(oldConfig->CreateIterator());
101 AliMUONVCalibParam* old;
102
103 while ( ( old = static_cast<AliMUONVCalibParam*>(next()) ) )
104 {
105 Int_t detElemId = old->ID0();
106 Int_t manuId = old->ID1();
107
108 if ( ! newConfig.FindObject(detElemId,manuId) )
109 {
110 // not found in new. Configurations are different. Return right now.
111 return kTRUE;
112 }
113 }
114
115 // all tests OK. Configuration has not changed.
116 return kFALSE;
117}
118
119
120//_____________________________________________________________________________
6c870207 121Bool_t
ea199e33 122AliMUONPedestalSubprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
123{
124 /// When starting a new run, reads in the pedestals ASCII files.
125
126 const Int_t kSystem = AliMUONPreprocessor::kDAQ;
127 const char* kId = "PEDESTALS";
128
129 delete fPedestals;
130 fPedestals = new AliMUON2DMap(kTRUE);
131
6c870207 132 delete fConfig;
133 fConfig = new AliMUON2DMap(kTRUE);
134
d2db856e 135 Master()->Log(Form("Reading pedestal files for Run %d startTime %ld endTime %ld",
136 run,startTime,endTime));
ea199e33 137
138 TList* sources = Master()->GetFileSources(kSystem,kId);
139 TIter next(sources);
140 TObjString* o(0x0);
703d8257 141 Int_t n(0);
6c870207 142 Int_t npedFiles(0);
703d8257 143
ea199e33 144 while ( ( o = static_cast<TObjString*>(next()) ) )
145 {
146 TString fileName(Master()->GetFile(kSystem,kId,o->GetName()));
6c870207 147 Int_t ok = ReadPedestalFile(fileName.Data());
81028269 148 if (ok>0)
703d8257 149 {
150 n += ok;
6c870207 151 ++npedFiles;
703d8257 152 }
153 }
6c870207 154
155 delete sources;
703d8257 156
157 if (!n)
158 {
159 Master()->Log("Failed to read any pedestals");
160 delete fPedestals;
161 fPedestals = 0;
6c870207 162 delete fConfig;
163 fConfig = 0;
164 return kFALSE;
165 }
166
167 const char* kIdConf = "CONFIG";
168
169 sources = Master()->GetFileSources(kSystem,kIdConf);
170 TIter nextConf(sources);
171 Int_t nconf(0);
172 Int_t nconfFiles(0);
173
6c870207 174 while ( ( o = static_cast<TObjString*>(nextConf()) ) )
175 {
176 TString fileName(Master()->GetFile(kSystem,kIdConf,o->GetName()));
177 Int_t ok = ReadConfigFile(fileName.Data());
178 if (ok>0)
179 {
180 nconf += ok;
181 ++nconfFiles;
182 }
ea199e33 183 }
6c870207 184
ea199e33 185 delete sources;
6c870207 186
187 if ( npedFiles != nconfFiles )
188 {
189 Master()->Log(Form("ERROR : Number of config files (%d) different from number of pedestal files (%d)",nconfFiles,npedFiles));
190 delete fPedestals;
191 fPedestals = 0;
192 delete fConfig;
193 fConfig = 0;
194 return kFALSE;
195 }
196
042cd64e 197 fConfigChanged = HasConfigChanged(*fConfig);
ceecdad2 198
6c870207 199 return kTRUE;
ea199e33 200}
201
202//_____________________________________________________________________________
203UInt_t
204AliMUONPedestalSubprocessor::Process(TMap* /*dcsAliasMap*/)
205{
71a2d3aa 206 /// Store the pedestals into the CDB
ea199e33 207
6c870207 208 if (!fPedestals || !fConfig)
a8f77ca0 209 {
6c870207 210 // this is the only reason to fail for the moment : getting no pedestal or no config
a8f77ca0 211 // at all.
d489129d 212 return 1;
a8f77ca0 213 }
703d8257 214
a8f77ca0 215 AliMUON2DStoreValidator validator;
216
217 Master()->Log("Validating");
218
6c870207 219 TObjArray* chambers = validator.Validate(*fPedestals,fConfig);
a8f77ca0 220
221 if (chambers)
222 {
223 // we hereby report what's missing, but this is not a reason to fail ;-)
224 // the only reason to fail would be if we got no pedestal at all
225 TList lines;
226 lines.SetOwner(kTRUE);
227
228 validator.Report(lines,*chambers);
229
230 TIter next(&lines);
231 TObjString* line;
232
233 while ( ( line = static_cast<TObjString*>(next()) ) )
234 {
235 Master()->Log(line->String().Data());
236 }
237 }
238
6c870207 239 Master()->Log("Storing pedestals...");
240 if ( fConfigChanged )
241 {
242 Master()->Log("...and configuration, as it has changed");
243 }
ea199e33 244
245 AliCDBMetaData metaData;
246 metaData.SetBeamPeriod(0);
247 metaData.SetResponsible("MUON TRK");
d3231306 248 TString comment("Computed by AliMUONPedestalSubprocessor $Id$");
249 comment.ReplaceAll("$","");
250 metaData.SetComment(comment.Data());
ea199e33 251
3b32651c 252 Bool_t validToInfinity = kTRUE;
d489129d 253 Bool_t result = Master()->Store("Calib", "Pedestals", fPedestals, &metaData, 0, validToInfinity);
6c870207 254 if ( fConfigChanged )
255 {
256 result = result && Master()->Store("Calib", "Config", fConfig, &metaData, 0, validToInfinity);
257 }
d489129d 258 return ( result != kTRUE ); // return 0 if everything is ok.
ea199e33 259}
260
261//_____________________________________________________________________________
703d8257 262Int_t
6c870207 263AliMUONPedestalSubprocessor::ReadPedestalFile(const char* filename)
ea199e33 264{
71a2d3aa 265 /// Read the pedestals from an ASCII file. \n
266 /// Format of that file is one line per channel : \n
267 ///-------------------------------------------------------------------------\n
268 /// BUS_PATCH MANU_ADDR CHANNEL MEAN SIGMA \n
269 ///-------------------------------------------------------------------------\n
270 /// \n
271 /// Return kFALSE if reading was not successfull. \n
272 ///
ea199e33 273
d2db856e 274 TString sFilename(gSystem->ExpandPathName(filename));
ea199e33 275
d2db856e 276 Master()->Log(Form("Reading %s",sFilename.Data()));
ea199e33 277
81028269 278 Int_t n = AliMUONTrackerIO::ReadPedestals(sFilename.Data(),*fPedestals);
ea199e33 279
81028269 280 switch (n)
ea199e33 281 {
81028269 282 case -1:
283 Master()->Log(Form("Could not open %s",sFilename.Data()));
284 break;
ea199e33 285 }
2a7274d9 286
703d8257 287 return n;
ea199e33 288}
289
6c870207 290//_____________________________________________________________________________
291Int_t
292AliMUONPedestalSubprocessor::ReadConfigFile(const char* filename)
293{
294 /// Read the configuration from an ASCII file.
295 /// Format of that file is one line per manu :
296 /// BUS_PATCH MANU_ADDR
6c870207 297 /// Return kFALSE if reading was not successfull.
298 ///
299
300 TString sFilename(gSystem->ExpandPathName(filename));
301
302 Master()->Log(Form("Reading %s",sFilename.Data()));
303
042cd64e 304 Int_t n = AliMUONTrackerIO::ReadConfig(sFilename.Data(),*fConfig);
6c870207 305
306 switch (n)
307 {
308 case -1:
309 Master()->Log(Form("Could not open %s",sFilename.Data()));
310 break;
311 }
312
313 return n;
314}
315
ea199e33 316
317//_____________________________________________________________________________
318void
319AliMUONPedestalSubprocessor::Print(Option_t* opt) const
320{
321 /// ouput to screen
8d8e920c 322 if (fPedestals) fPedestals->Print("",opt);
6c870207 323 if (fConfig) fConfig->Print("",opt);
ea199e33 324}
6c870207 325