]>
Commit | Line | Data |
---|---|---|
54472e4f | 1 | /************************************************************************** |
2 | * Copyright(c) 2007, 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 | ||
72df5829 | 16 | |
54472e4f | 17 | #include "AliTPCPreprocessor.h" |
a7dce0bc | 18 | #include "AliShuttleInterface.h" |
54472e4f | 19 | |
20 | #include "AliCDBMetaData.h" | |
21 | #include "AliDCSValue.h" | |
22 | #include "AliLog.h" | |
23 | #include "AliTPCSensorTempArray.h" | |
a7dce0bc | 24 | #include "AliTPCROC.h" |
25 | #include "AliTPCCalROC.h" | |
26 | #include "AliTPCCalPad.h" | |
27 | #include "AliTPCCalibPedestal.h" | |
9e66a8dd | 28 | #include "TFile.h" |
7b54c8e9 | 29 | #include "TTree.h" |
30 | #include "TEnv.h" | |
54472e4f | 31 | |
32 | #include <TTimeStamp.h> | |
33 | ||
a7dce0bc | 34 | const Int_t kValCutTemp = 100; // discard temperatures > 100 degrees |
35 | const Int_t kDiffCutTemp = 5; // discard temperature differences > 5 degrees | |
36 | const TString kPedestalRunType = "PEDESTAL_RUN"; // pedestal run identifier | |
72df5829 | 37 | |
54472e4f | 38 | // |
39 | // This class is the SHUTTLE preprocessor for the TPC detector. | |
f7f602cc | 40 | // It contains several components, this far the part containing |
54472e4f | 41 | // temperatures is implemented |
42 | // | |
43 | ||
44 | ClassImp(AliTPCPreprocessor) | |
45 | ||
46 | //______________________________________________________________________________________________ | |
6d07bf74 | 47 | AliTPCPreprocessor::AliTPCPreprocessor(AliShuttleInterface* shuttle) : |
48 | AliPreprocessor("TPC",shuttle), | |
7b54c8e9 | 49 | fConfEnv(0), fTemp(0), fPressure(0), fConfigOK(kTRUE), fROC(0) |
54472e4f | 50 | { |
51 | // constructor | |
a7dce0bc | 52 | fROC = AliTPCROC::Instance(); |
54472e4f | 53 | } |
72df5829 | 54 | //______________________________________________________________________________________________ |
55 | // AliTPCPreprocessor::AliTPCPreprocessor(const AliTPCPreprocessor& org) : | |
56 | // AliPreprocessor(org), | |
7b54c8e9 | 57 | // fConfEnv(0), fTemp(0), fPressure(0), fConfigOK(kTRUE) |
72df5829 | 58 | // { |
59 | // // copy constructor not implemented | |
f7f602cc | 60 | // // -- missing underlying copy constructor in AliPreprocessor |
61 | // | |
72df5829 | 62 | // Fatal("AliTPCPreprocessor", "copy constructor not implemented"); |
f7f602cc | 63 | // |
64 | // // fTemp = new AliTPCSensorTempArray(*(org.fTemp)); | |
72df5829 | 65 | // } |
54472e4f | 66 | |
67 | //______________________________________________________________________________________________ | |
68 | AliTPCPreprocessor::~AliTPCPreprocessor() | |
69 | { | |
70 | // destructor | |
a7dce0bc | 71 | |
54472e4f | 72 | delete fTemp; |
18eade96 | 73 | delete fPressure; |
54472e4f | 74 | } |
72df5829 | 75 | //______________________________________________________________________________________________ |
76 | AliTPCPreprocessor& AliTPCPreprocessor::operator = (const AliTPCPreprocessor& ) | |
77 | { | |
78 | Fatal("operator =", "assignment operator not implemented"); | |
79 | return *this; | |
80 | } | |
81 | ||
54472e4f | 82 | |
83 | //______________________________________________________________________________________________ | |
84 | void AliTPCPreprocessor::Initialize(Int_t run, UInt_t startTime, | |
85 | UInt_t endTime) | |
86 | { | |
87 | // Creates AliTestDataDCS object | |
88 | ||
89 | AliPreprocessor::Initialize(run, startTime, endTime); | |
90 | ||
91 | AliInfo(Form("\n\tRun %d \n\tStartTime %s \n\tEndTime %s", run, | |
92 | TTimeStamp(startTime).AsString(), | |
93 | TTimeStamp(endTime).AsString())); | |
94 | ||
7b54c8e9 | 95 | // Preprocessor configuration |
96 | ||
37092b2b | 97 | AliCDBEntry* entry = GetFromOCDB("Config", "Preprocessor"); |
7b54c8e9 | 98 | if (entry) fConfEnv = (TEnv*) entry->GetObject(); |
99 | if ( fConfEnv==0 ) { | |
7b54c8e9 | 100 | Log("AliTPCPreprocsessor: Preprocessor Config OCDB entry missing.\n"); |
37092b2b | 101 | fConfigOK = kFALSE; |
102 | return; | |
7b54c8e9 | 103 | } |
104 | ||
18eade96 | 105 | // Temperature sensors |
106 | ||
f7f602cc | 107 | TTree *confTree = 0; |
7b54c8e9 | 108 | entry = GetFromOCDB("Config", "Temperature"); |
f7f602cc | 109 | if (entry) confTree = (TTree*) entry->GetObject(); |
18eade96 | 110 | if ( confTree==0 ) { |
18eade96 | 111 | Log("AliTPCPreprocsessor: Temperature Config OCDB entry missing.\n"); |
112 | fConfigOK = kFALSE; | |
f7f602cc | 113 | return; |
18eade96 | 114 | } |
115 | fTemp = new AliTPCSensorTempArray(fStartTime, fEndTime, confTree); | |
116 | fTemp->SetValCut(kValCutTemp); | |
117 | fTemp->SetDiffCut(kDiffCutTemp); | |
f7f602cc | 118 | |
18eade96 | 119 | // Pressure sensors |
f7f602cc | 120 | |
a7dce0bc | 121 | confTree=0; |
f7f602cc | 122 | entry=0; |
a7dce0bc | 123 | entry = GetFromOCDB("Config", "Pressure"); |
f7f602cc | 124 | if (entry) confTree = (TTree*) entry->GetObject(); |
18eade96 | 125 | if ( confTree==0 ) { |
18eade96 | 126 | Log("AliTPCPreprocsessor: Pressure Config OCDB entry missing.\n"); |
127 | fConfigOK = kFALSE; | |
f7f602cc | 128 | return; |
18eade96 | 129 | } |
130 | fPressure = new AliDCSSensorArray(fStartTime, fEndTime, confTree); | |
18eade96 | 131 | |
54472e4f | 132 | } |
133 | ||
134 | //______________________________________________________________________________________________ | |
135 | UInt_t AliTPCPreprocessor::Process(TMap* dcsAliasMap) | |
136 | { | |
137 | // Fills data into TPC calibrations objects | |
138 | ||
54472e4f | 139 | // Amanda servers provide information directly through dcsAliasMap |
140 | ||
a7dce0bc | 141 | if (!dcsAliasMap) return 9; |
7b54c8e9 | 142 | if (dcsAliasMap->GetEntries() == 0 ) return 9; |
a7dce0bc | 143 | if (!fConfigOK) return 9; |
144 | ||
145 | TString runType = GetRunType(); | |
146 | ||
54472e4f | 147 | // Temperature sensors are processed by AliTPCCalTemp |
72df5829 | 148 | |
18eade96 | 149 | |
54472e4f | 150 | UInt_t tempResult = MapTemperature(dcsAliasMap); |
151 | UInt_t result=tempResult; | |
18eade96 | 152 | |
153 | // Pressure sensors | |
154 | ||
155 | UInt_t pressureResult = MapPressure(dcsAliasMap); | |
156 | result += pressureResult; | |
f7f602cc | 157 | |
54472e4f | 158 | // Other calibration information will be retrieved through FXS files |
a7dce0bc | 159 | // examples: |
54472e4f | 160 | // TList* fileSourcesDAQ = GetFile(AliShuttleInterface::kDAQ, "pedestals"); |
161 | // const char* fileNamePed = GetFile(AliShuttleInterface::kDAQ, "pedestals", "LDC1"); | |
162 | // | |
163 | // TList* fileSourcesHLT = GetFile(AliShuttleInterface::kHLT, "calib"); | |
164 | // const char* fileNameHLT = GetFile(AliShuttleInterface::kHLT, "calib", "LDC1"); | |
165 | ||
166 | ||
a7dce0bc | 167 | if(runType == kPedestalRunType) { |
7b54c8e9 | 168 | Int_t pedestalSource = AliShuttleInterface::kDAQ; |
169 | TString source = fConfEnv->GetValue("Pedestal","DAQ"); | |
170 | source.ToUpper(); | |
171 | if ( source == "HLT" ) pedestalSource = AliShuttleInterface::kHLT; | |
172 | UInt_t pedestalResult = ExtractPedestals(pedestalSource); | |
a7dce0bc | 173 | result += pedestalResult; |
7b54c8e9 | 174 | |
a7dce0bc | 175 | } |
176 | ||
177 | ||
54472e4f | 178 | return result; |
179 | } | |
180 | //______________________________________________________________________________________________ | |
181 | UInt_t AliTPCPreprocessor::MapTemperature(TMap* dcsAliasMap) | |
182 | { | |
183 | ||
184 | // extract DCS temperature maps. Perform fits to save space | |
185 | ||
72df5829 | 186 | UInt_t result=0; |
54472e4f | 187 | TMap *map = fTemp->ExtractDCS(dcsAliasMap); |
188 | if (map) { | |
189 | fTemp->MakeSplineFit(map); | |
190 | AliInfo(Form("Temperature values extracted, fits performed.\n")); | |
191 | } else { | |
54472e4f | 192 | Log("AliTPCPreprocsessor: no temperature map extracted. \n"); |
72df5829 | 193 | result=9; |
54472e4f | 194 | } |
195 | delete map; | |
196 | // Now store the final CDB file | |
a7dce0bc | 197 | |
198 | if ( result == 0 ) { | |
72df5829 | 199 | AliCDBMetaData metaData; |
54472e4f | 200 | metaData.SetBeamPeriod(0); |
201 | metaData.SetResponsible("Haavard Helstrup"); | |
202 | metaData.SetComment("Preprocessor AliTPC data base entries."); | |
203 | ||
a7dce0bc | 204 | Bool_t storeOK = Store("Calib", "Temperature", fTemp, &metaData, 0, kFALSE); |
205 | if ( !storeOK ) result=1; | |
206 | ||
72df5829 | 207 | } |
54472e4f | 208 | |
209 | return result; | |
7b54c8e9 | 210 | |
54472e4f | 211 | } |
18eade96 | 212 | //______________________________________________________________________________________________ |
7b54c8e9 | 213 | |
18eade96 | 214 | UInt_t AliTPCPreprocessor::MapPressure(TMap* dcsAliasMap) |
215 | { | |
216 | ||
217 | // extract DCS temperature maps. Perform fits to save space | |
218 | ||
219 | UInt_t result=0; | |
220 | TMap *map = fPressure->ExtractDCS(dcsAliasMap); | |
221 | if (map) { | |
222 | fPressure->MakeSplineFit(map); | |
223 | AliInfo(Form("Pressure values extracted, fits performed.\n")); | |
224 | } else { | |
18eade96 | 225 | Log("AliTPCPreprocsessor: no atmospheric pressure map extracted. \n"); |
226 | result=9; | |
227 | } | |
228 | delete map; | |
229 | // Now store the final CDB file | |
a7dce0bc | 230 | |
231 | if ( result == 0 ) { | |
18eade96 | 232 | AliCDBMetaData metaData; |
233 | metaData.SetBeamPeriod(0); | |
234 | metaData.SetResponsible("Haavard Helstrup"); | |
235 | metaData.SetComment("Preprocessor AliTPC data base entries."); | |
236 | ||
a7dce0bc | 237 | Bool_t storeOK = Store("Calib", "Pressure", fPressure, &metaData, 0, 0); |
238 | if ( !storeOK ) result=1; | |
239 | ||
18eade96 | 240 | } |
241 | ||
242 | return result; | |
7b54c8e9 | 243 | |
18eade96 | 244 | } |
7b54c8e9 | 245 | |
246 | ||
a7dce0bc | 247 | //______________________________________________________________________________________________ |
7b54c8e9 | 248 | |
249 | UInt_t AliTPCPreprocessor::ExtractPedestals(Int_t sourceFXS) | |
a7dce0bc | 250 | { |
251 | // | |
252 | // Read pedestal file from file exchage server | |
253 | // Keep original entry from OCDB in case no new pedestals are available | |
254 | // | |
255 | AliTPCCalPad *calPadPed=0; | |
256 | AliCDBEntry* entry = GetFromOCDB("Calib", "Pedestals"); | |
257 | if (entry) calPadPed = (AliTPCCalPad*)entry->GetObject(); | |
258 | if ( calPadPed==NULL ) { | |
a7dce0bc | 259 | Log("AliTPCPreprocsessor: No previous TPC pedestal entry available.\n"); |
7b54c8e9 | 260 | calPadPed = new AliTPCCalPad("PedestalsMean","PedestalsMean"); |
261 | } | |
262 | ||
263 | AliTPCCalPad *calPadRMS=0; | |
264 | entry = GetFromOCDB("Calib", "Noise"); | |
265 | if (entry) calPadRMS = (AliTPCCalPad*)entry->GetObject(); | |
266 | if ( calPadRMS==NULL ) { | |
7b54c8e9 | 267 | Log("AliTPCPreprocsessor: No previous TPC noise entry available.\n"); |
268 | calPadRMS = new AliTPCCalPad("PedestalsRMS","PedestalsRMS"); | |
a7dce0bc | 269 | } |
270 | ||
7b54c8e9 | 271 | |
a7dce0bc | 272 | UInt_t result=0; |
273 | ||
274 | Int_t nSectors = fROC->GetNSectors(); | |
7b54c8e9 | 275 | TList* list = GetFileSources(sourceFXS,"pedestals"); |
a7dce0bc | 276 | if (list) { |
277 | ||
278 | // loop through all files from LDCs | |
279 | ||
280 | UInt_t index = 0; | |
281 | while (list->At(index)!=NULL) { | |
282 | TObjString* fileNameEntry = (TObjString*) list->At(index); | |
283 | if (fileNameEntry!=NULL) { | |
7b54c8e9 | 284 | TString fileName = GetFile(sourceFXS, "pedestals", |
a7dce0bc | 285 | fileNameEntry->GetString().Data()); |
286 | TFile *f = TFile::Open(fileName); | |
287 | AliTPCCalibPedestal *calPed; | |
288 | f->GetObject("AliTPCCalibPedestal",calPed); | |
289 | ||
290 | // replace entries for the sectors available in the present file | |
291 | ||
c9c23d80 | 292 | for (Int_t sector=0; sector<nSectors; sector++) { |
7b54c8e9 | 293 | AliTPCCalROC *rocPed=calPed->GetCalRocPedestal(sector, kFALSE); |
294 | if ( rocPed ) calPadPed->SetCalROC(rocPed,sector); | |
295 | AliTPCCalROC *rocRMS=calPed->GetCalRocRMS(sector, kFALSE); | |
296 | if ( rocRMS ) calPadRMS->SetCalROC(rocRMS,sector); | |
a7dce0bc | 297 | } |
298 | } | |
299 | ++index; | |
300 | } // while(list) | |
301 | // | |
302 | // Store updated pedestal entry to OCDB | |
303 | // | |
304 | AliCDBMetaData metaData; | |
305 | metaData.SetBeamPeriod(0); | |
306 | metaData.SetResponsible("Haavard Helstrup"); | |
307 | metaData.SetComment("Preprocessor AliTPC data base entries."); | |
308 | ||
309 | Bool_t storeOK = Store("Calib", "Pedestals", calPadPed, &metaData, 0, kTRUE); | |
7b54c8e9 | 310 | if ( !storeOK ) ++result; |
311 | storeOK = Store("Calib", "PadNoise", calPadRMS, &metaData, 0, kTRUE); | |
312 | if ( !storeOK ) ++result; | |
313 | ||
314 | } | |
a7dce0bc | 315 | |
a7dce0bc | 316 | return result; |
317 | } | |
7b54c8e9 | 318 | |
319 | //______________________________________________________________________________________________ | |
320 | ||
321 |