1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 **************************************************************************/
18 #include <Riostream.h>
28 #include <TObjArray.h>
29 #include <TObjString.h>
30 #include <TTimeStamp.h>
32 #include "AliCDBMetaData.h"
33 #include "AliCDBEntry.h"
35 #include "AliTOFChannelOnline.h"
36 #include "AliTOFChannelOnlineStatus.h"
37 #include "AliTOFDataDCS.h"
38 #include "AliTOFGeometry.h"
39 #include "AliTOFPreprocessor.h"
45 // TOF preprocessor class.
46 // It takes data from DCS and passes them to the class AliTOFDataDCS, which
47 // processes them. The result is then written to the CDB.
48 // analogously, it takes data form DAQ (both at Run level and inclusive -
49 // of all the runs - level, processes them, and stores both Reference Data
50 // and Online Calibration files in the CDB.
51 // Processing of Pulser/Noise Run data and of TOF FEE DCS map
55 // return=1 : no DCS input data Map
56 // return=2 : no DCS input data processing
57 // return=3 : no DCS processed data was stored in Ref Data
58 // return=4 : no DAQ input for Ref Data
59 // return=5 : failed to store DAQ Ref Data
60 // return=6 : failed to retrieve DAQ data for calibration
61 // return=7 : problems in processing histos in the input DAQ file
62 // return=8 : failed to store Online Delays
63 // return=9 : failed to store Reference Data for Pulser
64 // return=10: failed to retrieve Pulser data
65 // return=11: failed to store Pulser map in OCDB
66 // return=12: failed to store Reference Data for Noise
67 // return=13: failed to retrieve Noise data
68 // return=14: failed to store Noise map in OCDB
70 ClassImp(AliTOFPreprocessor)
72 const Int_t AliTOFPreprocessor::fgkBinRangeAve = 13; // number of bins where to calculate the mean
73 const Double_t AliTOFPreprocessor::fgkIntegralThr = 100; // min number of entries to perform computation of delay per channel
74 const Double_t AliTOFPreprocessor::fgkThrPar = 0.013; // parameter used to trigger the calculation of the delay
76 //_____________________________________________________________________________
78 AliTOFPreprocessor::AliTOFPreprocessor(AliShuttleInterface* shuttle) :
79 AliPreprocessor("TOF", shuttle),
92 //_____________________________________________________________________________
94 AliTOFPreprocessor::~AliTOFPreprocessor()
116 //______________________________________________________________________________
117 void AliTOFPreprocessor::Initialize(Int_t run, UInt_t startTime,
120 // Creates AliTOFDataDCS object
122 AliPreprocessor::Initialize(run, startTime, endTime);
124 AliInfo(Form("\n\tRun %d \n\tStartTime %s \n\tEndTime %s", run,
125 TTimeStamp(startTime).AsString(),
126 TTimeStamp(endTime).AsString()));
128 fData = new AliTOFDataDCS(fRun, fStartTime, fEndTime);
129 fData->SetFDRFlag(fFDRFlag);
131 fNChannels = AliTOFGeometry::NSectors()*(2*(AliTOFGeometry::NStripC()+AliTOFGeometry::NStripB())+AliTOFGeometry::NStripA())*AliTOFGeometry::NpadZ()*AliTOFGeometry::NpadX();
132 fCal = new TObjArray(fNChannels);
134 for (Int_t ich = 0; ich<fNChannels; ich ++){
135 AliTOFChannelOnline * calChOnline = new AliTOFChannelOnline();
136 fCal->AddAt(calChOnline,ich);
138 fCalStatus = new TObjArray(fNChannels);
139 fCalStatus->SetOwner();
140 for (Int_t ich = 0; ich<fNChannels; ich ++){
141 AliTOFChannelOnlineStatus * calChOnlineStatus = new AliTOFChannelOnlineStatus();
142 fCalStatus->AddAt(calChOnlineStatus,ich);
145 //_____________________________________________________________________________
146 Bool_t AliTOFPreprocessor::ProcessDCS(){
148 // check whether DCS should be processed or not...
150 TString runType = GetRunType();
151 Log(Form("RunType %s",runType.Data()));
153 if ((runType == "PULSER_RUN")||(runType == "NOISE_RUN")) {
159 //_____________________________________________________________________________
161 UInt_t AliTOFPreprocessor::ProcessDCSDataPoints(TMap* dcsAliasMap)
163 // Fills data into a AliTOFDataDCS object
166 Log("Processing DCS DP");
167 TH1::AddDirectory(0);
169 Bool_t resultDCSMap=kFALSE;
170 Bool_t resultDCSStore=kFALSE;
175 Log("No DCS map found: TOF exiting from Shuttle");
176 return 1;// return error Code for DCS input data not found
179 // The processing of the DCS input data is forwarded to AliTOFDataDCS
180 resultDCSMap=fData->ProcessData(*dcsAliasMap);
182 Log("Some problems occurred while processing DCS data, TOF exiting from Shuttle");
183 return 2;// return error Code for processed DCS data not stored
186 AliCDBMetaData metaDataDCS;
187 metaDataDCS.SetBeamPeriod(0);
188 metaDataDCS.SetResponsible("Chiara Zampolli");
189 metaDataDCS.SetComment("This preprocessor fills an AliTOFDataDCS object.");
190 AliInfo("Storing DCS Data");
191 resultDCSStore = StoreReferenceData("Calib","DCSData",fData, &metaDataDCS);
192 if (!resultDCSStore){
193 Log("Some problems occurred while storing DCS data results in Reference Data, TOF exiting from Shuttle");
194 return 3;// return error Code for processed DCS data not stored
202 //_____________________________________________________________________________
204 UInt_t AliTOFPreprocessor::ProcessOnlineDelays()
206 // Processing data from DAQ for online calibration
208 Log("Processing DAQ delays");
210 TH1::AddDirectory(0);
212 Bool_t resultDAQRef=kFALSE;
213 Bool_t resultTOFPP=kFALSE;
219 //retrieving data at Run level
220 TList* list = GetFileSources(kDAQ, "RUNLevel");
223 AliInfo("The following sources produced files with the id RUNLevel");
225 for (Int_t jj=0;jj<list->GetEntries();jj++){
226 TObjString * str = dynamic_cast<TObjString*> (list->At(jj));
227 AliInfo(Form("found source %s", str->String().Data()));
228 // file to be stored run per run
229 TString fileNameRun = GetFile(kDAQ, "RUNLevel", str->GetName());
230 if (fileNameRun.Length()>0){
231 AliInfo(Form("Got the file %s, now we can store the Reference Data for the current Run.", fileNameRun.Data()));
232 daqFile = new TFile(fileNameRun.Data(),"READ");
233 fh2 = (TH2S*) daqFile->Get("htof");
234 AliCDBMetaData metaDataHisto;
235 metaDataHisto.SetBeamPeriod(0);
236 metaDataHisto.SetResponsible("Chiara Zampolli");
237 metaDataHisto.SetComment("This preprocessor stores the array of histos object as Reference Data.");
238 AliInfo("Storing Reference Data");
239 resultDAQRef = StoreReferenceData("Calib","DAQData",fh2, &metaDataHisto);
241 Log("some problems occurred::No Reference Data stored, TOF exiting from Shuttle");
242 return 5;//return error code for failure in storing Ref Data
249 Log("The input data file from DAQ (run-level) was not found, TOF exiting from Shuttle ");
250 return 4;//return error code for failure in retrieving Ref Data
256 Log("The input data file list from DAQ (run-level) was not found, TOF exiting from Shuttle ");
257 return 4;//return error code for failure in retrieving Ref Data
262 //Total files, with cumulative histos
264 TList* listTot = GetFileSources(kDAQ, "DELAYS");
267 AliInfo("The following sources produced files with the id DELAYS");
269 for (Int_t jj=0;jj<listTot->GetEntries();jj++){
270 TObjString * str = dynamic_cast<TObjString*> (listTot->At(jj));
271 AliInfo(Form("found source %s", str->String().Data()));
273 // file with summed histos, to extract calib params
274 TString fileName = GetFile(kDAQ, "DELAYS", str->GetName());
275 if (fileName.Length()>0){
276 AliInfo(Form("Got the file %s, now we can extract some values.", fileName.Data()));
278 daqFile = new TFile(fileName.Data(),"READ");
280 fh2 = (TH2S*) daqFile->Get("htoftot");
282 Log("some problems occurred:: No histo retrieved, TOF exiting from Shuttle");
284 return 7; //return error code for histograms not existing/junky
287 static const Int_t kSize=fh2->GetNbinsX();
288 static const Int_t kNBins=fh2->GetNbinsY();
289 static const Double_t kXBinmin=fh2->GetYaxis()->GetBinLowEdge(1);
290 if (kSize != fNChannels){
291 Log(" number of bins along x different from number of pads, found only a subset of the histograms, TOF exiting from Shuttle");
293 return 7; //return error code for histograms not existing/junky
295 for (Int_t ich=0;ich<kSize;ich++){
296 TH1S *h1 = new TH1S("h1","h1",kNBins,kXBinmin-0.5,kNBins*1.+kXBinmin-0.5);
297 for (Int_t ibin=0;ibin<kNBins;ibin++){
298 h1->SetBinContent(ibin+1,fh2->GetBinContent(ich+1,ibin+1));
300 if(h1->Integral()<fgkIntegralThr) {
301 Log(Form(" Not enough statistics for bin %i, skipping this channel",ich));
306 if (!fFDRFlag) { // not computing delays if in FDR runs
308 Float_t minContent=h1->Integral()*fgkThrPar;
309 Int_t nbinsX = h1->GetNbinsX();
311 for (Int_t j=1; j<=nbinsX; j++){
313 h1->GetBinContent(j) +
314 h1->GetBinContent(j+1)+
315 h1->GetBinContent(j+2)+
316 h1->GetBinContent(j+3))>minContent){
322 if(!found) AliInfo(Form("WARNING!!! no start of fit found for histo # %i",ich));
323 // Now calculate the mean over the interval.
327 for(Int_t k=0;k<fgkBinRangeAve;k++){
328 mean=mean+h1->GetBinCenter(startBin+k)*h1->GetBinContent(startBin+k);
329 nent=nent+h1->GetBinContent(startBin+k);
330 sumw2=sumw2+(h1->GetBinCenter(startBin+k))*(h1->GetBinCenter(startBin+k))*(h1->GetBinContent(startBin+k));
332 mean= mean/nent; //<x>
333 sumw2=sumw2/nent; //<x^2>
335 rmsmean = TMath::Sqrt((sumw2-mean*mean)/nent);
336 if (ich<fNChannels) {
337 AliTOFChannelOnline * ch = (AliTOFChannelOnline *)fCal->At(ich);
338 ch->SetDelay((Double_t)mean*AliTOFGeometry::TdcBinWidth()*1.E-3); // delay in ns
339 // ch->SetStatus(1); // calibrated channel, removed for the time being from AliTOFChannelOnline
350 Log("The Cumulative data file from DAQ does not exist, TOF exiting from Shuttle");
351 return 6;//return error code for problems in retrieving DAQ data
357 Log("Problem: no list for Cumulative data file from DAQ was found, TOF exiting from Shuttle");
358 return 6; //return error code for problems in retrieving DAQ data
362 AliCDBMetaData metaData;
363 metaData.SetBeamPeriod(0);
364 metaData.SetResponsible("Chiara Zampolli");
365 metaData.SetComment("This preprocessor fills a TObjArray object.");
366 AliInfo("Storing Calibration Data");
367 resultTOFPP = Store("Calib","ParOnline",fCal, &metaData,0,kTRUE);
369 Log("Some problems occurred while storing online object resulting from DAQ data processing");
370 return 8;//return error code for problems in storing DAQ data
375 //_____________________________________________________________________________
377 UInt_t AliTOFPreprocessor::ProcessPulserData()
379 // Processing Pulser Run data for TOF channel status
381 Log("Processing Pulser");
383 TH1::AddDirectory(0);
385 Bool_t resultPulserRef=kFALSE;
386 Bool_t resultPulser=kFALSE;
388 static const Int_t size = AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors();
389 TH1S * htofPulser = new TH1S("hTOFpulser","histo with signals on TOF during pulser", size,-0.5,size-0.5);
390 for (Int_t ibin =1;ibin<=size;ibin++){
391 htofPulser->SetBinContent(ibin,-1);
394 // retrieving last stored pulser object, and copying
396 AliCDBEntry *cdbEntry = GetFromOCDB("Calib","Pulser");
398 TObjArray *currentCalStatus = (TObjArray*)cdbEntry->GetObject();
399 for (Int_t ich = 0; ich<fNChannels; ich ++){
400 AliTOFChannelOnlineStatus * calChOnlineSt = (AliTOFChannelOnlineStatus*)fCalStatus->At(ich);
401 calChOnlineSt->SetStatus(((AliTOFChannelOnlineStatus*)currentCalStatus->At(ich))->GetStatus());
410 //retrieving Pulser data
411 TList* listPulser = GetFileSources(kDAQ, "PULSER");
414 AliInfo("The following sources produced files with the id PULSER");
416 for (Int_t jj=0;jj<listPulser->GetEntries();jj++){
417 TObjString * str = dynamic_cast<TObjString*> (listPulser->At(jj));
418 AliInfo(Form("found source %s", str->String().Data()));
419 // file to be stored run per run
420 TString fileNamePulser = GetFile(kDAQ, "PULSER", str->GetName());
421 if (fileNamePulser.Length()>0){
422 // storing refernce data
423 AliInfo(Form("Got the file %s, now we can store the Reference Data for pulser for the current Run.", fileNamePulser.Data()));
424 daqFile = new TFile(fileNamePulser.Data(),"READ");
425 h1 = (TH1S*) daqFile->Get("hTOFpulser");
426 for (Int_t ibin=0;ibin<size;ibin++){
427 if ((h1->GetBinContent(ibin+1))!=-1){
428 if ((htofPulser->GetBinContent(ibin+1))==-1){
429 htofPulser->SetBinContent(ibin+1,h1->GetBinContent(ibin+1));
432 Log(Form("Something strange occurred during Pulser run, channel %i already read by another LDC, please check!",ibin));
439 Int_t nreadNotEmpty=0;
440 for (Int_t ientry=1;ientry<=h1->GetNbinsX();ientry++){
441 if (h1->GetBinContent(ientry)==-1) continue;
443 if (h1->GetBinContent(ientry)>0) {
445 AliDebug(1,Form(" channel %i is ok with entry = %f; so far %i channels added ",ientry-1,h1->GetBinContent(ientry),nreadNotEmpty));
447 mean+=h1->GetBinContent(ientry);
452 AliDebug(1,Form(" nread = %i , mean = %f",nread,mean));
453 for (Int_t ich =0;ich<fNChannels;ich++){
454 AliTOFChannelOnlineStatus * chSt = (AliTOFChannelOnlineStatus *)fCalStatus->At(ich);
455 if (h1->GetBinContent(ich+1)==-1) continue;
456 AliDebug(1,Form(" channel %i ",ich));
457 AliDebug(1,Form(" channel status before pulser = %i",(Int_t)chSt->GetStatus()));
458 if (h1->GetBinContent(ich+1)<0.05*mean){
459 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFPulserBad); // bad status for pulser
460 AliDebug(1,Form(" channel status after pulser = %i",(Int_t)chSt->GetStatus()));
463 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFPulserOk); // bad status for pulser
464 AliDebug(1,Form(" channel status after pulser = %i",(Int_t)chSt->GetStatus()));
474 Log("The input data file from DAQ (pulser) was not found, TOF exiting from Shuttle ");
475 return 10;//return error code for failure in retrieving Ref Data
483 Log("The input data file list from DAQ (pulser) was not found, TOF exiting from Shuttle ");
484 return 10;//return error code for failure in retrieving Ref Data
489 AliCDBMetaData metaData;
490 metaData.SetBeamPeriod(0);
491 metaData.SetResponsible("Chiara Zampolli");
492 metaData.SetComment("This preprocessor fills a TObjArray object for Pulser data.");
493 AliInfo("Storing Calibration Data from Pulser Run");
494 resultPulser = Store("Calib","PulserData",fCalStatus, &metaData,0,kTRUE);
496 Log("Some problems occurred while storing online object resulting from Pulser data processing");
497 return 11;//return error code for problems in storing Pulser data
502 AliCDBMetaData metaDataHisto;
503 metaDataHisto.SetBeamPeriod(0);
504 metaDataHisto.SetResponsible("Chiara Zampolli");
506 sprintf(comment,"This preprocessor stores the result of the pulser run");
507 metaDataHisto.SetComment(comment);
508 AliInfo("Storing Reference Data");
509 resultPulserRef = StoreReferenceData("Calib","Pulser",htofPulser, &metaDataHisto);
510 if (!resultPulserRef){
511 Log("some problems occurred::No Reference Data for pulser stored, TOF exiting from Shuttle");
512 return 9;//return error code for failure in storing Ref Data
520 //_____________________________________________________________________________
522 UInt_t AliTOFPreprocessor::ProcessNoiseData()
525 // Processing Noise Run data for TOF channel status
527 Log("Processing Noise");
529 TH1::AddDirectory(0);
531 Bool_t resultNoiseRef=kFALSE;
532 Bool_t resultNoise=kFALSE;
534 static const Int_t size = AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors();
535 TH1F * htofNoise = new TH1F("hTOFnoise","histo with signals on TOF during pulser", size,-0.5,size-0.5);
536 for (Int_t ibin =1;ibin<=size;ibin++){
537 htofNoise->SetBinContent(ibin,-1);
540 // retrieving last stored noise object, and copying
542 AliCDBEntry *cdbEntry = GetFromOCDB("Calib","Noise");
544 TObjArray *currentCalStatus = (TObjArray*)cdbEntry->GetObject();
545 for (Int_t ich = 0; ich<fNChannels; ich ++){
546 AliTOFChannelOnlineStatus * calChOnlineSt = (AliTOFChannelOnlineStatus*)fCalStatus->At(ich);
547 calChOnlineSt->SetStatus(((AliTOFChannelOnlineStatus*)currentCalStatus->At(ich))->GetStatus());
556 //retrieving Noise data
557 TList* listNoise = GetFileSources(kDAQ, "NOISE");
560 AliInfo("The following sources produced files with the id NOISE");
562 for (Int_t jj=0;jj<listNoise->GetEntries();jj++){
563 TObjString * str = dynamic_cast<TObjString*> (listNoise->At(jj));
564 AliInfo(Form("found source %s", str->String().Data()));
565 // file to be stored run per run
566 TString fileNameNoise = GetFile(kDAQ, "NOISE", str->GetName());
567 if (fileNameNoise.Length()>0){
568 // storing refernce data
569 AliInfo(Form("Got the file %s, now we can store the Reference Data for noise for the current Run.", fileNameNoise.Data()));
570 daqFile = new TFile(fileNameNoise.Data(),"READ");
571 h1 = (TH1F*) daqFile->Get("hTOFnoise");
572 for (Int_t ibin=0;ibin<size;ibin++){
573 if ((h1->GetBinContent(ibin+1))!=-1){
574 if ((htofNoise->GetBinContent(ibin+1))==-1){
575 htofNoise->SetBinContent(ibin+1,h1->GetBinContent(ibin+1));
578 Log(Form("Something strange occurred during Noise run, channel %i already read by another LDC, please check!",ibin));
583 for (Int_t ich =0;ich<fNChannels;ich++){
584 AliTOFChannelOnlineStatus * chSt = (AliTOFChannelOnlineStatus *)fCalStatus->At(ich);
585 if (h1->GetBinContent(ich+1)==-1) continue;
586 AliDebug(1,Form( " channel %i",ich));
587 AliDebug(1,Form( " channel status before noise = %i",(Int_t)chSt->GetStatus()));
588 if (h1->GetBinContent(ich+1)>=1){ // setting limit for noise to 1 kHz
589 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFNoiseBad); // bad status for noise
590 AliDebug(1,Form( " channel status after noise = %i",(Int_t)chSt->GetStatus()));
593 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFNoiseOk); // bad status for noise
594 AliDebug(1,Form(" channel status after noise = %i",(Int_t)chSt->GetStatus()));
605 Log("The input data file from DAQ (noise) was not found, TOF exiting from Shuttle ");
606 return 13;//return error code for failure in retrieving Ref Data
613 Log("The input data file list from DAQ (noise) was not found, TOF exiting from Shuttle ");
614 return 13;//return error code for failure in retrieving Ref Data
621 AliCDBMetaData metaData;
622 metaData.SetBeamPeriod(0);
623 metaData.SetResponsible("Chiara Zampolli");
624 metaData.SetComment("This preprocessor fills a TObjArray object for Noise data.");
625 AliInfo("Storing Calibration Data from Noise Run");
626 resultNoise = Store("Calib","NoiseData",fCalStatus, &metaData,0,kTRUE);
628 Log("Some problems occurred while storing online object resulting from Noise data processing");
629 return 14;//return error code for problems in storing Noise data
634 AliCDBMetaData metaDataHisto;
635 metaDataHisto.SetBeamPeriod(0);
636 metaDataHisto.SetResponsible("Chiara Zampolli");
638 sprintf(comment,"This preprocessor stores the result of the noise run, TOF exiting from Shuttle ");
639 metaDataHisto.SetComment(comment);
640 AliInfo("Storing Reference Data");
641 resultNoiseRef = StoreReferenceData("Calib","Noise",htofNoise, &metaDataHisto);
642 if (!resultNoiseRef){
643 Log("some problems occurred::No Reference Data for noise stored");
644 return 12;//return error code for failure in storing Ref Data
650 //_____________________________________________________________________________
652 UInt_t AliTOFPreprocessor::ProcessHWData()
654 // Processing Pulser Run data for TOF channel status
655 // dummy for the time being
657 Log("Processing HW");
663 //_____________________________________________________________________________
665 UInt_t AliTOFPreprocessor::Process(TMap* dcsAliasMap)
668 TString runType = GetRunType();
669 Log(Form("RunType %s",runType.Data()));
673 if (runType == "PULSER") {
674 Int_t iresultPulser = ProcessPulserData();
675 return iresultPulser;
678 if (runType == "NOISE") { // for the time being associating noise runs with pedestal runs; proper run type to be defined
679 Int_t iresultNoise = ProcessNoiseData();
683 if (runType == "PHYSICS") {
684 Int_t iresultDCS = ProcessDCSDataPoints(dcsAliasMap);
685 if (iresultDCS != 0) {
689 Int_t iresultDAQ = ProcessOnlineDelays();