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"
43 //class AliTOFGeometry;
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 != "PHYSICS"){
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");
221 if (list !=0x0 && list->GetEntries()!=0)
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");
265 if (listTot !=0x0 && listTot->GetEntries()!=0)
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 Int_t nNotStatistics = 0; // number of channel with not enough statistics
296 for (Int_t ich=0;ich<kSize;ich++){
297 TH1S *h1 = new TH1S("h1","h1",kNBins,kXBinmin-0.5,kNBins*1.+kXBinmin-0.5);
298 for (Int_t ibin=0;ibin<kNBins;ibin++){
299 h1->SetBinContent(ibin+1,fh2->GetBinContent(ich+1,ibin+1));
301 if(h1->Integral()<fgkIntegralThr) {
303 if (!fFDRFlag) Log(Form(" Not enough statistics for bin %i, skipping this channel",ich)); // printing message only if not in FDR runs
308 if (!fFDRFlag) { // not computing delays if in FDR runs
310 Float_t minContent=h1->Integral()*fgkThrPar;
311 Int_t nbinsX = h1->GetNbinsX();
313 for (Int_t j=1; j<=nbinsX; j++){
315 h1->GetBinContent(j) +
316 h1->GetBinContent(j+1)+
317 h1->GetBinContent(j+2)+
318 h1->GetBinContent(j+3))>minContent){
324 if(!found) AliInfo(Form("WARNING!!! no start of fit found for histo # %i",ich));
325 // Now calculate the mean over the interval.
329 for(Int_t k=0;k<fgkBinRangeAve;k++){
330 mean=mean+h1->GetBinCenter(startBin+k)*h1->GetBinContent(startBin+k);
331 nent=nent+h1->GetBinContent(startBin+k);
332 sumw2=sumw2+(h1->GetBinCenter(startBin+k))*(h1->GetBinCenter(startBin+k))*(h1->GetBinContent(startBin+k));
334 mean= mean/nent; //<x>
335 sumw2=sumw2/nent; //<x^2>
337 rmsmean = TMath::Sqrt((sumw2-mean*mean)/nent);
338 if (ich<fNChannels) {
339 AliTOFChannelOnline * ch = (AliTOFChannelOnline *)fCal->At(ich);
340 ch->SetDelay((Double_t)mean*AliTOFGeometry::TdcBinWidth()*1.E-3); // delay in ns
341 // ch->SetStatus(1); // calibrated channel, removed for the time being from AliTOFChannelOnline
347 if (nNotStatistics!=0) Log(Form("Too little statistics for %d channels!",nNotStatistics));
353 Log("The Cumulative data file from DAQ does not exist, TOF exiting from Shuttle");
354 return 6;//return error code for problems in retrieving DAQ data
360 Log("Problem: no list for Cumulative data file from DAQ was found, TOF exiting from Shuttle");
361 return 6; //return error code for problems in retrieving DAQ data
365 AliCDBMetaData metaData;
366 metaData.SetBeamPeriod(0);
367 metaData.SetResponsible("Chiara Zampolli");
368 metaData.SetComment("This preprocessor fills a TObjArray object.");
369 AliInfo("Storing Calibration Data");
370 resultTOFPP = Store("Calib","ParOnline",fCal, &metaData,0,kTRUE);
372 Log("Some problems occurred while storing online object resulting from DAQ data processing");
373 return 8;//return error code for problems in storing DAQ data
378 //_____________________________________________________________________________
380 UInt_t AliTOFPreprocessor::ProcessPulserData()
382 // Processing Pulser Run data for TOF channel status
384 Log("Processing Pulser");
386 TH1::AddDirectory(0);
388 Bool_t resultPulserRef=kFALSE;
389 Bool_t resultPulser=kFALSE;
391 static const Int_t kSize = AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors();
392 TH1S * htofPulser = new TH1S("hTOFpulser","histo with signals on TOF during pulser", kSize,-0.5,kSize-0.5);
393 for (Int_t ibin =1;ibin<=kSize;ibin++){
394 htofPulser->SetBinContent(ibin,-1);
397 // retrieving last stored pulser object, and copying
399 AliCDBEntry *cdbEntry = GetFromOCDB("Calib","Pulser");
401 TObjArray *currentCalStatus = (TObjArray*)cdbEntry->GetObject();
402 for (Int_t ich = 0; ich<fNChannels; ich ++){
403 AliTOFChannelOnlineStatus * calChOnlineSt = (AliTOFChannelOnlineStatus*)fCalStatus->At(ich);
404 calChOnlineSt->SetStatus(((AliTOFChannelOnlineStatus*)currentCalStatus->At(ich))->GetStatus());
413 //retrieving Pulser data
414 TList* listPulser = GetFileSources(kDAQ, "PULSER");
415 if (listPulser !=0x0 && listPulser->GetEntries()!=0)
417 AliInfo("The following sources produced files with the id PULSER");
419 for (Int_t jj=0;jj<listPulser->GetEntries();jj++){
420 TObjString * str = dynamic_cast<TObjString*> (listPulser->At(jj));
421 AliInfo(Form("found source %s", str->String().Data()));
422 // file to be stored run per run
423 TString fileNamePulser = GetFile(kDAQ, "PULSER", str->GetName());
424 if (fileNamePulser.Length()>0){
425 // storing refernce data
426 AliInfo(Form("Got the file %s, now we can store the Reference Data for pulser for the current Run.", fileNamePulser.Data()));
427 daqFile = new TFile(fileNamePulser.Data(),"READ");
428 h1 = (TH1S*) daqFile->Get("hTOFpulser");
429 for (Int_t ibin=0;ibin<kSize;ibin++){
430 if ((h1->GetBinContent(ibin+1))!=-1){
431 if ((htofPulser->GetBinContent(ibin+1))==-1){
432 htofPulser->SetBinContent(ibin+1,h1->GetBinContent(ibin+1));
435 Log(Form("Something strange occurred during Pulser run, channel %i already read by another LDC, please check!",ibin));
442 Int_t nreadNotEmpty=0;
443 for (Int_t ientry=1;ientry<=h1->GetNbinsX();ientry++){
444 if (h1->GetBinContent(ientry)==-1) continue;
446 if (h1->GetBinContent(ientry)>0) {
448 AliDebug(1,Form(" channel %i is ok with entry = %f; so far %i channels added ",ientry-1,h1->GetBinContent(ientry),nreadNotEmpty));
450 mean+=h1->GetBinContent(ientry);
455 AliDebug(1,Form(" nread = %i , mean = %f",nread,mean));
456 for (Int_t ich =0;ich<fNChannels;ich++){
457 AliTOFChannelOnlineStatus * chSt = (AliTOFChannelOnlineStatus *)fCalStatus->At(ich);
458 if (h1->GetBinContent(ich+1)==-1) continue;
459 AliDebug(1,Form(" channel %i ",ich));
460 AliDebug(1,Form(" channel status before pulser = %i",(Int_t)chSt->GetStatus()));
461 if (h1->GetBinContent(ich+1)<0.05*mean){
462 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFPulserBad); // bad status for pulser
463 AliDebug(1,Form(" channel status after pulser = %i",(Int_t)chSt->GetStatus()));
466 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFPulserOk); // bad status for pulser
467 AliDebug(1,Form(" channel status after pulser = %i",(Int_t)chSt->GetStatus()));
477 Log("The input data file from DAQ (pulser) was not found, TOF exiting from Shuttle ");
478 return 10;//return error code for failure in retrieving Ref Data
486 Log("The input data file list from DAQ (pulser) was not found, TOF exiting from Shuttle ");
487 return 10;//return error code for failure in retrieving Ref Data
492 AliCDBMetaData metaData;
493 metaData.SetBeamPeriod(0);
494 metaData.SetResponsible("Chiara Zampolli");
495 metaData.SetComment("This preprocessor fills a TObjArray object for Pulser data.");
496 AliInfo("Storing Calibration Data from Pulser Run");
497 resultPulser = Store("Calib","PulserData",fCalStatus, &metaData,0,kTRUE);
499 Log("Some problems occurred while storing online object resulting from Pulser data processing");
500 return 11;//return error code for problems in storing Pulser data
505 AliCDBMetaData metaDataHisto;
506 metaDataHisto.SetBeamPeriod(0);
507 metaDataHisto.SetResponsible("Chiara Zampolli");
509 sprintf(comment,"This preprocessor stores the result of the pulser run");
510 metaDataHisto.SetComment(comment);
511 AliInfo("Storing Reference Data");
512 resultPulserRef = StoreReferenceData("Calib","Pulser",htofPulser, &metaDataHisto);
513 if (!resultPulserRef){
514 Log("some problems occurred::No Reference Data for pulser stored, TOF exiting from Shuttle");
515 return 9;//return error code for failure in storing Ref Data
523 //_____________________________________________________________________________
525 UInt_t AliTOFPreprocessor::ProcessNoiseData()
528 // Processing Noise Run data for TOF channel status
530 Log("Processing Noise");
532 TH1::AddDirectory(0);
534 Bool_t resultNoiseRef=kFALSE;
535 Bool_t resultNoise=kFALSE;
537 static const Int_t kSize = AliTOFGeometry::NPadXSector()*AliTOFGeometry::NSectors();
538 TH1F * htofNoise = new TH1F("hTOFnoise","histo with signals on TOF during pulser", kSize,-0.5,kSize-0.5);
539 for (Int_t ibin =1;ibin<=kSize;ibin++){
540 htofNoise->SetBinContent(ibin,-1);
543 // retrieving last stored noise object, and copying
545 AliCDBEntry *cdbEntry = GetFromOCDB("Calib","Noise");
547 TObjArray *currentCalStatus = (TObjArray*)cdbEntry->GetObject();
548 for (Int_t ich = 0; ich<fNChannels; ich ++){
549 AliTOFChannelOnlineStatus * calChOnlineSt = (AliTOFChannelOnlineStatus*)fCalStatus->At(ich);
550 calChOnlineSt->SetStatus(((AliTOFChannelOnlineStatus*)currentCalStatus->At(ich))->GetStatus());
559 //retrieving Noise data
560 TList* listNoise = GetFileSources(kDAQ, "NOISE");
561 if (listNoise !=0x0 && listNoise->GetEntries()!=0)
563 AliInfo("The following sources produced files with the id NOISE");
565 for (Int_t jj=0;jj<listNoise->GetEntries();jj++){
566 TObjString * str = dynamic_cast<TObjString*> (listNoise->At(jj));
567 AliInfo(Form("found source %s", str->String().Data()));
568 // file to be stored run per run
569 TString fileNameNoise = GetFile(kDAQ, "NOISE", str->GetName());
570 if (fileNameNoise.Length()>0){
571 // storing refernce data
572 AliInfo(Form("Got the file %s, now we can store the Reference Data for noise for the current Run.", fileNameNoise.Data()));
573 daqFile = new TFile(fileNameNoise.Data(),"READ");
574 h1 = (TH1F*) daqFile->Get("hTOFnoise");
575 for (Int_t ibin=0;ibin<kSize;ibin++){
576 if ((h1->GetBinContent(ibin+1))!=-1){
577 if ((htofNoise->GetBinContent(ibin+1))==-1){
578 htofNoise->SetBinContent(ibin+1,h1->GetBinContent(ibin+1));
581 Log(Form("Something strange occurred during Noise run, channel %i already read by another LDC, please check!",ibin));
586 for (Int_t ich =0;ich<fNChannels;ich++){
587 AliTOFChannelOnlineStatus * chSt = (AliTOFChannelOnlineStatus *)fCalStatus->At(ich);
588 if (h1->GetBinContent(ich+1)==-1) continue;
589 AliDebug(1,Form( " channel %i",ich));
590 AliDebug(1,Form( " channel status before noise = %i",(Int_t)chSt->GetStatus()));
591 if (h1->GetBinContent(ich+1)>=1){ // setting limit for noise to 1 kHz
592 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFNoiseBad); // bad status for noise
593 AliDebug(1,Form( " channel status after noise = %i",(Int_t)chSt->GetStatus()));
596 chSt->SetStatus(chSt->GetStatus()|AliTOFChannelOnlineStatus::kTOFNoiseOk); // bad status for noise
597 AliDebug(1,Form(" channel status after noise = %i",(Int_t)chSt->GetStatus()));
608 Log("The input data file from DAQ (noise) was not found, TOF exiting from Shuttle ");
609 return 13;//return error code for failure in retrieving Ref Data
616 Log("The input data file list from DAQ (noise) was not found, TOF exiting from Shuttle ");
617 return 13;//return error code for failure in retrieving Ref Data
624 AliCDBMetaData metaData;
625 metaData.SetBeamPeriod(0);
626 metaData.SetResponsible("Chiara Zampolli");
627 metaData.SetComment("This preprocessor fills a TObjArray object for Noise data.");
628 AliInfo("Storing Calibration Data from Noise Run");
629 resultNoise = Store("Calib","NoiseData",fCalStatus, &metaData,0,kTRUE);
631 Log("Some problems occurred while storing online object resulting from Noise data processing");
632 return 14;//return error code for problems in storing Noise data
637 AliCDBMetaData metaDataHisto;
638 metaDataHisto.SetBeamPeriod(0);
639 metaDataHisto.SetResponsible("Chiara Zampolli");
641 sprintf(comment,"This preprocessor stores the result of the noise run, TOF exiting from Shuttle ");
642 metaDataHisto.SetComment(comment);
643 AliInfo("Storing Reference Data");
644 resultNoiseRef = StoreReferenceData("Calib","Noise",htofNoise, &metaDataHisto);
645 if (!resultNoiseRef){
646 Log("some problems occurred::No Reference Data for noise stored");
647 return 12;//return error code for failure in storing Ref Data
653 //_____________________________________________________________________________
655 UInt_t AliTOFPreprocessor::ProcessHWData()
657 // Processing Pulser Run data for TOF channel status
658 // dummy for the time being
660 Log("Processing HW");
666 //_____________________________________________________________________________
668 UInt_t AliTOFPreprocessor::Process(TMap* dcsAliasMap)
674 TString runType = GetRunType();
675 Log(Form("RunType %s",runType.Data()));
677 //*((TString*) (0x0)) = "bla";
681 if (runType == "PULSER") {
682 Int_t iresultPulser = ProcessPulserData();
683 return iresultPulser;
686 if (runType == "NOISE") { // for the time being associating noise runs with pedestal runs; proper run type to be defined
687 Int_t iresultNoise = ProcessNoiseData();
691 if (runType == "PHYSICS") {
692 Int_t iresultDCS = ProcessDCSDataPoints(dcsAliasMap);
693 if (iresultDCS != 0) {
697 Int_t iresultDAQ = ProcessOnlineDelays();