ROOT logo
TChain *MakeAODInputChain(const char* collectionfileAOD,
			  const char* collectionfileAODfriend,Int_t nfiles=-1,
			  Bool_t stdoutCheck=kFALSE) {
  //
  // Check one-to-one correspondence of the two collections
  // Create AOD chain with friend AODVertexingHF chain
  // Origin: A.Rossi, andrea.rossi@ts.infn.it
  //

  TAlienCollection *collectionAOD       = TAlienCollection::Open(collectionfileAOD);
  TGridResult *tagResultAOD = collectionAOD->GetGridResult("",0,0);
  TChain *chainAOD = new TChain("aodTree");
  TChain *chainAODfriend = new TChain("aodTree");
  Int_t nmaxentr;
  if(collectionfileAODfriend!="none"){
    TAlienCollection *collectionAODfriend = TAlienCollection::Open(collectionfileAODfriend);
    TGridResult *tagResultAODFriend = collectionAODfriend->GetGridResult("",0,0);
    //  tagResultAOD->Print();
    TMap *mappa;
    TObjString *filename;
    Int_t event,dir,pos;
    string str;
    Int_t lastAOD[1000],lastAODFriend[1000];
    TArrayI ***arrAOD=new TArrayI**[1000];
    TArrayI ***arrAODFriend=new TArrayI**[1000];
    
    for(Int_t j=0;j<1000;j++) {
      arrAOD[j]=new TArrayI*[2];
      arrAOD[j][0]=new TArrayI(100);
      arrAOD[j][0]->Reset(0);
      arrAOD[j][1]=new TArrayI(100);
      arrAOD[j][1]->Reset(-1);
      
      arrAODFriend[j]=new TArrayI*[2];
      arrAODFriend[j][0]=new TArrayI(100);
      arrAODFriend[j][0]->Reset(0);
      arrAODFriend[j][1]=new TArrayI(100);
      arrAODFriend[j][1]->Reset(-1);
      
      lastAOD[j]=0;
      lastAODFriend[j]=0;
    }
   
    nmaxentr=tagResultAOD->GetEntries();
    if(nfiles>0&&nmaxentr>nfiles)nmaxentr=nfiles;
   
    for(Int_t j=0;j<tagResultAOD->GetEntries();j++) {  
      mappa=(TMap*)tagResultAOD->At(j);
      filename=(TObjString*)mappa->GetValue("turl");
      str=filename->GetString();
      pos=str.find_last_of("/");
      str.string::replace(pos,50,"");
      pos=str.find_last_of("/");
      str.string::replace(pos,1," ");
      sscanf(str.data(),"%*s %d",&event);
      pos=str.find_last_of("/");
      str.string::replace(pos,1," ");
      sscanf(str.data(),"%*s %d",&dir);
      arrAOD[event][0]->AddAt(dir,lastAOD[event]);
      arrAOD[event][1]->AddAt(j,lastAOD[event]);
      // printf("Adding AOD, event:%d,dir:%d,position:%d\n",event,dir,j);
      lastAOD[event]++;
    }
    
    for(Int_t j=0;j<tagResultAODFriend->GetEntries();j++) {  
      mappa=(TMap*)tagResultAODFriend->At(j);
      filename=(TObjString*)mappa->GetValue("turl");
      str=filename->GetString();
      pos=str.find_last_of("/");
      str.string::replace(pos,50,"");
      pos=str.find_last_of("/");
      str.string::replace(pos,1," ");
      sscanf(str.data(),"%*s %d",&event);
      pos=str.find_last_of("/");
      str.string::replace(pos,1," ");
      sscanf(str.data(),"%*s %d",&dir);
      arrAODFriend[event][0]->AddAt(dir,lastAODFriend[event]);
      arrAODFriend[event][1]->AddAt(j,lastAODFriend[event]);
      //printf("Adding AODFriend, event:%d,dir:%d,position:%d\n",event,dir,j);
      lastAODFriend[event]++;
    }
    
      
    for(Int_t ev=0;ev<1000;ev++) {
      for(Int_t j=0;j<lastAOD[ev];j++) {
	dir= arrAOD[ev][0]->At(j);
	for(Int_t k=0;k<lastAODFriend[ev];k++) {
	  if(arrAODFriend[ev][0]->At(k)==dir){
	    chainAOD->Add((((TObjString*)((TMap*)tagResultAOD->At(arrAOD[ev][1]->At(j)))->GetValue("turl"))->GetString()).Data());
	    chainAODfriend->Add((((TObjString*)((TMap*)tagResultAODFriend->At(arrAODFriend[ev][1]->At(k)))->GetValue("turl"))->GetString()).Data());
	    printf("Events: %d, adding AOD at position %d,dir:%d posarray:%d \n and Friend at %d, dir:%d , posarray: %d \n \n",ev,arrAOD[ev][1]->At(j),arrAOD[ev][0]->At(j),j,arrAODFriend[ev][1]->At(k),arrAODFriend[ev][0]->At(k),k);
	    break;
	  }
	}
      }
    }
  } else {
    nmaxentr=tagResultAOD->GetEntries();
    if(nfiles>0&&nmaxentr>nfiles)nmaxentr=nfiles;
    TString aodlfn,vertexlfn;
    for(Int_t ifile=0; ifile<nmaxentr; ifile++) {
      aodlfn=tagResultAOD->GetKey(ifile,"lfn");
      vertexlfn=aodlfn;
      vertexlfn.ReplaceAll("AliAOD.root","");
      TGridResult *r=gGrid->Query(vertexlfn.Data(),"AliAOD.VertexingHF.root");
      if(r->GetEntries()!=1)continue;
      // check error in the stdout
      if(stdoutCheck) {
	if(!CheckStdout(aodlfn)) continue;
      }
      printf("Adding file : %s \n",tagResultAOD->GetKey(ifile,"turl"));
      chainAOD->Add(tagResultAOD->GetKey(ifile,"turl"));
      printf("Adding friend file : %s \n \n",r->GetKey(0,"turl"));
      chainAODfriend->Add(r->GetKey(0,"turl"));
    }
  }
  
  chainAOD->AddFriend(chainAODfriend);
  
  return chainAOD;
}
//----------------------------------------------------------------------------
TChain *MakeAODInputChain(const char* pathname="",
			  Int_t firstdir=1,Int_t lastdir=-1) {
  //
  // Create AOD chain with friend AODVertexingHF chain
  // Example path: "alien:///alice/cern.ch/user/r/rbala/analysis/out_lhcw/290001/"
  // Origin: A.Rossi, andrea.rossi@ts.infn.it
  //

 
  TChain *chainAOD = new TChain("aodTree");
  TChain *chainAODfriend = new TChain("aodTree");
 

  if(firstdir==-1) {
    // require the path is an alien path (!!!but without alien::// or /alien/ ), use lastdir as the requested number of files 
    TGridResult* resultAOD=gGrid->Query(pathname,"AliAOD.root","","");
    Int_t nfiles=resultAOD->GetEntries();
    TString aodlfn,vertexlfn;
    if(lastdir>nfiles)lastdir=nfiles;
    for(Int_t ifile=0; ifile<nfiles; ifile++) {
      aodlfn=resultAOD->GetKey(ifile,"lfn");
      vertexlfn=aodlfn;
      vertexlfn.ReplaceAll("AliAOD.root","");
      TGridResult *r=gGrid->Query(vertexlfn.Data(),"AliAOD.VertexingHF.root");
      if(r->GetEntries()!=1)continue;
      chainAOD->Add(resultAOD->GetKey(ifile,"turl"));
      chainAODfriend->Add(r->GetKey(0,"turl"));
    }
  }
  else{
    if(lastdir==-1) { // only one pair of files
      chainAOD->Add("AliAOD.root");
      chainAODfriend->Add("AliAOD.VertexingHF.root"); 
    } else {
  
      // set the path to the files (can be local or on alien)
      for(Int_t idir=firstdir; idir<=lastdir; idir++) {
	TString aodname=pathname;
	TString aodHFname=pathname;
	aodname+=idir;
	aodHFname+=idir;
	aodname.Append("/AliAOD.root");
	aodHFname.Append("/AliAOD.VertexingHF.root");
	chainAOD->Add(aodname.Data());
	chainAODfriend->Add(aodHFname.Data());
      }      
    }
  }

  chainAOD->AddFriend(chainAODfriend);
 
  return chainAOD;
}
//----------------------------------------------------------------------------
TFileCollection* MakeRootArchFileCollection(const char* collectionfileAOD,
					    Int_t nfiles=-1,
					    Bool_t stdoutCheck=kFALSE) {

  // METHOD USEFUL FOR ANALYSIS ON THE CAF
  // Check the presence of both AliAOD.root and AODVertexingHF.root files
  // in the same path
  // returns a TFileCollection suitable for storing datasets in CAF 
  // Origin: A.Rossi, andrea.rossi@ts.infn.it
  //
  
  TAlienCollection *collectionAOD       = TAlienCollection::Open(collectionfileAOD);
  TGridResult *tagResultAOD = collectionAOD->GetGridResult("",0,0);

  Int_t nmaxentr;
  TFileCollection *proofColl=new TFileCollection("proofColl","proofColl");
  
  nmaxentr=tagResultAOD->GetEntries();
  printf("Number of files %d\n",nmaxentr);
    if(nfiles>0&&nmaxentr>nfiles)nmaxentr=nfiles;
    TString aodlfn;
    for(Int_t ifile=0; ifile<nmaxentr; ifile++) {
      printf("file %d\n",ifile);
      aodlfn=tagResultAOD->GetKey(ifile,"lfn");
      TString aodlfncopy=aodlfn;
      aodlfn.ReplaceAll("AliAOD.root","");
      aodlfn.ReplaceAll("AliAODs.root","");
      TGridResult *r=gGrid->Query(aodlfn.Data(),"AliAOD.VertexingHF.root");
      if(r->GetEntries()!=1)continue;     
      r=gGrid->Query(aodlfn.Data(),"aod_archive.zip");
      if(r->GetEntries()!=1)continue;
      // check error in the stdout
      if(stdoutCheck) {
	if(!CheckStdout(aodlfncopy)) {
	  FILE *fout=fopen("errors.txt","a");
	  aodlfncopy.ReplaceAll("AliAOD.root","AliAOD.VertexingHF.root");
	  fprintf(fout,"%s\n",aodlfncopy.Data());
	  fclose(fout);
	  continue;
	}
      }
      aodlfn.Append("aod_archive.zip");      
      printf("Adding file %s\n",aodlfn.Data());
      proofColl->Add(r->GetKey(0,"turl"));
    }
    return proofColl;
}
//----------------------------------------------------------------------------
void StageToCAF(TString xmlcoll="collAODLHC08x.xml",
		TString datasetname="AODVertexingHF_LHC08x_10files",
		Int_t nfiles=-1) {
  //
  // Staging a dataset to CAF
  // andrea.dainese@pd.infn.it
  //

  //gROOT->LoadMacro("MakeAODInputChain.C");

  TGrid::Connect("alien://");

  // find -x collAODLHC08x -z /alice/cern.ch/user/r/rbala/newtrain/out_lhc08x/* AliAOD.root > collAODLHC08x.xml

  TFileCollection *proofColl = MakeRootArchFileCollection(xmlcoll.Data(),nfiles,KTRUE);
  proofColl->SetAnchor("AliAOD.root");

  gEnv->SetValue("XSec.GSI.DelegProxy","2");
  TProof::Open("dainesea:PWG3@alicecaf"); 
  gProof->RegisterDataSet(datasetname.Data(),proofColl);
  gProof->ShowDataSets();

  return;
}
//---------------------------------------------------------------------------
Bool_t CheckStdout(TString aodlfn) {
  
  TString stderrlfn=aodlfn;
  stderrlfn.ReplaceAll("AliAOD.root","stdout");
  TString aliencp=".! alien_cp -t 10 alien://";
  aliencp.Append(stderrlfn.Data());
  aliencp.Append(" file:stdoutput");
  gROOT->ProcessLine(aliencp.Data());
  gROOT->ProcessLine(".! grep \"no debugging symbols found\" stdoutput > result");
  FILE *fileres=fopen("result","r");
  if(!fileres) return kFALSE;
  Char_t text[100];
  Int_t ncol = fscanf(fileres,"%s %s %s %s",&text,&text,&text,&text);
  //printf("%d  %s\n",ncol,text);
  fclose(fileres);
  gROOT->ProcessLine(".! rm stdoutput result");
  if(ncol>=0) return kFALSE;
  
  return kTRUE;
}
 MakeAODInputChain.C:1
 MakeAODInputChain.C:2
 MakeAODInputChain.C:3
 MakeAODInputChain.C:4
 MakeAODInputChain.C:5
 MakeAODInputChain.C:6
 MakeAODInputChain.C:7
 MakeAODInputChain.C:8
 MakeAODInputChain.C:9
 MakeAODInputChain.C:10
 MakeAODInputChain.C:11
 MakeAODInputChain.C:12
 MakeAODInputChain.C:13
 MakeAODInputChain.C:14
 MakeAODInputChain.C:15
 MakeAODInputChain.C:16
 MakeAODInputChain.C:17
 MakeAODInputChain.C:18
 MakeAODInputChain.C:19
 MakeAODInputChain.C:20
 MakeAODInputChain.C:21
 MakeAODInputChain.C:22
 MakeAODInputChain.C:23
 MakeAODInputChain.C:24
 MakeAODInputChain.C:25
 MakeAODInputChain.C:26
 MakeAODInputChain.C:27
 MakeAODInputChain.C:28
 MakeAODInputChain.C:29
 MakeAODInputChain.C:30
 MakeAODInputChain.C:31
 MakeAODInputChain.C:32
 MakeAODInputChain.C:33
 MakeAODInputChain.C:34
 MakeAODInputChain.C:35
 MakeAODInputChain.C:36
 MakeAODInputChain.C:37
 MakeAODInputChain.C:38
 MakeAODInputChain.C:39
 MakeAODInputChain.C:40
 MakeAODInputChain.C:41
 MakeAODInputChain.C:42
 MakeAODInputChain.C:43
 MakeAODInputChain.C:44
 MakeAODInputChain.C:45
 MakeAODInputChain.C:46
 MakeAODInputChain.C:47
 MakeAODInputChain.C:48
 MakeAODInputChain.C:49
 MakeAODInputChain.C:50
 MakeAODInputChain.C:51
 MakeAODInputChain.C:52
 MakeAODInputChain.C:53
 MakeAODInputChain.C:54
 MakeAODInputChain.C:55
 MakeAODInputChain.C:56
 MakeAODInputChain.C:57
 MakeAODInputChain.C:58
 MakeAODInputChain.C:59
 MakeAODInputChain.C:60
 MakeAODInputChain.C:61
 MakeAODInputChain.C:62
 MakeAODInputChain.C:63
 MakeAODInputChain.C:64
 MakeAODInputChain.C:65
 MakeAODInputChain.C:66
 MakeAODInputChain.C:67
 MakeAODInputChain.C:68
 MakeAODInputChain.C:69
 MakeAODInputChain.C:70
 MakeAODInputChain.C:71
 MakeAODInputChain.C:72
 MakeAODInputChain.C:73
 MakeAODInputChain.C:74
 MakeAODInputChain.C:75
 MakeAODInputChain.C:76
 MakeAODInputChain.C:77
 MakeAODInputChain.C:78
 MakeAODInputChain.C:79
 MakeAODInputChain.C:80
 MakeAODInputChain.C:81
 MakeAODInputChain.C:82
 MakeAODInputChain.C:83
 MakeAODInputChain.C:84
 MakeAODInputChain.C:85
 MakeAODInputChain.C:86
 MakeAODInputChain.C:87
 MakeAODInputChain.C:88
 MakeAODInputChain.C:89
 MakeAODInputChain.C:90
 MakeAODInputChain.C:91
 MakeAODInputChain.C:92
 MakeAODInputChain.C:93
 MakeAODInputChain.C:94
 MakeAODInputChain.C:95
 MakeAODInputChain.C:96
 MakeAODInputChain.C:97
 MakeAODInputChain.C:98
 MakeAODInputChain.C:99
 MakeAODInputChain.C:100
 MakeAODInputChain.C:101
 MakeAODInputChain.C:102
 MakeAODInputChain.C:103
 MakeAODInputChain.C:104
 MakeAODInputChain.C:105
 MakeAODInputChain.C:106
 MakeAODInputChain.C:107
 MakeAODInputChain.C:108
 MakeAODInputChain.C:109
 MakeAODInputChain.C:110
 MakeAODInputChain.C:111
 MakeAODInputChain.C:112
 MakeAODInputChain.C:113
 MakeAODInputChain.C:114
 MakeAODInputChain.C:115
 MakeAODInputChain.C:116
 MakeAODInputChain.C:117
 MakeAODInputChain.C:118
 MakeAODInputChain.C:119
 MakeAODInputChain.C:120
 MakeAODInputChain.C:121
 MakeAODInputChain.C:122
 MakeAODInputChain.C:123
 MakeAODInputChain.C:124
 MakeAODInputChain.C:125
 MakeAODInputChain.C:126
 MakeAODInputChain.C:127
 MakeAODInputChain.C:128
 MakeAODInputChain.C:129
 MakeAODInputChain.C:130
 MakeAODInputChain.C:131
 MakeAODInputChain.C:132
 MakeAODInputChain.C:133
 MakeAODInputChain.C:134
 MakeAODInputChain.C:135
 MakeAODInputChain.C:136
 MakeAODInputChain.C:137
 MakeAODInputChain.C:138
 MakeAODInputChain.C:139
 MakeAODInputChain.C:140
 MakeAODInputChain.C:141
 MakeAODInputChain.C:142
 MakeAODInputChain.C:143
 MakeAODInputChain.C:144
 MakeAODInputChain.C:145
 MakeAODInputChain.C:146
 MakeAODInputChain.C:147
 MakeAODInputChain.C:148
 MakeAODInputChain.C:149
 MakeAODInputChain.C:150
 MakeAODInputChain.C:151
 MakeAODInputChain.C:152
 MakeAODInputChain.C:153
 MakeAODInputChain.C:154
 MakeAODInputChain.C:155
 MakeAODInputChain.C:156
 MakeAODInputChain.C:157
 MakeAODInputChain.C:158
 MakeAODInputChain.C:159
 MakeAODInputChain.C:160
 MakeAODInputChain.C:161
 MakeAODInputChain.C:162
 MakeAODInputChain.C:163
 MakeAODInputChain.C:164
 MakeAODInputChain.C:165
 MakeAODInputChain.C:166
 MakeAODInputChain.C:167
 MakeAODInputChain.C:168
 MakeAODInputChain.C:169
 MakeAODInputChain.C:170
 MakeAODInputChain.C:171
 MakeAODInputChain.C:172
 MakeAODInputChain.C:173
 MakeAODInputChain.C:174
 MakeAODInputChain.C:175
 MakeAODInputChain.C:176
 MakeAODInputChain.C:177
 MakeAODInputChain.C:178
 MakeAODInputChain.C:179
 MakeAODInputChain.C:180
 MakeAODInputChain.C:181
 MakeAODInputChain.C:182
 MakeAODInputChain.C:183
 MakeAODInputChain.C:184
 MakeAODInputChain.C:185
 MakeAODInputChain.C:186
 MakeAODInputChain.C:187
 MakeAODInputChain.C:188
 MakeAODInputChain.C:189
 MakeAODInputChain.C:190
 MakeAODInputChain.C:191
 MakeAODInputChain.C:192
 MakeAODInputChain.C:193
 MakeAODInputChain.C:194
 MakeAODInputChain.C:195
 MakeAODInputChain.C:196
 MakeAODInputChain.C:197
 MakeAODInputChain.C:198
 MakeAODInputChain.C:199
 MakeAODInputChain.C:200
 MakeAODInputChain.C:201
 MakeAODInputChain.C:202
 MakeAODInputChain.C:203
 MakeAODInputChain.C:204
 MakeAODInputChain.C:205
 MakeAODInputChain.C:206
 MakeAODInputChain.C:207
 MakeAODInputChain.C:208
 MakeAODInputChain.C:209
 MakeAODInputChain.C:210
 MakeAODInputChain.C:211
 MakeAODInputChain.C:212
 MakeAODInputChain.C:213
 MakeAODInputChain.C:214
 MakeAODInputChain.C:215
 MakeAODInputChain.C:216
 MakeAODInputChain.C:217
 MakeAODInputChain.C:218
 MakeAODInputChain.C:219
 MakeAODInputChain.C:220
 MakeAODInputChain.C:221
 MakeAODInputChain.C:222
 MakeAODInputChain.C:223
 MakeAODInputChain.C:224
 MakeAODInputChain.C:225
 MakeAODInputChain.C:226
 MakeAODInputChain.C:227
 MakeAODInputChain.C:228
 MakeAODInputChain.C:229
 MakeAODInputChain.C:230
 MakeAODInputChain.C:231
 MakeAODInputChain.C:232
 MakeAODInputChain.C:233
 MakeAODInputChain.C:234
 MakeAODInputChain.C:235
 MakeAODInputChain.C:236
 MakeAODInputChain.C:237
 MakeAODInputChain.C:238
 MakeAODInputChain.C:239
 MakeAODInputChain.C:240
 MakeAODInputChain.C:241
 MakeAODInputChain.C:242
 MakeAODInputChain.C:243
 MakeAODInputChain.C:244
 MakeAODInputChain.C:245
 MakeAODInputChain.C:246
 MakeAODInputChain.C:247
 MakeAODInputChain.C:248
 MakeAODInputChain.C:249
 MakeAODInputChain.C:250
 MakeAODInputChain.C:251
 MakeAODInputChain.C:252
 MakeAODInputChain.C:253
 MakeAODInputChain.C:254
 MakeAODInputChain.C:255
 MakeAODInputChain.C:256
 MakeAODInputChain.C:257
 MakeAODInputChain.C:258
 MakeAODInputChain.C:259
 MakeAODInputChain.C:260
 MakeAODInputChain.C:261
 MakeAODInputChain.C:262
 MakeAODInputChain.C:263
 MakeAODInputChain.C:264
 MakeAODInputChain.C:265
 MakeAODInputChain.C:266
 MakeAODInputChain.C:267
 MakeAODInputChain.C:268
 MakeAODInputChain.C:269
 MakeAODInputChain.C:270