// $Id: make_event_trees.C,v 1.11 2007/07/31 16:20:23 rdm Exp $ // // #include "Riostream.h" #include "TProof.h" #include "TString.h" Bool_t make_event_trees(const char *basedir, Int_t events_per_file, Int_t files_per_node) { // This script generates files on PROOF nodes with trees containing // Event objects. // The created files can be used for benchmarking and demonstrations. if (!gProof) { cout << "Must Start PROOF before using make_event_trees.C" << endl; return kFALSE; } if (!basedir) { cout << "'basedir' must not be empty" << endl; return kFALSE; } if (events_per_file <= 0) { cout << "events_per_file must be > 0" << endl; return kFALSE; } if (files_per_node <= 0) { cout << "files_per_node must be > 0" << endl; return kFALSE; } if (gProof->UploadPackage("event.par")) return kFALSE; if (gProof->EnablePackage("event")) return kFALSE; ofstream slavemacro("build_trees.C"); slavemacro << "#include \"TSystem.h\"" << endl; slavemacro << "#include \"TProof.h\"" << endl; slavemacro << "#include \"TProofServ.h\"" << endl; slavemacro << "#include \"TRandom.h\"" << endl; slavemacro << "#include \"TFile.h\"" << endl; slavemacro << "#include \"TTree.h\"" << endl; slavemacro << "#include \"Riostream.h\"" << endl; slavemacro << "#include \"event/Event.h\"" << endl; slavemacro << "void build_trees(const char *basedir, Int_t nevents, Int_t nfiles) {" << endl; slavemacro << " Int_t slave_number = -1;" << endl; slavemacro << " Int_t nslaves = 0;" << endl; if (!strncmp(gProof->GetMaster(), "localhost", 9)) slavemacro << " TString hn = \"localhost\";" << endl; else slavemacro << " TString hn = gSystem->HostName();" << endl; slavemacro << " TString ord = gProofServ->GetOrdinal();" << endl; slavemacro << endl; TList* l = gProof->GetListOfSlaveInfos(); for (Int_t i=0; iGetSize(); i++) { TSlaveInfo* si = dynamic_cast(l->At(i)); if (si->fStatus != TSlaveInfo::kActive) continue; slavemacro << " if (hn == \""; slavemacro << si->fHostName; slavemacro << "\") { nslaves++; if (ord == \""; slavemacro << si->fOrdinal; slavemacro << "\") slave_number = nslaves; }" << endl; } slavemacro << " if (gSystem->AccessPathName(basedir)) {" << endl; slavemacro << " Printf(\"No such file or directory: %s\", basedir);" << endl; slavemacro << " return;" << endl; slavemacro << " }" << endl; slavemacro << endl; slavemacro << " if (slave_number >= 0) {" << endl; slavemacro << " for(Int_t i=slave_number; i<=nfiles; i+=nslaves) {" << endl; slavemacro << endl; slavemacro << " TString seed = hn;" << endl; slavemacro << " seed += \"_\";" << endl; slavemacro << " seed += i;" << endl; slavemacro << " gRandom->SetSeed(static_cast(TMath::Hash(seed)));" << endl; slavemacro << endl; slavemacro << " TString filename = basedir;" << endl; slavemacro << " filename += \"/event_tree_\";" << endl; slavemacro << " filename += seed;" << endl; slavemacro << " filename += \".root\";" << endl; slavemacro << " TDirectory* savedir = gDirectory;" << endl; slavemacro << " TFile *f = TFile::Open(filename, \"RECREATE\");" << endl; slavemacro << " savedir->cd();" << endl; slavemacro << endl; slavemacro << " if (!f || f->IsZombie()) break;" << endl; slavemacro << " Event event;" << endl; slavemacro << " Event *ep = &event;" << endl; slavemacro << " TTree eventtree(\"EventTree\", \"Event Tree\");" << endl; slavemacro << " eventtree.SetDirectory(f);" << endl; slavemacro << " eventtree.Branch(\"event\", \"Event\", &ep, 32000, 1);" << endl; slavemacro << " eventtree.AutoSave();" << endl; slavemacro << endl; slavemacro << " for(Int_t j=0; jcd();" << endl; slavemacro << " eventtree.Write();" << endl; slavemacro << " eventtree.SetDirectory(0);" << endl; slavemacro << " f->Close();" << endl; slavemacro << " delete f;" << endl; slavemacro << " f = 0;" << endl; slavemacro << " savedir->cd();" << endl; slavemacro << endl; slavemacro << " }" << endl; slavemacro << " } else {" << endl; slavemacro << " cout << \"Could not find slave hostname=\";" << endl; slavemacro << " cout << hn << \", ordinal=\" << ord;" << endl; slavemacro << " cout << \" in file production list.\" << endl;" << endl; slavemacro << " cout << \"Make sure the proof.conf contains the \";" << endl; slavemacro << " cout << \"correct slave hostnames.\" << endl;" << endl; slavemacro << " }" << endl; slavemacro << "}" << endl; slavemacro.close(); gProof->Load("build_trees.C+"); TString cmd = "build_trees(\""; cmd += basedir; cmd += "\","; cmd += events_per_file; cmd += ","; cmd += files_per_node; cmd += ")"; if (gProof->Exec(cmd)<0) return kFALSE; return kTRUE; }