ROOT logo

void mergeByComponent(TString       component,
                      const Char_t* fileList="calib.list",
                      const Char_t* apath=0, 
                      const Char_t* apattern=0, 
                      Int_t         fileDownloadTimeOut=10, 
                      const Char_t* localFileList="calib.list",
                      const Char_t* mergedFileName="CalibObjects.root" )
{
  // merging procedure
  // component can be COPY, MAKEALIENLIST, component name or ALL
  // ALL will merge the full file
  // selecting components will only merge the selected top level 
  //   objects in the file
  // COPY only copies the the alien files from fileList then 
  //   saves a list of local downloaded files in localFileList.
  // MAKEALIENLIST produces a list of files on alien, uses root
  //   to connect in case alien_xx utilities are not available 
  //   liek on the alien nodes
  /* load libs */
  printf("Executing mergeByComponent.C\n");
  gROOT->Macro("$ALICE_ROOT/PWGPP/CalibMacros/CPass0/LoadLibraries.C");
  TH1::AddDirectory(0);

  Int_t fileDownloadTimeOut=10;

  /* copy only */ 
  if (component == "COPY") {
    if (!apath || ! apattern){
      printf("Alien find path or pattern not specified");
      exit(1);
    }
    CopyCPass(fileList, localFileList, fileDownloadTimeOut);
    return;
  }
  /* make file list only */ 
  if (component == "MAKEALIENLIST") {
    if (!apath || ! apattern){
      printf("Alien find path or pattern not specified");
      exit(1);
    }
    MakeFileList(apath, apattern, fileList);
    return;
  }

  /* merge component */
  MergeCPass(fileList, component, mergedFileName);
}

//___________________________________________________________________

void MergeCPass(const Char_t *list, TString component, TString outputFileName="CalibObjects.root")
{
  //AliTPCcalibTimeGain::SetMergeEntriesCut(2000000);
  //AliTPCcalibGainMult::SetMergeEntriesCut(2000000);
  //AliTPCcalibAlign::SetMergeEntriesCut(10000000);
  //AliTPCcalibTracks::SetMergeEntriesCut(10000000);
  //AliTPCcalibTime::SetResHistoMergeCut(10000000);

   AliTPCcalibTimeGain::SetMergeEntriesCut(500000);
   AliTPCcalibGainMult::SetMergeEntriesCut(500000);
   AliTPCcalibAlign::SetMergeEntriesCut(5000000);
   AliTPCcalibTracks::SetMergeEntriesCut(5000000);

  AliFileMerger merger;
  /* select what to merge */
  merger.SetNoTrees(kFALSE);
  if (component == "ALL")
    merger.AddReject("esdFriend");
  else
    merger.AddAccept(component.Data());
  //
  // temporary solution: reject THn and THnSparse of  TPCAlign directory, since they
  // will be merged using their owner AliTPCcalibAlign object
  {
    merger.AddReject("AliTPCcalibAlign.alignTPC.fClusterDelta_0");
    merger.AddReject("AliTPCcalibAlign.alignTPC.fClusterDelta_1");
    merger.AddReject("AliTPCcalibAlign.alignTPC.fTrackletDelta_0");
    merger.AddReject("AliTPCcalibAlign.alignTPC.fTrackletDelta_1");
    merger.AddReject("AliTPCcalibAlign.alignTPC.fTrackletDelta_2");
    merger.AddReject("AliTPCcalibAlign.alignTPC.fTrackletDelta_3");
  }
  //
  /* merge */
  merger.IterTXT(list, outputFileName.Data(), kFALSE);
  /* notify */
  gSystem->Exec(Form("touch %s_merge_done", component.Data()));
  return;
}

//___________________________________________________________________
void MakeFileList(const char *searchdir, const char *pattern, const char* outputFileName="calib.list", 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 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(outputFileName));

  //first identify the largest file and put it at the beginning
  Int_t largestFileSize=0;
  TString largestFile;
  TObject* largestObject;
  while((map=(TMap*)nextmap()))
  {
    TObjString *objs = dynamic_cast<TObjString*>(map->GetValue("turl"));
    TObjString *objsSize = dynamic_cast<TObjString*>(map->GetValue("size"));
    if (!objs || !objs->GetString().Length()) continue;
    if (!objsSize || !objsSize->GetString().Length()) continue;

    Int_t currentFileSize=objsSize->GetString().Atoi();
    if (currentFileSize>largestFileSize) 
    {
      largestFileSize=currentFileSize;
      largestFile=objs->GetString();
      largestObject=map;
    }
  }
  outputFile << largestFile.Data()<< endl;
  res->Remove(largestObject);
  
  //then write the rest of the entries to the file
  nextmap.Reset();
  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());
    outputFile << src.Data()<< endl;
  }
  outputFile.close();
  return;
}

//___________________________________________________________________
void CopyCPass(const char* alienFileList="alien.list", const char* outputFileList="local.list", Int_t timeOut=10)
{
  //copy all the alien files to local
  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");

  ifstream inputFile;
  inputFile.open(alienFileList);
  ofstream outputFile;
  outputFile.open(Form(outputFileList));

  if (!inputFile.is_open())
  {
    printf("input file %s not found! exiting...\n",alienFileList);
    exit(1);
  }

  Int_t counter=0;
  while( inputFile.good())
  {
    TString src("");
    src.ReadLine(inputFile);
    if (src.IsNull()) continue;
    TString dst=src;
    dst.ReplaceAll("alien:///","");
    dst.ReplaceAll("/","_");
    Bool_t result = TFile::Cp(src.Data(),dst.Data(),kTRUE);
    AliSysInfo::AddStamp(dst.Data(),counter, result);
    if (result) 
    {
      outputFile << dst.Data()<< endl;
      counter++;
    }
  }
  cout<<counter<<" files copied!"<<endl;

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

 mergeByComponent.C:1
 mergeByComponent.C:2
 mergeByComponent.C:3
 mergeByComponent.C:4
 mergeByComponent.C:5
 mergeByComponent.C:6
 mergeByComponent.C:7
 mergeByComponent.C:8
 mergeByComponent.C:9
 mergeByComponent.C:10
 mergeByComponent.C:11
 mergeByComponent.C:12
 mergeByComponent.C:13
 mergeByComponent.C:14
 mergeByComponent.C:15
 mergeByComponent.C:16
 mergeByComponent.C:17
 mergeByComponent.C:18
 mergeByComponent.C:19
 mergeByComponent.C:20
 mergeByComponent.C:21
 mergeByComponent.C:22
 mergeByComponent.C:23
 mergeByComponent.C:24
 mergeByComponent.C:25
 mergeByComponent.C:26
 mergeByComponent.C:27
 mergeByComponent.C:28
 mergeByComponent.C:29
 mergeByComponent.C:30
 mergeByComponent.C:31
 mergeByComponent.C:32
 mergeByComponent.C:33
 mergeByComponent.C:34
 mergeByComponent.C:35
 mergeByComponent.C:36
 mergeByComponent.C:37
 mergeByComponent.C:38
 mergeByComponent.C:39
 mergeByComponent.C:40
 mergeByComponent.C:41
 mergeByComponent.C:42
 mergeByComponent.C:43
 mergeByComponent.C:44
 mergeByComponent.C:45
 mergeByComponent.C:46
 mergeByComponent.C:47
 mergeByComponent.C:48
 mergeByComponent.C:49
 mergeByComponent.C:50
 mergeByComponent.C:51
 mergeByComponent.C:52
 mergeByComponent.C:53
 mergeByComponent.C:54
 mergeByComponent.C:55
 mergeByComponent.C:56
 mergeByComponent.C:57
 mergeByComponent.C:58
 mergeByComponent.C:59
 mergeByComponent.C:60
 mergeByComponent.C:61
 mergeByComponent.C:62
 mergeByComponent.C:63
 mergeByComponent.C:64
 mergeByComponent.C:65
 mergeByComponent.C:66
 mergeByComponent.C:67
 mergeByComponent.C:68
 mergeByComponent.C:69
 mergeByComponent.C:70
 mergeByComponent.C:71
 mergeByComponent.C:72
 mergeByComponent.C:73
 mergeByComponent.C:74
 mergeByComponent.C:75
 mergeByComponent.C:76
 mergeByComponent.C:77
 mergeByComponent.C:78
 mergeByComponent.C:79
 mergeByComponent.C:80
 mergeByComponent.C:81
 mergeByComponent.C:82
 mergeByComponent.C:83
 mergeByComponent.C:84
 mergeByComponent.C:85
 mergeByComponent.C:86
 mergeByComponent.C:87
 mergeByComponent.C:88
 mergeByComponent.C:89
 mergeByComponent.C:90
 mergeByComponent.C:91
 mergeByComponent.C:92
 mergeByComponent.C:93
 mergeByComponent.C:94
 mergeByComponent.C:95
 mergeByComponent.C:96
 mergeByComponent.C:97
 mergeByComponent.C:98
 mergeByComponent.C:99
 mergeByComponent.C:100
 mergeByComponent.C:101
 mergeByComponent.C:102
 mergeByComponent.C:103
 mergeByComponent.C:104
 mergeByComponent.C:105
 mergeByComponent.C:106
 mergeByComponent.C:107
 mergeByComponent.C:108
 mergeByComponent.C:109
 mergeByComponent.C:110
 mergeByComponent.C:111
 mergeByComponent.C:112
 mergeByComponent.C:113
 mergeByComponent.C:114
 mergeByComponent.C:115
 mergeByComponent.C:116
 mergeByComponent.C:117
 mergeByComponent.C:118
 mergeByComponent.C:119
 mergeByComponent.C:120
 mergeByComponent.C:121
 mergeByComponent.C:122
 mergeByComponent.C:123
 mergeByComponent.C:124
 mergeByComponent.C:125
 mergeByComponent.C:126
 mergeByComponent.C:127
 mergeByComponent.C:128
 mergeByComponent.C:129
 mergeByComponent.C:130
 mergeByComponent.C:131
 mergeByComponent.C:132
 mergeByComponent.C:133
 mergeByComponent.C:134
 mergeByComponent.C:135
 mergeByComponent.C:136
 mergeByComponent.C:137
 mergeByComponent.C:138
 mergeByComponent.C:139
 mergeByComponent.C:140
 mergeByComponent.C:141
 mergeByComponent.C:142
 mergeByComponent.C:143
 mergeByComponent.C:144
 mergeByComponent.C:145
 mergeByComponent.C:146
 mergeByComponent.C:147
 mergeByComponent.C:148
 mergeByComponent.C:149
 mergeByComponent.C:150
 mergeByComponent.C:151
 mergeByComponent.C:152
 mergeByComponent.C:153
 mergeByComponent.C:154
 mergeByComponent.C:155
 mergeByComponent.C:156
 mergeByComponent.C:157
 mergeByComponent.C:158
 mergeByComponent.C:159
 mergeByComponent.C:160
 mergeByComponent.C:161
 mergeByComponent.C:162
 mergeByComponent.C:163
 mergeByComponent.C:164
 mergeByComponent.C:165
 mergeByComponent.C:166
 mergeByComponent.C:167
 mergeByComponent.C:168
 mergeByComponent.C:169
 mergeByComponent.C:170
 mergeByComponent.C:171
 mergeByComponent.C:172
 mergeByComponent.C:173
 mergeByComponent.C:174
 mergeByComponent.C:175
 mergeByComponent.C:176
 mergeByComponent.C:177
 mergeByComponent.C:178
 mergeByComponent.C:179
 mergeByComponent.C:180
 mergeByComponent.C:181
 mergeByComponent.C:182
 mergeByComponent.C:183
 mergeByComponent.C:184
 mergeByComponent.C:185
 mergeByComponent.C:186
 mergeByComponent.C:187
 mergeByComponent.C:188
 mergeByComponent.C:189
 mergeByComponent.C:190
 mergeByComponent.C:191
 mergeByComponent.C:192
 mergeByComponent.C:193
 mergeByComponent.C:194
 mergeByComponent.C:195
 mergeByComponent.C:196
 mergeByComponent.C:197
 mergeByComponent.C:198
 mergeByComponent.C:199
 mergeByComponent.C:200