1 /**************************************************************************
2 * Copyright(c) 2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 #include "AliTPCPreprocessor.h"
18 #include "AliShuttleInterface.h"
20 #include "AliCDBMetaData.h"
21 #include "AliDCSValue.h"
23 #include "AliTPCSensorTempArray.h"
24 #include "AliTPCROC.h"
25 #include "AliTPCCalROC.h"
26 #include "AliTPCCalPad.h"
27 #include "AliTPCCalibPedestal.h"
28 #include "AliTPCCalibPulser.h"
29 #include "AliTPCCalibCE.h"
30 #include "AliTPCCalibRaw.h"
31 #include "AliTPCdataQA.h"
32 #include "ARVersion.h"
37 #include "TParameter.h"
39 #include <TTimeStamp.h>
41 const Int_t kValCutTemp = 100; // discard temperatures > 100 degrees
42 const Int_t kDiffCutTemp = 5; // discard temperature differences > 5 degrees
43 const TString kPedestalRunType = "PEDESTAL"; // pedestal run identifier
44 const TString kPulserRunType = "PULSER"; // pulser run identifier
45 const TString kPhysicsRunType = "PHYSICS"; // physics run identifier
46 const TString kCosmicRunType = "COSMIC"; // cosmic run identifier
47 const TString kLaserRunType = "LASER"; // laser run identifier
48 const TString kDaqRunType = "DAQ"; // DAQ run identifier
49 const TString kAmandaTemp = "TPC_PT_%d_TEMPERATURE"; // Amanda string for temperature entries
50 //const Double_t kFitFraction = 0.7; // Fraction of DCS sensor fits required
51 const Double_t kFitFraction = -1.0; // Don't require minimum number of fits in commissioning run
52 const Int_t kNumPressureSensors = 3; // number of pressure sensors
53 const char* kPressureSensorNames[kNumPressureSensors] = {
54 "CavernAtmosPressure",
55 "CavernAtmosPressure2",
56 "SurfaceAtmosPressure" };
60 // This class is the SHUTTLE preprocessor for the TPC detector.
63 ClassImp(AliTPCPreprocessor)
65 //______________________________________________________________________________________________
66 AliTPCPreprocessor::AliTPCPreprocessor(AliShuttleInterface* shuttle) :
67 AliPreprocessor("TPC",shuttle),
68 fConfEnv(0), fTemp(0), fHighVoltage(0), fHighVoltageStat(0), fGoofie(0),
69 fPressure(0), fConfigOK(kTRUE), fROC(0)
72 fROC = AliTPCROC::Instance();
74 // define run types to be processed
76 AddRunType(kPedestalRunType);
77 AddRunType(kPulserRunType);
78 AddRunType(kPhysicsRunType);
79 AddRunType(kCosmicRunType);
80 AddRunType(kLaserRunType);
81 AddRunType(kDaqRunType);
84 //______________________________________________________________________________________________
85 AliTPCPreprocessor::AliTPCPreprocessor(const AliTPCPreprocessor& ) :
86 AliPreprocessor("TPC",0),
87 fConfEnv(0), fTemp(0), fHighVoltage(0), fHighVoltageStat(0), fGoofie(0),
88 fPressure(0), fConfigOK(kTRUE), fROC(0)
91 Fatal("AliTPCPreprocessor", "copy constructor not implemented");
93 // // fTemp = new AliTPCSensorTempArray(*(org.fTemp));
96 //______________________________________________________________________________________________
97 AliTPCPreprocessor::~AliTPCPreprocessor()
103 delete fHighVoltageStat;
107 //______________________________________________________________________________________________
108 AliTPCPreprocessor& AliTPCPreprocessor::operator = (const AliTPCPreprocessor& )
110 Fatal("operator =", "assignment operator not implemented");
115 //______________________________________________________________________________________________
116 void AliTPCPreprocessor::Initialize(Int_t run, UInt_t startTime,
120 AliPreprocessor::Initialize(run, startTime, endTime);
122 AliInfo(Form("\n\tRun %d \n\tStartTime %s \n\tEndTime %s", run,
123 TTimeStamp((time_t)startTime,0).AsString(),
124 TTimeStamp((time_t)endTime,0).AsString()));
126 // Preprocessor configuration
128 AliCDBEntry* entry = GetFromOCDB("Config", "Preprocessor");
129 if (entry) fConfEnv = (TEnv*) entry->GetObject();
131 Log("AliTPCPreprocsessor: Preprocessor Config OCDB entry missing.\n");
136 // Temperature sensors
140 TString tempConf = fConfEnv->GetValue("Temperature","ON");
142 if (tempConf != "OFF" ) {
143 entry = GetFromOCDB("Config", "Temperature");
144 if (entry) confTree = (TTree*) entry->GetObject();
146 Log("AliTPCPreprocsessor: Temperature Config OCDB entry missing.\n");
150 fTemp = new AliTPCSensorTempArray(startTime, endTime, confTree, kAmandaTemp);
151 fTemp->SetValCut(kValCutTemp);
152 fTemp->SetDiffCut(kDiffCutTemp);
155 // High voltage measurements
157 TString hvConf = fConfEnv->GetValue("HighVoltage","ON");
159 if (hvConf != "OFF" ) {
162 entry = GetFromOCDB("Config", "HighVoltage");
163 if (entry) confTree = (TTree*) entry->GetObject();
165 Log("AliTPCPreprocsessor: High Voltage Config OCDB entry missing.\n");
169 time_t timeStart = (time_t)(((TString)GetRunParameter("DAQ_time_start")).Atoi());
170 time_t timeEnd = (time_t)(((TString)GetRunParameter("DAQ_time_end")).Atoi());
171 fHighVoltage = new AliDCSSensorArray (UInt_t(timeStart),
172 UInt_t(timeEnd), confTree);
175 // High voltage status values
177 TString hvStatConf = fConfEnv->GetValue("HighVoltageStat","ON");
178 hvStatConf.ToUpper();
179 if (hvStatConf != "OFF" ) {
182 entry = GetFromOCDB("Config", "HighVoltageStat");
183 if (entry) confTree = (TTree*) entry->GetObject();
185 Log("AliTPCPreprocsessor: High Voltage Status Config OCDB entry missing.\n");
189 fHighVoltageStat = new AliDCSSensorArray(startTime, endTime, confTree);
194 TString goofieConf = fConfEnv->GetValue("Goofie","ON");
195 goofieConf.ToUpper();
196 if (goofieConf != "OFF" ) {
199 entry = GetFromOCDB("Config", "Goofie");
200 if (entry) confTree = (TTree*) entry->GetObject();
202 Log("AliTPCPreprocsessor: Goofie Config OCDB entry missing.\n");
206 fGoofie = new AliDCSSensorArray(startTime, endTime, confTree);
211 TString runType = GetRunType();
213 if( runType == kPhysicsRunType ||
214 runType == kLaserRunType ) {
215 TString pressureConf = fConfEnv->GetValue("Pressure","ON");
216 pressureConf.ToUpper();
217 if (pressureConf != "OFF" ) {
218 TClonesArray * array = new TClonesArray("AliDCSSensor",kNumPressureSensors);
219 for(Int_t j = 0; j < kNumPressureSensors; j++) {
220 AliDCSSensor * sens = new ((*array)[j])AliDCSSensor;
221 sens->SetStringID(kPressureSensorNames[j]);
223 fPressure = new AliDCSSensorArray(startTime, endTime, array);
228 //______________________________________________________________________________________________
229 UInt_t AliTPCPreprocessor::Process(TMap* dcsAliasMap)
231 // Fills data into TPC calibrations objects
233 // Amanda servers provide information directly through dcsAliasMap
236 if (!fConfigOK) return 9;
238 TObjArray *resultArray = new TObjArray();
239 TString errorHandling = fConfEnv->GetValue("ErrorHandling","ON");
240 errorHandling.ToUpper();
244 if (!dcsAliasMap) dcsResult=1;
245 if (dcsAliasMap->GetEntries() == 0 ) dcsResult=1;
246 status = new TParameter<int>("dcsResult",dcsResult);
247 resultArray->Add(status);
250 TString runType = GetRunType();
252 if ( dcsResult == 0 ) {
254 // Temperature sensors are processed by AliTPCCalTemp
256 TString tempConf = fConfEnv->GetValue("Temperature","ON");
258 if (tempConf != "OFF" ) {
259 UInt_t tempResult = MapTemperature(dcsAliasMap);
260 if ( tempConf != "TRY") result+=tempResult;
261 status = new TParameter<int>("tempResult",tempResult);
262 resultArray->Add(status);
265 // High Voltage recordings
268 TString hvConf = fConfEnv->GetValue("HighVoltage","ON");
270 if (hvConf != "OFF" ) {
271 UInt_t hvResult = MapHighVoltage(dcsAliasMap);
272 if (hvConf != "TRY") result+=hvResult;
273 status = new TParameter<int>("hvResult",hvResult);
274 resultArray->Add(status);
280 TString goofieConf = fConfEnv->GetValue("Goofie","ON");
281 goofieConf.ToUpper();
282 if (goofieConf != "OFF" ) {
283 UInt_t goofieResult = MapGoofie(dcsAliasMap);
284 if (goofieConf != "TRY") result+=goofieResult;
285 status = new TParameter<int>("goofieResult",goofieResult);
286 resultArray->Add(status);
291 if( runType == kPhysicsRunType ||
292 runType == kLaserRunType ) {
294 TString pressureConf = fConfEnv->GetValue("Pressure","ON");
295 pressureConf.ToUpper();
296 if (pressureConf != "OFF" ) {
297 UInt_t pressureResult = MapPressure(dcsAliasMap);
298 status = new TParameter<int>("pressureResult",pressureResult);
299 resultArray->Add(status);
303 // Other calibration information will be retrieved through FXS files
305 // TList* fileSourcesDAQ = GetFile(AliShuttleInterface::kDAQ, "pedestals");
306 // const char* fileNamePed = GetFile(AliShuttleInterface::kDAQ, "pedestals", "LDC1");
308 // TList* fileSourcesHLT = GetFile(AliShuttleInterface::kHLT, "calib");
309 // const char* fileNameHLT = GetFile(AliShuttleInterface::kHLT, "calib", "LDC1");
313 if(runType == kPedestalRunType) {
314 Int_t numSources = 1;
315 Int_t pedestalSource[2] = {AliShuttleInterface::kDAQ,AliShuttleInterface::kHLT} ;
316 TString source = fConfEnv->GetValue("Pedestal","DAQ");
318 if (source != "OFF" ) {
319 if ( source == "HLT") pedestalSource[0] = AliShuttleInterface::kHLT;
320 if (!GetHLTStatus()) pedestalSource[0] = AliShuttleInterface::kDAQ;
321 if (source == "HLTDAQ" ) {
323 pedestalSource[0] = AliShuttleInterface::kHLT;
324 pedestalSource[1] = AliShuttleInterface::kDAQ;
326 if (source == "DAQHLT" ) numSources=2;
327 UInt_t pedestalResult=0;
328 for (Int_t i=0; i<numSources; i++ ) {
329 pedestalResult = ExtractPedestals(pedestalSource[i]);
330 if ( pedestalResult == 0 ) break;
332 result += pedestalResult;
333 status = new TParameter<int>("pedestalResult",pedestalResult);
334 resultArray->Add(status);
338 // pulser trigger processing
340 if(runType == kPulserRunType) {
341 Int_t numSources = 1;
342 Int_t pulserSource[2] = {AliShuttleInterface::kDAQ,AliShuttleInterface::kHLT} ;
343 TString source = fConfEnv->GetValue("Pulser","DAQ");
345 if ( source != "OFF") {
346 if ( source == "HLT") pulserSource[0] = AliShuttleInterface::kHLT;
347 if (!GetHLTStatus()) pulserSource[0] = AliShuttleInterface::kDAQ;
348 if (source == "HLTDAQ" ) {
350 pulserSource[0] = AliShuttleInterface::kHLT;
351 pulserSource[1] = AliShuttleInterface::kDAQ;
353 if (source == "DAQHLT" ) numSources=2;
354 if (source == "TRY" ) numSources=2;
355 UInt_t pulserResult=0;
356 for (Int_t i=0; i<numSources; i++ ) {
357 pulserResult = ExtractPulser(pulserSource[i]);
358 if ( pulserResult == 0 ) break;
360 if (source != "TRY") result += pulserResult;
361 status = new TParameter<int>("pulserResult",pulserResult);
362 resultArray->Add(status);
367 // raw calibration processing
369 if(runType == kPhysicsRunType) {
370 Int_t numSources = 1;
371 Int_t rawSource[2] = {AliShuttleInterface::kDAQ,AliShuttleInterface::kHLT} ;
372 TString source = fConfEnv->GetValue("Raw","DAQ");
374 if ( source != "OFF") {
375 if ( source == "HLT") rawSource[0] = AliShuttleInterface::kHLT;
376 if (!GetHLTStatus()) rawSource[0] = AliShuttleInterface::kDAQ;
377 if (source == "HLTDAQ" ) {
379 rawSource[0] = AliShuttleInterface::kHLT;
380 rawSource[1] = AliShuttleInterface::kDAQ;
382 if (source == "DAQHLT" ) numSources=2;
383 if (source == "TRY" ) numSources=2;
385 for (Int_t i=0; i<numSources; i++ ) {
386 rawResult = ExtractRaw(rawSource[i]);
387 if ( rawResult == 0 ) break;
389 if (source != "TRY" )result += rawResult;
390 status = new TParameter<int>("rawResult",rawResult);
391 resultArray->Add(status);
396 // Altro configuration
399 TString altroConf = fConfEnv->GetValue("AltroConf","ON");
401 if (altroConf != "OFF" ) {
402 UInt_t altroResult = ExtractAltro(AliShuttleInterface::kDCS);
403 if (altroConf != "TRY" ) result+=altroResult;
404 status = new TParameter<int>("altroResult",altroResult);
405 resultArray->Add(status);
409 // Central Electrode processing
411 if( runType == kPhysicsRunType ||
412 runType == kLaserRunType ) {
414 Int_t numSources = 1;
415 Int_t ceSource[2] = {AliShuttleInterface::kDAQ,AliShuttleInterface::kHLT} ;
416 TString source = fConfEnv->GetValue("CE","DAQ");
418 if ( source != "OFF" ) {
419 if ( source == "HLT") ceSource[0] = AliShuttleInterface::kHLT;
420 if (!GetHLTStatus()) ceSource[0] = AliShuttleInterface::kDAQ;
421 if (source == "HLTDAQ" ) {
423 ceSource[0] = AliShuttleInterface::kHLT;
424 ceSource[1] = AliShuttleInterface::kDAQ;
426 if (source == "DAQHLT" ) numSources=2;
427 if (source == "TRY" ) numSources=2;
429 for (Int_t i=0; i<numSources; i++ ) {
430 ceResult = ExtractCE(ceSource[i]);
431 if ( ceResult == 0 ) break;
434 // only flag error if CE result is missing from LASER runs
435 // -- for PHYSICS run do CE processing if data available
437 if ( runType == kLaserRunType && source != "TRY" ) result += ceResult;
438 status = new TParameter<int>("ceResult",ceResult);
439 resultArray->Add(status);
442 Int_t qaSource[2] = {AliShuttleInterface::kDAQ,AliShuttleInterface::kHLT} ;
443 source = fConfEnv->GetValue("QA","DAQ");
445 if ( source != "OFF" ) {
446 if ( source == "HLT") qaSource[0] = AliShuttleInterface::kHLT;
447 if (!GetHLTStatus()) qaSource[0] = AliShuttleInterface::kDAQ;
448 if (source == "HLTDAQ" ) {
450 qaSource[0] = AliShuttleInterface::kHLT;
451 qaSource[1] = AliShuttleInterface::kDAQ;
453 if (source == "DAQHLT" ) numSources=2;
454 if (source == "TRY" ) numSources=2;
456 for (Int_t i=0; i<numSources; i++ ) {
457 qaResult = ExtractQA(qaSource[i]);
458 if ( qaResult == 0 ) break;
460 // result += qaResult;
461 if ( qaResult !=0 ) Log ("ExtractQA failed, no QA entry available.");
462 status = new TParameter<int>("qaResult",qaResult);
463 resultArray->Add(status);
468 // Store component status to OCDB
470 AliCDBMetaData metaData;
471 metaData.SetBeamPeriod(0);
472 metaData.SetResponsible("Haavard Helstrup");
473 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
474 metaData.SetComment("Preprocessor AliTPC status.");
475 Store("Calib", "PreprocStatus", resultArray, &metaData, 0, kFALSE);
476 resultArray->Delete();
479 if (errorHandling == "OFF" ) return 0;
483 //______________________________________________________________________________________________
484 UInt_t AliTPCPreprocessor::MapTemperature(TMap* dcsAliasMap)
487 // extract DCS temperature maps. Perform fits to save space
490 TMap *map = fTemp->ExtractDCS(dcsAliasMap);
492 fTemp->MakeSplineFit(map);
493 Double_t fitFraction = 1.0*fTemp->NumFits()/fTemp->NumSensors();
494 if (fitFraction > kFitFraction ) {
495 AliInfo(Form("Temperature values extracted, fits performed.\n"));
497 Log ("Too few temperature maps fitted. \n");
501 Log("No temperature map extracted. \n");
505 // Now store the final CDB file
508 AliCDBMetaData metaData;
509 metaData.SetBeamPeriod(0);
510 metaData.SetResponsible("Haavard Helstrup");
511 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
512 metaData.SetComment("Preprocessor AliTPC data base entries.");
514 Bool_t storeOK = Store("Calib", "Temperature", fTemp, &metaData, 0, kFALSE);
515 if ( !storeOK ) result=1;
522 //______________________________________________________________________________________________
523 UInt_t AliTPCPreprocessor::MapPressure(TMap* dcsAliasMap)
526 // extract DCS pressure maps. Perform fits to save space
529 TMap *map = fPressure->ExtractDCS(dcsAliasMap);
531 fPressure->MakeSplineFit(map);
532 Double_t fitFraction = 1.0*fPressure->NumFits()/fPressure->NumSensors();
533 if (fitFraction > kFitFraction ) {
534 AliInfo(Form("Pressure values extracted, fits performed.\n"));
536 Log ("Too few pressure maps fitted. \n");
540 Log("No pressure map extracted. \n");
547 //______________________________________________________________________________________________
548 UInt_t AliTPCPreprocessor::MapHighVoltage(TMap* dcsAliasMap)
551 // extract DCS HV maps. Perform fits to save space
554 TMap *map = fHighVoltage->ExtractDCS(dcsAliasMap);
556 fHighVoltage->MakeSplineFit(map, kTRUE); // keep both spline fits and original maps
557 Double_t fitFraction = 1.0*fHighVoltage->NumFits()/fHighVoltage->NumSensors();
558 if (fitFraction > kFitFraction ) {
559 AliInfo(Form("High voltage recordings extracted, fits performed.\n"));
561 Log ("Too few high voltage recordings fitted. \n");
565 Log("No high voltage recordings extracted. \n");
570 TString hvStatConf = fConfEnv->GetValue("HighVoltageStat","ON");
571 hvStatConf.ToUpper();
572 if (hvStatConf != "OFF" ) {
573 TMap *map2 = fHighVoltageStat->ExtractDCS(dcsAliasMap);
575 fHighVoltageStat->ClearFit();
576 fHighVoltageStat->SetGraph(map2);
578 Log("No high voltage status recordings extracted. \n");
583 // add status maps to high voltage sensor array
585 fHighVoltage->AddSensors(fHighVoltageStat);
587 // Now store the final CDB file
590 AliCDBMetaData metaData;
591 metaData.SetBeamPeriod(0);
592 metaData.SetResponsible("Haavard Helstrup");
593 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
594 metaData.SetComment("Preprocessor AliTPC data base entries.");
596 Bool_t storeOK = Store("Calib", "HighVoltage", fHighVoltage, &metaData, 0, kFALSE);
597 if ( !storeOK ) result=1;
605 //______________________________________________________________________________________________
606 UInt_t AliTPCPreprocessor::MapGoofie(TMap* dcsAliasMap)
609 // extract DCS Goofie maps. Do not perform fits (low update rate)
613 TMap *map = fGoofie->ExtractDCS(dcsAliasMap);
616 fGoofie->SetGraph(map);
618 Log("No Goofie recordings extracted. \n");
623 // Now store the final CDB file
626 AliCDBMetaData metaData;
627 metaData.SetBeamPeriod(0);
628 metaData.SetResponsible("Haavard Helstrup");
629 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
630 metaData.SetComment("Preprocessor AliTPC data base entries.");
632 Bool_t storeOK = Store("Calib", "Goofie", fGoofie, &metaData, 0, kFALSE);
633 if ( !storeOK ) result=1;
642 //______________________________________________________________________________________________
644 UInt_t AliTPCPreprocessor::ExtractPedestals(Int_t sourceFXS)
647 // Read pedestal file from file exchage server
648 // Keep original entry from OCDB in case no new pedestals are available
650 AliTPCCalPad *calPadPed=0;
651 AliCDBEntry* entry = GetFromOCDB("Calib", "Pedestals");
652 if (entry) calPadPed = (AliTPCCalPad*)entry->GetObject();
653 if ( calPadPed==NULL ) {
654 Log("AliTPCPreprocsessor: No previous TPC pedestal entry available.\n");
655 calPadPed = new AliTPCCalPad("PedestalsMean","PedestalsMean");
658 AliTPCCalPad *calPadRMS=0;
659 entry = GetFromOCDB("Calib", "PadNoise");
660 if (entry) calPadRMS = (AliTPCCalPad*)entry->GetObject();
661 if ( calPadRMS==NULL ) {
662 Log("AliTPCPreprocsessor: No previous TPC noise entry available.\n");
663 calPadRMS = new AliTPCCalPad("PedestalsRMS","PedestalsRMS");
669 Int_t nSectors = fROC->GetNSectors();
670 TList* list = GetFileSources(sourceFXS,"pedestals");
672 if (list && list->GetEntries()>0) {
674 // loop through all files from LDCs
676 Bool_t changed=false;
678 while (list->At(index)!=NULL) {
679 TObjString* fileNameEntry = (TObjString*) list->At(index);
680 if (fileNameEntry!=NULL) {
681 TString fileName = GetFile(sourceFXS, "pedestals",
682 fileNameEntry->GetString().Data());
683 TFile *f = TFile::Open(fileName);
685 Log ("Error opening pedestal file.");
689 AliTPCCalibPedestal *calPed;
690 f->GetObject("tpcCalibPedestal",calPed);
692 Log ("No pedestal calibration object in file.");
697 // replace entries for the sectors available in the present file
700 for (Int_t sector=0; sector<nSectors; sector++) {
701 AliTPCCalROC *rocPed=calPed->GetCalRocPedestal(sector, kFALSE);
702 if ( rocPed ) calPadPed->SetCalROC(rocPed,sector);
703 AliTPCCalROC *rocRMS=calPed->GetCalRocRMS(sector, kFALSE);
704 if ( rocRMS ) calPadRMS->SetCalROC(rocRMS,sector);
712 // Store updated pedestal entry to OCDB
715 AliCDBMetaData metaData;
716 metaData.SetBeamPeriod(0);
717 metaData.SetResponsible("Haavard Helstrup");
718 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
719 metaData.SetComment("Preprocessor AliTPC data base entries.");
721 Bool_t storeOK = Store("Calib", "Pedestals", calPadPed, &metaData, 0, kTRUE);
722 if ( !storeOK ) ++result;
723 storeOK = Store("Calib", "PadNoise", calPadRMS, &metaData, 0, kTRUE);
724 if ( !storeOK ) ++result;
727 Log ("Error: no entries in pedestal file list!");
737 //______________________________________________________________________________________________
740 UInt_t AliTPCPreprocessor::ExtractPulser(Int_t sourceFXS)
743 // Read pulser calibration file from file exchage server
744 // Keep original entry from OCDB in case no new pulser calibration is available
746 TObjArray *pulserObjects=0;
747 AliTPCCalPad *pulserTmean=0;
748 AliTPCCalPad *pulserTrms=0;
749 AliTPCCalPad *pulserQmean=0;
750 AliCDBEntry* entry = GetFromOCDB("Calib", "Pulser");
751 if (entry) pulserObjects = (TObjArray*)entry->GetObject();
752 if ( pulserObjects==NULL ) {
753 Log("AliTPCPreprocsessor: No previous TPC pulser entry available.\n");
754 pulserObjects = new TObjArray;
757 pulserTmean = (AliTPCCalPad*)pulserObjects->FindObject("PulserTmean");
758 if ( !pulserTmean ) {
759 pulserTmean = new AliTPCCalPad("PulserTmean","PulserTmean");
760 pulserObjects->Add(pulserTmean);
762 pulserTrms = (AliTPCCalPad*)pulserObjects->FindObject("PulserTrms");
764 pulserTrms = new AliTPCCalPad("PulserTrms","PulserTrms");
765 pulserObjects->Add(pulserTrms);
767 pulserQmean = (AliTPCCalPad*)pulserObjects->FindObject("PulserQmean");
768 if ( !pulserQmean ) {
769 pulserQmean = new AliTPCCalPad("PulserQmean","PulserQmean");
770 pulserObjects->Add(pulserQmean);
776 Int_t nSectors = fROC->GetNSectors();
777 TList* list = GetFileSources(sourceFXS,"pulser");
779 if (list && list->GetEntries()>0) {
781 // loop through all files from LDCs
783 Bool_t changed=false;
785 while (list->At(index)!=NULL) {
786 TObjString* fileNameEntry = (TObjString*) list->At(index);
787 if (fileNameEntry!=NULL) {
788 TString fileName = GetFile(sourceFXS, "pulser",
789 fileNameEntry->GetString().Data());
790 TFile *f = TFile::Open(fileName);
792 Log ("Error opening pulser file.");
796 AliTPCCalibPulser *calPulser;
797 f->GetObject("tpcCalibPulser",calPulser);
799 Log ("No pulser calibration object in file.");
804 // replace entries for the sectors available in the present file
807 for (Int_t sector=0; sector<nSectors; sector++) {
808 AliTPCCalROC *rocTmean=calPulser->GetCalRocT0(sector);
809 if ( rocTmean ) pulserTmean->SetCalROC(rocTmean,sector);
810 AliTPCCalROC *rocTrms=calPulser->GetCalRocRMS(sector);
811 if ( rocTrms ) pulserTrms->SetCalROC(rocTrms,sector);
812 AliTPCCalROC *rocQmean=calPulser->GetCalRocQ(sector);
813 if ( rocQmean ) pulserQmean->SetCalROC(rocQmean,sector);
821 // Store updated pedestal entry to OCDB
824 AliCDBMetaData metaData;
825 metaData.SetBeamPeriod(0);
826 metaData.SetResponsible("Haavard Helstrup");
827 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
828 metaData.SetComment("Preprocessor AliTPC data base entries.");
830 Bool_t storeOK = Store("Calib", "Pulser", pulserObjects, &metaData, 0, kTRUE);
831 if ( !storeOK ) ++result;
834 Log ("Error: no entries in pulser file list!");
837 pulserObjects->Delete();
838 delete pulserObjects;
843 //______________________________________________________________________________________________
846 UInt_t AliTPCPreprocessor::ExtractRaw(Int_t sourceFXS)
849 // Read Raw calibration file from file exchage server
853 TObjArray* rawArray = new TObjArray;
855 TList* list = GetFileSources(sourceFXS,"tpcCalibRaw");
857 if (list && list->GetEntries()>0) {
859 // loop through all files
862 while (list->At(index)!=NULL) {
863 TObjString* fileNameEntry = (TObjString*) list->At(index);
864 if (fileNameEntry!=NULL) {
865 TString fileName = GetFile(sourceFXS, "tpcCalibRaw",
866 fileNameEntry->GetString().Data());
867 TFile *f = TFile::Open(fileName);
869 Log ("Error opening raw file.");
873 AliTPCCalibRaw *calRaw;
874 f->GetObject("tpcCalibRaw",calRaw);
876 Log ("No raw calibration object in file.");
880 rawArray->Add(calRaw);
886 // Store updated pedestal entry to OCDB
888 AliCDBMetaData metaData;
889 metaData.SetBeamPeriod(0);
890 metaData.SetResponsible("Haavard Helstrup");
891 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
892 metaData.SetComment("Preprocessor AliTPC data base entries.");
894 Bool_t storeOK = Store("Calib", "Raw", rawArray, &metaData, 0, kTRUE);
895 if ( !storeOK ) ++result;
897 Log ("Error: no entries in raw file list!");
906 //______________________________________________________________________________________________
908 UInt_t AliTPCPreprocessor::ExtractCE(Int_t sourceFXS)
911 // Read Central Electrode file from file exchage server
914 AliTPCCalPad *ceTmean=0;
915 AliTPCCalPad *ceTrms=0;
916 AliTPCCalPad *ceQmean=0;
917 TObjArray *rocTtime=0;
918 TObjArray *rocQtime=0;
920 TObjArray *ceObjects= new TObjArray;
923 Int_t nSectors = fROC->GetNSectors();
925 ceTmean = new AliTPCCalPad("CETmean","CETmean");
926 ceObjects->Add(ceTmean);
928 ceTrms = new AliTPCCalPad("CETrms","CETrms");
929 ceObjects->Add(ceTrms);
931 ceQmean = new AliTPCCalPad("CEQmean","CEQmean");
932 ceObjects->Add(ceQmean);
934 rocTtime = new TObjArray(nSectors+2); // also make room for A and C side average
935 rocTtime->SetName("rocTtime");
936 ceObjects->Add(rocTtime);
938 rocQtime = new TObjArray(nSectors);
939 rocQtime->SetName("rocQtime");
940 ceObjects->Add(rocQtime);
945 AliTPCSensorTempArray *tempMap = new AliTPCSensorTempArray(*fTemp);
946 tempMap->SetNameTitle("TempMap","TempMap");
947 ceObjects->Add(tempMap);
953 AliDCSSensor *sensor=0, *sensorCopy=0;
954 for (Int_t isensor=0; isensor<kNumPressureSensors; ++isensor ) {
955 sensor = fPressure->GetSensor(kPressureSensorNames[isensor]);
957 sensorCopy = new AliDCSSensor(*sensor);
958 sensorCopy->SetNameTitle(kPressureSensorNames[isensor],kPressureSensorNames[isensor]);
959 ceObjects->Add(sensorCopy);
966 TList* list = GetFileSources(sourceFXS,"CE");
968 if (list && list->GetEntries()>0) {
970 // loop through all files from LDCs
973 while (list->At(index)!=NULL) {
974 TObjString* fileNameEntry = (TObjString*) list->At(index);
975 if (fileNameEntry!=NULL) {
976 TString fileName = GetFile(sourceFXS, "CE",
977 fileNameEntry->GetString().Data());
978 TFile *f = TFile::Open(fileName);
980 Log ("Error opening central electrode file.");
984 AliTPCCalibCE *calCE;
985 f->GetObject("tpcCalibCE",calCE);
988 Log ("No valid calibCE object.");
992 // replace entries for the sectors available in the present file
994 for (Int_t sector=0; sector<nSectors; sector++) {
995 AliTPCCalROC *rocTmean=calCE->GetCalRocT0(sector);
996 if ( rocTmean ) ceTmean->SetCalROC(rocTmean,sector);
997 AliTPCCalROC *rocTrms=calCE->GetCalRocRMS(sector);
998 if ( rocTrms ) ceTrms->SetCalROC(rocTrms,sector);
999 AliTPCCalROC *rocQmean=calCE->GetCalRocQ(sector);
1000 if ( rocQmean ) ceQmean->SetCalROC(rocQmean,sector);
1001 TGraph *grT=calCE->MakeGraphTimeCE(sector,0,2); // T time graph
1002 if ( grT ) rocTtime->AddAt(grT,sector);
1003 TGraph *grQ=calCE->MakeGraphTimeCE(sector,0,3); // Q time graph
1004 if ( grQ ) rocQtime->AddAt(grQ,sector);
1007 TGraph *grT=calCE->MakeGraphTimeCE(-1,0,2); // A side average
1008 if ( grT ) rocTtime->AddAt(grT,nSectors);
1009 grT=calCE->MakeGraphTimeCE(-2,0,2); // C side average
1010 if ( grT ) rocTtime->AddAt(grT,nSectors+1);
1019 // Store updated pedestal entry to OCDB
1021 AliCDBMetaData metaData;
1022 metaData.SetBeamPeriod(0);
1023 metaData.SetResponsible("Haavard Helstrup");
1024 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
1025 metaData.SetComment("Preprocessor AliTPC data base entries.");
1027 Bool_t storeOK = Store("Calib", "CE", ceObjects, &metaData, 0, kTRUE);
1028 if ( !storeOK ) ++result;
1031 Log ("Error: no CE entries available from FXS!");
1035 ceObjects->Delete();
1040 //______________________________________________________________________________________________
1042 UInt_t AliTPCPreprocessor::ExtractQA(Int_t sourceFXS)
1045 // Read Quality Assurance file from file exchage server
1050 TList* list = GetFileSources(sourceFXS,"QA");
1052 if (list && list->GetEntries()>0) {
1054 // only one QA objetc should be available!
1056 AliTPCdataQA *calQA;
1058 UInt_t nentries = list->GetEntries();
1060 if ( nentries > 1) Log ( "More than one QA entry. First one processed");
1061 TObjString* fileNameEntry = (TObjString*) list->At(index);
1062 if (fileNameEntry!=NULL) {
1063 TString fileName = GetFile(sourceFXS, "QA",
1064 fileNameEntry->GetString().Data());
1065 TFile *f = TFile::Open(fileName);
1067 Log ("Error opening QA file.");
1070 f->GetObject("tpcCalibQA",calQA);
1073 // Store updated pedestal entry to OCDB
1075 AliCDBMetaData metaData;
1076 metaData.SetBeamPeriod(0);
1077 metaData.SetResponsible("Haavard Helstrup");
1078 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
1079 metaData.SetComment("Preprocessor AliTPC data base entries.");
1081 Bool_t storeOK = Store("Calib", "QA", calQA, &metaData, 0, kFALSE);
1082 if ( !storeOK ) ++result;
1088 Log ("Error: no QA files on FXS!");
1092 Log ("Error: no QA entries in FXS list!");
1098 //______________________________________________________________________________________________
1101 UInt_t AliTPCPreprocessor::ExtractAltro(Int_t sourceFXS)
1104 // Read pulser calibration file from file exchage server
1105 // Keep original entry from OCDB in case no new pulser calibration is available
1107 TObjArray *altroObjects=0;
1108 AliTPCCalPad *acqStart=0;
1109 AliTPCCalPad *zsThr=0;
1110 AliTPCCalPad *acqStop=0;
1111 AliTPCCalPad *FPED=0;
1112 AliTPCCalPad *masked=0;
1113 AliTPCCalPad *k1=0, *k2=0, *k3=0;
1114 AliTPCCalPad *l1=0, *l2=0, *l3=0;
1115 TMap *mapRCUconfig=0;
1117 AliCDBEntry* entry = GetFromOCDB("Calib", "AltroConfig");
1118 if (entry) altroObjects = (TObjArray*)entry->GetObject();
1119 if ( altroObjects==NULL ) {
1120 Log("AliTPCPreprocsessor: No previous TPC altro calibration entry available.\n");
1121 altroObjects = new TObjArray;
1124 acqStart = (AliTPCCalPad*)altroObjects->FindObject("AcqStart");
1126 acqStart = new AliTPCCalPad("AcqStart","AcqStart");
1127 altroObjects->Add(acqStart);
1129 zsThr = (AliTPCCalPad*)altroObjects->FindObject("ZsThr");
1131 zsThr = new AliTPCCalPad("ZsThr","ZsThr");
1132 altroObjects->Add(zsThr);
1134 FPED = (AliTPCCalPad*)altroObjects->FindObject("FPED");
1136 FPED = new AliTPCCalPad("FPED","FPED");
1137 altroObjects->Add(FPED);
1139 acqStop = (AliTPCCalPad*)altroObjects->FindObject("AcqStop");
1141 acqStop = new AliTPCCalPad("AcqStop","AcqStop");
1142 altroObjects->Add(acqStop);
1144 masked = (AliTPCCalPad*)altroObjects->FindObject("Masked");
1146 masked = new AliTPCCalPad("Masked","Masked");
1147 altroObjects->Add(masked);
1149 k1 = (AliTPCCalPad*)altroObjects->FindObject("K1");
1151 k1 = new AliTPCCalPad("K1","K1");
1152 altroObjects->Add(k1);
1154 k2 = (AliTPCCalPad*)altroObjects->FindObject("K2");
1156 k2 = new AliTPCCalPad("K2","K2");
1157 altroObjects->Add(k2);
1159 k3 = (AliTPCCalPad*)altroObjects->FindObject("K3");
1161 k3 = new AliTPCCalPad("K3","K3");
1162 altroObjects->Add(k3);
1164 l1 = (AliTPCCalPad*)altroObjects->FindObject("L1");
1166 l1 = new AliTPCCalPad("L1","L1");
1167 altroObjects->Add(l1);
1169 l2 = (AliTPCCalPad*)altroObjects->FindObject("L2");
1171 l2 = new AliTPCCalPad("L2","L2");
1172 altroObjects->Add(l2);
1174 l3 = (AliTPCCalPad*)altroObjects->FindObject("L3");
1176 l3 = new AliTPCCalPad("L3","L3");
1177 altroObjects->Add(l3);
1179 mapRCUconfig = (TMap*)altroObjects->FindObject("RCUconfig");
1180 if (!mapRCUconfig) {
1181 mapRCUconfig = new TMap();
1182 mapRCUconfig->SetName("RCUconfig");
1183 altroObjects->Add(mapRCUconfig);
1188 TString idFXS[2]={"AltroConfigA","AltroConfigC"};
1190 Int_t nSectors = fROC->GetNSectors();
1191 Bool_t changed=false;
1192 for ( Int_t id=0; id<2; id++) {
1193 TList* list = GetFileSources(sourceFXS,idFXS[id].Data());
1195 if (list && list->GetEntries()>0) {
1196 if (altroObjects == 0 ) altroObjects = new TObjArray;
1198 // loop through all files from LDCs
1201 while (list->At(index)!=NULL) {
1202 TObjString* fileNameEntry = (TObjString*) list->At(index);
1203 if (fileNameEntry!=NULL) {
1204 TString fileName = GetFile(sourceFXS, idFXS[id].Data(),
1205 fileNameEntry->GetString().Data());
1206 TFile *f = TFile::Open(fileName);
1209 sprintf(message,"Error opening Altro configuration file, id = %d",id);
1214 TObjArray *altroFXS;
1215 f->GetObject("AltroConfig",altroFXS);
1217 Log ("No Altro configuration object in file.");
1222 // replace entries for the sectors available in the present file
1223 AliTPCCalPad *acqStartFXS=(AliTPCCalPad*)altroFXS->FindObject("AcqStart");
1224 AliTPCCalPad *zsThrFXS=(AliTPCCalPad*)altroFXS->FindObject("ZsThr");
1225 AliTPCCalPad *acqStopFXS=(AliTPCCalPad*)altroFXS->FindObject("AcqStop");
1226 AliTPCCalPad *FPEDFXS=(AliTPCCalPad*)altroFXS->FindObject("FPED");
1227 AliTPCCalPad *maskedFXS=(AliTPCCalPad*)altroFXS->FindObject("Masked");
1228 AliTPCCalPad *k1FXS=(AliTPCCalPad*)altroFXS->FindObject("K1");
1229 AliTPCCalPad *k2FXS=(AliTPCCalPad*)altroFXS->FindObject("K2");
1230 AliTPCCalPad *k3FXS=(AliTPCCalPad*)altroFXS->FindObject("K3");
1231 AliTPCCalPad *l1FXS=(AliTPCCalPad*)altroFXS->FindObject("L1");
1232 AliTPCCalPad *l2FXS=(AliTPCCalPad*)altroFXS->FindObject("L2");
1233 AliTPCCalPad *l3FXS=(AliTPCCalPad*)altroFXS->FindObject("L3");
1234 TMap *mapRCUconfigFXS = (TMap*)altroFXS->FindObject("RCUconfig");
1235 TIterator *mapFXSiter = mapRCUconfigFXS->MakeIterator();
1238 for (Int_t sector=0; sector<nSectors; sector++) {
1241 AliTPCCalROC *rocAcqStart=acqStartFXS->GetCalROC(sector);
1242 if ( rocAcqStart ) acqStart->SetCalROC(rocAcqStart,sector);
1245 AliTPCCalROC *rocZsThr=zsThrFXS->GetCalROC(sector);
1246 if ( rocZsThr ) zsThr->SetCalROC(rocZsThr,sector);
1249 AliTPCCalROC *rocAcqStop=acqStopFXS->GetCalROC(sector);
1250 if ( rocAcqStop ) acqStop->SetCalROC(rocAcqStop,sector);
1253 AliTPCCalROC *rocFPED=FPEDFXS->GetCalROC(sector);
1254 if ( rocFPED ) FPED->SetCalROC(rocFPED,sector);
1257 AliTPCCalROC *rocMasked=maskedFXS->GetCalROC(sector);
1258 if ( rocMasked ) masked->SetCalROC(rocMasked,sector);
1261 AliTPCCalROC *rocK1=k1FXS->GetCalROC(sector);
1262 if ( rocK1 ) k1->SetCalROC(rocK1,sector);
1265 AliTPCCalROC *rocK2=k2FXS->GetCalROC(sector);
1266 if ( rocK2 ) k2->SetCalROC(rocK2,sector);
1269 AliTPCCalROC *rocK3=k3FXS->GetCalROC(sector);
1270 if ( rocK3 ) k3->SetCalROC(rocK3,sector);
1273 AliTPCCalROC *rocL1=l1FXS->GetCalROC(sector);
1274 if ( rocL1 ) l1->SetCalROC(rocL1,sector);
1277 AliTPCCalROC *rocL2=l2FXS->GetCalROC(sector);
1278 if ( rocL2 ) l2->SetCalROC(rocL2,sector);
1281 AliTPCCalROC *rocL3=l3FXS->GetCalROC(sector);
1282 if ( rocL3 ) l3->SetCalROC(rocL3,sector);
1285 if (mapRCUconfigFXS) {
1286 Int_t mapEntries = mapRCUconfigFXS->GetEntries();
1289 TVectorF* vec; // nSectors = 72 (total number of inner/outer sectors)
1290 for (Int_t i=0; i<mapEntries; ++i) {
1291 keyFXS=(TObjString*)mapFXSiter->Next();
1292 vecFXS=(TVectorF*)mapRCUconfigFXS->GetValue(keyFXS);
1293 vec=(TVectorF*)mapRCUconfig->GetValue(keyFXS);
1295 vec = new TVectorF(3*nSectors);
1297 mapRCUconfig->Add(keyFXS,vec);
1299 if (vec->GetNoElements() != 3*nSectors ) {
1300 vec->ResizeTo(3*nSectors);
1302 if (id==0) { // A side
1303 vec->SetSub(0,vecFXS->GetSub(0,nSectors/2-1));
1304 vec->SetSub(nSectors,vecFXS->GetSub(nSectors,2*nSectors-1));
1306 vec->SetSub(nSectors/2,vecFXS->GetSub(nSectors/2,nSectors-1));
1307 vec->SetSub(2*nSectors,vecFXS->GetSub(2*nSectors,3*nSectors-1));
1317 Log ("Error: no entries in AltroConfig file list!");
1323 // Store updated pedestal entry to OCDB
1326 AliCDBMetaData metaData;
1327 metaData.SetBeamPeriod(0);
1328 metaData.SetResponsible("Haavard Helstrup");
1329 metaData.SetAliRootVersion(ALIROOT_SVN_BRANCH);
1330 metaData.SetComment("Preprocessor AliTPC data base entries.");
1332 Bool_t storeOK = Store("Calib", "AltroConfig", altroObjects, &metaData, 0, kFALSE);
1333 if ( !storeOK ) ++result;
1336 altroObjects->Delete();
1337 delete altroObjects;