45 Int_t ProofAux::GetAction(TList *input)
52 TNamed *ntype =
dynamic_cast<TNamed*
>(input->FindObject(
"ProofAux_Action"));
54 TString act(ntype->GetTitle());
55 if (act ==
"GenerateTreesSameFile") {
57 }
else if (act.BeginsWith(
"GenerateTrees")) {
60 Ssiz_t icol = act.Index(
":");
63 act.Remove(0, icol+1);
64 if (!act.IsNull()) fDir = act;
67 Warning(
"GetAction",
"unknown action: '%s'", ntype->GetTitle());
76 void ProofAux::Begin(TTree * )
84 void ProofAux::SlaveBegin(TTree * )
90 TString option = GetOption();
93 fAction = GetAction(fInput);
96 TParameter<Long64_t> *a = (TParameter<Long64_t> *) fInput->FindObject(
"ProofAux_NEvents");
97 if (a) fNEvents = a->GetVal();
100 fMainList =
new TList;
101 if (gProofServ) fMainList->SetName(TString::Format(
"MainList-%s", gProofServ->GetOrdinal()));
103 fFriendList =
new TList;
104 if (gProofServ) fFriendList->SetName(TString::Format(
"FriendList-%s", gProofServ->GetOrdinal()));
109 Bool_t ProofAux::Process(Long64_t entry)
131 Error(
"Process",
"action not specified!");
136 TDSetElement *fCurrent = 0;
138 if (fInput && (elemPair = dynamic_cast<TPair *>(fInput->FindObject(
"PROOF_CurrentElement")))) {
139 if ((fCurrent = dynamic_cast<TDSetElement *>(elemPair->Value()))) {
140 Info(
"Process",
"entry %lld: file: '%s'", entry, fCurrent->GetName());
142 Error(
"Process",
"entry %lld: no file specified!", entry);
151 if (GenerateTree(fCurrent->GetName(), fNEvents, fnt) != 0) {
152 Error(
"Process",
"problems generating tree (%lld, %s, %lld)",
153 entry, fCurrent->GetName(), fNEvents);
158 TString xf = gSystem->BaseName(fnf);
159 fnf = gSystem->DirName(fnf);
160 if (xf.Contains(
"tree")) {
161 xf.ReplaceAll(
"tree",
"friend");
163 if (xf.EndsWith(
".root")) {
164 xf.ReplaceAll(
".root",
"_friend.root");
169 fnf += TString::Format(
"/%s", xf.Data());
171 if (GenerateFriend(fnt, fnf) != 0) {
172 Error(
"Process",
"problems generating friend tree for %s (%s)",
173 fCurrent->GetName(), fnt.Data());
176 }
else if (fAction == 1) {
179 if (GenerateTree(fCurrent->GetName(), fNEvents, fnt) != 0) {
180 Error(
"Process",
"problems generating tree (%lld, %s, %lld)",
181 entry, fCurrent->GetName(), fNEvents);
185 if (GenerateFriend(fnt) != 0) {
186 Error(
"Process",
"problems generating friend tree for %s (%s)",
187 fCurrent->GetName(), fnt.Data());
190 }
else if (fAction == 2) {
193 if (GenerateTree(fCurrent->GetName(), fNEvents, fnt) != 0) {
194 Error(
"Process",
"problems generating tree (%lld, %s, %lld)",
195 entry, fCurrent->GetName(), fNEvents);
200 Warning(
"Process",
"do not know how to process action %d - do nothing", fAction);
208 void ProofAux::SlaveTerminate()
214 if (fMainList && fMainList->GetSize() > 0) fOutput->Add(fMainList);
215 if (fFriendList && fFriendList->GetSize() > 0) fOutput->Add(fFriendList);
219 void ProofAux::Terminate()
228 Int_t ProofAux::GenerateTree(
const char *fnt, Long64_t ent, TString &fn)
240 Error(
"GenerateTree",
"file name undefined!");
244 if (!strcmp(uu.GetProtocol(),
"file") && !fn.BeginsWith(
"/")) {
247 !(gProofServ->GetDataDir()) || strlen(gProofServ->GetDataDir()) <= 0) {
248 Error(
"GenerateTree",
"data directory undefined!");
252 fn.Insert(0, TString::Format(
"%s/", gProofServ->GetDataDir()));
254 TString dir = gSystem->DirName(fn);
255 if (gSystem->AccessPathName(dir, kWritePermission)) {
256 if (gSystem->mkdir(dir, kTRUE) != 0) {
257 Error(
"GenerateTree",
"problems creating directory %s to store the file", dir.Data());
264 TDirectory *savedir = gDirectory;
265 TFile *f =
new TFile(fn,
"RECREATE");
266 if (!f || f->IsZombie()) {
267 Error(
"GenerateTree",
"problems opening file %s", fn.Data());
273 TDirectory *destdir = f;
274 if (!fDir.IsNull()) {
275 if (f->mkdir(fDir.Data())) {
276 Info(
"GenerateTree",
"sub-directory '%s' successfully created", fDir.Data());
278 destdir = gDirectory;
280 Error(
"GenerateTree",
"creating sub-directory '%s'", fDir.Data());
290 TTree *T =
new TTree(
"Tmain",
"Main tree for tutorial friends");
291 T->SetDirectory(destdir);
293 T->Branch(
"Run",&Run,
"Run/I");
295 T->Branch(
"Event",&Event,
"Event/L");
296 Float_t x = 0., y = 0., z = 0.;
297 T->Branch(
"x",&x,
"x/F");
298 T->Branch(
"y",&y,
"y/F");
299 T->Branch(
"z",&z,
"z/F");
301 for (Long64_t i = 0; i < ent; i++) {
302 if (i > 0 && i%1000 == 0) Run++;
318 Info(
"GenerateTree",
"file '%s' successfully created", fn.Data());
322 if (!strcmp(uu.GetProtocol(),
"file")) {
323 if (gSystem->Getenv(
"LOCALDATASERVER")) {
324 if (strcmp(TUrl(gSystem->Getenv(
"LOCALDATASERVER"), kTRUE).GetProtocol(),
"file"))
325 fds.Insert(0, TString::Format(
"%s/", gSystem->Getenv(
"LOCALDATASERVER")));
327 fds.Insert(0, TString::Format(
"root://%s/", gSystem->HostName()));
330 fMainList->Add(
new TObjString(fds));
337 Int_t ProofAux::GenerateFriend(
const char *fnt,
const char *fnf)
351 Error(
"GenerateFriend",
"file name for the main tree undefined!");
355 if (gSystem->AccessPathName(fin, kReadPermission)) {
356 Error(
"GenerateFriend",
"input file does not exist or cannot be read: %s", fin.Data());
361 Bool_t sameFile = kTRUE;
362 const char *openMain =
"UPDATE";
366 if (!fout.IsNull()) {
370 TString dir = gSystem->DirName(fout);
371 if (gSystem->AccessPathName(dir, kWritePermission)) {
372 if (gSystem->mkdir(dir, kTRUE) != 0) {
373 Error(
"GenerateFriend",
"problems creating directory %s to store the file", dir.Data());
383 TFile *fi = TFile::Open(fin, openMain);
384 if (!fi || fi->IsZombie()) {
385 Error(
"GenerateFriend",
"problems opening input file %s", fin.Data());
388 TTree *Tin = (TTree *) fi->Get(
"Tmain");
390 Error(
"GenerateFriend",
"problems getting tree 'Tmain' from file %s", fin.Data());
396 Tin->SetBranchAddress(
"x", &x);
397 Tin->SetBranchAddress(
"y", &y);
398 Tin->SetBranchAddress(
"z", &z);
399 TBranch *b_x = Tin->GetBranch(
"x");
400 TBranch *b_y = Tin->GetBranch(
"y");
401 TBranch *b_z = Tin->GetBranch(
"z");
403 TDirectory* savedir = gDirectory;
407 fo =
new TFile(fout,
"RECREATE");
408 if (!fo || fo->IsZombie()) {
409 Error(
"GenerateFriend",
"problems opening file %s", fout.Data());
421 TTree *Tfrnd =
new TTree(
"Tfrnd",
"Friend tree for tutorial 'friends'");
422 Tfrnd->SetDirectory(fo);
424 Tfrnd->Branch(
"r",&r,
"r/F");
425 Long64_t ent = Tin->GetEntries();
426 for (Long64_t i = 0; i < ent; i++) {
430 r = TMath::Sqrt(x*x + y*y + z*z);
440 Tfrnd->SetDirectory(0);
446 Info(
"GenerateFriend",
"friend file '%s' successfully created", fout.Data());
450 if (!strcmp(uu.GetProtocol(),
"file")) {
451 if (gSystem->Getenv(
"LOCALDATASERVER")) {
452 if (strcmp(TUrl(gSystem->Getenv(
"LOCALDATASERVER"), kTRUE).GetProtocol(),
"file"))
453 fout.Insert(0, TString::Format(
"%s/", gSystem->Getenv(
"LOCALDATASERVER")));
455 fout.Insert(0, TString::Format(
"root://%s/", gSystem->HostName()));
458 fFriendList->Add(
new TObjString(fout));