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 **************************************************************************/
19 #include "AliMUONTrackerIO.h"
21 /// \class AliMUONTrackerIO
23 /// Reader class for ASCII calibration files for MUON tracker :
24 /// converts those ASCII files into AliMUONVStore (suitable to e.g. feed
27 /// \author Laurent Aphecetche, Subatech
30 ClassImp(AliMUONTrackerIO)
33 #include "AliDCSValue.h"
35 #include "AliMUONCalibParamND.h"
36 #include "AliMUONCalibParamNF.h"
37 #include "AliMUONVStore.h"
38 #include "AliMpConstants.h"
39 #include "AliMpDDLStore.h"
40 #include "AliMpDEManager.h"
41 #include "AliMpDetElement.h"
42 #include <Riostream.h>
44 #include <TObjString.h>
48 //_____________________________________________________________________________
49 AliMUONTrackerIO::AliMUONTrackerIO()
54 //_____________________________________________________________________________
55 AliMUONTrackerIO::~AliMUONTrackerIO()
60 //_____________________________________________________________________________
62 AliMUONTrackerIO::ReadOccupancy(const char* filename,AliMUONVStore& occupancyMap)
64 /// Read occupancy file created by online DA
65 /// and append values to the occupancyMap store.
66 /// Expected format of the file is :
67 /// busPatchId manuId sumofn nevt
69 TString sFilename(gSystem->ExpandPathName(filename));
71 std::ifstream in(sFilename.Data());
74 return kCannotOpenFile;
80 while ( in.getline(line,1024) )
81 stream << line << "\n";
85 return DecodeOccupancy(stream.str().c_str(),occupancyMap);
89 //_____________________________________________________________________________
91 AliMUONTrackerIO::DecodeOccupancy(const char* data, AliMUONVStore& occupancyMap)
93 /// Decode occupancy string created append values to the occupancyMap store.
94 /// Expected format of the file is :
95 /// busPatchId manuId sumofn nevt
97 if ( ! AliMpDDLStore::Instance(kFALSE) )
99 AliErrorClass("Mapping not loaded. Cannot work");
104 istringstream in(data);
108 while ( in.getline(line,1024) )
110 AliDebugClass(3,Form("line=%s",line));
111 if ( line[0] == '/' && line[1] == '/' ) continue;
112 std::istringstream sin(line);
114 Int_t busPatchId, manuId;
115 Int_t numberOfEvents;
118 sin >> busPatchId >> manuId >> sumn >> numberOfEvents;
120 if ( busPatchId == -1 && manuId == -1 && sumn == 0 && numberOfEvents == 0 )
122 /// DA could not produce information (because run failed somehow).
123 /// That's OK, but let the world know about it
127 Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(busPatchId);
129 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
131 Int_t numberOfChannelsInManu = -1;
133 if (de) numberOfChannelsInManu = de->NofChannelsInManu(manuId);
135 if ( numberOfChannelsInManu <= 0 )
137 AliErrorClass(Form("BP %5d DE %5d MANU %5d nchannels=%d",busPatchId,detElemId,manuId,numberOfChannelsInManu));
141 AliMUONVCalibParam* occupancy =
142 static_cast<AliMUONVCalibParam*>(occupancyMap.FindObject(detElemId,manuId));
145 AliErrorClass(Form("DE %5d MANU %5d is already there ?!",detElemId,manuId));
149 occupancy = new AliMUONCalibParamND(5,1,detElemId,manuId,0);
151 occupancyMap.Add(occupancy);
153 occupancy->SetValueAsDouble(0,0,sumn);
154 occupancy->SetValueAsDouble(0,1,sumn); // with only 0 and 1s, sumw = sumw2 = sumn
155 occupancy->SetValueAsDouble(0,2,sumn);
156 occupancy->SetValueAsInt(0,3,numberOfChannelsInManu);
157 occupancy->SetValueAsInt(0,4,numberOfEvents);
164 //_____________________________________________________________________________
166 AliMUONTrackerIO::ReadPedestals(const char* filename, AliMUONVStore& pedStore)
168 /// Read pedestal file (produced by the MUONTRKda.exe program for instance)
169 /// and append the read values into the given VStore
170 /// To be used when the input is a file (for instance when reading data
173 TString sFilename(gSystem->ExpandPathName(filename));
175 std::ifstream in(sFilename.Data());
178 return kCannotOpenFile;
181 ostringstream stream;
183 while ( in.getline(line,1024) )
184 stream << line << "\n";
188 return DecodePedestals(stream.str().c_str(),pedStore);
192 //_____________________________________________________________________________
194 AliMUONTrackerIO::DecodePedestals(const char* data, AliMUONVStore& pedStore)
196 /// Read pedestal Data (produced by the MUONTRKda.exe program for instance)
197 /// and append the read values into the given VStore
198 /// To be used when the input is a TString (for instance when getting data
202 Int_t busPatchID, manuID, manuChannel;
203 Float_t pedMean, pedSigma;
205 istringstream in(data);
207 while ( in.getline(line,1024) )
209 AliDebugClass(3,Form("line=%s",line));
210 if ( line[0] == '/' && line[1] == '/' ) continue;
211 std::istringstream sin(line);
212 sin >> busPatchID >> manuID >> manuChannel >> pedMean >> pedSigma;
213 Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
215 if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
217 AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
218 detElemID,busPatchID,manuID));
222 AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d MEAN %7.2f SIGMA %7.2f",
223 busPatchID,detElemID,manuID,manuChannel,pedMean,pedSigma));
225 AliMUONVCalibParam* ped =
226 static_cast<AliMUONVCalibParam*>(pedStore.FindObject(detElemID,manuID));
229 ped = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),
231 AliMUONVCalibParam::InvalidFloatValue());
234 ped->SetValueAsFloat(manuChannel,0,pedMean);
235 ped->SetValueAsFloat(manuChannel,1,pedSigma);
242 //_____________________________________________________________________________
244 AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
247 /// Read gain file (produced by the MUONTRKda.exe program for instance)
248 /// and append the read values into the given VStore
249 /// To be used when the input is a file (for instance when reading data
254 TString sFilename(gSystem->ExpandPathName(filename));
256 std::ifstream in(sFilename.Data());
259 return kCannotOpenFile;
262 ostringstream stream;
264 while ( in.getline(line,1024) )
265 stream << line << "\n";
269 return DecodeGains(stream.str().c_str(),gainStore,comment);
273 //_____________________________________________________________________________
275 AliMUONTrackerIO::DecodeGains(const char* data, AliMUONVStore& gainStore,
278 /// Read gain file (produced by the MUONTRKda.exe program for instance)
279 /// and append the read values into the given VStore
280 /// To be used when the input is a string (for instance when getting data
284 istringstream in(data);
285 Int_t busPatchID, manuID, manuChannel;
289 const Int_t kSaturation(3000); // FIXME: how to get this number ?
295 Int_t nInit(0),f1nbp(0),f2nbp(0);
297 while ( in.getline(line,1024) )
299 if ( strlen(line) < 10 ) continue;
300 if ( line[0] == '/' && line[1] == '/' )
303 if ( sline.Contains("DUMMY") )
305 AliDebugClass(1,"Got a dummy file here");
308 if ( sline.Contains("* Run") )
310 TObjArray* a = sline.Tokenize(":");
311 if ( a->GetLast() >= 1 )
313 TString s = static_cast<TObjString*>(a->At(1))->String();
314 runNumber = s.Atoi();
315 AliDebugClass(1,Form("runNumber is %d",runNumber));
318 if ( sline.Contains("DAC values") )
320 nDAC = TString(sline(2,sline.Length()-2)).Atoi();
321 AliDebugClass(1,Form("# of DAC values = %d",nDAC));
326 runs = new Int_t[nDAC];
327 dac = new Int_t[nDAC];
329 in.getline(line,1024);
331 if (!sline.Contains("* nInit ="))
333 AliErrorClass("Improper format : was expecting nInit= line...");
337 sscanf(line,"// * nInit = %d * f1nbp = %d * f2nbp = %d",&nInit,&f1nbp,&f2nbp);
338 AliDebugClass(1,Form("nInit = %d",nInit));
339 AliDebugClass(1,Form("f1nbp = %d",f1nbp));
340 AliDebugClass(1,Form("f2nbp = %d",f2nbp));
342 in.getline(line,1024);
343 in.getline(line,1024);
344 // then get run and dac values
346 for ( Int_t i = 0; i < nDAC; ++i )
348 in.getline(line,1024);
350 sscanf(line,"// %d %d",&a,&b);
353 AliDebugClass(1,Form("RUN %d is DAC %d",runs[iDAC],dac[iDAC]));
359 AliErrorClass(Form("Something went wrong, as I get too big nDAC = %d",nDAC));
368 sscanf(line,"%d %d %d %f %f %d %x",&busPatchID,&manuID,&manuChannel,
369 &a0,&a1,&thres,&qual);
370 AliDebugClass(3,Form("line=%s",line));
371 Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
373 if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
375 AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
376 detElemID,busPatchID,manuID));
380 AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d A0 %7.2f "
381 "A1 %e THRES %5d QUAL %x",
382 busPatchID,detElemID,manuID,manuChannel,a0,a1,thres,qual));
383 if ( qual == 0 ) continue;
385 AliMUONVCalibParam* gain =
386 static_cast<AliMUONVCalibParam*>(gainStore.FindObject(detElemID,manuID));
390 gain = new AliMUONCalibParamNF(5,AliMpConstants::ManuNofChannels(),detElemID,manuID,0);
393 gain->SetValueAsFloat(manuChannel,0,a0);
394 gain->SetValueAsFloat(manuChannel,1,a1);
395 gain->SetValueAsInt(manuChannel,2,thres);
396 gain->SetValueAsInt(manuChannel,3,qual);
397 gain->SetValueAsInt(manuChannel,4,kSaturation);
405 comment = Form("RUN %d",runNumber);
408 for ( Int_t i = 0; i < nDAC; ++i )
410 comment += Form(";(RUN %d = DAC %d)",runs[i],dac[i]);
412 comment += Form(";(nDAC = %d)",nDAC);
413 comment += Form(";(nInit = %d)",nInit);
414 comment += Form(";(f1nbp = %d)",f1nbp);
415 comment += Form(";(f2nbp = %d)",f2nbp);
423 //_____________________________________________________________________________
425 AliMUONTrackerIO::ReadCapacitances(const char* filename, AliMUONVStore& capaStore)
427 /// Read capacitance file
428 /// and append the read values into the given VStore
430 TString sFilename(gSystem->ExpandPathName(filename));
432 std::ifstream in(sFilename.Data());
435 return kCannotOpenFile;
438 ostringstream stream;
440 while ( in.getline(line,1024) )
441 stream << line << "\n";
445 return DecodeCapacitances(stream.str().c_str(),capaStore);
448 //_____________________________________________________________________________
450 AliMUONTrackerIO::DecodeCapacitances(const char* data, AliMUONVStore& capaStore)
452 /// Read capacitances and append the read values into the given VStore
453 /// To be used when the input is a string (for instance when getting data
459 Int_t serialNumber(-1);
460 AliMUONVCalibParam* param(0x0);
461 istringstream in(data);
463 while ( in.getline(line,1024,'\n') )
465 if ( isdigit(line[0]) )
467 serialNumber = atoi(line);
468 param = static_cast<AliMUONVCalibParam*>(capaStore.FindObject(serialNumber));
471 AliErrorClass(Form("serialNumber %d appears several times !",serialNumber));
474 param = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),serialNumber,0,1.0);
475 Bool_t ok = capaStore.Add(param);
478 AliErrorClass(Form("Could not set serialNumber=%d",serialNumber));
485 Float_t injectionGain;
486 sscanf(line,"%d %f %f",&channel,&capaValue,&injectionGain);
487 AliDebugClass(1,Form("SerialNumber %10d Channel %3d Capa %f injectionGain %f",
488 serialNumber,channel,capaValue,injectionGain));
489 param->SetValueAsFloat(channel,0,capaValue);
490 param->SetValueAsFloat(channel,1,injectionGain);
497 //_____________________________________________________________________________
499 AliMUONTrackerIO::ReadConfig(const char* filename, AliMUONVStore& confStore)
501 /// Read config file (produced by the MUONTRKda.exe program for instance)
502 /// and append the read values into the given VStore
503 /// To be used when the input is a file (for instance when reading data
506 TString sFilename(gSystem->ExpandPathName(filename));
508 std::ifstream in(sFilename.Data());
511 return kCannotOpenFile;
514 ostringstream stream;
516 while ( in.getline(line,1024) )
517 stream << line << "\n";
521 return DecodeConfig(stream.str().c_str(),confStore);
524 //_____________________________________________________________________________
526 AliMUONTrackerIO::DecodeConfig(const char* data, AliMUONVStore& confStore)
528 /// Read config data (produced by the MUONTRKda.exe program for instance)
529 /// and append the read values into the given VStore
530 /// To be used when the input is a TString (for instance when getting data
534 Int_t busPatchID, manuID;
536 istringstream in(data);
538 while ( in.getline(line,1024) )
540 AliDebugClass(3,Form("line=%s",line));
541 if ( line[0] == '#' )
545 std::istringstream sin(line);
546 sin >> busPatchID >> manuID;
548 Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
550 if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
552 AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
553 detElemID,busPatchID,manuID));
557 AliMUONVCalibParam* conf =
558 static_cast<AliMUONVCalibParam*>(confStore.FindObject(detElemID,manuID));
561 conf = new AliMUONCalibParamNF(1,1,detElemID,manuID,1);
570 //_____________________________________________________________________________
572 AliMUONTrackerIO::WriteConfig(ofstream& out, const AliMUONVStore& confStore)
574 /// Write the conf store as an ASCII file
575 /// Note that we are converting (back) the detElemId into a busPatchId
576 /// Return the number of lines written
578 if ( !AliMpDDLStore::Instance() )
580 cout << "ERROR: mapping not loaded. Cannot work" << endl;
584 TIter next(confStore.CreateIterator());
585 AliMUONVCalibParam* param;
588 while ( (param=static_cast<AliMUONVCalibParam*>(next())) )
590 Int_t detElemId = param->ID0();
591 Int_t manuId = param->ID1();
593 Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
596 out << busPatchId << " " << manuId << endl;