// @(#)root/proof:$Id$
// Author: G. Ganis  Nov 2006

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofChain                                                          //
//                                                                      //
// A TChain proxy on PROOF.                                             //
// Uses an internal TDSet to handle processing.                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TProofChain.h"
#include "TDSet.h"
#include "TList.h"
#include "TProof.h"
#include "TROOT.h"
#include "TEventList.h"
#include "TEntryList.h"

ClassImp(TProofChain)

//______________________________________________________________________________
TProofChain::TProofChain() : TChain()
{
   // Crates a new PROOF chain proxy.

   fChain        = 0;
   fTree         = 0;
   fSet          = 0;
   fDirectory    = gDirectory;
   ResetBit(kOwnsChain);
}

//______________________________________________________________________________
TProofChain::TProofChain(TChain *chain, Bool_t gettreeheader) : TChain()
{
   // Crates a new PROOF chain proxy containing the files from the chain.

   fChain        = chain;
   fTree         = 0;
   fSet          = chain ? new TDSet((const TChain &)(*chain)) : 0;
   fDirectory    = gDirectory;
   if (gProof) {
      gProof->AddChain(chain);
      ConnectProof();
      if (gProof->IsLite()) {
         SetBit(kProofLite);
         fTree = fChain;
      } else {
         if (gettreeheader && fSet)
            fTree = gProof->GetTreeHeader(fSet);
      }
   }
   ResetBit(kOwnsChain);
}

//______________________________________________________________________________
TProofChain::TProofChain(TDSet *dset, Bool_t gettreeheader) : TChain()
{
   // Creates a new PROOF chain proxy containing the files from the dset.

   fChain        = 0;
   fTree         = 0;
   fSet          = dset;
   fDirectory    = gDirectory;
   if (gProof) {
      ConnectProof();
      if (gettreeheader && dset)
         fTree = gProof->GetTreeHeader(dset);
      if (gProof->IsLite())
         SetBit(kProofLite);
   }
   if (fTree && fSet) {
      fChain = new TChain(fTree->GetName());
      TIter nxe(fSet->GetListOfElements());
      TDSetElement *e = 0;
      while ((e = (TDSetElement *) nxe())) {
         fChain->AddFile(e->GetName());
      }
      SetBit(kOwnsChain);
      if (TestBit(kProofLite))
         fTree = fChain;
   }
}

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

   if (fChain) {
      SafeDelete(fSet);
      // Remove the chain from the private lists in the TProof objects
      TIter nxp(gROOT->GetListOfSockets());
      TObject *o = 0;
      TProof *p = 0;
      while ((o = nxp()))
         if ((p = dynamic_cast<TProof *>(o)))
            p->RemoveChain(fChain);
      if (fTree == fChain) fTree = 0;
      if (TestBit(kOwnsChain)) {
         SafeDelete(fChain);
      } else {
         fChain = 0;
      }
   } else {
      // Not owner
      fSet = 0;
   }
   SafeDelete(fTree);
   fDirectory    = 0;

}

//______________________________________________________________________________
void TProofChain::Browse(TBrowser *b)
{
   // Forwards the execution to the dummy tree header.
   // See TTree::Browse().

   fSet->Browse(b);
}

//______________________________________________________________________________
Long64_t TProofChain::Draw(const char *varexp, const TCut &selection,
                           Option_t *option, Long64_t nentries, Long64_t firstentry)
{
   // Forwards the execution to the TDSet.
   // Returns -1 in case of error or number of selected events in case of success.
   // See TDSet::Browse().

   if (!gProof) {
      Error("Draw", "no active PROOF session");
      return -1;
   }
   ConnectProof();

   fReadEntry = firstentry;

   // Set either the entry-list (priority) or the event-list
   if (fEntryList) {
      fSet->SetEntryList(fEntryList);
   } else if (fEventList) {
      fSet->SetEntryList(fEventList);
   }

   // Fill drawing attributes
   FillDrawAttributes(gProof);

   Long64_t rv = fSet->Draw(varexp, selection, option, nentries, firstentry);
   return rv;
}

//______________________________________________________________________________
Long64_t TProofChain::Draw(const char *varexp, const char *selection,
                           Option_t *option,Long64_t nentries, Long64_t firstentry)
{
   // Forwards the execution to the TDSet.
   // Returns -1 in case of error or number of selected events in case of success.
   // See TDSet::Browse().

   if (!gProof) {
      Error("Draw", "no active PROOF session");
      return -1;
   }
   ConnectProof();

   fReadEntry = firstentry;

   // Set either the entry-list (priority) or the event-list
   if (fEntryList) {
      fSet->SetEntryList(fEntryList);
   } else if (fEventList) {
      fSet->SetEntryList(fEventList);
   }

   // Fill drawing attributes
   FillDrawAttributes(gProof);

   Long64_t rv = fSet->Draw(varexp, selection, option, nentries, firstentry);
   return rv;
}

//______________________________________________________________________________
void TProofChain::FillDrawAttributes(TProof *p)
{
   // Communicate the drawing attributes for this chain to the input list
   // so that the draw selectors can use them, in case of need.
   // The drawing attributes are:
   //
   //    LineColor          Line color
   //    LineStyle          Line style
   //    LineWidth          Line width
   //    MarkerColor        Marker color index
   //    MarkerSize         Marker size
   //    MarkerStyle        Marker style
   //    FillColor          Area fill color
   //    FillStyle          Area fill style

   if (!p || !fChain) {
      Error("FillDrawAttributes", "invalid PROOF or mother chain pointers!");
      return;
   }
   
   // Weight
   p->SetParameter("PROOF_ChainWeight", fChain->GetWeight());

   // Line Attributes
   p->SetParameter("PROOF_LineColor", (Int_t) fChain->GetLineColor());
   p->SetParameter("PROOF_LineStyle", (Int_t) fChain->GetLineStyle());
   p->SetParameter("PROOF_LineWidth", (Int_t) fChain->GetLineWidth());

   // Marker Attributes
   p->SetParameter("PROOF_MarkerColor", (Int_t) fChain->GetMarkerColor());
   p->SetParameter("PROOF_MarkerSize", (Int_t) fChain->GetMarkerSize()*1000);
   p->SetParameter("PROOF_MarkerStyle", (Int_t) fChain->GetMarkerStyle());

   // Area fill attributes
   p->SetParameter("PROOF_FillColor", (Int_t) fChain->GetFillColor());
   p->SetParameter("PROOF_FillStyle", (Int_t) fChain->GetFillStyle());

   if (gDebug > 0) {
      Info("FillDrawAttributes","line:   color:%d, style:%d, width:%d",
           fChain->GetLineColor(), fChain->GetLineStyle(), fChain->GetLineWidth());
      Info("FillDrawAttributes","marker: color:%d, style:%d, size:%f",
           fChain->GetMarkerColor(), fChain->GetMarkerStyle(), fChain->GetMarkerSize());
      Info("FillDrawAttributes","area:   color:%d, style:%d",
           fChain->GetFillColor(), fChain->GetFillStyle());
   }
}

//______________________________________________________________________________
TBranch *TProofChain::FindBranch(const char* branchname)
{
   // Forwards the execution to the dummy tree header.
   // See TTree::FindBranch().

   return (fTree ? fTree->FindBranch(branchname) : (TBranch *)0);
}

//______________________________________________________________________________
TLeaf *TProofChain::FindLeaf(const char* searchname)
{
   // Forwards the execution to the dummy tree header.
   // See TTree::FindLeaf().

   return (fTree ? fTree->FindLeaf(searchname) : (TLeaf *)0);
}

//______________________________________________________________________________
TBranch *TProofChain::GetBranch(const char *name)
{
   // Forwards the execution to the dummy tree header.
   // See TTree::GetBranch().

   return (fTree ? fTree->GetBranch(name) : (TBranch *)0);
}

//______________________________________________________________________________
Bool_t TProofChain::GetBranchStatus(const char *branchname) const
{
   // Forwards the execution to the dummy tree header.
   // See TTree::GetBranchStatus().

   return (fTree ? fTree->GetBranchStatus(branchname) : kFALSE);
}

//______________________________________________________________________________
TVirtualTreePlayer *TProofChain::GetPlayer()
{
   // Forwards the execution to the dummy tree header.
   // See TTree::GetPlayer().

   return (fTree ? fTree->GetPlayer() : (TVirtualTreePlayer *)0);
}

//______________________________________________________________________________
Long64_t TProofChain::Process(const char *filename, Option_t *option,
                              Long64_t nentries, Long64_t firstentry)
{
   // Forwards the execution to the TDSet.
   // The return value is -1 in case of error and TSelector::GetStatus() in
   // in case of success.
   // See TDSet::Process().

   // Set either the entry-list (priority) or the event-list
   if (fEntryList) {
      fSet->SetEntryList(fEntryList);
   } else if (fEventList) {
      fSet->SetEntryList(fEventList);
   }

   return fSet->Process(filename, option, nentries, firstentry);
}

//______________________________________________________________________________
Long64_t TProofChain::Process(TSelector *selector, Option_t *option,
                              Long64_t nentries, Long64_t firstentry)
{
   // The return value is -1 in case of error and TSelector::GetStatus() in
   // in case of success.

   // Set either the entry-list (priority) or the event-list
   if (fEntryList) {
      fSet->SetEntryList(fEntryList);
   } else if (fEventList) {
      fSet->SetEntryList(fEventList);
   }

   return fSet->Process(selector, option, nentries, firstentry);
}

//______________________________________________________________________________
void TProofChain::SetDebug(Int_t level, Long64_t min, Long64_t max)
{
   // See TTree::SetDebug

   TTree::SetDebug(level, min, max);
}

//______________________________________________________________________________
void TProofChain::SetName(const char *name)
{
   // See TTree::GetName.

   TTree::SetName(name);
}

//______________________________________________________________________________
Long64_t TProofChain::GetEntries() const
{
   // Returns the total number of entries in the TProofChain, which is
   // the number of entries in the TDSet that it holds.

   // this was used for holding the total number of entries
   if (TestBit(kProofLite)) {
      return (fTree ? fTree->GetEntries() : (Long64_t)(-1));
   } else {
      return (fTree ? fTree->GetMaxEntryLoop() : (Long64_t)(-1));
   }
}

//______________________________________________________________________________
Long64_t TProofChain::GetEntries(const char *selection)
{
   // See TTree::GetEntries(const char *selection)
   // Not implemented in TProofChain. Shouldn't be used.

   if (TestBit(kProofLite)) {
      return (fTree ? fTree->GetEntries(selection) : (Long64_t)(-1));
   } else {
      Warning("GetEntries", "GetEntries(selection) not yet implemented");
      return ((Long64_t)(-1));
   }
}

//______________________________________________________________________________
void TProofChain::Progress(Long64_t total, Long64_t processed)
{
   // Changes the number of processed entries.

   if (gROOT->IsInterrupted() && gProof)
      gProof->StopProcess(kTRUE);
   if (total) { }

   fReadEntry = processed;
}

//______________________________________________________________________________
Long64_t TProofChain::GetReadEntry() const
{
   // Returns the number of processed entries.

   return fReadEntry;
}

//______________________________________________________________________________
void TProofChain::ReleaseProof()
{
   // Releases PROOF. Disconnect the "progress" signal.

   if (!gProof)
      return;
   gProof->Disconnect("Progress(Long64_t,Long64_t)",
                      this, "Progress(Long64_t,Long64_t)");
}

//______________________________________________________________________________
void TProofChain::ConnectProof()
{
   // Connects the proof "Progress" signal.

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