ROOT logo
#pragma implementation
using namespace std;
#include "hpartialevent.h"

#include "hades.h"
#include "hmatrixcategory.h"
#include "htree.h"
#include "TBrowser.h"
#include "TBuffer.h"
#include "TClass.h"
#include <stdlib.h>
#include "TROOT.h"
#include "hdebug.h"
#include <iostream> 
#include <iomanip>

//*-- Author : Manuel Sanchez
//*-- Modified : 20/01/2002 by Manuel Sanchez
//*-- Modified : 16/06/2000 by R. Holzmann
//*-- Modified : 7/10/98 by Manuel Sanchez
//*-- Modified : 16/04/98 9:17 by Manuel Sanchez 
//*-- Copyright : GENP (Univ. Santiago de Compostela)

//_HADES_CLASS_DESCRIPTION 
/////////////////////////////////////////////////
//HPartialEvent Begin_Html 
//<a href="HPartialEvent.gif">(UML Diagram)</a> 
//End_Html
// 
//   Each partial events holds the data (i.e. the HDataObjects) corresponding 
// to each main detection system; like Mdcs, Rich...
//
//   These data in a partial event are organized in categories, which stand
// for the different types of data in the partial event. For example, in the
// partial event for the Mdcs there will be a category holding the objects with
// raw data (i.e. the objects instatiating a HMdcRaw). So conceptually the
// categories are "kind of data" and they hold the objects of a particular
// kind (instatiating a particular class).
//
//   The categories are the responsible of giving access to the objects they 
// hold (see HCategory), but a partial event must also allow the user to 
// access the data stored into it; that's done using the function getCategory()
// which returns a particular category, so the user can ask that category for
// the data object he wants. For example, let's say we have a HLocation object
// loc pointing to any location, and a HPartialEvent par with the Mdc's data; 
// if we want to get the raw data object pointed by loc we should use:
//
//    par->getCategory(catMdcRaw)->getObject(loc);
//
//    And this function will return the pursued data object.
//
//////////////////////////////////////////////////////////////////////////

ClassImp(HPartialEvent)

HPartialEvent::HPartialEvent(void) {
  //Default constructor
  fHeader=NULL;
  fRecLevel=1;
  fCategories=new TObjArray(32);
  setExpandedStreamer(kFALSE);
}

HPartialEvent::HPartialEvent(const Text_t *aName,
			     const Text_t *aTitle,
			     Cat_t aBaseCat) : HEvent(aName,aTitle) 
{
  //Allocates a new HPartial event with name aName and title aTitle
  //
  // aBaseCat is the identifier of the lower category that will be stored in
  // this partial event, for example: if the user wants to allocate a partial
  // event holding the Mdc data, then aBaseCat should be: catMdc; which is a
  // constant defined in HadDef.h
  fHeader=NULL;
  fBaseCategory=aBaseCat;
  fRecLevel=rlRaw;
  fCategories=new TObjArray(32);
  setExpandedStreamer(kFALSE);
}
   
HPartialEvent::~HPartialEvent(void) {
  //Clears the event 
 if (fCategories) {
   fCategories->Delete();
   delete fCategories;
 }
}

void HPartialEvent::activateBranch(TTree *tree,Int_t splitLevel) {
  // Activates those branches in the TTree tree whose names are equal to those
  //of the branches that would be generated with the current event structure if
  //the function makeBranch() is called, being the split level=splitLevel
  //
  // This way if we have a TTree with a lot of branches and we only need some
  //of them to fill data in the event structure we are using at a given moment,
  //then we only activate those branches and the others are not read
  TString cad;
  Text_t name[255];
  
#if DEBUG_LEVEL>2
  gDebuger->enterFunc("HPartialEvent::activateBranch");
#endif
  if (fCategories) {
    if (splitLevel==2) {
      TObjArray &vector=*fCategories;
      HCategory **cat;
      Int_t i;
      TBranch *brHead=0;
      TBranch *brCategory=0;

      for (i=0;i<=vector.GetLast();i++) {
	cat=(HCategory **)&vector[i];
	if ( (*cat)!=NULL && ((*cat)->IsPersistent())) {
	  if ( (*cat)->isSelfSplitable()) 
	    (*cat)->activateBranch(tree,splitLevel);
	  else {
	    cad=(*cat)->getClassName();
	    cad += ".";
	    brCategory = tree->GetBranch(cad.Data());
	    if (brCategory) { //Post ROOT3 splitting
	      tree->SetBranchAddress(cad.Data(),cat);
	      (*cat)->activateBranch(tree,splitLevel);
	      tree->SetBranchStatus(cad.Data(),1);
	      cad=(*cat)->getClassName(); cad+="*";
	      tree->SetBranchStatus(cad.Data(),1);
	    } else {
	      cad=(*cat)->getClassName();
	      brCategory = tree->GetBranch(cad.Data());
	      if (brCategory) { //Pre ROOT3 splitting
		tree->SetBranchAddress(cad.Data(),cat);
		(*cat)->activateBranch(tree,splitLevel);
		tree->SetBranchStatus(cad.Data(),1);
		cad=(*cat)->getClassName(); cad+=".*";
		tree->SetBranchStatus(cad.Data(),1);
	      } else {
		Warning("activateBranch","Category %s not found in tree",
			cad.Data());
	      }
	    }
    	  }
	}
      }
      sprintf(name,"%s.Header",GetName());
      brHead=tree->GetBranch(name);
      if (brHead) { //Pre ROOT3 splitting
	tree->SetBranchAddress(name,&fHeader);
	tree->SetBranchStatus(name,1);
      }
    }
  }
#if DEBUG_LEVEL>2
  gDebuger->leaveFunc("return HPartialEvent::activateBranch");
#endif
}
 
void HPartialEvent::makeBranch(TBranch *parent,HTree* tree) {
  // Makes branches for each category in the partial event and for the split
  //tree, then those branches are added to the list of subbranches of "parent"
  //
  // This method is called by Hades::makeTree() 
  TString cad;
  Text_t name[255];

  if (fCategories) {
    if (gHades->getSplitLevel()==2) {
      TObjArray &vector=*fCategories;
      HCategory **cat;
      Int_t i;
      for (i=0;i<=vector.GetLast();i++) {
	cat=(HCategory **)&vector[i];
	if ( (*cat)!=NULL && ((*cat)->IsPersistent())) {
	  if ( (*cat)->isSelfSplitable()) {
	      tree->Branch((*cat)->getClassName(),
			   (*cat)->ClassName(),
			   cat,gHades->getTreeBufferSize(),0);
	      //parent->GetListOfBranches()->Add(b);
	      //(*cat)->makeBranch(b);
	  } else {
	      sprintf(name,"%s.",(*cat)->getClassName());
	      tree->Branch(name,
			   (*cat)->ClassName(),
			   cat,gHades->getTreeBufferSize(),99);
	      //parent->GetListOfBranches()->Add(b);
	  }
	}
      }
 
    }
  }
}

Bool_t HPartialEvent::addCategory(Cat_t aCat,HCategory *cat,Option_t *) {
  // Adds the category "cat", identified by "aCat" to the partial event.
  addCategory(aCat,cat);
  return kTRUE;
}

void HPartialEvent::addCategory(Cat_t aCat,HCategory *category) {
  // Adds the category "category", which is identified by aCat, to the partial
  //event
  //
  // Before using this function the user should setup the HCategory "category"
  //
#if DEBUG_LEVEL>2
  gDebuger->enterFunc("HPartialEvent::addCategory");
#endif
  fCategories->AddAtAndExpand(category,aCat-fBaseCategory);
  category->setCategory(aCat);
#if DEBUG_LEVEL>2
  gDebuger->leaveFunc("HPartialEvent::addCategory");
#endif
}

Bool_t HPartialEvent::removeCategory(Cat_t aCat) {
  //Removes the category aCat from this partial event and deletes it.
  HCategory *category=0;
  category=(HCategory *)fCategories->At(aCat-fBaseCategory);
  if (category==0) return kFALSE;
  fCategories->RemoveAt(aCat-fBaseCategory);
  delete category;
  return kTRUE;
}

TObjArray *HPartialEvent::getCategories(void) {
  // Returns an array with all the categories held by this event
  //
  // To add categories to the partial event use HPartialEvent::addCategory()
  return fCategories;
}

HCategory *HPartialEvent::getCategory(Cat_t aCat) {
  // Returns a pointer to the category identified by "aCat"
  HCategory *cat;
  cat=(HCategory *)fCategories->At(aCat-fBaseCategory);
  return cat;
}
      
void HPartialEvent::Clear(Option_t *) {
  // Clears the partial event,i.e. deletes all objects in the partial event
  //but keeping its structure.
  //
  // After the reconstruction of each event, the HEvent::Clear function must
  //be called in order to make place for the new data. 
 TIter nextCat(fCategories);
 HCategory *cat;

 while ((cat=(HCategory *)nextCat())!=NULL) {
    cat->Clear();
 }
}

void HPartialEvent::clearAll(Int_t level) {
  //See HEvent
  if (level>1) {
    Clear();
  } else {
    if (fCategories) fCategories->Delete();
  }
}

void HPartialEvent::setRecLevel(Int_t aRecLevel) {
  // Sets the reconstruction level of the event, this is useful to know which
  //categories in the event are already reconstructed.
  fRecLevel=aRecLevel;
}

void HPartialEvent::setPersistency(Bool_t fPersistency) {
  Int_t nCat = fCategories->GetEntriesFast();
  for (Int_t i=0; i<nCat; i++) { // loop over categories
    HCategory* cat = (HCategory*)(fCategories->At(i));
    if (cat) cat->HCategory::setPersistency(fPersistency);
  }  
}

Int_t HPartialEvent::getRecLevel(void) {
  // Returns the reconstruction level of the partial event.
  return fRecLevel;
}

void HPartialEvent::Browse(TBrowser *b) {
  // Method used to browse a partial event with a Root browser.
  //
  // This function will be called by a Root browser, not by the user
  if (!fCategories) return;
  TIter next(fCategories);
  HCategory *cat;

  while ((cat=(HCategory *)next())!=NULL) {
     if (cat->InheritsFrom("HSplitCategory")) b->Add(cat,cat->getClassName());
     else cat->Browse(b);
  }
}

void HPartialEvent::Streamer(TBuffer &R__b)
{
  // Stream an object of class HPartialEvent.
  TObjArray *catNames=0;
  Int_t nCategories=0;
  HCategory *category=0;
  Char_t buffer[255];

  if (R__b.IsReading()) {
    Version_t R__v = R__b.ReadVersion(); if (R__v) { }
    HEvent::Streamer(R__b);
    R__b >> fRecLevel;
    R__b >> fBaseCategory;
    R__b >> fHeader;
    if (R__v == 2 && !hasExpandedStreamer() ) {
      if (fCategories) fCategories->Delete();
      R__b >> fCategories;
    } else {
      R__b >> catNames;
      nCategories=catNames->GetEntriesFast();
      for (Int_t i=0;i<nCategories;i++) {
	if (catNames->At(i)!=NULL) {
	  strcpy(buffer,((TObjString *)catNames->At(i))->GetString().Data());
	  if (gROOT->GetClass(buffer)) {
	    category=(HCategory *)gDirectory->Get(buffer);
	    fCategories->AddAtAndExpand(category,i);
	  }
	}
      }
      delete catNames;
    }
  } else {
    R__b.WriteVersion(HPartialEvent::IsA());
    HEvent::Streamer(R__b);
    R__b << fRecLevel;
    R__b << fBaseCategory;
    R__b << fHeader;
    if (!hasExpandedStreamer()) {
      R__b << fCategories;
    } else {
      nCategories=fCategories->GetEntriesFast(); 
      catNames=new TObjArray(nCategories);
      for (Int_t i=0;i<nCategories;i++) {
	category=(HCategory *)fCategories->At(i);
	if (category) { 
	 if (category->IsPersistent())
	  catNames->AddAt(new TObjString(category->getClassName()),i);
	}
      }
      R__b << catNames;
      for (Int_t i=0;i<nCategories;i++) { 
	category=(HCategory *)fCategories->At(i);
	if (category) { 
	  if (category->IsPersistent())
	    category->Write(category->getClassName());
	}
      }
      delete catNames;
    }
  }
}  

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