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 "AliMUONCalibrationData.h"
20 #include "AliCDBEntry.h"
21 #include "AliCDBManager.h"
22 #include "AliCodeTimer.h"
23 #include "AliDCSValue.h"
25 #include "AliMpDCSNamer.h"
26 #include "AliMUONConstants.h"
27 #include "AliMUONGlobalCrateConfig.h"
28 #include "AliMUONRegionalTriggerConfig.h"
29 #include "AliMUONRejectList.h"
30 #include "AliMUONTriggerEfficiencyCells.h"
31 #include "AliMUONTriggerLut.h"
32 #include "AliMUONVCalibParam.h"
33 #include "AliMUONVStore.h"
34 #include "AliMUONVStore.h"
36 #include <Riostream.h>
40 //-----------------------------------------------------------------------------
41 /// \class AliMUONCalibrationData
43 /// For the moment, this class stores pedestals, gains, hv (for tracker)
44 /// and lut, masks and efficiencies (for trigger) that are fetched from the CDB.
46 /// This class is to be considered as a convenience class.
47 /// Its aim is to ease retrieval of calibration data from the
48 /// condition database.
50 /// It acts as a "facade" to a bunch of underlying
51 /// containers/calibration classes.
53 /// \author Laurent Aphecetche
54 //-----------------------------------------------------------------------------
57 ClassImp(AliMUONCalibrationData)
60 AliMUONVStore* AliMUONCalibrationData::fgBypassPedestals(0x0);
61 AliMUONVStore* AliMUONCalibrationData::fgBypassGains(0x0);
63 //_____________________________________________________________________________
64 AliMUONCalibrationData::AliMUONCalibrationData(Int_t runNumber,
65 Bool_t deferredInitialization)
68 fRunNumber(runNumber),
73 fLocalTriggerBoardMasks(0x0),
74 fRegionalTriggerConfig(0x0),
75 fGlobalTriggerCrateConfig(0x0),
77 fTriggerEfficiency(0x0),
86 // If deferredInitialization is false, we read *all* calibrations
88 // So when using this class to access only one kind of calibrations (e.g.
89 // only pedestals), you should put deferredInitialization to kTRUE, which
90 // will instruct this object to fetch the data only when neeeded.
92 if ( deferredInitialization == kFALSE )
100 LocalTriggerBoardMasks(0);
101 RegionalTriggerConfig();
102 GlobalTriggerCrateConfig();
111 //_____________________________________________________________________________
112 AliMUONCalibrationData::~AliMUONCalibrationData()
114 /// Destructor. Note that we're the owner of our pointers if the OCDB cache
115 /// is not set. Otherwise the cache is supposed to take care of them...
116 if (!(AliCDBManager::Instance()->GetCacheFlag())) Reset();
119 //_____________________________________________________________________________
121 AliMUONCalibrationData::Capacitances() const
123 /// Create (if needed) and return the internal store for capacitances.
127 fCapacitances = CreateCapacitances(fRunNumber);
129 return fCapacitances;
132 //_____________________________________________________________________________
134 AliMUONCalibrationData::CreateCapacitances(Int_t runNumber, Int_t* startOfValidity)
136 /// Create capa store from OCDB for a given run
138 return dynamic_cast<AliMUONVStore*>(CreateObject(runNumber,"MUON/Calib/Capacitances",startOfValidity));
141 //_____________________________________________________________________________
143 AliMUONCalibrationData::CreateGains(Int_t runNumber, Int_t* startOfValidity)
145 /// Create a new gain store from the OCDB for a given run
146 return dynamic_cast<AliMUONVStore*>(CreateObject(runNumber,"MUON/Calib/Gains",startOfValidity));
149 //_____________________________________________________________________________
150 AliMUONGlobalCrateConfig*
151 AliMUONCalibrationData::CreateGlobalTriggerCrateConfig(Int_t runNumber, Int_t* startOfValidity)
153 /// Create the internal store for GlobalTriggerCrateConfig from OCDB
155 return dynamic_cast<AliMUONGlobalCrateConfig*>(CreateObject(runNumber,"MUON/Calib/GlobalTriggerCrateConfig",startOfValidity));
159 //______________________________________________________________________________
160 void AliMUONCalibrationData::PatchHVValues(TObjArray& values,
167 /// We do here a little bit of massaging of the HV values, if needed.
169 /// The main point is to "gather" the values near the end of the run (the last XX seconds)
170 /// to avoid the ramp-down before end-of-run syndrom...
172 /// The rest is more of a debug/expert tool to have closer look at trends
175 Double_t HVBEAMTUNING(1300);
177 Bool_t eorProblem(kFALSE);
179 UInt_t mergeDelay(300); // in seconds
181 // First start by removing values within the last mergeDelay seconds, keeping only
184 AliDCSValue* last = static_cast<AliDCSValue*>(values.At(values.GetLast()));
186 Int_t* toberemoved = new Int_t[values.GetLast()+1];
188 memset(toberemoved,0,(values.GetLast()+1)*sizeof(Int_t));
190 Int_t ntoberemoved(0);
192 for ( Int_t i = values.GetLast()-1; i > 0; --i )
194 AliDCSValue* val = static_cast<AliDCSValue*>(values.At(i));
196 if ( last->GetTimeStamp() - val->GetTimeStamp() < mergeDelay )
205 // ok, we have some values within the same mergeDelay seconds
206 // we'll "merge" them by taking the last one, except if
207 // the last one is below HVBEAMTUNING, in which case we
208 // remove that one too (meaning the ramp-down was requesting
209 // before the end-of-run)
211 if ( last->GetFloat() < HVBEAMTUNING )
214 if (msg) *msg = "ERROR RAMP-DOWN BEFORE EOR";
215 toberemoved[values.GetLast()]=1;
218 for ( Int_t i = 0; i <= values.GetLast(); ++i )
220 if ( toberemoved[i] ) values.RemoveAt(i);
227 delete[] toberemoved;
235 // now for the rest of the diagnosis
240 for ( Int_t i = 0; i <= values.GetLast(); ++i )
242 AliDCSValue* val = static_cast<AliDCSValue*>(values.At(i));
244 if ( val->GetFloat() < AliMpDCSNamer::TrackerHVOFF() )
248 else if ( val->GetFloat() < HVBEAMTUNING )
256 if ( ntmpoff == values.GetLast()+1 )
258 if (msg) *msg = "ERROR HV OFF";
263 if (msg) *msg = "ERROR TRIP";
268 if ( ntmpready == values.GetLast()+1 )
270 if (msg) *msg = "ERROR BELOW READY";
273 if (ntmpready) ++nbelowready;
276 //_____________________________________________________________________________
278 AliMUONCalibrationData::CreateHV(Int_t runNumber, Int_t* startOfValidity, Bool_t patched)
280 /// Create a new HV map from the OCDB for a given run
281 TMap* hvMap = dynamic_cast<TMap*>(CreateObject(runNumber,"MUON/Calib/HV",startOfValidity));
285 TObjString* hvChannelName;
287 while ( ( hvChannelName = static_cast<TObjString*>(next()) ) )
289 TString name(hvChannelName->String());
291 if ( name.Contains("sw") ) continue; // skip switches
293 TPair* hvPair = static_cast<TPair*>(hvMap->FindObject(name.Data()));
294 TObjArray* values = static_cast<TObjArray*>(hvPair->Value());
297 AliErrorClass(Form("Could not get values for alias %s",name.Data()));
306 PatchHVValues(*values,nbelowready,noff,ntrips,neor,0x0);
309 nbelowready=noff=ntrips=neor=0;
310 PatchHVValues(*values,nbelowready,noff,ntrips,neor,0x0);
313 AliErrorClass("neor is not null after PatchHVValue ! This is serious !");
323 //_____________________________________________________________________________
325 AliMUONCalibrationData::CreateTriggerDCS(Int_t runNumber, Int_t* startOfValidity)
327 /// Create a new Trigger HV and curent map from the OCDB for a given run
328 return dynamic_cast<TMap*>(CreateObject(runNumber,"MUON/Calib/TriggerDCS",startOfValidity));
331 //_____________________________________________________________________________
333 AliMUONCalibrationData::CreateLocalTriggerBoardMasks(Int_t runNumber, Int_t* startOfValidity)
335 /// Get the internal store for LocalTriggerBoardMasks from OCDB
337 return dynamic_cast<AliMUONVStore*>(CreateObject(runNumber,"MUON/Calib/LocalTriggerBoardMasks",startOfValidity));
340 //_____________________________________________________________________________
342 AliMUONCalibrationData::CreateNeighbours(Int_t runNumber, Int_t* startOfValidity)
344 /// Create a neighbour store from the OCDB for a given run
345 return dynamic_cast<AliMUONVStore*>(CreateObject(runNumber,"MUON/Calib/Neighbours",startOfValidity));
348 //_____________________________________________________________________________
350 AliMUONCalibrationData::CreateObject(Int_t runNumber, const char* path, Int_t* startOfValidity)
352 /// Access the CDB for a given path (e.g. MUON/Calib/Pedestals),
353 /// and return the corresponding TObject.
355 AliCodeTimerAutoClass(Form("%d : %s",runNumber,path),0);
357 AliCDBManager* man = AliCDBManager::Instance();
359 AliCDBEntry* entry = man->Get(path,runNumber);
363 if ( startOfValidity ) *startOfValidity = entry->GetId().GetFirstRun();
365 TObject* object = entry->GetObject();
366 if (!(man->GetCacheFlag()))
368 entry->SetOwner(kFALSE);
375 if ( startOfValidity ) *startOfValidity = AliCDBRunRange::Infinity();
380 AliCodeTimerAutoClass(Form("Failed to get %s for run %d",path,runNumber),1);
387 //_____________________________________________________________________________
389 AliMUONCalibrationData::CreateOccupancyMap(Int_t runNumber, Int_t* startOfValidity)
391 /// Create a new occupancy map store from the OCDB for a given run
392 return dynamic_cast<AliMUONVStore*>(CreateObject(runNumber,"MUON/Calib/OccupancyMap",startOfValidity));
395 //_____________________________________________________________________________
397 AliMUONCalibrationData::CreateRejectList(Int_t runNumber, Int_t* startOfValidity)
399 /// Create a new rejectlist store from the OCDB for a given run
400 return dynamic_cast<AliMUONRejectList*>(CreateObject(runNumber,"MUON/Calib/RejectList",startOfValidity));
403 //_____________________________________________________________________________
405 AliMUONCalibrationData::CreatePedestals(Int_t runNumber, Int_t* startOfValidity)
407 /// Create a new pedestal store from the OCDB for a given run
408 return dynamic_cast<AliMUONVStore*>(CreateObject(runNumber,"MUON/Calib/Pedestals",startOfValidity));
411 //_____________________________________________________________________________
413 AliMUONCalibrationData::CreateConfig(Int_t runNumber, Int_t* startOfValidity)
415 /// Create a new config store from the OCDB for a given run
416 return dynamic_cast<AliMUONVStore*>(CreateObject(runNumber,"MUON/Calib/Config",startOfValidity));
420 //_____________________________________________________________________________
421 AliMUONRegionalTriggerConfig*
422 AliMUONCalibrationData::CreateRegionalTriggerConfig(Int_t runNumber, Int_t* startOfValidity)
424 /// Create the internal store for RegionalTriggerConfig from OCDB
426 return dynamic_cast<AliMUONRegionalTriggerConfig*>(CreateObject(runNumber,"MUON/Calib/RegionalTriggerConfig",startOfValidity));
429 //_____________________________________________________________________________
430 AliMUONTriggerEfficiencyCells*
431 AliMUONCalibrationData::CreateTriggerEfficiency(Int_t runNumber, Int_t* startOfValidity)
433 /// Create trigger efficiency object from OCBD
435 return dynamic_cast<AliMUONTriggerEfficiencyCells*>(CreateObject(runNumber,"MUON/Calib/TriggerEfficiency",startOfValidity));
438 //_____________________________________________________________________________
440 AliMUONCalibrationData::CreateTriggerLut(Int_t runNumber, Int_t* startOfValidity)
442 /// Create trigger LUT from OCDB
444 return dynamic_cast<AliMUONTriggerLut*>(CreateObject(runNumber,"MUON/Calib/TriggerLut",startOfValidity));
447 //_____________________________________________________________________________
449 AliMUONCalibrationData::Gains() const
451 /// Create (if needed) and return the internal store for gains.
452 if (fgBypassGains) return fgBypassGains;
456 fGains = CreateGains(fRunNumber);
461 //_____________________________________________________________________________
463 AliMUONCalibrationData::Gains(Int_t detElemId, Int_t manuId) const
465 /// Return the gains for a given (detElemId, manuId) pair
466 /// Note that, unlike the DeadChannel case, if the result is 0x0, that's an
467 /// error (meaning that we should get gains for all channels).
469 AliMUONVStore* gains = Gains();
475 return static_cast<AliMUONVCalibParam*>(gains->FindObject(detElemId,manuId));
478 //_____________________________________________________________________________
479 AliMUONGlobalCrateConfig*
480 AliMUONCalibrationData::GlobalTriggerCrateConfig() const
482 /// Return the config for the global trigger board.
484 if (!fGlobalTriggerCrateConfig)
486 fGlobalTriggerCrateConfig = CreateGlobalTriggerCrateConfig(fRunNumber);
488 return fGlobalTriggerCrateConfig;
492 //_____________________________________________________________________________
494 AliMUONCalibrationData::HV(Bool_t patched) const
496 /// Return the calibration for a given (detElemId, manuId) pair
500 fHV = CreateHV(fRunNumber,0,patched);
505 //_____________________________________________________________________________
507 AliMUONCalibrationData::TriggerDCS() const
509 /// Return the calibration for a given (detElemId, manuId) pair
513 fTriggerDCS = CreateTriggerDCS(fRunNumber);
518 //_____________________________________________________________________________
520 AliMUONCalibrationData::Neighbours() const
522 /// Create (if needed) and return the internal store for neighbours.
525 fNeighbours = CreateNeighbours(fRunNumber);
530 //_____________________________________________________________________________
532 AliMUONCalibrationData::LocalTriggerBoardMasks(Int_t localBoardNumber) const
534 /// Return the masks for a given trigger local board.
536 if (!fLocalTriggerBoardMasks)
538 fLocalTriggerBoardMasks = CreateLocalTriggerBoardMasks(fRunNumber);
541 if ( fLocalTriggerBoardMasks )
543 AliMUONVCalibParam* ltbm =
544 static_cast<AliMUONVCalibParam*>(fLocalTriggerBoardMasks->FindObject(localBoardNumber));
547 AliError(Form("Could not get mask for localBoardNumber=%d",localBoardNumber));
554 //_____________________________________________________________________________
556 AliMUONCalibrationData::OccupancyMap() const
558 /// Get occupancy map
561 fOccupancyMap = CreateOccupancyMap(fRunNumber);
563 return fOccupancyMap;
566 //_____________________________________________________________________________
568 AliMUONCalibrationData::RejectList() const
573 fRejectList = CreateRejectList(fRunNumber);
578 //_____________________________________________________________________________
580 AliMUONCalibrationData::BypassStores(AliMUONVStore* ped, AliMUONVStore* gain)
582 /// Force the use of those pedestals and gains
583 fgBypassPedestals = ped;
584 fgBypassGains = gain;
588 //_____________________________________________________________________________
590 AliMUONCalibrationData::Pedestals() const
594 if (fgBypassPedestals) return fgBypassPedestals;
598 fPedestals = CreatePedestals(fRunNumber);
603 //_____________________________________________________________________________
605 AliMUONCalibrationData::Config() const
611 fConfig = CreateConfig(fRunNumber);
616 //_____________________________________________________________________________
618 AliMUONCalibrationData::Pedestals(Int_t detElemId, Int_t manuId) const
620 /// Return the pedestals for a given (detElemId, manuId) pair.
621 /// A return value of 0x0 is considered an error, meaning we should get
622 /// pedestals for all channels.
624 AliMUONVStore* pedestals = Pedestals();
630 return static_cast<AliMUONVCalibParam*>(pedestals->FindObject(detElemId,manuId));
633 //_____________________________________________________________________________
635 AliMUONCalibrationData::Print(Option_t*) const
637 /// A very basic dump of our guts.
639 cout << "RunNumber " << RunNumber()
640 << " fGains=" << fGains
641 << " fPedestals=" << fPedestals
642 << " fConfig=" << fConfig
644 << " fTriggerDCS=" << fTriggerDCS
645 << " fLocalTriggerBoardMasks=" << fLocalTriggerBoardMasks
646 << " fRegionalTriggerConfig=" << fRegionalTriggerConfig
647 << " fGlobalTriggerCrateConfig=" << fGlobalTriggerCrateConfig
648 << " fTriggerLut=" << fTriggerLut
653 //_____________________________________________________________________________
654 AliMUONRegionalTriggerConfig*
655 AliMUONCalibrationData::RegionalTriggerConfig() const
657 /// Return the config for the regional trigger board.
659 if (!fRegionalTriggerConfig)
661 fRegionalTriggerConfig = CreateRegionalTriggerConfig(fRunNumber);
663 return fRegionalTriggerConfig;
667 //_____________________________________________________________________________
668 AliMUONTriggerEfficiencyCells*
669 AliMUONCalibrationData::TriggerEfficiency() const
671 /// Return the trigger efficiency.
673 if (!fTriggerEfficiency)
675 fTriggerEfficiency = CreateTriggerEfficiency(fRunNumber);
677 return fTriggerEfficiency;
681 //_____________________________________________________________________________
683 AliMUONCalibrationData::TriggerLut() const
685 /// Return the trigger look up table.
689 fTriggerLut = CreateTriggerLut(fRunNumber);
694 //_____________________________________________________________________________
696 AliMUONCalibrationData::Reset()
700 AliCodeTimerAuto("",0);
712 delete fLocalTriggerBoardMasks;
713 fLocalTriggerBoardMasks = 0x0;
714 delete fRegionalTriggerConfig;
715 fRegionalTriggerConfig = 0x0;
716 delete fGlobalTriggerCrateConfig;
717 fGlobalTriggerCrateConfig = 0x0;
721 delete fTriggerEfficiency;
722 fTriggerEfficiency = 0x0;
723 delete fCapacitances;
729 //_____________________________________________________________________________
731 AliMUONCalibrationData::Check(Int_t runNumber)
733 /// Self-check to see if we can read all data for a given run
734 /// from the current OCDB...
736 if ( ! CreateCapacitances(runNumber) )
738 AliErrorClass("Could not read capacitances");
742 AliInfoClass("Capacitances read OK");
745 if ( ! CreateGains(runNumber) )
747 AliErrorClass("Could not read gains");
751 AliInfoClass("Gains read OK");
754 if ( ! CreateGlobalTriggerCrateConfig(runNumber) )
756 AliErrorClass("Could not read Trigger Crate Config");
760 AliInfoClass("TriggerBoardMasks read OK");
763 if ( ! CreateHV(runNumber) )
765 AliErrorClass("Could not read HV");
769 AliInfoClass("HV read OK");
772 if ( ! CreateTriggerDCS(runNumber) )
774 AliErrorClass("Could not read Trigger HV and Currents");
778 AliInfoClass("Trigger HV and Currents read OK");
781 if ( ! CreateNeighbours(runNumber) )
783 AliErrorClass("Could not read Neighbours");
787 AliInfoClass("Neighbours read OK");
790 if ( ! CreateLocalTriggerBoardMasks(runNumber) )
792 AliErrorClass("Could not read LocalTriggerBoardMasks");
796 AliInfoClass("LocalTriggerBoardMasks read OK");
799 if ( ! CreatePedestals(runNumber) )
801 AliErrorClass("Could not read pedestals");
805 AliInfoClass("Pedestals read OK");
808 if ( ! CreateConfig(runNumber) )
810 AliErrorClass("Could not read config");
814 AliInfoClass("Config read OK");
817 if ( ! CreateRegionalTriggerConfig(runNumber) )
819 AliErrorClass("Could not read RegionalTriggerConfig");
823 AliInfoClass("RegionalTriggerBoardMasks read OK");
826 if ( ! CreateTriggerLut(runNumber) )
828 AliErrorClass("Could not read TriggerLut");
832 AliInfoClass("TriggerLut read OK");
835 if ( ! CreateTriggerEfficiency(runNumber) )
837 AliErrorClass("Could not read TriggerEfficiency");
841 AliInfoClass("TriggerEfficiency read OK");