ROOT logo
// @(#)root/monalisa:$Id$
// Author: Andreas Peters   5/10/2005

/*************************************************************************
 * Copyright (C) 1995-2006, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TMonaLisaWriter                                                      //
//                                                                      //
// Class defining interface to MonaLisa Monitoring Services in ROOT.    //
// The TMonaLisaWriter object is used to send monitoring information to //
// a MonaLisa server using the ML ApMon package (libapmoncpp.so/UDP     //
// packets). The MonaLisa ApMon library for C++ can be downloaded at    //
// http://monalisa.cacr.caltech.edu/monalisa__Download__ApMon.html,     //
// current version:                                                     //
// http://monalisa.cacr.caltech.edu/download/apmon/ApMon_c-2.2.0.tar.gz //
//                                                                      //
// The ROOT implementation is primary optimized for process/job         //
// monitoring, although all other generic MonaLisa ApMon functionality  //
// can be exploited through the ApMon class directly via                //
// dynamic_cast<TMonaLisaWriter*>(gMonitoringWriter)->GetApMon().       //
//                                                                      //
// Additions/modifications by Fabrizio Furano 10/04/2008                //
// - The implementation of TFile throughput and info sending was        //
// just sending 'regular' samples about the activity of the single TFile//
// instance that happened to trigger an activity in the right moment.   //
// - Now TMonaLisaWriter keeps internally track of every activity       //
// and regularly sends summaries valid for all the files which had      //
// activity in the last time interval.                                  //
// - Additionally, it's now finalized the infrastructure able to measure//
// and keep track of the file Open latency. A packet is sent for each   //
// successful Open, sending the measures of the latencies for the       //
// various phases of the open. Currently exploited fully by TAlienFile  //
// and TXNetFile. Easy to report from other TFiles too.                 //
// - Now, the hook for the Close() func triggers sending of a packet    //
// containing various information about the performance related to that //
// file only.                                                           //
// - Added support also for performance monitoring when writing         //
//////////////////////////////////////////////////////////////////////////

#include "TMonaLisaWriter.h"
#include "TSystem.h"
#include "TGrid.h"
#include "TFile.h"
#include "TUrl.h"
#include "TStopwatch.h"
#include "Riostream.h"
#include "TParameter.h"
#include "THashList.h"
#include "TMath.h"

ClassImp(TMonaLisaWriter)


// Information which is kept about an alive instance of TFile
class MonitoredTFileInfo: public TObject {
private:
   TFile       *fileinst;
public:
   MonitoredTFileInfo(TFile *file, Double_t timenow): TObject(), fileinst(file) {
      if (file->InheritsFrom("TXNetFile"))
         fFileClassName = "TXNetFile";
      else
         fFileClassName = file->ClassName();

      fLastBytesRead = 0;
      fLastBytesWritten = 0;

      fTempReadBytes = 0;
      fTempWrittenBytes = 0;

      fLastResetTime = timenow;
      fCreationTime = timenow;

      fKillme = kFALSE;
   }

   Double_t    fCreationTime;

   TString     fFileClassName;

   Long64_t    fLastBytesRead;
   Long64_t    fTempReadBytes;
   Long64_t    fLastBytesWritten;
   Long64_t    fTempWrittenBytes;

   Double_t    fLastResetTime;

   Bool_t      fKillme;   // tells to remove the instance after the next computation step

   void        GetThroughputs(Long64_t &readthr, Long64_t &writethr, Double_t timenow, Double_t prectime) {
      readthr = -1;
      writethr = -1;
      Double_t t = TMath::Min(prectime, fLastResetTime);

      Int_t mselapsed = TMath::FloorNint((timenow - t) * 1000);
      mselapsed = TMath::Max(mselapsed, 1);

      readthr = fTempReadBytes / mselapsed * 1000;
      writethr = fTempWrittenBytes / mselapsed * 1000;
   }

   void        UpdateFileStatus(TFile *file) {
      fTempReadBytes = file->GetBytesRead() - fLastBytesRead;
      fTempWrittenBytes = file->GetBytesWritten() - fLastBytesWritten;
   }

   void        ResetFileStatus(TFile *file, Double_t timenow) {
      if (fKillme) return;
      fLastBytesRead = file->GetBytesRead();
      fLastBytesWritten = file->GetBytesWritten();
      fTempReadBytes = 0;
      fTempWrittenBytes = 0;
      fLastResetTime = timenow;
   }

   void        ResetFileStatus(Double_t timenow) {
      if (fKillme) return;
      ResetFileStatus(fileinst, timenow);
   }

};




// Helper used to build up ongoing throughput summaries
class MonitoredTFileSummary: public TNamed {
public:
   MonitoredTFileSummary(TString &fileclassname): TNamed(fileclassname, fileclassname) {
      fBytesRead = 0;
      fBytesWritten = 0;
      fReadThroughput = 0;
      fWriteThroughput = 0;
   }

   Long64_t    fBytesRead;
   Long64_t    fBytesWritten;
   Long64_t    fReadThroughput;
   Long64_t    fWriteThroughput;

   void        Update(MonitoredTFileInfo *mi, Double_t timenow, Double_t prectime) {
      Long64_t rth, wth;
      mi->GetThroughputs(rth, wth, timenow, prectime);

      fBytesRead += mi->fTempReadBytes;
      fBytesWritten += mi->fTempWrittenBytes;

      if (rth > 0) fReadThroughput += rth;
      if (wth > 0) fWriteThroughput += wth;
   }

};



//______________________________________________________________________________
TMonaLisaWriter::TMonaLisaWriter(const char *monserver, const char *montag,
                                 const char *monid, const char *monsubid,
                                 const char *option)
{
   // Create MonaLisa write object.

   fMonInfoRepo = new std::map<UInt_t, MonitoredTFileInfo *>;

   Init(monserver, montag, monid, monsubid, option);
}

//______________________________________________________________________________
void TMonaLisaWriter::Init(const char *monserver, const char *montag, const char *monid,
                           const char *monsubid, const char *option)
{
   // Creates a TMonaLisaWriter object to send monitoring information to a
   // MonaLisa server using the MonaLisa ApMon package (libapmoncpp.so/UDP
   // packets). The MonaLisa ApMon library for C++ can be downloaded at
   // http://monalisa.cacr.caltech.edu/monalisa__Download__ApMon.html,
   // current version:
   // http://monalisa.cacr.caltech.edu/download/apmon/ApMon_cpp-2.0.6.tar.gz
   //
   // The ROOT implementation is primary optimized for process/job monitoring,
   // although all other generic MonaLisa ApMon functionality can be exploited
   // through the ApMon class directly (gMonitoringWriter->GetApMon()).
   //
   // Monitoring information in MonaLisa is structured in the following tree
   // structure:
   // <farmname>
   //    |
   //    ---> <nodename1>
   //              |
   //              ---> <key1> - <value1>
   //              ---> <key2> - <value2>
   //    ---> <nodename2>
   //              |
   //              ---> <key3> - <value3>
   //              ---> <key4> - <value4>
   //
   // The parameter monid is equivalent to the MonaLisa node name, for the
   // case of process monitoring it can be just an identifier to classify
   // the type of jobs e.g. "PROOF_PROCESSING".
   // If monid is not specified, TMonaLisaWriter tries to set it in this order
   // from environment variables:
   // - PROOF_JOB_ID
   // - GRID_JOB_ID
   // - LCG_JOB_ID
   // - ALIEN_MASTERJOB_ID
   // - ALIEN_PROC_ID
   //
   // The parameter montag is equivalent to the MonaLisa farm name, for the
   // case of process monitoring it can be a process identifier e.g. a PROOF
   // session ID.
   //
   // The parameter monserver specifies the server to whom to send the
   // monitoring UDP packets. If not specified, the hostname (the port is
   // a default one) is specified in the environment variable APMON_CONFIG.
   //
   // To use TMonaLisaWriter, libMonaLisa.so has to be loaded.
   //
   // According to the fact, that the deepness of the MonaLisa naming scheme
   // is only 3 (<farm><node><value>), a special naming scheme is used for
   // process monitoring. There is a high-level method to send progress
   // information of Tree analysis (# of events, datasize).
   // To distinguish individual nodes running the processing, part of the
   // information is kept in the <value> parameter of ML.
   // <value> is named as:
   //    <site-name>:<host-name>:<pid>:<valuetag>
   // <site-name> is taken from an environment variable in the following order:
   // - PROOF_SITE
   // - GRID_SITE
   // - ALIEN_SITE
   // - default 'none'
   // <host-name> is taken from gSystem->Hostname()
   // <pid> is the process ID of the ROOT process
   //
   // Example of use for Process Monitoring:
   //   new TMonaLisaWriter("BATCH_ANALYSIS","AnalysisLoop-00001","lxplus050.cern.ch");
   // Once when you create an analysis task, execute
   //   gMonitoringWriter->SendInfoUser("myname");
   //   gMonitoringWriter->SendInfoDescription("My first Higgs analysis");
   //   gMonitoringWriter->SendInfoTime();
   //   gMonitoringWriter->SendInfoStatus("Submitted");
   //
   // On each node executing a subtask, you can set the status of this subtask:
   //   gMonitoringWriter->SendProcessingStatus("Started");
   // During the processing of your analysis you can send progress updates:
   //   gMonitoringWriter->SendProcessProgress(100,1000000); <= 100 events, 1MB processed
   //   ....
   //   gMonitoringWriter-SendProcessingStatus("Finished");
   //   delete gMonitoringWriter; gMonitoringWriter=0;
   //
   // Example of use for any Generic Monitoring information:
   //   TList *valuelist = new TList();
   //   valuelist->SetOwner(kTRUE);
   //   // append a text object
   //   TMonaLisaText *valtext = new TMonaLisaText("decaychannel","K->eeg");
   //   valuelist->Add(valtext);
   //   // append a double value
   //   TMonaLisaValue* valdouble = new TMonaLisaValue("n-gamma",5);
   //   valuelist->Add(valdouble);
   //   Bool_t success = SendParameters(valuelist);
   //   delete valuelist;
   //
   // option:
   // "global": gMonitoringWriter is initialized with this instance

   SetName(montag);
   SetTitle(montag);

   fVerbose = kFALSE;           // no verbosity as default

   fFileStopwatch.Start(kTRUE);
   fLastRWSendTime = fFileStopwatch.RealTime();
   fLastFCloseSendTime = fFileStopwatch.RealTime();
   fLastProgressTime = time(0);
   fFileStopwatch.Continue();

   fReportInterval = 120; // default interval is 120, to prevent flooding
   if (gSystem->Getenv("APMON_INTERVAL")) {
      fReportInterval = atoi(gSystem->Getenv("APMON_INTERVAL"));
      if (fReportInterval < 1)
         fReportInterval =1;
      Info("TMonaLisaWriter","Setting APMON Report Interval to %d seconds",fReportInterval);
   }

   char *apmon_config[1] =
      { ((monserver == 0) ? (char *) gSystem->Getenv("APMON_CONFIG") : (char *) monserver) };
   if (apmon_config[0] == 0) {
      Error("TMonaLisaWriter",
            "Disabling apmon monitoring since env variable APMON_CONFIG was not found and the monitoring server is not specified in the constructor!");
      fInitialized = kFALSE;
      return;
   }

   try {
      fApmon = new ApMon(1, apmon_config);
      fApmon->setConfRecheck(false);
      fApmon->setJobMonitoring(false);
      //((ApMon*)fApmon)->setSysMonitoring(false);
      //((ApMon*)fApmon)->setGenMonitoring(false);
   } catch (runtime_error &e) {
      Error("TMonaLisaWriter", "Error initializing ApMon: %s", e.what());
      Error("TMonaLisaWriter", "Disabling apmon.");
      fInitialized = kFALSE;
      return;
   }

   TString clustername="ROOT_";

   if (montag == 0) {
     if (gSystem->Getenv("PROOF_SITE")) {
       clustername+=(gSystem->Getenv("PROOF_SITE"));
     } else if (gSystem->Getenv("GRID_SITE")) {
       clustername+=(gSystem->Getenv("GRID_SITE"));
     } else if (gSystem->Getenv("LCG_SITE")) {
       clustername+=(gSystem->Getenv("LCG_SITE"));
     } else if (gSystem->Getenv("ALIEN_SITE")) {
       clustername+=(gSystem->Getenv("ALIEN_SITE"));
     } else {
       clustername += TString("none");
     }
     SetName(clustername);
     SetTitle(clustername);
   } else {
       SetName(clustername+TString(montag));
       SetTitle(clustername+TString(montag));
   }

   fHostname = gSystem->HostName();
   fPid = gSystem->GetPid();

   if (monid == 0) {
      if (gSystem->Getenv("PROOF_QUERY_ID"))
         fJobId = gSystem->Getenv("PROOF_QUERY_ID");
      else if (gSystem->Getenv("GRID_JOB_ID"))
         fJobId = gSystem->Getenv("GRID_JOB_ID");
      else if (gSystem->Getenv("LCG_JOB_ID"))
         fJobId = gSystem->Getenv("LCG_JOB_ID");
      else if (gSystem->Getenv("ALIEN_MASTERJOBID"))
         fJobId = gSystem->Getenv("ALIEN_MASTERJOBID");
      else if (gSystem->Getenv("ALIEN_PROC_ID"))
         fJobId = gSystem->Getenv("ALIEN_PROC_ID");
      else
         fJobId = "-no-job-id";
   } else {
      fJobId = monid;
   }

   if (monsubid == 0) {
     if (gSystem->Getenv("PROOF_PROC_ID")) {
       fSubJobId = gSystem->Getenv("PROOF_PROC_ID");
     } else if (gSystem->Getenv("ALIEN_PROC_ID")) {
       fSubJobId = gSystem->Getenv("ALIEN_PROC_ID");
     } else {
       fSubJobId = fJobId;
     }
   } else {
     fSubJobId = monsubid;
   }


   if (fVerbose)
      Info("Initialized for ML Server <%s> - Setting ClusterID <%s> JobID <%s> SubID <%s>\n",
           apmon_config[0], fName.Data() ,fJobId.Data(),fSubJobId.Data());

   fInitialized = kTRUE;

   TString optionStr(option);
   if (optionStr.Contains("global"))
      gMonitoringWriter = this;
}

//______________________________________________________________________________
TMonaLisaWriter::~TMonaLisaWriter()
{
   // Cleanup.
   if (fMonInfoRepo) {

      std::map<UInt_t, MonitoredTFileInfo *>::iterator iter = fMonInfoRepo->begin();
      while (iter != fMonInfoRepo->end()) {
         delete iter->second;
         iter++;
      }

      fMonInfoRepo->clear();
      delete fMonInfoRepo;
      fMonInfoRepo = 0;
   }

   if (gMonitoringWriter == this)
      gMonitoringWriter = 0;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendInfoStatus(const char *status)
{
   // Sends a <status> text to MonaLisa following the process scheme:
   //    <site> --> <jobid> --> 'status' = <status>
   // Used to set a global status for a groupjob, e.g.
   // a master-job or the general status of PROOF processing.

   if (!fInitialized) {
      Error("SendInfoStatus", "Monitoring is not properly initialized!");
      return kFALSE;
   }

   Bool_t success = kFALSE;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   // create a monitor text object
   TMonaLisaText *valtext = new TMonaLisaText("status", status);
   valuelist->Add(valtext);

   // send it to monalisa
   success = SendParameters(valuelist);

   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendInfoUser(const char *user)
{
   // Sends the <user> text to MonaLisa following the process scheme:
   //    <site> --> <jobid> --> 'user' = <user>

   if (!fInitialized) {
      Error("TMonaLisaWriter",
            "Monitoring initialization has failed - you can't send to MonaLisa!");
      return kFALSE;
   }

   Bool_t success = kFALSE;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   const char *localuser;
   if (user) {
      localuser = user;
   } else {
      if (gGrid) {
         localuser = gGrid->GetUser();
      } else {
         localuser = "unknown";
      }
   }

   // create a monitor text object
   TMonaLisaText *valtext = new TMonaLisaText("user", localuser);
   valuelist->Add(valtext);

   // send it to monalisa
   success = SendParameters(valuelist);

   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendInfoDescription(const char *jobtag)
{
   // Sends the description <jobtag> following the processing scheme:
   //    <site> --> <jobid> --> 'jobname' = <jobtag>

   if (!fInitialized) {
      Error("SendInfoDescription",
            "Monitoring is not properly initialized!");
      return kFALSE;
   }

   Bool_t success = kFALSE;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   // create a monitor text object
   TMonaLisaText *valtext = new TMonaLisaText("jobname", jobtag);
   valuelist->Add(valtext);

   // send it to monalisag
   success = SendParameters(valuelist);

   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendInfoTime()
{
   // Sends the current time to MonaLisa following the processing scheme
   //    <site> --> <jobid> --> 'time' = >unixtimestamp<

   if (!fInitialized) {
      Error("SendInfoTime", "Monitoring is not properly initialized!");
      return kFALSE;
   }

   Bool_t success = kFALSE;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   TString valtime = (Int_t) time(0);

   // create a monitor text object
   TMonaLisaText *valtext = new TMonaLisaText("time", valtime);
   valuelist->Add(valtext);

   // send it to monalisa
   success = SendParameters(valuelist);

   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendProcessingStatus(const char *status, Bool_t restarttimer)
{
   // Send the procesing status 'status' to MonaLisa following the
   // processing scheme:
   //    <site> --> <jobid> --> 'status' = <status>
   // Used, to set the processing status of individual subtaks e.g. the
   // status of a batch (sub-)job or the status of a PROOF slave
   // participating in query <jobid>

   if (restarttimer) {
      fStopwatch.Start(kTRUE);
   }

   if (!fInitialized) {
      Error("TMonaLisaWriter",
            "Monitoring initialization has failed - you can't send to MonaLisa!");
      return kFALSE;
   }

   Bool_t success = kFALSE;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   // create a monitor text object
   TMonaLisaText *valtext = new TMonaLisaText("status", status);
   valuelist->Add(valtext);

   TMonaLisaText *valhost = new TMonaLisaText("hostname",fHostname);
   valuelist->Add(valhost);

   TMonaLisaText *valsid = new TMonaLisaText("subid", fSubJobId.Data());
   valuelist->Add(valsid);

   // send it to monalisa
   success = SendParameters(valuelist);

   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendProcessingProgress(Double_t nevent, Double_t nbytes, Bool_t force)
{
   // Send the procesing progress to MonaLisa.

   if (!force && (time(0)-fLastProgressTime) < fReportInterval) {
     // if the progress is not forced, we send maximum < fReportInterval per second!
     return kFALSE;
   }

   if (!fInitialized) {
      Error("SendProcessingProgress",
            "Monitoring is not properly initialized!");
      return kFALSE;
   }

   Bool_t success = kFALSE;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   // create a monitor text object
   TMonaLisaValue *valevent =    new TMonaLisaValue("events", nevent);
   TMonaLisaValue *valbyte =     new TMonaLisaValue("processedbytes", nbytes);
   TMonaLisaValue *valrealtime = new TMonaLisaValue("realtime",fStopwatch.RealTime());
   TMonaLisaValue *valcputime =  new TMonaLisaValue("cputime",fStopwatch.CpuTime());

   ProcInfo_t pinfo;
   gSystem->GetProcInfo(&pinfo);
   Double_t totmem = (Double_t)(pinfo.fMemVirtual) * 1024.;
   Double_t rssmem = (Double_t)(pinfo.fMemResident) * 1024.;
   Double_t shdmem = 0.;

   TMonaLisaValue *valtotmem = new TMonaLisaValue("totmem",totmem);
   TMonaLisaValue *valrssmem = new TMonaLisaValue("rssmem",rssmem);
   TMonaLisaValue *valshdmem = new TMonaLisaValue("shdmem",shdmem);

   TMonaLisaText *valsid = new TMonaLisaText("subid", fSubJobId.Data());
   valuelist->Add(valsid);
   valuelist->Add(valevent);
   valuelist->Add(valbyte);
   valuelist->Add(valrealtime);
   valuelist->Add(valcputime);
   valuelist->Add(valtotmem);
   valuelist->Add(valrssmem);
   valuelist->Add(valshdmem);

   TString      strevents="";
   strevents += nevent;
   TString      strbytes="";
   strbytes  += nbytes;
   TString      strcpu="";
   strcpu    += fStopwatch.CpuTime();
   TString      strreal="";
   strreal   += fStopwatch.RealTime();
   TString      strtotmem="";
   strtotmem += totmem;
   TString      strrssmem="";
   strrssmem += rssmem;
   TString      strshdmem="";
   strshdmem += shdmem;

   fStopwatch.Continue();

   TMonaLisaText *textevent   = new TMonaLisaText("events_str", strevents.Data());
   TMonaLisaText *textbyte    = new TMonaLisaText("processedbytes_str", strbytes.Data());
   TMonaLisaText *textreal    = new TMonaLisaText("realtime_str", strreal.Data());
   TMonaLisaText *textcpu     = new TMonaLisaText("cputime_str", strcpu.Data());
   TMonaLisaText *texttotmem  = new TMonaLisaText("totmem_str", strtotmem.Data());
   TMonaLisaText *textrssmem  = new TMonaLisaText("rssmem_str", strrssmem.Data());
   TMonaLisaText *textshdmem  = new TMonaLisaText("shdmem_str", strshdmem.Data());
   valuelist->Add(textevent);
   valuelist->Add(textbyte);
   valuelist->Add(textcpu);
   valuelist->Add(textreal);
   valuelist->Add(texttotmem);
   valuelist->Add(textrssmem);
   valuelist->Add(textshdmem);

   TMonaLisaText *valhost = new TMonaLisaText("hostname",fHostname);
   valuelist->Add(valhost);

   // send it to monalisa
   success = SendParameters(valuelist);
   fLastProgressTime = time(0);
   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendFileOpenProgress(TFile *file, TList *openphases,
                                             const char *openphasename,
                                             Bool_t forcesend)
{
   // Send the fileopen progress to MonaLisa.
   // If openphases=0 it means that the information is to be stored
   // in a temp space, since there is not yet an object where to attach it to.
   // This is typical in the static Open calls.
   // The temp openphases are put into a list as soon as one is specified.
   //
   // If thisopenphasename=0 it means that the stored phases (temp and object)
   // have to be cleared.

   if (!fInitialized) {
      Error("SendFileOpenProgress",
            "Monitoring is not properly initialized!");
      return kFALSE;
   }

   // Create the list, if not yet done
   if (!fTmpOpenPhases && !openphases) {
      fTmpOpenPhases = new TList;
      fTmpOpenPhases->SetOwner();
   }

   if (!openphasename) {
      // This means "reset my phases"
      fTmpOpenPhases->Clear();
      return kTRUE;
   }

   // Take a measurement
   TParameter<Double_t> *nfo = new TParameter<Double_t>(openphasename, fFileStopwatch.RealTime());
   fFileStopwatch.Continue();

   if (!openphases) {
      fTmpOpenPhases->Add(nfo);
   } else {
      // Move info temporarly saved to object list
      TIter nxt(fTmpOpenPhases);
      TParameter<Double_t> *nf = 0;
      while ((nf = (TParameter<Double_t> *)nxt()))
         openphases->Add(nf);
      // Add this measurement
      openphases->Add(nfo);
      // Reset the temporary list
      if (fTmpOpenPhases) {
         fTmpOpenPhases->SetOwner(0);
         fTmpOpenPhases->Clear();
      }

   }

   if (!forcesend) return kTRUE;
   if (!file) return kTRUE;

   TList *op = openphases ? openphases : fTmpOpenPhases;

   Bool_t success = kFALSE;


   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   // create a monitor text object

   TMonaLisaText *valhost = new TMonaLisaText("hostname",fHostname);
   valuelist->Add(valhost);
   TMonaLisaText *valsid = new TMonaLisaText("subid", fSubJobId.Data());
   valuelist->Add(valsid);
   TMonaLisaText *valdest = new TMonaLisaText("destname", file->GetEndpointUrl()->GetHost());
   valuelist->Add(valdest);

   TMonaLisaValue *valfid = new TMonaLisaValue("fileid", file->GetFileCounter());
   valuelist->Add(valfid);
   TString strfid = Form("%lld", file->GetFileCounter());
   TMonaLisaText *valstrfid = new TMonaLisaText("fileid_str", strfid.Data());
   valuelist->Add(valstrfid);

   Int_t kk = 1;
   TIter nxt(op);
   TParameter<Double_t> *nf1 = 0;
   TParameter<Double_t> *nf0 = (TParameter<Double_t> *)nxt();
   while ((nf1 = (TParameter<Double_t> *)nxt())) {
      TString s = Form("openphase%d_%s", kk, nf0->GetName());
      TMonaLisaValue *v = new TMonaLisaValue(s.Data(), nf1->GetVal() - nf0->GetVal());
      valuelist->Add(v);
      // Go to next
      nf0 = nf1;
      kk++;
   }

   // Now send how much time was elapsed in total
   nf0 = (TParameter<Double_t> *)op->First();
   nf1 = (TParameter<Double_t> *)op->Last();
   TMonaLisaValue *valtottime =
      new TMonaLisaValue("total_open_time", nf1->GetVal() - nf0->GetVal());
   valuelist->Add(valtottime);

   // send it to monalisa
   success = SendParameters(valuelist);
   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendFileCloseEvent(TFile *file) {
   if (!fInitialized) {
      Error("SendFileCloseEvent",
            "Monitoring is not properly initialized!");
      return kFALSE;
   }

   Bool_t success = kFALSE;
   Double_t timenow = fFileStopwatch.RealTime();
   fFileStopwatch.Continue();

   MonitoredTFileInfo *mi = 0;
   std::map<UInt_t, MonitoredTFileInfo *>::iterator iter = fMonInfoRepo->find(file->GetUniqueID());
   if (iter != fMonInfoRepo->end()) mi = iter->second;

   Double_t timelapsed = 0.0;
   if (mi) timelapsed = timenow - mi->fCreationTime;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   TString valname;
   TString pfx = file->ClassName();
   if (file->InheritsFrom("TXNetFile"))
      pfx = "TXNetFile";

   pfx += "_";

   // The info to be sent is the one relative to the specific file

   TMonaLisaText *valdest = new TMonaLisaText("destname",file->GetEndpointUrl()->GetHost());
   valuelist->Add(valdest);
   TMonaLisaValue *valfid = new TMonaLisaValue("fileid",file->GetFileCounter());
   valuelist->Add(valfid);
   TString strfid="";
   strfid+=file->GetFileCounter();
   TMonaLisaText *valstrfid = new TMonaLisaText("fileid_str",strfid.Data());
   valuelist->Add(valstrfid);

   valname = pfx;
   valname += "readbytes";
   TMonaLisaValue *valread = new TMonaLisaValue(valname, file->GetBytesRead());
   valuelist->Add(valread);

//    TString strbytes_r="";
//    strbytes_r += file->GetBytesRead();
//    TMonaLisaText *valstrread = new TMonaLisaText("readbytes_str", strbytes_r.Data());
//    valuelist->Add(valstrread);

   valname = pfx;
   valname += "writtenbytes";
   TMonaLisaValue *valwrite = new TMonaLisaValue(valname, file->GetBytesWritten());
   valuelist->Add(valwrite);

//    TString strbytes_w="";
//    strbytes_w += file->GetBytesWritten();
//    TMonaLisaText *valstrwrite = new TMonaLisaText("writtenbytes_str", strbytes_w.Data());
//    valuelist->Add(valstrwrite);

   int thput;
   if (timelapsed > 0.001) {
      Int_t selapsed = TMath::FloorNint(timelapsed * 1000);

      thput = file->GetBytesRead() / selapsed * 1000;
      valname = pfx;
      valname += "filethrpt_rd";
      TMonaLisaValue *valreadthavg = new TMonaLisaValue(valname, thput);
      valuelist->Add(valreadthavg);

      thput = file->GetBytesWritten() / selapsed * 1000;
      valname = pfx;
      valname += "filethrpt_wr";
      TMonaLisaValue *valwritethavg = new TMonaLisaValue(valname, thput);
      valuelist->Add(valwritethavg);
   }

   // And the specific file summary has to be removed from the repo
   if (mi) {
      mi->UpdateFileStatus(file);
      mi->fKillme = kTRUE;
   }

   // send it to monalisa
   success = SendParameters(valuelist);


   delete valuelist;
   return success;
}
//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendFileReadProgress(TFile *file) {
   return SendFileCheckpoint(file);
}
//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendFileWriteProgress(TFile *file) {
   return SendFileCheckpoint(file);
}
//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendFileCheckpoint(TFile *file)
{
   if (!fInitialized) {
      Error("SendFileCheckpoint",
            "Monitoring is not properly initialized!");
      return kFALSE;
   }

   if (!file->IsOpen()) return kTRUE;

   // We cannot handle this kind of ongoing averaged monitoring for a file which has not an unique id. Sorry.
   // This seems to affect raw files, for which only the Close() info is available
   // Removing this check causes a mess for non-raw and raw TFiles, because
   // the UUID in the Init phase has not yet been set, and the traffic
   // reported during that phase is reported wrongly, causing various leaks and troubles
   // TFiles without an unique id can be monitored only in their Open/Close event
   if (!file->TestBit(kHasUUID)) return kTRUE;

   Double_t timenow = fFileStopwatch.RealTime();
   fFileStopwatch.Continue();

   // This info has to be gathered in any case.
   
   // Check if an MonitoredTFileInfo instance is already available
   // If not, create one
   MonitoredTFileInfo *mi = 0;
   std::map<UInt_t, MonitoredTFileInfo *>::iterator iter = fMonInfoRepo->find(file->GetUniqueID());
   if (iter != fMonInfoRepo->end()) mi = iter->second;
   if (!mi) {

      mi = new MonitoredTFileInfo(file, timenow);
      if (mi) fMonInfoRepo->insert( make_pair( file->GetUniqueID(), mi ) ); 
   }

   // And now we get those partial values
   if (mi) mi->UpdateFileStatus(file);

   // Send the fileread progress to MonaLisa only if required or convenient
   if ( timenow - fLastRWSendTime < fReportInterval) {
      // if the progress is not forced, we send maximum 1 every fReportInterval seconds!
      return kFALSE;
   }

   Bool_t success = kFALSE;

   TList *valuelist = new TList();
   valuelist->SetOwner(kTRUE);

   TString valname;
   
   // We send only a little throughput summary info
   // Instead we send the info for the actual file passed

   TMonaLisaText *valhost = new TMonaLisaText("hostname",fHostname);
   valuelist->Add(valhost);
   TMonaLisaText *valsid = new TMonaLisaText("subid", fSubJobId.Data());
   valuelist->Add(valsid);

   // First of all, we create an internal summary, sorted by kind of TFile used
   THashList summary;
   summary.SetOwner(kTRUE);

   iter = fMonInfoRepo->begin();
   if (iter != fMonInfoRepo->end()) mi = iter->second;
   else mi = 0;

   while (mi) {
      MonitoredTFileSummary *sum = static_cast<MonitoredTFileSummary *>(summary.FindObject(mi->fFileClassName));
      if (!sum) {
         sum = new MonitoredTFileSummary(mi->fFileClassName);
         if (sum) summary.AddLast(sum);
      }

      if (sum) {
         sum->Update(mi, timenow, fLastRWSendTime);
         mi->ResetFileStatus(timenow);
      }

      // This could be an info about an already closed file
      if (mi->fKillme) {
         iter->second = 0;
      }

      iter++;
      if (iter != fMonInfoRepo->end())
         mi = iter->second;
      else 
         mi = 0;
   }

   for (iter = fMonInfoRepo->begin(); iter != fMonInfoRepo->end(); iter++)
      if (!iter->second) fMonInfoRepo->erase(iter);

   // This info is a summary valid for all the monitored files at once.
   // It makes no sense at all to send data relative to a specific file here
   // Cycle through the summary...
   TIter nxt2(&summary);
   MonitoredTFileSummary *sum;
   while ((sum = (MonitoredTFileSummary *)nxt2())) {

      if (sum->fReadThroughput >= 0) {
         valname = sum->GetName();
         valname += "_avgthrpt_rd";
         TMonaLisaValue *valreadthr = new TMonaLisaValue(valname, sum->fReadThroughput);
         valuelist->Add(valreadthr);
      }

      if ( sum->fWriteThroughput >= 0 ) {
         valname = sum->GetName();
         valname += "_avgthrpt_wr";
         TMonaLisaValue *valwritethr = new TMonaLisaValue(valname, sum->fWriteThroughput);
         valuelist->Add(valwritethr);
      }

   }


   // send it to monalisa
   success = SendParameters(valuelist);

   fLastRWSendTime = timenow;

   delete valuelist;
   return success;
}

//______________________________________________________________________________
Bool_t TMonaLisaWriter::SendParameters(TList *valuelist, const char *identifier)
{
   // Send the parameters to MonaLisa.

   if (!fInitialized) {
      Error("SendParameters", "Monitoring is not properly initialized!");
      return kFALSE;
   }

   if (!valuelist) {
      Error("SendParameters", "No values in the value list!");
      return kFALSE;
   }

   if (identifier == 0)
      identifier = fJobId;

   TIter nextvalue(valuelist);

   TMonaLisaValue *objval;
   TMonaLisaText *objtext;
   TObject *monobj;

   Int_t apmon_nparams = valuelist->GetSize();
   char **apmon_params = 0;
   Int_t *apmon_types = 0;
   char **apmon_values = 0;
   Double_t *bufDouble = 0; // buffer for int, long, etc. that is to be sent as double

   if (apmon_nparams) {

      apmon_params = (char **) malloc(apmon_nparams * sizeof(char *));
      apmon_values = (char **) malloc(apmon_nparams * sizeof(char *));
      apmon_types = (int *) malloc(apmon_nparams * sizeof(int));
      bufDouble = new Double_t[apmon_nparams];

      Int_t looper = 0;
      while ((monobj = nextvalue())) {
         if (!strcmp(monobj->ClassName(), "TMonaLisaValue")) {
            objval = (TMonaLisaValue *) monobj;

            if (fVerbose)
               Info("SendParameters", "adding tag %s with val %f",
                    objval->GetName(), objval->GetValue());

            apmon_params[looper] = (char *) objval->GetName();
            apmon_types[looper] = XDR_REAL64;
            apmon_values[looper] = (char *) (objval->GetValuePtr());
            looper++;
         }
         if (!strcmp(monobj->ClassName(), "TMonaLisaText")) {
            objtext = (TMonaLisaText *) monobj;

            if (fVerbose)
               Info("SendParameters", "adding tag %s with text %s",
                    objtext->GetName(), objtext->GetText());

            apmon_params[looper] = (char *) objtext->GetName();
            apmon_types[looper] = XDR_STRING;
            apmon_values[looper] = (char *) (objtext->GetText());
            looper++;
         }
         if (!strcmp(monobj->ClassName(), "TNamed")) {
            TNamed* objNamed = (TNamed *) monobj;

            if (fVerbose)
              Info("SendParameters", "adding tag %s with text %s",
                   objNamed->GetName(), objNamed->GetTitle());

            apmon_params[looper] = (char *) objNamed->GetName();
            apmon_types[looper] = XDR_STRING;
            apmon_values[looper] = (char *) (objNamed->GetTitle());
            looper++;
         }
         // unfortunately ClassName() converts Double_t to double, etc.
         if (!strcmp(monobj->ClassName(), "TParameter<double>")) {
            TParameter<double>* objParam = (TParameter<double> *) monobj;

            if (fVerbose)
               Info("SendParameters", "adding tag %s with val %f",
                    objParam->GetName(), objParam->GetVal());

            apmon_params[looper] = (char *) objParam->GetName();
            apmon_types[looper] = XDR_REAL64;
            apmon_values[looper] = (char *) &(objParam->GetVal());
            looper++;
         }
         if (!strcmp(monobj->ClassName(), "TParameter<Long64_t>")) {
            TParameter<Long64_t>* objParam = (TParameter<Long64_t> *) monobj;

            if (fVerbose)
               Info("SendParameters", "adding tag %s with val %lld",
                    objParam->GetName(), objParam->GetVal());

            apmon_params[looper] = (char *) objParam->GetName();
            apmon_types[looper] = XDR_REAL64;
            bufDouble[looper] = objParam->GetVal();
            apmon_values[looper] = (char *) (bufDouble + looper);
            looper++;
         }
         if (!strcmp(monobj->ClassName(), "TParameter<long>")) {
            TParameter<long>* objParam = (TParameter<long> *) monobj;

            if (fVerbose)
               Info("SendParameters", "adding tag %s with val %ld",
                    objParam->GetName(), objParam->GetVal());

            apmon_params[looper] = (char *) objParam->GetName();
            apmon_types[looper] = XDR_REAL64;
            bufDouble[looper] = objParam->GetVal();
            apmon_values[looper] = (char *) (bufDouble + looper);
            looper++;
         }
         if (!strcmp(monobj->ClassName(), "TParameter<float>")) {
            TParameter<float>* objParam = (TParameter<float> *) monobj;

            if (fVerbose)
               Info("SendParameters", "adding tag %s with val %f",
                    objParam->GetName(), objParam->GetVal());

            apmon_params[looper] = (char *) objParam->GetName();
            apmon_types[looper] = XDR_REAL64;
            bufDouble[looper] = objParam->GetVal();
            apmon_values[looper] = (char *) (bufDouble + looper);
            looper++;
         }
         if (!strcmp(monobj->ClassName(), "TParameter<int>")) {
            TParameter<int>* objParam = (TParameter<int> *) monobj;

            if (fVerbose)
               Info("SendParameters", "adding tag %s with val %d",
                    objParam->GetName(), objParam->GetVal());

            apmon_params[looper] = (char *) objParam->GetName();
            apmon_types[looper] = XDR_REAL64;
            bufDouble[looper] = objParam->GetVal();
            apmon_values[looper] = (char *) (bufDouble + looper);
            looper++;
         }
      }

      // change number of parameters to the actual found value
      apmon_nparams = looper;

      if (fVerbose)
         Info("SendParameters", "n: %d name: %s identifier %s ...,",
              apmon_nparams, GetName(), identifier);

      ((ApMon *) fApmon)->sendParameters((char *) GetName(), (char*)identifier,
                                         apmon_nparams, apmon_params,
                                         apmon_types, apmon_values);

      free(apmon_params);
      free(apmon_values);
      free(apmon_types);
      delete[] bufDouble;
   }
   return kTRUE;
}

//______________________________________________________________________________
void TMonaLisaWriter::SetLogLevel(const char *loglevel)
{
   // Set MonaLisa log level.

   ((ApMon *) fApmon)->setLogLevel((char *) loglevel);
}

//______________________________________________________________________________
void TMonaLisaWriter::Print(Option_t *) const
{
   // Print info about MonaLisa object.

   cout << "Site     (Farm) : " << fName << endl;
   cout << "JobId    (Node) : " << fJobId << endl;
   cout << "SubJobId (Node) : " << fSubJobId << endl;
   cout << "HostName        : " << fHostname << endl;
   cout << "Pid             : " << fPid << endl;
   cout << "Inititialized   : " << fInitialized << endl;
   cout << "Verbose         : " << fVerbose << endl;

}
 TMonaLisaWriter.cxx:1
 TMonaLisaWriter.cxx:2
 TMonaLisaWriter.cxx:3
 TMonaLisaWriter.cxx:4
 TMonaLisaWriter.cxx:5
 TMonaLisaWriter.cxx:6
 TMonaLisaWriter.cxx:7
 TMonaLisaWriter.cxx:8
 TMonaLisaWriter.cxx:9
 TMonaLisaWriter.cxx:10
 TMonaLisaWriter.cxx:11
 TMonaLisaWriter.cxx:12
 TMonaLisaWriter.cxx:13
 TMonaLisaWriter.cxx:14
 TMonaLisaWriter.cxx:15
 TMonaLisaWriter.cxx:16
 TMonaLisaWriter.cxx:17
 TMonaLisaWriter.cxx:18
 TMonaLisaWriter.cxx:19
 TMonaLisaWriter.cxx:20
 TMonaLisaWriter.cxx:21
 TMonaLisaWriter.cxx:22
 TMonaLisaWriter.cxx:23
 TMonaLisaWriter.cxx:24
 TMonaLisaWriter.cxx:25
 TMonaLisaWriter.cxx:26
 TMonaLisaWriter.cxx:27
 TMonaLisaWriter.cxx:28
 TMonaLisaWriter.cxx:29
 TMonaLisaWriter.cxx:30
 TMonaLisaWriter.cxx:31
 TMonaLisaWriter.cxx:32
 TMonaLisaWriter.cxx:33
 TMonaLisaWriter.cxx:34
 TMonaLisaWriter.cxx:35
 TMonaLisaWriter.cxx:36
 TMonaLisaWriter.cxx:37
 TMonaLisaWriter.cxx:38
 TMonaLisaWriter.cxx:39
 TMonaLisaWriter.cxx:40
 TMonaLisaWriter.cxx:41
 TMonaLisaWriter.cxx:42
 TMonaLisaWriter.cxx:43
 TMonaLisaWriter.cxx:44
 TMonaLisaWriter.cxx:45
 TMonaLisaWriter.cxx:46
 TMonaLisaWriter.cxx:47
 TMonaLisaWriter.cxx:48
 TMonaLisaWriter.cxx:49
 TMonaLisaWriter.cxx:50
 TMonaLisaWriter.cxx:51
 TMonaLisaWriter.cxx:52
 TMonaLisaWriter.cxx:53
 TMonaLisaWriter.cxx:54
 TMonaLisaWriter.cxx:55
 TMonaLisaWriter.cxx:56
 TMonaLisaWriter.cxx:57
 TMonaLisaWriter.cxx:58
 TMonaLisaWriter.cxx:59
 TMonaLisaWriter.cxx:60
 TMonaLisaWriter.cxx:61
 TMonaLisaWriter.cxx:62
 TMonaLisaWriter.cxx:63
 TMonaLisaWriter.cxx:64
 TMonaLisaWriter.cxx:65
 TMonaLisaWriter.cxx:66
 TMonaLisaWriter.cxx:67
 TMonaLisaWriter.cxx:68
 TMonaLisaWriter.cxx:69
 TMonaLisaWriter.cxx:70
 TMonaLisaWriter.cxx:71
 TMonaLisaWriter.cxx:72
 TMonaLisaWriter.cxx:73
 TMonaLisaWriter.cxx:74
 TMonaLisaWriter.cxx:75
 TMonaLisaWriter.cxx:76
 TMonaLisaWriter.cxx:77
 TMonaLisaWriter.cxx:78
 TMonaLisaWriter.cxx:79
 TMonaLisaWriter.cxx:80
 TMonaLisaWriter.cxx:81
 TMonaLisaWriter.cxx:82
 TMonaLisaWriter.cxx:83
 TMonaLisaWriter.cxx:84
 TMonaLisaWriter.cxx:85
 TMonaLisaWriter.cxx:86
 TMonaLisaWriter.cxx:87
 TMonaLisaWriter.cxx:88
 TMonaLisaWriter.cxx:89
 TMonaLisaWriter.cxx:90
 TMonaLisaWriter.cxx:91
 TMonaLisaWriter.cxx:92
 TMonaLisaWriter.cxx:93
 TMonaLisaWriter.cxx:94
 TMonaLisaWriter.cxx:95
 TMonaLisaWriter.cxx:96
 TMonaLisaWriter.cxx:97
 TMonaLisaWriter.cxx:98
 TMonaLisaWriter.cxx:99
 TMonaLisaWriter.cxx:100
 TMonaLisaWriter.cxx:101
 TMonaLisaWriter.cxx:102
 TMonaLisaWriter.cxx:103
 TMonaLisaWriter.cxx:104
 TMonaLisaWriter.cxx:105
 TMonaLisaWriter.cxx:106
 TMonaLisaWriter.cxx:107
 TMonaLisaWriter.cxx:108
 TMonaLisaWriter.cxx:109
 TMonaLisaWriter.cxx:110
 TMonaLisaWriter.cxx:111
 TMonaLisaWriter.cxx:112
 TMonaLisaWriter.cxx:113
 TMonaLisaWriter.cxx:114
 TMonaLisaWriter.cxx:115
 TMonaLisaWriter.cxx:116
 TMonaLisaWriter.cxx:117
 TMonaLisaWriter.cxx:118
 TMonaLisaWriter.cxx:119
 TMonaLisaWriter.cxx:120
 TMonaLisaWriter.cxx:121
 TMonaLisaWriter.cxx:122
 TMonaLisaWriter.cxx:123
 TMonaLisaWriter.cxx:124
 TMonaLisaWriter.cxx:125
 TMonaLisaWriter.cxx:126
 TMonaLisaWriter.cxx:127
 TMonaLisaWriter.cxx:128
 TMonaLisaWriter.cxx:129
 TMonaLisaWriter.cxx:130
 TMonaLisaWriter.cxx:131
 TMonaLisaWriter.cxx:132
 TMonaLisaWriter.cxx:133
 TMonaLisaWriter.cxx:134
 TMonaLisaWriter.cxx:135
 TMonaLisaWriter.cxx:136
 TMonaLisaWriter.cxx:137
 TMonaLisaWriter.cxx:138
 TMonaLisaWriter.cxx:139
 TMonaLisaWriter.cxx:140
 TMonaLisaWriter.cxx:141
 TMonaLisaWriter.cxx:142
 TMonaLisaWriter.cxx:143
 TMonaLisaWriter.cxx:144
 TMonaLisaWriter.cxx:145
 TMonaLisaWriter.cxx:146
 TMonaLisaWriter.cxx:147
 TMonaLisaWriter.cxx:148
 TMonaLisaWriter.cxx:149
 TMonaLisaWriter.cxx:150
 TMonaLisaWriter.cxx:151
 TMonaLisaWriter.cxx:152
 TMonaLisaWriter.cxx:153
 TMonaLisaWriter.cxx:154
 TMonaLisaWriter.cxx:155
 TMonaLisaWriter.cxx:156
 TMonaLisaWriter.cxx:157
 TMonaLisaWriter.cxx:158
 TMonaLisaWriter.cxx:159
 TMonaLisaWriter.cxx:160
 TMonaLisaWriter.cxx:161
 TMonaLisaWriter.cxx:162
 TMonaLisaWriter.cxx:163
 TMonaLisaWriter.cxx:164
 TMonaLisaWriter.cxx:165
 TMonaLisaWriter.cxx:166
 TMonaLisaWriter.cxx:167
 TMonaLisaWriter.cxx:168
 TMonaLisaWriter.cxx:169
 TMonaLisaWriter.cxx:170
 TMonaLisaWriter.cxx:171
 TMonaLisaWriter.cxx:172
 TMonaLisaWriter.cxx:173
 TMonaLisaWriter.cxx:174
 TMonaLisaWriter.cxx:175
 TMonaLisaWriter.cxx:176
 TMonaLisaWriter.cxx:177
 TMonaLisaWriter.cxx:178
 TMonaLisaWriter.cxx:179
 TMonaLisaWriter.cxx:180
 TMonaLisaWriter.cxx:181
 TMonaLisaWriter.cxx:182
 TMonaLisaWriter.cxx:183
 TMonaLisaWriter.cxx:184
 TMonaLisaWriter.cxx:185
 TMonaLisaWriter.cxx:186
 TMonaLisaWriter.cxx:187
 TMonaLisaWriter.cxx:188
 TMonaLisaWriter.cxx:189
 TMonaLisaWriter.cxx:190
 TMonaLisaWriter.cxx:191
 TMonaLisaWriter.cxx:192
 TMonaLisaWriter.cxx:193
 TMonaLisaWriter.cxx:194
 TMonaLisaWriter.cxx:195
 TMonaLisaWriter.cxx:196
 TMonaLisaWriter.cxx:197
 TMonaLisaWriter.cxx:198
 TMonaLisaWriter.cxx:199
 TMonaLisaWriter.cxx:200
 TMonaLisaWriter.cxx:201
 TMonaLisaWriter.cxx:202
 TMonaLisaWriter.cxx:203
 TMonaLisaWriter.cxx:204
 TMonaLisaWriter.cxx:205
 TMonaLisaWriter.cxx:206
 TMonaLisaWriter.cxx:207
 TMonaLisaWriter.cxx:208
 TMonaLisaWriter.cxx:209
 TMonaLisaWriter.cxx:210
 TMonaLisaWriter.cxx:211
 TMonaLisaWriter.cxx:212
 TMonaLisaWriter.cxx:213
 TMonaLisaWriter.cxx:214
 TMonaLisaWriter.cxx:215
 TMonaLisaWriter.cxx:216
 TMonaLisaWriter.cxx:217
 TMonaLisaWriter.cxx:218
 TMonaLisaWriter.cxx:219
 TMonaLisaWriter.cxx:220
 TMonaLisaWriter.cxx:221
 TMonaLisaWriter.cxx:222
 TMonaLisaWriter.cxx:223
 TMonaLisaWriter.cxx:224
 TMonaLisaWriter.cxx:225
 TMonaLisaWriter.cxx:226
 TMonaLisaWriter.cxx:227
 TMonaLisaWriter.cxx:228
 TMonaLisaWriter.cxx:229
 TMonaLisaWriter.cxx:230
 TMonaLisaWriter.cxx:231
 TMonaLisaWriter.cxx:232
 TMonaLisaWriter.cxx:233
 TMonaLisaWriter.cxx:234
 TMonaLisaWriter.cxx:235
 TMonaLisaWriter.cxx:236
 TMonaLisaWriter.cxx:237
 TMonaLisaWriter.cxx:238
 TMonaLisaWriter.cxx:239
 TMonaLisaWriter.cxx:240
 TMonaLisaWriter.cxx:241
 TMonaLisaWriter.cxx:242
 TMonaLisaWriter.cxx:243
 TMonaLisaWriter.cxx:244
 TMonaLisaWriter.cxx:245
 TMonaLisaWriter.cxx:246
 TMonaLisaWriter.cxx:247
 TMonaLisaWriter.cxx:248
 TMonaLisaWriter.cxx:249
 TMonaLisaWriter.cxx:250
 TMonaLisaWriter.cxx:251
 TMonaLisaWriter.cxx:252
 TMonaLisaWriter.cxx:253
 TMonaLisaWriter.cxx:254
 TMonaLisaWriter.cxx:255
 TMonaLisaWriter.cxx:256
 TMonaLisaWriter.cxx:257
 TMonaLisaWriter.cxx:258
 TMonaLisaWriter.cxx:259
 TMonaLisaWriter.cxx:260
 TMonaLisaWriter.cxx:261
 TMonaLisaWriter.cxx:262
 TMonaLisaWriter.cxx:263
 TMonaLisaWriter.cxx:264
 TMonaLisaWriter.cxx:265
 TMonaLisaWriter.cxx:266
 TMonaLisaWriter.cxx:267
 TMonaLisaWriter.cxx:268
 TMonaLisaWriter.cxx:269
 TMonaLisaWriter.cxx:270
 TMonaLisaWriter.cxx:271
 TMonaLisaWriter.cxx:272
 TMonaLisaWriter.cxx:273
 TMonaLisaWriter.cxx:274
 TMonaLisaWriter.cxx:275
 TMonaLisaWriter.cxx:276
 TMonaLisaWriter.cxx:277
 TMonaLisaWriter.cxx:278
 TMonaLisaWriter.cxx:279
 TMonaLisaWriter.cxx:280
 TMonaLisaWriter.cxx:281
 TMonaLisaWriter.cxx:282
 TMonaLisaWriter.cxx:283
 TMonaLisaWriter.cxx:284
 TMonaLisaWriter.cxx:285
 TMonaLisaWriter.cxx:286
 TMonaLisaWriter.cxx:287
 TMonaLisaWriter.cxx:288
 TMonaLisaWriter.cxx:289
 TMonaLisaWriter.cxx:290
 TMonaLisaWriter.cxx:291
 TMonaLisaWriter.cxx:292
 TMonaLisaWriter.cxx:293
 TMonaLisaWriter.cxx:294
 TMonaLisaWriter.cxx:295
 TMonaLisaWriter.cxx:296
 TMonaLisaWriter.cxx:297
 TMonaLisaWriter.cxx:298
 TMonaLisaWriter.cxx:299
 TMonaLisaWriter.cxx:300
 TMonaLisaWriter.cxx:301
 TMonaLisaWriter.cxx:302
 TMonaLisaWriter.cxx:303
 TMonaLisaWriter.cxx:304
 TMonaLisaWriter.cxx:305
 TMonaLisaWriter.cxx:306
 TMonaLisaWriter.cxx:307
 TMonaLisaWriter.cxx:308
 TMonaLisaWriter.cxx:309
 TMonaLisaWriter.cxx:310
 TMonaLisaWriter.cxx:311
 TMonaLisaWriter.cxx:312
 TMonaLisaWriter.cxx:313
 TMonaLisaWriter.cxx:314
 TMonaLisaWriter.cxx:315
 TMonaLisaWriter.cxx:316
 TMonaLisaWriter.cxx:317
 TMonaLisaWriter.cxx:318
 TMonaLisaWriter.cxx:319
 TMonaLisaWriter.cxx:320
 TMonaLisaWriter.cxx:321
 TMonaLisaWriter.cxx:322
 TMonaLisaWriter.cxx:323
 TMonaLisaWriter.cxx:324
 TMonaLisaWriter.cxx:325
 TMonaLisaWriter.cxx:326
 TMonaLisaWriter.cxx:327
 TMonaLisaWriter.cxx:328
 TMonaLisaWriter.cxx:329
 TMonaLisaWriter.cxx:330
 TMonaLisaWriter.cxx:331
 TMonaLisaWriter.cxx:332
 TMonaLisaWriter.cxx:333
 TMonaLisaWriter.cxx:334
 TMonaLisaWriter.cxx:335
 TMonaLisaWriter.cxx:336
 TMonaLisaWriter.cxx:337
 TMonaLisaWriter.cxx:338
 TMonaLisaWriter.cxx:339
 TMonaLisaWriter.cxx:340
 TMonaLisaWriter.cxx:341
 TMonaLisaWriter.cxx:342
 TMonaLisaWriter.cxx:343
 TMonaLisaWriter.cxx:344
 TMonaLisaWriter.cxx:345
 TMonaLisaWriter.cxx:346
 TMonaLisaWriter.cxx:347
 TMonaLisaWriter.cxx:348
 TMonaLisaWriter.cxx:349
 TMonaLisaWriter.cxx:350
 TMonaLisaWriter.cxx:351
 TMonaLisaWriter.cxx:352
 TMonaLisaWriter.cxx:353
 TMonaLisaWriter.cxx:354
 TMonaLisaWriter.cxx:355
 TMonaLisaWriter.cxx:356
 TMonaLisaWriter.cxx:357
 TMonaLisaWriter.cxx:358
 TMonaLisaWriter.cxx:359
 TMonaLisaWriter.cxx:360
 TMonaLisaWriter.cxx:361
 TMonaLisaWriter.cxx:362
 TMonaLisaWriter.cxx:363
 TMonaLisaWriter.cxx:364
 TMonaLisaWriter.cxx:365
 TMonaLisaWriter.cxx:366
 TMonaLisaWriter.cxx:367
 TMonaLisaWriter.cxx:368
 TMonaLisaWriter.cxx:369
 TMonaLisaWriter.cxx:370
 TMonaLisaWriter.cxx:371
 TMonaLisaWriter.cxx:372
 TMonaLisaWriter.cxx:373
 TMonaLisaWriter.cxx:374
 TMonaLisaWriter.cxx:375
 TMonaLisaWriter.cxx:376
 TMonaLisaWriter.cxx:377
 TMonaLisaWriter.cxx:378
 TMonaLisaWriter.cxx:379
 TMonaLisaWriter.cxx:380
 TMonaLisaWriter.cxx:381
 TMonaLisaWriter.cxx:382
 TMonaLisaWriter.cxx:383
 TMonaLisaWriter.cxx:384
 TMonaLisaWriter.cxx:385
 TMonaLisaWriter.cxx:386
 TMonaLisaWriter.cxx:387
 TMonaLisaWriter.cxx:388
 TMonaLisaWriter.cxx:389
 TMonaLisaWriter.cxx:390
 TMonaLisaWriter.cxx:391
 TMonaLisaWriter.cxx:392
 TMonaLisaWriter.cxx:393
 TMonaLisaWriter.cxx:394
 TMonaLisaWriter.cxx:395
 TMonaLisaWriter.cxx:396
 TMonaLisaWriter.cxx:397
 TMonaLisaWriter.cxx:398
 TMonaLisaWriter.cxx:399
 TMonaLisaWriter.cxx:400
 TMonaLisaWriter.cxx:401
 TMonaLisaWriter.cxx:402
 TMonaLisaWriter.cxx:403
 TMonaLisaWriter.cxx:404
 TMonaLisaWriter.cxx:405
 TMonaLisaWriter.cxx:406
 TMonaLisaWriter.cxx:407
 TMonaLisaWriter.cxx:408
 TMonaLisaWriter.cxx:409
 TMonaLisaWriter.cxx:410
 TMonaLisaWriter.cxx:411
 TMonaLisaWriter.cxx:412
 TMonaLisaWriter.cxx:413
 TMonaLisaWriter.cxx:414
 TMonaLisaWriter.cxx:415
 TMonaLisaWriter.cxx:416
 TMonaLisaWriter.cxx:417
 TMonaLisaWriter.cxx:418
 TMonaLisaWriter.cxx:419
 TMonaLisaWriter.cxx:420
 TMonaLisaWriter.cxx:421
 TMonaLisaWriter.cxx:422
 TMonaLisaWriter.cxx:423
 TMonaLisaWriter.cxx:424
 TMonaLisaWriter.cxx:425
 TMonaLisaWriter.cxx:426
 TMonaLisaWriter.cxx:427
 TMonaLisaWriter.cxx:428
 TMonaLisaWriter.cxx:429
 TMonaLisaWriter.cxx:430
 TMonaLisaWriter.cxx:431
 TMonaLisaWriter.cxx:432
 TMonaLisaWriter.cxx:433
 TMonaLisaWriter.cxx:434
 TMonaLisaWriter.cxx:435
 TMonaLisaWriter.cxx:436
 TMonaLisaWriter.cxx:437
 TMonaLisaWriter.cxx:438
 TMonaLisaWriter.cxx:439
 TMonaLisaWriter.cxx:440
 TMonaLisaWriter.cxx:441
 TMonaLisaWriter.cxx:442
 TMonaLisaWriter.cxx:443
 TMonaLisaWriter.cxx:444
 TMonaLisaWriter.cxx:445
 TMonaLisaWriter.cxx:446
 TMonaLisaWriter.cxx:447
 TMonaLisaWriter.cxx:448
 TMonaLisaWriter.cxx:449
 TMonaLisaWriter.cxx:450
 TMonaLisaWriter.cxx:451
 TMonaLisaWriter.cxx:452
 TMonaLisaWriter.cxx:453
 TMonaLisaWriter.cxx:454
 TMonaLisaWriter.cxx:455
 TMonaLisaWriter.cxx:456
 TMonaLisaWriter.cxx:457
 TMonaLisaWriter.cxx:458
 TMonaLisaWriter.cxx:459
 TMonaLisaWriter.cxx:460
 TMonaLisaWriter.cxx:461
 TMonaLisaWriter.cxx:462
 TMonaLisaWriter.cxx:463
 TMonaLisaWriter.cxx:464
 TMonaLisaWriter.cxx:465
 TMonaLisaWriter.cxx:466
 TMonaLisaWriter.cxx:467
 TMonaLisaWriter.cxx:468
 TMonaLisaWriter.cxx:469
 TMonaLisaWriter.cxx:470
 TMonaLisaWriter.cxx:471
 TMonaLisaWriter.cxx:472
 TMonaLisaWriter.cxx:473
 TMonaLisaWriter.cxx:474
 TMonaLisaWriter.cxx:475
 TMonaLisaWriter.cxx:476
 TMonaLisaWriter.cxx:477
 TMonaLisaWriter.cxx:478
 TMonaLisaWriter.cxx:479
 TMonaLisaWriter.cxx:480
 TMonaLisaWriter.cxx:481
 TMonaLisaWriter.cxx:482
 TMonaLisaWriter.cxx:483
 TMonaLisaWriter.cxx:484
 TMonaLisaWriter.cxx:485
 TMonaLisaWriter.cxx:486
 TMonaLisaWriter.cxx:487
 TMonaLisaWriter.cxx:488
 TMonaLisaWriter.cxx:489
 TMonaLisaWriter.cxx:490
 TMonaLisaWriter.cxx:491
 TMonaLisaWriter.cxx:492
 TMonaLisaWriter.cxx:493
 TMonaLisaWriter.cxx:494
 TMonaLisaWriter.cxx:495
 TMonaLisaWriter.cxx:496
 TMonaLisaWriter.cxx:497
 TMonaLisaWriter.cxx:498
 TMonaLisaWriter.cxx:499
 TMonaLisaWriter.cxx:500
 TMonaLisaWriter.cxx:501
 TMonaLisaWriter.cxx:502
 TMonaLisaWriter.cxx:503
 TMonaLisaWriter.cxx:504
 TMonaLisaWriter.cxx:505
 TMonaLisaWriter.cxx:506
 TMonaLisaWriter.cxx:507
 TMonaLisaWriter.cxx:508
 TMonaLisaWriter.cxx:509
 TMonaLisaWriter.cxx:510
 TMonaLisaWriter.cxx:511
 TMonaLisaWriter.cxx:512
 TMonaLisaWriter.cxx:513
 TMonaLisaWriter.cxx:514
 TMonaLisaWriter.cxx:515
 TMonaLisaWriter.cxx:516
 TMonaLisaWriter.cxx:517
 TMonaLisaWriter.cxx:518
 TMonaLisaWriter.cxx:519
 TMonaLisaWriter.cxx:520
 TMonaLisaWriter.cxx:521
 TMonaLisaWriter.cxx:522
 TMonaLisaWriter.cxx:523
 TMonaLisaWriter.cxx:524
 TMonaLisaWriter.cxx:525
 TMonaLisaWriter.cxx:526
 TMonaLisaWriter.cxx:527
 TMonaLisaWriter.cxx:528
 TMonaLisaWriter.cxx:529
 TMonaLisaWriter.cxx:530
 TMonaLisaWriter.cxx:531
 TMonaLisaWriter.cxx:532
 TMonaLisaWriter.cxx:533
 TMonaLisaWriter.cxx:534
 TMonaLisaWriter.cxx:535
 TMonaLisaWriter.cxx:536
 TMonaLisaWriter.cxx:537
 TMonaLisaWriter.cxx:538
 TMonaLisaWriter.cxx:539
 TMonaLisaWriter.cxx:540
 TMonaLisaWriter.cxx:541
 TMonaLisaWriter.cxx:542
 TMonaLisaWriter.cxx:543
 TMonaLisaWriter.cxx:544
 TMonaLisaWriter.cxx:545
 TMonaLisaWriter.cxx:546
 TMonaLisaWriter.cxx:547
 TMonaLisaWriter.cxx:548
 TMonaLisaWriter.cxx:549
 TMonaLisaWriter.cxx:550
 TMonaLisaWriter.cxx:551
 TMonaLisaWriter.cxx:552
 TMonaLisaWriter.cxx:553
 TMonaLisaWriter.cxx:554
 TMonaLisaWriter.cxx:555
 TMonaLisaWriter.cxx:556
 TMonaLisaWriter.cxx:557
 TMonaLisaWriter.cxx:558
 TMonaLisaWriter.cxx:559
 TMonaLisaWriter.cxx:560
 TMonaLisaWriter.cxx:561
 TMonaLisaWriter.cxx:562
 TMonaLisaWriter.cxx:563
 TMonaLisaWriter.cxx:564
 TMonaLisaWriter.cxx:565
 TMonaLisaWriter.cxx:566
 TMonaLisaWriter.cxx:567
 TMonaLisaWriter.cxx:568
 TMonaLisaWriter.cxx:569
 TMonaLisaWriter.cxx:570
 TMonaLisaWriter.cxx:571
 TMonaLisaWriter.cxx:572
 TMonaLisaWriter.cxx:573
 TMonaLisaWriter.cxx:574
 TMonaLisaWriter.cxx:575
 TMonaLisaWriter.cxx:576
 TMonaLisaWriter.cxx:577
 TMonaLisaWriter.cxx:578
 TMonaLisaWriter.cxx:579
 TMonaLisaWriter.cxx:580
 TMonaLisaWriter.cxx:581
 TMonaLisaWriter.cxx:582
 TMonaLisaWriter.cxx:583
 TMonaLisaWriter.cxx:584
 TMonaLisaWriter.cxx:585
 TMonaLisaWriter.cxx:586
 TMonaLisaWriter.cxx:587
 TMonaLisaWriter.cxx:588
 TMonaLisaWriter.cxx:589
 TMonaLisaWriter.cxx:590
 TMonaLisaWriter.cxx:591
 TMonaLisaWriter.cxx:592
 TMonaLisaWriter.cxx:593
 TMonaLisaWriter.cxx:594
 TMonaLisaWriter.cxx:595
 TMonaLisaWriter.cxx:596
 TMonaLisaWriter.cxx:597
 TMonaLisaWriter.cxx:598
 TMonaLisaWriter.cxx:599
 TMonaLisaWriter.cxx:600
 TMonaLisaWriter.cxx:601
 TMonaLisaWriter.cxx:602
 TMonaLisaWriter.cxx:603
 TMonaLisaWriter.cxx:604
 TMonaLisaWriter.cxx:605
 TMonaLisaWriter.cxx:606
 TMonaLisaWriter.cxx:607
 TMonaLisaWriter.cxx:608
 TMonaLisaWriter.cxx:609
 TMonaLisaWriter.cxx:610
 TMonaLisaWriter.cxx:611
 TMonaLisaWriter.cxx:612
 TMonaLisaWriter.cxx:613
 TMonaLisaWriter.cxx:614
 TMonaLisaWriter.cxx:615
 TMonaLisaWriter.cxx:616
 TMonaLisaWriter.cxx:617
 TMonaLisaWriter.cxx:618
 TMonaLisaWriter.cxx:619
 TMonaLisaWriter.cxx:620
 TMonaLisaWriter.cxx:621
 TMonaLisaWriter.cxx:622
 TMonaLisaWriter.cxx:623
 TMonaLisaWriter.cxx:624
 TMonaLisaWriter.cxx:625
 TMonaLisaWriter.cxx:626
 TMonaLisaWriter.cxx:627
 TMonaLisaWriter.cxx:628
 TMonaLisaWriter.cxx:629
 TMonaLisaWriter.cxx:630
 TMonaLisaWriter.cxx:631
 TMonaLisaWriter.cxx:632
 TMonaLisaWriter.cxx:633
 TMonaLisaWriter.cxx:634
 TMonaLisaWriter.cxx:635
 TMonaLisaWriter.cxx:636
 TMonaLisaWriter.cxx:637
 TMonaLisaWriter.cxx:638
 TMonaLisaWriter.cxx:639
 TMonaLisaWriter.cxx:640
 TMonaLisaWriter.cxx:641
 TMonaLisaWriter.cxx:642
 TMonaLisaWriter.cxx:643
 TMonaLisaWriter.cxx:644
 TMonaLisaWriter.cxx:645
 TMonaLisaWriter.cxx:646
 TMonaLisaWriter.cxx:647
 TMonaLisaWriter.cxx:648
 TMonaLisaWriter.cxx:649
 TMonaLisaWriter.cxx:650
 TMonaLisaWriter.cxx:651
 TMonaLisaWriter.cxx:652
 TMonaLisaWriter.cxx:653
 TMonaLisaWriter.cxx:654
 TMonaLisaWriter.cxx:655
 TMonaLisaWriter.cxx:656
 TMonaLisaWriter.cxx:657
 TMonaLisaWriter.cxx:658
 TMonaLisaWriter.cxx:659
 TMonaLisaWriter.cxx:660
 TMonaLisaWriter.cxx:661
 TMonaLisaWriter.cxx:662
 TMonaLisaWriter.cxx:663
 TMonaLisaWriter.cxx:664
 TMonaLisaWriter.cxx:665
 TMonaLisaWriter.cxx:666
 TMonaLisaWriter.cxx:667
 TMonaLisaWriter.cxx:668
 TMonaLisaWriter.cxx:669
 TMonaLisaWriter.cxx:670
 TMonaLisaWriter.cxx:671
 TMonaLisaWriter.cxx:672
 TMonaLisaWriter.cxx:673
 TMonaLisaWriter.cxx:674
 TMonaLisaWriter.cxx:675
 TMonaLisaWriter.cxx:676
 TMonaLisaWriter.cxx:677
 TMonaLisaWriter.cxx:678
 TMonaLisaWriter.cxx:679
 TMonaLisaWriter.cxx:680
 TMonaLisaWriter.cxx:681
 TMonaLisaWriter.cxx:682
 TMonaLisaWriter.cxx:683
 TMonaLisaWriter.cxx:684
 TMonaLisaWriter.cxx:685
 TMonaLisaWriter.cxx:686
 TMonaLisaWriter.cxx:687
 TMonaLisaWriter.cxx:688
 TMonaLisaWriter.cxx:689
 TMonaLisaWriter.cxx:690
 TMonaLisaWriter.cxx:691
 TMonaLisaWriter.cxx:692
 TMonaLisaWriter.cxx:693
 TMonaLisaWriter.cxx:694
 TMonaLisaWriter.cxx:695
 TMonaLisaWriter.cxx:696
 TMonaLisaWriter.cxx:697
 TMonaLisaWriter.cxx:698
 TMonaLisaWriter.cxx:699
 TMonaLisaWriter.cxx:700
 TMonaLisaWriter.cxx:701
 TMonaLisaWriter.cxx:702
 TMonaLisaWriter.cxx:703
 TMonaLisaWriter.cxx:704
 TMonaLisaWriter.cxx:705
 TMonaLisaWriter.cxx:706
 TMonaLisaWriter.cxx:707
 TMonaLisaWriter.cxx:708
 TMonaLisaWriter.cxx:709
 TMonaLisaWriter.cxx:710
 TMonaLisaWriter.cxx:711
 TMonaLisaWriter.cxx:712
 TMonaLisaWriter.cxx:713
 TMonaLisaWriter.cxx:714
 TMonaLisaWriter.cxx:715
 TMonaLisaWriter.cxx:716
 TMonaLisaWriter.cxx:717
 TMonaLisaWriter.cxx:718
 TMonaLisaWriter.cxx:719
 TMonaLisaWriter.cxx:720
 TMonaLisaWriter.cxx:721
 TMonaLisaWriter.cxx:722
 TMonaLisaWriter.cxx:723
 TMonaLisaWriter.cxx:724
 TMonaLisaWriter.cxx:725
 TMonaLisaWriter.cxx:726
 TMonaLisaWriter.cxx:727
 TMonaLisaWriter.cxx:728
 TMonaLisaWriter.cxx:729
 TMonaLisaWriter.cxx:730
 TMonaLisaWriter.cxx:731
 TMonaLisaWriter.cxx:732
 TMonaLisaWriter.cxx:733
 TMonaLisaWriter.cxx:734
 TMonaLisaWriter.cxx:735
 TMonaLisaWriter.cxx:736
 TMonaLisaWriter.cxx:737
 TMonaLisaWriter.cxx:738
 TMonaLisaWriter.cxx:739
 TMonaLisaWriter.cxx:740
 TMonaLisaWriter.cxx:741
 TMonaLisaWriter.cxx:742
 TMonaLisaWriter.cxx:743
 TMonaLisaWriter.cxx:744
 TMonaLisaWriter.cxx:745
 TMonaLisaWriter.cxx:746
 TMonaLisaWriter.cxx:747
 TMonaLisaWriter.cxx:748
 TMonaLisaWriter.cxx:749
 TMonaLisaWriter.cxx:750
 TMonaLisaWriter.cxx:751
 TMonaLisaWriter.cxx:752
 TMonaLisaWriter.cxx:753
 TMonaLisaWriter.cxx:754
 TMonaLisaWriter.cxx:755
 TMonaLisaWriter.cxx:756
 TMonaLisaWriter.cxx:757
 TMonaLisaWriter.cxx:758
 TMonaLisaWriter.cxx:759
 TMonaLisaWriter.cxx:760
 TMonaLisaWriter.cxx:761
 TMonaLisaWriter.cxx:762
 TMonaLisaWriter.cxx:763
 TMonaLisaWriter.cxx:764
 TMonaLisaWriter.cxx:765
 TMonaLisaWriter.cxx:766
 TMonaLisaWriter.cxx:767
 TMonaLisaWriter.cxx:768
 TMonaLisaWriter.cxx:769
 TMonaLisaWriter.cxx:770
 TMonaLisaWriter.cxx:771
 TMonaLisaWriter.cxx:772
 TMonaLisaWriter.cxx:773
 TMonaLisaWriter.cxx:774
 TMonaLisaWriter.cxx:775
 TMonaLisaWriter.cxx:776
 TMonaLisaWriter.cxx:777
 TMonaLisaWriter.cxx:778
 TMonaLisaWriter.cxx:779
 TMonaLisaWriter.cxx:780
 TMonaLisaWriter.cxx:781
 TMonaLisaWriter.cxx:782
 TMonaLisaWriter.cxx:783
 TMonaLisaWriter.cxx:784
 TMonaLisaWriter.cxx:785
 TMonaLisaWriter.cxx:786
 TMonaLisaWriter.cxx:787
 TMonaLisaWriter.cxx:788
 TMonaLisaWriter.cxx:789
 TMonaLisaWriter.cxx:790
 TMonaLisaWriter.cxx:791
 TMonaLisaWriter.cxx:792
 TMonaLisaWriter.cxx:793
 TMonaLisaWriter.cxx:794
 TMonaLisaWriter.cxx:795
 TMonaLisaWriter.cxx:796
 TMonaLisaWriter.cxx:797
 TMonaLisaWriter.cxx:798
 TMonaLisaWriter.cxx:799
 TMonaLisaWriter.cxx:800
 TMonaLisaWriter.cxx:801
 TMonaLisaWriter.cxx:802
 TMonaLisaWriter.cxx:803
 TMonaLisaWriter.cxx:804
 TMonaLisaWriter.cxx:805
 TMonaLisaWriter.cxx:806
 TMonaLisaWriter.cxx:807
 TMonaLisaWriter.cxx:808
 TMonaLisaWriter.cxx:809
 TMonaLisaWriter.cxx:810
 TMonaLisaWriter.cxx:811
 TMonaLisaWriter.cxx:812
 TMonaLisaWriter.cxx:813
 TMonaLisaWriter.cxx:814
 TMonaLisaWriter.cxx:815
 TMonaLisaWriter.cxx:816
 TMonaLisaWriter.cxx:817
 TMonaLisaWriter.cxx:818
 TMonaLisaWriter.cxx:819
 TMonaLisaWriter.cxx:820
 TMonaLisaWriter.cxx:821
 TMonaLisaWriter.cxx:822
 TMonaLisaWriter.cxx:823
 TMonaLisaWriter.cxx:824
 TMonaLisaWriter.cxx:825
 TMonaLisaWriter.cxx:826
 TMonaLisaWriter.cxx:827
 TMonaLisaWriter.cxx:828
 TMonaLisaWriter.cxx:829
 TMonaLisaWriter.cxx:830
 TMonaLisaWriter.cxx:831
 TMonaLisaWriter.cxx:832
 TMonaLisaWriter.cxx:833
 TMonaLisaWriter.cxx:834
 TMonaLisaWriter.cxx:835
 TMonaLisaWriter.cxx:836
 TMonaLisaWriter.cxx:837
 TMonaLisaWriter.cxx:838
 TMonaLisaWriter.cxx:839
 TMonaLisaWriter.cxx:840
 TMonaLisaWriter.cxx:841
 TMonaLisaWriter.cxx:842
 TMonaLisaWriter.cxx:843
 TMonaLisaWriter.cxx:844
 TMonaLisaWriter.cxx:845
 TMonaLisaWriter.cxx:846
 TMonaLisaWriter.cxx:847
 TMonaLisaWriter.cxx:848
 TMonaLisaWriter.cxx:849
 TMonaLisaWriter.cxx:850
 TMonaLisaWriter.cxx:851
 TMonaLisaWriter.cxx:852
 TMonaLisaWriter.cxx:853
 TMonaLisaWriter.cxx:854
 TMonaLisaWriter.cxx:855
 TMonaLisaWriter.cxx:856
 TMonaLisaWriter.cxx:857
 TMonaLisaWriter.cxx:858
 TMonaLisaWriter.cxx:859
 TMonaLisaWriter.cxx:860
 TMonaLisaWriter.cxx:861
 TMonaLisaWriter.cxx:862
 TMonaLisaWriter.cxx:863
 TMonaLisaWriter.cxx:864
 TMonaLisaWriter.cxx:865
 TMonaLisaWriter.cxx:866
 TMonaLisaWriter.cxx:867
 TMonaLisaWriter.cxx:868
 TMonaLisaWriter.cxx:869
 TMonaLisaWriter.cxx:870
 TMonaLisaWriter.cxx:871
 TMonaLisaWriter.cxx:872
 TMonaLisaWriter.cxx:873
 TMonaLisaWriter.cxx:874
 TMonaLisaWriter.cxx:875
 TMonaLisaWriter.cxx:876
 TMonaLisaWriter.cxx:877
 TMonaLisaWriter.cxx:878
 TMonaLisaWriter.cxx:879
 TMonaLisaWriter.cxx:880
 TMonaLisaWriter.cxx:881
 TMonaLisaWriter.cxx:882
 TMonaLisaWriter.cxx:883
 TMonaLisaWriter.cxx:884
 TMonaLisaWriter.cxx:885
 TMonaLisaWriter.cxx:886
 TMonaLisaWriter.cxx:887
 TMonaLisaWriter.cxx:888
 TMonaLisaWriter.cxx:889
 TMonaLisaWriter.cxx:890
 TMonaLisaWriter.cxx:891
 TMonaLisaWriter.cxx:892
 TMonaLisaWriter.cxx:893
 TMonaLisaWriter.cxx:894
 TMonaLisaWriter.cxx:895
 TMonaLisaWriter.cxx:896
 TMonaLisaWriter.cxx:897
 TMonaLisaWriter.cxx:898
 TMonaLisaWriter.cxx:899
 TMonaLisaWriter.cxx:900
 TMonaLisaWriter.cxx:901
 TMonaLisaWriter.cxx:902
 TMonaLisaWriter.cxx:903
 TMonaLisaWriter.cxx:904
 TMonaLisaWriter.cxx:905
 TMonaLisaWriter.cxx:906
 TMonaLisaWriter.cxx:907
 TMonaLisaWriter.cxx:908
 TMonaLisaWriter.cxx:909
 TMonaLisaWriter.cxx:910
 TMonaLisaWriter.cxx:911
 TMonaLisaWriter.cxx:912
 TMonaLisaWriter.cxx:913
 TMonaLisaWriter.cxx:914
 TMonaLisaWriter.cxx:915
 TMonaLisaWriter.cxx:916
 TMonaLisaWriter.cxx:917
 TMonaLisaWriter.cxx:918
 TMonaLisaWriter.cxx:919
 TMonaLisaWriter.cxx:920
 TMonaLisaWriter.cxx:921
 TMonaLisaWriter.cxx:922
 TMonaLisaWriter.cxx:923
 TMonaLisaWriter.cxx:924
 TMonaLisaWriter.cxx:925
 TMonaLisaWriter.cxx:926
 TMonaLisaWriter.cxx:927
 TMonaLisaWriter.cxx:928
 TMonaLisaWriter.cxx:929
 TMonaLisaWriter.cxx:930
 TMonaLisaWriter.cxx:931
 TMonaLisaWriter.cxx:932
 TMonaLisaWriter.cxx:933
 TMonaLisaWriter.cxx:934
 TMonaLisaWriter.cxx:935
 TMonaLisaWriter.cxx:936
 TMonaLisaWriter.cxx:937
 TMonaLisaWriter.cxx:938
 TMonaLisaWriter.cxx:939
 TMonaLisaWriter.cxx:940
 TMonaLisaWriter.cxx:941
 TMonaLisaWriter.cxx:942
 TMonaLisaWriter.cxx:943
 TMonaLisaWriter.cxx:944
 TMonaLisaWriter.cxx:945
 TMonaLisaWriter.cxx:946
 TMonaLisaWriter.cxx:947
 TMonaLisaWriter.cxx:948
 TMonaLisaWriter.cxx:949
 TMonaLisaWriter.cxx:950
 TMonaLisaWriter.cxx:951
 TMonaLisaWriter.cxx:952
 TMonaLisaWriter.cxx:953
 TMonaLisaWriter.cxx:954
 TMonaLisaWriter.cxx:955
 TMonaLisaWriter.cxx:956
 TMonaLisaWriter.cxx:957
 TMonaLisaWriter.cxx:958
 TMonaLisaWriter.cxx:959
 TMonaLisaWriter.cxx:960
 TMonaLisaWriter.cxx:961
 TMonaLisaWriter.cxx:962
 TMonaLisaWriter.cxx:963
 TMonaLisaWriter.cxx:964
 TMonaLisaWriter.cxx:965
 TMonaLisaWriter.cxx:966
 TMonaLisaWriter.cxx:967
 TMonaLisaWriter.cxx:968
 TMonaLisaWriter.cxx:969
 TMonaLisaWriter.cxx:970
 TMonaLisaWriter.cxx:971
 TMonaLisaWriter.cxx:972
 TMonaLisaWriter.cxx:973
 TMonaLisaWriter.cxx:974
 TMonaLisaWriter.cxx:975
 TMonaLisaWriter.cxx:976
 TMonaLisaWriter.cxx:977
 TMonaLisaWriter.cxx:978
 TMonaLisaWriter.cxx:979
 TMonaLisaWriter.cxx:980
 TMonaLisaWriter.cxx:981
 TMonaLisaWriter.cxx:982
 TMonaLisaWriter.cxx:983
 TMonaLisaWriter.cxx:984
 TMonaLisaWriter.cxx:985
 TMonaLisaWriter.cxx:986
 TMonaLisaWriter.cxx:987
 TMonaLisaWriter.cxx:988
 TMonaLisaWriter.cxx:989
 TMonaLisaWriter.cxx:990
 TMonaLisaWriter.cxx:991
 TMonaLisaWriter.cxx:992
 TMonaLisaWriter.cxx:993
 TMonaLisaWriter.cxx:994
 TMonaLisaWriter.cxx:995
 TMonaLisaWriter.cxx:996
 TMonaLisaWriter.cxx:997
 TMonaLisaWriter.cxx:998
 TMonaLisaWriter.cxx:999
 TMonaLisaWriter.cxx:1000
 TMonaLisaWriter.cxx:1001
 TMonaLisaWriter.cxx:1002
 TMonaLisaWriter.cxx:1003
 TMonaLisaWriter.cxx:1004
 TMonaLisaWriter.cxx:1005
 TMonaLisaWriter.cxx:1006
 TMonaLisaWriter.cxx:1007
 TMonaLisaWriter.cxx:1008
 TMonaLisaWriter.cxx:1009
 TMonaLisaWriter.cxx:1010
 TMonaLisaWriter.cxx:1011
 TMonaLisaWriter.cxx:1012
 TMonaLisaWriter.cxx:1013
 TMonaLisaWriter.cxx:1014
 TMonaLisaWriter.cxx:1015
 TMonaLisaWriter.cxx:1016
 TMonaLisaWriter.cxx:1017
 TMonaLisaWriter.cxx:1018
 TMonaLisaWriter.cxx:1019
 TMonaLisaWriter.cxx:1020
 TMonaLisaWriter.cxx:1021
 TMonaLisaWriter.cxx:1022
 TMonaLisaWriter.cxx:1023
 TMonaLisaWriter.cxx:1024
 TMonaLisaWriter.cxx:1025
 TMonaLisaWriter.cxx:1026
 TMonaLisaWriter.cxx:1027
 TMonaLisaWriter.cxx:1028
 TMonaLisaWriter.cxx:1029
 TMonaLisaWriter.cxx:1030
 TMonaLisaWriter.cxx:1031
 TMonaLisaWriter.cxx:1032
 TMonaLisaWriter.cxx:1033
 TMonaLisaWriter.cxx:1034
 TMonaLisaWriter.cxx:1035
 TMonaLisaWriter.cxx:1036
 TMonaLisaWriter.cxx:1037
 TMonaLisaWriter.cxx:1038
 TMonaLisaWriter.cxx:1039
 TMonaLisaWriter.cxx:1040
 TMonaLisaWriter.cxx:1041
 TMonaLisaWriter.cxx:1042
 TMonaLisaWriter.cxx:1043
 TMonaLisaWriter.cxx:1044
 TMonaLisaWriter.cxx:1045
 TMonaLisaWriter.cxx:1046
 TMonaLisaWriter.cxx:1047
 TMonaLisaWriter.cxx:1048
 TMonaLisaWriter.cxx:1049
 TMonaLisaWriter.cxx:1050
 TMonaLisaWriter.cxx:1051
 TMonaLisaWriter.cxx:1052
 TMonaLisaWriter.cxx:1053
 TMonaLisaWriter.cxx:1054
 TMonaLisaWriter.cxx:1055
 TMonaLisaWriter.cxx:1056
 TMonaLisaWriter.cxx:1057
 TMonaLisaWriter.cxx:1058
 TMonaLisaWriter.cxx:1059
 TMonaLisaWriter.cxx:1060
 TMonaLisaWriter.cxx:1061
 TMonaLisaWriter.cxx:1062
 TMonaLisaWriter.cxx:1063
 TMonaLisaWriter.cxx:1064
 TMonaLisaWriter.cxx:1065
 TMonaLisaWriter.cxx:1066
 TMonaLisaWriter.cxx:1067
 TMonaLisaWriter.cxx:1068
 TMonaLisaWriter.cxx:1069
 TMonaLisaWriter.cxx:1070
 TMonaLisaWriter.cxx:1071
 TMonaLisaWriter.cxx:1072
 TMonaLisaWriter.cxx:1073
 TMonaLisaWriter.cxx:1074
 TMonaLisaWriter.cxx:1075
 TMonaLisaWriter.cxx:1076
 TMonaLisaWriter.cxx:1077
 TMonaLisaWriter.cxx:1078
 TMonaLisaWriter.cxx:1079
 TMonaLisaWriter.cxx:1080
 TMonaLisaWriter.cxx:1081
 TMonaLisaWriter.cxx:1082
 TMonaLisaWriter.cxx:1083
 TMonaLisaWriter.cxx:1084
 TMonaLisaWriter.cxx:1085
 TMonaLisaWriter.cxx:1086
 TMonaLisaWriter.cxx:1087
 TMonaLisaWriter.cxx:1088
 TMonaLisaWriter.cxx:1089
 TMonaLisaWriter.cxx:1090
 TMonaLisaWriter.cxx:1091
 TMonaLisaWriter.cxx:1092
 TMonaLisaWriter.cxx:1093
 TMonaLisaWriter.cxx:1094
 TMonaLisaWriter.cxx:1095
 TMonaLisaWriter.cxx:1096
 TMonaLisaWriter.cxx:1097
 TMonaLisaWriter.cxx:1098
 TMonaLisaWriter.cxx:1099
 TMonaLisaWriter.cxx:1100
 TMonaLisaWriter.cxx:1101
 TMonaLisaWriter.cxx:1102
 TMonaLisaWriter.cxx:1103
 TMonaLisaWriter.cxx:1104
 TMonaLisaWriter.cxx:1105
 TMonaLisaWriter.cxx:1106
 TMonaLisaWriter.cxx:1107
 TMonaLisaWriter.cxx:1108
 TMonaLisaWriter.cxx:1109
 TMonaLisaWriter.cxx:1110
 TMonaLisaWriter.cxx:1111
 TMonaLisaWriter.cxx:1112
 TMonaLisaWriter.cxx:1113
 TMonaLisaWriter.cxx:1114
 TMonaLisaWriter.cxx:1115
 TMonaLisaWriter.cxx:1116
 TMonaLisaWriter.cxx:1117
 TMonaLisaWriter.cxx:1118
 TMonaLisaWriter.cxx:1119
 TMonaLisaWriter.cxx:1120
 TMonaLisaWriter.cxx:1121
 TMonaLisaWriter.cxx:1122
 TMonaLisaWriter.cxx:1123
 TMonaLisaWriter.cxx:1124
 TMonaLisaWriter.cxx:1125
 TMonaLisaWriter.cxx:1126
 TMonaLisaWriter.cxx:1127
 TMonaLisaWriter.cxx:1128
 TMonaLisaWriter.cxx:1129
 TMonaLisaWriter.cxx:1130
 TMonaLisaWriter.cxx:1131
 TMonaLisaWriter.cxx:1132
 TMonaLisaWriter.cxx:1133
 TMonaLisaWriter.cxx:1134
 TMonaLisaWriter.cxx:1135
 TMonaLisaWriter.cxx:1136
 TMonaLisaWriter.cxx:1137
 TMonaLisaWriter.cxx:1138
 TMonaLisaWriter.cxx:1139
 TMonaLisaWriter.cxx:1140
 TMonaLisaWriter.cxx:1141
 TMonaLisaWriter.cxx:1142
 TMonaLisaWriter.cxx:1143
 TMonaLisaWriter.cxx:1144
 TMonaLisaWriter.cxx:1145
 TMonaLisaWriter.cxx:1146
 TMonaLisaWriter.cxx:1147
 TMonaLisaWriter.cxx:1148
 TMonaLisaWriter.cxx:1149
 TMonaLisaWriter.cxx:1150
 TMonaLisaWriter.cxx:1151
 TMonaLisaWriter.cxx:1152
 TMonaLisaWriter.cxx:1153
 TMonaLisaWriter.cxx:1154
 TMonaLisaWriter.cxx:1155
 TMonaLisaWriter.cxx:1156
 TMonaLisaWriter.cxx:1157
 TMonaLisaWriter.cxx:1158
 TMonaLisaWriter.cxx:1159
 TMonaLisaWriter.cxx:1160
 TMonaLisaWriter.cxx:1161
 TMonaLisaWriter.cxx:1162
 TMonaLisaWriter.cxx:1163
 TMonaLisaWriter.cxx:1164
 TMonaLisaWriter.cxx:1165
 TMonaLisaWriter.cxx:1166
 TMonaLisaWriter.cxx:1167