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 **************************************************************************/
20 #include <Riostream.h>
22 #include <TObjString.h>
25 #include "AliCDBMetaData.h"
27 #include "AliMUON2DMap.h"
28 #include "AliMUON2DStoreValidator.h"
29 #include "AliMUONCalibParam2F.h"
30 #include "AliMUONConstants.h"
31 #include "AliMUONObjectPair.h"
32 #include "AliMUONPedestalSubprocessor.h"
33 #include "AliMUONPreprocessor.h"
34 #include "AliMUONVDataIterator.h"
35 #include "AliMpDDLStore.h"
38 /// \class AliMUONPedestalSubprocessor
40 /// Implementation of AliMUONVSubprocessor class to deal with MUON TRK pedestals.
42 /// Pedestals are read in from an ascii file, with the format : \n
43 ///---------------------------------------------------------------------------\n
44 /// BUS_PATCH MANU_ADDR CHANNEL MEAN SIGMA \n
45 ///---------------------------------------------------------------------------\n
47 /// \author L. Aphecetche
51 ClassImp(AliMUONPedestalSubprocessor)
54 //_____________________________________________________________________________
55 AliMUONPedestalSubprocessor::AliMUONPedestalSubprocessor(AliMUONPreprocessor* master)
56 : AliMUONVSubprocessor(master,
58 "Upload MUON Tracker pedestals to OCDB"),
64 //_____________________________________________________________________________
65 AliMUONPedestalSubprocessor::~AliMUONPedestalSubprocessor()
71 //_____________________________________________________________________________
73 AliMUONPedestalSubprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
75 /// When starting a new run, reads in the pedestals ASCII files.
77 const Int_t kSystem = AliMUONPreprocessor::kDAQ;
78 const char* kId = "PEDESTALS";
81 fPedestals = new AliMUON2DMap(kTRUE);
83 AliInfo(Form("Reading pedestal files for Run %d startTime %ld endTime %ld",
84 run,startTime,endTime));
86 TList* sources = Master()->GetFileSources(kSystem,kId);
89 while ( ( o = static_cast<TObjString*>(next()) ) )
91 TString fileName(Master()->GetFile(kSystem,kId,o->GetName()));
92 Bool_t ok = ReadFile(fileName.Data());
95 AliError(Form("Could not read file %s",fileName.Data()));
101 //_____________________________________________________________________________
103 AliMUONPedestalSubprocessor::Process(TMap* /*dcsAliasMap*/)
105 // Store the pedestals into the CDB
107 if (!fPedestals) return 0;
109 Master()->Log("Validating pedestals");
110 AliMUON2DStoreValidator validator;
112 validator.Validate(*fPedestals,AliMUONCalibParam2F::InvalidFloatValue());
117 lines.SetOwner(kTRUE);
118 validator.Report(lines,*missing);
121 while ( ( l = static_cast<TObjString*>(next())) )
123 Master()->Log(l->GetName());
128 Master()->Log("Storing pedestals");
130 AliCDBMetaData metaData;
131 metaData.SetBeamPeriod(0);
132 metaData.SetResponsible("MUON TRK");
133 metaData.SetComment("Computed by AliMUONPedestalSubprocessor $Id$");
135 Bool_t validToInfinity = kTRUE;
136 UInt_t result = Master()->Store("Calib", "Pedestals", fPedestals, &metaData, 0, validToInfinity);
141 //_____________________________________________________________________________
143 AliMUONPedestalSubprocessor::ReadFile(const char* filename)
145 // Read the pedestals from an ASCII file.
146 // Format of that file is one line per channel :
147 //---------------------------------------------------------------------------
148 // BUS_PATCH MANU_ADDR CHANNEL MEAN SIGMA
149 //---------------------------------------------------------------------------
151 // Return kFALSE if reading was not successfull.
154 AliInfo(Form("Reading %s",filename));
156 std::ifstream in(gSystem->ExpandPathName(filename));
157 if (!in.good()) return kFALSE;
160 Int_t busPatchID, manuID, manuChannel;
161 Float_t pedMean, pedSigma;
162 static const Int_t kNchannels(64);
163 static Bool_t replace(kFALSE);
165 while ( in.getline(line,80) )
167 if ( line[0] == '/' && line[1] == '/' ) continue;
168 std::istringstream sin(line);
169 sin >> busPatchID >> manuID >> manuChannel >> pedMean >> pedSigma;
170 Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
171 AliDebug(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d MEAN %7.2f SIGMA %7.2f",
172 busPatchID,detElemID,manuID,manuChannel,pedMean,pedSigma));
174 AliMUONVCalibParam* ped =
175 static_cast<AliMUONVCalibParam*>(fPedestals->Get(detElemID,manuID));
179 ped = new AliMUONCalibParam2F(kNchannels,AliMUONCalibParam2F::InvalidFloatValue());
180 fPedestals->Set(detElemID,manuID,ped,replace);
182 ped->SetValueAsFloat(manuChannel,0,pedMean);
183 ped->SetValueAsFloat(manuChannel,1,pedSigma);
190 //_____________________________________________________________________________
192 AliMUONPedestalSubprocessor::Print(Option_t* opt) const
195 AliMUONVDataIterator* it = fPedestals->Iterator();
196 AliMUONObjectPair* p;
198 while ( ( p = static_cast<AliMUONObjectPair*>(it->Next() ) ) )
200 AliMUONVCalibParam* value = static_cast<AliMUONVCalibParam*>(p->Value());