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 Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(busPatchId);
122 AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
124 Int_t numberOfChannelsInManu = -1;
126 if (de) numberOfChannelsInManu = de->NofChannelsInManu(manuId);
128 if ( numberOfChannelsInManu <= 0 )
130 AliErrorClass(Form("BP %5d DE %5d MANU %5d nchannels=%d",busPatchId,detElemId,manuId,numberOfChannelsInManu));
134 AliMUONVCalibParam* occupancy =
135 static_cast<AliMUONVCalibParam*>(occupancyMap.FindObject(detElemId,manuId));
138 AliErrorClass(Form("DE %5d MANU %5d is already there ?!",detElemId,manuId));
142 occupancy = new AliMUONCalibParamND(5,1,detElemId,manuId,0);
144 occupancyMap.Add(occupancy);
146 occupancy->SetValueAsDouble(0,0,sumn);
147 occupancy->SetValueAsDouble(0,1,sumn); // with only 0 and 1s, sumw = sumw2 = sumn
148 occupancy->SetValueAsDouble(0,2,sumn);
149 occupancy->SetValueAsInt(0,3,numberOfChannelsInManu);
150 occupancy->SetValueAsInt(0,4,numberOfEvents);
157 //_____________________________________________________________________________
159 AliMUONTrackerIO::ReadPedestals(const char* filename, AliMUONVStore& pedStore)
161 /// Read pedestal file (produced by the MUONTRKda.exe program for instance)
162 /// and append the read values into the given VStore
163 /// To be used when the input is a file (for instance when reading data
166 TString sFilename(gSystem->ExpandPathName(filename));
168 std::ifstream in(sFilename.Data());
171 return kCannotOpenFile;
174 ostringstream stream;
176 while ( in.getline(line,1024) )
177 stream << line << "\n";
181 return DecodePedestals(stream.str().c_str(),pedStore);
185 //_____________________________________________________________________________
187 AliMUONTrackerIO::DecodePedestals(const char* data, AliMUONVStore& pedStore)
189 /// Read pedestal Data (produced by the MUONTRKda.exe program for instance)
190 /// and append the read values into the given VStore
191 /// To be used when the input is a TString (for instance when getting data
195 Int_t busPatchID, manuID, manuChannel;
196 Float_t pedMean, pedSigma;
198 istringstream in(data);
200 while ( in.getline(line,1024) )
202 AliDebugClass(3,Form("line=%s",line));
203 if ( line[0] == '/' && line[1] == '/' ) continue;
204 std::istringstream sin(line);
205 sin >> busPatchID >> manuID >> manuChannel >> pedMean >> pedSigma;
206 Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
208 if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
210 AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
211 detElemID,busPatchID,manuID));
215 AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d MEAN %7.2f SIGMA %7.2f",
216 busPatchID,detElemID,manuID,manuChannel,pedMean,pedSigma));
218 AliMUONVCalibParam* ped =
219 static_cast<AliMUONVCalibParam*>(pedStore.FindObject(detElemID,manuID));
222 ped = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),
224 AliMUONVCalibParam::InvalidFloatValue());
227 ped->SetValueAsFloat(manuChannel,0,pedMean);
228 ped->SetValueAsFloat(manuChannel,1,pedSigma);
235 //_____________________________________________________________________________
237 AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
240 /// Read gain file (produced by the MUONTRKda.exe program for instance)
241 /// and append the read values into the given VStore
242 /// To be used when the input is a file (for instance when reading data
247 TString sFilename(gSystem->ExpandPathName(filename));
249 std::ifstream in(sFilename.Data());
252 return kCannotOpenFile;
255 ostringstream stream;
257 while ( in.getline(line,1024) )
258 stream << line << "\n";
262 return DecodeGains(stream.str().c_str(),gainStore,comment);
266 //_____________________________________________________________________________
268 AliMUONTrackerIO::DecodeGains(const char* data, AliMUONVStore& gainStore,
271 /// Read gain file (produced by the MUONTRKda.exe program for instance)
272 /// and append the read values into the given VStore
273 /// To be used when the input is a string (for instance when getting data
277 istringstream in(data);
278 Int_t busPatchID, manuID, manuChannel;
282 const Int_t kSaturation(3000); // FIXME: how to get this number ?
288 Int_t nInit(0),f1nbp(0),f2nbp(0);
290 while ( in.getline(line,1024) )
292 if ( strlen(line) < 10 ) continue;
293 if ( line[0] == '/' && line[1] == '/' )
296 if ( sline.Contains("DUMMY") )
298 AliDebugClass(1,"Got a dummy file here");
301 if ( sline.Contains("* Run") )
303 TObjArray* a = sline.Tokenize(":");
304 if ( a->GetLast() >= 1 )
306 TString s = static_cast<TObjString*>(a->At(1))->String();
307 runNumber = s.Atoi();
308 AliDebugClass(1,Form("runNumber is %d",runNumber));
311 if ( sline.Contains("* nInit =") )
313 sscanf(line,"// * nInit = %d * f1nbp = %d * f2nbp = %d",&nInit,&f1nbp,&f2nbp);
314 AliDebugClass(1,Form("nInit = %d",nInit));
315 AliDebugClass(1,Form("f1nbp = %d",f1nbp));
316 AliDebugClass(1,Form("f2nbp = %d",f2nbp));
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);
330 in.getline(line,1024);
331 // then get run and dac values
333 for ( Int_t i = 0; i < nDAC; ++i )
335 in.getline(line,1024);
337 sscanf(line,"// %d %d",&a,&b);
340 AliDebugClass(1,Form("RUN %d is DAC %d",runs[iDAC],dac[iDAC]));
346 AliErrorClass(Form("Something went wrong, as I get too big nDAC = %d",nDAC));
355 sscanf(line,"%d %d %d %f %f %d %x",&busPatchID,&manuID,&manuChannel,
356 &a0,&a1,&thres,&qual);
357 AliDebugClass(3,Form("line=%s",line));
358 Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
360 if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
362 AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
363 detElemID,busPatchID,manuID));
367 AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d A0 %7.2f "
368 "A1 %e THRES %5d QUAL %x",
369 busPatchID,detElemID,manuID,manuChannel,a0,a1,thres,qual));
370 if ( qual == 0 ) continue;
372 AliMUONVCalibParam* gain =
373 static_cast<AliMUONVCalibParam*>(gainStore.FindObject(detElemID,manuID));
377 gain = new AliMUONCalibParamNF(5,AliMpConstants::ManuNofChannels(),detElemID,manuID,0);
380 gain->SetValueAsFloat(manuChannel,0,a0);
381 gain->SetValueAsFloat(manuChannel,1,a1);
382 gain->SetValueAsInt(manuChannel,2,thres);
383 gain->SetValueAsInt(manuChannel,3,qual);
384 gain->SetValueAsInt(manuChannel,4,kSaturation);
392 comment = Form("RUN %d",runNumber);
395 for ( Int_t i = 0; i < nDAC; ++i )
397 comment += Form(";(RUN %d = DAC %d)",runs[i],dac[i]);
399 comment += Form(";(nDAC = %d)",nDAC);
400 comment += Form(";(nInit = %d)",nInit);
401 comment += Form(";(f1nbp = %d)",f1nbp);
402 comment += Form(";(f2nbp = %d)",f2nbp);
410 //_____________________________________________________________________________
412 AliMUONTrackerIO::ReadCapacitances(const char* filename, AliMUONVStore& capaStore)
414 /// Read capacitance file
415 /// and append the read values into the given VStore
417 TString sFilename(gSystem->ExpandPathName(filename));
419 std::ifstream in(sFilename.Data());
422 return kCannotOpenFile;
425 ostringstream stream;
427 while ( in.getline(line,1024) )
428 stream << line << "\n";
432 return DecodeCapacitances(stream.str().c_str(),capaStore);
435 //_____________________________________________________________________________
437 AliMUONTrackerIO::DecodeCapacitances(const char* data, AliMUONVStore& capaStore)
439 /// Read capacitances and append the read values into the given VStore
440 /// To be used when the input is a string (for instance when getting data
446 Int_t serialNumber(-1);
447 AliMUONVCalibParam* param(0x0);
448 istringstream in(data);
450 while ( in.getline(line,1024,'\n') )
452 if ( isdigit(line[0]) )
454 serialNumber = atoi(line);
455 param = static_cast<AliMUONVCalibParam*>(capaStore.FindObject(serialNumber));
458 AliErrorClass(Form("serialNumber %d appears several times !",serialNumber));
461 param = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),serialNumber,0,1.0);
462 Bool_t ok = capaStore.Add(param);
465 AliErrorClass(Form("Could not set serialNumber=%d",serialNumber));
472 Float_t injectionGain;
473 sscanf(line,"%d %f %f",&channel,&capaValue,&injectionGain);
474 AliDebugClass(1,Form("SerialNumber %10d Channel %3d Capa %f injectionGain %f",
475 serialNumber,channel,capaValue,injectionGain));
476 param->SetValueAsFloat(channel,0,capaValue);
477 param->SetValueAsFloat(channel,1,injectionGain);
484 //_____________________________________________________________________________
486 AliMUONTrackerIO::ReadConfig(const char* filename, AliMUONVStore& confStore, Bool_t& changed)
488 /// Read config file (produced by the MUONTRKda.exe program for instance)
489 /// and append the read values into the given VStore
490 /// To be used when the input is a file (for instance when reading data
492 /// changed must be set to kFALSE before calling this method for the first time
493 /// (then the subsequent calls must not set it !)
496 TString sFilename(gSystem->ExpandPathName(filename));
498 std::ifstream in(sFilename.Data());
501 return kCannotOpenFile;
504 ostringstream stream;
506 while ( in.getline(line,1024) )
507 stream << line << "\n";
511 return DecodeConfig(stream.str().c_str(),confStore,changed);
514 //_____________________________________________________________________________
516 AliMUONTrackerIO::DecodeConfig(const char* data, AliMUONVStore& confStore, Bool_t& changed)
518 /// Read config data (produced by the MUONTRKda.exe program for instance)
519 /// and append the read values into the given VStore
520 /// To be used when the input is a TString (for instance when getting data
522 /// changed must be set to kFALSE before calling this method for the first time
523 /// (then the subsequent calls must not set it !)
526 Int_t busPatchID, manuID;
528 istringstream in(data);
530 while ( in.getline(line,1024) )
532 AliDebugClass(3,Form("line=%s",line));
533 if ( line[0] == '#' )
537 if (sline.Contains("CHANGED") && !sline.Contains("UNCHANGED")) changed = kTRUE;
540 std::istringstream sin(line);
541 sin >> busPatchID >> manuID;
543 Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
545 if ( !AliMpDEManager::IsValidDetElemId(detElemID) )
547 AliErrorClass(Form("Got an invalid DE = %d from busPatchId=%d manuId=%d",
548 detElemID,busPatchID,manuID));
552 AliMUONVCalibParam* conf =
553 static_cast<AliMUONVCalibParam*>(confStore.FindObject(detElemID,manuID));
556 conf = new AliMUONCalibParamNF(1,1,detElemID,manuID,1);
565 //_____________________________________________________________________________
567 AliMUONTrackerIO::WriteConfig(ofstream& out, const AliMUONVStore& confStore)
569 /// Write the conf store as an ASCII file
570 /// Note that we are converting (back) the detElemId into a busPatchId
571 /// Return the number of lines written
573 if ( !AliMpDDLStore::Instance() )
575 cout << "ERROR: mapping not loaded. Cannot work" << endl;
579 TIter next(confStore.CreateIterator());
580 AliMUONVCalibParam* param;
583 while ( (param=static_cast<AliMUONVCalibParam*>(next())) )
585 Int_t detElemId = param->ID0();
586 Int_t manuId = param->ID1();
588 Int_t busPatchId = AliMpDDLStore::Instance()->GetBusPatchId(detElemId,manuId);
591 out << busPatchId << " " << manuId << endl;