]>
Commit | Line | Data |
---|---|---|
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 | |
52 | ClassImp(AliMUONPedestalSubprocessor) | |
53 | /// \endcond | |
54 | ||
55 | //_____________________________________________________________________________ | |
56 | AliMUONPedestalSubprocessor::AliMUONPedestalSubprocessor(AliMUONPreprocessor* master) | |
57 | : AliMUONVSubprocessor(master, | |
58 | "Pedestals", | |
59 | "Upload MUON Tracker pedestals to OCDB"), | |
6c870207 | 60 | fPedestals(0x0), |
61 | fConfig(0x0), | |
62 | fConfigChanged(kFALSE) | |
ea199e33 | 63 | { |
71a2d3aa | 64 | /// default ctor |
ea199e33 | 65 | } |
66 | ||
67 | //_____________________________________________________________________________ | |
68 | AliMUONPedestalSubprocessor::~AliMUONPedestalSubprocessor() | |
69 | { | |
71a2d3aa | 70 | /// dtor |
ea199e33 | 71 | delete fPedestals; |
6c870207 | 72 | delete fConfig; |
ea199e33 | 73 | } |
74 | ||
042cd64e | 75 | //_____________________________________________________________________________ |
76 | Bool_t | |
77 | AliMUONPedestalSubprocessor::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 | ||
ea199e33 | 120 | //_____________________________________________________________________________ |
6c870207 | 121 | Bool_t |
ea199e33 | 122 | AliMUONPedestalSubprocessor::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 | //_____________________________________________________________________________ | |
203 | UInt_t | |
204 | AliMUONPedestalSubprocessor::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 | 262 | Int_t |
6c870207 | 263 | AliMUONPedestalSubprocessor::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 | //_____________________________________________________________________________ |
291 | Int_t | |
292 | AliMUONPedestalSubprocessor::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 | //_____________________________________________________________________________ | |
318 | void | |
319 | AliMUONPedestalSubprocessor::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 |