AliMUONTrackerIO:
authorivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 25 Feb 2008 17:24:06 +0000 (17:24 +0000)
committerivana <ivana@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 25 Feb 2008 17:24:06 +0000 (17:24 +0000)
        New class to read all MUON tracker calibration ASCII files
        (e.g. the ones from the DA)
(Laurent)

AliMUONPedestalSubprocessor
AliMUONGainSubprocessor
        Forward the reading of ASCII file to the new class AliMUONTrackerIO.
        Note the format change of gain files, and the corresponding change
        in behaviour of the gain subprocessor (we will no longer fail for
        DAC values where the DA did not produce the gain file).
(Laurent)

MUONTRKda.cxx
       Store dummy files in FES (to prevent shuttle failure)
(Jean-Luc)

MUON/AliMUONGainSubprocessor.cxx
MUON/AliMUONGainSubprocessor.h
MUON/AliMUONPedestalSubprocessor.cxx
MUON/AliMUONTrackerIO.cxx [new file with mode: 0644]
MUON/AliMUONTrackerIO.h [new file with mode: 0644]
MUON/MUONTRKda.cxx
MUON/MUONcalibLinkDef.h
MUON/libMUONcalib.pkg

index a490f7f..fd70f4b 100644 (file)
@@ -24,6 +24,7 @@
 #include "AliMUONCalibParamNF.h"
 #include "AliMUONConstants.h"
 #include "AliMUONPreprocessor.h"
+#include "AliMUONTrackerIO.h"
 #include "AliMpConstants.h"
 #include "AliMpDDLStore.h"
 #include <Riostream.h>
@@ -59,7 +60,9 @@ AliMUONGainSubprocessor::AliMUONGainSubprocessor(AliMUONPreprocessor* master)
 : AliMUONVSubprocessor(master,
                        "Gains",
                        "Upload MUON Tracker Gains to OCDB"),
-fGains(0x0)
+fGains(0x0),
+fSkip(kFALSE),
+fComment("")
 {
   /// default ctor
 }
@@ -80,6 +83,9 @@ AliMUONGainSubprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
   const Int_t kSystem = AliMUONPreprocessor::kDAQ;
   const char* kId = "GAINS";
   
+  fComment = "";
+  fSkip = kFALSE;
+  
   delete fGains;
   fGains = new AliMUON2DMap(kTRUE);
   
@@ -95,22 +101,31 @@ AliMUONGainSubprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endTime)
   {
     TString fileName(Master()->GetFile(kSystem,kId,o->GetName()));
     Int_t ok = ReadFile(fileName.Data());
-    if (!ok)
+    if (ok>0)
     {
-      Master()->Log(Form("Could not read file %s",fileName.Data()));
+      n += ok;
     }
-    else
+    else if ( ok == AliMUONTrackerIO::kDummyFile )
     {
-      n += ok;
+      // not an interesting file.
+      fSkip = kTRUE;
+      break;
     }
   }
   
-  if (!n)
+  if ( fSkip ) 
+  {
+    delete fGains;
+    fGains = 0x0;
+  }
+  
+  if (!n && !fSkip)
   {
     Master()->Log("Failed to read any Gains");
     delete fGains;
-    fGains = 0;
+    fGains = 0x0;
   }
+  
   delete sources;
 }
 
@@ -123,8 +138,15 @@ AliMUONGainSubprocessor::Process(TMap* /*dcsAliasMap*/)
   if (!fGains) 
   {
     // this is the only reason to fail for the moment : getting no Gain
-    // at all.
-    return 1;
+    // at all, except if the input file was a dummy one
+    if ( fSkip ) 
+    {
+      return 0;
+    }
+    else
+    {
+      return 1;
+    }
   }
     
   AliMUON2DStoreValidator validator;
@@ -176,55 +198,27 @@ AliMUONGainSubprocessor::ReadFile(const char* filename)
   ///                                                                         
   /// Return kFALSE if reading was not successfull.                           
   ///
-  
+
   TString sFilename(gSystem->ExpandPathName(filename));
   
   Master()->Log(Form("Reading %s",sFilename.Data()));
-  
-  std::ifstream in(sFilename.Data());
-  if (!in.good()) 
+    
+  Int_t n = AliMUONTrackerIO::ReadGains(sFilename.Data(),*fGains,fComment);
+
+  switch (n)
   {
-    return 0;
+    case AliMUONTrackerIO::kCannotOpenFile:
+      Master()->Log(Form("Could not open %s",sFilename.Data()));
+      break;
+    case AliMUONTrackerIO::kFormatError:
+      Master()->Log(Form("File %s is not of the expected format",sFilename.Data()));
+      break;
+    case AliMUONTrackerIO::kDummyFile:
+      Master()->Log(Form("File %s is a dummy one. That's fine. I won't do anything then ;-)",sFilename.Data()));
+      break;
+    default:
+      break;
   }
-  char line[1024];
-  Int_t busPatchID, manuID, manuChannel;
-  Float_t a0, a1;
-  Int_t thres;
-  UInt_t qual;
-  const Int_t kSaturation(3000); // FIXME: how to get this number ?
-  
-  static const Int_t kNchannels(AliMpConstants::ManuNofChannels());
-  Int_t n(0);
   
-  while ( in.getline(line,1024) )
-  {
-    if ( strlen(line) < 10 ) continue;
-    if ( line[0] == '/' && line[1] == '/' ) continue;
-
-    sscanf(line,"%d %d %d %f %f %d %x",&busPatchID,&manuID,&manuChannel,
-           &a0,&a1,&thres,&qual); 
-    AliDebug(3,Form("line=%s",line));
-    Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
-    AliDebug(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d A0 %7.2f "
-                    "A1 %e THRES %5d QUAL %x",
-                    busPatchID,detElemID,manuID,manuChannel,a0,a1,thres,qual));
-    if ( qual == 0 ) continue;
-    
-    AliMUONVCalibParam* gain = 
-      static_cast<AliMUONVCalibParam*>(fGains->FindObject(detElemID,manuID));
-    
-    if (!gain) 
-    {
-      gain = new AliMUONCalibParamNF(5,kNchannels,detElemID,manuID,0);
-      fGains->Add(gain);
-    }
-    gain->SetValueAsFloat(manuChannel,0,a0);
-    gain->SetValueAsFloat(manuChannel,1,a1);
-    gain->SetValueAsInt(manuChannel,2,thres);
-    gain->SetValueAsInt(manuChannel,3,qual);
-    gain->SetValueAsInt(manuChannel,4,kSaturation);
-    ++n;
-  }
-  in.close();
   return n;
 }
index 6ac7376..11b5bb7 100644 (file)
 #  include "AliMUONVSubprocessor.h"
 #endif
 
+#ifndef ROOT_TString
+#  include "TString.h"
+#endif
+
 class AliMUONVStore;
 class TObjArray;
 
@@ -38,8 +42,10 @@ private:
 
 private:
   AliMUONVStore* fGains; //!< Gains for the MUON TRK
+  Bool_t fSkip; //!< whether we should skip this run (because it's dummy)
+  TString fComment; //<! comment for OCDB entry
   
-  ClassDef(AliMUONGainSubprocessor,1) // A shuttle preprocessor for MUON TRK gains
+  ClassDef(AliMUONGainSubprocessor,2) // A shuttle preprocessor for MUON TRK gains
 };
 
 #endif
index c9cb2a7..3157ac4 100644 (file)
@@ -23,6 +23,7 @@
 #include "AliMUON2DStoreValidator.h"
 #include "AliMUONCalibParamNF.h"
 #include "AliMUONPreprocessor.h"
+#include "AliMUONTrackerIO.h"
 #include "AliMpConstants.h"
 #include "AliMpDDLStore.h"
 #include "TObjString.h"
@@ -90,11 +91,7 @@ AliMUONPedestalSubprocessor::Initialize(Int_t run, UInt_t startTime, UInt_t endT
   {
     TString fileName(Master()->GetFile(kSystem,kId,o->GetName()));
     Int_t ok = ReadFile(fileName.Data());
-    if (!ok)
-    {
-      Master()->Log(Form("Could not read file %s",fileName.Data()));
-    }
-    else
+    if (ok>0)
     {
       n += ok;
     }
@@ -176,45 +173,14 @@ AliMUONPedestalSubprocessor::ReadFile(const char* filename)
   
   Master()->Log(Form("Reading %s",sFilename.Data()));
   
-  std::ifstream in(sFilename.Data());
-  if (!in.good()) 
-  {
-    Master()->Log(Form("Could not open %s",sFilename.Data()));
-    return 0;
-  }
-  char line[1024];
-  Int_t busPatchID, manuID, manuChannel;
-  Float_t pedMean, pedSigma;
-  static const Int_t kNchannels(AliMpConstants::ManuNofChannels());
-  Int_t n(0);
+  Int_t n = AliMUONTrackerIO::ReadPedestals(sFilename.Data(),*fPedestals);
   
-  while ( in.getline(line,1024) )
+  switch (n)
   {
-    AliDebug(3,Form("line=%s",line));
-    if ( line[0] == '/' && line[1] == '/' ) continue;
-    std::istringstream sin(line);
-    sin >> busPatchID >> manuID >> manuChannel >> pedMean >> pedSigma;
-    Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
-    AliDebug(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d MEAN %7.2f SIGMA %7.2f",
-             busPatchID,detElemID,manuID,manuChannel,pedMean,pedSigma));
-    
-    AliMUONVCalibParam* ped = 
-      static_cast<AliMUONVCalibParam*>(fPedestals->FindObject(detElemID,manuID));
-    
-    if (!ped) 
-    {
-      ped = new AliMUONCalibParamNF(2,kNchannels,
-                                    detElemID,manuID,
-                                    AliMUONVCalibParam::InvalidFloatValue());  
-      fPedestals->Add(ped);
-    }
-    ped->SetValueAsFloat(manuChannel,0,pedMean);
-    ped->SetValueAsFloat(manuChannel,1,pedSigma);
-    ++n;
+    case -1:
+      Master()->Log(Form("Could not open %s",sFilename.Data()));
+      break;
   }
-  in.close();
-  
-  Master()->Log("File closed");
   
   return n;
 }
diff --git a/MUON/AliMUONTrackerIO.cxx b/MUON/AliMUONTrackerIO.cxx
new file mode 100644 (file)
index 0000000..e7de71c
--- /dev/null
@@ -0,0 +1,289 @@
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+
+// $Id$
+
+#include "AliMUONTrackerIO.h"
+
+/// \class AliMUONTrackerIO
+///
+/// Reader class for ASCII calibration files for MUON tracker : 
+/// converts those ASCII files into AliMUONVStore (suitable to e.g. feed
+/// the OCDB).
+///
+/// \author Laurent Aphecetche, Subatech
+
+/// \cond CLASSIMP
+ClassImp(AliMUONTrackerIO)
+/// \endcond
+
+#include "AliLog.h"
+#include "AliMUONCalibParamNF.h"
+#include "AliMUONVStore.h"
+#include "AliMpConstants.h"
+#include "AliMpDDLStore.h"
+#include <Riostream.h>
+#include <TClass.h>
+#include <TObjString.h>
+#include <TSystem.h>
+#include <sstream>
+
+//_____________________________________________________________________________
+AliMUONTrackerIO::AliMUONTrackerIO()
+{
+  /// ctor
+}
+
+//_____________________________________________________________________________
+AliMUONTrackerIO::~AliMUONTrackerIO()
+{
+  /// dtor
+}
+
+//_____________________________________________________________________________
+Int_t 
+AliMUONTrackerIO::ReadPedestals(const char* filename, AliMUONVStore& pedStore)
+{
+  /// Read pedestal file (produced by the MUONTRKda.exe program for instance)
+  /// and append the read values into the given VStore
+  
+  TString sFilename(gSystem->ExpandPathName(filename));
+  
+  std::ifstream in(sFilename.Data());
+  if (!in.good()) 
+  {
+    return kCannotOpenFile;
+  }
+  
+  char line[1024];
+  Int_t busPatchID, manuID, manuChannel;
+  Float_t pedMean, pedSigma;
+  Int_t n(0);
+  
+  while ( in.getline(line,1024) )
+  {
+    AliDebugClass(3,Form("line=%s",line));
+    if ( line[0] == '/' && line[1] == '/' ) continue;
+    std::istringstream sin(line);
+    sin >> busPatchID >> manuID >> manuChannel >> pedMean >> pedSigma;
+    Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
+    AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d MEAN %7.2f SIGMA %7.2f",
+                    busPatchID,detElemID,manuID,manuChannel,pedMean,pedSigma));
+    
+    AliMUONVCalibParam* ped = 
+      static_cast<AliMUONVCalibParam*>(pedStore.FindObject(detElemID,manuID));
+    
+    if (!ped) 
+    {
+      ped = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),
+                                    detElemID,manuID,
+                                    AliMUONVCalibParam::InvalidFloatValue());  
+      pedStore.Add(ped);
+    }
+    ped->SetValueAsFloat(manuChannel,0,pedMean);
+    ped->SetValueAsFloat(manuChannel,1,pedSigma);
+    ++n;
+  }
+  
+  in.close();
+
+  return n;
+}
+
+//_____________________________________________________________________________
+Int_t 
+AliMUONTrackerIO::ReadGains(const char* filename, AliMUONVStore& gainStore,
+                            TString& comment)
+{
+  /// Read gain file (produced by the MUONTRKda.exe program for instance)
+  /// and append the read values into the given VStore
+  
+  comment = "";
+  
+  TString sFilename(gSystem->ExpandPathName(filename));
+  
+  std::ifstream in(sFilename.Data());
+  if (!in.good()) 
+  {
+    return kCannotOpenFile;
+  }
+  
+  char line[1024];
+  Int_t busPatchID, manuID, manuChannel;
+  Float_t a0, a1;
+  Int_t thres;
+  UInt_t qual;
+  const Int_t kSaturation(3000); // FIXME: how to get this number ?
+  Int_t n(0);
+  Int_t runNumber(-1);
+  Int_t* runs(0x0);
+  Int_t* dac(0x0);
+  Int_t nDAC(0);
+  Int_t iDAC(0);
+  
+  while ( in.getline(line,1024) )
+  {
+    if ( strlen(line) < 10 ) continue;
+    if ( line[0] == '/' && line[1] == '/' ) 
+    {
+      TString sline(line);
+      if ( sline.Contains("DUMMY") )
+      {
+        AliDebugClass(1,"Got a dummy file here");
+        return kDummyFile;
+      }
+      if ( sline.Contains("* Run") )
+      {
+        TObjArray* a = sline.Tokenize(":");
+        if ( a->GetLast() >= 1 ) 
+        {
+          TString s = static_cast<TObjString*>(a->At(1))->String();
+          runNumber = s.Atoi();
+          AliDebugClass(1,Form("runNumber is %d",runNumber));
+        }            
+      }
+      if ( sline.Contains("DAC values") )
+      {
+        nDAC = TString(sline(2,sline.Length()-2)).Atoi();
+        AliDebugClass(1,Form("# of DAC values = %d",nDAC));
+        if ( nDAC > 0 )
+        {
+          if ( nDAC < 100 ) 
+          {
+            runs = new Int_t[nDAC];
+            dac = new Int_t[nDAC];
+            // skip two lines
+            in.getline(line,1024);
+            in.getline(line,1024);
+            // then get run and dac values
+            for ( Int_t i = 0; i < nDAC; ++i ) 
+            {
+              in.getline(line,1024);
+              Int_t a,b;
+              sscanf(line,"// %d %d",&a,&b);
+              runs[iDAC] = a;
+              dac[iDAC] = b;
+              AliDebugClass(1,Form("RUN %d is DAC %d",runs[iDAC],dac[iDAC]));
+              ++iDAC;
+            }
+          }
+          else
+          {
+            AliErrorClass(Form("Something went wrong, as I get too big nDAC = %d",nDAC));
+            nDAC = 0;
+            return kFormatError;
+          }
+        }
+      }
+      continue;
+    }
+    
+    sscanf(line,"%d %d %d %f %f %d %x",&busPatchID,&manuID,&manuChannel,
+           &a0,&a1,&thres,&qual); 
+    AliDebugClass(3,Form("line=%s",line));
+    Int_t detElemID = AliMpDDLStore::Instance()->GetDEfromBus(busPatchID);
+    AliDebugClass(3,Form("BUSPATCH %3d DETELEMID %4d MANU %3d CH %3d A0 %7.2f "
+                    "A1 %e THRES %5d QUAL %x",
+                    busPatchID,detElemID,manuID,manuChannel,a0,a1,thres,qual));
+    if ( qual == 0 ) continue;
+    
+    AliMUONVCalibParam* gain = 
+      static_cast<AliMUONVCalibParam*>(gainStore.FindObject(detElemID,manuID));
+    
+    if (!gain) 
+    {
+      gain = new AliMUONCalibParamNF(5,AliMpConstants::ManuNofChannels(),detElemID,manuID,0);
+      gainStore.Add(gain);
+    }
+    gain->SetValueAsFloat(manuChannel,0,a0);
+    gain->SetValueAsFloat(manuChannel,1,a1);
+    gain->SetValueAsInt(manuChannel,2,thres);
+    gain->SetValueAsInt(manuChannel,3,qual);
+    gain->SetValueAsInt(manuChannel,4,kSaturation);
+    ++n;
+  }
+  
+  in.close();
+  
+  comment = "";
+  
+  if ( runNumber > 0 )
+  {
+    comment = Form("RUN %d",runNumber);
+  }
+  
+  for ( Int_t i = 0; i < nDAC; ++i )
+  {
+    comment += Form(";(RUN %d = DAC %d)",runs[i],dac[i]);
+  }
+  
+  delete[] runs;
+  delete[] dac;
+  
+  return n;
+}
+
+//_____________________________________________________________________________
+Int_t
+AliMUONTrackerIO::ReadCapacitances(const char* file, AliMUONVStore& capaStore)
+{
+  /// Read capacitance file
+  /// and append the read values into the given VStore
+  
+  ifstream in(gSystem->ExpandPathName(file));
+  if (in.bad()) return kCannotOpenFile;
+  
+  Int_t ngenerated(0);
+  
+  char line[1024];
+  Int_t serialNumber(-1);
+  AliMUONVCalibParam* param(0x0);
+  
+  while ( in.getline(line,1024,'\n') )
+  {
+    if ( isdigit(line[0]) ) 
+    {
+      serialNumber = atoi(line);
+      param = static_cast<AliMUONVCalibParam*>(capaStore.FindObject(serialNumber));
+      if (param)
+      {
+        AliErrorClass(Form("serialNumber %d appears several times !",serialNumber));
+        capaStore.Clear();
+        break;
+      }
+      param = new AliMUONCalibParamNF(2,AliMpConstants::ManuNofChannels(),serialNumber,0,1.0);
+      Bool_t ok = capaStore.Add(param);
+      if (!ok)
+      {
+        AliErrorClass(Form("Could not set serialNumber=%d",serialNumber));
+        continue;
+      }      
+      continue;
+    }
+    Int_t channel;
+    Float_t capaValue;
+    Float_t injectionGain;
+    sscanf(line,"%d %f %f",&channel,&capaValue,&injectionGain);
+    AliDebugClass(1,Form("SerialNumber %10d Channel %3d Capa %f injectionGain %f",
+                    serialNumber,channel,capaValue,injectionGain));
+    param->SetValueAsFloat(channel,0,capaValue);
+    param->SetValueAsFloat(channel,1,injectionGain);
+    ++ngenerated;
+  }
+  
+  in.close();
+  
+  return ngenerated;
+}
diff --git a/MUON/AliMUONTrackerIO.h b/MUON/AliMUONTrackerIO.h
new file mode 100644 (file)
index 0000000..c545bd3
--- /dev/null
@@ -0,0 +1,44 @@
+#ifndef ALIMUONTRACKERIO_H
+#define ALIMUONTRACKERIO_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+* See cxx source for full Copyright notice                               */
+
+// $Id$
+
+/// \ingroup calib
+/// \class AliMUONTrackerIO
+/// \brief Converts ASCII calibration files (ped, gains, capa) into AliMUONVStore object
+/// 
+// Author Laurent Aphecetche, Subatech
+
+#ifndef ROOT_TObject
+#  include "TObject.h"
+#endif
+
+class AliMUONVStore;
+class TString;
+
+class AliMUONTrackerIO : public TObject
+{
+public:
+  AliMUONTrackerIO();
+  virtual ~AliMUONTrackerIO();
+
+  static Int_t ReadPedestals(const char* filename, AliMUONVStore& pedStore);
+  
+  static Int_t ReadGains(const char* filename, AliMUONVStore& gainStore, TString& comment);
+  
+  static Int_t ReadCapacitances(const char* filename, AliMUONVStore& capaStore);
+  
+  enum ErrorCode
+  {
+    kCannotOpenFile = -1, /// cannot open given file
+    kDummyFile = -2, /// file is a dummy one (e.g. some intermediate gain files from the DA)
+    kFormatError = -3 /// file is not of the expected format
+  };
+  
+  ClassDef(AliMUONTrackerIO,1) // Calibration ASCII file reader for MUON tracker
+};
+
+#endif
index 4c8e2c6..b78bb27 100644 (file)
 
 /* $Id$ */
 
-/*-------------------------------------------------------------------------------
-/* 14/12/07 New version: MUONTRKda.cxx,v 1.10
-/*-------------------------------------------------------------------------------
+/*
+-------------------------------------------------------------------------
+   2008-02-22 New version: MUONTRKda.cxx,v 1.11
+-------------------------------------------------------------------------
 
 Version for MUONTRKda MUON tracking
 (A. Baldisseri, J.-L. Charvet & Ch. Finck)
@@ -89,18 +90,22 @@ TH1F*  gPedMeanHisto  = 0x0;
 TH1F*  gPedSigmaHisto = 0x0;
 Char_t gHistoFileName[256];
 
-// used by makegain 
-Char_t gHistoFileName_gain[256]="MUONTRKda_gain_data.root";
+// used for computing gain parameters 
+Int_t nbpf1 = 6; // linear fit over nbf1 points
+
+//Char_t gHistoFileName_gain[256]="MUONTRKda_gain_data.root";
+Char_t gHistoFileName_gain[256]="MUONTRKda_gain.data";
 Char_t gRootFileName[256];
 Char_t gOutFolder[256]=".";
 Char_t filename[256];
 Char_t filenam[256]="MUONTRKda_gain"; 
-Char_t flatFile[256];
+Char_t flatFile[256]="";
 
-ofstream filcout;
+//ofstream filcout;
 
 TString flatOutputFile;
 TString logOutputFile;
+TString logOutputFile_comp;
 TString gCommand("ped");
 TTimeStamp date;
 
@@ -285,10 +290,38 @@ void MakePedStoreForGain(Int_t injCharge)
 
     TTree* tree = 0x0;
 
-    // compute and store pedestals
-    sprintf(flatFile,"%s/%s_%d_DAC_%d.ped",gOutFolder,filenam,gRunNumber,injCharge);
-    cout << "\nMUONTRKda : Flat file  generated             : " << flatFile << "\n";
-    MakePedStore(flatFile);
+    FILE *pfilew=0;
+    if (gCommand.Contains("gain") && !gCommand.Contains("comp")) {
+      if(flatOutputFile.IsNull())
+       {
+         sprintf(filename,"%s_%d_DAC_%d.par",filenam,gRunNumber,injCharge);
+         flatOutputFile=filename;
+       }
+      if(!flatOutputFile.IsNull())
+       {
+         pfilew = fopen (flatOutputFile.Data(),"w");
+
+         fprintf(pfilew,"//DUMMY FILE (to prevent Shuttle failure)\n");
+         fprintf(pfilew,"//================================================\n");
+         fprintf(pfilew,"//       MUONTRKda: Calibration run  \n");
+         fprintf(pfilew,"//=================================================\n");
+         fprintf(pfilew,"//   * Run           : %d \n",gRunNumber); 
+         fprintf(pfilew,"//   * Date          : %s \n",date.AsString("l"));
+         fprintf(pfilew,"//   * DAC           : %d \n",injCharge);
+         fprintf(pfilew,"//-------------------------------------------------\n");
+         fclose(pfilew);
+       }
+    }
+
+    if(gPrintLevel>=2)
+      {
+        // compute and store pedestals
+       sprintf(flatFile,"%s/%s_%d_DAC_%d.ped",gOutFolder,filenam,gRunNumber,injCharge);
+       cout << "\nMUONTRKda : Flat file  generated             : " << flatFile << "\n";
+       MakePedStore(flatFile);
+      }
+    else
+      MakePedStore();
     
     TString mode("UPDATE");
 
@@ -326,11 +359,17 @@ void MakePedStoreForGain(Int_t injCharge)
 // void MakeGainStore(TString flatOutputFile)
 void MakeGainStore()
 {
+    ofstream filcouc;
+
     Double_t goodA1Min =  0.5;
     Double_t goodA1Max =  2.;
+//     Double_t goodA1Min =  0.7;
+//     Double_t goodA1Max =  1.7;
     Double_t goodA2Min = -0.5E-03;
     Double_t goodA2Max =  1.E-03;
 
+    Int_t num_RUN[15],val_DAC[15];
+
     // open file mutrkgain.root
     // read again the pedestal for the calibration runs (9 runs ?)
     // need the injection charge from config file (to be done)
@@ -356,9 +395,12 @@ void MakeGainStore()
       tree->SetBranchAddress("ped",&map[i]);
       tree->SetBranchAddress("run",&run[i]);
       tree->GetEvent(i);
-//       std::cout << map[i] << " " << run[i] << std::endl;
+//        std::cout << map[i] << " " << run[i] << std::endl;
     }
-    gRunNumber=(UInt_t)run[0]->GetFirst();
+//jlc_feb_08  modif:   gRunNumber=(UInt_t)run[0]->GetFirst();
+      gRunNumber=(UInt_t)run[nEntries-1]->GetFirst();
+//     sscanf(getenv("DATE_RUN_NUMBER"),"%d",&gRunNumber);
+
 
     // some print
     cout<<"\n ********  MUONTRKda for Gain computing (Run = " << gRunNumber << ")\n" << endl;
@@ -366,6 +408,8 @@ void MakeGainStore()
     cout << " Entries = " << nEntries << " DAC values \n" << endl; 
     for (Int_t i = 0; i < nEntries; ++i) {
       cout<< " Run = " << (Double_t)run[i]->GetFirst() << "    DAC = " << (Double_t)run[i]->GetSecond() << endl;
+      num_RUN[i]=(Double_t)run[i]->GetFirst();
+      val_DAC[i]=(Double_t)run[i]->GetSecond();
     }
     cout << "" << endl;
 
@@ -375,17 +419,16 @@ void MakeGainStore()
     Double_t injCharge[11];
     Double_t injChargeErr[11];
 
-// full print out 
+    // full print out 
 
     sprintf(filename,"%s/%s_%d.log",gOutFolder,filenam,gRunNumber);
-    logOutputFile=filename;
-
-    filcout.open(logOutputFile.Data());
-    filcout<<"//====================================================" << endl;
-    filcout<<"//        MUONTRKda for Gain computing (Run = " << gRunNumber << ")" << endl;
-    filcout<<"//====================================================" << endl;
-    filcout<<"//   * Date          : " << date.AsString("l") << "\n" << endl;
+    logOutputFile_comp=filename;
 
+    filcouc.open(logOutputFile_comp.Data());
+    filcouc<<"//====================================================" << endl;
+    filcouc<<"//        MUONTRKda for Gain computing (Run = " << gRunNumber << ")" << endl;
+    filcouc<<"//====================================================" << endl;
+    filcouc<<"//   * Date          : " << date.AsString("l") << "\n" << endl;
 
 
 
@@ -428,7 +471,7 @@ void MakeGainStore()
     {
       pfilew = fopen (flatOutputFile.Data(),"w");
 
-      fprintf(pfilew,"//=================================================\n");
+      fprintf(pfilew,"//================================================\n");
       fprintf(pfilew,"//  Calibration file calculated by MUONTRKda \n");
       fprintf(pfilew,"//=================================================\n");
       fprintf(pfilew,"//   * Run           : %d \n",gRunNumber); 
@@ -437,6 +480,13 @@ void MakeGainStore()
       fprintf(pfilew,"//   * # of MANUS    : %d \n",gNManu);
       fprintf(pfilew,"//   * # of channels : %d \n",gNChannel);
       fprintf(pfilew,"//-------------------------------------------------\n");
+      fprintf(pfilew,"//   %d DAC values \n",nEntries);
+      fprintf(pfilew,"//   RUN     DAC   \n");
+      fprintf(pfilew,"//-----------------\n");
+      for (Int_t i = 0; i < nEntries; ++i) {
+      tree->SetBranchAddress("run",&run[i]);
+       fprintf(pfilew,"//   %d    %d \n",num_RUN[i],val_DAC[i]);
+      }
       fprintf(pfilew,"//=======================================\n");
       fprintf(pfilew,"// BP MANU CH.   a1      a2     thres. Q\n");
       fprintf(pfilew,"//=======================================\n");
@@ -470,7 +520,7 @@ void MakeGainStore()
     Double_t chi2P2  = 0.;
     Double_t prChi2  = 0; 
     Double_t prChi2P2 =0;
-    Double_t a0,a1,a2;
+    Double_t a0=0.,a1=1.,a2=0.;
     Int_t busPatchId ;
     Int_t manuId     ;
     Int_t channelId ;
@@ -582,7 +632,8 @@ void MakeGainStore()
 
        Int_t nInit = 1;
        Int_t nbs   = nEntries - nInit;
-       Int_t nbpf1 = 6; // linear fit over nbf1 points
+//     Int_t nbpf1 = 6; // define as global variable
+       if(nbs < nbpf1)nbpf1=nbs;
 
        for (Int_t j = 0; j < nbs; ++j)
        {
@@ -650,16 +701,16 @@ void MakeGainStore()
              // ------------- print out in log file
 //       if (busPatchId == 6 && manuId == 116 && ( channelId >= 17 && channelId <= 20) ) 
 //         {
-//           filcout << " \n ********! Print_out.: BP= " << busPatchId << " Manu_Id= " << manuId 
+//           filcouc << " \n ********! Print_out.: BP= " << busPatchId << " Manu_Id= " << manuId 
 //                     << " Ch.= " << channelId << ":" << endl;
 
 //           for (Int_t j = 0; j < nbpf1; ++j)
-//             {filcout << j << " " << x[j] << " " << xErr[j] << " " << y[j] << " " << yErr[j] << endl;}
-//           filcout << "  a0,a1 = " << a0 << " , " << a1 << " pr_chi2 = " <<  prChi2 << endl ;
+//             {filcouc << j << " " << x[j] << " " << xErr[j] << " " << y[j] << " " << yErr[j] << endl;}
+//           filcouc << "  a0,a1 = " << a0 << " , " << a1 << " pr_chi2 = " <<  prChi2 << endl ;
 
 //           for (Int_t j = 0; j < nbpf2; ++j)
-//             {filcout << j << " " << xp[j] << " " << xpErr[j] << " " << yp[j] << " " << ypErr[j] << endl;}
-//           filcout << "  a2 = " << par[0] << " pr_chi2_2 = " <<  prChi2P2 << endl;
+//             {filcouc << j << " " << xp[j] << " " << xpErr[j] << " " << yp[j] << " " << ypErr[j] << endl;}
+//           filcouc << "  a2 = " << par[0] << " pr_chi2_2 = " <<  prChi2P2 << endl;
              
 //         }
        // ------------------------------------------
@@ -668,14 +719,15 @@ void MakeGainStore()
 
          a2 = par[0];
 
+//       delete graphErr;
+
+       }
+
          par[0] = a0;
          par[1] = a1;
          par[2] = a2;
          par[3] = xLim;
 
-//       delete graphErr;
-
-       }
 
        // Prints
 
@@ -760,11 +812,13 @@ void MakeGainStore()
        // Plots
 
        if(gPlotLevel){
-         if(Q==0  and  nplot < 100)
+//       if(Q==0  and  nplot < 100)
 //       if(p1>1 && p2==0  and  nplot < 100)
 //       if(p1>1 && p2>1  and  nplot < 100)
+         if(p1>=1 and p1<=2  and  nplot < 100)
            {
              nplot++;
+//           cout << " nplot = " << nplot << endl;
              TF1 *f2Calib = new TF1("f2Calib",funcCalib,0.,gkADCMax,NFITPARAMS);
 
              TGraphErrors *graphErr = new TGraphErrors(nEntries,pedMean,injCharge,pedSigma,injChargeErr);
@@ -802,22 +856,27 @@ void MakeGainStore()
     //OutPut
     if (gPrintLevel) 
     {
-      filcout << "\n List of problematic BusPatch and Manu " << endl;
-      filcout << " ========================================" << endl;
-      filcout << "        BP       Manu        Nb Channel  " << endl ;
-      filcout << " ========================================" << endl;
+      filcouc << "\n List of problematic BusPatch and Manu " << endl;
+      filcouc << " ========================================" << endl;
+      filcouc << "        BP       Manu        Nb Channel  " << endl ;
+      filcouc << " ========================================" << endl;
       for ( Int_t i = 0 ; i < num_tot_BP ; i++ )
        { for ( Int_t j = 0 ; j < num_tot_Manu ; j++ )
-           if (bad_channel[i][j] != 0 ) filcout << "\t" << i << "\t " << j << "\t\t" << bad_channel[i][j] << endl;}
-      filcout << " ========================================" << endl;
+           if (bad_channel[i][j] != 0 ) filcouc << "\t" << i << "\t " << j << "\t\t" << bad_channel[i][j] << endl;}
+      filcouc << " ========================================" << endl;
 
 
-      filcout << "\n Nb of channels in raw data     = " << nmanu*64 << " (" << nmanu << " Manu)" <<  endl;
-      filcout << "\n Nb of fully calibrated channel = " << nGoodChannel << " (" << goodA1Min << "<a1<" << goodA1Max 
+      filcouc << "\n Nb of channels in raw data = " << nmanu*64 << " (" << nmanu << " Manu)" <<  endl;
+      filcouc << "\n Nb of calibrated channel   = " << nGoodChannel << " (" << goodA1Min << "<a1<" << goodA1Max 
           << " and " << goodA2Min << "<a2<" << goodA2Max << ") " << endl;
-      filcout << "\n Nb of Bad channel              = " << nBadChannel << endl;
+      filcouc << "\n Nb of Bad channel          = " << nBadChannel << endl;
+
+      filcouc << "\n Nb of Good a1 channels  = " << nGoodChannel_a1 << " (" << goodA1Min << "<a1<" << goodA1Max <<  ") " << endl;
 
-      filcout << "\n Nb of Good a1 channels  = " << nGoodChannel_a1 << " (" << goodA1Min << "<a1<" << goodA1Max <<  ") " << endl;
+      cout << "\n Nb of channels in raw data = " << nmanu*64 << " (" << nmanu << " Manu)" <<  endl;
+      cout << " Nb of calibrated channel   = " << nGoodChannel << " (" << goodA1Min << "<a1<" << goodA1Max 
+          << " and " << goodA2Min << "<a2<" << goodA2Max << ") " << endl;
+      cout << " Nb of Bad channel          = " << nBadChannel << endl;
 
       Double_t meanA1         = sumA1/(nGoodChannel_a1);
       Double_t meanProbChi2   = sumProbChi2/(nGoodChannel_a1);
@@ -825,14 +884,18 @@ void MakeGainStore()
       Double_t meanProbChi2P2 = sumProbChi2P2/(nGoodChannel);
 
       Double_t capaManu = 0.2; // pF
-      filcout << "\n linear fit   : <a1> = " << meanA1 << "\t  <gain>  = " <<  1./(meanA1*capaManu) 
+      filcouc << "\n linear fit   : <a1> = " << meanA1 << "\t  <gain>  = " <<  1./(meanA1*capaManu) 
           << " mV/fC (capa= " << capaManu << " pF)" << endl;
-      filcout <<   "        Prob(chi2)>  = " <<  meanProbChi2 << endl;
-      filcout << "\n parabolic fit: <a2> = " << meanA2  << endl;
-      filcout <<   "        Prob(chi2)>  = " <<  meanProbChi2P2 << "\n" << endl;
+      filcouc <<   "        Prob(chi2)>  = " <<  meanProbChi2 << endl;
+      filcouc << "\n parabolic fit: <a2> = " << meanA2  << endl;
+      filcouc <<   "        Prob(chi2)>  = " <<  meanProbChi2P2 << "\n" << endl;
 
+      cout << "\n  <gain>  = " <<  1./(meanA1*capaManu) 
+          << " mV/fC (capa= " << capaManu << " pF)" 
+           <<  "  Prob(chi2)>  = " <<  meanProbChi2 << endl;
     }  
 
+    filcouc.close();
 
     return  ;
 
@@ -854,6 +917,8 @@ int main(Int_t argc, Char_t **argv)
     TFitter *minuitFit = new TFitter(NFITPARAMS);
     TVirtualFitter::SetFitter(minuitFit);
 
+    ofstream filcout;
+
     Int_t skipEvents = 0;
     Int_t maxEvents  = 1000000;
     Int_t MaxDateEvents  = 1000000;
@@ -913,6 +978,10 @@ int main(Int_t argc, Char_t **argv)
          i++; 
          gPlotLevel=atoi(argv[i]);
          break;
+       case 'i' :
+         i++; 
+         nbpf1=atoi(argv[i]);
+         break;
        case 's' :
          i++; 
          skipEvents=atoi(argv[i]);
@@ -959,6 +1028,8 @@ int main(Int_t argc, Char_t **argv)
          printf("\n-b <output directory>     (default = %s)",gOutFolder);
          printf("\n-d <print level>          (default = %d)",gPrintLevel);
          printf("\n-g <plot level>           (default = %d)",gPlotLevel);
+         printf("\n-i <nb linear points>     (default = %d)",nbpf1);
+
          printf("\n-l <DAC level>            (default = %d)",injCharge);
          printf("\n-m <max date events>      (default = %d)",MaxDateEvents);
          printf("\n-s <skip events>          (default = %d)",skipEvents);
@@ -1009,20 +1080,6 @@ int main(Int_t argc, Char_t **argv)
     }
   }
 
-
-  status = monitorSetDataSource(inputFile);
-  if (status) {
-    cerr << "ERROR : monitorSetDataSource status (hex) = " << hex << status
-             << " " << monitorDecodeError(status) << endl;
-    return -1;
-  }
-  status = monitorDeclareMp("MUON Tracking monitoring");
-  if (status) {
-    cerr << "ERROR : monitorDeclareMp status (hex) = " << hex << status
-             << " " << monitorDecodeError(status) << endl;
-    return -1;
-  }
-
   Int_t busPatchId;
   UShort_t manuId;  
   UChar_t channelId;
@@ -1034,13 +1091,28 @@ int main(Int_t argc, Char_t **argv)
   
   if (gCommand.CompareTo("comp") != 0)
     {
+
+      status = monitorSetDataSource(inputFile);
+      if (status) {
+       cerr << "ERROR : monitorSetDataSource status (hex) = " << hex << status
+            << " " << monitorDecodeError(status) << endl;
+       return -1;
+      }
+      status = monitorDeclareMp("MUON Tracking monitoring");
+      if (status) {
+       cerr << "ERROR : monitorDeclareMp status (hex) = " << hex << status
+            << " " << monitorDecodeError(status) << endl;
+       return -1;
+      }
+
+
       cout << "\nMUONTRKda : Reading data from file " << inputFile <<endl;
 
       while(1) 
        {
          if (gNDateEvents >= MaxDateEvents) break;
          if (gNEvents >= maxEvents) break;
-         if (gNEvents && gNEvents % 100 == 0)  
+         if (gNDateEvents>0 &&  gNDateEvents % 100 == 0)       
            cout<<"Cumulated:  DATE events = " << gNDateEvents << "   Used events = " << gNEvents << endl;
 
          // check shutdown condition 
@@ -1098,30 +1170,12 @@ int main(Int_t argc, Char_t **argv)
 
          gNDateEvents++;
 
-
-
          if (eventType != PHYSICS_EVENT)
            continue; // for the moment
 
          // decoding MUON payload
-//       AliMUONRawStreamTracker* rawStream  = new AliMUONRawStreamTracker(rawReader);
          rawStream  = new AliMUONRawStreamTracker(rawReader);
           rawStream->DisableWarnings();
-
-//       // loops over DDL 
-//       rawStream->First();  // if GlitchError ? what we are doing ?
-//       while( (status = rawStream->Next(busPatchId, manuId, channelId, charge)) ) 
-//         {
-  
-//           if (gNEvents == 0) gNChannel++;
-            
-//           MakePed(busPatchId, (Int_t)manuId, (Int_t)channelId, (Int_t)charge);
-                 
-//         } // Next digit
-
-//           if (!rawStream->IsErrorMessage()) {
-//             gNEvents++;
-//           }
           
          // loops over DDL to find good events  (Alberto 11/12/07)
          rawStream->First();  // if GlitchError ? what we are doing ?
@@ -1155,44 +1209,33 @@ int main(Int_t argc, Char_t **argv)
          delete rawStream;
 
        } // while (1)
-    }
 
 
 
-    if (gCommand.CompareTo("ped") == 0)
-      {
-       sprintf(flatFile,"MUONTRKda_ped_%d.ped",gRunNumber);
-       if(flatOutputFile.IsNull())flatOutputFile=flatFile;
-       MakePedStore(flatOutputFile);
-      }
+      if (gCommand.CompareTo("ped") == 0)
+       {
+         sprintf(flatFile,"MUONTRKda_ped_%d.ped",gRunNumber);
+         if(flatOutputFile.IsNull())flatOutputFile=flatFile;
+         MakePedStore(flatOutputFile);
+       }
 
-  // option gain -> update root file with pedestal results
-  // gain + create -> recreate root file
-  // gain + comp -> update root file and compute gain parameters
+      // option gain -> update root file with pedestal results
+      // gain + create -> recreate root file
+      // gain + comp -> update root file and compute gain parameters
 
-    if (gCommand.Contains("gain")) 
-      {
-       MakePedStoreForGain(injCharge);
-      }
-  
-    if (gCommand.Contains("comp")) 
-      {
-
-//     if(flatOutputFile.IsNull())flatOutputFile="MUONTRKda_gain.par";
-//     MakeGainStore(flatOutputFile);
-       MakeGainStore();
-      }
-  
+      if (gCommand.Contains("gain")) 
+       {
+         MakePedStoreForGain(injCharge);
+       }
+    
 
-  delete gPedestalStore;
+      delete gPedestalStore;
 
-  delete minuitFit;
-  TVirtualFitter::SetFitter(0);
+      delete minuitFit;
+      TVirtualFitter::SetFitter(0);
 
-  timers.Stop();
+      timers.Stop();
 
-  if (gCommand.CompareTo("comp") != 0)
-    {
       cout << "\nMUONTRKda : Nb of DATE events     = "         << gNDateEvents    << endl;
       cout << "MUONTRKda : Nb of Glitch errors   = "         << gGlitchErrors  << endl;
       cout << "MUONTRKda : Nb of Parity errors   = "         << gParityErrors  << endl;
@@ -1205,60 +1248,64 @@ int main(Int_t argc, Char_t **argv)
       filcout << "MUONTRKda : Nb of Padding errors  = "         << gPaddingErrors << endl;
       filcout << "MUONTRKda : Nb of events used     = "         << gNEvents        << endl;
 
-    }
-
+      cout << "\nMUONTRKda : Output logfile          : " << logOutputFile  << endl;
 
-  cout << "\nMUONTRKda : Output logfile generated         : " << logOutputFile  << endl;
+      if (gCommand.CompareTo("ped") == 0)
+       {
+         if (!(crocusConfigFile.IsNull()))
+           cout << "MUONTRKda : CROCUS command file generated    : " << crocusOutputFile.Data() << endl;
+         else
+           cout << "MUONTRKda : WARNING no CROCUS command file generated" << endl;
 
-  if (gCommand.CompareTo("ped") == 0)
-    {
-      if (!(crocusConfigFile.IsNull()))
-       cout << "MUONTRKda : CROCUS command file generated    : " << crocusOutputFile.Data() << endl;
+         cout << "MUONTRKda : Pedestal Histo file              : " << gHistoFileName  << endl;
+         cout << "MUONTRKda : Flat pedestal file  (to SHUTTLE) : " << flatOutputFile << endl;   
+       }
       else
-       cout << "MUONTRKda : WARNING no CROCUS command file generated" << endl;
-      cout << "MUONTRKda : Pedestal Histo file              : " << gHistoFileName  << endl;
-      cout << "MUONTRKda : Flat pedestal file  (to SHUTTLE) : " << flatOutputFile << endl;   
-    }
-  else
-    {
-      cout << "MUONTRKda : Data file for gain calculation   : " << gHistoFileName_gain  << endl;
+       {
+         cout << "MUONTRKda : DAC data (root file)    : " << gHistoFileName_gain  << endl;
+         cout << "MUONTRKda : Dummy file (to SHUTTLE) : " << flatOutputFile << endl;   
+       }
+
     }
 
-  if (gCommand.CompareTo("comp") == 0)
+  // Compute gain parameters
+
+
+  if (gCommand.Contains("comp")) 
     {
-      cout << "MUONTRKda : Root Histo. file generated       : " << gRootFileName  << endl;
-      cout << "MUONTRKda : Flat gain file (to SHUTTLE)      : " << flatOutputFile << endl;   
+      flatOutputFile="";
+
+      MakeGainStore();
+
+      cout << "\nMUONTRKda : Output logfile          : " << logOutputFile_comp  << endl;
+      cout << "MUONTRKda : Root Histo. file        : " << gRootFileName  << endl;
+      cout << "MUONTRKda : Gain file (to SHUTTLE)  : " << flatOutputFile << endl;   
     }
 
   
-
   // Store IN FES
 
-  if (gCommand.CompareTo("comp") == 0 || gCommand.CompareTo("ped") == 0)
-    {
-      printf("\n *****  STORE FILE in FES ****** \n");
-
-      // to be sure that env variable is set
-//       gSystem->Setenv("DAQDALIB_PATH", "$DATE_SITE/infoLogger");
+  printf("\n *****  STORE FILE in FES ****** \n");
 
-      if (!flatOutputFile.IsNull()) 
-       {
+  // be sure that env variable DAQDALIB_PATH is set in script file
+  //       gSystem->Setenv("DAQDALIB_PATH", "$DATE_SITE/infoLogger");
 
-         //       flatOutputFile.Prepend("./");
-       if (gCommand.CompareTo("ped") == 0)
-         status = daqDA_FES_storeFile(flatOutputFile.Data(),"PEDESTALS");
-        else 
-          status = daqDA_FES_storeFile(flatOutputFile.Data(),"GAINS");
+  if (!flatOutputFile.IsNull()) 
+    {
+      if (gCommand.CompareTo("ped") == 0)
+       status = daqDA_FES_storeFile(flatOutputFile.Data(),"PEDESTALS");
+      else
+       status = daqDA_FES_storeFile(flatOutputFile.Data(),"GAINS");
          
-       if (status) 
-           {
-             printf(" Failed to export file : %d\n",status);
-           }
-         else if(gPrintLevel) printf("Export file: %s\n",flatOutputFile.Data());
+      if (status) 
+       {
+         printf(" Failed to export file : %d\n",status);
        }
+      else if(gPrintLevel) printf(" %s successfully exported to FES  \n",flatOutputFile.Data());
     }
 
   filcout.close();
+
   printf("\nExecution time : R:%7.2fs C:%7.2fs\n", timers.RealTime(), timers.CpuTime());
 
   return status;
index 0a91cfa..c0b645c 100644 (file)
@@ -20,6 +20,7 @@
 #pragma link C++ class AliMUONTriggerLut+;
 #pragma link C++ class AliMUON2DStoreValidator+;
 #pragma link C++ class AliMUONTriggerIO+;
+#pragma link C++ class AliMUONTrackerIO+;
 
 #endif
 
index a51987f..0f51536 100644 (file)
@@ -8,7 +8,8 @@ SRCS:=  AliMUONTriggerLut.cxx \
         AliMUONCalibParamNI.cxx \
         AliMUONTriggerEfficiencyCells.cxx\
         AliMUON2DStoreValidator.cxx \
-        AliMUONTriggerIO.cxx
+        AliMUONTriggerIO.cxx \
+        AliMUONTrackerIO.cxx
 
 HDRS:= $(SRCS:.cxx=.h)