1 #include "AliMuonQAMergeSubmitter.h"
3 #include "AliMuonAccEffSubmitter.h"
4 #include "AliAnalysisTriggerScalers.h"
9 #include "TGridResult.h"
12 const Int_t kFinal(999);
15 ClassImp(AliMuonQAMergeSubmitter)
17 //_____________________________________________________________________________
18 AliMuonQAMergeSubmitter::AliMuonQAMergeSubmitter(const char* period, const char* pass) :
19 AliMuonGridSubmitter(AliMuonGridSubmitter::kQAMerge),
22 fWhatToMerge("Merged.QA.Data.root"),
23 fSplitMaxInputFileNumber(50)
25 if (!fPeriod.BeginsWith("LHC"))
27 AliError("Period not starting with LHC !");
30 AddToTemplateFileList("QAMerge.C");
31 AddToTemplateFileList("QAMerge.sh");
32 AddToTemplateFileList("validation.sh");
33 AddToTemplateFileList(MergeJDLName(kFALSE).Data());
34 AddToTemplateFileList(MergeJDLName(kTRUE).Data());
36 SetVar("VAR_MERGED_OUTPUT_NAME",Form("%s",fWhatToMerge.Data()));
38 ShouldOverwriteFiles(kTRUE);
40 TString speriod(period);
42 Int_t year = 2000 + TString(speriod(3,3)).Atoi();
44 SetMapKeyValue("DataDirFormat",Form("/alice/data/%d/%s/%%09d/ESDs/%s",year,period,pass));
47 //_____________________________________________________________________________
48 AliMuonQAMergeSubmitter::~AliMuonQAMergeSubmitter()
52 //______________________________________________________________________________
53 Bool_t AliMuonQAMergeSubmitter::Generate(const char* jdlname) const
55 /// Create the JDL for merging jobs
59 std::ostream* os = CreateJDLFile(jdlname);
66 Bool_t final = TString(jdlname).Contains("final",TString::kIgnoreCase);
68 (*os) << "# Generated merging jdl (production mode)" << std::endl
69 << "# $1 = run number" << std::endl
70 << "# $2 = merging stage" << std::endl
71 << "# Stage_<n>.xml made via: find <OutputDir> *Stage<n-1>/*" << fWhatToMerge.Data() << std::endl;
73 OutputToJDL(*os,"Packages",
74 GetMapValue("AliRoot").Data(),
75 GetMapValue("Geant3").Data(),
76 GetMapValue("Root").Data(),
77 GetMapValue("API").Data());
79 OutputToJDL(*os,"Executable","QAMerge.sh");
81 OutputToJDL(*os,"Price","1");
85 OutputToJDL(*os,"Jobtag","comment: AliMuonQAMergeSubmitter final merging RUN $1");
89 OutputToJDL(*os,"Jobtag","comment: AliMuonQAMergeSubmitter merging RUN $1 stage $2");
92 OutputToJDL(*os,"Workdirectorysize","5000MB");
94 OutputToJDL(*os,"Validationcommand",Form("%s/validation.sh",RemoteDir().Data()));
96 OutputToJDL(*os,"TTL","14400");
98 OutputToJDL(*os,"OutputArchive",
99 "log_archive.zip:stderr,stdout@disk=1",
100 Form("root_archive.zip:%s@disk=3",fWhatToMerge.Data())
103 // OutputToJDL(*os,"Arguments",(final ? "2":"1")); // for QAmerge.sh, 1 means intermediate merging stage, 2 means final merging
107 OutputToJDL(*os,"Arguments","wn.xml");
108 OutputToJDL(*os,"InputFile",Form("LF:%s/QAMerge.C",RemoteDir().Data()));
109 OutputToJDL(*os,"OutputDir",Form("%s/$1/Stage_$2/#alien_counter_03i#",RemoteDir().Data()));
110 OutputToJDL(*os,"Split","se");
111 OutputToJDL(*os,"InputDataCollection",Form("LF:%s/$1/Stage_$2.xml,nodownload",RemoteDir().Data()));
112 OutputToJDL(*os,"SplitMaxInputFileNumber",Form("%d",GetSplitMaxInputFileNumber()));
113 OutputToJDL(*os,"InputDataListFormat","xml-single");
114 OutputToJDL(*os,"InputDataList","wn.xml");
118 OutputToJDL(*os,"InputFile",Form("LF:%s/QAMerge.C",RemoteDir().Data()),
119 Form("LF:%s/$1/Stage_$2.xml",RemoteDir().Data()));
120 OutputToJDL(*os,"Arguments","Stage_$2.xml $1");
121 OutputToJDL(*os,"OutputDir",Form("%s/$1",RemoteDir().Data()));
127 //_____________________________________________________________________________
128 UInt_t AliMuonQAMergeSubmitter::MakeXMLCollectionForRun(Int_t runNumber, Int_t stage)
130 /// Create a collection named Stage_[stage].xml
131 /// with the files from stage-1 (or all the files if stage=0)
132 /// Return the total number of files to be merged
136 AliError(Form("Stage (%d) should be >=0",stage));
145 filename.Form("%s/%d/Stage_%d.xml",LocalDir().Data(),runNumber,stage);
146 sourcedir.Form("%s/%d/Stage_%d",RemoteDir().Data(),runNumber,stage-1);
148 else if ( stage == 1 )
150 sourcedir = GetMapValue("DataDirFormat");
152 if ( sourcedir.Length() == 0 )
154 AliError("Cannot make collections from an empty data dir !");
157 filename.Form("%s/%d/Stage_%d.xml",LocalDir().Data(),runNumber,stage);
167 TGridResult* res = gGrid->Query(Form(sourcedir.Data(),runNumber),fWhatToMerge.Data());
169 Int_t nFiles = res->GetEntries();
173 AliError(Form("Got no file for run %d",runNumber));
177 gSystem->mkdir(Form("%s/",gSystem->DirName(filename.Data())),kTRUE);
179 AliDebug(1,Form("Creating %s",filename.Data()));
181 std::ofstream out(filename.Data());
183 out << Form("<?xml version=\"1.0\"?>\n<alien>\n <collection name=\"%d-stage-%d\">",runNumber,stage) << std::endl;
186 const Double_t byte2GB(1024*1024*1024);
188 for (Int_t i = 0; i < nFiles; ++i)
192 size += TString(res->GetKey(i,"size")).Atoll();
194 out << Form(" <event name=\"%d\">",count) << endl;
195 out << Form(" <file name=\"%s\" aclId=\"%s\" broken=\"%s\" ctime=\"%s\" "
196 "dir=\"%s\" entryId=\"%s\" expiretime=\"%s\" gowner=\"%s\" "
197 "guid=\"%s\" guidtime=\"%s\" lfn=\"%s\" md5=\"%s\" owner=\"%s\" "
198 " perm=\"%s\" replicated=\"%s\" size=\"%s\" turl=\"%s\" type=\"%s\" />",
199 gSystem->BaseName(res->GetKey(i,"lfn")),
200 res->GetKey(i,"aclId"),
201 res->GetKey(i,"broken"),
202 res->GetKey(i,"ctime"),
203 res->GetKey(i,"dir"),
204 res->GetKey(i,"entryId"),
205 res->GetKey(i,"expiretime"),
206 res->GetKey(i,"gowner"),
207 res->GetKey(i,"guid"),
208 res->GetKey(i,"guidtime"),
209 res->GetKey(i,"lfn"),
210 res->GetKey(i,"md5"),
211 res->GetKey(i,"owner"),
212 res->GetKey(i,"perm"),
213 res->GetKey(i,"replicated"),
214 res->GetKey(i,"size"),
215 res->GetKey(i,"turl"),
216 res->GetKey(i,"type")) << endl;
217 out << " </event>" << endl;
220 TString summary(Form("numberoffiles=\"%d\" size=\"%7.2f GB\" ",count,size/byte2GB));
222 out << Form(" <summary %s />",summary.Data()) << endl;
223 out << " </collection>" << endl;
224 out << "</alien>" << endl;
230 Bool_t ok = CopyFile(filename.Data());
237 //_____________________________________________________________________________
238 void AliMuonQAMergeSubmitter::Print(Option_t*) const
240 std::cout << "SplitMaxInputFileNumber : " << GetSplitMaxInputFileNumber() << std::endl;
241 AliMuonGridSubmitter::Print();
244 //_____________________________________________________________________________
245 Bool_t AliMuonQAMergeSubmitter::Run(const char* mode)
247 if (!IsValid()) return kFALSE;
252 if ( smode == "FULL")
254 return ( Run("LOCAL") && Run("UPLOAD") && Run("SUBMIT") );
257 if ( smode == "LOCAL")
259 return CopyTemplateFilesToLocal();
262 if ( smode == "UPLOAD" )
264 return CopyLocalFilesToRemote();
267 if ( smode == "TEST" )
269 Bool_t ok = Run("LOCAL") && Run("UPLOAD");
272 ok = (Submit(kTRUE)>0);
277 if ( smode == "SUBMIT" )
279 return (Submit(kFALSE)>0);
286 //_____________________________________________________________________________
287 Bool_t AliMuonQAMergeSubmitter::SetRemoteDir(const char* dir)
289 if ( AliMuonGridSubmitter::SetRemoteDir(dir) )
301 //______________________________________________________________________________
302 void AliMuonQAMergeSubmitter::ShowStage(Int_t runNumber)
304 /// Show stage for a given run number
308 if ( RemoteFileExists(Form("%s/%d/%s",RemoteDir().Data(),runNumber,fWhatToMerge.Data())) )
314 stage = GetLastStage(Form("%s/%d",RemoteDir().Data(),runNumber));
317 std::cout << "RUN " << runNumber << " ";
319 if ( stage == kFinal )
321 std::cout << "FINAL";
325 std::cout << "Stage " << stage;
327 std::cout << std::endl;
330 //______________________________________________________________________________
331 void AliMuonQAMergeSubmitter::ShowStages()
333 /// Show in remote dir the list of stages we're in for each run
335 TGridResult* r = gGrid->Ls(RemoteDir());
337 std::map<int,std::vector<int> > stages;
339 while ( r->GetFileName(i) )
341 TString s(r->GetFileName(i));
344 Int_t runNumber = s.Atoi();
347 if ( RemoteFileExists(Form("%s/%d/%s",RemoteDir().Data(),runNumber,fWhatToMerge.Data())) )
353 stage = GetLastStage(Form("%s/%d",RemoteDir().Data(),runNumber));
356 stages[stage].push_back(runNumber);
362 std::map<int,std::vector<int> >::const_iterator it;
364 for ( it = stages.begin(); it != stages.end(); ++it )
366 const std::vector<int>& runs = it->second;
367 Int_t stage = it->first;
368 if ( stage == kFinal )
370 std::cout << "FINAL";
374 std::cout << "Stage " << stage;
376 std::cout << std::endl;
377 for ( std::vector<int>::size_type irun = 0; irun < runs.size(); ++irun )
379 std::cout << runs[irun] << " ";
381 std::cout << std::endl;
386 //_____________________________________________________________________________
387 Bool_t AliMuonQAMergeSubmitter::Submit(Int_t runNumber, Bool_t dryRun)
389 /// Submit merging job for one run
391 TString runDir = GetRemoteDir(Form("%s/%d", RemoteDir().Data(), runNumber),kTRUE);
393 if (RemoteFileExists(Form("%s/%s", runDir.Data(),fWhatToMerge.Data())))
395 AliWarning(" ! final merging already done");
399 Int_t lastStage = GetLastStage(runDir.Data());
401 AliDebug(1,Form("lastStage=%d",lastStage));
405 UInt_t n = MakeXMLCollectionForRun(runNumber,lastStage);
407 Bool_t final = ( n < GetSplitMaxInputFileNumber() );
410 TString jdl(MergeJDLName(final));
412 gGrid->Cd(RemoteDir().Data());
414 query.Form("submit %s %d %d", jdl.Data(), runNumber, lastStage);
416 AliInfo(Form("query=%s",query.Data()));
423 Bool_t done = kFALSE;
424 TGridResult *res = gGrid->Command(query);
427 TString cjobId1 = res->GetKey(0,"jobId");
428 if (!cjobId1.IsDec())
436 AliInfo(Form(" DONE\n --> the job Id is: %s \n", cjobId1.Data()));
449 //_____________________________________________________________________________
450 Int_t AliMuonQAMergeSubmitter::Submit(Bool_t dryRun)
452 /// Submit merging jobs
456 AliError("No run to work with");
460 const std::vector<int>& runs = RunList();
464 for ( std::vector<int>::size_type i = 0; i < runs.size(); ++i )
467 Bool_t ok = Submit(run,dryRun);
471 failed += TString::Format("%d",run);
476 if (failed.Length()>0)
478 AliInfo(Form("List of failed runs : %s",failed.Data()));