1 /**************************************************************************
2 * Copyright(c) 1998-2007, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // Author: Mihaela Gheata, 01/09/2008
18 //==============================================================================
19 // AliAnalysisGrid - Base grid utility class. Provides interface for creating
20 // a personalized JDL, finding and creating a dataset.
21 //==============================================================================
24 #include "AliAnalysisGrid.h"
26 ClassImp(AliAnalysisGrid)
28 //______________________________________________________________________________
29 AliAnalysisGrid::AliAnalysisGrid(const AliAnalysisGrid& other)
35 //______________________________________________________________________________
36 AliAnalysisGrid &AliAnalysisGrid::operator=(const AliAnalysisGrid& other)
40 TNamed::operator=(other);
45 //______________________________________________________________________________
46 Bool_t AliAnalysisGrid::CreateToken(const char *username)
48 // Check if a valid token exists - if not create one
49 TString user = gSystem->Getenv("USER");
51 printf("Error in AliAnalysisGrid::CreateToken: $USER environment empty");
54 Int_t err_msg = gSystem->Exec("no_command > /dev/null 2>/dev/null");
55 Int_t token_value = gSystem->Exec("bash alien-token-info > /dev/null 2>/dev/null");
56 if (token_value == err_msg) {
57 printf("Error in AliAnalysisGrid::CreateToken: You do not seem to have <alien-token-info> in your path.");
61 Bool_t to_create_token = kFALSE;
63 // Token still valid, check alien_API_USER environment
64 TString token_user = gSystem->Getenv("alien_API_USER");
65 if (token_user.Length()) {
66 // Environment file sourced
67 if (!username) return kTRUE; // for default $USER
68 if (token_user == username) return kTRUE; // for <username>
69 // A valid token existing, and environment sourced, but for a different user
70 to_create_token = kTRUE;
73 // Token not valid anymore for <username>. Call alien-token-init
74 to_create_token = kTRUE;
76 if (to_create_token) {
77 printf("______________________________________________________________________________________\n");
78 printf("AliAnalysisGrid::CreateToken: Seems you need a token. Calling alien-token-init for you\n");
79 printf("______________________________________________________________________________________\n");
81 if (username) token_init = gSystem->Exec(Form("alien-token-init %s", username));
82 else token_init = gSystem->Exec("alien-token-init");
83 if (token_init == err_msg) {
84 printf(" Woops - semms alien-token-init is not in your path...\n");
86 } else if (token_init != 0) {
87 printf(" Woops - did not succeed...\n");
91 // We have a valid token - just source it
92 printf("______________________________________________________________________________________\n");
93 printf("AliAnalysisGrid::CreateToken: Your token needs to be sourced in the current shell\n");
94 printf(" USE: > source /tmp/gclient_env_%d\n", gSystem->GetUid(user));
95 printf("______________________________________________________________________________________\n");
99 //______________________________________________________________________________
100 AliAnalysisGrid::EPluginRunMode AliAnalysisGrid::GetRunMode() const
102 // Get the current run mode.
103 if (TObject::TestBit(kTest)) return AliAnalysisGrid::kTest;
104 if (TObject::TestBit(kOffline)) return AliAnalysisGrid::kOffline;
105 if (TObject::TestBit(kSubmit)) return AliAnalysisGrid::kSubmit;
106 if (TObject::TestBit(kMerge)) return AliAnalysisGrid::kMerge;
107 return AliAnalysisGrid::kFull;
110 //______________________________________________________________________________
111 void AliAnalysisGrid::SetRunMode(const char *mode)
113 // Set the alien plugin run mode. All modes require presence of a valid token
114 // and sourcing the AliEn environment. Supported modes are:
115 // - full (default): Generates requested datasets, locally generates the JDL,
116 // saves existing analysis manager to the file analysis.root,
117 // generates analysis macro, execution and validation scripts,
118 // copies all these files to AliEn working space and submits
119 // the job leaving user in an AliEn shell.
120 // - test : Generates only 10 entries of the first requested dataset and
121 // copies this locally as wn.xml, generates all files from the
122 // full run mode except the JDL and executes the analysis locally.
123 // This mode can be used to test if the analysis may run in grid.
124 // - offline : No dataset is produced, but all other files are locally generated.
125 // No file is copied in AliEn workspace. This mode can be used to
126 // customize the automatic JDL/analysis macro.
127 // - submit : Datasets are generated in AliEn but the JDL and all the other
128 // files are supposed to exist in the local directory. The files
129 // are copied to AliEn and the job is submitted. This mode should
130 // be used in correlation with "offline mode" to submit customized
131 // analysis macro/jdl.
132 // - merge : Only MergeOutputs() method called to merge the registered
133 // outputs of a job that finished.
136 TObject::SetBit(kTest, kFALSE);
137 TObject::SetBit(kOffline, kFALSE);
138 TObject::SetBit(kSubmit, kFALSE);
139 TObject::SetBit(kMerge, kFALSE);
140 if (smode.Contains("test")) {
141 TObject::SetBit(kTest, kTRUE);
144 if (smode.Contains("offline")) {
145 TObject::SetBit(kOffline, kTRUE);
148 if (smode.Contains("submit")) {
149 TObject::SetBit(kSubmit, kTRUE);
152 if (smode.Contains("merge") || smode.Contains("terminate")) {
153 TObject::SetBit(kMerge, kTRUE);
156 if (!smode.Contains("full")) {
157 Warning("SetRunMode","Run mode \"%s\" not known. Supported modes: \"full\", \"test\", \"offline\", \"submit\" and \"merge\"", mode);
158 Warning("SetRunMode","Run mode set to FULL");