ROOT logo
// $Id: AEVMlClient.cxx 2088 2008-11-23 20:26:46Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

//__________________________________________________________________________
// AEVMlClient
//
//

#include "AEVMlClient.h"
#include "AEVMlClient.c7"

#include "AEVJobRep.h"

#include <Glasses/ZQueen.h>

#include <TSystem.h>
#include <TRandom.h>

#include <sys/time.h>

typedef list<AEVMlClient::MonaEntry>           lMonaEntry_t;
typedef list<AEVMlClient::MonaEntry>::iterator lMonaEntry_i;

/**************************************************************************/

ClassImp(AEVMlClient::MonaEntry);

/**************************************************************************/

const Text_t* AEVMlClient::MonaEntry::StdFormat()
{
  return GForm("/%s/%s/%s/%-32s %12s (%s)", fFarm.Data(), fCluster.Data(),
	       fNode.Data(), fParam.Data(), fValue.Data(), fDateStr.Data());
}

/**************************************************************************/
/**************************************************************************/

ClassImp(AEVMlClient);

/**************************************************************************/

void AEVMlClient::_init()
{
  mServer  = "http://pcaliense01.cern.ch:6004/axis/services/MLWebService";
  mFarm    = "ALICE-SC05";
  mCluster = "ALIEN_QUERY";
  mNode    = "*";
  mParam   = "*";

  mFromHrs = 1;
  mToHrs   = 0;

  mFLSort  = SM_None;

  bConnected = false;
  mBDP.init("MlClient");
  // mBDP.bDebug = true;

  FILE* cpath = gSystem->OpenPipe("aev-monaclasspath.sh", "r");
  char buf[1024]; fgets(buf, 1024, cpath);
  int s = strlen(buf);
  if(s && buf[s-1] == 10) buf[s-1] = 0;
  setenv("CLASSPATH", buf, 1);
  gSystem->ClosePipe(cpath);
}

/**************************************************************************/
// This was used with perl client.

void AEVMlClient::OpenConn()
{
  static const Exc_t _eh("AEVMlClient::OpenConn ");

  if(bConnected) {
    throw(_eh + "already connected.");
  }

  GMutexHolder mllck(hMonaLock);

  // Perl client
  //   system(GForm("mona_client.pl %s %s %s > %s/ml_log 2>&1 &",
  // 	       mServer.Data(),
  // 	       mBDP.fAtoBName.Data(), mBDP.fBtoAName.Data(),
  // 	       mBDP.fDir.Data())
  // 	 );

  // Java client
  system(GForm("java MonaClient %s %s %s > %s/ml_log 2>&1 &",
	       mServer.Data(),
	       mBDP.fAtoBName.Data(), mBDP.fBtoAName.Data(),
	       mBDP.fDir.Data())
	 );

  mBDP.open_BtoA();
  mBDP.read_line();
  if(strncmp(mBDP.fRB,"OK",2) != 0) {
    mBDP.read_line();
    mBDP.close_fifos();
    throw(_eh + "initialization error: " + mBDP.fRB);
  }
  mBDP.open_AtoB();
  bConnected = true;
  Stamp(FID());
}

void AEVMlClient::CloseConn()
{
  static const Exc_t _eh("AEVMlClient::CloseConn ");

  if(!bConnected) {
    throw(_eh + "not connected.");
  }
  {
    GMutexHolder mllck(hMonaLock);
    mBDP.close_fifos();
    // printf("fifos closed ...\n");
  }
  bConnected = false;
  Stamp(FID());
}

void AEVMlClient::check_connection(const Exc_t& eh)
{
  if(bConnected == false)
    OpenConn();
  if(bConnected == false)
    throw(eh + "can not open connection.");
}

/**************************************************************************/

void AEVMlClient::GetValues(list<MonaEntry>& results)
{
  static const Exc_t _eh("AEVMlClient::GetValues ");

  check_connection(_eh);

  char tstr[26];
  long long int t_to   = (long long int)(-3600000*mToHrs);
   long long int t_from = (long long int)(-3600000*mFromHrs);
  // Nasty hack for Seattle time difference
  //long long int t_to   = (long long int)(-3600000*(mToHrs   - 24));
  //long long int t_from = (long long int)(-3600000*(mFromHrs + 24));

  GMutexHolder mllck(hMonaLock);

  int n = mBDP.send_command
    ( GForm("GetValues\n%s\n%s\n%s\n%s\n%lld\n%lld",
	    mFarm.Data(), mCluster.Data(), mNode.Data(), mParam.Data(),
	    t_from, t_to));

  if(n >= 0) {
    for(int i=0; i<n; ++i) {
      MonaEntry m;
      m.fFarm    = mBDP.read_line();
      m.fCluster = mBDP.read_line();
      m.fNode    = mBDP.read_line();
      m.fParam   = mBDP.read_line();
      m.fValue   = mBDP.read_line();

      time_t epochtime = time_t(atoll(mBDP.read_line())/1000);
      m.fTime.SetSec(epochtime);
      ctime_r(&epochtime, tstr);
      tstr[24]='\0';
      m.fDateStr = tstr;

      results.push_back(m);
    }
  } else {
    throw(_eh + "ERROR: " + mBDP.fError + ".");
  }
}

void AEVMlClient::GetFLValues(list<MonaEntry>& results)
{
  static const Exc_t _eh("AEVMlClient::GetFLValues ");

  check_connection(_eh);

  char tstr[26];

  GMutexHolder mllck(hMonaLock);

  int n = mBDP.send_command
    ( GForm("GetFLValues\n%s\n%s\n%s\n%s",
	    mFarm.Data(), mCluster.Data(), mNode.Data(), mParam.Data()) );

  if(n >= 0) {
    for(int i=0; i<n; ++i) {
      MonaEntry m;
      m.fFarm    = mBDP.read_line();
      m.fCluster = mBDP.read_line();
      m.fNode    = mBDP.read_line();
      m.fParam   = mBDP.read_line();
      m.fValue   = mBDP.read_line();

      time_t epochtime = time_t(atoll(mBDP.read_line())/1000);
      m.fTime.SetSec(epochtime);
      ctime_r(&epochtime, tstr);
      tstr[24]='\0';
      m.fDateStr = tstr;

      results.push_back(m);
    }

    switch (mFLSort) {
    case SM_Ascending:  results.sort(monaentry_time_lt()); break;
    case SM_Descending: results.sort(monaentry_time_gt()); break;
    default:            break;
    }

  } else {
    throw(_eh + "ERROR: " + mBDP.fError + ".");
  }
}

/**************************************************************************/

void AEVMlClient::PrintValues()
{
  static const Exc_t _eh("AEVMlClient::PrintValues ");

  list<MonaEntry> mes;
  GetValues(mes);

  int n = mes.size();
  printf("%s entries=%d\n", _eh.Data(), n);

  for(lMonaEntry_i i=mes.begin(); i!=mes.end(); ++i)
  {
    MonaEntry& m = *i;
    printf("/%s/%s/%s/%-32s %12s (%s)\n", m.fFarm.Data(), m.fCluster.Data(),
	   m.fNode.Data(), m.fParam.Data(), m.fValue.Data(), m.fDateStr.Data());
  }
}

void AEVMlClient::PrintFLValues()
{
  static const Exc_t _eh("AEVMlClient::PrintFLValues ");

  list<MonaEntry> mes;
  GetFLValues(mes);

  int n = mes.size();
  printf("%s entries=%d\n", _eh.Data(), n);

  for(lMonaEntry_i i=mes.begin(); i!=mes.end(); ++i) {
    MonaEntry& m = *i;
    printf("/%s/%s/%s/%-32s %12s (%s)\n", m.fFarm.Data(), m.fCluster.Data(),
	   m.fNode.Data(), m.fParam.Data(), m.fValue.Data(), m.fDateStr.Data());
  }
}

/**************************************************************************/

void AEVMlClient::FindJobs()
{
  static const Exc_t _eh("AEVMlClient::FindJobs ");

  GMutexHolder mllck(hMonaLock);

  { GLensWriteHolder wrlck(this);
    ClearList();

    mCluster = "ALIEN_PROCESS"; // "ALIEN_QUERY"; // "ALIEN_INFO";
    mNode    = "*";
    mParam   = "status";
    mFLSort  = SM_Descending;
    Stamp(FID());
  }

  list<MonaEntry> jobs;
  GetFLValues(jobs);

  { GLensWriteHolder wrlck(this);
    for(list<MonaEntry>::iterator i=jobs.begin(); i!=jobs.end(); ++i) {
      AEVJobRep* job = new AEVJobRep;

      job->SetName(i->fNode);
      job->SetStatus(i->fValue);
      job->SetDateStr(i->fDateStr);

      mQueen->CheckIn(job);
      Add(job);
    }
    mCluster = "ALIEN_QUERY";
    mParam   = "jobname";
  }

  jobs.clear(); GetFLValues(jobs);

  { GLensWriteHolder wrlck(this);
    for(list<MonaEntry>::iterator i=jobs.begin(); i!=jobs.end(); ++i) {
      AEVJobRep* job = (AEVJobRep*) GetElementByName(i->fNode);
      if(job == 0) {
	printf("%s (jobname) job '%s' not found!\n", _eh.Data(), i->fNode.Data());
	continue;
      }
      job->SetJobname(i->fValue);
    }
    mParam = "user";
  }

  jobs.clear(); GetFLValues(jobs);

  { GLensWriteHolder wrlck(this);
    for(list<MonaEntry>::iterator i=jobs.begin(); i!=jobs.end(); ++i) {
      AEVJobRep* job = (AEVJobRep*) GetElementByName(i->fNode);
      if(job == 0) {
	printf("%s (username) job '%s' not found!\n", _eh.Data(), i->fNode.Data());
	continue;
      }
      job->SetUsername(i->fValue);
    }

    Stepper<AEVJobRep> s(this);
    while(s.step())
      s->FormatTitle();

    Stamp(FID());
  }
}

namespace {

const char* Jobnames[] = { "Anal-PiK", "Cal-QvsZ", "Fed-MacTest", "test", "CPU-burner" };
Int_t JobnamesN  = 5;

const char* Usernames[] = { "apeters", "carminati", "alimaster", "feynmann", "buncic" };
Int_t UsernamesN  = 5;

const char* Statuses[] = { "FINISHED", "FINISHED", "FINISHED", "RUNNING", "QUEUED", "WAITING" };
Int_t StatusesN  = 6;
}

void AEVMlClient::FakeFindJobs()
{
  Int_t n_fake = 35;
  Int_t n_days = 10;

  TRandom gen(0);

  vector<time_t> times(n_fake);
  GTime now(GTime::I_Now);
  for(Int_t n=0; n<n_fake; ++n) {
    times[n] = time_t(now.GetSec() - n_days*3600*24*gen.Rndm());
  }
  sort(times.begin(), times.end(), greater_equal<time_t>());

  {
    GLensWriteHolder wrlck(this);
    ClearList();

    char tstr[26];
    for(Int_t n=0; n<n_fake; ++n)
    {
      AEVJobRep* job = new AEVJobRep;

      job->SetName(GForm("Aid-%06d", Int_t(1e6*gen.Rndm())));
      job->SetJobname(Jobnames[Int_t(JobnamesN*gen.Rndm())]);
      job->SetUsername(Usernames[Int_t(UsernamesN*gen.Rndm())]);
      job->SetStatus(Statuses[Int_t(StatusesN*gen.Rndm())]);
      ctime_r(&times[n], tstr);
      job->SetDateStr(tstr);
      job->FormatTitle();

      mQueen->CheckIn(job);
      Add(job);
    }
  }
}
 AEVMlClient.cxx:1
 AEVMlClient.cxx:2
 AEVMlClient.cxx:3
 AEVMlClient.cxx:4
 AEVMlClient.cxx:5
 AEVMlClient.cxx:6
 AEVMlClient.cxx:7
 AEVMlClient.cxx:8
 AEVMlClient.cxx:9
 AEVMlClient.cxx:10
 AEVMlClient.cxx:11
 AEVMlClient.cxx:12
 AEVMlClient.cxx:13
 AEVMlClient.cxx:14
 AEVMlClient.cxx:15
 AEVMlClient.cxx:16
 AEVMlClient.cxx:17
 AEVMlClient.cxx:18
 AEVMlClient.cxx:19
 AEVMlClient.cxx:20
 AEVMlClient.cxx:21
 AEVMlClient.cxx:22
 AEVMlClient.cxx:23
 AEVMlClient.cxx:24
 AEVMlClient.cxx:25
 AEVMlClient.cxx:26
 AEVMlClient.cxx:27
 AEVMlClient.cxx:28
 AEVMlClient.cxx:29
 AEVMlClient.cxx:30
 AEVMlClient.cxx:31
 AEVMlClient.cxx:32
 AEVMlClient.cxx:33
 AEVMlClient.cxx:34
 AEVMlClient.cxx:35
 AEVMlClient.cxx:36
 AEVMlClient.cxx:37
 AEVMlClient.cxx:38
 AEVMlClient.cxx:39
 AEVMlClient.cxx:40
 AEVMlClient.cxx:41
 AEVMlClient.cxx:42
 AEVMlClient.cxx:43
 AEVMlClient.cxx:44
 AEVMlClient.cxx:45
 AEVMlClient.cxx:46
 AEVMlClient.cxx:47
 AEVMlClient.cxx:48
 AEVMlClient.cxx:49
 AEVMlClient.cxx:50
 AEVMlClient.cxx:51
 AEVMlClient.cxx:52
 AEVMlClient.cxx:53
 AEVMlClient.cxx:54
 AEVMlClient.cxx:55
 AEVMlClient.cxx:56
 AEVMlClient.cxx:57
 AEVMlClient.cxx:58
 AEVMlClient.cxx:59
 AEVMlClient.cxx:60
 AEVMlClient.cxx:61
 AEVMlClient.cxx:62
 AEVMlClient.cxx:63
 AEVMlClient.cxx:64
 AEVMlClient.cxx:65
 AEVMlClient.cxx:66
 AEVMlClient.cxx:67
 AEVMlClient.cxx:68
 AEVMlClient.cxx:69
 AEVMlClient.cxx:70
 AEVMlClient.cxx:71
 AEVMlClient.cxx:72
 AEVMlClient.cxx:73
 AEVMlClient.cxx:74
 AEVMlClient.cxx:75
 AEVMlClient.cxx:76
 AEVMlClient.cxx:77
 AEVMlClient.cxx:78
 AEVMlClient.cxx:79
 AEVMlClient.cxx:80
 AEVMlClient.cxx:81
 AEVMlClient.cxx:82
 AEVMlClient.cxx:83
 AEVMlClient.cxx:84
 AEVMlClient.cxx:85
 AEVMlClient.cxx:86
 AEVMlClient.cxx:87
 AEVMlClient.cxx:88
 AEVMlClient.cxx:89
 AEVMlClient.cxx:90
 AEVMlClient.cxx:91
 AEVMlClient.cxx:92
 AEVMlClient.cxx:93
 AEVMlClient.cxx:94
 AEVMlClient.cxx:95
 AEVMlClient.cxx:96
 AEVMlClient.cxx:97
 AEVMlClient.cxx:98
 AEVMlClient.cxx:99
 AEVMlClient.cxx:100
 AEVMlClient.cxx:101
 AEVMlClient.cxx:102
 AEVMlClient.cxx:103
 AEVMlClient.cxx:104
 AEVMlClient.cxx:105
 AEVMlClient.cxx:106
 AEVMlClient.cxx:107
 AEVMlClient.cxx:108
 AEVMlClient.cxx:109
 AEVMlClient.cxx:110
 AEVMlClient.cxx:111
 AEVMlClient.cxx:112
 AEVMlClient.cxx:113
 AEVMlClient.cxx:114
 AEVMlClient.cxx:115
 AEVMlClient.cxx:116
 AEVMlClient.cxx:117
 AEVMlClient.cxx:118
 AEVMlClient.cxx:119
 AEVMlClient.cxx:120
 AEVMlClient.cxx:121
 AEVMlClient.cxx:122
 AEVMlClient.cxx:123
 AEVMlClient.cxx:124
 AEVMlClient.cxx:125
 AEVMlClient.cxx:126
 AEVMlClient.cxx:127
 AEVMlClient.cxx:128
 AEVMlClient.cxx:129
 AEVMlClient.cxx:130
 AEVMlClient.cxx:131
 AEVMlClient.cxx:132
 AEVMlClient.cxx:133
 AEVMlClient.cxx:134
 AEVMlClient.cxx:135
 AEVMlClient.cxx:136
 AEVMlClient.cxx:137
 AEVMlClient.cxx:138
 AEVMlClient.cxx:139
 AEVMlClient.cxx:140
 AEVMlClient.cxx:141
 AEVMlClient.cxx:142
 AEVMlClient.cxx:143
 AEVMlClient.cxx:144
 AEVMlClient.cxx:145
 AEVMlClient.cxx:146
 AEVMlClient.cxx:147
 AEVMlClient.cxx:148
 AEVMlClient.cxx:149
 AEVMlClient.cxx:150
 AEVMlClient.cxx:151
 AEVMlClient.cxx:152
 AEVMlClient.cxx:153
 AEVMlClient.cxx:154
 AEVMlClient.cxx:155
 AEVMlClient.cxx:156
 AEVMlClient.cxx:157
 AEVMlClient.cxx:158
 AEVMlClient.cxx:159
 AEVMlClient.cxx:160
 AEVMlClient.cxx:161
 AEVMlClient.cxx:162
 AEVMlClient.cxx:163
 AEVMlClient.cxx:164
 AEVMlClient.cxx:165
 AEVMlClient.cxx:166
 AEVMlClient.cxx:167
 AEVMlClient.cxx:168
 AEVMlClient.cxx:169
 AEVMlClient.cxx:170
 AEVMlClient.cxx:171
 AEVMlClient.cxx:172
 AEVMlClient.cxx:173
 AEVMlClient.cxx:174
 AEVMlClient.cxx:175
 AEVMlClient.cxx:176
 AEVMlClient.cxx:177
 AEVMlClient.cxx:178
 AEVMlClient.cxx:179
 AEVMlClient.cxx:180
 AEVMlClient.cxx:181
 AEVMlClient.cxx:182
 AEVMlClient.cxx:183
 AEVMlClient.cxx:184
 AEVMlClient.cxx:185
 AEVMlClient.cxx:186
 AEVMlClient.cxx:187
 AEVMlClient.cxx:188
 AEVMlClient.cxx:189
 AEVMlClient.cxx:190
 AEVMlClient.cxx:191
 AEVMlClient.cxx:192
 AEVMlClient.cxx:193
 AEVMlClient.cxx:194
 AEVMlClient.cxx:195
 AEVMlClient.cxx:196
 AEVMlClient.cxx:197
 AEVMlClient.cxx:198
 AEVMlClient.cxx:199
 AEVMlClient.cxx:200
 AEVMlClient.cxx:201
 AEVMlClient.cxx:202
 AEVMlClient.cxx:203
 AEVMlClient.cxx:204
 AEVMlClient.cxx:205
 AEVMlClient.cxx:206
 AEVMlClient.cxx:207
 AEVMlClient.cxx:208
 AEVMlClient.cxx:209
 AEVMlClient.cxx:210
 AEVMlClient.cxx:211
 AEVMlClient.cxx:212
 AEVMlClient.cxx:213
 AEVMlClient.cxx:214
 AEVMlClient.cxx:215
 AEVMlClient.cxx:216
 AEVMlClient.cxx:217
 AEVMlClient.cxx:218
 AEVMlClient.cxx:219
 AEVMlClient.cxx:220
 AEVMlClient.cxx:221
 AEVMlClient.cxx:222
 AEVMlClient.cxx:223
 AEVMlClient.cxx:224
 AEVMlClient.cxx:225
 AEVMlClient.cxx:226
 AEVMlClient.cxx:227
 AEVMlClient.cxx:228
 AEVMlClient.cxx:229
 AEVMlClient.cxx:230
 AEVMlClient.cxx:231
 AEVMlClient.cxx:232
 AEVMlClient.cxx:233
 AEVMlClient.cxx:234
 AEVMlClient.cxx:235
 AEVMlClient.cxx:236
 AEVMlClient.cxx:237
 AEVMlClient.cxx:238
 AEVMlClient.cxx:239
 AEVMlClient.cxx:240
 AEVMlClient.cxx:241
 AEVMlClient.cxx:242
 AEVMlClient.cxx:243
 AEVMlClient.cxx:244
 AEVMlClient.cxx:245
 AEVMlClient.cxx:246
 AEVMlClient.cxx:247
 AEVMlClient.cxx:248
 AEVMlClient.cxx:249
 AEVMlClient.cxx:250
 AEVMlClient.cxx:251
 AEVMlClient.cxx:252
 AEVMlClient.cxx:253
 AEVMlClient.cxx:254
 AEVMlClient.cxx:255
 AEVMlClient.cxx:256
 AEVMlClient.cxx:257
 AEVMlClient.cxx:258
 AEVMlClient.cxx:259
 AEVMlClient.cxx:260
 AEVMlClient.cxx:261
 AEVMlClient.cxx:262
 AEVMlClient.cxx:263
 AEVMlClient.cxx:264
 AEVMlClient.cxx:265
 AEVMlClient.cxx:266
 AEVMlClient.cxx:267
 AEVMlClient.cxx:268
 AEVMlClient.cxx:269
 AEVMlClient.cxx:270
 AEVMlClient.cxx:271
 AEVMlClient.cxx:272
 AEVMlClient.cxx:273
 AEVMlClient.cxx:274
 AEVMlClient.cxx:275
 AEVMlClient.cxx:276
 AEVMlClient.cxx:277
 AEVMlClient.cxx:278
 AEVMlClient.cxx:279
 AEVMlClient.cxx:280
 AEVMlClient.cxx:281
 AEVMlClient.cxx:282
 AEVMlClient.cxx:283
 AEVMlClient.cxx:284
 AEVMlClient.cxx:285
 AEVMlClient.cxx:286
 AEVMlClient.cxx:287
 AEVMlClient.cxx:288
 AEVMlClient.cxx:289
 AEVMlClient.cxx:290
 AEVMlClient.cxx:291
 AEVMlClient.cxx:292
 AEVMlClient.cxx:293
 AEVMlClient.cxx:294
 AEVMlClient.cxx:295
 AEVMlClient.cxx:296
 AEVMlClient.cxx:297
 AEVMlClient.cxx:298
 AEVMlClient.cxx:299
 AEVMlClient.cxx:300
 AEVMlClient.cxx:301
 AEVMlClient.cxx:302
 AEVMlClient.cxx:303
 AEVMlClient.cxx:304
 AEVMlClient.cxx:305
 AEVMlClient.cxx:306
 AEVMlClient.cxx:307
 AEVMlClient.cxx:308
 AEVMlClient.cxx:309
 AEVMlClient.cxx:310
 AEVMlClient.cxx:311
 AEVMlClient.cxx:312
 AEVMlClient.cxx:313
 AEVMlClient.cxx:314
 AEVMlClient.cxx:315
 AEVMlClient.cxx:316
 AEVMlClient.cxx:317
 AEVMlClient.cxx:318
 AEVMlClient.cxx:319
 AEVMlClient.cxx:320
 AEVMlClient.cxx:321
 AEVMlClient.cxx:322
 AEVMlClient.cxx:323
 AEVMlClient.cxx:324
 AEVMlClient.cxx:325
 AEVMlClient.cxx:326
 AEVMlClient.cxx:327
 AEVMlClient.cxx:328
 AEVMlClient.cxx:329
 AEVMlClient.cxx:330
 AEVMlClient.cxx:331
 AEVMlClient.cxx:332
 AEVMlClient.cxx:333
 AEVMlClient.cxx:334
 AEVMlClient.cxx:335
 AEVMlClient.cxx:336
 AEVMlClient.cxx:337
 AEVMlClient.cxx:338
 AEVMlClient.cxx:339
 AEVMlClient.cxx:340
 AEVMlClient.cxx:341
 AEVMlClient.cxx:342
 AEVMlClient.cxx:343
 AEVMlClient.cxx:344
 AEVMlClient.cxx:345
 AEVMlClient.cxx:346
 AEVMlClient.cxx:347
 AEVMlClient.cxx:348
 AEVMlClient.cxx:349
 AEVMlClient.cxx:350
 AEVMlClient.cxx:351
 AEVMlClient.cxx:352
 AEVMlClient.cxx:353
 AEVMlClient.cxx:354
 AEVMlClient.cxx:355
 AEVMlClient.cxx:356
 AEVMlClient.cxx:357
 AEVMlClient.cxx:358
 AEVMlClient.cxx:359
 AEVMlClient.cxx:360
 AEVMlClient.cxx:361
 AEVMlClient.cxx:362
 AEVMlClient.cxx:363
 AEVMlClient.cxx:364
 AEVMlClient.cxx:365
 AEVMlClient.cxx:366
 AEVMlClient.cxx:367
 AEVMlClient.cxx:368
 AEVMlClient.cxx:369
 AEVMlClient.cxx:370
 AEVMlClient.cxx:371
 AEVMlClient.cxx:372
 AEVMlClient.cxx:373
 AEVMlClient.cxx:374
 AEVMlClient.cxx:375