29 TAliEnFind::TAliEnFind(
const TString &basePath, 
const TString &fileName,
 
   30   const TString &anchor, 
const Bool_t archSubst, 
const TString &treeName,
 
   31   const TString ®exp, 
const TString &query) :
 
   32   fBasePath(basePath), fFileName(fileName), fTreeName(treeName),
 
   33   fRegexpRaw(regexp), fAnchor(anchor), fQuery(query), fArchSubst(archSubst),
 
   34   fRegexp(0), fSearchId(
""), fGridResult(0)
 
   36    if (fArchSubst) fAnchor = 
""; 
 
   37    if (!fRegexpRaw.IsNull())
 
   38       fRegexp = 
new TPMERegexp(regexp);
 
   44 TAliEnFind::TAliEnFind(
const TAliEnFind &src) : TObject()
 
   46    fBasePath = src.fBasePath;
 
   47    fFileName = src.fFileName;
 
   48    fAnchor = src.fAnchor;
 
   49    fArchSubst = src.fArchSubst;
 
   51    fTreeName = src.fTreeName;
 
   52    fRegexpRaw = src.fRegexpRaw;
 
   55       fRegexp = 
new TPMERegexp( *(src.fRegexp) );
 
   65 TAliEnFind &TAliEnFind::operator=(
const TAliEnFind &rhs)
 
   68       fBasePath = rhs.fBasePath;
 
   69       fFileName = rhs.fFileName;
 
   70       fAnchor = rhs.fAnchor;
 
   71       fArchSubst = rhs.fArchSubst;
 
   73       fTreeName = rhs.fTreeName;
 
   75       SetRegexp(rhs.fRegexpRaw);
 
   78       InvalidateGridResult();
 
   87 TAliEnFind::~TAliEnFind()
 
   89    if (fRegexp) 
delete fRegexp;
 
   90    if (fGridResult) 
delete fGridResult;
 
   96 TGridResult *TAliEnFind::GetGridResult(Bool_t forceNewQuery)
 
   98    if (fGridResult && !forceNewQuery) {
 
  100          Info(
"GetGridResult", 
"Returning cached AliEn find results");
 
  103    else if (gDebug >= 1) {
 
  104       Info(
"GetGridResult", 
"Querying AliEn file catalog");
 
  107    InvalidateGridResult();
 
  110       TGrid::Connect(
"alien:");
 
  111       if (!gGrid) 
return NULL;
 
  115       Info(
"GetGridResult", 
"AliEn find %s %s [regexp=%s] [archsubst=%d]",
 
  116          fBasePath.Data(), fFileName.Data(), fRegexpRaw.Data(), fArchSubst);
 
  119    fGridResult = gGrid->Query(fBasePath.Data(), fFileName.Data());
 
  120    if (!fGridResult) 
return NULL;
 
  122    if (fRegexp || fArchSubst || !fAnchor.IsNull() || !fQuery.IsNull()) {
 
  124       TPMERegexp *reArchSubst = NULL;
 
  128          temp.Form(
"/%s$", fFileName.Data());
 
  129          reArchSubst = 
new TPMERegexp(temp.Data());
 
  131             substWith.Form(
"/root_archive.zip?%s#%s", fQuery.Data(),
 
  135             substWith.Form(
"/root_archive.zip#%s", fFileName.Data());
 
  139       TIter it(fGridResult);
 
  144       while (( map = dynamic_cast<TMap *>(it.Next()) ) != NULL) {
 
  146          os = 
dynamic_cast<TObjString *
>( map->GetValue(
"turl") );
 
  150          if (fRegexp && (fRegexp->Match(tUrl) == 0)) {
 
  152             TObject *exmap = fGridResult->Remove(map);
 
  153             if (exmap) 
delete exmap;  
 
  158             reArchSubst->Substitute(tUrl, substWith, kFALSE);
 
  159             os->SetString(tUrl.Data());
 
  161          else if (!fAnchor.IsNull()) {
 
  163             if (!fQuery.IsNull()) {
 
  168             tUrl.Append(fAnchor);
 
  169             os->SetString(tUrl.Data());
 
  171          else if (!fQuery.IsNull()) {
 
  175             os->SetString(tUrl.Data());
 
  179       if (reArchSubst) 
delete reArchSubst;
 
  187 const char *TAliEnFind::GetSearchId()
 
  189   if (fSearchId.IsNull()) {
 
  191     searchIdStr.Form(
"BasePath=%s FileName=%s Anchor=%s ArchSubst=%d " 
  192       "TreeName=%s Regexp=%s",
 
  193       fBasePath.Data(), fFileName.Data(), fAnchor.Data(), fArchSubst,
 
  194       fTreeName.Data(), fRegexpRaw.Data());
 
  195     TMD5 *md5 = 
new TMD5();
 
  196     md5->Update( (
const UChar_t *)searchIdStr.Data(),
 
  197       (UInt_t)searchIdStr.Length() );
 
  199     fSearchId = md5->AsString();
 
  203     Info(
"GetSearchId", 
"Returning search ID %s", fSearchId.Data());
 
  204   return fSearchId.Data();
 
  209 TFileCollection *TAliEnFind::GetCollection(Bool_t forceNewQuery)
 
  211   GetGridResult(forceNewQuery);
 
  212   if (!fGridResult) 
return NULL;
 
  214   Int_t nEntries = fGridResult->GetEntries();
 
  215   TFileCollection *fc = 
new TFileCollection();
 
  217   for (Int_t i=0; i<nEntries; i++) {
 
  219     Long64_t size = TString(fGridResult->GetKey(i, 
"size")).Atoll();
 
  221     TString tUrl = fGridResult->GetKey(i, 
"turl");
 
  224       Info(
"GetCollection", 
">> %s", tUrl.Data());
 
  227     TFileInfo *fi = 
new TFileInfo( tUrl, size, fGridResult->GetKey(i, 
"guid"),
 
  228       fGridResult->GetKey(i, 
"md5") );
 
  235     fc->SetDefaultTreeName(fTreeName.Data());
 
  244 void TAliEnFind::Print(Option_t* opt)
 const 
  247    Printf(
"BasePath=%s FileName=%s Anchor=%s ArchSubst=%d " 
  248       "TreeName=%s Regexp=%s (query %s a result)",
 
  249       fBasePath.Data(), fFileName.Data(), fAnchor.Data(), fArchSubst,
 
  250       fTreeName.Data(), fRegexpRaw.Data(), (fGridResult ? 
"has" : 
"has not"));
 
  255 void TAliEnFind::SetBasePath(
const char *basePath)
 
  257    if (fBasePath.EqualTo(basePath)) 
return;
 
  258    fBasePath = basePath;
 
  259    InvalidateGridResult();
 
  260    InvalidateSearchId();
 
  265 void TAliEnFind::SetFileName(
const char *fileName)
 
  267    if (fFileName.EqualTo(fileName)) 
return;
 
  268    fFileName = fileName;
 
  269    InvalidateGridResult();
 
  270    InvalidateSearchId();
 
  275 void TAliEnFind::SetAnchor(
const char *anchor)
 
  277    if (fAnchor.EqualTo(anchor)) 
return;
 
  279    InvalidateGridResult();
 
  280    InvalidateSearchId();
 
  285 void TAliEnFind::SetTreeName(
const char *treeName)
 
  287    if (fTreeName.EqualTo(treeName)) 
return;
 
  288    fTreeName = treeName;
 
  289    InvalidateSearchId();
 
  294 void TAliEnFind::SetArchSubst(Bool_t archSubst)
 
  296    if (fArchSubst == archSubst) 
return;
 
  297    fArchSubst = archSubst;
 
  298    InvalidateGridResult();
 
  299    InvalidateSearchId();
 
  304 void TAliEnFind::SetRegexp(
const char *regexp)
 
  306    if (fRegexpRaw.EqualTo(regexp)) 
return;
 
  309    if (fRegexp) 
delete fRegexp;
 
  310    if (!fRegexpRaw.IsNull())
 
  311       fRegexp = 
new TPMERegexp(regexp);
 
  315    InvalidateGridResult();
 
  316    InvalidateSearchId();
 
  321 void TAliEnFind::InvalidateSearchId()
 
  323    if (!fSearchId.IsNull())
 
  329 void TAliEnFind::InvalidateGridResult()
 
  337 ClassImp(TDataSetManagerAliEn);
 
  341 void TDataSetManagerAliEn::Init(TString cacheDir, TString urlTpl,
 
  342   ULong_t cacheExpire_s)
 
  344   kfNoopRedirUrl = 
new TUrl(
"noop://redir");
 
  345   kfNoopUnknownUrl = 
new TUrl(
"noop://unknown");
 
  346   kfNoopNoneUrl = 
new TUrl(
"noop://none");
 
  348   fCacheExpire_s = cacheExpire_s;
 
  349   fUrlRe = 
new TPMERegexp(
"^alien://(.*)$");
 
  352   if (fUrlTpl.Contains(
"<path>")) {
 
  354     fUrlTpl.ReplaceAll(
"<path>", 
"$1");
 
  362   dsDirFmt.Form(
"dir:%s perms:open", cacheDir.Data());
 
  363   fCache = 
new TDataSetManagerFile(
"_cache_", 
"_cache_", dsDirFmt);
 
  365   if (fCache->TestBit(TObject::kInvalidObject)) {
 
  366     Error(
"Init", 
"Cannot initialize cache on directory %s", cacheDir.Data());
 
  367     SetBit(TObject::kInvalidObject);
 
  372   ResetBit(TDataSetManager::kAllowRegister);  
 
  373   ResetBit(TDataSetManager::kCheckQuota);  
 
  376     Info(
"TDataSetManagerAliEn", 
"Caching on %s", cacheDir.Data());
 
  377     Info(
"TDataSetManagerAliEn", 
"URL schema: %s", urlTpl.Data());
 
  378     Info(
"TDataSetManagerAliEn", 
"Cache expires after: %lus", cacheExpire_s);
 
  384 TDataSetManagerAliEn::TDataSetManagerAliEn(
const char *cacheDir,
 
  385   const char *urlTpl, ULong_t cacheExpire_s)
 
  386   : TDataSetManager(
"", 
"", 
""), fUrlRe(0), fCache(0), fReadFromSE(kFALSE),
 
  387     kfNoopRedirUrl(0), kfNoopUnknownUrl(0), kfNoopNoneUrl(0)
 
  389   Init(cacheDir, urlTpl, cacheExpire_s);
 
  395 TDataSetManagerAliEn::TDataSetManagerAliEn(
const char *, 
const char *,
 
  396   const char *cfgStr) : TDataSetManager(
"", 
"", 
""), fUrlRe(0), fCache(0),
 
  397   fReadFromSE(kFALSE), kfNoopRedirUrl(0), kfNoopUnknownUrl(0), kfNoopNoneUrl(0)
 
  399   TPMERegexp reCache(
"(^| )cache:([^ ]+)( |$)");
 
  400   if (reCache.Match(cfgStr) != 4) {
 
  401     Error(
"TDataSetManagerAliEn", 
"No cache directory specified");
 
  402     SetBit(TObject::kInvalidObject);
 
  406   TPMERegexp reUrlTpl(
"(^| )urltemplate:([^ ]+)( |$)");
 
  407   if (reUrlTpl.Match(cfgStr) != 4) {
 
  408     Error(
"TDataSetManagerAliEn", 
"No local URL template specified");
 
  409     SetBit(TObject::kInvalidObject);
 
  413   TPMERegexp reCacheExpire(
"(^| )cacheexpiresecs:([0-9]+)( |$)");
 
  414   if (reCacheExpire.Match(cfgStr) != 4) {
 
  415     Error(
"TDataSetManagerAliEn", 
"No cache expiration set");
 
  416     SetBit(TObject::kInvalidObject);
 
  420   Init(reCache[2], reUrlTpl[2], (ULong_t)reCacheExpire[2].Atoll());
 
  425 TDataSetManagerAliEn::~TDataSetManagerAliEn()
 
  427   if (fCache) 
delete fCache;
 
  428   if (fUrlRe) 
delete fUrlRe;
 
  429   if (kfNoopRedirUrl) 
delete kfNoopRedirUrl;
 
  430   if (kfNoopUnknownUrl) 
delete kfNoopUnknownUrl;
 
  431   if (kfNoopNoneUrl) 
delete kfNoopNoneUrl;
 
  437 TList *TDataSetManagerAliEn::GetFindCommandsFromUri(TString &uri,
 
  438   EDataMode &dataMode, Bool_t &forceUpdate)
 
  440   TPMERegexp reKind(
"^(Data;|Sim;|Find;)");
 
  441   if (reKind.Match(uri) != 2) {
 
  442     Error(
"GetFindCommandsFromUri", 
"Data, Sim or Find not specified");
 
  447   TPMERegexp reMode(
"(^|;)Mode=([A-Za-z]+)(;|$)");
 
  448   if (reMode.Match(uri) != 4) {
 
  449     dataMode = kDataLocal;  
 
  452     if (reMode[2].EqualTo(
"remote", TString::kIgnoreCase))
 
  453       dataMode = kDataRemote;
 
  454     else if (reMode[2].EqualTo(
"local", TString::kIgnoreCase))
 
  455       dataMode = kDataLocal;
 
  456     else if (reMode[2].EqualTo(
"cache", TString::kIgnoreCase))
 
  457       dataMode = kDataCache;
 
  459       Error(
"GetFindCommandsFromUri",
 
  460         "Wrong analysis mode specified: use one of: Mode=remote, local, cache");
 
  465   TList *findCommands = NULL;
 
  467   if (reKind[1].BeginsWith(
"Find")) {
 
  477     if (!ParseCustomFindUri(uri, basePath, fileName, anchor, query, treeName,
 
  479       Error(
"GetFindCommandsFromUri", 
"Malformed AliEn find command");
 
  483     findCommands = 
new TList();
 
  484     findCommands->SetOwner();
 
  485     findCommands->Add( 
new TAliEnFind(basePath, fileName, anchor, kFALSE,
 
  486       treeName, regexp, query) );
 
  490     Bool_t sim = (reKind[1][0] == 
'S');
 
  493     std::vector<Int_t> *runList;
 
  498     if (!ParseOfficialDataUri(uri, sim, lhcPeriod, year, runList, esd,
 
  500       Error(
"GetFindCommandsFromUri", 
"Invalid parameters");
 
  505     findCommands = 
new TList();
 
  506     findCommands->SetOwner(kTRUE);
 
  511       TGrid::Connect(
"alien:");
 
  526       basePathRun.Form(
"/alice/sim/%s", lhcPeriod.Data());  
 
  527       if (!gGrid->Cd(basePathRun.Data())) {
 
  528         basePathRun.Form(
"/alice/sim/%d/%s", year, lhcPeriod.Data());
 
  534       if ((pass[0] >= 
'0') && (pass[0] <= 
'9')) pass.Prepend(
"pass");
 
  535       basePathRun.Form(
"/alice/data/%d/%s", year, lhcPeriod.Data());
 
  540     std::vector<Int_t> validRuns;
 
  542       TGridResult *validRunDirs = gGrid->Ls( basePathRun.Data() );
 
  543       if (!validRunDirs) 
return NULL;
 
  545       TIter nrd(validRunDirs);
 
  548       validRuns.resize( (
size_t)(validRunDirs->GetEntries()) );
 
  550       while (( dir = dynamic_cast<TMap *>(nrd()) ) != NULL) {
 
  551         os = 
dynamic_cast<TObjString *
>( dir->GetValue(
"name") );
 
  553         Int_t run = (os->String()).Atoi();
 
  554         if (run > 0) validRuns.push_back(run);
 
  558     for (UInt_t i=0; i<runList->size(); i++) {
 
  561       Bool_t valid = kFALSE;
 
  562       for (UInt_t j=0; j<validRuns.size(); j++) {
 
  563         if (validRuns[j] == (*runList)[i]) {
 
  570           Warning(
"TDataSetManagerAliEn::GetFindCommandsFromUri",
 
  571             "Avoiding unnecessary find on run %d: not found", (*runList)[i]);
 
  575       else if (gDebug >= 1) {
 
  576         Info(
"TDataSetManagerAliEn::GetFindCommandsFromUri", 
"Run found: %d", (*runList)[i]);
 
  580       TString basePath, fileName, temp;
 
  584         temp.Form(
"/%06d", runList->at(i));
 
  585         basePath = basePathRun + temp;
 
  588           temp.Form(
"/AOD%03d", aodNum);
 
  589           basePath.Append(temp);
 
  594         temp.Form(
"/%09d/ESDs/%s", runList->at(i), pass.Data());
 
  595         basePath = basePathRun + temp;
 
  597           basePath.Append(
"/*.*");
 
  600           temp.Form(
"/AOD%03d", aodNum);
 
  601           basePath.Append(temp);
 
  609         fileName = 
"AliESDs.root";
 
  610         treeName = 
"/esdTree";
 
  613         fileName = 
"AliAOD.root";
 
  614         treeName = 
"/aodTree";
 
  617       findCommands->Add( 
new TAliEnFind(basePath, fileName, 
"", kTRUE,
 
  627   TPMERegexp reForceUpdate(
"(^|;)ForceUpdate(;|$)");
 
  628   forceUpdate = (reForceUpdate.Match(uri) == 3);
 
  636 Bool_t TDataSetManagerAliEn::ParseCustomFindUri(TString &uri,
 
  637    TString &basePath, TString &fileName, TString &anchor, TString &query,
 
  638    TString &treeName, TString ®exp)
 
  642   TString checkUri = uri(5, uri.Length());
 
  645   TPMERegexp reMode(
"(^|;)(Mode=[A-Za-z]+)(;|$)");
 
  646   if (reMode.Match(uri) == 4)
 
  647     checkUri.ReplaceAll(reMode[2], 
"");
 
  648   TPMERegexp reForceUpdate(
"(^|;)(ForceUpdate)(;|$)");
 
  649   if (reForceUpdate.Match(uri) == 4)
 
  650     checkUri.ReplaceAll(reForceUpdate[2], 
"");
 
  653   TPMERegexp reBasePath(
"(^|;)(BasePath=([^; ]+))(;|$)");
 
  654   if (reBasePath.Match(uri) != 5) {
 
  655     ::Error(
"TDataSetManagerAliEn::ParseCustomFindUri",
 
  656       "Base path not specified");
 
  659   checkUri.ReplaceAll(reBasePath[2], 
"");
 
  660   basePath = reBasePath[3];
 
  663   TPMERegexp reFileName(
"(^|;)(FileName=([^; ]+))(;|$)");
 
  664   if (reFileName.Match(uri) != 5) {
 
  665     ::Error(
"TDataSetManagerAliEn::ParseCustomFindUri",
 
  666       "File name not specified");
 
  669   checkUri.ReplaceAll(reFileName[2], 
"");
 
  670   fileName = reFileName[3];
 
  673   TPMERegexp reAnchor(
"(^|;)(Anchor=([^; ]+))(;|$)");
 
  674   if (reAnchor.Match(uri) != 5)
 
  677     checkUri.ReplaceAll(reAnchor[2], 
"");
 
  678     anchor = reAnchor[3];
 
  682   TPMERegexp reQuery(
"(^|;)(Query=([^; ]+))(;|$)");
 
  683   if (reQuery.Match(uri) != 5)
 
  686     checkUri.ReplaceAll(reQuery[2], 
"");
 
  691   TPMERegexp reTreeName(
"(^|;)(Tree=(/[^; ]+))(;|$)");
 
  692   if (reTreeName.Match(uri) != 5)
 
  695     checkUri.ReplaceAll(reTreeName[2], 
"");
 
  696     treeName = reTreeName[3];
 
  700   TPMERegexp reRegexp(
"(^|;)(Regexp=([^; ]+))(;|$)");
 
  701   if (reRegexp.Match(uri) != 5)
 
  704     checkUri.ReplaceAll(reRegexp[2], 
"");
 
  705     regexp = reRegexp[3];
 
  709   checkUri.ReplaceAll(
";", 
"");
 
  710   checkUri.ReplaceAll(
" ", 
"");
 
  711   if (!checkUri.IsNull()) {
 
  712     ::Error(
"TDataSetManagerAliEn::ParseCustomFindUri",
 
  713       "There are unrecognized parameters in the dataset find string");
 
  721 Bool_t TDataSetManagerAliEn::ParseOfficialDataUri(TString &uri, Bool_t sim,
 
  722   TString &period, Int_t &year, std::vector<Int_t> *&runList, Bool_t &esd,
 
  723   Int_t &aodNum, TString &pass)
 
  730     Ssiz_t idx = uri.Index(
";");
 
  731     checkUri = uri(idx, uri.Length());
 
  735   TPMERegexp reMode(
"(^|;)(Mode=[A-Za-z]+)(;|$)");
 
  736   if (reMode.Match(uri) == 4)
 
  737     checkUri.ReplaceAll(reMode[2], 
"");
 
  738   TPMERegexp reForceUpdate(
"(^|;)(ForceUpdate)(;|$)");
 
  739   if (reForceUpdate.Match(uri) == 4)
 
  740     checkUri.ReplaceAll(reForceUpdate[2], 
"");
 
  746   TPMERegexp rePeriod(
"(^|;)(Period=(LHC([0-9]{2})[^;]*))(;|$)");
 
  747   if (rePeriod.Match(uri) != 6) {
 
  748     ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
 
  749       "LHC period not specified (e.g. Period=LHC10h)");
 
  753   checkUri.ReplaceAll(rePeriod[2], 
"");
 
  754   period = rePeriod[3];
 
  755   year = rePeriod[4].Atoi() + 2000;
 
  761   TPMERegexp reFormat(
"(^|;)(Variant=(ESDs?|AOD([0-9]{3})))(;|$)");
 
  762   if (reFormat.Match(uri) != 6) {
 
  763     ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
 
  764       "Data variant (e.g., Variant=ESD or AOD079) not specified");
 
  768   checkUri.ReplaceAll(reFormat[2], 
"");
 
  769   if (reFormat[3].BeginsWith(
"ESD")) esd = kTRUE;
 
  772     aodNum = reFormat[4].Atoi();
 
  779   TPMERegexp rePass(
"(^|;)(Pass=([a-zA-Z_0-9-]+))(;|$)");
 
  780   if ((!sim) && (rePass.Match(uri) != 5)) {
 
  781     ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
 
  782       "Pass (e.g., Pass=cpass1_muon) is mandatory on real data");
 
  785   checkUri.ReplaceAll(rePass[2], 
"");
 
  792   TPMERegexp reRun(
"(^|;)(Run=([0-9,-]+))(;|$)");
 
  793   if (reRun.Match(uri) != 5) {
 
  794     ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
 
  795       "Run or run range not specified (e.g., Run=139104-139107,139306)");
 
  798   checkUri.ReplaceAll(reRun[2], 
"");
 
  799   TString runListStr = reRun[3];
 
  800   runList = ExpandRunSpec(runListStr);  
 
  803   checkUri.ReplaceAll(
";", 
"");
 
  804   checkUri.ReplaceAll(
" ", 
"");
 
  805   if (!checkUri.IsNull()) {
 
  806     ::Error(
"TDataSetManagerAliEn::ParseOfficialDataUri",
 
  807       "There are unrecognized parameters in dataset string");
 
  816 TUrl *TDataSetManagerAliEn::AliEnWhereIs(TUrl *alienUrl, TString &closeSE,
 
  817   Bool_t onlyFromCloseSE) {
 
  831     ::Error(
"TDataSetManagerAliEn::AliEnWhereIs", 
"input AliEn URL not given!");
 
  835   if (!gGrid || (strcmp(gGrid->GetGrid(), 
"alien") != 0)) {
 
  836     ::Error(
"TDataSetManagerAliEn::AliEnWhereIs", 
"no AliEn grid connection available!");
 
  840   TString cmd = 
"whereis -r ";
 
  841   cmd.Append(alienUrl->GetFile());
 
  844   resp = 
dynamic_cast<TList *
>( gGrid->Command(cmd.Data()) );
 
  846     ::Error(
"TDataSetManagerAliEn::AliEnWhereIs", 
"cannot get response from AliEn");
 
  852   TString se, pfnUrl, validPfnUrl;
 
  853   while ( (pfn = dynamic_cast<TMap *>( nextPfn() )) != NULL ) {
 
  855     if ((pfn->GetValue(
"se") == NULL) || (pfn->GetValue(
"pfn") == NULL)) {
 
  859     pfnUrl = pfn->GetValue(
"pfn")->GetName();
 
  860     se = pfn->GetValue(
"se")->GetName();
 
  862     if (se.EqualTo(closeSE, TString::kIgnoreCase)) {
 
  864       validPfnUrl = pfnUrl;
 
  867     else if (!onlyFromCloseSE && validPfnUrl.IsNull()) {
 
  868       validPfnUrl = pfnUrl;
 
  884   if (validPfnUrl.IsNull()) {
 
  886       ::Error(
"TDataSetManagerAliEn::AliEnWhereIs", 
"cannot find endpoint URL for %s", alienUrl->GetUrl());
 
  891   TUrl *pfnTUrl = 
new TUrl( validPfnUrl.Data() );
 
  894   TString options = alienUrl->GetOptions();
 
  895   TString anchor = alienUrl->GetAnchor();
 
  896   if (!anchor.IsNull()) {
 
  897     options.Append(
"&zip=");
 
  898     options.Append(anchor);
 
  899     pfnTUrl->SetAnchor(anchor.Data());
 
  900     pfnTUrl->SetOptions(options.Data());
 
  908 std::vector<Int_t> *TDataSetManagerAliEn::ExpandRunSpec(TString &runSpec) {
 
  909   std::vector<Int_t> *runNumsPtr = 
new std::vector<Int_t>();
 
  910   std::vector<Int_t> &runNums = *runNumsPtr;
 
  912   TObjArray *runs = runSpec.Tokenize(
":,");
 
  917   while ( (runOs = dynamic_cast<TObjString *>(run.Next())) ) {
 
  919     TString runStr = runOs->String();
 
  921     TPMERegexp p(
"^([0-9]+)-([0-9]+)$");
 
  922     if (p.Match(runStr) == 3) {
 
  923       Int_t r1 = p[1].Atoi();
 
  924       Int_t r2 = p[2].Atoi();
 
  933       for (Int_t r=r1; r<=r2; r++) {
 
  934         runNums.push_back(r);
 
  938       runNums.push_back(runStr.Atoi());
 
  945   for (UInt_t i=0; i<runNums.size(); i++) {
 
  946     for (UInt_t j=i+1; j<runNums.size(); j++) {
 
  947       if (runNums[j] < runNums[i]) {
 
  948         runNums[i] = runNums[i] ^ runNums[j];
 
  949         runNums[j] = runNums[i] ^ runNums[j];
 
  950         runNums[i] = runNums[i] ^ runNums[j];
 
  957     std::vector<Int_t>::iterator itr = runNums.begin();
 
  959     while (itr != runNums.end()) {
 
  960       if ((itr == runNums.begin()) || (prevVal != *itr)) {
 
  965         itr = runNums.erase(itr);
 
  976 TFileCollection *TDataSetManagerAliEn::GetDataSet(
const char *uri, 
const char *)
 
  978   TFileCollection *fc = NULL;  
 
  983   TList *findCmds = GetFindCommandsFromUri(sUri, dataMode, forceUpdate);
 
  984   if (!findCmds) 
return NULL;
 
  986   fc = 
new TFileCollection();  
 
  988   TFileStager *fstg = NULL; 
 
  993   while ((af = dynamic_cast<TAliEnFind *>(it.Next())) != NULL) {
 
  995     TString cachedUri = af->GetSearchId();
 
  996     TFileCollection *newFc = NULL;
 
  997     Bool_t saveToCache = kFALSE;
 
  998     Bool_t fillLocality = kFALSE;
 
 1001     Long_t mtime = fCache->GetModTime(cachedUri.Data());
 
 1002     Long_t now = gSystem->Now();
 
 1003     now = now/1000 + 788914800;  
 
 1007         Info(
"GetDataSet", 
"Ignoring cached query result: forcing update");
 
 1009     else if ((mtime > 0) && (now-mtime > fCacheExpire_s)) {
 
 1011         Info(
"GetDataSet", 
"Dataset cache has expired");
 
 1015         Info(
"GetDataSet", 
"Getting file collection from cache");
 
 1016       newFc = fCache->GetDataSet(cachedUri.Data());
 
 1022         Info(
"GetDataSet", 
"Getting file collection from AliEn");
 
 1024       newFc = af->GetCollection();
 
 1026         Error(
"GetDataSet", 
"Cannot get collection from AliEn");
 
 1038       TIter itCache(newFc->GetList());
 
 1040       while ((fi = dynamic_cast<TFileInfo *>(itCache.Next()))) {
 
 1044           seUrl = AliEnWhereIs( fi->GetCurrentUrl(), fUrlTpl, kTRUE );
 
 1048             fi->AddUrl(seUrl->GetUrl(), kTRUE);  
 
 1054             fi->AddUrl(kfNoopNoneUrl->GetUrl(), kTRUE);
 
 1059           tUrl = fi->GetCurrentUrl()->GetUrl();
 
 1060           fUrlRe->Substitute(tUrl, fUrlTpl);
 
 1061           fi->AddUrl(tUrl.Data(), kTRUE);  
 
 1068       if (dataMode == kDataLocal) {
 
 1069         fillLocality = kTRUE;
 
 1075           Info(
"GetDataSet", 
"Not caching data locality information now");
 
 1077         while ((fi = dynamic_cast<TFileInfo *>(itCache.Next())))
 
 1078           fi->AddUrl(kfNoopUnknownUrl->GetUrl(), kTRUE);
 
 1082       saveToCache = kTRUE;
 
 1088       Bool_t hasEndp = kTRUE;
 
 1090       fi = 
dynamic_cast<TFileInfo *
>(newFc->GetList()->At(0));
 
 1092         if ( strcmp(fi->GetCurrentUrl()->GetUrl(), kfNoopUnknownUrl->GetUrl()) == 0 ) {
 
 1094             Info(
"GetDataSet", 
"No dataset locality information in cache");
 
 1099       if ((dataMode == kDataLocal) && !hasEndp) {
 
 1103         TIter itCache(newFc->GetList());
 
 1104         while ((fi = dynamic_cast<TFileInfo *>(itCache.Next()))) {
 
 1105           fi->RemoveUrl( kfNoopUnknownUrl->GetUrl() );
 
 1108         fillLocality = kTRUE;  
 
 1109         saveToCache = kTRUE;  
 
 1124         TIter nxtLoc(newFc->GetList());
 
 1125         while (( fi = dynamic_cast<TFileInfo *>(nxtLoc()) )) {
 
 1126           if (fi->FindByUrl( kfNoopNoneUrl->GetUrl() )) {
 
 1127             fi->ResetBit(TFileInfo::kStaged);
 
 1130             fi->SetBit(TFileInfo::kStaged);
 
 1139         fi = 
dynamic_cast<TFileInfo *
>(newFc->GetList()->At(0));
 
 1141           Info(
"GetDataSet", 
"Filling dataset locality information: " 
 1142             "it might take time, be patient!");
 
 1146             fstg = TFileStager::Open(fi->GetCurrentUrl()->GetUrl());
 
 1149             Error(
"GetDataSet", 
"Can't create file stager");
 
 1156             Int_t rv = fstg->LocateCollection(newFc, kTRUE);
 
 1158               Error(
"GetDataSet", 
"Endpoint lookup returned an error");
 
 1165             else if (gDebug >= 1) {
 
 1166               Info(
"GetDataSet", 
"Lookup successful for %d file(s)", rv);
 
 1177       TString group, user, name;
 
 1178       fCache->ParseUri(cachedUri, &group, &user, &name);
 
 1179       if (fCache->WriteDataSet(group, user, name, newFc) == 0) {
 
 1181         Warning(
"GetDataSet", 
"Could not cache retrieved information");
 
 1187       Info(
"GetDataSet", 
"Dataset information currently cached follows");
 
 1188       newFc->Print(
"filter:SsCc");
 
 1194     TIter itCache(newFc->GetList());
 
 1196     while ((fi = dynamic_cast<TFileInfo *>(itCache.Next()))) {
 
 1203       if (dataMode == kDataRemote) {
 
 1205         fi->SetBit(TFileInfo::kStaged);
 
 1207         nDeleteUrls = fi->GetNUrls() - 1;
 
 1208         for (Int_t i=0; i<nDeleteUrls; i++) {
 
 1212       else if (dataMode == kDataCache) {
 
 1214         fi->SetBit(TFileInfo::kStaged);
 
 1216         nDeleteUrls = fi->GetNUrls() - 2;
 
 1217         for (Int_t i=0; i<nDeleteUrls; i++) {
 
 1224       fi->RemoveUrl( kfNoopUnknownUrl->GetUrl() );
 
 1225       fi->RemoveUrl( kfNoopNoneUrl->GetUrl() );
 
 1226       fi->RemoveUrl( kfNoopRedirUrl->GetUrl() );
 
 1231       TFileInfo *newFi = 
new TFileInfo(*fi);
 
 1237     if (!fc->GetDefaultTreeName())
 
 1238       fc->SetDefaultTreeName(newFc->GetDefaultTreeName());
 
 1245   if (fstg) 
delete fstg;
 
 1253 Bool_t TDataSetManagerAliEn::ExistsDataSet(
const char *uri)
 
 1255    TFileCollection *fc = GetDataSet(uri);
 
 1256    Bool_t existsNonEmpty = (fc && (fc->GetNFiles() > 0));
 
 1258    return existsNonEmpty;
 
 1263 Int_t TDataSetManagerAliEn::RegisterDataSet(
const char *, TFileCollection *,
 
 1266   MayNotUse(
"RegisterDataSet");
 
 1272 TMap *TDataSetManagerAliEn::GetDataSets(
const char *, UInt_t)
 
 1274   MayNotUse(
"GetDataSets");
 
 1280 void TDataSetManagerAliEn::ShowDataSets(
const char *, 
const char *)
 
 1282   MayNotUse(
"ShowDataSets");
 
 1287 Bool_t TDataSetManagerAliEn::RemoveDataSet(
const char *)
 
 1289   MayNotUse(
"RemoveDataSet");
 
 1295 Int_t TDataSetManagerAliEn::ScanDataSet(
const char *, UInt_t)
 
 1297   MayNotUse(
"ScanDataSet");
 
 1303 Int_t TDataSetManagerAliEn::ShowCache(
const char *)
 
 1305   MayNotUse(
"ShowCache");
 
 1311 Int_t TDataSetManagerAliEn::ClearCache(
const char *)
 
 1313   MayNotUse(
"ClearCache");