#include "TFileCollection.h"
#include "THashList.h"
#include "TFileInfo.h"
#include "TIterator.h"
#include "TUrl.h"
#include "TSystem.h"
#include "Riostream.h"
#include "TRegexp.h"
ClassImp(TFileCollection)
TFileCollection::TFileCollection(const char *name, const char *title,
const char *textfile)
: TNamed(name, title), fList(0), fMetaDataList(0),
fTotalSize(0), fStagedPercentage(0)
{
fList = new THashList();
fList->SetOwner();
fMetaDataList = new TList;
fMetaDataList->SetOwner();
AddFromFile(textfile);
}
TFileCollection::~TFileCollection()
{
delete fList;
delete fMetaDataList;
}
void TFileCollection::Add(TFileInfo *info)
{
fList->Add(info);
}
void TFileCollection::AddFromFile(const char *textfile)
{
if (textfile && *textfile) {
ifstream f;
f.open(gSystem->ExpandPathName(textfile), ifstream::out);
if (f.is_open()) {
while (f.good()) {
TString line;
line.ReadToDelim(f);
if (!line.IsWhitespace())
fList->Add(new TFileInfo(line));
}
f.close();
Update();
} else
Error("AddFromFile", "unable to open file %s", textfile);
}
}
void TFileCollection::AddFromDirectory(const char *dir)
{
if (!dir || !*dir) {
Error("AddFromDirectory", "input dir undefined");
return;
}
FileStat_t st;
if (gSystem->GetPathInfo(dir, st) == 0) {
if (R_ISREG(st.fMode)) {
TFileInfo *info = new TFileInfo(dir);
info->SetBit(TFileInfo::kStaged);
Add(info);
Update();
return;
} else {
void *dataSetDir = gSystem->OpenDirectory(gSystem->DirName(dir));
if (!dataSetDir) {
Error("AddFromDirectory", "directory %s cannot be opened",
gSystem->DirName(dir));
} else {
const char *ent;
TString filesExp(gSystem->BaseName(dir));
filesExp.ReplaceAll("*",".*");
TRegexp rg(filesExp);
while ((ent = gSystem->GetDirEntry(dataSetDir))) {
TString entryString(ent);
if (entryString.Index(rg) != kNPOS) {
TString fn = gSystem->DirName(dir);
fn += "/";
fn += ent;
gSystem->GetPathInfo(fn, st);
if (R_ISREG(st.fMode)) {
TFileInfo *info = new TFileInfo(fn);
info->SetBit(TFileInfo::kStaged);
Add(info);
}
}
}
gSystem->FreeDirectory(dataSetDir);
Update();
}
}
}
}
TFileCollection *TFileCollection::GetStagedSubset()
{
TFileCollection *subset = new TFileCollection(GetName(), GetTitle());
TIter iter(fList);
TFileInfo *fileInfo = 0;
while ((fileInfo = dynamic_cast<TFileInfo*>(iter.Next()))) {
if (fileInfo->TestBit(TFileInfo::kStaged) && !fileInfo->TestBit(TFileInfo::kCorrupted))
subset->Add(fileInfo);
}
subset->Update();
return subset;
}
void TFileCollection::Update()
{
fTotalSize = 0;
fStagedPercentage = 0;
if (fList->GetEntries() == 0)
return;
fMetaDataList->Clear();
Long64_t stagedFiles = 0;
TIter iter(fList);
TFileInfo *fileInfo = 0;
while ((fileInfo = dynamic_cast<TFileInfo*> (iter.Next()))) {
if (fileInfo->GetSize() > 0)
fTotalSize += fileInfo->GetSize();
if (fileInfo->TestBit(TFileInfo::kStaged) && !fileInfo->TestBit(TFileInfo::kCorrupted)) {
stagedFiles++;
if (fileInfo->GetMetaDataList()) {
TIter metaDataIter(fileInfo->GetMetaDataList());
TObject *obj = 0;
while ((obj = metaDataIter.Next())) {
TFileInfoMeta *metaData = dynamic_cast<TFileInfoMeta*>(obj);
if (!metaData)
continue;
if (!metaData->IsTree())
continue;
TFileInfoMeta *metaDataSum = dynamic_cast<TFileInfoMeta*>(fMetaDataList->FindObject(metaData->GetName()));
Bool_t newObj = kFALSE;
if (!metaDataSum) {
metaDataSum = new TFileInfoMeta(metaData->GetName(), metaData->GetTitle());
fMetaDataList->Add(metaDataSum);
newObj = kTRUE;
}
if (newObj)
metaDataSum->SetEntries(metaData->GetEntries());
else
metaDataSum->SetEntries(metaDataSum->GetEntries() + metaData->GetEntries());
}
}
}
}
fStagedPercentage = 100.0 * stagedFiles / fList->GetEntries();
}
void TFileCollection::Print(Option_t *option) const
{
Printf("TFileCollection %s - %s contains: %d files with a size of %lld bytes, %.1f %% staged",
GetName(), GetTitle(), fList->GetEntries(), fTotalSize, fStagedPercentage);
if (TString(option).Contains("M", TString::kIgnoreCase)) {
Printf("The files contain the following trees:");
TIter metaDataIter(fMetaDataList);
TFileInfoMeta* metaData = 0;
while ((metaData = dynamic_cast<TFileInfoMeta*>(metaDataIter.Next()))) {
if (!metaData->IsTree())
continue;
Printf("Tree %s: %lld events", metaData->GetName(), metaData->GetEntries());
}
}
if (TString(option).Contains("F", TString::kIgnoreCase)) {
Printf("The collection contains the following files:");
fList->Print();
}
}
void TFileCollection::SetAnchor(const char *anchor) const
{
TIter iter(fList);
TFileInfo *fileInfo = 0;
while ((fileInfo = dynamic_cast<TFileInfo*>(iter.Next()))) {
fileInfo->ResetUrl();
TUrl *url = 0;
while ((url = fileInfo->NextUrl()))
url->SetAnchor(anchor);
fileInfo->ResetUrl();
}
}
const char *TFileCollection::GetDefaultTreeName() const
{
TIter metaDataIter(fMetaDataList);
TFileInfoMeta *metaData = 0;
while ((metaData = dynamic_cast<TFileInfoMeta*>(metaDataIter.Next()))) {
if (!metaData->IsTree())
continue;
return metaData->GetName();
}
return 0;
}
Long64_t TFileCollection::GetTotalEntries(const char *tree) const
{
if (!tree || !*tree) {
tree = GetDefaultTreeName();
if (!tree)
return -1;
}
TFileInfoMeta *metaData = dynamic_cast<TFileInfoMeta*>(fMetaDataList->FindObject(tree));
if (!metaData)
return -1;
return metaData->GetEntries();
}
TFileInfoMeta *TFileCollection::GetMetaData(const char *meta) const
{
if (!meta || !*meta)
return 0;
return dynamic_cast<TFileInfoMeta*>(fMetaDataList->FindObject(meta));
}
void TFileCollection::Sort()
{
fList->Sort();
}
Float_t TFileCollection::GetCorruptedPercentage() const
{
if (fList->GetEntries() == 0)
return -1;
Long64_t count = 0;
TIter iter(fList);
TFileInfo *fileInfo = 0;
while ((fileInfo = dynamic_cast<TFileInfo*>(iter.Next()))) {
if (fileInfo->TestBit(TFileInfo::kCorrupted))
count++;
}
return 100.0 * count / fList->GetEntries();
}
Last update: Thu Jan 17 08:50:06 2008
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.