Order of root files using "TSystemDirectory" and "TList"

Dear Sir,

I have few root files inside a sub directory (CB/modfit) of my current dir. I want to loop over these files. My files are named as

Bin_001_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt4065_rap_Minus24Minus193_cent0200.root
Bin_002_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus24Minus193_cent0200.root
Bin_003_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus24Minus193_cent0200.root
Bin_004_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt4065_rap_Minus193Minus15_cent0200.root
Bin_005_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus193Minus15_cent0200.root
Bin_006_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus193Minus15_cent0200.root
Bin_007_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus15Minus09_cent0200.root
Bin_008_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus15Minus09_cent0200.root
Bin_009_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus09Minus0_cent0200.root
Bin_010_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus09Minus0_cent0200.root
Bin_011_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_009_cent0200.root
Bin_012_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_009_cent0200.root
Bin_013_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_0915_cent0200.root
Bin_014_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_0915_cent0200.root
Bin_015_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt4065_rap_15193_cent0200.root
Bin_016_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_15193_cent0200.root
Bin_017_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_15193_cent0200.root
Bin_018_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65300_rap_Minus1616_cent0200.root

For some reason the order of the files is important to me.
I can loop over these using TSystemDirectory and TList as follows


 vector<TString> ans;
 TString basedir("CB/modfit/");
TString input("");
  
  cout<<" basedir "<<basedir<<" input "<<input<<endl;
  
  TSystemDirectory dir(input,basedir);
  TList *files = dir.GetListOfFiles();
  
  if (files) {
    TIter next(files);
    TSystemFile *file;
    TString fname;
    
    while ((file=(TSystemFile*)next())) {
      
      fname = file->GetName();
     if (!file->IsDirectory() && fname.EndsWith(".root")){
      	ans.push_back(basedir+fname);
      }
    }
  }

But when I access the files from vector ans they are


Parsing file 0 / 18: CB/modfit/Bin_013_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_0915_cent0200.root
Parsing file 1 / 18: CB/modfit/Bin_017_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_15193_cent0200.root
Parsing file 2 / 18: CB/modfit/Bin_007_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus15Minus09_cent0200.root
Parsing file 3 / 18: CB/modfit/Bin_004_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt4065_rap_Minus193Minus15_cent0200.root
Parsing file 4 / 18: CB/modfit/Bin_003_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus24Minus193_cent0200.root
Parsing file 5 / 18: CB/modfit/Bin_005_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus193Minus15_cent0200.root
Parsing file 6 / 18: CB/modfit/Bin_010_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus09Minus0_cent0200.root
Parsing file 7 / 18: CB/modfit/Bin_015_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt4065_rap_15193_cent0200.root
Parsing file 8 / 18: CB/modfit/Bin_012_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_009_cent0200.root
Parsing file 9 / 18: CB/modfit/Bin_009_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus09Minus0_cent0200.root
Parsing file 10 / 18: CB/modfit/Bin_001_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt4065_rap_Minus24Minus193_cent0200.root
Parsing file 11 / 18: CB/modfit/Bin_011_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_009_cent0200.root
Parsing file 12 / 18: CB/modfit/Bin_014_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_0915_cent0200.root
Parsing file 13 / 18: CB/modfit/Bin_002_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_Minus24Minus193_cent0200.root
Parsing file 14 / 18: CB/modfit/Bin_008_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus15Minus09_cent0200.root
Parsing file 15 / 18: CB/modfit/Bin_016_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65100_rap_15193_cent0200.root
Parsing file 16 / 18: CB/modfit/Bin_018_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt65300_rap_Minus1616_cent0200.root
Parsing file 17 / 18: CB/modfit/Bin_006_FIT_MASS_MCPSI2SPR_PbP_Psi2S_DoubleCrystalBall_NoBkg_pt100300_rap_Minus193Minus15_cent0200.root

It looks to me that the files are being added in the vector ans in random order (or at least it looks random to me). I was hoping that someone can explain to me how the files are sorted in “GetListOfFiles()” command or tell me a way to maintain the order of files.

Thanks a lot for your help.

with regards,
Vineet


_ROOT Version:_ROOT 6.14/06
Platform: MacOs 10.13.6
Compiler: Not Provided


I think this is system dependent and there is no way to sort them, you most probably have to sort them yourself…

I would recommend to pass them as positional arguments on the command line in the right order (i.e. by using ls -1 | sort | xargs or similar), and looping over the arguments in the order you receive them.

1 Like

Dear bellenot and amadio,

Thanks a lot for your reply. In the code the list of file is input to another function.

“I would recommend to pass them as positional arguments on the command line in the right order (i.e. by using ls -1 | sort | xargs or similar), and looping over the arguments in the order you receive them.”

In command line ls -l give me correct ordering, but is there a way to do it in root macro i.e. do we have
something like gSystem->(ls -l)?

Use TSystem::GetFromPipe(). Something like:

TString files = gSystem->GetFromPipe("ls -l");

And then you can use for example TString::Tokenize()

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.