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 /// \class AliMUONTrackerDataMaker
20 /// Implementation of VTrackerDataMaker to read raw data and
21 /// calibrate it (if required)
23 /// \author Laurent Aphecetche, Subatech
25 #include "AliMUONTrackerDataMaker.h"
27 #include "AliCDBManager.h"
28 #include "AliCDBStorage.h"
29 #include "AliCodeTimer.h"
32 #include "AliMUON2DMap.h"
33 #include "AliMUONCalibParamND.h"
34 #include "AliMUONCalibrationData.h"
35 #include "AliMUONDigitCalibrator.h"
36 #include "AliMUONRawStreamTrackerHP.h"
37 #include "AliMUONTrackerData.h"
38 #include "AliMpDDLStore.h"
39 #include "AliRawEventHeaderBase.h"
40 #include "AliRawReader.h"
41 #include "Riostream.h"
44 ClassImp(AliMUONTrackerDataMaker)
47 Int_t AliMUONTrackerDataMaker::fgkCounter(0);
49 //_____________________________________________________________________________
50 AliMUONTrackerDataMaker::AliMUONTrackerDataMaker(TRootIOCtor*)
52 AliMUONVTrackerDataMaker(),
54 fAccumulatedData(0x0),
56 fDigitCalibrator(0x0),
57 fCalibrationData(0x0),
63 fIsOwnerOfRawReader(kFALSE),
64 fIsEventByEvent(kFALSE)
69 //_____________________________________________________________________________
70 AliMUONTrackerDataMaker::AliMUONTrackerDataMaker(const AliMUONRecoParam* recoParam,
72 AliRawReader* rawReader,
74 const char* calibMode,
79 AliMUONVTrackerDataMaker(),
80 fRawReader(rawReader),
81 fAccumulatedData(0x0),
82 fOneEventData(new AliMUON2DMap(true)),
83 fDigitCalibrator(0x0),
84 fCalibrationData(0x0),
88 fRunNumber(runNumber),
90 fIsOwnerOfRawReader(kFALSE),
91 fIsEventByEvent(kFALSE)
93 /// Ctor in which this object will NOT be the owner of the reader
94 /// and can NOT apply rewind to it, nor use Next on it.
95 Ctor(recoParam,runNumber,calibMode,histogram,xmin,xmax);
99 //_____________________________________________________________________________
100 AliMUONTrackerDataMaker::AliMUONTrackerDataMaker(const AliMUONRecoParam* recoParam,
101 AliRawReader* rawReader,
103 const char* calibMode,
108 AliMUONVTrackerDataMaker(),
109 fRawReader(rawReader),
110 fAccumulatedData(0x0),
111 fOneEventData(new AliMUON2DMap(true)),
112 fDigitCalibrator(0x0),
113 fCalibrationData(0x0),
119 fIsOwnerOfRawReader(kTRUE),
120 fIsEventByEvent(kFALSE)
122 /// Ctor in which we take the ownership of the rawReader, so we can rewind
123 /// and advance it as we wish
127 fRawReader->NextEvent(); // to be sure to get run number available
128 fRunNumber = fRawReader->GetRunNumber();
129 fRawReader->RewindEvents();
132 Ctor(recoParam,fRunNumber,calibMode,histogram,xmin,xmax);
135 //_____________________________________________________________________________
136 AliMUONTrackerDataMaker::AliMUONTrackerDataMaker(AliRawReader* rawReader, Bool_t histogram)
138 AliMUONVTrackerDataMaker(),
139 fRawReader(rawReader),
140 fAccumulatedData(0x0),
141 fOneEventData(new AliMUON2DMap(true)),
142 fDigitCalibrator(0x0),
143 fCalibrationData(0x0),
149 fIsOwnerOfRawReader(kTRUE),
150 fIsEventByEvent(kFALSE)
152 /// Ctor from raw data reader
155 fRawReader->NextEvent(); // to be sure to get run number available
156 fRunNumber = fRawReader->GetRunNumber();
157 fRawReader->RewindEvents();
160 Ctor(0x0,fRunNumber,"",histogram);
164 //_____________________________________________________________________________
166 AliMUONTrackerDataMaker::Ctor(const AliMUONRecoParam* recoParam,
168 const char* calibMode,
170 Double_t xmin, Double_t xmax)
172 /// "designated constructor"
174 Bool_t calibrate = ( strlen(calibMode) > 0 );
181 TString scalib(calibMode);
183 if ( scalib == "GAIN" ) type = "CALC";
184 if ( scalib == "NOGAIN" ) type = "CALZ";
185 if ( scalib == "GAINCONSTANTCAPA") type = "CALG";
186 if ( scalib == "INJECTIONGAIN" ) type = "CALE";
192 name = Form("%s%s_%d",(histogram?"H":""),type.Data(),fgkCounter);
196 name = Form("%s%s%d",(histogram?"H":""),type.Data(),fRunNumber);
199 fAccumulatedData = new AliMUONTrackerData(name.Data(),"charge values",1);
200 fAccumulatedData->SetDimensionName(0,(calibrate ? "Calibrated charge" : "Raw charge"));
203 fAccumulatedData->MakeHistogramForDimension(0,kTRUE,xmin,xmax);
208 fCalibrationData = new AliMUONCalibrationData(runNumber);
210 // force the reading of calibration NOW
211 // FIXME: not really elegant and error prone (as we have the list of calib data twice,
212 // once here and once in the digitcalibrator class, hence the change of them getting
214 // But with the current CDBManager implementation, I don't know how to solve
215 // this better (e.g. to avoid clearing cache messages and so on).
217 AliCDBStorage* storage(0x0);
219 if ( fOCDBPath.Length() > 0 )
221 storage = AliCDBManager::Instance()->GetDefaultStorage();
223 if ( storage && ( storage->GetURI() != fOCDBPath.Data() ) )
225 AliCDBManager::Instance()->SetDefaultStorage(fOCDBPath.Data());
229 fCalibrationData->Pedestals();
230 fCalibrationData->Gains();
231 fCalibrationData->Neighbours();
232 fCalibrationData->HV();
233 fCalibrationData->Capacitances();
235 if ( storage && ( storage->GetURI() != fOCDBPath.Data() ) )
237 AliCDBManager::Instance()->SetDefaultStorage(storage);
240 fDigitCalibrator = new AliMUONDigitCalibrator(*fCalibrationData,recoParam,calibMode);
241 //FIXME: get the reco param from GUI and/or from OCDB if not used from the QA code ?
245 //_____________________________________________________________________________
246 AliMUONTrackerDataMaker::~AliMUONTrackerDataMaker()
250 delete fOneEventData;
251 delete fAccumulatedData;
252 if ( fIsOwnerOfRawReader ) delete fRawReader;
253 delete fCalibrationData;
254 delete fDigitCalibrator;
257 //_____________________________________________________________________________
259 AliMUONTrackerDataMaker::Add(const AliMUONTrackerDataMaker& other)
261 /// Adds other to this
263 if (!fAccumulatedData) return kFALSE;
265 if ( fIsEventByEvent )
267 AliError("Cannot add event by event objects !");
271 if ( fRunNumber != other.fRunNumber ) fRunNumber = -1;
274 fSource += other.fSource;
276 fNumberOfEvents += other.fNumberOfEvents;
279 list.Add(other.fAccumulatedData);
281 fAccumulatedData->Merge(&list);
286 //_____________________________________________________________________________
288 AliMUONTrackerDataMaker::NextEvent()
290 /// Read and process next event
292 if ( !fIsOwnerOfRawReader )
294 AliError("I'm not the owner of the raw reader. Cannot use NextEvent");
298 AliCodeTimerAuto("",0);
300 static Int_t nphysics(0);
301 static Int_t ngood(0);
303 if ( !IsRunning() ) return kTRUE;
305 Bool_t ok = fRawReader->NextEvent();
312 Int_t eventType = fRawReader->GetType();
316 if (eventType != AliRawEventHeaderBase::kPhysicsEvent )
318 return kTRUE; // for the moment
323 Bool_t pok = ProcessEvent();
327 AliDebug(1,Form("n %10d nphysics %10d ngood %10d",fNumberOfEvents,nphysics,ngood));
332 //_____________________________________________________________________________
333 Bool_t AliMUONTrackerDataMaker::ProcessEvent()
335 /// Process current event
337 /// Note that in case of calibration, we do not simply reuse the
338 /// AliMUONDigitCalibrator::Calibrate(AliMUONVDigitStore&) method,
339 /// as this would require filling first a digitStore, and then calibrate it,
340 /// and then convert it into a VStore, all this taking too much time.
341 /// But we *do* reuse the AliMUONDigitCalibrator::CalibrateDigit in order not to
342 /// duplicate this critical piece of calibration code !
345 AliCodeTimerAuto("",0);
347 AliMUONRawStreamTrackerHP stream(fRawReader);
349 stream.DisableWarnings();
350 stream.EnabbleErrorLogger();
352 const Int_t nddls = AliDAQ::NumberOfDdls("MUONTRK");
353 TArrayI nevents(nddls);
355 for ( Int_t i = 0; i < nddls; ++i )
360 fOneEventData->Clear();
369 while ( stream.Next(buspatchId,manuId,manuChannel,adc,kTRUE) )
371 Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(buspatchId);
373 Int_t ddl = AliMpDDLStore::Instance()->GetDDLfromBus(buspatchId);
377 AliMUONVCalibParam* param = static_cast<AliMUONVCalibParam*>(fOneEventData->FindObject(detElemId,manuId));
380 param = new AliMUONCalibParamND(1,64,detElemId,manuId,
381 AliMUONVCalibParam::InvalidFloatValue());
382 fOneEventData->Add(param);
385 Double_t charge(adc);
387 if ( fDigitCalibrator )
389 if ( fDigitCalibrator->IsValidDigit(detElemId, manuId, manuChannel) )
391 charge = fDigitCalibrator->CalibrateDigit(detElemId, manuId, manuChannel,adc);
401 param->SetValueAsDouble(manuChannel,0,charge);
405 Bool_t badEvent = stream.HasPaddingError() || stream.HasGlitchError();
409 fAccumulatedData->Add(*fOneEventData,&nevents);
416 //_____________________________________________________________________________
418 AliMUONTrackerDataMaker::Print(Option_t*) const
422 cout << "Source=" << Source() << " Running=" << ( IsRunning() ? "YES" : "NO")
426 //_____________________________________________________________________________
427 void AliMUONTrackerDataMaker::Rewind()
430 if ( fIsOwnerOfRawReader )
432 fRawReader->RewindEvents();
437 AliError("Wrong usage of this class : cannot rewind as I am not owner of the raw reader !");
441 //_____________________________________________________________________________
442 Long64_t AliMUONTrackerDataMaker::Merge(TCollection* list)
444 /// Merge objects in collection
448 if ( list->IsEmpty() ) return NumberOfEvents();
451 const TObject* o(0x0);
453 while ( ( o = next() ) )
455 const AliMUONTrackerDataMaker* data = dynamic_cast<const AliMUONTrackerDataMaker*>(o);
458 AliError(Form("Object named %s is not an AliMUONTrackerDataMaker ! Skipping it",
463 Bool_t ok = Add(*data);
466 AliError("Got incompatible objects");
471 return NumberOfEvents();
474 //_____________________________________________________________________________
476 AliMUONTrackerDataMaker::SetRawReader(AliRawReader* rawReader)
478 /// Change the rawreader (only works if isowner=true)
480 if ( fIsOwnerOfRawReader )
482 AliFatal("Improper use of this class ! Cannot change raw reader in this case");
485 fRawReader = rawReader;