ROOT logo
//___________________________________________________________________

void merge(TString component, const Char_t *inputstring)
{

  /* load libs */
  gROOT->Macro("$ALICE_ROOT/PWGPP/CalibMacros/CPass1/LoadLibraries.C");
  TH1::AddDirectory(0);

  /* copy only */
  if (component == "COPY") {
    CopyCPass(inputstring, "AliESDfriends_v1.root");
    return;
  }
  
  /* merge component */
  MergeCPass(inputstring, component);
  
}

//___________________________________________________________________

void MergeCPass(const Char_t *list, TString component)
{
  AliFileMerger merger;
  /* select what to merge */
  if (component == "ALL")
    merger.AddReject("esdFriend");
  else
    merger.AddAccept(component.Data());
  /* merge */
  merger.IterTXT(list, "CalibObjects.root", kFALSE);
  /* notify */
  gSystem->Exec(Form("touch %s_merge_done", component.Data()));
  return;
}

//___________________________________________________________________

void CopyCPass(const char *searchdir, const char *pattern, Int_t timeOut=10)
{

  gSystem->Setenv("XRDCLIENTMAXWAIT",Form("%d",timeOut));
  gEnv->SetValue("XNet.RequestTimeout", timeOut);
  gEnv->SetValue("XNet.ConnectTimeout", timeOut);
  gEnv->SetValue("XNet.TransactionTimeout", timeOut);
  TFile::SetOpenTimeout(timeOut);

  TGrid::Connect("alien");

  TString filelist;
  TString command;
  command = Form("find %s/ %s", searchdir, pattern);
  cerr<<"command: "<<command<<endl;
  TGridResult *res = gGrid->Command(command);
  if (!res) return;
  TIter nextmap(res);
  TMap *map = 0;

  ofstream outputFile;
  outputFile.open(Form("calib.list"));
  Int_t counter=0;

  while((map=(TMap*)nextmap()))
  {
    TObjString *objs = dynamic_cast<TObjString*>(map->GetValue("turl"));
    if (!objs || !objs->GetString().Length())
    {
      delete res;
      break;
    }

    TString src=Form("%s",objs->GetString().Data());
    TString dst=src;
    dst.ReplaceAll("alien:///","");
    dst.ReplaceAll("/","_");
    TTimeStamp s1;
    Bool_t result = TFile::Cp(src.Data(),dst.Data(),kTRUE);
    TTimeStamp s2;
    AliSysInfo::AddStamp(dst.Data(),counter, result);
    if (result)
    {
      counter++;
      outputFile << dst.Data()<< endl;
    }
  }
  cout<<counter<<" files copied!"<<endl;

  outputFile.close();
  gSystem->Exec("touch copy_done");
  return;
}

 merge.byComponent.C:1
 merge.byComponent.C:2
 merge.byComponent.C:3
 merge.byComponent.C:4
 merge.byComponent.C:5
 merge.byComponent.C:6
 merge.byComponent.C:7
 merge.byComponent.C:8
 merge.byComponent.C:9
 merge.byComponent.C:10
 merge.byComponent.C:11
 merge.byComponent.C:12
 merge.byComponent.C:13
 merge.byComponent.C:14
 merge.byComponent.C:15
 merge.byComponent.C:16
 merge.byComponent.C:17
 merge.byComponent.C:18
 merge.byComponent.C:19
 merge.byComponent.C:20
 merge.byComponent.C:21
 merge.byComponent.C:22
 merge.byComponent.C:23
 merge.byComponent.C:24
 merge.byComponent.C:25
 merge.byComponent.C:26
 merge.byComponent.C:27
 merge.byComponent.C:28
 merge.byComponent.C:29
 merge.byComponent.C:30
 merge.byComponent.C:31
 merge.byComponent.C:32
 merge.byComponent.C:33
 merge.byComponent.C:34
 merge.byComponent.C:35
 merge.byComponent.C:36
 merge.byComponent.C:37
 merge.byComponent.C:38
 merge.byComponent.C:39
 merge.byComponent.C:40
 merge.byComponent.C:41
 merge.byComponent.C:42
 merge.byComponent.C:43
 merge.byComponent.C:44
 merge.byComponent.C:45
 merge.byComponent.C:46
 merge.byComponent.C:47
 merge.byComponent.C:48
 merge.byComponent.C:49
 merge.byComponent.C:50
 merge.byComponent.C:51
 merge.byComponent.C:52
 merge.byComponent.C:53
 merge.byComponent.C:54
 merge.byComponent.C:55
 merge.byComponent.C:56
 merge.byComponent.C:57
 merge.byComponent.C:58
 merge.byComponent.C:59
 merge.byComponent.C:60
 merge.byComponent.C:61
 merge.byComponent.C:62
 merge.byComponent.C:63
 merge.byComponent.C:64
 merge.byComponent.C:65
 merge.byComponent.C:66
 merge.byComponent.C:67
 merge.byComponent.C:68
 merge.byComponent.C:69
 merge.byComponent.C:70
 merge.byComponent.C:71
 merge.byComponent.C:72
 merge.byComponent.C:73
 merge.byComponent.C:74
 merge.byComponent.C:75
 merge.byComponent.C:76
 merge.byComponent.C:77
 merge.byComponent.C:78
 merge.byComponent.C:79
 merge.byComponent.C:80
 merge.byComponent.C:81
 merge.byComponent.C:82
 merge.byComponent.C:83
 merge.byComponent.C:84
 merge.byComponent.C:85
 merge.byComponent.C:86
 merge.byComponent.C:87
 merge.byComponent.C:88
 merge.byComponent.C:89
 merge.byComponent.C:90
 merge.byComponent.C:91
 merge.byComponent.C:92
 merge.byComponent.C:93
 merge.byComponent.C:94