// @(#)root/proofplayer:$Id$
// Author: Maarten Ballintijn    9/7/2002

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TVirtualPacketizer                                                   //
//                                                                      //
// The packetizer is a load balancing object created for each query.    //
// It generates packets to be processed on PROOF worker servers.        //
// A packet is an event range (begin entry and number of entries) or    //
// object range (first object and number of objects) in a TTree         //
// (entries) or a directory (objects) in a file.                        //
// Packets are generated taking into account the performance of the     //
// remote machine, the time it took to process a previous packet on     //
// the remote machine, the locality of the database files, etc.         //
//                                                                      //
// TVirtualPacketizer includes common parts of PROOF packetizers.       //
// Look in subclasses for details.                                      //
// The default packetizer is TPacketizerAdaptive.                       //
// To use an alternative one, for instance - the TPacketizer, call:     //
// proof->SetParameter("PROOF_Packetizer", "TPacketizer");              //
//                                                                      //
//////////////////////////////////////////////////////////////////////////


#include "TVirtualPacketizer.h"
#include "TEnv.h"
#include "TFile.h"
#include "TTree.h"
#include "TKey.h"
#include "TDSet.h"
#include "TError.h"
#include "TEventList.h"
#include "TEntryList.h"
#include "TMap.h"
#include "TMessage.h"
#include "TObjString.h"
#include "TParameter.h"

#include "TProof.h"
#include "TProofDebug.h"
#include "TProofPlayer.h"
#include "TProofServ.h"
#include "TSlave.h"
#include "TSocket.h"
#include "TTimer.h"
#include "TUrl.h"
#include "TMath.h"
#include "TMonitor.h"
#include "TNtuple.h"
#include "TNtupleD.h"
#include "TPerfStats.h"

ClassImp(TVirtualPacketizer)

//______________________________________________________________________________
TVirtualPacketizer::TVirtualPacketizer(TList *input, TProofProgressStatus *st)
{
   // Constructor.

   fInput =  input;
   // General configuration parameters
   fMinPacketTime = 3;
   Double_t minPacketTime = 0;
   if (TProof::GetParameter(input, "PROOF_MinPacketTime", minPacketTime) == 0) {
      Info("TVirtualPacketizer", "setting minimum time for a packet to %f",
           minPacketTime);
      fMinPacketTime = (Int_t) minPacketTime;
   }
   fMaxPacketTime = 20;
   Double_t maxPacketTime = 0;
   if (TProof::GetParameter(input, "PROOF_MaxPacketTime", maxPacketTime) == 0) {
      Info("TVirtualPacketizer", "setting maximum packet time for a packet to %f",
           maxPacketTime);
      fMaxPacketTime = (Int_t) maxPacketTime;
   }
   ResetBit(TVirtualPacketizer::kIsTree);

   // Create the list to save them in the query result (each derived packetizer is
   // responsible to update this coherently)
   fConfigParams = new TList;
   fConfigParams->SetName("PROOF_PacketizerConfigParams");
   fConfigParams->Add(new TParameter<Double_t>("PROOF_MinPacketTime", fMinPacketTime));
   fConfigParams->Add(new TParameter<Double_t>("PROOF_MaxPacketTime", fMaxPacketTime));

   fProgressStatus = st;
   if (!fProgressStatus) {
      Error("TVirtualPacketizer", "No progress status");
      return;
   }
   fTotalEntries = 0;
   fValid = kTRUE;
   fStop = kFALSE;
   fFailedPackets = 0;
   fDataSet = "";
   fSlaveStats = 0;

   // Performance monitoring
   fStartTime = gSystem->Now();
   SetBit(TVirtualPacketizer::kIsInitializing);
   ResetBit(TVirtualPacketizer::kIsDone);
   fInitTime = 0;
   fProcTime = 0;
   fTimeUpdt = -1.;

   // Init circularity ntple for performance calculations
   fCircProg = new TNtupleD("CircNtuple","Circular progress info","tm:ev:mb:rc:al");
   fCircN = 5;
   TProof::GetParameter(input, "PROOF_ProgressCircularity", fCircN);
   fCircProg->SetCircular(fCircN);
   fCircProg->SetDirectory(0);

   // Check if we need to start the progress timer (multi-packetizers do not want
   // timers from the packetizers they control ...). Also submasters do not need
   // that (the progress timer is the one at the top master).
   TString startProgress("yes");
   TProof::GetParameter(input, "PROOF_StartProgressTimer", startProgress);
   // If we are on a submaster, check if there is something else to do
   if (gProofServ && gProofServ->IsMaster() && !gProofServ->IsTopMaster()) startProgress = "no";

   // Init progress timer, if requested
   // The timer is destroyed (and therefore stopped) by the relevant TPacketizer implementation
   // in GetNextPacket when end of work is detected.
   fProgress = 0;
   if (startProgress == "yes") {
      Long_t period = 500;
      TProof::GetParameter(input, "PROOF_ProgressPeriod", period);
      fProgress = new TTimer;
      fProgress->SetObject(this);
      fProgress->Start(period, kFALSE);
   }

   // Init ntple to store active workers vs processing time
   fProgressPerf = 0;
   TString saveProgressPerf("no");
   if (TProof::GetParameter(input, "PROOF_SaveProgressPerf", saveProgressPerf) == 0) {
      if (fProgress && saveProgressPerf == "yes")
         fProgressPerf = new TNtuple("PROOF_ProgressPerfNtuple",
                                     "{Active workers, evt rate, MB read} vs processing time", "tm:aw:er:mb:ns");
   }
   fProcTimeLast = -1.;
   fActWrksLast = -1;
   fEvtRateLast = -1.;
   fMBsReadLast = -1.;
   fEffSessLast = -1.;
   fAWLastFill = kFALSE;
   fReportPeriod = -1.;

   // Whether to send estimated values for the progress info
   TString estopt;
   if (TProof::GetParameter(input, "PROOF_RateEstimation", estopt) != 0 ||
       estopt.IsNull()) {
      // Parse option from the env
      estopt = gEnv->GetValue("Proof.RateEstimation", "");
   }
   fUseEstOpt = kEstOff;
   if (estopt == "current")
      fUseEstOpt = kEstCurrent;
   else if (estopt == "average")
      fUseEstOpt = kEstAverage;
}

//______________________________________________________________________________
TVirtualPacketizer::~TVirtualPacketizer()
{
   // Destructor.

   SafeDelete(fCircProg);
   SafeDelete(fProgress);
   SafeDelete(fFailedPackets);
   SafeDelete(fConfigParams);
   SafeDelete(fProgressPerf);
   fProgressStatus = 0; // belongs to the player
}

//______________________________________________________________________________
Long64_t TVirtualPacketizer::GetEntries(Bool_t tree, TDSetElement *e)
{
   // Get entries.

   Long64_t entries;
   TFile *file = TFile::Open(e->GetFileName());

   if (!file || (file && file->IsZombie())) {
      const char *emsg = (file) ? strerror(file->GetErrno()) : "<undef>";
      Error("GetEntries","Cannot open file: %s (%s)", e->GetFileName(), emsg);
      return -1;
   }

   TDirectory *dirsave = gDirectory;
   if ( ! file->cd(e->GetDirectory()) ) {
      Error("GetEntries","Cannot cd to: %s", e->GetDirectory() );
      delete file;
      return -1;
   }
   TDirectory *dir = gDirectory;
   dirsave->cd();

   if ( tree ) {
      TKey *key = dir->GetKey(e->GetObjName());
      if ( key == 0 ) {
         Error("GetEntries","Cannot find tree \"%s\" in %s",
               e->GetObjName(), e->GetFileName() );
         delete file;
         return -1;
      }
      TTree *t = (TTree *) key->ReadObj();
      if ( t == 0 ) {
         // Error always reported?
         delete file;
         return -1;
      }
      entries = (Long64_t) t->GetEntries();
      delete t;

   } else {
      TList *keys = dir->GetListOfKeys();
      entries = keys->GetSize();
   }

   delete file;

   return entries;
}

//______________________________________________________________________________
TDSetElement *TVirtualPacketizer::GetNextPacket(TSlave *, TMessage *)
{
   // Get next packet.

   AbstractMethod("GetNextPacket");
   return 0;
}

//______________________________________________________________________________
void TVirtualPacketizer::StopProcess(Bool_t /*abort*/, Bool_t stoptimer)
{
   // Stop process.

   fStop = kTRUE;
   if (stoptimer) HandleTimer(0);
}

//______________________________________________________________________________
TDSetElement* TVirtualPacketizer::CreateNewPacket(TDSetElement* base,
                                                  Long64_t first, Long64_t num)
{
   // Creates a new TDSetElement from from base packet starting from
   // the first entry with num entries.
   // The function returns a new created objects which have to be deleted.

   TDSetElement* elem = new TDSetElement(base->GetFileName(), base->GetObjName(),
                                         base->GetDirectory(), first, num,
                                         0, fDataSet.Data());

   // create TDSetElements for all the friends of elem.
   TList *friends = base->GetListOfFriends();
   if (friends) {
      TIter nxf(friends);
      TDSetElement *fe = 0;
      while ((fe = (TDSetElement *) nxf())) {
         PDB(kLoop,2)
            Info("CreateNewPacket", "friend: file '%s', obj:'%s'",
                                     fe->GetFileName(), fe->GetObjName());
         TDSetElement *xfe = new TDSetElement(fe->GetFileName(), fe->GetObjName(),
                                              fe->GetDirectory(), first, num);
         // The alias, if any, is in the element name options ('friend_alias=<alias>|')
         elem->AddFriend(xfe, 0);
      }
   }

   return elem;
}

//______________________________________________________________________________
Bool_t TVirtualPacketizer::HandleTimer(TTimer *)
{
   // Send progress message to client.

   PDB(kPacketizer,2)
      Info("HandleTimer", "fProgress: %p, isDone: %d",
                          fProgress, TestBit(TVirtualPacketizer::kIsDone));

   if (fProgress == 0 || TestBit(TVirtualPacketizer::kIsDone)) {
      // Make sure that the timer is stopped
      if (fProgress) fProgress->Stop();
      return kFALSE;
   }

   // Prepare progress info
   TTime tnow = gSystem->Now();
   Float_t now = Long64_t(tnow - fStartTime) / (Float_t)1000.;
   Long64_t estent = GetEntriesProcessed();
   Long64_t estmb = GetBytesRead();
   Long64_t estrc = GetReadCalls();

   // Times and counters
   Float_t evtrti = -1., mbrti = -1.;
   if (TestBit(TVirtualPacketizer::kIsInitializing)) {
      // Initialization
      fInitTime = now;
   } else {
      // Fill the reference as first
      if (fCircProg->GetEntries() <= 0) {
         fCircProg->Fill((Double_t)0., 0., 0., 0., 0.);
      }
      // Time between updates
      fTimeUpdt = now - fProcTime;
      // Update proc time
      fProcTime = now - fInitTime;
      // Get the last entry
      Double_t *ar = fCircProg->GetArgs();
      fCircProg->GetEntry(fCircProg->GetEntries()-1);
      // The current rate
      Bool_t all = kTRUE;
      evtrti = GetCurrentRate(all);
      Double_t xall = (all) ? 1. : 0.;
      GetEstEntriesProcessed(0, estent, estmb, estrc);
      if (estent >= fTotalEntries) {
         estent = GetEntriesProcessed();
         estmb = GetBytesRead();
         estrc = GetReadCalls();
      }
      // Fill entry
      Double_t evts = (Double_t) estent;
      Double_t mbs = (estmb > 0) ? estmb / TMath::Power(2.,20.) : 0.; //--> MB
      Double_t rcs = (Double_t) estrc;
      fCircProg->Fill((Double_t)fProcTime, evts, mbs, rcs, xall);
      fCircProg->GetEntry(fCircProg->GetEntries()-2);
      if (all) {
         Double_t dt = (Double_t)fProcTime - ar[0];
         Long64_t de = (evts > ar[1]) ? (Long64_t) (evts - ar[1]) : 0;
         Long64_t db = (mbs > ar[2]) ? (Long64_t) ((mbs - ar[2])*TMath::Power(2.,20.)) : 0;
         if (gPerfStats)
            gPerfStats->RateEvent((Double_t)fProcTime, dt, de, db);
         // Get the last to spot the cache readings
         Double_t rc = (Double_t)estrc - ar[3];
         mbrti = (rc > 0 && mbs > ar[2]) ? (Float_t) (mbs - ar[2]) / rc : 0. ;
      }
      // Final report only once (to correctly determine the proc time)
      if (fTotalEntries > 0 && GetEntriesProcessed() >= fTotalEntries)
         SetBit(TVirtualPacketizer::kIsDone);
      PDB(kPacketizer,2)
         Info("HandleTimer", "ent:%lld, bytes:%lld, proct:%f, evtrti:%f, mbrti:%f (%f,%f)",
                             estent, estmb, fProcTime, evtrti, mbrti, mbs, ar[2]);
   }

   if (gProofServ) {
      // Message to be sent over
      TMessage m(kPROOF_PROGRESS);
      if (gProofServ->GetProtocol() > 25) {
         Int_t actw = GetActiveWorkers();
         Int_t acts = gProofServ->GetActSessions();
         Float_t effs = gProofServ->GetEffSessions();
         if (fProgressPerf && estent > 0) {
            // Estimated query time
            if (fProcTime > 0.) {
               fReportPeriod = (Float_t) fTotalEntries / (Double_t) estent * fProcTime / 100.;
               if (fReportPeriod > 0. && fReportPeriod < 5.) fReportPeriod = 5.;
            }

            if (fProgressPerf->GetEntries() <= 0) {
               // Fill the first entry
               fProgressPerf->Fill(fProcTime, (Float_t)actw, -1., -1., -1.);
            } else {
               // Fill only if changed since last entry filled
               Float_t *far = fProgressPerf->GetArgs();
               fProgressPerf->GetEntry(fProgressPerf->GetEntries()-1);
               Bool_t doReport = (fReportPeriod > 0. &&
                                 (fProcTime - far[0]) >= fReportPeriod) ? kTRUE : kFALSE;
               Float_t mbsread = estmb / 1024. / 1024.;
               if (TMath::Abs((Float_t)actw - far[1]) > 0.1) {
                  if (fAWLastFill)
                     fProgressPerf->Fill(fProcTimeLast, (Float_t)fActWrksLast,
                                         fEvtRateLast, fMBsReadLast, fEffSessLast);
                  fProgressPerf->Fill(fProcTime, (Float_t)actw, evtrti, mbsread, effs);
                  fAWLastFill = kFALSE;
               } else if (doReport) {
                  fProgressPerf->Fill(fProcTime, (Float_t)actw, evtrti, mbsread, effs);
                  fAWLastFill = kFALSE;
               } else {
                  fAWLastFill = kTRUE;
               }
               fProcTimeLast = fProcTime;
               fActWrksLast = actw;
               fEvtRateLast = evtrti;
               fMBsReadLast = mbsread;
               fEffSessLast = effs;
            }
         }
         // Fill the message now
         TProofProgressInfo pi(fTotalEntries, estent, estmb, fInitTime,
                               fProcTime, evtrti, mbrti, actw, acts, effs);
         m << &pi;
      } else if (gProofServ->GetProtocol() > 11) {
         // Fill the message now
         m << fTotalEntries << estent << estmb << fInitTime << fProcTime
           << evtrti << mbrti;
      } else {
         // Old format
         m << fTotalEntries << GetEntriesProcessed();
      }
      // send message to client;
      gProofServ->GetSocket()->Send(m);

   } else {
      if (gProof && gProof->GetPlayer()) {
         // Log locally
         gProof->GetPlayer()->Progress(fTotalEntries, estent, estmb,
                                       fInitTime, fProcTime, evtrti, mbrti);
      }
   }

   // Final report only once (to correctly determine the proc time)
   if (fTotalEntries > 0 && GetEntriesProcessed() >= fTotalEntries)
      SetBit(TVirtualPacketizer::kIsDone);

   return kFALSE; // ignored?
}

//______________________________________________________________________________
void TVirtualPacketizer::SetInitTime()
{
   // Set the initialization time

   if (TestBit(TVirtualPacketizer::kIsInitializing)) {
      fInitTime = Long64_t(gSystem->Now() - fStartTime) / (Float_t)1000.;
      ResetBit(TVirtualPacketizer::kIsInitializing);
      PDB(kPacketizer,2)
         Info("SetInitTime","fInitTime set to %f s", fInitTime);
   }
}

//______________________________________________________________________________
Int_t TVirtualPacketizer::AddWorkers(TList *)
{
   // Adds new workers. Must be implemented by each real packetizer properly.
   // Returns the number of workers added, or -1 on failure.

   Warning("AddWorkers", "Not implemented for this packetizer");

   return -1;
}
 TVirtualPacketizer.cxx:1
 TVirtualPacketizer.cxx:2
 TVirtualPacketizer.cxx:3
 TVirtualPacketizer.cxx:4
 TVirtualPacketizer.cxx:5
 TVirtualPacketizer.cxx:6
 TVirtualPacketizer.cxx:7
 TVirtualPacketizer.cxx:8
 TVirtualPacketizer.cxx:9
 TVirtualPacketizer.cxx:10
 TVirtualPacketizer.cxx:11
 TVirtualPacketizer.cxx:12
 TVirtualPacketizer.cxx:13
 TVirtualPacketizer.cxx:14
 TVirtualPacketizer.cxx:15
 TVirtualPacketizer.cxx:16
 TVirtualPacketizer.cxx:17
 TVirtualPacketizer.cxx:18
 TVirtualPacketizer.cxx:19
 TVirtualPacketizer.cxx:20
 TVirtualPacketizer.cxx:21
 TVirtualPacketizer.cxx:22
 TVirtualPacketizer.cxx:23
 TVirtualPacketizer.cxx:24
 TVirtualPacketizer.cxx:25
 TVirtualPacketizer.cxx:26
 TVirtualPacketizer.cxx:27
 TVirtualPacketizer.cxx:28
 TVirtualPacketizer.cxx:29
 TVirtualPacketizer.cxx:30
 TVirtualPacketizer.cxx:31
 TVirtualPacketizer.cxx:32
 TVirtualPacketizer.cxx:33
 TVirtualPacketizer.cxx:34
 TVirtualPacketizer.cxx:35
 TVirtualPacketizer.cxx:36
 TVirtualPacketizer.cxx:37
 TVirtualPacketizer.cxx:38
 TVirtualPacketizer.cxx:39
 TVirtualPacketizer.cxx:40
 TVirtualPacketizer.cxx:41
 TVirtualPacketizer.cxx:42
 TVirtualPacketizer.cxx:43
 TVirtualPacketizer.cxx:44
 TVirtualPacketizer.cxx:45
 TVirtualPacketizer.cxx:46
 TVirtualPacketizer.cxx:47
 TVirtualPacketizer.cxx:48
 TVirtualPacketizer.cxx:49
 TVirtualPacketizer.cxx:50
 TVirtualPacketizer.cxx:51
 TVirtualPacketizer.cxx:52
 TVirtualPacketizer.cxx:53
 TVirtualPacketizer.cxx:54
 TVirtualPacketizer.cxx:55
 TVirtualPacketizer.cxx:56
 TVirtualPacketizer.cxx:57
 TVirtualPacketizer.cxx:58
 TVirtualPacketizer.cxx:59
 TVirtualPacketizer.cxx:60
 TVirtualPacketizer.cxx:61
 TVirtualPacketizer.cxx:62
 TVirtualPacketizer.cxx:63
 TVirtualPacketizer.cxx:64
 TVirtualPacketizer.cxx:65
 TVirtualPacketizer.cxx:66
 TVirtualPacketizer.cxx:67
 TVirtualPacketizer.cxx:68
 TVirtualPacketizer.cxx:69
 TVirtualPacketizer.cxx:70
 TVirtualPacketizer.cxx:71
 TVirtualPacketizer.cxx:72
 TVirtualPacketizer.cxx:73
 TVirtualPacketizer.cxx:74
 TVirtualPacketizer.cxx:75
 TVirtualPacketizer.cxx:76
 TVirtualPacketizer.cxx:77
 TVirtualPacketizer.cxx:78
 TVirtualPacketizer.cxx:79
 TVirtualPacketizer.cxx:80
 TVirtualPacketizer.cxx:81
 TVirtualPacketizer.cxx:82
 TVirtualPacketizer.cxx:83
 TVirtualPacketizer.cxx:84
 TVirtualPacketizer.cxx:85
 TVirtualPacketizer.cxx:86
 TVirtualPacketizer.cxx:87
 TVirtualPacketizer.cxx:88
 TVirtualPacketizer.cxx:89
 TVirtualPacketizer.cxx:90
 TVirtualPacketizer.cxx:91
 TVirtualPacketizer.cxx:92
 TVirtualPacketizer.cxx:93
 TVirtualPacketizer.cxx:94
 TVirtualPacketizer.cxx:95
 TVirtualPacketizer.cxx:96
 TVirtualPacketizer.cxx:97
 TVirtualPacketizer.cxx:98
 TVirtualPacketizer.cxx:99
 TVirtualPacketizer.cxx:100
 TVirtualPacketizer.cxx:101
 TVirtualPacketizer.cxx:102
 TVirtualPacketizer.cxx:103
 TVirtualPacketizer.cxx:104
 TVirtualPacketizer.cxx:105
 TVirtualPacketizer.cxx:106
 TVirtualPacketizer.cxx:107
 TVirtualPacketizer.cxx:108
 TVirtualPacketizer.cxx:109
 TVirtualPacketizer.cxx:110
 TVirtualPacketizer.cxx:111
 TVirtualPacketizer.cxx:112
 TVirtualPacketizer.cxx:113
 TVirtualPacketizer.cxx:114
 TVirtualPacketizer.cxx:115
 TVirtualPacketizer.cxx:116
 TVirtualPacketizer.cxx:117
 TVirtualPacketizer.cxx:118
 TVirtualPacketizer.cxx:119
 TVirtualPacketizer.cxx:120
 TVirtualPacketizer.cxx:121
 TVirtualPacketizer.cxx:122
 TVirtualPacketizer.cxx:123
 TVirtualPacketizer.cxx:124
 TVirtualPacketizer.cxx:125
 TVirtualPacketizer.cxx:126
 TVirtualPacketizer.cxx:127
 TVirtualPacketizer.cxx:128
 TVirtualPacketizer.cxx:129
 TVirtualPacketizer.cxx:130
 TVirtualPacketizer.cxx:131
 TVirtualPacketizer.cxx:132
 TVirtualPacketizer.cxx:133
 TVirtualPacketizer.cxx:134
 TVirtualPacketizer.cxx:135
 TVirtualPacketizer.cxx:136
 TVirtualPacketizer.cxx:137
 TVirtualPacketizer.cxx:138
 TVirtualPacketizer.cxx:139
 TVirtualPacketizer.cxx:140
 TVirtualPacketizer.cxx:141
 TVirtualPacketizer.cxx:142
 TVirtualPacketizer.cxx:143
 TVirtualPacketizer.cxx:144
 TVirtualPacketizer.cxx:145
 TVirtualPacketizer.cxx:146
 TVirtualPacketizer.cxx:147
 TVirtualPacketizer.cxx:148
 TVirtualPacketizer.cxx:149
 TVirtualPacketizer.cxx:150
 TVirtualPacketizer.cxx:151
 TVirtualPacketizer.cxx:152
 TVirtualPacketizer.cxx:153
 TVirtualPacketizer.cxx:154
 TVirtualPacketizer.cxx:155
 TVirtualPacketizer.cxx:156
 TVirtualPacketizer.cxx:157
 TVirtualPacketizer.cxx:158
 TVirtualPacketizer.cxx:159
 TVirtualPacketizer.cxx:160
 TVirtualPacketizer.cxx:161
 TVirtualPacketizer.cxx:162
 TVirtualPacketizer.cxx:163
 TVirtualPacketizer.cxx:164
 TVirtualPacketizer.cxx:165
 TVirtualPacketizer.cxx:166
 TVirtualPacketizer.cxx:167
 TVirtualPacketizer.cxx:168
 TVirtualPacketizer.cxx:169
 TVirtualPacketizer.cxx:170
 TVirtualPacketizer.cxx:171
 TVirtualPacketizer.cxx:172
 TVirtualPacketizer.cxx:173
 TVirtualPacketizer.cxx:174
 TVirtualPacketizer.cxx:175
 TVirtualPacketizer.cxx:176
 TVirtualPacketizer.cxx:177
 TVirtualPacketizer.cxx:178
 TVirtualPacketizer.cxx:179
 TVirtualPacketizer.cxx:180
 TVirtualPacketizer.cxx:181
 TVirtualPacketizer.cxx:182
 TVirtualPacketizer.cxx:183
 TVirtualPacketizer.cxx:184
 TVirtualPacketizer.cxx:185
 TVirtualPacketizer.cxx:186
 TVirtualPacketizer.cxx:187
 TVirtualPacketizer.cxx:188
 TVirtualPacketizer.cxx:189
 TVirtualPacketizer.cxx:190
 TVirtualPacketizer.cxx:191
 TVirtualPacketizer.cxx:192
 TVirtualPacketizer.cxx:193
 TVirtualPacketizer.cxx:194
 TVirtualPacketizer.cxx:195
 TVirtualPacketizer.cxx:196
 TVirtualPacketizer.cxx:197
 TVirtualPacketizer.cxx:198
 TVirtualPacketizer.cxx:199
 TVirtualPacketizer.cxx:200
 TVirtualPacketizer.cxx:201
 TVirtualPacketizer.cxx:202
 TVirtualPacketizer.cxx:203
 TVirtualPacketizer.cxx:204
 TVirtualPacketizer.cxx:205
 TVirtualPacketizer.cxx:206
 TVirtualPacketizer.cxx:207
 TVirtualPacketizer.cxx:208
 TVirtualPacketizer.cxx:209
 TVirtualPacketizer.cxx:210
 TVirtualPacketizer.cxx:211
 TVirtualPacketizer.cxx:212
 TVirtualPacketizer.cxx:213
 TVirtualPacketizer.cxx:214
 TVirtualPacketizer.cxx:215
 TVirtualPacketizer.cxx:216
 TVirtualPacketizer.cxx:217
 TVirtualPacketizer.cxx:218
 TVirtualPacketizer.cxx:219
 TVirtualPacketizer.cxx:220
 TVirtualPacketizer.cxx:221
 TVirtualPacketizer.cxx:222
 TVirtualPacketizer.cxx:223
 TVirtualPacketizer.cxx:224
 TVirtualPacketizer.cxx:225
 TVirtualPacketizer.cxx:226
 TVirtualPacketizer.cxx:227
 TVirtualPacketizer.cxx:228
 TVirtualPacketizer.cxx:229
 TVirtualPacketizer.cxx:230
 TVirtualPacketizer.cxx:231
 TVirtualPacketizer.cxx:232
 TVirtualPacketizer.cxx:233
 TVirtualPacketizer.cxx:234
 TVirtualPacketizer.cxx:235
 TVirtualPacketizer.cxx:236
 TVirtualPacketizer.cxx:237
 TVirtualPacketizer.cxx:238
 TVirtualPacketizer.cxx:239
 TVirtualPacketizer.cxx:240
 TVirtualPacketizer.cxx:241
 TVirtualPacketizer.cxx:242
 TVirtualPacketizer.cxx:243
 TVirtualPacketizer.cxx:244
 TVirtualPacketizer.cxx:245
 TVirtualPacketizer.cxx:246
 TVirtualPacketizer.cxx:247
 TVirtualPacketizer.cxx:248
 TVirtualPacketizer.cxx:249
 TVirtualPacketizer.cxx:250
 TVirtualPacketizer.cxx:251
 TVirtualPacketizer.cxx:252
 TVirtualPacketizer.cxx:253
 TVirtualPacketizer.cxx:254
 TVirtualPacketizer.cxx:255
 TVirtualPacketizer.cxx:256
 TVirtualPacketizer.cxx:257
 TVirtualPacketizer.cxx:258
 TVirtualPacketizer.cxx:259
 TVirtualPacketizer.cxx:260
 TVirtualPacketizer.cxx:261
 TVirtualPacketizer.cxx:262
 TVirtualPacketizer.cxx:263
 TVirtualPacketizer.cxx:264
 TVirtualPacketizer.cxx:265
 TVirtualPacketizer.cxx:266
 TVirtualPacketizer.cxx:267
 TVirtualPacketizer.cxx:268
 TVirtualPacketizer.cxx:269
 TVirtualPacketizer.cxx:270
 TVirtualPacketizer.cxx:271
 TVirtualPacketizer.cxx:272
 TVirtualPacketizer.cxx:273
 TVirtualPacketizer.cxx:274
 TVirtualPacketizer.cxx:275
 TVirtualPacketizer.cxx:276
 TVirtualPacketizer.cxx:277
 TVirtualPacketizer.cxx:278
 TVirtualPacketizer.cxx:279
 TVirtualPacketizer.cxx:280
 TVirtualPacketizer.cxx:281
 TVirtualPacketizer.cxx:282
 TVirtualPacketizer.cxx:283
 TVirtualPacketizer.cxx:284
 TVirtualPacketizer.cxx:285
 TVirtualPacketizer.cxx:286
 TVirtualPacketizer.cxx:287
 TVirtualPacketizer.cxx:288
 TVirtualPacketizer.cxx:289
 TVirtualPacketizer.cxx:290
 TVirtualPacketizer.cxx:291
 TVirtualPacketizer.cxx:292
 TVirtualPacketizer.cxx:293
 TVirtualPacketizer.cxx:294
 TVirtualPacketizer.cxx:295
 TVirtualPacketizer.cxx:296
 TVirtualPacketizer.cxx:297
 TVirtualPacketizer.cxx:298
 TVirtualPacketizer.cxx:299
 TVirtualPacketizer.cxx:300
 TVirtualPacketizer.cxx:301
 TVirtualPacketizer.cxx:302
 TVirtualPacketizer.cxx:303
 TVirtualPacketizer.cxx:304
 TVirtualPacketizer.cxx:305
 TVirtualPacketizer.cxx:306
 TVirtualPacketizer.cxx:307
 TVirtualPacketizer.cxx:308
 TVirtualPacketizer.cxx:309
 TVirtualPacketizer.cxx:310
 TVirtualPacketizer.cxx:311
 TVirtualPacketizer.cxx:312
 TVirtualPacketizer.cxx:313
 TVirtualPacketizer.cxx:314
 TVirtualPacketizer.cxx:315
 TVirtualPacketizer.cxx:316
 TVirtualPacketizer.cxx:317
 TVirtualPacketizer.cxx:318
 TVirtualPacketizer.cxx:319
 TVirtualPacketizer.cxx:320
 TVirtualPacketizer.cxx:321
 TVirtualPacketizer.cxx:322
 TVirtualPacketizer.cxx:323
 TVirtualPacketizer.cxx:324
 TVirtualPacketizer.cxx:325
 TVirtualPacketizer.cxx:326
 TVirtualPacketizer.cxx:327
 TVirtualPacketizer.cxx:328
 TVirtualPacketizer.cxx:329
 TVirtualPacketizer.cxx:330
 TVirtualPacketizer.cxx:331
 TVirtualPacketizer.cxx:332
 TVirtualPacketizer.cxx:333
 TVirtualPacketizer.cxx:334
 TVirtualPacketizer.cxx:335
 TVirtualPacketizer.cxx:336
 TVirtualPacketizer.cxx:337
 TVirtualPacketizer.cxx:338
 TVirtualPacketizer.cxx:339
 TVirtualPacketizer.cxx:340
 TVirtualPacketizer.cxx:341
 TVirtualPacketizer.cxx:342
 TVirtualPacketizer.cxx:343
 TVirtualPacketizer.cxx:344
 TVirtualPacketizer.cxx:345
 TVirtualPacketizer.cxx:346
 TVirtualPacketizer.cxx:347
 TVirtualPacketizer.cxx:348
 TVirtualPacketizer.cxx:349
 TVirtualPacketizer.cxx:350
 TVirtualPacketizer.cxx:351
 TVirtualPacketizer.cxx:352
 TVirtualPacketizer.cxx:353
 TVirtualPacketizer.cxx:354
 TVirtualPacketizer.cxx:355
 TVirtualPacketizer.cxx:356
 TVirtualPacketizer.cxx:357
 TVirtualPacketizer.cxx:358
 TVirtualPacketizer.cxx:359
 TVirtualPacketizer.cxx:360
 TVirtualPacketizer.cxx:361
 TVirtualPacketizer.cxx:362
 TVirtualPacketizer.cxx:363
 TVirtualPacketizer.cxx:364
 TVirtualPacketizer.cxx:365
 TVirtualPacketizer.cxx:366
 TVirtualPacketizer.cxx:367
 TVirtualPacketizer.cxx:368
 TVirtualPacketizer.cxx:369
 TVirtualPacketizer.cxx:370
 TVirtualPacketizer.cxx:371
 TVirtualPacketizer.cxx:372
 TVirtualPacketizer.cxx:373
 TVirtualPacketizer.cxx:374
 TVirtualPacketizer.cxx:375
 TVirtualPacketizer.cxx:376
 TVirtualPacketizer.cxx:377
 TVirtualPacketizer.cxx:378
 TVirtualPacketizer.cxx:379
 TVirtualPacketizer.cxx:380
 TVirtualPacketizer.cxx:381
 TVirtualPacketizer.cxx:382
 TVirtualPacketizer.cxx:383
 TVirtualPacketizer.cxx:384
 TVirtualPacketizer.cxx:385
 TVirtualPacketizer.cxx:386
 TVirtualPacketizer.cxx:387
 TVirtualPacketizer.cxx:388
 TVirtualPacketizer.cxx:389
 TVirtualPacketizer.cxx:390
 TVirtualPacketizer.cxx:391
 TVirtualPacketizer.cxx:392
 TVirtualPacketizer.cxx:393
 TVirtualPacketizer.cxx:394
 TVirtualPacketizer.cxx:395
 TVirtualPacketizer.cxx:396
 TVirtualPacketizer.cxx:397
 TVirtualPacketizer.cxx:398
 TVirtualPacketizer.cxx:399
 TVirtualPacketizer.cxx:400
 TVirtualPacketizer.cxx:401
 TVirtualPacketizer.cxx:402
 TVirtualPacketizer.cxx:403
 TVirtualPacketizer.cxx:404
 TVirtualPacketizer.cxx:405
 TVirtualPacketizer.cxx:406
 TVirtualPacketizer.cxx:407
 TVirtualPacketizer.cxx:408
 TVirtualPacketizer.cxx:409
 TVirtualPacketizer.cxx:410
 TVirtualPacketizer.cxx:411
 TVirtualPacketizer.cxx:412
 TVirtualPacketizer.cxx:413
 TVirtualPacketizer.cxx:414
 TVirtualPacketizer.cxx:415
 TVirtualPacketizer.cxx:416
 TVirtualPacketizer.cxx:417
 TVirtualPacketizer.cxx:418
 TVirtualPacketizer.cxx:419
 TVirtualPacketizer.cxx:420
 TVirtualPacketizer.cxx:421
 TVirtualPacketizer.cxx:422
 TVirtualPacketizer.cxx:423
 TVirtualPacketizer.cxx:424
 TVirtualPacketizer.cxx:425
 TVirtualPacketizer.cxx:426
 TVirtualPacketizer.cxx:427
 TVirtualPacketizer.cxx:428
 TVirtualPacketizer.cxx:429
 TVirtualPacketizer.cxx:430
 TVirtualPacketizer.cxx:431
 TVirtualPacketizer.cxx:432
 TVirtualPacketizer.cxx:433
 TVirtualPacketizer.cxx:434
 TVirtualPacketizer.cxx:435
 TVirtualPacketizer.cxx:436
 TVirtualPacketizer.cxx:437
 TVirtualPacketizer.cxx:438
 TVirtualPacketizer.cxx:439
 TVirtualPacketizer.cxx:440
 TVirtualPacketizer.cxx:441
 TVirtualPacketizer.cxx:442
 TVirtualPacketizer.cxx:443
 TVirtualPacketizer.cxx:444
 TVirtualPacketizer.cxx:445
 TVirtualPacketizer.cxx:446
 TVirtualPacketizer.cxx:447
 TVirtualPacketizer.cxx:448
 TVirtualPacketizer.cxx:449
 TVirtualPacketizer.cxx:450
 TVirtualPacketizer.cxx:451