]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/STEER/AliGRPPreprocessor.cxx
implemented new LHCData records storage, added option to skip missing records in...
[u/mrichter/AliRoot.git] / STEER / STEER / AliGRPPreprocessor.cxx
CommitLineData
33c82fbf 1/**************************************************************************
3dedb44a 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
7ca4655f 16/* $Id$ */
17
3dedb44a 18//-------------------------------------------------------------------------
19// Class AliGRPPreprocessor
20// Global Run Parameters (GRP) preprocessor
21// Origin: Panos Christakoglou, UOA-CERN, Panos.Christakoglou@cern.ch
e7a6790f 22// Modified: Ernesto.Lopez.Torres@cern.ch CEADEN-CERN
e75e6e01 23// Modified: Chiara.Zampolli@cern.ch CERN
3dedb44a 24//-------------------------------------------------------------------------
25
836d8b4f 26#include <TChain.h>
7ca4655f 27#include <TList.h>
28#include <TMap.h>
2930278d 29#include <THashList.h>
7ca4655f 30#include <TObjString.h>
c5340e82 31#include <TObjArray.h>
44e45fac 32#include <TGraph.h>
c5340e82 33#include <TString.h>
6a150f83 34#include <TFile.h>
ef6fb101 35#include <TPRegexp.h>
f880d5b9 36#include <Bytes.h>
7ca4655f 37
fe726709 38#include <float.h>
39
3dedb44a 40#include "AliGRPPreprocessor.h"
44e45fac 41#include "AliGRPObject.h"
42#include "AliDCSSensor.h"
43#include "AliSplineFit.h"
17984b61 44#include "AliDCSSensorArray.h"
ea4a87ee 45#include "AliRawEventHeaderVersions.h"
3dedb44a 46
48b1b444 47#include "AliTriggerConfiguration.h"
48#include "AliTriggerRunScalers.h"
6ecb073a 49#include "AliTriggerInput.h"
48b1b444 50
3dedb44a 51#include "AliCDBMetaData.h"
6a150f83 52#include "AliESDVertex.h"
0254e751 53#include "AliLHCReader.h"
54#include "AliLHCData.h"
55#include "AliDCSArray.h"
6ecb073a 56#include "AliDAQ.h"
57#include "AliLTUConfig.h"
59fef0d0 58#include "AliQAThresholds.h"
3dedb44a 59
ac152fdd 60class AliLog;
3dedb44a 61class AliDCSValue;
62class AliShuttleInterface;
63
1e27bb6b 64// needed for ReceivePromptRecoParameters
39e3007b 65
1e27bb6b 66#include <TSQLServer.h>
67#include <TSQLResult.h>
68#include <TSQLRow.h>
69#include <AliCDBManager.h>
70#include <AliCDBMetaData.h>
71#include <AliCDBId.h>
26fd9395 72#include <AliTriggerConfiguration.h>
d54ad8d4 73#include "AliCTPTimeParams.h"
74#include "AliLHCClockPhase.h"
1e27bb6b 75
66b0310c 76using std::ifstream;
eae7586f 77ClassImp(AliGRPPreprocessor)
17984b61 78
ef6fb101 79
eae7586f 80const Double_t kFitFraction = -1.; // Fraction of DCS sensor fits required
3dedb44a 81
17984b61 82//_______________________________________________________________
44e45fac 83
e3a2ac48 84 const Int_t AliGRPPreprocessor::fgknDAQLbPar = 6; // num parameters in the logbook used to fill the GRP object
0254e751 85 const Int_t AliGRPPreprocessor::fgknDCSDP = 48; // number of dcs dps
39e3007b 86 const Int_t AliGRPPreprocessor::fgknDCSDPHallProbes = 40; // number of dcs dps
26fd9395 87 const Int_t AliGRPPreprocessor::fgknLHCDP = 9; // number of dcs dps from LHC data
4bb7c769 88 const Int_t AliGRPPreprocessor::fgkDCSDPHallTopShift = 4; // shift from the top to get tp the Hall Probes names in the list of DCS DPs
9fae6417 89 const Int_t AliGRPPreprocessor::fgkDCSDPNonWorking = 5; // number of non working DCS DPs
e7a6790f 90 const char* AliGRPPreprocessor::fgkDCSDataPoints[AliGRPPreprocessor::fgknDCSDP] = {
e7a6790f 91 "L3Polarity",
92 "DipolePolarity",
e7a6790f 93 "L3Current",
94 "DipoleCurrent",
44e45fac 95 "L3_BSF17_H1",
96 "L3_BSF17_H2",
97 "L3_BSF17_H3",
98 "L3_BSF17_Temperature",
99 "L3_BSF4_H1",
100 "L3_BSF4_H2",
101 "L3_BSF4_H3",
102 "L3_BSF4_Temperature",
103 "L3_BKF17_H1",
104 "L3_BKF17_H2",
105 "L3_BKF17_H3",
106 "L3_BKF17_Temperature",
107 "L3_BKF4_H1",
108 "L3_BKF4_H2",
109 "L3_BKF4_H3",
110 "L3_BKF4_Temperature",
111 "L3_BSF13_H1",
112 "L3_BSF13_H2",
113 "L3_BSF13_H3",
114 "L3_BSF13_Temperature",
115 "L3_BSF8_H1",
116 "L3_BSF8_H2",
117 "L3_BSF8_H3",
118 "L3_BSF8_Temperature",
119 "L3_BKF13_H1",
120 "L3_BKF13_H2",
121 "L3_BKF13_H3",
122 "L3_BKF13_Temperature",
123 "L3_BKF8_H1",
124 "L3_BKF8_H2",
125 "L3_BKF8_H3",
126 "L3_BKF8_Temperature",
127 "Dipole_Inside_H1",
128 "Dipole_Inside_H2",
129 "Dipole_Inside_H3",
130 "Dipole_Inside_Temperature",
131 "Dipole_Outside_H1",
132 "Dipole_Outside_H2",
133 "Dipole_Outside_H3",
134 "Dipole_Outside_Temperature",
e7a6790f 135 "CavernTemperature",
136 "CavernAtmosPressure",
ce996d13 137 "SurfaceAtmosPressure",
3343d11b 138 "CavernAtmosPressure2"
e7a6790f 139 };
44e45fac 140
39e3007b 141 const char* AliGRPPreprocessor::fgkDCSDataPointsHallProbes[AliGRPPreprocessor::fgknDCSDPHallProbes] = {
44e45fac 142 "L3_BSF17_H1",
143 "L3_BSF17_H2",
144 "L3_BSF17_H3",
145 "L3_BSF17_Temperature",
146 "L3_BSF4_H1",
147 "L3_BSF4_H2",
148 "L3_BSF4_H3",
149 "L3_BSF4_Temperature",
150 "L3_BKF17_H1",
151 "L3_BKF17_H2",
152 "L3_BKF17_H3",
153 "L3_BKF17_Temperature",
154 "L3_BKF4_H1",
155 "L3_BKF4_H2",
156 "L3_BKF4_H3",
157 "L3_BKF4_Temperature",
158 "L3_BSF13_H1",
159 "L3_BSF13_H2",
160 "L3_BSF13_H3",
161 "L3_BSF13_Temperature",
162 "L3_BSF8_H1",
163 "L3_BSF8_H2",
164 "L3_BSF8_H3",
165 "L3_BSF8_Temperature",
166 "L3_BKF13_H1",
167 "L3_BKF13_H2",
168 "L3_BKF13_H3",
169 "L3_BKF13_Temperature",
170 "L3_BKF8_H1",
171 "L3_BKF8_H2",
172 "L3_BKF8_H3",
173 "L3_BKF8_Temperature",
174 "Dipole_Inside_H1",
175 "Dipole_Inside_H2",
176 "Dipole_Inside_H3",
177 "Dipole_Inside_Temperature",
178 "Dipole_Outside_H1",
179 "Dipole_Outside_H2",
180 "Dipole_Outside_H3",
3343d11b 181 "Dipole_Outside_Temperature"
44e45fac 182 };
e7a6790f 183
0254e751 184 const Short_t kSensors = 45; // start index position of sensor in DCS DPs
ce996d13 185 const Short_t kNumSensors = 3; // Number of sensors in DCS DPs (CavernAtmosPressure, SurfaceAtmosPressure, CavernAtmosPressure2)
186
e7a6790f 187
0254e751 188 const char* AliGRPPreprocessor::fgkLHCDataPoints[AliGRPPreprocessor::fgknLHCDP] = {
5fb8d1a1 189 "LHC_Beam_Energy",
190 "LHC_MachineMode",
191 "LHC_BeamMode",
da0e365e 192 "LHC_Beams_Particle_Type",
193 "BPTX_Phase_Shift_B1",
53b0ec45 194 "BPTX_Phase_Shift_B2",
195 "LHC_Particle_Type_B1",
26fd9395 196 "LHC_Particle_Type_B2",
197 "LHC_Data_Quality_Flag"
0254e751 198 };
e07d2728 199
e7a6790f 200 const char* kppError[] = {
201 "",
202 "(DAQ logbook ERROR)",
203 "(DAQ FXS ERROR)",
aab08fd4 204 "(Trigger Scalers not found in FXS - ERROR)",
7e1a6c0b 205 "(DCS data points ERROR)",
e75e6e01 206 "(Trigger Configuration ERROR)",
6614fa48 207 "(DAQ logbook ERROR determining partition of the run)",
6a150f83 208 "(CTP timing ERROR)",
0254e751 209 "(SPD Mean Vertex ERROR)",
aab08fd4 210 "(FXS Error for LHC Data)",
da0e365e 211 "(LHC Data Error)",
6ecb073a 212 "(LHC Clock Phase Error (from LHC Data))",
efec19bd 213 "(LTU Configuration Error)",
2c90b4df 214 "(DQM Failure)",
215 "(Trigger Aliases wrong or not found in DCS FXS - ERROR)"
e7a6790f 216 };
17984b61 217
3dedb44a 218//_______________________________________________________________
44e45fac 219
3dedb44a 220AliGRPPreprocessor::AliGRPPreprocessor(AliShuttleInterface* shuttle):
c5340e82 221 AliPreprocessor("GRP",shuttle), fPressure(0), fmaxFloat(0), fminFloat(0),fmaxDouble(0), fminDouble(0), fmaxInt(0), fminInt(0), fmaxUInt(0), fminUInt(0),fdaqStartEndTimeOk(kTRUE),ffailedDPs(new TObjArray(fgknDCSDP))
e7a6790f 222{
44e45fac 223 // constructor - shuttle must be instantiated!
ad103e84 224
7eaa854b 225 AddRunType("COSMIC");
226 AddRunType("LASER");
44e45fac 227 AddRunType("PHYSICS");
c2ad5069 228 AddRunType("CALIBRATION_BC");
229 AddRunType("CALIBRATION_CENTRAL");
230 AddRunType("CALIBRATION_EMD");
231 AddRunType("CALIBRATION_MB");
232 AddRunType("CALIBRATION_SEMICENTRAL");
69bf9b19 233 AddRunType("CALIBRATION");
234 AddRunType("PEDESTAL");
7be24dea 235 AddRunType("STANDALONE");
236 AddRunType("GAIN");
3242245e 237 AddRunType("NOISE");
238 AddRunType("PULSER");
b7a928fe 239 AddRunType("STANDALONE_PULSER");
52439816 240 AddRunType("STANDALONE_BC");
fe726709 241
242 fmaxFloat = FLT_MAX;
243 fminFloat = -FLT_MAX;
244 fmaxDouble = DBL_MAX;
245 fminDouble = -DBL_MAX;
246 fmaxInt = kMaxInt;
247 fminInt = kMinInt;
248 fmaxUInt = kMaxUInt;
249 fminUInt = 0;
250
251 AliInfo(Form("Max allowed float = %6.5e",fmaxFloat));
252 AliInfo(Form("Min allowed float = %6.5e",fminFloat));
253 AliInfo(Form("Max allowed double = %6.5e",fmaxDouble));
254 AliInfo(Form("Min allowed double = %6.5e",fminDouble));
255 AliInfo(Form("Max allowed integer = %d",fmaxInt));
256 AliInfo(Form("Min allowed integer = %d",fminInt));
257 AliInfo(Form("Max allowed unsigned integer = %u",(Int_t)fmaxUInt));
258 AliInfo(Form("Min allowed unsigned integer = %u",(Int_t)fminUInt));
259
c5340e82 260 ffailedDPs->SetOwner(kTRUE);
3dedb44a 261}
262
263//_______________________________________________________________
44e45fac 264
e7a6790f 265AliGRPPreprocessor::~AliGRPPreprocessor()
266{
44e45fac 267 //destructor
268
269 delete fPressure;
c5340e82 270 delete ffailedDPs;
271
3dedb44a 272}
273
274//_______________________________________________________________
44e45fac 275
e7a6790f 276void AliGRPPreprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
277{
ce996d13 278 // Initialize preprocessor
17984b61 279
ce996d13 280 AliPreprocessor::Initialize(run, startTime, endTime);
281
282 AliInfo("Initialization of the GRP preprocessor.");
283 AliInfo(Form("Start Time DCS = %d",GetStartTimeDCSQuery()));
284 AliInfo(Form("End Time DCS = %d",GetEndTimeDCSQuery()));
285 TClonesArray * array = new TClonesArray("AliDCSSensor",kNumSensors);
286 for(Int_t j = 0; j < kNumSensors; j++) {
287 AliDCSSensor * sens = new ((*array)[j])AliDCSSensor;
288 sens->SetStringID(fgkDCSDataPoints[j+kSensors]);
289 }
290 AliInfo(Form("Pressure Entries: %d",array->GetEntries()));
291
292 fPressure = new AliDCSSensorArray(GetStartTimeDCSQuery(), GetEndTimeDCSQuery(), array);
c5340e82 293
00ea8709 294 ffailedDPs->Clear(); // cleaning ffailedDPs for current run
c5340e82 295 for (Int_t iDP=0; iDP < fgknDCSDP; iDP++){
296 TObjString* dp = new TObjString(fgkDCSDataPoints[iDP]);
297 ffailedDPs->AddAt(dp,iDP);
298 }
299
3dedb44a 300}
301
302//_______________________________________________________________
44e45fac 303
e7a6790f 304UInt_t AliGRPPreprocessor::Process(TMap* valueMap)
305{
44e45fac 306 // process data retrieved by the Shuttle
307
e75e6e01 308 // retrieving "partition" and "detector" fields from DAQ logbook to
309 // determine the partition in which the run was taken
310 // the partition is used to decide how to react in case of errors for CTP
311
312 TString partition = (TString)GetRunParameter("partition");
313 TString detector = (TString)GetRunParameter("detector");
314
44e45fac 315 AliGRPObject *grpobj = new AliGRPObject(); // object to store data
5cf76849 316 grpobj->SetBeamEnergyIsSqrtSHalfGeV(); // new format
0254e751 317
44e45fac 318 //=================//
319 // DAQ logbook //
320 //=================//
e3a2ac48 321
322 Log("*************** Processing DAQ logbook");
323
44e45fac 324 UInt_t error = 0;
325
e75e6e01 326 Int_t iDaqLB = ProcessDaqLB(grpobj);
327 TString runType = (TString)GetRunType();
328 TString beamType = (TString)GetRunParameter("beamType");
e3a2ac48 329 if(iDaqLB == fgknDAQLbPar) {
330 Log(Form("DAQ Logbook, successful! Retrieved %d/%d entries",iDaqLB,fgknDAQLbPar));
e75e6e01 331 } else {
e3a2ac48 332 Log(Form("DAQ Logbook, could not get all expected entries!!! Retrieved only %d/%d entries",iDaqLB,fgknDAQLbPar));
e75e6e01 333 error |= 1;
334 }
44e45fac 335
336 //=================//
337 // DAQ FXS //
338 //=================//
e3a2ac48 339
340 Log("*************** Processing DAQ FXS");
341
44e45fac 342 UInt_t iDaqFxs = ProcessDaqFxs();
343 if( iDaqFxs == 0 ) {
344 Log(Form("DAQ FXS, successful!"));
345 } else {
346 Log(Form("DAQ FXS, could not store run raw tag file!!!"));
347 error |= 2;
348 }
349
350 //=================//
351 // DCS FXS //
352 //=================//
e3a2ac48 353
354 Log("*************** Processing DCS FXS");
355
e75e6e01 356 UInt_t iDcsFxs = ProcessDcsFxs(partition, detector);
44e45fac 357 if( iDcsFxs == 0 ) {
358 Log(Form("DCS FXS, successful!"));
e75e6e01 359 } else if (iDcsFxs ==1) {
aab08fd4 360 Log(Form("Could not store CTP scalers!!!"));
44e45fac 361 error |= 4;
2c90b4df 362 } else if (iDcsFxs == 2) {
363 Log(Form("Could not store CTP aliases!!!"));
364 error |= 8192;
e75e6e01 365 } else{
366 Log(Form("Incorrect field in DAQ logbook for partition = %s and detector = %s, going into error without CTP scalers...",partition.Data(),detector.Data()));
367 error |= 32;
44e45fac 368 }
369
370 //=================//
371 // DCS data points //
372 //=================//
e3a2ac48 373
374 Log("*************** Processing DCS DPs");
375
7e6f5523 376 Log(Form("Starting DCS Query at %d and finishing at %d",GetStartTimeDCSQuery(),GetEndTimeDCSQuery()));
44e45fac 377 Int_t entries = ProcessDcsDPs( valueMap, grpobj );
9fae6417 378 Log(Form("entries found = %d (should be %d)",entries, fgknDCSDP-fgkDCSDPNonWorking));
5fbf7677 379 if (fdaqStartEndTimeOk){
9fae6417 380 if( entries < fgknDCSDP - fgkDCSDPNonWorking ) { // L3_BSF4_H3, L3_BSF17_H1, L3_BSF17_H2, L3_BSF17_H3, L3_BSF17_Temperature are not working yet...
381 Log(Form("Possible problem with the DCS data points!!! Only %d/%d entries found - Please read further for more details",entries,fgknDCSDP-fgkDCSDPNonWorking));
c5340e82 382 Log(Form("The DPs giving problems were:"));
383 for (Int_t iDP = 0; iDP < fgknDCSDP; iDP++){
384 TObjString *dpString = (TObjString*)ffailedDPs->At(iDP);
385 if (dpString){
386 TString name = dpString->String();
9fae6417 387 if (name != "L3_BSF4_H3" && name != "L3_BSF17_H1" && name != "L3_BSF17_H2" && name != "L3_BSF17_H3" && name != "L3_BSF17_Temperature" ){
c5340e82 388 Log(Form("******** %s ******** not present, but foreseen --> causing an ERROR",name.Data()));
389 }
390 else {
391 Log(Form(" %s is not present, but was not generating any error since it is not ready in DCS - check the other DPs in this list!",name.Data()));
392 }
393 }
394 }
5fbf7677 395 error |= 8;
396 }
397 else Log(Form("DCS data points, successful!"));
398 }
399 else Log(Form("Statistical values for DCS DPs could not be computed due to missing DAQ_time_start and DAQ_time_end fields in DAQ logbook"));
44e45fac 400
401 //=======================//
402 // Trigger Configuration //
403 //=======================//
e75e6e01 404
e3a2ac48 405 Log("*************** Processing Trigger Configuration");
406
44e45fac 407 const char * triggerConf = GetTriggerConfiguration();
e75e6e01 408
409 if (partition.IsNull() && !detector.IsNull()){ // standalone partition
410 Log("STANDALONE partition for current run, using Trigger Configuration dummy value");
411 AliCDBEntry *cdbEntry = GetFromOCDB("CTP","DummyConfig");
412 if (!cdbEntry) {
413 Log(Form("No dummy CTP configuration entry found, going into error..."));
44e45fac 414 error |= 16;
415 }
e75e6e01 416 else{
417 AliTriggerConfiguration *runcfg = (AliTriggerConfiguration*)cdbEntry->GetObject();
418 if (!runcfg){
419 Log(Form("dummy CTP config not found in OCDB entry, going into error..."));
44e45fac 420 error |= 16;
421 }
e75e6e01 422 else {
423 TString titleCTPcfg = Form("CTP cfg for run %i from Dummy entry in OCDB",fRun);
424 runcfg->SetTitle(titleCTPcfg);
425 AliCDBMetaData metaData;
426 metaData.SetResponsible("Roman Lietava");
427 metaData.SetComment("CTP run configuration from dummy entry in OCDB");
428 if (!Store("CTP","Config", runcfg, &metaData, 0, 0)) {
429 Log("Unable to store the dummy CTP run configuration object to OCDB!");
430 error |= 16;
431 }
432 }
44e45fac 433 }
434 }
a453acbf 435
e75e6e01 436 else if (!partition.IsNull() && detector.IsNull()){ // global partition
437 Log("GLOBAL partition for current run, using Trigger Configuration from DAQ Logbook");
438 if (triggerConf!= NULL) {
439 Log("Found trigger configuration in DAQ logbook");
440 AliTriggerConfiguration *runcfg = AliTriggerConfiguration::LoadConfigurationFromString(triggerConf);
44e45fac 441 if (!runcfg) {
e75e6e01 442 Log("Bad CTP run configuration file from DAQ logbook! The corresponding CDB entry will not be filled!");
443 error |= 16;
44e45fac 444 }
445 else {
e75e6e01 446 TString titleCTPcfg = Form("CTP cfg for run %i from DAQ",fRun);
44e45fac 447 runcfg->SetTitle(titleCTPcfg);
448 AliCDBMetaData metaData;
449 metaData.SetBeamPeriod(0);
450 metaData.SetResponsible("Roman Lietava");
e75e6e01 451 metaData.SetComment("CTP run configuration from DAQ logbook");
44e45fac 452 if (!Store("CTP","Config", runcfg, &metaData, 0, 0)) {
453 Log("Unable to store the CTP run configuration object to OCDB!");
454 error |= 16;
455 }
456 }
457 }
e75e6e01 458
459 else {
460 Log("Trigger configuration NULL in DAQ logbook");
461 error |= 16;
462 }
463 }
464
465 else {
466 Log(Form("Incorrect field in DAQ logbook for partition = %s and detector = %s, going into error without trigger configuration...",partition.Data(),detector.Data()));
467 error |= 32;
44e45fac 468 }
e75e6e01 469
6614fa48 470 //===========================//
471 // Trigger Timing Parameters //
472 //===========================//
473
e3a2ac48 474 Log("*************** Processing Trigger Time Params");
6614fa48 475
476 const char * triggerCTPtiming = GetCTPTimeParams();
477
478 if (partition.IsNull() && !detector.IsNull()){ // standalone partition
479 Log("STANDALONE partition for current run, using CTP timing params dummy value");
480 AliCDBEntry *cdbEntry = GetFromOCDB("CTP","DummyCTPtime");
481 if (!cdbEntry) {
482 Log(Form("No dummy CTP timing parameters entry found, going into error..."));
483 error |= 64;
484 }
485 else{
486 AliCTPTimeParams *runCTPtiming = (AliCTPTimeParams*)cdbEntry->GetObject();
487 if (!runCTPtiming){
488 Log(Form("dummy CTP timing parameters not found in OCDB entry, going into error..."));
489 error |= 64;
490 }
491 else {
492 TString titleCTPtiming = Form("CTP timing params for run %i from Dummy entry in OCDB",fRun);
493 runCTPtiming->SetTitle(titleCTPtiming);
494 AliCDBMetaData metadata;
495 metadata.SetResponsible("Roman Lietava");
496 metadata.SetComment("CTP run timing parameters from dummy entry in OCDB");
497 if (!Store("CTP","CTPtiming", runCTPtiming, &metadata, 0, 0)) {
498 Log("Unable to store the dummy CTP timing params object to OCDB!");
499 error |= 64;
500 }
501 }
502 }
503 }
504
505 else if (!partition.IsNull() && detector.IsNull()){ // global partition
506 Log("GLOBAL partition for current run, using Trigger Timing Parameters from DAQ Logbook");
507 if (triggerCTPtiming!= NULL) {
508 Log("Found trigger timing params in DAQ logbook");
509 AliDebug(2,Form("%s",triggerCTPtiming));
dd5ac86b 510 AliCTPTimeParams *runCTPtiming = AliCTPTimeParams::LoadCTPTimeParamsFromString(triggerCTPtiming);
6614fa48 511 if (!runCTPtiming) {
512 Log("Bad CTP trigger timing params file from DAQ logbook! The corresponding CDB entry will not be filled!");
513 error |= 64;
514 }
515 else {
516 TString titleCTPtiming = Form("CTP timing params for run %i from DAQ",fRun);
517 runCTPtiming->SetTitle(titleCTPtiming);
518 AliCDBMetaData metadata;
519 metadata.SetBeamPeriod(0);
520 metadata.SetResponsible("Roman Lietava");
521 metadata.SetComment("CTP timing params from DAQ logbook");
522 if (!Store("CTP","CTPtiming", runCTPtiming, &metadata, 0, 0)) {
523 Log("Unable to store the CTP timing params object to OCDB!");
524 error |= 64;
525 }
526 }
527 }
528
529 else {
530 Log("Trigger timing params NULL in DAQ logbook");
531 error |= 64;
532 }
533 }
534
535 else {
536 Log(Form("Incorrect field in DAQ logbook for partition = %s and detector = %s, going into error without trigger timing parameters...",partition.Data(),detector.Data()));
537 error |= 32;
538 }
e75e6e01 539
6ecb073a 540 //===========================//
541 // LTU Configuration //
542 //===========================//
543
544 Log("*************** Processing LTU Configuration");
545
546 if (partition.IsNull() && !detector.IsNull()){ // standalone partition
6ecb073a 547 Log("STANDALONE partition for current run, using LTU configuration dummy value");
548 AliCDBEntry *cdbEntry = GetFromOCDB("CTP","DummyLTUConfig");
549 if (!cdbEntry) {
550 Log(Form("No dummy LTU Config entry found, going into error..."));
551 error |= 2048;
552 }
553 else{
554 TObjArray *ltuConfig = (TObjArray*)cdbEntry->GetObject();
555 if (!ltuConfig){
556 Log(Form("dummy LTU Config not found in OCDB entry, going into error..."));
557 error |= 2048;
558 }
559 else {
560 AliCDBMetaData metadata;
561 metadata.SetResponsible("Roman Lietava");
562 metadata.SetComment("LTU Config from dummy entry in OCDB");
563 if (!Store("CTP","LTUConfig", ltuConfig, &metadata, 0, 0)) {
564 Log("Unable to store the dummy LTU Config object to OCDB!");
565 error |= 2048;
566 }
567 }
568 }
6ecb073a 569 }
570
571 else if (!partition.IsNull() && detector.IsNull()){ // global partition
572
573 Log("GLOBAL partition for current run, getting LTU Config from DAQ Logbook (logbook_detectors table)");
574 UInt_t detectorMask = (UInt_t)(((TString)GetRunParameter("detectorMask")).Atoi());
575 Printf ("detectormask = %d",detectorMask);
576 TObjArray * ltuarray = new TObjArray();
577 ltuarray->SetOwner(1);
578 Bool_t isLTUok = kTRUE;
579 for(Int_t i = 0; i<AliDAQ::kNDetectors-2; i++){
580 if ((detectorMask >> i) & 0x1) {
581 TString det = AliDAQ::OfflineModuleName(i);
582 TString detCTPName = AliTriggerInput::fgkCTPDetectorName[i];
f3ada855 583 if (detCTPName == "CTP") {
584 detCTPName="TRG"; // converting according to what is found in DAQ logbook_detectors
585 Printf("Processing CTP (CTP Detector name %s) --> SKIPPING, CTP does not have any LTU!!!!!!",detCTPName.Data());
586 continue;
587 }
6ecb073a 588 Printf("Processing detector %s (CTP Detector name %s)",det.Data(),detCTPName.Data());
589 TString* ltu = GetLTUConfig(detCTPName.Data());
590 if (!ltu){
591 Log(Form("No LTU Configuration from DAQ logbook for detector %s (BUT it was expected)! The corresponding CDB entry will not be filled!",detCTPName.Data()));
592 error |= 2048;
593 isLTUok = kFALSE;
594 break;
595 }
596 else{
597 Float_t ltuFineDelay1 = ltu[0].Atof();
598 Float_t ltuFineDelay2 = ltu[1].Atof();
599 Float_t ltuBCDelayAdd = ltu[2].Atof();
600 const char* name = AliDAQ::DetectorName(i);
601 AliLTUConfig* ltuConfig = new AliLTUConfig((UChar_t)AliDAQ::DetectorID(name),ltuFineDelay1,ltuFineDelay2,ltuBCDelayAdd);
602 ltuarray->AddAtAndExpand(ltuConfig,i);
603 }
604 }
605 }
606 if (isLTUok){
607 AliCDBMetaData metadata;
608 metadata.SetBeamPeriod(0);
609 metadata.SetResponsible("Roman Lietava");
610 metadata.SetComment("LTU Configuration for current run");
611 if (!Store("CTP","LTUConfig", ltuarray, &metadata, 0, 0)) {
612 Log("Unable to store the LTU Config object to OCDB!");
613 error |= 2048;
614 }
615 }
24f67180 616 delete ltuarray;
6ecb073a 617 }
618
619 else {
620 Log(Form("Incorrect field in DAQ logbook for partition = %s and detector = %s, going into error without trigger timing parameters...",partition.Data(),detector.Data()));
621 error |= 32;
622 }
623
0254e751 624
625 //=================//
626 // LHC Data //
627 //=================//
628
e07d2728 629 if (runType == "PHYSICS"){ // processing the LHC file only in PHYSICS runs
630 Log("*************** Processing LHC Data");
631
632 UInt_t iLHCData = ProcessLHCData(grpobj);
633
634 if( iLHCData == 0 ) {
aab08fd4 635 Log(Form("LHC Data from FXS, successful!"));
e07d2728 636 } else if (iLHCData == 1) {
aab08fd4 637 Log(Form("LHC Data, problems with FXS!"));
e07d2728 638 error |= 256;
da0e365e 639 } else if (iLHCData == 2) {
640 Log(Form("LHC Data, problems with DAQ_time_start/DAQ_time_end!"));
641 error |= 512;
e07d2728 642 } else if (iLHCData ==3){
da0e365e 643 Log(Form("Problems in storing LHC Phase - going into Error"));
644 error |= 1024;
e07d2728 645 } else if (iLHCData ==4){
da0e365e 646 Log(Form("Problems with LHC Phase - going into Error"));
647 error |= 1024;
e07d2728 648 } else{
649 Log(Form("LHC Data problems"));
650 error |= 512;
651 }
44e45fac 652
e07d2728 653 }
654
6a150f83 655 //==================//
656 // SPD Mean Vertex //
657 //==================//
e3a2ac48 658
659 Log("*************** Processing SPD Mean Vertex");
660
62d2c16a 661 if (runType == "PHYSICS"){
662 UInt_t iSPDMeanVertex = ProcessSPDMeanVertex();
663 if( iSPDMeanVertex == 1 ) {
664 Log(Form("SPD Mean Vertex, successful!"));
665 } else {
666 Log(Form("SPD Mean Vertex failed!!!"));
667 error |= 128;
668 }
6a150f83 669 }
62d2c16a 670 else {
671 Log("SPD Mean Vertex not processed since runType != PHYSICS");
672 }
673
efec19bd 674 //=================//
675 // DQM FXS //
676 //=================//
677
678 Log("*************** Processing DQM FXS");
679
680 UInt_t iDqmFxs = ProcessDqmFxs();
681 if( iDqmFxs == 1 ) {
682 Log(Form("DQM FXS, successful!"));
683 } else {
684 Log(Form("DQM FXS failed!!!"));
685 error |= 4096;
686 }
687
0254e751 688 // storing AliGRPObject in OCDB
689
690 AliCDBMetaData md;
691 md.SetResponsible("Chiara Zampolli");
692 md.SetComment("Output parameters from the GRP preprocessor.");
693
694 Bool_t result = kTRUE;
695 result = Store("GRP", "Data", grpobj, &md);
696 delete grpobj;
697
44e45fac 698 if (result && !error ) {
699 Log("GRP Preprocessor Success");
700 return 0;
701 } else {
9d234ddf 702 Log( Form("GRP Preprocessor FAILS!!! %s%s%s%s%s%s%s%s%s%s%s%s%s%s",
44e45fac 703 kppError[(error&1)?1:0],
704 kppError[(error&2)?2:0],
705 kppError[(error&4)?3:0],
706 kppError[(error&8)?4:0],
e75e6e01 707 kppError[(error&16)?5:0],
6614fa48 708 kppError[(error&32)?6:0],
6a150f83 709 kppError[(error&64)?7:0],
0254e751 710 kppError[(error&128)?8:0],
711 kppError[(error&256)?9:0],
da0e365e 712 kppError[(error&512)?10:0],
6ecb073a 713 kppError[(error&1024)?11:0],
efec19bd 714 kppError[(error&2048)?12:0],
2c90b4df 715 kppError[(error&4096)?13:0],
716 kppError[(error&8192)?14:0]
44e45fac 717 ));
718 return error;
719 }
0254e751 720
721
722}
723
724//_______________________________________________________________
725
726UInt_t AliGRPPreprocessor::ProcessLHCData(AliGRPObject *grpobj)
727{
728 //
729 //Getting the LHC Data from DCS FXS
730 //
731
732 TString timeStartString = (TString)GetRunParameter("DAQ_time_start");
733 TString timeEndString = (TString)GetRunParameter("DAQ_time_end");
e541e2aa 734 if (timeStartString.IsNull() || timeEndString.IsNull()){
0254e751 735 if (timeStartString.IsNull()){
736 AliError("DAQ_time_start not set in logbook! Setting statistical values for current DP to invalid");
737 }
e541e2aa 738 else if (timeEndString.IsNull()){
0254e751 739 AliError("DAQ_time_end not set in logbook! Setting statistical values for current DP to invalid");
740 }
741 return 2;
742 }
743
744 Double_t timeStart = timeStartString.Atof();
745 Double_t timeEnd = timeEndString.Atof();
746
0254e751 747 TString fileName = GetFile(kDCS, "LHCData","");
748 if (fileName.Length()>0){
749 AliInfo("Got The LHC Data file");
e541e2aa 750 AliLHCReader lhcReader;
49822138 751
752 // Processing data to be put in AliGRPObject
753
754 // Energy
79350b54 755 Log("*************Energy ");
49822138 756 TObjArray* energyArray = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[0]);
757 if (energyArray){
4cbf81c1 758 Float_t energy = ProcessEnergy(energyArray,timeStart);
ac152fdd 759 if (energy != -1.) {
49822138 760 grpobj->SetBeamEnergy(energy);
761 grpobj->SetBeamEnergyIsSqrtSHalfGeV(kTRUE);
0254e751 762 }
49822138 763 delete energyArray;
764 }
765 else {
766 AliError("Energy not found in LHC Data file!!!");
767 }
768
4cbf81c1 769 Double_t timeBeamModeEnd = timeEnd; // max validity for Beam Mode
770 Double_t timeMachineModeEnd = timeEnd; // max validity for Machine Mode
53b0ec45 771 Double_t timeBeamEnd = timeEnd; // max validity for Beam Type
772 Double_t timeBeamTypeEnd[2] = {timeEnd, timeEnd}; // max validity for Beam Type1,2
4cbf81c1 773 Double_t timeBeamModeStart = -1; // min validity for Beam Mode
774 Double_t timeMachineModeStart = -1; // min validity for Machine Mode
775 Double_t timeBeamStart = -1; // min validity for Beam Type
53b0ec45 776 Double_t timeBeamTypeStart[2] = {-1,-1}; // min validity for Beam Type1,2
4cbf81c1 777 Int_t indexBeamMode = -1; // index of measurement used to set Beam Mode
53b0ec45 778 Int_t indexMachineMode = -1; // index of measurement used to set Machine Mode
779 Int_t indexBeam = -1; // index of measurement used to set Beam Type
780 Int_t indexBeamType[2] = {-1, -1}; // index of measurement used to set Beam Type1,2
4cbf81c1 781 Bool_t foundBeamModeStart = kFALSE; // flag to be set in case an entry for the Beam Mode is found before (or at) SOR
53b0ec45 782 Bool_t foundMachineModeStart = kFALSE; // flag to be set in case an entry for the Machine Mode is found before (or at) SOR
783 Bool_t foundBeamStart = kFALSE; // flag to be set in case an entry for the Beam Type is found before (or at) SOR
784 Bool_t foundBeamTypeStart[2] = {kFALSE, kFALSE}; // flag to be set in case an entry for the Beam Type1,2 is found before (or at) SOR
4cbf81c1 785 Bool_t flagBeamMode = kFALSE; //flag set true if a changed occurred in BeamMode
786 Bool_t flagMachineMode = kFALSE; //flag set true if a changed occurred in MachineMode
787 Bool_t flagBeam = kFALSE; //flag set true if a changed occurred in BeamType
53b0ec45 788 Bool_t flagBeamType[2] = {kFALSE, kFALSE}; //flag set true if a changed occurred in BeamType1,2
49822138 789
53b0ec45 790 Double_t arrayTimes[5]={2.E9, 2.E9, 2.E9, 2.E9, 2.E9}; // array to keep track of the times of the possible changes of the LHC DPs; each entry set to Wed May 18 2033, 03:33:20 GMT (ALICE should not be running anymore...)
791 // arrayTimes elements order correspond to the one used in the array of the strings fgkLHCDataPoints, i.e.:
792 // arrayTimes[0] --> MachineMode
793 // arrayTimes[1] --> BeamMode
794 // arrayTimes[2] --> BeamType (when written together)
795 // arrayTimes[3] --> BeamType1 (when written separate)
796 // arrayTimes[4] --> BeamType2 (when written separate)
797
49822138 798 // BeamMode
79350b54 799 Log("*************BeamMode (LHCState) ");
49822138 800 TObjArray* beamModeArray = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[2]);
801 Int_t nBeamMode = -1;
802 if (beamModeArray){
803 nBeamMode = beamModeArray->GetEntries();
804 if (nBeamMode==0){
79350b54 805 AliInfo("Found zero entries for the Beam Mode, leaving it empty");
49822138 806 }
807 else{
4cbf81c1 808 for (Int_t iBeamMode = 0; iBeamMode<nBeamMode; iBeamMode++){
809 AliDCSArray* beamMode = (AliDCSArray*)beamModeArray->At(iBeamMode);
810 if (beamMode){
811 if (beamMode->GetTimeStamp()<=timeStart && beamMode->GetTimeStamp()>=timeBeamModeStart){// taking always the very last entry: of two measurements have the same timestamp, the last one is taken
812 timeBeamModeStart = beamMode->GetTimeStamp();
813 indexBeamMode = iBeamMode;
814 foundBeamModeStart = kTRUE;
79350b54 815 }
4cbf81c1 816 else {
817 break;
818
79350b54 819 }
49822138 820 }
4cbf81c1 821 }
822 if (!foundBeamModeStart){
823 AliInfo("No value for the Beam Mode found before start of run, the Beam Mode will remain empty");
40e422c8 824 }
49822138 825 else {
4cbf81c1 826 AliDCSArray* beamMode = (AliDCSArray*)beamModeArray->At(indexBeamMode);
827 TObjString* beamModeString = beamMode->GetStringArray(0);
828 AliInfo(Form("LHC State (corresponding to BeamMode) = %s (set at %f)",(beamModeString->String()).Data(),beamMode->GetTimeStamp()));
829 grpobj->SetLHCState(beamModeString->String());
830 if (indexBeamMode < nBeamMode-1){
831 AliDCSArray* beamMode1 = (AliDCSArray*)beamModeArray->At(indexBeamMode+1);
832 if (beamMode1){
833 if (beamMode1->GetTimeStamp()<=timeStart){
834 AliError("you did not choose the correct value! there is still something before (or at) SOR, but later than this!");
835 }
836 else if (beamMode1->GetTimeStamp()>timeStart && beamMode1->GetTimeStamp()<=timeEnd){
837 timeBeamModeEnd = beamMode1->GetTimeStamp();
838 TObjString* beamModeString1 = beamMode1->GetStringArray(0);
839 TString bmString0 = beamModeString->String();
840 TString bmString1 = beamModeString1->String();
841 if (bmString0.CompareTo(bmString1.Data(),TString::kIgnoreCase) == -1){
6720fa1f 842 AliWarning(Form("The beam mode changed from %s to %s during the run at timestamp %f! Setting it to %s and keeping track of the time of the change to set MaxTimeLHCValidity afterward",bmString0.Data(), bmString1.Data(), timeBeamModeEnd, bmString0.Data()));
4cbf81c1 843 flagBeamMode = kTRUE;
53b0ec45 844 arrayTimes[1]=timeBeamModeEnd;
845
79350b54 846 }
49822138 847 }
79350b54 848 }
849 else {
4cbf81c1 850 AliInfo("Invalid pointer for the first entry for Beam Mode after the first valid one, not considering anything after what has already been found");
5fb8d1a1 851 }
852 }
40e422c8 853 }
0d361338 854 }
49822138 855 delete beamModeArray;
856 }
857 else{
858 AliError("Beam mode array not found in LHC Data file!!!");
859 }
860
861 // MachineMode
79350b54 862 Log("*************MachineMode ");
49822138 863 TObjArray* machineModeArray = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[1]);
864 Int_t nMachineMode = -1;
865 if (machineModeArray){
866 nMachineMode = machineModeArray->GetEntries();
867 if (nMachineMode==0){
868 AliInfo("No Machine Mode found, leaving it empty");
0254e751 869 }
49822138 870 else{
4cbf81c1 871 for (Int_t iMachineMode = 0; iMachineMode<nMachineMode; iMachineMode++){
872 AliDCSArray* machineMode = (AliDCSArray*)machineModeArray->At(iMachineMode);
79350b54 873 if (machineMode){
4cbf81c1 874 if (machineMode->GetTimeStamp()<=timeStart && machineMode->GetTimeStamp()>=timeMachineModeStart){// taking always the very last entry: of two measurements have the same timestamp, the last one is taken
875 timeMachineModeStart = machineMode->GetTimeStamp();
876 indexMachineMode = iMachineMode;
877 foundMachineModeStart = kTRUE;
79350b54 878 }
879 else{
4cbf81c1 880 break;
79350b54 881 }
49822138 882 }
4cbf81c1 883 }
884 if (!foundMachineModeStart){
885 AliInfo("No value for the Machine Mode found before start of run, the Machine Mode will remain empty");
40e422c8 886 }
49822138 887 else {
4cbf81c1 888 AliDCSArray* machineMode = (AliDCSArray*)machineModeArray->At(indexMachineMode);
889 TObjString* machineModeString = machineMode->GetStringArray(0);
890 AliInfo(Form("MachineMode = %s (set at %f)",(machineModeString->String()).Data(),machineMode->GetTimeStamp()));
891 grpobj->SetMachineMode(machineModeString->String());
892 if (indexMachineMode < nMachineMode-1){
893 AliDCSArray* machineMode1 = (AliDCSArray*)machineModeArray->At(indexMachineMode+1);
894 if (machineMode1){
895 if (machineMode1->GetTimeStamp()>timeStart && machineMode1->GetTimeStamp()<=timeEnd){
896 timeMachineModeEnd = machineMode1->GetTimeStamp();
897 TObjString* machineModeString1 = machineMode1->GetStringArray(0);
898 TString mmString0 = machineModeString->String();
899 TString mmString1 = machineModeString1->String();
900 if (mmString0.CompareTo(mmString1.Data(),TString::kIgnoreCase) == -1){
6720fa1f 901 AliWarning(Form("The machine mode changed from %s to %s during the run at timestamp %f! Setting it to %s and keeping track of the time of the change to set MaxTimeLHCValidity afterward",mmString0.Data(),mmString1.Data(),timeMachineModeEnd,mmString0.Data()));
4cbf81c1 902 flagMachineMode = kTRUE;
53b0ec45 903 arrayTimes[0]=timeMachineModeEnd;
79350b54 904 }
49822138 905 }
79350b54 906 }
4cbf81c1 907 else {
908 AliInfo("Invalid pointer for the first entry for Machine Mode after the first valid one, not considering anything after what has already been found");
49822138 909 }
910 }
49822138 911 }
912 }
913 delete machineModeArray;
914 }
4cbf81c1 915 else{
49822138 916 AliError("Machine mode array not found in LHC Data file!!!");
4cbf81c1 917 }
49822138 918
919 // BeamType1 and BeamType2 - both put in the same string
79350b54 920 Log("*************BeamType ");
49822138 921 TObjArray* beamArray = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[3]);
922 if (beamArray){
923 Int_t nBeam = beamArray->GetEntries();
924 if (nBeam==0){
925 AliInfo("No Beam Type found, leaving it empty");
926 }
927 else{
4cbf81c1 928 for (Int_t iBeam = 0; iBeam<nBeam; iBeam++){
929 AliDCSArray* beam = (AliDCSArray*)beamArray->At(iBeam);
79350b54 930 if (beam){
4cbf81c1 931 if (beam->GetTimeStamp()<=timeStart && beam->GetTimeStamp()>=timeBeamStart){// taking always the very last entry: of two measurements have the same timestamp, the last one is taken
932 timeBeamStart = beam->GetTimeStamp();
933 indexBeam = iBeam;
934 foundBeamStart = kTRUE;
79350b54 935 }
4cbf81c1 936 else{
937 break;
79350b54 938 }
939 }
4cbf81c1 940 }
941 if (!foundBeamStart){
53b0ec45 942 AliInfo("No value for the Beam Type found before start of run, the (common) Beam Type will remain empty");
4cbf81c1 943 }
944 else {
945 AliDCSArray* beam = (AliDCSArray*)beamArray->At(indexBeam);
946 TObjString* beamString = beam->GetStringArray(0);
947 TString beamType = beamString->String();
948 AliInfo(Form("Beam Type = %s",beamType.Data()));
949 if (beamType.CompareTo("PROTON",TString::kIgnoreCase) == 0){
950 AliInfo("Setting beam type to p-p");
951 grpobj->SetBeamType("p-p");
952 }
5755755a 953 else { // if there is no PROTON beam, we suppose it is Pb, and we put A-A
954 AliInfo("Setting beam type to A-A");
955 grpobj->SetBeamType("A-A");
956 }
957 /*
958 else if (beamType.CompareTo("LEAD82",TString::kIgnoreCase) == 0){
4cbf81c1 959 AliInfo("Setting beam type to Pb-Pb");
960 grpobj->SetBeamType("Pb-Pb");
961 }
79350b54 962 else{
4cbf81c1 963 AliError("Beam Type not known, leaving it empty");
79350b54 964 }
5755755a 965 */
4cbf81c1 966 if (indexBeam < nBeam-1){
967 AliDCSArray* beam1 = (AliDCSArray*)beamArray->At(indexBeam+1);
968 if (beam1){
969 if (beam1->GetTimeStamp()>timeStart && beam1->GetTimeStamp()<=timeEnd){
970 timeBeamEnd = beam1->GetTimeStamp();
971 TObjString* beamString1 = beam1->GetStringArray(0);
972 TString beamType1 = beamString1->String();
973 if (beamType.CompareTo(beamType1.Data(),TString::kIgnoreCase) == -1){
6720fa1f 974 AliWarning(Form("The Beam Type changed from %s to %s during the run at timestamp %f! Setting it to %s and keeping track of the time of the change to set MaxTimeLHCValidity afterward",beamType.Data(),(beamString1->String()).Data(),timeBeamEnd,beamType.Data()));
4cbf81c1 975 flagBeam = kTRUE;
53b0ec45 976 arrayTimes[2] = timeBeamEnd;
79350b54 977 }
79350b54 978 }
979 }
4cbf81c1 980 else {
981 AliInfo("Invalid pointer for the first entry for Beam Type after the first valid one, not considering anything after what has already been found");
e07d2728 982 }
983 }
e07d2728 984 }
985 }
49822138 986 delete beamArray;
987 }
988 else{
4cbf81c1 989 AliError("Beam Type array not found in LHC Data file!!!");
990 }
53b0ec45 991
992 // BeamType1 and BeamType2 - in separete string
993 Log("*************BeamType, 1 and 2 ");
994 Int_t indexBeamTypeString = 6; // index of the string with the alias of BeanType1 in the array fgkLHCDataPoints
81a1addb 995 TString combinedBeamType = "-"; // combined beam type, built from beam type 1 and beam type 2
996 TString combinedBeamTypeFromLHC = "-"; // combined beam type, built from beam type 1 and beam type 2 AS SENT FROM LHC
53b0ec45 997 for (Int_t ibeamType = 0; ibeamType<2; ibeamType++){
998 beamArray = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[indexBeamTypeString+ibeamType]);
999 if (beamArray){
1000 Int_t nBeam = beamArray->GetEntries();
1001 if (nBeam==0){
1002 AliInfo(Form("No Beam Type %s found, leaving it empty",fgkLHCDataPoints[indexBeamTypeString+ibeamType]));
1003 }
1004 else{
1005 for (Int_t iBeam = 0; iBeam<nBeam; iBeam++){
1006 AliDCSArray* beam = (AliDCSArray*)beamArray->At(iBeam);
1007 if (beam){
1008 if (beam->GetTimeStamp()<=timeStart && beam->GetTimeStamp()>=timeBeamTypeStart[ibeamType]){// taking always the very last entry: of two measurements have the same timestamp, the last one is taken
1009 timeBeamTypeStart[ibeamType] = beam->GetTimeStamp();
1010 indexBeamType[ibeamType] = iBeam;
1011 foundBeamTypeStart[ibeamType] = kTRUE;
1012 }
1013 else{
1014 break;
1015 }
1016 }
1017 }
1018 if (!foundBeamTypeStart[ibeamType]){
1019 AliInfo(Form("No value for the Beam Type %s found before start of run, the Beam Type %d will remain empty", fgkLHCDataPoints[indexBeamTypeString+ibeamType], ibeamType));
1020 }
1021 else {
1022 AliDCSArray* beam = (AliDCSArray*)beamArray->At(indexBeam);
1023 TObjString* beamString = beam->GetStringArray(0);
1024 TString beamType = beamString->String();
81a1addb 1025 AliInfo(Form("Beam Type (for %s) = %s", fgkLHCDataPoints[indexBeamTypeString+ibeamType], beamType.Data()));
1026 TString singleBeam = ParseBeamTypeString(beamType,ibeamType);
1027 AliInfo(Form("Single Beam Type for beam %d set to %s", ibeamType, singleBeam.Data()));
1028 grpobj->SetSingleBeamType(ibeamType, singleBeam);
53b0ec45 1029 if (beamType.CompareTo("PROTON",TString::kIgnoreCase) == 0){
81a1addb 1030 AliInfo(Form("Setting beam %d for combined beam type to p", ibeamType));
1031 if (ibeamType == 0) combinedBeamType.Prepend("p");
53b0ec45 1032 else combinedBeamType.Append("p");
1033 }
1034 else { // if there is no PROTON beam, we suppose it is Pb, and we put A-A
81a1addb 1035 AliInfo(Form("Setting beam %d for combined beam type to A",ibeamType));
53b0ec45 1036 if (ibeamType == 0) combinedBeamType.Prepend("A");
1037 else combinedBeamType.Append("A");
1038 }
81a1addb 1039 if (ibeamType == 0) combinedBeamTypeFromLHC.Prepend(beamType);
1040 else combinedBeamTypeFromLHC.Append(beamType);
53b0ec45 1041 /*
1042 else if (beamType.CompareTo("LEAD82",TString::kIgnoreCase) == 0){
1043 AliInfo("Setting beam type to Pb-Pb");
1044 grpobj->SetSingleBeamType(ibeamType, "Pb-Pb");
1045 }
1046 else{
1047 AliError("Beam Type not known, leaving it empty");
1048 }
1049 */
1050 if (indexBeamType[ibeamType] < nBeam-1){
1051 AliDCSArray* beam1 = (AliDCSArray*)beamArray->At(indexBeam+1);
1052 if (beam1){
1053 if (beam1->GetTimeStamp()>timeStart && beam1->GetTimeStamp()<=timeEnd){
1054 timeBeamTypeEnd[ibeamType] = beam1->GetTimeStamp();
1055 TObjString* beamString1 = beam1->GetStringArray(0);
1056 TString beamType1 = beamString1->String();
1057 if (beamType.CompareTo(beamType1.Data(),TString::kIgnoreCase) == -1){
1058 AliWarning(Form("The Beam Type for %s changed from %s to %s during the run at timestamp %f! Setting it to %s and keeping track of the time of the change to set MaxTimeLHCValidity afterward",fgkLHCDataPoints[indexBeamTypeString+ibeamType],beamType.Data(),(beamString1->String()).Data(),timeBeamEnd,beamType.Data()));
1059 flagBeamType[ibeamType] = kTRUE;
1060 arrayTimes[3+ibeamType] = timeBeamTypeEnd[ibeamType];
1061 }
1062 }
1063 }
1064 else {
1065 AliInfo(Form("Invalid pointer for the first entry for Beam Type %s after the first valid one, not considering anything after what has already been found",fgkLHCDataPoints[indexBeamTypeString+ibeamType]));
1066 }
1067 }
1068 }
1069 }
1070 delete beamArray;
1071 }
1072 else{
1073 AliError(Form("Beam Type %s array not found in LHC Data file!!!",fgkLHCDataPoints[indexBeamTypeString+ibeamType]));
1074 }
1075 }
1076 AliInfo(Form("Setting combined beam type to %s",combinedBeamType.Data()));
1077 grpobj->SetBeamType(combinedBeamType);
81a1addb 1078 AliInfo(Form("Setting combined beam type form LHC to %s",combinedBeamTypeFromLHC.Data()));
1079 grpobj->SetBeamTypeFromLHC(combinedBeamTypeFromLHC);
49822138 1080
1081 // Setting minTimeLHCValidity
53b0ec45 1082 if (flagBeamMode == kTRUE || flagMachineMode == kTRUE || flagBeam == kTRUE || flagBeamType[0] == kTRUE || flagBeamType[1] == kTRUE){
1083 Double_t minTimeLHCValidity= TMath::MinElement(5,arrayTimes);
1084 AliWarning(Form("Setting MaxTimeLHCValidity to %f",minTimeLHCValidity));
1085 grpobj->SetMaxTimeLHCValidity(minTimeLHCValidity);
1086 }
26fd9395 1087 /*
1088 // Old way to determine the Maximum Time during which the LHC info is valid
4cbf81c1 1089 if (timeBeamModeEnd!=0 || timeMachineModeEnd!=0 || timeBeamEnd !=0){
49822138 1090 Double_t minTimeLHCValidity;
53b0ec45 1091 if (flagBeamMode == kFALSE && flagMachineMode == kFALSE && flagBeam == kTRUE){ // flagBeam only true --> it is the only one that changed
4cbf81c1 1092 minTimeLHCValidity = timeBeamEnd;
49822138 1093 }
4cbf81c1 1094 else if (flagBeamMode == kFALSE && flagMachineMode == kTRUE && flagBeam == kFALSE){ // flagMachineMode only true
1095 minTimeLHCValidity = timeMachineModeEnd;
49822138 1096 }
4cbf81c1 1097 else if (flagBeamMode == kTRUE && flagMachineMode == kFALSE && flagBeam == kFALSE){ // flagBeamMode only true
1098 minTimeLHCValidity = timeBeamModeEnd;
49822138 1099 }
4cbf81c1 1100 else if (flagBeamMode == kFALSE && flagMachineMode == kTRUE && flagBeam == kTRUE){ // flagBeam and flagMachineMode only true
1101 minTimeLHCValidity= TMath::Min(timeBeamEnd,timeMachineModeEnd);
49822138 1102 }
4cbf81c1 1103 else if (flagBeamMode == kTRUE && flagMachineMode == kFALSE && flagBeam == kTRUE){ // flagBeam and flagBeamMode only true
1104 minTimeLHCValidity= TMath::Min(timeBeamEnd,timeBeamModeEnd);
49822138 1105 }
4cbf81c1 1106 else if (flagBeamMode == kTRUE && flagMachineMode == kTRUE && flagBeam == kFALSE){ // flagMachineMode and flagBeamMode only true
1107 minTimeLHCValidity= TMath::Min(timeMachineModeEnd,timeBeamModeEnd);
0254e751 1108 }
49822138 1109 else {
4cbf81c1 1110 Double_t arrayTimes[3] = {timeBeamModeEnd,timeMachineModeEnd,timeBeamEnd};// flagMachineMode and flagBeamMode and flagBeam
49822138 1111 minTimeLHCValidity= TMath::MinElement(3,arrayTimes);
1112 }
1113 AliWarning(Form("Setting MaxTimeLHCValidity to %f",minTimeLHCValidity));
1114 grpobj->SetMaxTimeLHCValidity(minTimeLHCValidity);
1115 }
53b0ec45 1116 */
49822138 1117
26fd9395 1118 // Data Quality Flag --> storing start and end values of periods within the run during which the value was found to be FALSE
1119 Log("*************Data Quality Flag ");
1120 TObjArray* dataQualityArray = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[8]);
1121 Int_t nDataQuality = -1;
1122 Double_t timeDataQualityStart = -1; // min validity for Data Quality Flag
1123 Int_t indexDataQuality = -1; // index of first measurement used to set Data Quality Flag
1124 Bool_t foundDataQualityStart = kFALSE; // flag to be set in case an entry for the Data Quality Flag is found before (or at) SOR
1125
1126 if (dataQualityArray){
1127 nDataQuality = dataQualityArray->GetEntries();
1128 if (nDataQuality==0){
1129 AliInfo("No Data Quality Flag found, leaving it empty");
1130 }
1131 else{
1132 for (Int_t iDataQuality = 0; iDataQuality<nDataQuality; iDataQuality++){
1133 AliDCSArray* dataQuality = (AliDCSArray*)dataQualityArray->At(iDataQuality);
1134 if (dataQuality){
1135 if (dataQuality->GetTimeStamp()<=timeStart && dataQuality->GetTimeStamp()>=timeDataQualityStart){// taking always the very last entry: if two measurements have the same timestamp, the last one is taken
1136 timeDataQualityStart = dataQuality->GetTimeStamp();
1137 indexDataQuality = iDataQuality;
1138 foundDataQualityStart = kTRUE;
1139 }
1140 else{
1141 // we suppose here that if the first measurement is not before SOR, then none will be (they MUST be in chronological order!!!)
1142 break;
1143 }
1144 }
1145 }
1146 if (!foundDataQualityStart){
1147 // The Data Quality Flag should be found and TRUE at the start of the run. For the time being, if it is not found, don't do anything, but it means there is a problem..
1148 AliInfo("No value for the Data Quality Flag found before start of run, the Data Quality Flag will remain empty");
1149 }
1150 else {
1151 // counting how many FALSE values there are
1152 Bool_t foundEndOfFalse = kFALSE;
1153 Int_t nFalse = 0;
1154 for (Int_t iDataQuality = indexDataQuality; iDataQuality < nDataQuality; iDataQuality ++){
1155 AliDCSArray* dataQuality = (AliDCSArray*)dataQualityArray->At(iDataQuality);
1156 AliDebug(4,Form("dataQuality->GetTimeStamp() = %f, timeDataQualityStart = %f, timeEnd = %f", dataQuality->GetTimeStamp(), timeDataQualityStart, timeEnd ));
1157 if (dataQuality->GetTimeStamp()>=timeDataQualityStart && dataQuality->GetTimeStamp()<=timeEnd){ // considering only values between the first valid and the end of the run
1158 Bool_t dataQualityFlag = dataQuality->GetBool(0);
1159 AliDebug(3,Form("DataQuality = %d (set at %f)",(Int_t)dataQualityFlag,dataQuality->GetTimeStamp()));
1160 if (dataQualityFlag != kTRUE){
1161 if (iDataQuality == indexDataQuality) { // the first Data Quality value should be TRUE, but ignoring the problem now...
1162 AliError("The first value for the Data Quality MUST be TRUE! Ignoring for now...");
1163 }
1164 nFalse++;
1165 }
1166 }
1167 }
1168
1169 AliInfo(Form("Found %d FALSE values for the Data Quality Flag",nFalse));
1170 Double_t falses[nFalse*2]; // dimensioning this to the maximum possible, as if each false value was followed by a true one --> the false periods correspond to the number of falses
1171
1172 Int_t iDataQuality = indexDataQuality;
1173 if (nFalse > 0){
1174 Int_t iFalse = 0;
1175 // filling the info about the periods when the flag was set to FALSE
1176 // starting, like for the other DPS, from the measurement closest to SOR (the index of which is iDataQuality)
1177 while (iDataQuality < nDataQuality){
1178 AliDebug(3,Form("iDataQuality = %d",iDataQuality));
1179 AliDCSArray* dataQuality = (AliDCSArray*)dataQualityArray->At(iDataQuality);
1180 if (dataQuality->GetTimeStamp()>=timeDataQualityStart && dataQuality->GetTimeStamp()<=timeEnd){ // considering only values between the first valid and the end of the run
1181 Bool_t dataQualityFlag = dataQuality->GetBool(0);
1182 AliDebug(3,Form("DataQuality = %d (set at %f)",(Int_t)dataQualityFlag,dataQuality->GetTimeStamp()));
1183 if (dataQualityFlag == kTRUE){
1184 // found TRUE value, continuing
1185 iDataQuality++;
1186 continue;
1187 }
1188 else{
1189 /*
1190 // the check was already done before
1191 if (iDataQuality == indexDataQuality) { // the first Data Quality value should be TRUE, but ignoring the problem now...
1192 AliError("The first value for the Data Quality MUST be TRUE! Ignoring for now...");
1193 }
1194 */
1195 falses[iFalse*2] = dataQuality->GetTimeStamp();
1196 foundEndOfFalse = kFALSE;
1197 Int_t iDataQualityNext = iDataQuality+1;
1198 while (iDataQualityNext < nDataQuality){
1199 AliDCSArray* dataQualityNext = (AliDCSArray*)dataQualityArray->At(iDataQualityNext);
1200 if (dataQualityNext->GetTimeStamp()>timeDataQualityStart && dataQualityNext->GetTimeStamp()<=timeEnd && dataQualityNext->GetTimeStamp() > dataQuality->GetTimeStamp()){ // considering only values between the first valid and the end of the run, and subsequent to the current value
1201 Bool_t dataQualityFlagNext = dataQualityNext->GetBool(0);
1202 AliDebug(3,Form("DataQualityNext = %d (set at %f)",(Int_t)dataQualityFlagNext,dataQualityNext->GetTimeStamp()));
1203 if (dataQualityFlagNext == kTRUE){
1204 // found TRUE value, first FALSE period completed
1205 foundEndOfFalse = kTRUE;
1206 falses[iFalse*2+1] = dataQualityNext->GetTimeStamp();
1207 iFalse++;
1208 break;
1209 }
1210 iDataQualityNext++;
1211 }
1212 }
1213 if (!foundEndOfFalse) {
1214 AliInfo("Please, note that the last FALSE value lasted until the end of the run");
1215 falses[iFalse*2+1] = timeEnd;
1216 iFalse++;
1217 break;
1218 }
1219 iDataQuality = iDataQualityNext+1;
1220 }
1221 }
1222 }
1223 grpobj->SetNFalseDataQualityFlag(iFalse);
1224 grpobj->SetFalseDataQualityFlagPeriods(falses);
1225 }
1226 }
1227 }
1228 delete dataQualityArray;
1229 }
1230 else{
1231 AliError("Data Quality Flag array not found in LHC Data file!!!");
1232 }
1233
49822138 1234 // Processing data to go to AliLHCData object
63bd40f4 1235 AliLHCData* dt = new AliLHCData(fileName.Data(),timeStart,timeEnd);
1236 // storing AliLHCData in OCDB
1237 if (dt){
1238 AliInfo(Form("Filled %d records to AliLHCData object",dt->GetData().GetEntriesFast()));
1239 AliCDBMetaData md;
1240 md.SetResponsible("Ruben Shahoyan");
1241 md.SetComment("LHC data from the GRP preprocessor.");
1242 Bool_t result = kTRUE;
1243 result = Store("GRP", "LHCData", dt, &md);
1244 delete dt;
da0e365e 1245 if (!result){
1246 Log(Form("Problems in storing LHC Data - but not going into Error"));
1247 }
1248 }
1249
1250 // processing LHC Phase
1251
1252 TObjArray *beam1phase = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[4]);
1253 TObjArray *beam2phase = lhcReader.ReadSingleLHCDP(fileName.Data(),fgkLHCDataPoints[5]);
1254 if (beam1phase == 0x0 || beam2phase == 0x0){
1255 Log(Form("Problems in retrieving LHC Clock data from LHC file"));
1256 return 4;
1257 }
17fd2848 1258 AliLHCClockPhase *phaseObj = ProcessLHCClockPhase(beam1phase,beam2phase,timeEnd);
ca84e838 1259 delete beam1phase;
1260 delete beam2phase;
da0e365e 1261 if (phaseObj){
1262 AliInfo(Form("LHC Phase found"));
1263 AliCDBMetaData mdPhase;
1264 mdPhase.SetResponsible("Cvetan Cheshkov");
1265 mdPhase.SetComment("LHC Clock Phase");
1266 Bool_t result = kTRUE;
1267 result = Store("Calib", "LHCClockPhase", phaseObj, &mdPhase);
1268 delete phaseObj;
1269 if (!result) return 3;
0254e751 1270 }
da0e365e 1271 else return 4;
0254e751 1272 }
49822138 1273
0254e751 1274 else {
aab08fd4 1275 AliError("No LHCData file found in FXS");
0254e751 1276 return 1;
1277 }
79350b54 1278
1279 return 0;
17984b61 1280}
1281
6a150f83 1282//_______________________________________________________________
1283
1284UInt_t AliGRPPreprocessor::ProcessSPDMeanVertex()
1285{
0254e751 1286 //
6a150f83 1287 //Getting the SPD Mean Vertex
0254e751 1288 //
1289
6a150f83 1290 TList* list = GetForeignFileSources("SPD", kDAQ, "VertexDiamond");
1291 Bool_t storeResult = kTRUE;
1292 if (list !=0x0 && list->GetEntries()!=0)
1293 {
1294 AliInfo("The following sources produced files with the id VertexDiamond from SPD");
1295 list->Print();
1296 for (Int_t jj=0;jj<list->GetEntries();jj++){
24f67180 1297 TObjString * str = dynamic_cast<TObjString*> (list->At(jj));
1298 if (!str){
1299 AliError(Form("Expecting a TObjString in the list for the %d-th source, but something else was found.",jj));
1300 continue;
1301 }
6a150f83 1302 AliInfo(Form("found source %s", str->String().Data()));
1303 TString fileNameRun = GetForeignFile("SPD", kDAQ, "VertexDiamond", str->GetName());
1304 if (fileNameRun.Length()>0){
1305 AliInfo(Form("Got the file %s", fileNameRun.Data()));
1306 TFile daqFile(fileNameRun.Data(),"READ");
1307 if (daqFile.IsOpen()) {
1308 AliESDVertex* meanVtx = dynamic_cast<AliESDVertex*>(daqFile.Get("MeanVertexPos"));
1309 if (meanVtx){
1310 meanVtx->Print();
1311 // storing in the OCDB
1312 AliCDBMetaData md;
1313 md.SetResponsible("Cvetan Cheshkov");
1314 md.SetComment("SPD Mean Vertex");
295c54b0 1315 storeResult = Store("Calib", "MeanVertexSPD", meanVtx, &md, 0, kTRUE);
6a150f83 1316 }
1317 else{
1318 AliWarning("No SPD Mean Vertex object found in file");
1319 }
1320 }
1321 else {
1322 AliError("Can't open file");
1323 storeResult = kFALSE;
1324 }
1325 }
1326 else{
1327 AliWarning("No file found for current source for SPD Mean Vertex");
1328 }
1329 }
1330 }
1331 else {
1332 AliWarning("No list found for SPD Mean Vertex");
1333 }
1334
1335 if (list) delete list;
1336
1337 return storeResult;
1338}
efec19bd 1339//_______________________________________________________________
1340
1341UInt_t AliGRPPreprocessor::ProcessDqmFxs()
1342{
1343 //
1344 // Processing DQM fxs information
1345 //
1346
59fef0d0 1347 // TriggerClassesAndHistosToClone
efec19bd 1348 TList* list = GetFileSources(kDQM, "TriggerClassesAndHistosToClone");
fdc6afb7 1349 Bool_t openFileResult = kTRUE;
59fef0d0 1350 Bool_t storeResultQAThr = kTRUE;
efec19bd 1351 if (list !=0x0 && list->GetEntries()!=0){
1352 AliInfo("The following sources produced files with the id TriggerClassesAndHistosToClone for GRP");
1353 list->Print();
1354 for (Int_t jj=0;jj<list->GetEntries();jj++){
1355 TObjString * str = dynamic_cast<TObjString*> (list->At(jj));
1356 if (!str){
1357 AliError(Form("Expecting a TObjString in the list for the %d-th source, but something else was found.",jj));
1358 continue;
1359 }
1360 AliInfo(Form("found source %s", str->String().Data()));
1361 TString fileNameRun = GetFile(kDQM, "TriggerClassesAndHistosToClone", str->GetName());
1362 if (fileNameRun.Length()>0){
1363 AliInfo(Form("Got the file %s", fileNameRun.Data()));
1364 TFile dqmFile(fileNameRun.Data(),"READ");
1365 if (dqmFile.IsOpen()) {
1366 dqmFile.ls();
1367 }
1368 else {
1369 AliError("Can't open file");
fdc6afb7 1370 openFileResult = kFALSE;
efec19bd 1371 }
1372 }
1373 else{
1374 AliWarning("No file found for current source for DQM TriggerClassesAndHistosToClone");
1375 }
1376 }
1377 }
1378 else {
1379 AliWarning("No list found for DQM TriggerClassesAndHistosToClone");
1380 }
1381
1382 if (list) delete list;
59fef0d0 1383
1384 // QAThresholds
1385 TObjArray* qaThrArray = new TObjArray();
1386 for (Int_t idet = 0; idet < AliDAQ::kNDetectors; idet++){
1387 TString detName = AliDAQ::OnlineName(idet);
1388 if (detName == "TRI" || detName == "HLT" || detName == "TST") continue; // skipping TRI, HLT, TST since they do not produce QAThresholds
1389 AliDebug(2, Form("Processing QAThreshold for detector %s",detName.Data()));
1390 TList* listQAThr = GetForeignFileSources(detName.Data(), kDQM, "QAThresholds");
1391 if (listQAThr !=0x0){
1392 if (listQAThr->GetEntries() > 1){
1393 AliError(Form("More than one sources found for QAThresholds from detector %s, skipping",detName.Data()));
1394 continue;
1395 }
1396 else if (listQAThr->GetEntries()==1){
1397 AliInfo(Form("The following source produced files with the id QAThresholds for GRP, coming from detector %s:",detName.Data()));
1398 listQAThr->Print();
1399 TObjString * str = dynamic_cast<TObjString*> (listQAThr->At(0));
1400 if (!str){
1401 AliError(Form("Expecting a TObjString in the list for detector %s, but something else was found.",detName.Data()));
1402 delete listQAThr;
1403 continue;
1404 }
1405 AliInfo(Form("found source %s", str->String().Data()));
1406 TString fileNameRun = GetForeignFile(detName.Data(), kDQM, "QAThresholds", str->GetName());
1407 if (fileNameRun.Length()>0){
1408 AliInfo(Form("Got the file %s", fileNameRun.Data()));
1409 TFile dqmFile(fileNameRun.Data(),"READ");
1410 if (dqmFile.IsOpen()) {
b5c790a4 1411 AliQAThresholds* qaThr = dynamic_cast<AliQAThresholds*>(dqmFile.Get(detName.Data()));
59fef0d0 1412 if (qaThr){
1413 Int_t qaThrId = qaThr->GetDetectorId();
1414 if (qaThrId != idet){
1415 AliError(Form("Expecting QA threshold for detector %s, but found that for detector %s, skipping",detName.Data(), AliDAQ::OnlineName(qaThrId)));
1416 delete listQAThr;
1417 continue;
1418 }
1419 else{
1420 qaThrArray->AddAtAndExpand(qaThr, qaThrId);
1421 delete listQAThr;
1422 }
1423 }
1424 else {
1425 AliError(Form("No QAThresholds object found in the file for detector %s, skipping",detName.Data()));
1426 delete listQAThr;
1427 continue;
1428 }
1429 }
1430 else {
1431 AliError(Form("Can't open QAThreshold file for detector %s, skipping",detName.Data()));
1432 delete listQAThr;
1433 continue;
1434 }
1435 }
1436 else{
1437 AliWarning(Form("No file found for DQM QAThreshold for detector %s, skipping",detName.Data()));
1438 delete listQAThr;
1439 continue;
1440 }
1441 }
1442 else {
1443 AliError(Form("No sources found for QAThresholds from detector %s, skipping",detName.Data()));
1444 delete listQAThr;
1445 continue;
1446 }
1447 }
1448 else {
1449 AliWarning(Form("No list found for DQM QAThreshold for detector %s, skipping",detName.Data()));
1450 continue;
1451 }
1452 }
1453 if (qaThrArray->GetEntries() > 0){
1454 AliCDBMetaData md;
1455 md.SetResponsible("Barthélémy von Haller");
1456 md.SetComment("QA Threshold TObjArray");
1457 storeResultQAThr = Store("Calib", "QAThresholds", qaThrArray, &md, 0, kTRUE);
1458 }
1459 else{
1460 Printf("No valid QAThresholds entries found, storing nothing in the OCDB");
1461 }
1462
fdc6afb7 1463 Printf("openFileResult for QAThr processing would be %d, but we return kTRUE anyway", (Int_t)openFileResult);
1464 Printf("storeResultQAThr for QAThr processing would be %d, but we return kTRUE anyway", (Int_t)storeResultQAThr);
1465 // return storeResultQAThr;
efec19bd 1466 return kTRUE; // temporary!!
1467}
6a150f83 1468
1469
17984b61 1470//_______________________________________________________________
17984b61 1471
e75e6e01 1472Int_t AliGRPPreprocessor::ProcessDaqLB(AliGRPObject* grpObj)
44e45fac 1473{
1474 //Getting the DAQ lb information
1475
e75e6e01 1476 time_t timeStart = (time_t)(((TString)GetRunParameter("DAQ_time_start")).Atoi());
1477 time_t timeEnd = (time_t)(((TString)GetRunParameter("DAQ_time_end")).Atoi());
1478 Float_t beamEnergy = (Float_t)(((TString)GetRunParameter("beamEnergy")).Atof());
44e45fac 1479 TString beamType = (TString)GetRunParameter("beamType");
1480 Char_t numberOfDetectors = (Char_t)(((TString)GetRunParameter("numberOfDetectors")).Atoi());
e75e6e01 1481 UInt_t detectorMask = (UInt_t)(((TString)GetRunParameter("detectorMask")).Atoi());
44e45fac 1482 TString lhcPeriod = (TString)GetRunParameter("LHCperiod");
1483 TString runType = (TString)GetRunType();
1484
53b0ec45 1485 if (timeEnd >= 2.E9) AliFatal("ALICE run finshed later than Wed May 18 2033, 03:33:20 GMT, maximum time allowed for LHC data --> fix the GRP preprocessor!!!");
1486
e75e6e01 1487 UInt_t nparameter = 0;
44e45fac 1488 if (timeStart != 0){
1489 grpObj->SetTimeStart(timeStart);
1490 Log(Form("Start time for run %d: %d",fRun, (Int_t)timeStart));
e75e6e01 1491 nparameter++;
44e45fac 1492 }
1493 else {
e3a2ac48 1494 Log(Form("Start time not put in logbook, setting to invalid in GRP entry, and causing an error!"));
44e45fac 1495 }
1496
1497 if (timeEnd != 0){
1498 grpObj->SetTimeEnd(timeEnd);
1499 Log(Form("End time for run %d: %i",fRun, (Int_t)timeEnd));
e75e6e01 1500 nparameter++;
44e45fac 1501 }
1502 else {
e3a2ac48 1503 Log(Form("End time not put in logbook, setting to invalid in GRP entry, and causing an error!"));
44e45fac 1504 }
1505
1506 if (beamEnergy != 0){
e3a2ac48 1507 Log(Form("Beam Energy for run %d: %f (NOT USING IT TO FILL THE GRP OBJECT, taking it from the LHC file)",fRun, beamEnergy));
44e45fac 1508 }
1509 else {
e3a2ac48 1510 Log(Form("Beam Energy not put in logbook, but not using it anyway for the GRP object (taking it from the LHC file)"));
44e45fac 1511 }
1512
44e45fac 1513
1514 if (beamType.Length() != 0){
e3a2ac48 1515 Log(Form("Beam Type for run %d: %s (NOT USING IT TO FILL THE GRP OBJECT, taking it from the LHC file)",fRun, beamType.Data()));
44e45fac 1516 }
1517 else {
e3a2ac48 1518 Log(Form("Beam Type not put in logbook, but not using it anyway for the GRP entry (taking it from the LHC file)"));
44e45fac 1519 }
1520
1521 if (numberOfDetectors != 0){
1522 grpObj->SetNumberOfDetectors(numberOfDetectors);
1523 Log(Form("Number Of Detectors for run %d: %d",fRun, (Int_t)numberOfDetectors));
e75e6e01 1524 nparameter++;
44e45fac 1525 }
1526 else {
e3a2ac48 1527 Log(Form("Number Of Detectors not put in logbook, setting to invalid in GRP entry, and causing an error!"));
44e45fac 1528 }
1529
1530 if (detectorMask != 0){
1531 grpObj->SetDetectorMask(detectorMask);
1532 Log(Form("Detector Mask for run %d: %d",fRun, detectorMask));
e75e6e01 1533 nparameter++;
44e45fac 1534 }
1535 else {
e3a2ac48 1536 Log(Form("Detector Mask not put in logbook, setting to invalid in GRP entry, and causing an error!"));
44e45fac 1537 }
1538
1539 if (lhcPeriod.Length() != 0) {
1540 grpObj->SetLHCPeriod(lhcPeriod);
1541 Log(Form("LHC period (DAQ) for run %d: %s",fRun, lhcPeriod.Data()));
e75e6e01 1542 nparameter++;
1543 }
1544 else {
e3a2ac48 1545 Log(Form("LHCperiod not put in logbook, setting to invalid in GRP entry, and causing an error!"));
44e45fac 1546 }
1547 if (runType.Length() != 0) {
1548 grpObj->SetRunType(runType);
1549 Log(Form("Run Type (DAQ) for run %d: %s",fRun, runType.Data()));
e75e6e01 1550 nparameter++;
1551 }
1552 else {
e3a2ac48 1553 Log(Form("Run Type not put in logbook, setting to invalid in GRP entry, and causing an error!"));
44e45fac 1554 }
1555
e75e6e01 1556 return nparameter;
44e45fac 1557}
44e45fac 1558//_______________________________________________________________
17984b61 1559
44e45fac 1560UInt_t AliGRPPreprocessor::ProcessDaqFxs()
1561{
1562 //======DAQ FXS======//
1563
ea4a87ee 1564 AliRawEventHeaderV3_9::Class()->IgnoreTObjectStreamer(); // to avoid trying reading TObject store in AliRawEventHeaderV3_9 - temporary fix
f3590649 1565 AliRawEventHeaderV3_11::Class()->IgnoreTObjectStreamer(); // to avoid trying reading TObject store in AliRawEventHeaderV3_11 - temporary fix
e01c025f 1566 AliRawEventHeaderV3_12::Class()->IgnoreTObjectStreamer(); // to avoid trying reading TObject store in AliRawEventHeaderV3_12 - temporary fix
b995faec 1567 AliRawEventHeaderV3_13::Class()->IgnoreTObjectStreamer(); // to avoid trying reading TObject store in AliRawEventHeaderV3_13 - temporary fix
16c237c6 1568 Log("Processing DAQ FXS");
1569 TList* list = GetFileSources(kDAQ);
44e45fac 1570 if (!list) {
1571 Log("No raw data tag list: connection problems with DAQ FXS logbook!");
1572 return 1;
1573 }
1574
1575 if (list->GetEntries() == 0) {
1576 Log("no raw data tags in this run: nothing to merge!");
1577 delete list; list=0;
1578 return 0;
1579 }
1580
1581 TChain *fRawTagChain = new TChain("T");
1582 Int_t nFiles=0;
f880d5b9 1583 Int_t nCorruptedFiles=0;
44e45fac 1584 TIterator* iter = list->MakeIterator();
1585 TObject* obj = 0;
1586 while ((obj = iter->Next())) {
1587 TObjString* objStr = dynamic_cast<TObjString*> (obj);
1588 if (objStr) {
1589 Log(Form("Found source %s", objStr->String().Data()));
1590 TList* list2 = GetFileIDs(kDAQ, objStr->String());
1591 if (!list2) {
1592 Log("No list with ids from DAQ was found: connection problems with DAQ FXS logbook!");
1593 delete fRawTagChain; fRawTagChain=0;
1594 return 1;
1595 }
1596 Log(Form("Number of ids: %d",list2->GetEntries()));
1597 for(Int_t i = 0; i < list2->GetEntries(); i++) {
1598 TObjString *idStr = (TObjString *)list2->At(i);
5bc3c20c 1599 if (idStr->String().CompareTo("QAThreshold") == 0 || idStr->String().CompareTo("TriggerClassesAndHistosToClone") == 0) {
1600 Log(Form("Skipping file with Id %s",idStr->String().Data()));
1601 continue;
1602 }
44e45fac 1603 TString fileName = GetFile(kDAQ,idStr->String().Data(),objStr->String().Data());
1604 if (fileName.Length() > 0) {
f880d5b9 1605 if(!CheckFileRecords(fileName.Data())){
1606 Log(Form("The file records for \"%s\" are corrupted! The chain is skipping it.",fileName.Data()));
1607 nCorruptedFiles++;
1608 }else{
1609 Log(Form("Adding file in the chain: %s",fileName.Data()));
1610 fRawTagChain->Add(fileName.Data());
1611 nFiles++;
1612 }
44e45fac 1613 } else {
1614 Log(Form("Could not retrieve file with id %s from source %s: "
1615 "connection problems with DAQ FXS!",
1616 idStr->String().Data(), objStr->String().Data()));
1617 delete list; list=0;
1618 delete list2; list2=0;
1619 delete fRawTagChain; fRawTagChain=0;
1620 return 2;
1621 }
1622 }
1623 delete list2;
1624 }
1625 }
16c237c6 1626
1627 if (nFiles == 0){
1628 Log("no raw data tags in this run: it could be that one or more files were found in the DAQ FXS, but they were ignored, since not interesting for the raw data tag: nothing to merge!");
166b08b9 1629 delete iter;
1630 iter = 0;
1631 delete list;
1632 list = 0;
1633 delete fRawTagChain;
1634 fRawTagChain=0;
16c237c6 1635 return 0;
1636 }
44e45fac 1637
1638 TString fRawDataFileName = "GRP_Merged.tag.root";
f880d5b9 1639 if(nCorruptedFiles!=0)
1640 Log(Form("Merging %d raw data tags into file: %s. %d corrupted files skipped", nFiles, fRawDataFileName.Data(), nCorruptedFiles));
1641 else
1642 Log(Form("Merging %d raw data tags into file: %s", nFiles, fRawDataFileName.Data()));
7e6f5523 1643
16c237c6 1644 if (fRawTagChain->Merge(fRawDataFileName) < 1 ) {
1645 Log(Form("Error merging %d raw data files!!!",nFiles));
166b08b9 1646 delete iter;
1647 iter = 0;
1648 delete list;
1649 list = 0;
1650 delete fRawTagChain;
1651 fRawTagChain=0;
44e45fac 1652 return 3;
1653 }
16c237c6 1654
44e45fac 1655 TString outputfile = Form("Run%d.Merged.RAW.tag.root", fRun);
1656 Bool_t result = StoreRunMetadataFile(fRawDataFileName.Data(),outputfile.Data());
1657
1658 if (!result) {
1659 Log("Problem storing raw data tags in local file!!!");
1660 } else {
1661 Log("Raw data tags merged successfully!!");
1662 }
1663
1664 delete iter;
166b08b9 1665 iter = 0;
44e45fac 1666 delete list;
166b08b9 1667 list = 0;
44e45fac 1668 delete fRawTagChain; fRawTagChain=0;
1669
1670 if (result == kFALSE) {
1671 return 4;
1672 }
1673
1674 return 0;
1675
1676}
17984b61 1677
44e45fac 1678//_______________________________________________________________
e75e6e01 1679UInt_t AliGRPPreprocessor::ProcessDcsFxs(TString partition, TString detector)
44e45fac 1680{
39e3007b 1681
1682 // processing the info
1683 // stored in the DCS FXS
1684 // coming from the trigger
1685
2930278d 1686 // Get the CTP counters information
1687 // +
9d234ddf 1688 // Get the CTP aliases information
e75e6e01 1689
1690 if (partition.IsNull() && !detector.IsNull()){ // standalone partition
2c90b4df 1691 Log("STANDALONE partition for current run, using Trigger Scalers and Trigger Aliases dummy values");
1692
1693 AliCDBEntry *cdbEntryScalers = GetFromOCDB("CTP","DummyScalers");
1694 if (!cdbEntryScalers) {
e75e6e01 1695 Log(Form("No dummy CTP scalers entry found, going into error..."));
44e45fac 1696 return 1;
1697 }
e75e6e01 1698 else{
2c90b4df 1699 AliTriggerRunScalers *scalers = (AliTriggerRunScalers*)cdbEntryScalers->GetObject();
e75e6e01 1700 if (!scalers){
1701 Log(Form("CTP dummy scalers not found in OCDB entry, going into error..."));
1702 return 1;
1703 }
1704 else {
1705 AliCDBMetaData metaData;
1706 metaData.SetResponsible("Roman Lietava");
1707 metaData.SetComment("CTP scalers from dummy entry in OCDB");
1708 if (!Store("CTP","Scalers", scalers, &metaData, 0, 0)) {
1709 Log("Unable to store the dummy CTP scalers object to OCDB!");
2c90b4df 1710 delete scalers;
e75e6e01 1711 return 1;
1712 }
1713 }
1714 }
2c90b4df 1715
1716 AliCDBEntry *cdbEntryAliases = GetFromOCDB("CTP","DummyAliases");
1717 if (!cdbEntryAliases) {
1718 Log(Form("No dummy CTP aliases entry found, going into error..."));
1719 return 2;
1720 }
1721 else{
1722 THashList *aliases = dynamic_cast<THashList*>(cdbEntryAliases->GetObject());
1723 if (!aliases){
1724 Log(Form("CTP dummy aliases not found in OCDB entry, going into error..."));
1725 return 2;
1726 }
1727 else {
1728 AliCDBMetaData metaData;
1729 metaData.SetResponsible("Evgeny Kryshen");
1730 metaData.SetComment("CTP mapping of trigger classes to trigger aliases");
1731 if (!Store("CTP","Aliases", aliases, &metaData, 0, 0)) {
1732 Log("Unable to store the dummy CTP aliases object to OCDB!");
1733 delete aliases;
1734 return 2;
1735 }
1736 }
1737 }
e75e6e01 1738 }
1739
1740 else if (!partition.IsNull() && detector.IsNull()){ // global partition
1741 Log("GLOBAL partition for current run, using CTP scalers from DCS FXS");
1742 TString countersfile = GetFile(kDCS, "CTP_xcounters","");
1743 if (countersfile.IsNull()) {
1744 Log("No CTP counters files has been found: empty source!");
44e45fac 1745 return 1;
1746 }
1747 else {
e75e6e01 1748 Log(Form("File with Id CTP_xcounters found in DCS FXS! Copied to %s",countersfile.Data()));
1749 AliTriggerRunScalers *scalers = AliTriggerRunScalers::ReadScalers(countersfile);
1750 if (!scalers) {
1751 Log("Bad CTP counters file! The corresponding CDB entry will not be filled!");
1752 return 1;
1753 }
1754 else {
1755 AliCDBMetaData metaData;
1756 metaData.SetBeamPeriod(0);
1757 metaData.SetResponsible("Roman Lietava");
1758 metaData.SetComment("CTP scalers");
1759 if (!Store("CTP","Scalers", scalers, &metaData, 0, 0)) {
1760 Log("Unable to store the CTP scalers object to OCDB!");
e541e2aa 1761 delete scalers;
e75e6e01 1762 return 1;
44e45fac 1763 }
1764 }
e541e2aa 1765 delete scalers;
44e45fac 1766 }
2930278d 1767
1768
1769
1770 TString aliasesFile = GetFile(kDCS, "CTP_aliases","");
1771 if (aliasesFile.IsNull()) {
1772 Log("No CTP aliases files has been found: empty source!");
2c90b4df 1773 return 2;
2930278d 1774 }
1775 else {
1776 Log(Form("File with Id CTP_aliases found in DCS FXS! Copied to %s",aliasesFile.Data()));
1777 // We build the THashList of TNamed("triggerclass","comma_separated_list_of_corresponding_aliases")
1778 THashList* trClasses2Aliases = ProcessAliases(aliasesFile);
1779 if (!trClasses2Aliases) {
1780 Log("Bad CTP aliases file! The corresponding CDB entry will not be filled!");
2c90b4df 1781 return 2;
2930278d 1782 }
1783 else {
1784 AliCDBMetaData metaData;
1785 metaData.SetBeamPeriod(0);
1786 metaData.SetResponsible("Evgeny Kryshen");
1787 metaData.SetComment("CTP mapping of trigger classes to trigger aliases");
1788 if (!Store("CTP","Aliases", trClasses2Aliases, &metaData, 0, 0)) {
1789 Log("Unable to store the CTP aliases object to OCDB!");
1790 delete trClasses2Aliases;
2c90b4df 1791 return 2;
2930278d 1792 }
1793 }
1794 delete trClasses2Aliases;
1795 }
44e45fac 1796 }
1797
e75e6e01 1798
1799 else{
1800 Log(Form("Incorrect field in DAQ logbook for partition = %s and detector = %s, going into error...",partition.Data(),detector.Data()));
2c90b4df 1801 return 3;
e75e6e01 1802 }
1803
44e45fac 1804 return 0;
e75e6e01 1805
44e45fac 1806}
2930278d 1807
44e45fac 1808//_______________________________________________________________
2930278d 1809THashList* AliGRPPreprocessor::ProcessAliases(const char* aliasesFile)
1810{
17984b61 1811
2930278d 1812 //
1813 // build the THashList of triggerclasses-to-triggeraliases from text file
1814 // each line of the file is supposed to be a string composed by
e1049418 1815 // triggerclass+spaces+commaseparatedlistofcorrespondingaliases\n
1816 // it will add a TNamed("triggerclass","commaseparatedlistofcorrespondingaliases")
2930278d 1817 // to the hashlist
1818 //
1819
1820 if (gSystem->AccessPathName(aliasesFile)) {
1821 Printf("file (%s) not found", aliasesFile);
1822 return 0;
1823 }
1824
1825 ifstream *file = new ifstream(aliasesFile);
1826 if (!*file) {
1827 Printf("Error opening file (%s) !",aliasesFile);
1828 file->close();
1829 delete file;
1830 return 0;
1831 }
1832
1833 THashList *hList = new THashList(10);
1834 hList->SetName("List of trigger classes to trigger aliases strings");
1835
1836 TString strLine;
1837 while (strLine.ReadLine(*file)) {
1838
e1049418 1839 // safety for null lines, tabs instead of whitespaces, trailing carriage return, leading or trailing spaces/tabs
2930278d 1840 if (strLine.IsNull()) continue;
e1049418 1841 strLine.ReplaceAll('\t',' ');
e1cf332d 1842 strLine.Remove(TString::kLeading,' ');
3fad687c 1843 strLine.Remove(TString::kTrailing,'\r');
e1cf332d 1844 strLine.Remove(TString::kTrailing,' ');
2930278d 1845
1846 TObjArray* arr = strLine.Tokenize(' ');
1847 if(arr->GetEntries() != 2){
1848 Printf("The line:\n%s\nunexpectedly contains %d tokens, instead of two.",strLine.Data(),arr->GetEntries());
09d5920f 1849 delete arr;
2930278d 1850 return 0;
1851 }
1852 TObjString *osTC = (TObjString*) arr->At(0);
1853 TObjString *osTAlist = (TObjString*) arr->At(1);
1854 TNamed *ctoa = new TNamed(osTC->GetName(),osTAlist->GetName());
1855 hList->Add(ctoa);
d8ade9d1 1856 delete arr;
2930278d 1857 }
1858
1859 file->close();
1860 delete file;
1861
1862 return hList;
1863}
1864
1865//_______________________________________________________________
44e45fac 1866Int_t AliGRPPreprocessor::ProcessDcsDPs(TMap* valueMap, AliGRPObject* grpObj)
1867{
17984b61 1868
44e45fac 1869 //
1870 // processing DCS DPs
1871 //
1872
26c1dff2 1873 Int_t entries = 0; // counting the entries that are in the DCS DB, not taking care whether they have values or not
44e45fac 1874 Int_t nL3Entries = 0;
1875 Int_t nDipoleEntries = 0;
1876 Int_t nEnvEntries = 0;
1877 Int_t nHallProbesEntries = 0;
44e45fac 1878 nL3Entries = ProcessL3DPs(valueMap, grpObj);
1879 nDipoleEntries = ProcessDipoleDPs(valueMap, grpObj);
1880 nEnvEntries = ProcessEnvDPs(valueMap, grpObj);
1881 nHallProbesEntries = ProcessHPDPs(valueMap, grpObj);
fab61587 1882 grpObj->SetPolarityConventionLHC(); // after the dipole cables swap we comply with LHC convention
0254e751 1883 Log(Form("L3Entries = %d, nDipoleEntries =%d, nEnvEntries = %d, nHallProbesEntries = %d", nL3Entries, nDipoleEntries, nEnvEntries, nHallProbesEntries));
1884 entries = nL3Entries + nDipoleEntries + nEnvEntries + nHallProbesEntries;
44e45fac 1885 return entries;
17984b61 1886
17984b61 1887}
1888
1889//_______________________________________________________________
29cc8704 1890
39e3007b 1891Int_t AliGRPPreprocessor::ProcessL3DPs(const TMap* valueMap, AliGRPObject* grpObj)
44e45fac 1892{
39e3007b 1893
1894 // processing DPs
1895 // related to
1896 // L3 info
1897
44e45fac 1898 Int_t nL3Entries = 0;
c5340e82 1899
44e45fac 1900 TObjArray *array = 0x0;
1901 Int_t indexDP = -1;
fe726709 1902 Bool_t isZero = kTRUE; // flag to monitor L3Current. If set to true, the magnet is OFF, and the polarity can change
44e45fac 1903
fe726709 1904 AliInfo(Form("==========L3Current==========="));
1905 Bool_t outOfRange = kFALSE; // flag to monitor if any value collected by DCS is out of range
1906 indexDP = kL3Current;
44e45fac 1907 array = (TObjArray *)valueMap->GetValue(fgkDCSDataPoints[indexDP]);
1908 if(!array) {
1909 Log(Form("%s not found in the map!!!",fgkDCSDataPoints[indexDP]));
1910 }
1911 else {
26c1dff2 1912 if (array->GetEntries() == 0){
fe726709 1913 AliError(Form("No entries found in array! setting %s to invalid...",fgkDCSDataPoints[indexDP]));
26c1dff2 1914 }
1915 else {
fe726709 1916 Float_t *floatDCS = ProcessFloatAllMagnet(array, indexDP, isZero);
1917 if (floatDCS != NULL){
1918 grpObj->SetL3Current(floatDCS);
1919 }
1920 else{
1921 outOfRange = kTRUE;
1922 }
03672227 1923 if (floatDCS){
1924 delete[] floatDCS;
1925 floatDCS = 0x0;
1926 }
26c1dff2 1927 }
c5340e82 1928 if (!outOfRange) {
1929 nL3Entries++;
1930 ffailedDPs->RemoveAt(indexDP);
1931 }
44e45fac 1932 }
1933
1934 if (array) array = 0x0;
1935
fe726709 1936 AliInfo(Form("==========L3Polarity==========="));
1937 indexDP = kL3Polarity;
44e45fac 1938 array = (TObjArray *)valueMap->GetValue(fgkDCSDataPoints[indexDP]);
1939 if(!array) {
1940 Log(Form("%s not found in the map!!!",fgkDCSDataPoints[indexDP]));
1941 }
1942 else {
26c1dff2 1943 if (array->GetEntries() == 0){
fe726709 1944 AliError(Form("No entries found in array! setting %s Polarity to invalid...",fgkDCSDataPoints[indexDP]));
26c1dff2 1945 }
1946 else {
fe726709 1947 Bool_t change = kFALSE;
1948 Char_t charDCS = ProcessBool(array,change);
01920f0c 1949 if (change == kFALSE){
fe726709 1950 grpObj->SetL3Polarity(charDCS);
1951 AliInfo(Form("%s set to %d",fgkDCSDataPoints[indexDP],(Int_t)(grpObj->GetL3Polarity())));
c5340e82 1952 ffailedDPs->RemoveAt(indexDP);
fe726709 1953 nL3Entries++;
1954 }
1955 else if (isZero){
ac833e7a 1956 AliInfo(Form("%s set to invalid, but magnet was OFF (according to the current), DP not considered wrong",fgkDCSDataPoints[indexDP]));
c5340e82 1957 ffailedDPs->RemoveAt(indexDP);
fe726709 1958 nL3Entries++;
1959 }
1960 else {
ac833e7a 1961 AliError(Form("%s value changed within the run, while the magnet was ON (according to the current), setting it to invalid and considering the DP as wrong",fgkDCSDataPoints[indexDP]));
fe726709 1962 }
26c1dff2 1963 }
44e45fac 1964 }
1965
1966 return nL3Entries;
e7a6790f 1967
44e45fac 1968}
1969//_______________________________________________________________
ff97356e 1970
39e3007b 1971Int_t AliGRPPreprocessor::ProcessDipoleDPs(const TMap* valueMap, AliGRPObject* grpObj)
44e45fac 1972{
39e3007b 1973 // processing DPs
1974 // related to
1975 // the Dipole info
1976
44e45fac 1977 Int_t nDipoleEntries = 0;
1978 TObjArray *array = 0x0;
1979 Int_t indexDP = -1;
fe726709 1980 Bool_t isZero = kTRUE; // flag to monitor L3Current. If set to true, the magnet is OFF, and the polarity can change
44e45fac 1981
fe726709 1982 AliInfo(Form("==========DipoleCurrent==========="));
1983 Bool_t outOfRange = kFALSE; // flag to monitor if any value collected by DCS is out of range
1984 indexDP = kDipoleCurrent;
44e45fac 1985 array = (TObjArray *)valueMap->GetValue(fgkDCSDataPoints[indexDP]);
44e45fac 1986 if(!array) {
1987 Log(Form("%s not found in the map!!!",fgkDCSDataPoints[indexDP]));
1988 }
1989 else {
26c1dff2 1990 if (array->GetEntries() == 0){
1991 AliError(Form("No entries found in array! setting %s to invalid...",fgkDCSDataPoints[indexDP]));
1992 }
1993 else {
fe726709 1994 Float_t *floatDCS = ProcessFloatAllMagnet(array, indexDP, isZero);
1995 if (floatDCS != NULL){
1996 grpObj->SetDipoleCurrent(floatDCS);
1997 }
1998 else{
1999 outOfRange=kTRUE;
2000 }
03672227 2001 if (floatDCS){
2002 delete[] floatDCS;
2003 floatDCS = 0x0;
2004 }
26c1dff2 2005 }
c5340e82 2006 if (!outOfRange) {
2007 nDipoleEntries++;
2008 ffailedDPs->RemoveAt(indexDP);
2009 }
44e45fac 2010 }
2011
2012 if (array) array = 0x0;
2013
fe726709 2014 AliInfo(Form("==========DipolePolarity==========="));
2015 indexDP = kDipolePolarity;
44e45fac 2016 array = (TObjArray *)valueMap->GetValue(fgkDCSDataPoints[indexDP]);
2017 if(!array) {
2018 Log(Form("%s not found in the map!!!",fgkDCSDataPoints[indexDP]));
2019 }
2020 else {
26c1dff2 2021 if (array->GetEntries() == 0){
2022 AliError(Form("No entries found in array! setting %s to invalid...",fgkDCSDataPoints[indexDP]));
2023 }
2024 else {
fe726709 2025 Bool_t change = kFALSE;
2026 Char_t charDCS = ProcessBool(array,change);
2027 if (!change){
2028 grpObj->SetDipolePolarity(charDCS);
2029 AliInfo(Form("%s set to %d",fgkDCSDataPoints[indexDP],(Int_t)(grpObj->GetDipolePolarity())));
c5340e82 2030 ffailedDPs->RemoveAt(indexDP);
fe726709 2031 nDipoleEntries++;
2032 }
2033 else if (isZero){
ac833e7a 2034 AliInfo(Form("%s set to invalid, but magnet was OFF (according to the current), DP not considered wrong",fgkDCSDataPoints[indexDP]));
c5340e82 2035 ffailedDPs->RemoveAt(indexDP);
fe726709 2036 nDipoleEntries++;
2037 }
2038 else{
ac833e7a 2039 AliError(Form("%s value changed within the run while the magnet was ON (according to the current), setting it to invalid and considering the DP as wrong", fgkDCSDataPoints[indexDP]));
fe726709 2040 }
26c1dff2 2041 }
44e45fac 2042 }
2043
2044 return nDipoleEntries;
e7a6790f 2045
44e45fac 2046}
2047//_______________________________________________________________
e7a6790f 2048
44e45fac 2049Int_t AliGRPPreprocessor::ProcessEnvDPs(TMap* valueMap, AliGRPObject* grpObj)
2050{
39e3007b 2051 // processing DPs
2052 // related to
2053 // evironment conditions (temperature, pressure) info
2054
44e45fac 2055 Int_t nEnvEntries = 0;
2056 TObjArray *array = 0x0;
2057 Int_t indexDP = -1;
2058
2059 AliInfo(Form("==========CavernTemperature==========="));
fe726709 2060 Bool_t outOfRange = kFALSE; // flag to monitor if any value collected by DCS is out of range
44e45fac 2061 indexDP = kCavernTemperature;
2062 array = (TObjArray *)valueMap->GetValue(fgkDCSDataPoints[indexDP]);
2063 if(!array) {
2064 Log(Form("%s not found in the map!!!",fgkDCSDataPoints[indexDP]));
2065 }
2066 else {
26c1dff2 2067 if (array->GetEntries() == 0){
2068 AliError(Form("No entries found in array! setting %s to invalid...",fgkDCSDataPoints[indexDP]));
2069 }
2070 else {
2071 Float_t *floatDCS = ProcessFloatAll(array);
fe726709 2072 if (floatDCS != NULL){
2073 grpObj->SetCavernTemperature(floatDCS);
2074 }
2075 else{
2076 outOfRange = kTRUE;
2077 }
03672227 2078 if (floatDCS){
2079 delete[] floatDCS;
2080 floatDCS = 0x0;
2081 }
26c1dff2 2082 }
c5340e82 2083 if (!outOfRange) {
2084 ffailedDPs->RemoveAt(indexDP);
2085 nEnvEntries++;
2086 }
44e45fac 2087 }
2088
2089 if (array) array = 0x0;
2090
ce996d13 2091 AliInfo(Form("========== AtmosPressures (Cavern + Surface + Cavern2) ==========="));
44e45fac 2092 AliDCSSensorArray *dcsSensorArray = GetPressureMap(valueMap);
ce996d13 2093 //dcsSensorArray->Print();
2094 if( fPressure->NumFits()<kNumSensors ) {
d7edf69d 2095 Log(Form("Check the pressure sensor values! Not all the %d pressure sensors have been fit",kNumSensors));
44e45fac 2096 }
d7edf69d 2097 Log(Form("Number of fits performed = %d",fPressure->NumFits()));
2098
2099 AliInfo(Form("==========CavernAtmosPressure==========="));
2100 indexDP = kCavernAtmosPressure;
2101 AliDCSSensor* sensorCavernP2 = dcsSensorArray->GetSensor(fgkDCSDataPoints[indexDP]);
2102 TGraph* graph = sensorCavernP2->GetGraph();
3343d11b 2103 AliDebug(3,Form("index = %d",indexDP));
2104 AliDebug(3,Form("name = %s",fgkDCSDataPoints[indexDP]));
d7edf69d 2105 AliDebug(2,Form("graph = %p",graph));
2106 AliDebug(3,Form("sensorCavernP2 = %p", sensorCavernP2));
2a0b175e 2107 if(sensorCavernP2->GetFit() || graph) {
d7edf69d 2108 if (sensorCavernP2->GetFit()){
2a0b175e 2109 Log(Form("Fit for sensor %s found",fgkDCSDataPoints[indexDP]));
d7edf69d 2110 }
44e45fac 2111 else {
2a0b175e 2112 Log(Form("Fit for sensor %s not found, but the graph is there - NOT going into error",fgkDCSDataPoints[indexDP]));
d7edf69d 2113 }
2114 grpObj->SetCavernAtmosPressure(sensorCavernP2);
c5340e82 2115 ffailedDPs->RemoveAt(indexDP);
d7edf69d 2116 nEnvEntries++;
2117 }
2118 //if (sensorP2) delete sensorP2;
2119 else {
2a0b175e 2120 Log(Form("ERROR!!! Neither graph nor fit found for sensor %s - this will not increase the number of found DCS DPs and will cause an error", fgkDCSDataPoints[indexDP] ));
d7edf69d 2121 }
2a0b175e 2122
d7edf69d 2123 AliInfo(Form("==========SurfaceAtmosPressure==========="));
2124 indexDP = kSurfaceAtmosPressure;
2125 AliDCSSensor* sensorP2 = dcsSensorArray->GetSensor(fgkDCSDataPoints[indexDP]);
2126 graph = sensorP2->GetGraph();
3343d11b 2127 AliDebug(3,Form("index = %d",indexDP));
2128 AliDebug(3,Form("name = %s",fgkDCSDataPoints[indexDP]));
d7edf69d 2129 AliDebug(2,Form("graph = %p",graph));
2130 AliDebug(3,Form("sensorP2 = %p", sensorP2));
2a0b175e 2131 if(sensorP2->GetFit() || graph) {
d7edf69d 2132 if (sensorP2->GetFit()){
2a0b175e 2133 Log(Form("Fit for sensor %s found",fgkDCSDataPoints[indexDP]));
d7edf69d 2134 }
44e45fac 2135 else {
2a0b175e 2136 Log(Form("Fit for sensor %s not found, but the graph is there - NOT going into error",fgkDCSDataPoints[indexDP]));
d7edf69d 2137 }
2138 grpObj->SetSurfaceAtmosPressure(sensorP2);
c5340e82 2139 ffailedDPs->RemoveAt(indexDP);
d7edf69d 2140 nEnvEntries++;
2141 }
2142 //if (sensorP2) delete sensorP2;
2143 else {
2a0b175e 2144 Log(Form("ERROR!!! Neither graph nor fit found for sensor %s - this will not increase the number of found DCS DPs and will cause an error", fgkDCSDataPoints[indexDP] ));
44e45fac 2145 }
2146
d7edf69d 2147 AliInfo(Form("==========CavernAtmosPressure2==========="));
2148 indexDP = kCavernAtmosPressure2;
2149 AliDCSSensor* sensorCavernP22 = dcsSensorArray->GetSensor(fgkDCSDataPoints[indexDP]);
8976336c 2150 graph = sensorCavernP22->GetGraph();
3343d11b 2151 AliDebug(3,Form("index = %d",indexDP));
2152 AliDebug(3,Form("name = %s",fgkDCSDataPoints[indexDP]));
d7edf69d 2153 AliDebug(2,Form("graph = %p",graph));
2154 AliDebug(3,Form("sensorCavernP2_2 = %p", sensorCavernP22));
2a0b175e 2155 if(sensorCavernP22->GetFit() || graph) {
d7edf69d 2156 if (sensorCavernP22->GetFit()){
2a0b175e 2157 Log(Form("Fit for sensor %s found",fgkDCSDataPoints[indexDP]));
d7edf69d 2158 }
2159 else {
2a0b175e 2160 Log(Form("Fit for sensor %s not found, but the graph is there - NOT going into error",fgkDCSDataPoints[indexDP]));
d7edf69d 2161 }
2162 grpObj->SetCavernAtmosPressure2(sensorCavernP22);
c5340e82 2163 ffailedDPs->RemoveAt(indexDP);
d7edf69d 2164 nEnvEntries++;
2165 }
2166 //if (sensorP2) delete sensorP2;
2167 else {
2a0b175e 2168 Log(Form("ERROR!!! Neither graph nor fit found for sensor %s - this will not increase the number of found DCS DPs and will cause an error", fgkDCSDataPoints[indexDP] ));
d7edf69d 2169 }
2170
2171
44e45fac 2172 return nEnvEntries;
2173}
2174//_______________________________________________________________
e7a6790f 2175
39e3007b 2176Int_t AliGRPPreprocessor::ProcessHPDPs(const TMap* valueMap, AliGRPObject* grpObj)
44e45fac 2177{
39e3007b 2178 // processing DPs
2179 // related to
2180 // Hall Probes info
2181
44e45fac 2182 Int_t nHPEntries = 0;
2183 TObjArray *array = 0x0;
2184 Int_t indexDP = -1;
fe726709 2185 Bool_t outOfRange; // flag to monitor if any value collected by DCS is out of range
44e45fac 2186
39e3007b 2187 if (fgknDCSDPHallProbes != AliGRPObject::GetNumberOfHP()){
2188 AliError(Form("Number of Hall probes expected in GRP Preprocessor (i.e. %d) different from number of Hall Probes foreseen in GRP object (i.e. %d). Looping on entries from GRP object anyway.", fgknDCSDPHallProbes, AliGRPObject::GetNumberOfHP()));
44e45fac 2189 }
2190 for (indexDP = 0; indexDP < AliGRPObject::GetNumberOfHP(); indexDP++){
fe726709 2191 outOfRange = kFALSE; // resetting outOfRange flag at each HP
44e45fac 2192 AliInfo(Form("==========%s===========",AliGRPObject::GetHPDP(indexDP)));
2193 array = (TObjArray *)valueMap->GetValue(AliGRPObject::GetHPDP(indexDP));
2194 if(!array) {
2195 Log(Form("%s not found in the map!!!",AliGRPObject::GetHPDP(indexDP)));
2196 }
2197 else {
26c1dff2 2198 if (array->GetEntries() == 0){
2199 AliError(Form("No entries found in array! setting %s to invalid...",AliGRPObject::GetHPDP(indexDP)));
2200 }
2201 else {
2202 Float_t *floatDCS = ProcessFloatAll(array);
fe726709 2203 if (floatDCS != NULL){
2204 AliDebug(2,Form("value[0] = %f, value[1] = %f, value[2] = %f, value[3] = %f, value[4] = %f",floatDCS[0],floatDCS[1],floatDCS[2],floatDCS[3],floatDCS[4]));
2205 grpObj->SetHallProbes((AliGRPObject::DP_HallProbes)indexDP,floatDCS);
2206 for (Int_t kk = 0 ; kk< 5; kk++){
2207 AliDebug(2,Form("HallProbe[%d][%d]=%f",indexDP,kk,grpObj->GetHallProbes((AliGRPObject::DP_HallProbes)indexDP,(AliGRPObject::Stats)kk)));
2208 }
2209 }
2210 else{
2211 outOfRange = kTRUE;
26c1dff2 2212 }
03672227 2213 if (floatDCS){
2214 delete[] floatDCS;
2215 floatDCS = 0x0;
2216 }
44e45fac 2217 }
c5340e82 2218 if (!outOfRange) {
4bb7c769 2219 ffailedDPs->RemoveAt(indexDP + fgkDCSDPHallTopShift); // 7 = shift in the complete list of DPs to get to the Hall Probes
c5340e82 2220 nHPEntries++;
2221 }
44e45fac 2222 }
2223 }
2224
7e6f5523 2225 Log(Form("Hall Probes = %d ", nHPEntries));
2226 return nHPEntries;
17984b61 2227}
2228
44e45fac 2229//_________________________________________________________________________
2230
39e3007b 2231AliSplineFit* AliGRPPreprocessor::GetSplineFit(const TObjArray *array, const TString& stringID){
2232
2233
2234 //
2235 // returning Spline Fit
2236 //
44e45fac 2237
2238 Int_t entriesarray = array->GetEntries();
2239 Float_t* value = new Float_t[entriesarray];
2240 Float_t* time = new Float_t[entriesarray];
2241 AliDCSValue* v = 0x0;
2242 for (Int_t iarray = 0; iarray < entriesarray; iarray++){
2243 v = (AliDCSValue*)array->At(iarray);
2244 value[iarray] = v->GetFloat();
2245 time[iarray] = v->GetTimeStamp();
e75e6e01 2246 AliDebug(2,Form("iarray = %d, value = %f, time = %f",iarray,value[iarray],time[iarray]));
44e45fac 2247 }
2248 TGraph* gr = new TGraph(entriesarray,value,time);
2249 if (!gr ) {
2250 AliWarning(Form("%s: no input graph to compute SplineFit",stringID.Data()));
2251 return NULL;
2252 }
2253 AliSplineFit *fit = new AliSplineFit();
2254 fit->SetMinPoints(10);
2255 fit->InitKnots(gr,10,10,0.0);
2256 fit->SplineFit(2);
2257 fit->Cleanup();
44e45fac 2258 return fit;
48b1b444 2259}
2260
44e45fac 2261//_________________________________________________________________________
2262
39e3007b 2263TString AliGRPPreprocessor::ProcessChar(const TObjArray *array)
e7a6790f 2264{
17984b61 2265
44e45fac 2266 //
2267 // processing char
2268 //
2269
2270 TString aDCSString="";
2271
2272 AliDCSValue *v = 0x0;
2273 for(Int_t iCount = 0; iCount < array->GetEntries(); iCount++) {
2274 v = (AliDCSValue *)array->At(iCount);
26c1dff2 2275 if (((Int_t)(v->GetTimeStamp()) < (Int_t)GetStartTimeDCSQuery()) || ((Int_t)(v->GetTimeStamp()) > (Int_t)GetEndTimeDCSQuery())) {
44e45fac 2276 AliError(Form("DCS values for the parameter outside the queried interval"));
2277 continue;
2278 }
2279 if (iCount > 0) {
7e6f5523 2280 if (aDCSString != v->GetChar())
44e45fac 2281 AliError(Form("DCS values for the parameter changed from %s to %c within the queried interval", aDCSString.Data(), (Char_t)v->GetChar()));
2282 }
2283 aDCSString = (TString)v->GetChar(); // keeping always last value in the array
2284 }
2285 return aDCSString;
2286}
e7a6790f 2287
44e45fac 2288//__________________________________________________________________________________________________________________
e7a6790f 2289
39e3007b 2290Float_t* AliGRPPreprocessor::ProcessFloatAll(const TObjArray* array)
44e45fac 2291{
2292 //
2293 // processing Float values using Mean, Median, Standard Deviation wrt Mean, Standar Deviation wrt Median
2294 //
2295 // parameters[0] = mean
2296 // parameters[1] = truncated mean (calculated excluding points outside +/- 3RMS from mean
2297 // parameters[2] = median
2298 // parameters[3] = standard deviation wrt mean
2299 // parameters[4] = standard deviation wrt median
2300 //
2301
28131b57 2302 TString timeStartString = (TString)GetRunParameter("DAQ_time_start");
2303 TString timeEndString = (TString)GetRunParameter("DAQ_time_end");
2304 if (timeStartString.IsNull() || timeStartString.IsNull()){
2305 if (timeStartString.IsNull()){
2306 AliError("DAQ_time_start not set in logbook! Setting statistical values for current DP to invalid");
2307 }
2308 else if (timeStartString.IsNull()){
2309 AliError("DAQ_time_end not set in logbook! Setting statistical values for current DP to invalid");
2310 }
5fbf7677 2311 fdaqStartEndTimeOk = kFALSE;
28131b57 2312 return 0;
2313 }
2314
2315 Int_t timeStart = (Int_t)(timeStartString.Atoi());
2316 Int_t timeEnd = (Int_t)(timeEndString.Atoi());
5138cd05 2317 Float_t* parameters = new Float_t[5];
44e45fac 2318 Int_t iCounts = 0;
28131b57 2319 Int_t iCountsRun = 0;
44e45fac 2320 Int_t nCounts = array->GetEntries();
28131b57 2321 Float_t valueBeforeSOR = 0;
2322 Float_t valueAfterEOR = 0;
2323 Int_t timestampBeforeSOR = -1;
2324 Int_t timestampAfterEOR = -1;
2325 Int_t ientrySOR = -1;
2326 Int_t ientryEOR = -1;
2327 Float_t* arrayValues = 0x0;
2328 Double_t* arrayWeights = 0x0;
2329 Bool_t truncMeanFlag = kTRUE; // flag to indicate whether Truncated Mean should be calculated or not
5fbf7677 2330 Bool_t sdFlag = kTRUE; // flag to indicate whether SD (wrt Mean/Median) should be calculated or not
2331
44e45fac 2332 for(Int_t i = 0; i < nCounts; i++) {
2333 AliDCSValue *v = (AliDCSValue *)array->At(i);
fe726709 2334 if ((v->GetFloat() <= fminFloat) || (v->GetFloat() >= fmaxFloat)) {
2335 AliError(Form("Error! Float value found in DCS map at %d-th entry is OUT OF RANGE: value = %6.5e",i,v->GetFloat()));
2336 if (v->GetFloat() < fminFloat) AliInfo(Form("The value is smaller than %6.5e",fminFloat));
2337 if (v->GetFloat() > fmaxFloat) AliInfo(Form("The value is greater than %6.5e",fmaxFloat));
24f67180 2338 delete [] parameters;
fe726709 2339 return NULL;
2340 }
2341 if(((Int_t)(v->GetTimeStamp()) >= (Int_t)GetStartTimeDCSQuery()) &&((Int_t)(v->GetTimeStamp()) <= (Int_t)GetEndTimeDCSQuery())) {
28131b57 2342 AliDebug(2,Form("%d-th entry = %f at timestamp %i",i,v->GetFloat(),v->GetTimeStamp()));
fe726709 2343 iCounts += 1;
28131b57 2344 // look for the last value before SOR and the first value before EOR
2345 if (((Int_t)(v->GetTimeStamp()) >= (Int_t)GetStartTimeDCSQuery()) && (Int_t)(v->GetTimeStamp()) < timeStart) {
2346 timestampBeforeSOR = (Int_t)(v->GetTimeStamp());
2347 AliDebug(2,Form("timestamp of last value before SOR = %d, with DAQ_time_start = %d",timestampBeforeSOR,timeStart));
2348 valueBeforeSOR = v->GetFloat();
2349 }
2350 else if ((Int_t)(v->GetTimeStamp()) <= (Int_t)GetEndTimeDCSQuery() && (Int_t)(v->GetTimeStamp()) > timeEnd && timestampAfterEOR == -1){
2351 timestampAfterEOR = (Int_t)(v->GetTimeStamp());
2352 valueAfterEOR = v->GetFloat();
2353 AliDebug(2,Form("timestamp of first value after EOR = %d, with DAQ_time_end = %d",timestampAfterEOR,timeEnd));
2354 }
2355 // check if there are DPs between DAQ_time_start and DAQ_time_end
2356 if(((Int_t)(v->GetTimeStamp()) >= timeStart) &&((Int_t)(v->GetTimeStamp()) <= timeEnd)) {
2357 if (ientrySOR == -1) ientrySOR = i; // first entry after SOR
2358 if (ientryEOR < i) ientryEOR = i; // last entry before EOR
2359 AliDebug(2,Form("entry between SOR and EOR"));
2360 iCountsRun += 1;
2361 }
fe726709 2362 }
2363 else {
28131b57 2364 AliError(Form("DCS values for the parameter outside the queried interval: timestamp = %d",v->GetTimeStamp()));
fe726709 2365 }
2366 }
2367
28131b57 2368 if (timestampBeforeSOR == -1){
df1faeb3 2369 AliWarning("No value found before SOR");
28131b57 2370 }
2371 if (timestampAfterEOR == -1){
df1faeb3 2372 AliWarning("No value found after EOR");
28131b57 2373 }
2374
2375 AliDebug(2,Form("Number of valid entries (within DCS query interval) = %i, from a total amount of %i entries",iCounts,nCounts));
2376 AliDebug(2,Form("Last value before DAQ_time_start (SOR) = %f at timestamp = %d",valueBeforeSOR,timestampBeforeSOR));
2377 AliDebug(2,Form("First value after DAQ_time_end (EOR) = %f at timestamp = %d",valueAfterEOR,timestampAfterEOR));
2378 AliInfo(Form("Found %d entries between DAQ_time_start (SOR) and DAQ_time_end (EOR)",iCountsRun));
2379 AliDebug(2,Form("Index of first entry after DAQ_time_start (SOR) = %d ",ientrySOR));
2380 AliDebug(2,Form("Index of first entry before DAQ_time_end (EOR) = %d ",ientryEOR));
2381
2382 Int_t nentriesUsed = 0;
2383 if (iCountsRun > 1){
2384 AliInfo("Using entries between DAQ_time_start (SOR) and DAQ_time_end (EOR)");
2385 AliDebug(2,"Calculating (weighted) Mean and Median");
2386 arrayValues = new Float_t[iCountsRun];
2387 arrayWeights = new Double_t[iCountsRun];
2388 nentriesUsed = iCountsRun;
2389 for (Int_t i = ientrySOR; i <= ientryEOR; i++){
fe726709 2390 AliDCSValue *v = (AliDCSValue *)array->At(i);
28131b57 2391 Int_t timestamp2 = 0;
2392 if (i < ientryEOR){
2393 AliDCSValue *v1 = (AliDCSValue *)array->At(i+1);
2394 timestamp2 = (Int_t)v1->GetTimeStamp();
fe726709 2395 }
28131b57 2396 else {
2397 timestamp2 = timeEnd+1;
2398 }
2399 arrayWeights[i-ientrySOR] = (Double_t)(timestamp2 - (Int_t)v->GetTimeStamp());
2400 arrayValues[i-ientrySOR] = v->GetFloat();
fe726709 2401 }
28131b57 2402 parameters[0] = TMath::Mean(iCountsRun,arrayValues,arrayWeights);
2403 parameters[2] = TMath::Median(iCountsRun,arrayValues,arrayWeights);
2404 }
2405 else if (iCountsRun == 1){
2406 AliDCSValue* v = (AliDCSValue *)array->At(ientrySOR);
2407 nentriesUsed = 2;
2408 if (timestampBeforeSOR != -1 && timestampBeforeSOR != (Int_t)v->GetTimeStamp()){
2409 AliWarning("Using single entry between DAQ_time_start (SOR) and DAQ_time_end (EOR) and last entry before SOR. Truncated mean won't be calculated.");
2410 arrayValues = new Float_t[2];
2411 arrayWeights = new Double_t[2];
2412 arrayValues[0] = valueBeforeSOR;
2413 arrayWeights[0] = (Double_t)((Int_t)v->GetTimeStamp()-timestampBeforeSOR);
2414 arrayValues[1] = v->GetFloat();
2415 arrayWeights[1] = (Double_t)(timeEnd+1-(Int_t)v->GetTimeStamp());
2416 AliDebug(2, Form("value0 = %f, with weight = %f",arrayValues[0],arrayWeights[0]));
2417 AliDebug(2, Form("value1 = %f, with weight = %f",arrayValues[1],arrayWeights[1]));
2418 parameters[0] = TMath::Mean(2,arrayValues,arrayWeights);
2419 parameters[2] = TMath::Median(2,arrayValues,arrayWeights);
2420 truncMeanFlag = kFALSE;
fe726709 2421 }
2422 else{
28131b57 2423 AliError("Cannot calculate mean, truncated mean, median, SD wrt mean, SD wrt median for current DP - only one value collected during the run, but no value before with which to calculate the statistical quantities");
2424 parameters[0] = AliGRPObject::GetInvalidFloat();
2425 parameters[1] = AliGRPObject::GetInvalidFloat();
2426 parameters[2] = AliGRPObject::GetInvalidFloat();
2427 parameters[3] = AliGRPObject::GetInvalidFloat();
2428 parameters[4] = AliGRPObject::GetInvalidFloat();
2429 return parameters;
fe726709 2430 }
2431 }
5fbf7677 2432 else { // iCountsRun == 0, using only the point immediately before SOR
2433 if (timestampBeforeSOR == -1){
2434 AliError("Cannot set mean, truncated mean, median, SD wrt mean, SD wrt median for current DP - no points during the run collected, and point before SOR missing");
28131b57 2435 parameters[0] = AliGRPObject::GetInvalidFloat();
2436 parameters[1] = AliGRPObject::GetInvalidFloat();
2437 parameters[2] = AliGRPObject::GetInvalidFloat();
2438 parameters[3] = AliGRPObject::GetInvalidFloat();
2439 parameters[4] = AliGRPObject::GetInvalidFloat();
2440 return parameters;
2441 }
2442 else {
5fbf7677 2443 AliWarning("Using only last entry before SOR. Truncated mean and Standard deviations (wrt mean/median) won't be calculated.");
2444 AliDebug(2,Form("value = %f",valueBeforeSOR));
2445 parameters[0] = valueBeforeSOR;
2446 parameters[2] = valueBeforeSOR;
28131b57 2447 truncMeanFlag = kFALSE;
5fbf7677 2448 sdFlag = kFALSE;
28131b57 2449 }
2450 }
2451
fdc6afb7 2452 AliDebug(2, Form("nentriesUsed = %d", nentriesUsed));
28131b57 2453 Float_t temp = 0;
2454 Float_t temp1 = 0;
2455 Float_t sumweights = 0;
2456 Int_t entriesTruncMean = 0;
2457 Float_t* arrayValuesTruncMean = new Float_t[nentriesUsed];
2458 Double_t* arrayWeightsTruncMean = new Double_t[nentriesUsed];
2459
2460 // calculating SD wrt Mean and Median
2461 AliDebug(2,"Calculating SD wrt Mean and SD wrt Median");
5fbf7677 2462 if (sdFlag){
2463 for (Int_t i =0; i< nentriesUsed; i++){
df1faeb3 2464 AliDebug(2,Form("Entry %d: value = %f, weight = %f",i,arrayValues[i],arrayWeights[i]));
5fbf7677 2465 temp += (arrayValues[i]-parameters[2])*(arrayValues[i]-parameters[2]);
2466 temp1 += arrayWeights[i]*(arrayValues[i]-parameters[0])*(arrayValues[i]-parameters[0]);
2467 sumweights += arrayWeights[i];
2468 }
2469 // setting SD wrt Mean
2470 if (sumweights != 0 ){
2471 parameters[3] = TMath::Sqrt(temp1/sumweights);
2472 }
2473 else {
2474 AliError("Sum of weights to calculate Standard Deviation (wrt mean) <= 0, setting the SD to invalid");
2475 parameters[3] = AliGRPObject::GetInvalidFloat();
2476 }
2477 // setting SD wrt Median
2478 if (nentriesUsed != 0){
2479 parameters[4] = TMath::Sqrt(temp/nentriesUsed);
2480 }
2481 else{
2482 AliError("Number of entries used to calculate Standard Deviation (wrt median) <= 0, setting the SD to invalid");
2483 parameters[4] = AliGRPObject::GetInvalidFloat();
2484 }
28131b57 2485 }
fe726709 2486 else {
28131b57 2487 parameters[3] = AliGRPObject::GetInvalidFloat();
28131b57 2488 parameters[4] = AliGRPObject::GetInvalidFloat();
5fbf7677 2489 }
fe726709 2490
28131b57 2491 // calculating truncated mean (this comes afterwards since you need the SD wrt Mean)
2492 if (truncMeanFlag){
2493 AliDebug(2,"Calculating Truncated Mean");
2494 for (Int_t i =0; i< nentriesUsed; i++){
df1faeb3 2495 AliDebug(2,Form("Entry %d: value = %f, weight = %f",i,arrayValues[i],arrayWeights[i]));
28131b57 2496 if ((arrayValues[i]<=parameters[0]+3*parameters[3]) && (arrayValues[i]>=parameters[0]-3*parameters[3])){
df1faeb3 2497 arrayValuesTruncMean[entriesTruncMean]=arrayValues[i];
2498 arrayWeightsTruncMean[entriesTruncMean]=arrayWeights[i];
2499 AliDebug(2,Form("For Truncated Mean: Entry %d: value = %f, weight = %f",entriesTruncMean,arrayValuesTruncMean[entriesTruncMean],arrayWeightsTruncMean[entriesTruncMean]));
28131b57 2500 entriesTruncMean++;
df1faeb3 2501 }
2502 else{
2503 AliDebug(2,"Discarding entry");
28131b57 2504 }
2505 }
2506 // setting truncated mean
2507 if (entriesTruncMean >1){
2508 AliDebug(2,Form("%d entries used for truncated mean",entriesTruncMean));
2509 parameters[1] = TMath::Mean(entriesTruncMean,arrayValuesTruncMean,arrayWeightsTruncMean);
2510 }
2511 else{
2512 AliDebug(2,Form("Too few entries (%d) to calculate truncated mean",entriesTruncMean));
2513 parameters[1] = AliGRPObject::GetInvalidFloat();
2514 }
2515 }
2516 else{
2517 parameters[1] = AliGRPObject::GetInvalidFloat();
2518 }
fe726709 2519
24f67180 2520 if (arrayValues){
2521 delete [] arrayValues;
2522 }
2523 if (arrayWeights){
2524 delete [] arrayWeights;
2525 }
2526 delete [] arrayValuesTruncMean;
2527 delete [] arrayWeightsTruncMean;
2528
28131b57 2529 AliInfo(Form("(weighted) mean = %f ",parameters[0]));
2530 AliInfo(Form("(weighted) truncated mean = %f ",parameters[1]));
1a3ac627 2531 AliInfo(Form("median = %f ",parameters[2]));
28131b57 2532 AliInfo(Form("(weighted) standard deviation with (weighted) mean = %f ",parameters[3]));
2533 AliInfo(Form("standard deviation with median = %f ",parameters[4]));
2534
fe726709 2535 return parameters;
2536}
2537
fe726709 2538//__________________________________________________________________________________________________________________
2539
2540Float_t* AliGRPPreprocessor::ProcessFloatAllMagnet(const TObjArray* array, Int_t indexDP, Bool_t &isZero)
2541{
2542 //
2543 // processing Float values using Mean, Median, Standard Deviation wrt Mean, Standar Deviation wrt Median
2544 // used for L3 and Dipole magnets, using isZero flag to decide whther the magnet was OFF/ON
ac833e7a 2545 // the flag is set according to the L3/Dipole current value
2546 // current threshold for L3 = 350 A (value provided by DCS)
2547 // current threshold for Dipole = 450 A (value provided by DCS)
fe726709 2548 //
2549 // parameters[0] = mean
2550 // parameters[1] = truncated mean (calculated excluding points outside +/- 3RMS from mean
2551 // parameters[2] = median
2552 // parameters[3] = standard deviation wrt mean
2553 // parameters[4] = standard deviation wrt median
2554 //
2555
2556 AliInfo(Form("indexDP = %d",indexDP));
28131b57 2557
fe726709 2558 Int_t nCounts = array->GetEntries();
fe726709 2559 for(Int_t i = 0; i < nCounts; i++) {
2560 AliDCSValue *v = (AliDCSValue *)array->At(i);
2561 if ((v->GetFloat() <= fminFloat) || (v->GetFloat() >= fmaxFloat)) {
2562 AliError(Form("Error! Float value found in DCS map at %d-th entry is OUT OF RANGE: value = %6.5e",i,v->GetFloat()));
535c05eb 2563 if (v->GetFloat() < fminFloat) AliInfo(Form("The value is smaller than %6.5e",fminFloat));
2564 if (v->GetFloat() > fmaxFloat) AliInfo(Form("The value is greater than %6.5e",fmaxFloat));
fe726709 2565 return NULL;
2566 }
26c1dff2 2567 if(((Int_t)(v->GetTimeStamp()) >= (Int_t)GetStartTimeDCSQuery()) &&((Int_t)(v->GetTimeStamp()) <= (Int_t)GetEndTimeDCSQuery())) {
28131b57 2568 AliDebug(2,Form("%d-th entry = %f",i,v->GetFloat()));
ac833e7a 2569 if (indexDP == kL3Current && v->GetFloat() > 350 && isZero == kTRUE) isZero=kFALSE;
2570 if (indexDP == kDipoleCurrent && v->GetFloat() > 450 && isZero == kTRUE) isZero=kFALSE;
fe726709 2571 }
2572 else {
2573 AliError(Form("DCS values for the parameter outside the queried interval"));
44e45fac 2574 }
2575 }
2576
28131b57 2577 return ProcessFloatAll(array);
44e45fac 2578}
125567f8 2579
e97cc90e 2580
44e45fac 2581//_______________________________________________________________
e97cc90e 2582
fe726709 2583Char_t AliGRPPreprocessor::ProcessBool(const TObjArray* array, Bool_t &change)
44e45fac 2584{
2585 //
2586 // processing Boolean values
2587 //
2588
2589 Bool_t aDCSBool = kTRUE;
2590
2591 AliDCSValue *v = 0x0;
26c1dff2 2592
44e45fac 2593 for(Int_t iCount = 0; iCount < array->GetEntries(); iCount++) {
2594 v = (AliDCSValue *)array->At(iCount);
26c1dff2 2595 if (((Int_t)(v->GetTimeStamp()) < (Int_t)GetStartTimeDCSQuery()) || ((Int_t)(v->GetTimeStamp()) > (Int_t)GetEndTimeDCSQuery())) {
44e45fac 2596 AliError(Form("DCS values for the parameter outside the queried interval"));
2597 continue;
2598 }
2599 if (iCount > 0) {
01920f0c 2600 if (aDCSBool != v->GetBool()) {
2601 AliError(Form("DCS values for the parameter changed from %d to %d within the queried interval", (UInt_t)aDCSBool, (UInt_t)v->GetBool()));
2602 change = kTRUE;
2603 }
44e45fac 2604 }
2605 aDCSBool = v->GetBool(); // always keeping last value
26c1dff2 2606 AliDebug(2,Form("Bool = %d",(Int_t)aDCSBool));
44e45fac 2607 }
2608
26c1dff2 2609 Char_t caDCSBool = (Char_t) aDCSBool;
44e45fac 2610 return caDCSBool;
2611
2612}
e97cc90e 2613
44e45fac 2614//_______________________________________________________________
e97cc90e 2615
39e3007b 2616Float_t AliGRPPreprocessor::ProcessInt(const TObjArray* array)
44e45fac 2617{
2618 //
2619 // processing Int values, returning mean
fe726709 2620 // AliGRPObject::GetInvalidFloat() is returned if any of the DCS values
2621 // are outside the queried time interval or their value is out of range
44e45fac 2622 //
2623
28131b57 2624 TString timeStartString = (TString)GetRunParameter("DAQ_time_start");
2625 TString timeEndString = (TString)GetRunParameter("DAQ_time_end");
2626 if (timeStartString.IsNull() || timeStartString.IsNull()){
2627 if (timeStartString.IsNull()){
2628 AliError("DAQ_time_start not set in logbook! Setting statistical values for current DP to invalid");
2629 }
2630 else if (timeStartString.IsNull()){
2631 AliError("DAQ_time_end not set in logbook! Setting statistical values for current DP to invalid");
2632 }
2633 return 0;
2634 }
2635
2636 Int_t timeStart = (Int_t)(timeStartString.Atoi());
2637 Int_t timeEnd = (Int_t)(timeEndString.Atoi());
44e45fac 2638 Float_t aDCSArrayMean = 0.0;
2639 Int_t iCounts = 0;
28131b57 2640 Float_t valueBeforeSOR = 0;
2641 Float_t valueAfterEOR = 0;
2642 Int_t timestampBeforeSOR = -1;
2643 Int_t timestampAfterEOR = -1;
2644 Int_t ientrySOR = -1;
2645 Int_t ientryEOR = -1;
2646 Float_t* arrayValues = 0x0;
2647 Double_t* arrayWeights = 0x0;
2648 Int_t iCountsRun = 0;
2649 Int_t nCounts = array->GetEntries();
44e45fac 2650
28131b57 2651 for(Int_t i = 0; i < nCounts; i++) {
dd5ac86b 2652 AliDCSValue* v = (AliDCSValue *)array->At(i);
fe726709 2653 if ((v->GetInt() < fminInt) || (v->GetInt() > fmaxInt)) {
28131b57 2654 AliError(Form("Error! Int value found in DCS map at %d-th entry is OUT OF RANGE: value = %d",i, v->GetInt()));
fe726709 2655 return AliGRPObject::GetInvalidFloat();
2656 }
26c1dff2 2657 if(((Int_t)(v->GetTimeStamp()) >= (Int_t)GetStartTimeDCSQuery()) &&((Int_t)(v->GetTimeStamp()) <= (Int_t)GetEndTimeDCSQuery())) {
28131b57 2658 AliDebug(2,Form("%d-th entry = %d at timestamp %i",i,v->GetInt(),v->GetTimeStamp()));
44e45fac 2659 iCounts += 1;
28131b57 2660 // look for the last value before SOR and the first value before EOR
2661 if (((Int_t)(v->GetTimeStamp()) >= (Int_t)GetStartTimeDCSQuery()) && (Int_t)(v->GetTimeStamp()) < timeStart) {
2662 timestampBeforeSOR = (Int_t)(v->GetTimeStamp());
2663 AliDebug(2,Form("timestamp of last entry before SOR = %d, with DAQ_time_start = %d",timestampBeforeSOR,timeStart));
2664 valueBeforeSOR = (Float_t) v->GetInt();
2665 }
2666 else if ((Int_t)(v->GetTimeStamp()) <= (Int_t)GetEndTimeDCSQuery() && (Int_t)(v->GetTimeStamp()) > timeEnd && timestampAfterEOR == -1){
2667 timestampAfterEOR = (Int_t)(v->GetTimeStamp());
2668 valueAfterEOR = (Float_t) v->GetInt();
2669 AliDebug(2,Form("timestamp of first entry after EOR = %d, with DAQ_time_end = %d",timestampAfterEOR,timeEnd));
2670 }
2671 // check if there are DPs between DAQ_time_start and DAQ_time_end
2672 if(((Int_t)(v->GetTimeStamp()) >= timeStart) &&((Int_t)(v->GetTimeStamp()) <= timeEnd)) {
2673 if (ientrySOR == -1) ientrySOR = i; // first entry after SOR
2674 if (ientryEOR < i) ientryEOR = i; // last entry before EOR
2675 AliDebug(2,Form("entry between SOR and EOR"));
2676 iCountsRun += 1;
2677 }
2678 }
2679 else {
2680 AliError(Form("DCS values for the parameter outside the queried interval: timestamp = %d",v->GetTimeStamp()));
44e45fac 2681 }
2682 }
2683
28131b57 2684 if (timestampBeforeSOR == -1){
2685 AliWarning("No value found before SOR!");
2686 }
2687 if (timestampAfterEOR == -1){
2688 AliWarning("No value found after EOR!");
2689 }
2690
2691 AliDebug(2,Form("Number of valid entries (within query interval) = %i, starting from %i entries",iCounts,nCounts));
2692 AliDebug(2,Form("Last value before DAQ_time_start (SOR) = %f at timestamp = %d",valueBeforeSOR,timestampBeforeSOR));
2693 AliDebug(2,Form("First value after DAQ_time_end (EOR) = %f at timestamp = %d",valueAfterEOR,timestampAfterEOR));
2694 AliInfo(Form("Found %d entries between DAQ_time_start (SOR) and DAQ_time_end (EOR)",iCountsRun));
2695 AliDebug(2,Form("Index of first entry after DAQ_time_start (SOR) = %d ",ientrySOR));
2696 AliDebug(2,Form("Index of first entry before DAQ_time_end (EOR) = %d ",ientryEOR));
2697
2698 Int_t nentriesUsed = 0;
2699 if (iCountsRun > 1){
2700 AliInfo("Using entries between DAQ_time_start (SOR) and DAQ_time_end (EOR)");
2701 AliDebug(2,"Calculating (weighted) Mean");
2702 arrayValues = new Float_t[iCountsRun];
2703 arrayWeights = new Double_t[iCountsRun];
2704 nentriesUsed = iCountsRun;
2705 for (Int_t i = ientrySOR; i <= ientryEOR; i++){
2706 AliDCSValue *v = (AliDCSValue *)array->At(i);
2707 Int_t timestamp2 = 0;
2708 if (i < ientryEOR){
2709 AliDCSValue *v1 = (AliDCSValue *)array->At(i+1);
2710 timestamp2 = (Int_t)v1->GetTimeStamp();
2711 }
2712 else {
2713 timestamp2 = timeEnd+1;
2714 }
2715 arrayWeights[i-ientrySOR] = (Double_t)(timestamp2 - (Int_t)v->GetTimeStamp());
2716 arrayValues[i-ientrySOR] = (Float_t)v->GetInt();
2717 }
2718 aDCSArrayMean = TMath::Mean(iCountsRun,arrayValues,arrayWeights);
24f67180 2719 delete [] arrayValues;
2720 delete [] arrayWeights;
28131b57 2721 }
2722 else if (iCountsRun == 1){
2723 AliDCSValue* v = (AliDCSValue *)array->At(ientrySOR);
2724 nentriesUsed = 2;
2725 if (timestampBeforeSOR != -1 && timestampBeforeSOR != (Int_t)v->GetTimeStamp()){
2726 AliWarning("Using single entry between DAQ_time_start (SOR) and DAQ_time_end (EOR) and last entry before SOR.");
2727 arrayValues = new Float_t[2];
2728 arrayWeights = new Double_t[2];
2729 arrayValues[0] = valueBeforeSOR;
2730 arrayWeights[0] = (Double_t)((Int_t)v->GetTimeStamp()-timestampBeforeSOR);
2731 arrayValues[1] = (Float_t)v->GetInt();
2732 arrayWeights[1] = (Double_t)(timeEnd+1-(Int_t)v->GetTimeStamp());
2733 AliDebug(2,Form("value0 = %f, with weight = %f",arrayValues[0],arrayWeights[0]));
2734 AliDebug(2,Form("value1 = %f, with weight = %f",arrayValues[1],arrayWeights[1]));
2735 aDCSArrayMean = TMath::Mean(2,arrayValues,arrayWeights);
24f67180 2736 delete [] arrayValues;
2737 delete [] arrayWeights;
28131b57 2738 }
2739 else{
2740 AliError("Cannot calculate mean - only one value collected during the run, but no value before with which to calculate the statistical quantities");
2741 return AliGRPObject::GetInvalidFloat();
2742 }
2743 }
2744 else { // iCountsRun == 0, using the point immediately before SOR and the one immediately after EOR
2745 if (timestampBeforeSOR == -1 || timestampAfterEOR == -1){
2746 if (timestampBeforeSOR == -1){
2747 AliError("Cannot calculate mean - no points during the run collected, and point before SOR missing");
2748 }
2749 if (timestampAfterEOR == -1){
2750 AliError("Cannot calculate maen - no points during the run collected, and point after EOR missing");
2751 }
2752 return AliGRPObject::GetInvalidFloat();
2753 }
2754 else {
2755 AliWarning("Using last entry before SOR and first entry after EOR.");
2756 nentriesUsed = 2;
2757 arrayValues = new Float_t[2];
2758 arrayWeights = new Double_t[2];
2759 arrayValues[0] = valueBeforeSOR;
2760 arrayWeights[0] = (Double_t)(timestampAfterEOR - timestampBeforeSOR);
2761 arrayValues[1] = valueAfterEOR;
2762 arrayWeights[1] = 1.;
2763 AliDebug(2,Form("value0 = %f, with weight = %f",arrayValues[0],arrayWeights[0]));
2764 AliDebug(2,Form("value1 = %f, with weight = %f",arrayValues[1],arrayWeights[1]));
2765 aDCSArrayMean = TMath::Mean(1,arrayValues,arrayWeights);
24f67180 2766 delete [] arrayValues;
2767 delete [] arrayWeights;
28131b57 2768 }
2769 }
2770
8541a56d 2771 AliDebug(2, Form("nentriesUsed = %d", nentriesUsed));
28131b57 2772 AliInfo(Form("mean = %f ", aDCSArrayMean));
44e45fac 2773 return aDCSArrayMean;
e97cc90e 2774
44e45fac 2775}
2776//_______________________________________________________________
e7a6790f 2777
39e3007b 2778Float_t AliGRPPreprocessor::ProcessUInt(const TObjArray* array)
44e45fac 2779{
2780 //
fe726709 2781 // processing Int values, returning mean
2782 // AliGRPObject::GetInvalidFloat() is returned if any of the DCS values
2783 // are outside the queried time interval or their value is out of range
44e45fac 2784 //
2785
28131b57 2786 TString timeStartString = (TString)GetRunParameter("DAQ_time_start");
2787 TString timeEndString = (TString)GetRunParameter("DAQ_time_end");
2788 if (timeStartString.IsNull() || timeStartString.IsNull()){
2789 if (timeStartString.IsNull()){
2790 AliError("DAQ_time_start not set in logbook! Setting statistical values for current DP to invalid");
2791 }
2792 else if (timeStartString.IsNull()){
2793 AliError("DAQ_time_end not set in logbook! Setting statistical values for current DP to invalid");
2794 }
2795 return 0;
2796 }
2797
2798 Int_t timeStart = (Int_t)(timeStartString.Atoi());
2799 Int_t timeEnd = (Int_t)(timeEndString.Atoi());
44e45fac 2800 Float_t aDCSArrayMean = 0.0;
2801 Int_t iCounts = 0;
28131b57 2802 Float_t valueBeforeSOR = 0;
2803 Float_t valueAfterEOR = 0;
2804 Int_t timestampBeforeSOR = -1;
2805 Int_t timestampAfterEOR = -1;
2806 Int_t ientrySOR = -1;
2807 Int_t ientryEOR = -1;
2808 Float_t* arrayValues = 0x0;
2809 Double_t* arrayWeights = 0x0;
2810 Int_t iCountsRun = 0;
2811 Int_t nCounts = array->GetEntries();
44e45fac 2812
28131b57 2813 for(Int_t i = 0; i < nCounts; i++) {
dd5ac86b 2814 AliDCSValue* v = (AliDCSValue *)array->At(i);
fe726709 2815 if ((v->GetUInt() < fminUInt) || (v->GetUInt() > fmaxUInt)) {
28131b57 2816 AliError(Form("Error! UInt value found in DCS map at %d-th entry is OUT OF RANGE: value = %u",i,v->GetUInt()));
fe726709 2817 return AliGRPObject::GetInvalidFloat();
2818 }
26c1dff2 2819 if(((Int_t)(v->GetTimeStamp()) >= (Int_t)GetStartTimeDCSQuery()) &&((Int_t)(v->GetTimeStamp()) <= (Int_t)GetEndTimeDCSQuery())) {
28131b57 2820 AliDebug(2,Form("%d-th entry = %d at timestamp %i",i,v->GetUInt(),v->GetTimeStamp()));
44e45fac 2821 iCounts += 1;
28131b57 2822 // look for the last value before SOR and the first value before EOR
2823 if (((Int_t)(v->GetTimeStamp()) >= (Int_t)GetStartTimeDCSQuery()) && (Int_t)(v->GetTimeStamp()) < timeStart) {
2824 timestampBeforeSOR = (Int_t)(v->GetTimeStamp());
2825 AliDebug(2,Form("timestamp of last entry before SOR = %d, with DAQ_time_start = %d",timestampBeforeSOR,timeStart));
2826 valueBeforeSOR = (Float_t)v->GetUInt();
2827 }
2828 else if ((Int_t)(v->GetTimeStamp()) <= (Int_t)GetEndTimeDCSQuery() && (Int_t)(v->GetTimeStamp()) > timeEnd && timestampAfterEOR == -1){
2829 timestampAfterEOR = (Int_t)(v->GetTimeStamp());
2830 valueAfterEOR = (Float_t)v->GetUInt();
2831 AliDebug(2,Form("timestamp of first entry after EOR = %d, with DAQ_time_end = %d",timestampAfterEOR,timeEnd));
2832 }
2833 // check if there are DPs between DAQ_time_start and DAQ_time_end
2834 if(((Int_t)(v->GetTimeStamp()) >= timeStart) &&((Int_t)(v->GetTimeStamp()) <= timeEnd)) {
2835 if (ientrySOR == -1) ientrySOR = i; // first entry after SOR
2836 if (ientryEOR < i) ientryEOR = i; // last entry before EOR
2837 AliDebug(2,Form("entry between SOR and EOR"));
2838 iCountsRun += 1;
2839 }
2840 }
2841 else {
2842 AliError(Form("DCS values for the parameter outside the queried interval: timestamp = %d",v->GetTimeStamp()));
44e45fac 2843 }
2844 }
2845
28131b57 2846 if (timestampBeforeSOR == -1){
2847 AliWarning("No value found before SOR!");
2848 }
2849 if (timestampAfterEOR == -1){
2850 AliWarning("No value found after EOR!");
2851 }
2852
2853 AliDebug(2,Form("Number of valid entries (within query interval) = %i, starting from %i entries",iCounts,nCounts));
2854 AliDebug(2,Form("Last value before DAQ_time_start (SOR) = %f at timestamp = %d",valueBeforeSOR,timestampBeforeSOR));
2855 AliDebug(2,Form("First value after DAQ_time_end (EOR) = %f at timestamp = %d",valueAfterEOR,timestampAfterEOR));
2856 AliInfo(Form("Found %d entries between DAQ_time_start (SOR) and DAQ_time_end (EOR)",iCountsRun));
2857 AliDebug(2,Form("Index of first entry after DAQ_time_start (SOR) = %d ",ientrySOR));
2858 AliDebug(2,Form("Index of first entry before DAQ_time_end (EOR) = %d ",ientryEOR));
2859
2860 Int_t nentriesUsed = 0;
2861 if (iCountsRun > 1){
2862 AliInfo("Using entries between DAQ_time_start (SOR) and DAQ_time_end (EOR)");
2863 AliDebug(2,"Calculating (weighted) Mean");
2864 arrayValues = new Float_t[iCountsRun];
2865 arrayWeights = new Double_t[iCountsRun];
2866 nentriesUsed = iCountsRun;
2867 for (Int_t i = ientrySOR; i <= ientryEOR; i++){
2868 AliDCSValue *v = (AliDCSValue *)array->At(i);
2869 Int_t timestamp2 = 0;
2870 if (i < ientryEOR){
2871 AliDCSValue *v1 = (AliDCSValue *)array->At(i+1);
2872 timestamp2 = (Int_t)v1->GetTimeStamp();
2873 }
2874 else {
2875 timestamp2 = timeEnd+1;
2876 }
2877 arrayWeights[i-ientrySOR] = (Double_t)(timestamp2 - (Int_t)v->GetTimeStamp());
2878 arrayValues[i-ientrySOR] = (Float_t)v->GetUInt();
2879 }
611435c2 2880 aDCSArrayMean = TMath::Mean(iCountsRun,arrayValues,arrayWeights);
84c9e12a 2881 delete [] arrayValues;
2882 delete [] arrayWeights;
28131b57 2883 }
2884 else if (iCountsRun == 1){
2885 AliDCSValue* v = (AliDCSValue *)array->At(ientrySOR);
2886 nentriesUsed = 2;
2887 if (timestampBeforeSOR != -1 && timestampBeforeSOR != (Int_t)v->GetTimeStamp()){
2888 AliWarning("Using single entry between DAQ_time_start (SOR) and DAQ_time_end (EOR) and last entry before SOR.");
2889 arrayValues = new Float_t[2];
2890 arrayWeights = new Double_t[2];
2891 arrayValues[0] = valueBeforeSOR;
2892 arrayWeights[0] = (Double_t)((Int_t)v->GetTimeStamp()-timestampBeforeSOR);
2893 arrayValues[1] = (Float_t)v->GetUInt();
2894 arrayWeights[1] = (Double_t)(timeEnd+1-(Int_t)v->GetTimeStamp());
2895 AliDebug(2,Form("value0 = %f, with weight = %f",arrayValues[0],arrayWeights[0]));
2896 AliDebug(2,Form("value1 = %f, with weight = %f",arrayValues[1],arrayWeights[1]));
2897 aDCSArrayMean = TMath::Mean(2,arrayValues,arrayWeights);
24f67180 2898 delete [] arrayValues;
2899 delete [] arrayWeights;
28131b57 2900 }
2901 else{
2902 AliError("Cannot calculate mean - only one value collected during the run, but no value before with which to calculate the statistical quantities");
2903 return AliGRPObject::GetInvalidFloat();
2904 }
2905 }
2906 else { // iCountsRun == 0, using the point immediately before SOR and the one immediately after EOR
2907 if (timestampBeforeSOR == -1 || timestampAfterEOR == -1){
2908 if (timestampBeforeSOR == -1){
2909 AliError("Cannot calculate mean - no points during the run collected, and point before SOR missing");
2910 }
2911 if (timestampAfterEOR == -1){
2912 AliError("Cannot calculate maen - no points during the run collected, and point after EOR missing");
2913 }
2914 return AliGRPObject::GetInvalidFloat();
2915 }
2916 else {
2917 AliWarning("Using last entry before SOR and first entry after EOR.");
2918 nentriesUsed = 2;
2919 arrayValues = new Float_t[2];
2920 arrayWeights = new Double_t[2];
2921 arrayValues[0] = valueBeforeSOR;
2922 arrayWeights[0] = (Double_t)(timestampAfterEOR - timestampBeforeSOR);
2923 arrayValues[1] = valueAfterEOR;
2924 arrayWeights[1] = 1.;
2925 AliDebug(2,Form("value0 = %f, with weight = %f",arrayValues[0],arrayWeights[0]));
2926 AliDebug(2,Form("value1 = %f, with weight = %f",arrayValues[1],arrayWeights[1]));
2927 aDCSArrayMean = TMath::Mean(1,arrayValues,arrayWeights);
24f67180 2928 delete [] arrayValues;
2929 delete [] arrayWeights;
28131b57 2930 }
2931 }
2932
8541a56d 2933 AliDebug(2, Form("nentriesUsed = %d", nentriesUsed));
28131b57 2934 AliInfo(Form("mean = %f ",aDCSArrayMean));
44e45fac 2935 return aDCSArrayMean;
e7a6790f 2936
17984b61 2937}
125567f8 2938
44e45fac 2939
17984b61 2940//_______________________________________________________________
44e45fac 2941
3ba92a38 2942AliDCSSensorArray *AliGRPPreprocessor::GetPressureMap(TMap* dcsAliasMap)
e7a6790f 2943{
44e45fac 2944 // extract DCS pressure maps. Perform fits to save space
2945
44e45fac 2946 TMap *map = fPressure->ExtractDCS(dcsAliasMap);
2947 if (map) {
d7edf69d 2948 AliDebug(2,Form("Map has %d entries",map->GetEntries()));
44e45fac 2949 fPressure->MakeSplineFit(map);
2950 Double_t fitFraction = fPressure->NumFits()/fPressure->NumSensors();
2951 if (fitFraction > kFitFraction ) {
ce996d13 2952 AliInfo(Form("Pressure values extracted, %d fits performed for %d sensors.", fPressure->NumFits(),fPressure->NumSensors()));
44e45fac 2953 } else {
2954 AliInfo("Too few pressure maps fitted!!!");
2955 }
2956 } else {
2957 AliInfo("no atmospheric pressure map extracted!!!");
2958 }
2959 delete map;
2960
2961 return fPressure;
17984b61 2962}
e97cc90e 2963
1e27bb6b 2964
2965
2966//_______________________________________________________________
03e5ee4f 2967Int_t AliGRPPreprocessor::ReceivePromptRecoParameters(UInt_t run, const char* dbHost, Int_t dbPort, const char* dbName, const char* user, const char* password, const char *cdbRoot, TString &gdc)
1e27bb6b 2968{
44e45fac 2969 //
2970 // Retrieves logbook and trigger information from the online logbook
2971 // This information is needed for prompt reconstruction
2972 //
2973 // Parameters are:
2974 // Run number
2975 // DAQ params: dbHost, dbPort, dbName, user, password, logbookTable, triggerTable
2976 // cdbRoot
2977 //
2978 // returns:
2979 // positive on success: the return code is the run number of last run processed of the same run type already processed by the SHUTTLE
2980 // 0 on success and no run was found
2981 // negative on error
2982 //
2983 // This function is NOT called during the preprocessor run in the Shuttle!
2984 //
2985
2986 // defaults
2987 if (dbPort == 0)
2988 dbPort = 3306;
2989
2990 // CDB connection
2991 AliCDBManager* cdb = AliCDBManager::Instance();
2992 cdb->SetDefaultStorage(cdbRoot);
2993
2994 // SQL connection
2995 TSQLServer* server = TSQLServer::Connect(Form("mysql://%s:%d/%s", dbHost, dbPort, dbName), user, password);
2996
2997 if (!server)
2998 {
2999 Printf("ERROR: Could not connect to DAQ LB");
3000 return -1;
3001 }
3002
3003 // main logbook
3004 TString sqlQuery;
5d43966f 3005 sqlQuery.Form("SELECT DAQ_time_start, run_type, detectorMask, L3_magnetCurrent, Dipole_magnetCurrent,beamType FROM logbook WHERE run = %d", run);
44e45fac 3006 TSQLResult* result = server->Query(sqlQuery);
3007 if (!result)
3008 {
3009 Printf("ERROR: Can't execute query <%s>!", sqlQuery.Data());
3010 return -2;
3011 }
3012
3013 if (result->GetRowCount() == 0)
3014 {
3015 Printf("ERROR: Run %d not found", run);
3016 delete result;
3017 return -3;
3018 }
3019
3020 TSQLRow* row = result->Next();
3021 if (!row)
3022 {
3023 Printf("ERROR: Could not receive data from run %d", run);
3024 delete result;
3025 return -4;
3026 }
3027
26c1dff2 3028 TString timeStartString(row->GetField(0));
44e45fac 3029 TString runType(row->GetField(1));
26c1dff2 3030 TString detectorMaskString(row->GetField(2));
3031 TString l3CurrentString(row->GetField(3));
3032 TString dipoleCurrentString(row->GetField(4));
5d43966f 3033 TString beamTypeString(row->GetField(5));
26c1dff2 3034 time_t timeStart = (time_t)(timeStartString.Atoi());
3035 UInt_t detectorMask = (UInt_t)(detectorMaskString.Atoi());
3036 Float_t l3Current = (Float_t)(TMath::Abs(l3CurrentString.Atof()));
3037 Float_t dipoleCurrent = (Float_t)(TMath::Abs(dipoleCurrentString.Atof()));
03e5ee4f 3038 Char_t l3Polarity = (l3CurrentString.Atof() < 0) ? 1 : 0;
3039 Char_t dipolePolarity = (dipoleCurrentString.Atof() < 0) ? 1 : 0;
9f08228b 3040 if (beamTypeString.CompareTo("Pb-Pb",TString::kIgnoreCase) == 0){
3041 beamTypeString="A-A";
3042 }
44e45fac 3043
26c1dff2 3044 AliGRPObject * grpObj = new AliGRPObject();
3045 grpObj->SetTimeStart(timeStart);
3046 grpObj->SetRunType((TString)(row->GetField(1)));
3047 grpObj->SetDetectorMask(detectorMask);
3048 grpObj->SetL3Current(l3Current,(AliGRPObject::Stats)0);
3049 grpObj->SetDipoleCurrent(dipoleCurrent,(AliGRPObject::Stats)0);
03e5ee4f 3050 grpObj->SetL3Polarity(l3Polarity);
3051 grpObj->SetDipolePolarity(dipolePolarity);
48fcacdc 3052 grpObj->SetPolarityConventionLHC(); // after the dipole cables swap we comply with LHC convention
9f08228b 3053 grpObj->SetBeamType(beamTypeString);
26c1dff2 3054
44e45fac 3055 delete row;
3056 row = 0;
3057
3058 delete result;
3059 result = 0;
3060
3061 Printf("Storing GRP/GRP/Data object with the following content");
26c1dff2 3062 grpObj->Dump();
44e45fac 3063
3064 AliCDBMetaData metadata;
26c1dff2 3065 metadata.SetResponsible("Jan Fiete Grosse-Oetringhaus & Chiara Zampolli");
44e45fac 3066 metadata.SetComment("GRP Output parameters received during online running");
3067
3068 AliCDBId id("GRP/GRP/Data", run, run);
26c1dff2 3069 Bool_t success = cdb->Put(grpObj, id, &metadata);
44e45fac 3070
26c1dff2 3071 delete grpObj;
44e45fac 3072
3073 if (!success)
3074 {
3075 Printf("ERROR: Could not store GRP/GRP/Data into OCDB");
3076 return -5;
3077 }
3078
3079 // Receive trigger information
3080 sqlQuery.Form("SELECT configFile FROM logbook_trigger_config WHERE run = %d", run);
3081 result = server->Query(sqlQuery);
3082 if (!result)
3083 {
3084 Printf("ERROR: Can't execute query <%s>!", sqlQuery.Data());
3085 return -11;
3086 }
3087
3088 if (result->GetRowCount() == 0)
3089 {
3090 Printf("ERROR: Run %d not found in logbook_trigger_config", run);
3091 delete result;
3092 return -12;
3093 }
3094
3095 row = result->Next();
3096 if (!row)
3097 {
3098 Printf("ERROR: Could not receive logbook_trigger_config data from run %d", run);
3099 delete result;
3100 return -13;
3101 }
3102
3103 TString triggerConfig(row->GetField(0));
3104
3105 delete row;
3106 row = 0;
3107
3108 delete result;
3109 result = 0;
3110
3111 Printf("Found trigger configuration: %s", triggerConfig.Data());
3112
3113 AliTriggerConfiguration *runcfg = AliTriggerConfiguration::LoadConfigurationFromString(triggerConfig);
3114 if (!runcfg)
3115 {
3116 Printf("ERROR: Could not create CTP configuration object");
3117 return -14;
3118 }
3119
3120 metadata.SetComment("CTP run configuration received during online running");
3121
3122 AliCDBId id2("GRP/CTP/Config", run, run);
3123 success = cdb->Put(runcfg, id2, &metadata);
3124
3125 delete runcfg;
3126 runcfg = 0;
3127
3128 if (!success)
3129 {
3130 Printf("ERROR: Could not store GRP/CTP/Config into OCDB");
3131 return -15;
3132 }
3133
03e5ee4f 3134
3135 // Receive list of GDCs for this run
3136 sqlQuery.Form("SELECT GDC FROM logbook_stats_GDC WHERE run = %d", run);
3137 result = server->Query(sqlQuery);
3138 if (!result)
3139 {
3140 Printf("ERROR: Can't execute query <%s>!", sqlQuery.Data());
3141 return -24;
3142 }
3143
3144 if (result->GetRowCount() == 0)
3145 {
3146 Printf("ERROR: Run %d not found in logbook_stats_GDC", run);
3147 delete result;
3148 return -25;
3149 }
2b81b7d0 3150
3151 gdc = "";
3152 for (Int_t iGDC = 0; iGDC < result->GetRowCount(); iGDC++) {
3153 row = result->Next();
3154 if (!row)
3155 {
3156 Printf("ERROR: Could not receive logbook_stats_GDC data from run %d", run);
3157 delete result;
3158 return -26;
3159 }
3160 gdc += row->GetField(0);
3161 gdc += " ";
3162 }
3163
03e5ee4f 3164 delete row;
3165 row = 0;
3166
3167 delete result;
3168 result = 0;
3169
3170 Printf("Found GDC: %s", gdc.Data());
3171
44e45fac 3172 // get last run with same run type that was already processed by the SHUTTLE
3173
3174 sqlQuery.Form("SELECT max(logbook.run) FROM logbook LEFT JOIN logbook_shuttle ON logbook_shuttle.run = logbook.run WHERE run_type = '%s' AND shuttle_done = 1", runType.Data());
3175 result = server->Query(sqlQuery);
3176 if (!result)
3177 {
3178 Printf("ERROR: Can't execute query <%s>!", sqlQuery.Data());
3179 return -21;
3180 }
3181
3182 if (result->GetRowCount() == 0)
3183 {
3184 Printf("ERROR: No result with query <%s>", sqlQuery.Data());
3185 delete result;
3186 return -22;
3187 }
3188
3189 row = result->Next();
3190 if (!row)
3191 {
3192 Printf("ERROR: Could not receive data for query <%s>", sqlQuery.Data());
3193 delete result;
3194 return -23;
3195 }
3196
3197 TString lastRunStr(row->GetField(0));
3198 Int_t lastRun = lastRunStr.Atoi();
3199
3200 Printf("Last run with same run type %s is %d", runType.Data(), lastRun);
3201
3202 delete row;
3203 row = 0;
3204
3205 delete result;
3206 result = 0;
3207
3208 server->Close();
3209 delete server;
3210 server = 0;
3211
3212 return lastRun;
1e27bb6b 3213}
0254e751 3214//------------------------------------------------------------------------------------------------------
4cbf81c1 3215Float_t AliGRPPreprocessor::ProcessEnergy(TObjArray* const array, Double_t timeStart){
0254e751 3216
3217 //
3218 // Method to processo LHC Energy information
3219 // Only the first value is returned, provided that it is withing DAQ_time_start and DAQ_time_end
3220 //
3221
3222 Int_t nCounts = array->GetEntries();
3223 Float_t energy = -1;
4cbf81c1 3224 Double_t timeEnergy = -1;
3225 Int_t indexEnergy = -1;
3226 Bool_t foundEnergy = kFALSE;
3227
0254e751 3228 AliDebug(2,Form("Energy measurements = %d\n",nCounts));
0d361338 3229 if (nCounts ==0){
3230 AliWarning("No Energy values found! Beam Energy remaining invalid!");
3231 }
3232 else{
4cbf81c1 3233 for (Int_t i = 0; i < nCounts; i++){
0d361338 3234 AliDCSArray *dcs = (AliDCSArray*)array->At(i);
4cbf81c1 3235 if (dcs){
3236 if (dcs->GetTimeStamp()<=timeStart && dcs->GetTimeStamp()>=timeEnergy){// taking always the very last entry: of two measurements have the same timestamp, the last one is taken
3237 timeEnergy = dcs->GetTimeStamp();
3238 indexEnergy = i;
3239 foundEnergy = kTRUE;
3240 }
3241 else{
3242 break;
3243 }
0d361338 3244 }
0254e751 3245 }
4cbf81c1 3246 if (!foundEnergy){
3247 AliInfo("No value for the Energy found before start of run, the Energy will remain invalid");
3248 }
3249 else {
3250 AliDCSArray* dcs = (AliDCSArray*)array->At(indexEnergy);
3251 energy = (Float_t)(TMath::Nint(((Double_t)(dcs->GetInt(0)))*120/1000)); // sqrt(s)/2 energy in GeV
3252 AliInfo(Form("Energy value found = %d (at %f), converting --> sqrt(s)/2 = %f (GeV)", dcs->GetInt(0),dcs->GetTimeStamp(),energy));
e541e2aa 3253 }
0254e751 3254 }
3255
3256 return energy;
3257}
8c1f1006 3258//------------------------------------------------------------------------------------------------------
17fd2848 3259AliLHCClockPhase* AliGRPPreprocessor::ProcessLHCClockPhase(TObjArray *beam1phase,TObjArray *beam2phase, Double_t timeEnd)
8c1f1006 3260{
3261 //
3262 // Method to process LHC-Clock Phase data
3263 // Only the values between DAQ_time_start and DAQ_time_end are kept
3264 //
3265 AliLHCClockPhase *phaseObj = new AliLHCClockPhase;
3266
3267 Bool_t foundBeam1Phase = kFALSE, foundBeam2Phase = kFALSE;
0c191635 3268 const Float_t threshold = 0.050; // we store the measurement only in case they differ with more 50ps from the previous one
8c1f1006 3269
17fd2848 3270 TString timeCreatedStr = GetRunParameter("time_created");
3271 Double_t timeCreated = timeCreatedStr.Atof();
3272
8c1f1006 3273 Int_t nCounts = beam1phase->GetEntries();
3274 AliDebug(2,Form("Beam1 phase measurements = %d\n",nCounts));
3275 if (nCounts ==0){
3276 AliWarning("No beam1 LHC clock phase values found!");
3277 delete phaseObj;
3278 return NULL;
3279 }
3280 else{
0c191635 3281 Double_t prevPhase = 0;
8c1f1006 3282 for (Int_t i = 0; i < nCounts; i++){
3283 AliDCSArray *dcs = (AliDCSArray*)beam1phase->At(i);
3284 if (dcs){
f1226569 3285 //if (dcs->GetTimeStamp()>=timeStart && dcs->GetTimeStamp()<=timeEnd) {
3286 if (dcs->GetTimeStamp()>=timeCreated && dcs->GetTimeStamp()<=timeEnd) {
0c191635 3287 if ((i == 0) || (i == (nCounts-1)) ||
3288 !foundBeam1Phase ||
3289 (TMath::Abs(dcs->GetDouble(0)-prevPhase) > threshold)) {
3290 prevPhase = dcs->GetDouble(0);
3291 foundBeam1Phase = kTRUE;
3292 AliInfo(Form("B1 Clk Phase = %f at TS = %f",
3293 (Float_t)dcs->GetDouble(0),dcs->GetTimeStamp()));
3294 phaseObj->AddPhaseB1DP((UInt_t)dcs->GetTimeStamp(),(Float_t)dcs->GetDouble(0));
3295 }
8c1f1006 3296 }
3297 }
3298 }
3299 if (!foundBeam1Phase){
3300 AliError("No beam1 LHC clock phase values found within the run!");
3301 delete phaseObj;
3302 return NULL;
3303 }
3304 }
3305
3306 nCounts = beam2phase->GetEntries();
3307 AliDebug(2,Form("Beam2 phase measurements = %d\n",nCounts));
3308 if (nCounts ==0){
3309 AliWarning("No beam2 LHC clock phase values found!");
3310 delete phaseObj;
3311 return NULL;
3312 }
3313 else{
0c191635 3314 Double_t prevPhase = 0;
8c1f1006 3315 for (Int_t i = 0; i < nCounts; i++){
3316 AliDCSArray *dcs = (AliDCSArray*)beam2phase->At(i);
3317 if (dcs){
17fd2848 3318 if (dcs->GetTimeStamp()>=timeCreated && dcs->GetTimeStamp()<=timeEnd) {
0c191635 3319 if ((i == 0) || (i == (nCounts-1)) ||
3320 !foundBeam2Phase ||
3321 (TMath::Abs(dcs->GetDouble(0)-prevPhase) > threshold)) {
3322 prevPhase = dcs->GetDouble(0);
3323 foundBeam2Phase = kTRUE;
3324 AliInfo(Form("B2 Clk Phase = %f at TS = %f",
3325 (Float_t)dcs->GetDouble(0),dcs->GetTimeStamp()));
3326 phaseObj->AddPhaseB2DP((UInt_t)dcs->GetTimeStamp(),(Float_t)dcs->GetDouble(0));
3327 }
8c1f1006 3328 }
3329 }
3330 }
3331 if (!foundBeam2Phase){
3332 AliError("No beam2 LHC clock phase values found within the run!");
3333 delete phaseObj;
3334 return NULL;
3335 }
3336 }
3337
3338 return phaseObj;
3339}
81a1addb 3340//------------------------------------------------------------------------------------------------------
3341TString AliGRPPreprocessor::ParseBeamTypeString(TString beamType, Int_t iBeamType)
3342{
3343 // Method to return the convention for the separate beam type
3344 // in the form A*1000+Z
3345 // e.g.: Pb82 --> 208000 + 82 = 208082
3346 // p --> 1000 + 1 = 1001
3347
3348 Int_t a = 0;
3349 Int_t z = 0;
3350 TString separateString("");
3351 Log(Form("Setting Beam Type for beam %d to A*1000+Z",iBeamType));
3352 if (beamType.CompareTo("PROTON",TString::kIgnoreCase) == 0){
3353 Log(Form("Beam type %d is PROTON --> The single beam type will be set to 1001 (A = 1, Z = 1)",iBeamType));
3354 separateString = "1001";
3355 return separateString;
3356 }
3357 else {
3358 TPRegexp regexpA("\\D+");
3359 TPRegexp regexpZ("\\d+");
3360 TObjArray* arrayA = regexpA.MatchS(beamType);
3361 TObjArray* arrayZ = regexpZ.MatchS(beamType);
3362 if (arrayA->GetEntries() != 1 || arrayZ->GetEntries() != 1){
3363 Log(Form("The beamType string for beam %d does not contain the necessary information! Returning the info as published by LHC (i.e. %s)",iBeamType, beamType.Data()));
3364 return beamType;
3365 }
3366 else{
3367 TString strA = ((TObjString*)(arrayA->At(0)))->String();
3368 TString strZ = ((TObjString*)(arrayZ->At(0)))->String();
3369 if (strA.CompareTo("LEAD",TString::kIgnoreCase) == 0 || strA.CompareTo("PB",TString::kIgnoreCase) == 0){
3370 Log(Form("Beam %d is %s --> A = 208",iBeamType, strA.Data()));
3371 a = 208;
3372 }
3373 else{
3374 Log(Form("This beam was not foreseen so far, leaving A=0"));
3375 }
3376 z = strZ.Atoi();
3377 Log(Form("Beam %d has Z = %d",iBeamType, z));
3378 separateString = Form("%d",a*1000+z);
3379 return separateString;
3380 }
3381 }
3382
3383 return separateString;
3384
3385}
3386
f880d5b9 3387//------------------------------------------------------------------------------------------------------
3388Bool_t AliGRPPreprocessor::CheckFileRecords(const char* fileName) const
3389{
3390 // Check file logical records as in TFile::Map()
3391 // returning false in case the position of the final record is bigger than the file size
3392 // It should allow to mark as bad all and only raw tag files which would crash the chaining
3393 // done in ProcessDaqFxs
3394 //
3395 TFile *f = TFile::Open(fileName);
3396 if(!f){
3397 Printf("could not open file \"%s\"",fileName);
3398 return kFALSE;
3399 }
3400
3401 Short_t keylen,cycle;
3402 UInt_t datime;
3403 Int_t nbytes,date,time,objlen,nwheader;
3404 date = 0;
3405 time = 0;
3406 Long64_t seekkey,seekpdir;
3407 char *buffer;
3408 char nwhc;
3409 const Int_t kBEGIN = 100;
3410 Long64_t fBEGIN = (Long64_t)kBEGIN; //First used word in file following the file header
3411 Long64_t idcur = fBEGIN;
3412 Long64_t fEND = f->GetEND(); //Last used byte in file
3413
3414 nwheader = 64;
3415 Int_t nread = nwheader;
3416
3417 char header[kBEGIN];
3418 char classname[512];
3419
3420 while (idcur < fEND) {
3421 f->Seek(idcur);
3422 if (idcur+nread >= fEND) nread = fEND-idcur-1;
3423 if (f->ReadBuffer(header, nread)) {
3424 // ReadBuffer returns kTRUE in case of failure.
3425 Printf("%s: failed to read the key data from disk at %lld.",f->GetName(),idcur);
3426 break;
3427 }
3428
3429 buffer=header;
3430 frombuf(buffer, &nbytes);
3431 if (!nbytes) {
3432 Printf("Address = %lld\tNbytes = %d\t=====E R R O R=======", idcur, nbytes);
3433 date = 0; time = 0;
3434 break;
3435 }
3436 if (nbytes < 0) {
3437 Printf("Address = %lld\tNbytes = %d\t=====G A P===========", idcur, nbytes);
3438 idcur -= nbytes;
3439 f->Seek(idcur);
3440 continue;
3441 //return kFALSE; // these gaps are not always critical
3442 }
3443 Version_t versionkey;
3444 frombuf(buffer, &versionkey);
3445 frombuf(buffer, &objlen);
3446 frombuf(buffer, &datime);
3447 frombuf(buffer, &keylen);
3448 frombuf(buffer, &cycle);
3449 if (versionkey > 1000) {
3450 frombuf(buffer, &seekkey);
3451 frombuf(buffer, &seekpdir);
3452 } else {
3453 Int_t skey,sdir;
3454 frombuf(buffer, &skey); seekkey = (Long64_t)skey;
3455 frombuf(buffer, &sdir); seekpdir = (Long64_t)sdir;
3456 }
3457 frombuf(buffer, &nwhc);
3458 for (int i = 0;i < nwhc; i++) frombuf(buffer, &classname[i]);
3459 classname[(int)nwhc] = '\0'; //cast to avoid warning with gcc3.4
3460 Long64_t fSeekFree = f->GetSeekFree();
3461 Long64_t fSeekInfo = f->GetSeekInfo();
3462 Long64_t fSeekKeys = f->GetSeekKeys();
3463 if (idcur == fSeekFree) strlcpy(classname,"FreeSegments",512);
3464 if (idcur == fSeekInfo) strlcpy(classname,"StreamerInfo",512);
3465 if (idcur == fSeekKeys) strlcpy(classname,"KeysList",512);
3466 TDatime::GetDateTime(datime, date, time);
3467 /*
3468 if (objlen != nbytes-keylen) {
3469 Float_t cx = Float_t(objlen+keylen)/Float_t(nbytes);
3470 Printf("%d/%06d At:%lld N=%-8d %-14s CX = %5.2f",date,time,idcur,nbytes,classname,cx);
3471 } else {
3472 Printf("%d/%06d At:%lld N=%-8d %-14s",date,time,idcur,nbytes,classname);
3473 }
3474 */
3475 idcur += nbytes;
3476 }
3477 //Printf("%d/%06d At:%lld N=%-8d %-14s",date,time,idcur,1,"END");
3478 if(idcur > f->GetSize()){
3479 AliWarning("Bad file: final record position bigger than file size");
3480 return kFALSE;
3481 }
3482 return kTRUE;
3483}
3484