Re: Create a bash-script that runs C-files in ROOT

From: Ida Häggström <ida.haggstrom_at_radfys.umu.se>
Date: Wed, 7 Apr 2010 10:37:08 +0200


Hello and thanks for your input!

You are right about the chain being unnecessary, but I'm working on someone elses code and haven't dared changing too much! =) I might want to add different root files later on so I think I will keep the chain for now. I've continued working on my script and got it to half work... Running the bash-script:
------------bash-script-----------------
for (j=0;j<=$N,j++)
do
  cd folder$j
  root -q -b myScript1.C\($j\) myScript2.C   cd ..
done



with:
-----------myScript1.C---------------

void myScript1(int fileNumber)
{
  gROOT->Reset();
..........stuff.............

  char Root_File[250];
  TChain chain("finalCoinci");
  sprintf(Root_File,"rootOutput_%d.root",fileNumber);   chain.Add(Root_File);
  printf("\n Processing file rootOutput_t%d.root...\n",fileNumber);

......more stuff.....
}



results in some warnings:

Processing file rootOutput_0.root...

Total Number of Coincidence Events:= 730 ... 0
Warning: wrong member access operator '.' /home/ida/GATE/ROOT_v5.24/root/share/root/macros/GEAdvance3D_SinogramFinalCoinci_Bin.C:411: Warning: wrong member access operator '.' /home/ida/GATE/ROOT_v5.24/root/share/root/macros/GEAdvance3D_SinogramFinalCoinci_Bin.C:414: Warning: wrong member access operator '.' /home/ida/GATE/ROOT_v5.24/root/share/root/macros/GEAdvance3D_SinogramFinalCoinci_Bin.C:417: Warning: wrong member access operator '.' /home/ida/GATE/ROOT_v5.24/root/share/root/macros/GEAdvance3D_SinogramFinalCoinci_Bin.C:420: Warning: wrong member access operator '.' /home/ida/GATE/ROOT_v5.24/root/share/root/macros/GEAdvance3D_SinogramFinalCoinci_Bin.C:423:



Apparently it is able to understand the input (0 in this case) and find and open the associated file (rootOutput_0.root) but then I get some warnings that I don't understand. I've looked at the lines (411,414 etc) in my C-script, but they are just blank... The weird thing is that when I remove the first line in the C-script and determine "fileNumber" inside the script:
---------myScript1.C----------------

{
  gROOT->Reset();
  int fileNumber=0;
..........stuff.............

  char Root_File[250];
  TChain chain("finalCoinci");
  sprintf(Root_File,"rootOutput_%d.root",fileNumber);   chain.Add(Root_File);
  printf("\n Processing file rootOutput_t%d.root...\n",fileNumber);

......more stuff.....
}



and run the bash-script without any input argument to myScript1.C, I get no warnings and the script runs perfectly and finds the right file and so on! What could I be doing wrong?
Thanks!
Ida

Den 7 april 2010 10.00 skrev Axel Naumann <Axel.Naumann_at_cern.ch>:

> Hi Ida,
>
> what about the following:
>
> #include <iostream>
>
> void myScript1(int dir) {
>  TString filename = TString::Format("rootFile_%d.root", dir);
>  TFile* f = TFile::Open(filename);
>  if (!f || f->IsZombie()) {
>    std::cerr << filename << " not found!" << std::endl;
>    return;
>  }
>  TTree* tree = 0;
>  f->GetObject("finalDelayedCoinci", tree);
> }
>
> With one single tree per run you don't need a TChain, and you can pass the
> dir number to the C++ part by invoking it with:
>
>
> for (j=0;j<=$N,j++)
> do
>   cd folder$j
>   root -q -b myScript1.C\($j\) myScript2.C
>   cd ..
> done
>
> Cheers, Axel.
>
> Ida Häggström wrote on 04/07/2010 08:47 AM:
>
>> Hi Brett and thanks for your suggestion!
>> I'm really not familiar with C unfortunately and tried implementing your
>> suggestion without success... =(. I do need something similar to this, i.e.
>> be able to call different filenames. To be more specific:
>>
>> I have a bash-script with a loop ( in this case 40 loops, as many as the
>> number of root files I have).
>> Each loop I run:
>> --------------------------------------
>> for (j=0;j<=$N,j++)
>> do
>>   cd folder$j
>>   root -q -b myScript1.C myScript2.C
>>   cd ..
>> done
>> --------------------------------------
>> Each folder I enter contains one root file, different names however. Now,
>> each loop I want to use a different root-file in the first C-script
>> (rootFile_0.root to rootFile_39.root).
>> I've searched around and tried this in my first C-script (myScript1.C):
>> --------------------------------------
>>  char Root_File[250];
>>  void *dirp = gSystem->OpenDirectory(".");
>>  const char *afile;
>>  Int_t nfiles = 0;
>>   while(afile = gSystem->GetDirEntry(dirp)) {
>>      if (strstr(afile,".root")) {
>>    TChain chain("finalDelayedCoinci");
>>      sprintf(Root_File,"%s",afile);
>>      chain.Add(Root_File);
>>      printf("\n Processing file %s...\n",afile);
>>        nfiles++;
>>      }
>>  }
>> --------------------------------------
>> This seems to find the single root-file in each directory. However, I'm
>> afraid this will cause some problems if I for example add another root-file
>> into a folder or something. Your suggestion would be nicer, if I can just
>> send the filename as an argument into the C-script, something like:
>> --------------------------------------
>> for (j=0;j<=$N,j++)
>> do
>>   cd folder$j
>>   root -q -b myScript1.C("rootFile_$j") myScript2.C
>>   cd ..
>> done
>> --------------------------------------
>> and then add this file to the chain inside the C-script. I've tried
>> implementing this, but unfortunately I'm really not good at neither C nor
>> root! I really appreciate your help,
>>
>> Cheers,
>> Ida
>>
>>
>> Den 6 april 2010 19.56 skrev Brett Viren <bv_at_bnl.gov <mailto:bv_at_bnl.gov
>> >>:
>>
>>
>>    Ida Häggström <ida.haggstrom_at_radfys.umu.se
>>    <mailto:ida.haggstrom_at_radfys.umu.se>> writes:
>>
>>    >  I want to
>>    >  create a bash-script to run from my Linux teminal that calls for
>>    ROOT and
>>    >  executes the C-scripts and so on...
>>
>>    One more feature to consider is that you can pass arguments from the
>>    shell into your C-scripts.  You just have to be a little careful to
>> make
>>    sure that any special characters are escaped so the shell won't
>>    interpret them.
>>
>>    For example,
>>
>>     shell> cat myscript.C
>>     void myscript(const char* filename) {
>>       TFile* f = new TFile(filename);
>>       //...
>>     }
>>
>>    You can pass in the file name like:
>>
>>     shell> root -q myscript.C\(\"file1.root\"\)
>>
>>    or wrap the whole thing in single-quotes like:
>>
>>     shell> root -q 'myscript.C("file1.root")'
>>
>>
>>    -Brett.
>>
>>
>>
>>
Received on Wed Apr 07 2010 - 10:37:12 CEST

This archive was generated by hypermail 2.2.0 : Wed Apr 07 2010 - 11:50:01 CEST