Ah, hang on. I'd better correct myself here; TMBTree.hpp did NOT come from MakeClass(). I've included it below. Does this make the problem more obvious? Thanks for any help, Simon #ifndef TMBTree_h #define TMBTree_h #include <TROOT.h> #include <TChain.h> #include <TFile.h> #include <TClonesArray.h> #include "TMBTreeHeaders.hpp" #include <iostream> #include <map> // includes for edm // #ifndef __CINT__ // #ifndef LIBBUILD // #include "edm/Event.hpp" // #else // namespace edm { // class Event; // }; // #endif // #else // namespace edm { // class Event; // }; // #endif const Int_t kMaxFps = 10; const Int_t kMaxCps = 17; const Int_t kMaxTrks = 184; const Int_t kMaxVrts = 11; const Int_t kMaxIsoTrks = 15; const Int_t kMaxEmCells = 262; const Int_t kMaxEmcl = 15; const Int_t kMaxMuon = 34; const Int_t kMaxJets = 228; const Int_t kMaxLeBob = 8; const Int_t kMaxTaus = 11; const Int_t kMaxTrig = 19; const Int_t kMaxBCJets = 19; const Int_t kMaxMCvtx = 1; const Int_t kMaxMCpart = 1; const Int_t kMaxTRefs = 40; class TMBTree { public : TTree *fChain; //!pointer to the analyzed TTree or TChain Int_t fCurrent; //!current Tree number in a TChain // Top branch objects. TClonesArray *fTrks; // Container of tracks TClonesArray *fIsoTrks; // Container of isolated trackss TClonesArray *fEmcl; // Container of Emcl TClonesArray *fMuon; // Container of Muon TClonesArray *fJets; // Container of Jets TClonesArray *fVrts; // Container of Jets TClonesArray *fFps; // Container of Fps TClonesArray *fCps; // Container of Cps TClonesArray *fTaus; // Container of Taus TClonesArray *fMCvtx; // Container of MCvtx TClonesArray *fMCpart; // Container of MCpart TClonesArray *fTRefs; // Container of TRefs TClonesArray *fTrig; // Container of Trig TMBMet *fMet; TMBGlob *fGlob; TMBMCevtInfo *fMCevtInfo; //List of top branches TBranch *b_Trks; //! TBranch *b_Emcl; //! TBranch *b_Jets; //! TBranch *b_Vrts; //! TBranch *b_IsoTrks; //! TBranch *b_Muon; //! TBranch *b_Fps; //! TBranch *b_Cps; //! TBranch *b_Taus; //! TBranch *b_MCvtx; //! TBranch *b_MCpart; //! TBranch *b_TRefs; //! TBranch *b_Trig; //! TBranch *b_Met; //! TBranch *b_Glob; //! TBranch *b_MCevtInfo; //! TMBTree(TTree *tree=0); TMBTree(const char* filename); ~TMBTree(); Int_t Cut(Int_t entry); Int_t GetEntry(Int_t entry); Int_t LoadTree(Int_t entry); void Init(TTree *tree); //=============================================================== void TrackQuality(int nevents); void BackToBackSystem(int nevents); void ViewDimuonPair(); int GetPrimaryVertex(); int GetSecondaryVertex(); void Statistics(); bool ThisTrackIsAMuon(TMBTrks*, double&); void TestThisTrackIsAMuon(); void TestCorrectedDCA(); bool ThisIsAMCEvent(); void ZtautauMC(int nevents); void ZmumuMC(int nevents); void ZbbMC(int nevents); void ZccMC(int nevents); void ViewMC(int nevents); void ViewJets(int nevents); void Emu(int nevents, int Ztautau_bool); //=============================================================== Bool_t Notify(); void Show(Int_t entry = -1); // void Walk(TMBMCpart * mcpart); }; #endif #ifdef TMBTree_cxx TMBTree::TMBTree(const char* filename) { if (!filename) { filename = "tmb_tree.root"; } TFile *f = (TFile*)gROOT->GetListOfFiles()->FindObject(filename); if (!f) f = new TFile(filename); if (!f) return; TTree *tree = (TTree*)gDirectory->Get("TMBTree"); // Default tree name Init(tree); } TMBTree::TMBTree(TTree *tree) { // if parameter tree is not specified (or zero), connect the file // used to generate this class and read the Tree. if (tree == 0) { TFile *f = (TFile*)gROOT->GetListOfFiles()->FindObject("tmb_tree.root"); if (!f) { f = new TFile("tmb_tree.root"); if (!f) return; } tree = (TTree*)gDirectory->Get("TMBTree"); } Init(tree); } TMBTree::~TMBTree() { if (!fChain) return; delete fChain->GetCurrentFile(); } Int_t TMBTree::GetEntry(Int_t entry) { // Read contents of entry. if (!fChain) return 0; return fChain->GetEntry(entry); } Int_t TMBTree::LoadTree(Int_t entry) { // Set the environment to read one entry if (!fChain) return -5; Int_t centry = fChain->LoadTree(entry); if (centry < 0) return centry; if (fChain->IsA() != TChain::Class()) return centry; TChain *chain = (TChain*)fChain; if (chain->GetTreeNumber() != fCurrent) { fCurrent = chain->GetTreeNumber(); Notify(); } return centry; } void TMBTree::Init(TTree *tree) { // Set branch addresses if (tree == 0) return; fChain = tree; fCurrent = -1; fTrks = new TClonesArray("TMBTrks",kMaxTrks); fChain->SetBranchAddress("Trks",&fTrks); fEmcl = new TClonesArray("TMBEmcl",kMaxEmcl); fChain->SetBranchAddress("Emcl",&fEmcl); fJets = new TClonesArray("TMBJets",kMaxJets); fChain->SetBranchAddress("Jets",&fJets); fVrts = new TClonesArray("TMBVrts",kMaxVrts); fChain->SetBranchAddress("Vrts",&fVrts); fIsoTrks = new TClonesArray("TMBIsoTrks",kMaxIsoTrks); fChain->SetBranchAddress("IsoTrks",&fIsoTrks); fMuon = new TClonesArray("TMBMuon",kMaxMuon); fChain->SetBranchAddress("Muon",&fMuon); fFps = new TClonesArray("TMBFps",kMaxFps); fChain->SetBranchAddress("Fps",&fFps); fCps = new TClonesArray("TMBCps",kMaxCps); fChain->SetBranchAddress("Cps",&fCps); fTaus = new TClonesArray("TMBTaus",kMaxTaus); fChain->SetBranchAddress("Taus",&fTaus); fMCvtx = new TClonesArray("TMBMCvtx",kMaxMCvtx); fChain->SetBranchAddress("MCvtx",&fMCvtx); fMCpart = new TClonesArray("TMBMCpart",kMaxMCpart); fChain->SetBranchAddress("MCpart",&fMCpart); fTRefs = new TClonesArray("TMBTRefs",kMaxTRefs); fChain->SetBranchAddress("TRefs",&fTRefs); fTrig = new TClonesArray("TMBTrig",kMaxTrig); fChain->SetBranchAddress("Trig",&fTrig); fMet = new TMBMet(); fChain->SetBranchAddress("Met",&fMet); fGlob = new TMBGlob(); fChain->SetBranchAddress("Glob",&fGlob); fMCevtInfo = new TMBMCevtInfo(); fChain->SetBranchAddress("MCevtInfo",&fMCevtInfo); Notify(); } Bool_t TMBTree::Notify() { // Called when loading a new file. // Get branch pointers. b_Trks = fChain->GetBranch("Trks"); b_Emcl = fChain->GetBranch("Emcl"); b_Jets = fChain->GetBranch("Jets"); b_Vrts = fChain->GetBranch("Vrts"); b_IsoTrks = fChain->GetBranch("IsoTrks"); b_Muon = fChain->GetBranch("Muon"); b_Fps = fChain->GetBranch("Fps"); b_Cps = fChain->GetBranch("Cps"); b_Taus = fChain->GetBranch("Taus"); b_MCvtx = fChain->GetBranch("MCvtx"); b_MCpart = fChain->GetBranch("MCpart"); b_TRefs = fChain->GetBranch("TRefs"); b_Trig = fChain->GetBranch("Trig"); b_Met = fChain->GetBranch("Met"); b_Glob = fChain->GetBranch("Glob"); b_MCevtInfo = fChain->GetBranch("MCevtInfo"); return kTRUE; } void TMBTree::Show(Int_t entry) { // Print contents of entry. // If entry is not specified, print current entry if (!fChain) return; fChain->Show(entry); } Int_t TMBTree::Cut(Int_t entry) { // This function may be called from Loop. // returns 1 if entry is accepted. // returns -1 otherwise. return 1; } #endif // #ifdef TMBTree_cxx On Tue, 5 Aug 2003, Simon Dean wrote: > Dear ROOT experts, > > I've been trying to extract a subset of events from a ROOT tree using code > similar to that shown at the end of this message. > > It runs OK (after removing the code in the automatically generated > TMBTree destructor - otherwise I get a segmentation violation) BUT when I > then run code over the new TFile, I get this output: > > Error in <TBuffer::ReadObject>: object tag too large, I/O buffer corrupted > > (...the above line appears 492 times in the real output - there are 374 > branches in the tree...) > > *** Break *** segmentation violation > Generating stack trace... > 0x401d6cbb in TUnixSystem::StackTrace(void) + 0x25b from > /home1/sdean/root305/lib/libCore.so > 0x401d5812 in TUnixSystem::DispatchSignals(ESignals) + 0xb2 from > /home1/sdean/root305/lib/libCore.so > 0x401d49bb in <unknown> from /home1/sdean/root305/lib/libCore.so > 0x401d8585 in <unknown> from /home1/sdean/root305/lib/libCore.so > 0x40f32f75 in <unknown> from /lib/i686/libpthread.so.0 > 0x42029188 in <unknown> from ./runTMBTree > 0x4013f447 in TRef::Streamer(TBuffer &) + 0x3f from > /home1/sdean/root305/lib/libCore.so > 0x401adbb4 in TStreamerInfo::ReadBufferClones(TBuffer &, TClonesArray *, > int, int, int) + 0x1c9c from /home1/sdean/root305/lib/libCore.so > 0x40d32a52 in TBranchElement::ReadLeaves(TBuffer &) + 0x8ca from > /home1/sdean/root305/lib/libTree.so > 0x40d2c5dc in TBranch::GetEntry(int, int) + 0x1b4 from > /home1/sdean/root305/lib/libTree.so > 0x40d31912 in TBranchElement::GetEntry(int, int) + 0x1da from > /home1/sdean/root305/lib/libTree.so > 0x40d318b5 in TBranchElement::GetEntry(int, int) + 0x17d from > /home1/sdean/root305/lib/libTree.so > 0x40d4ac90 in TTree::GetEntry(int, int) + 0x98 from > /home1/sdean/root305/lib/libTree.so > 0x40d36add in TChain::GetEntry(int, int) + 0x49 from > /home1/sdean/root305/lib/libTree.so > 0x08060908 in TMBTree::Emu(int, int) + 0xf20 from ./runTMBTree > 0x0806694e in main + 0x1aa from ./runTMBTree > 0x42017589 in __libc_start_main + 0x95 from ./runTMBTree > 0x0804a6a1 in __register_frame_info + 0x3d from ./runTMBTree > Aborted > > Can anyone halp me fix this? > > Thanks a lot, > > Simon Dean > > > (compiled code - TMBTree.cpp and TMBTree.hpp were produced by the > MakeClass() function) > > =====/ runTMBTree.cpp /==== > > #include "TMBTree.cpp" > > int main(){ > > TMBTree data(filename); > data.SeparateChannels(); > > return 0; > > } > > > =====/ TMBTree.cpp /===== > > #include "TMBTree.hpp" > > void TMBTree::SeparateChannels(){ > > if (fChain == 0) return; > > int nentries = (nevents)?nevents:int(fChain->GetEntries()); > > TFile *newfile = new TFile("SeparateChannels.root","RECREATE"); > TTree *newtree = fChain->CloneTree(0); > > for (int jentry=0; jentry<nentries;jentry++) { > > int ientry = LoadTree(jentry); > if (ientry < 0) break; > nb = fChain->GetEntry(jentry); nbytes += nb; > > if (....) newtree->Fill() > > } > > newtree->Write("",TObject::kOverwrite); > newfile->Close(); > > return; > > } > >
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:14 MET