ROOT logo
/**
 * @file   QATrain.C
 * @author Christian Holm Christensen <cholm@master.hehi.nbi.dk>
 * @date   Fri Jun  1 13:55:50 2012
 * 
 * @brief  
 * 
 * 
 * @ingroup pwglf_forward_trains_examples
 */

#include "TrainSetup.C"
#include <AliESDInputHandlerRP.h>
#include <AliCDBManager.h>

//====================================================================
/**
 * Analysis train to do full Quality Assurance train
 * 
 * @ingroup pwglf_forward_trains_examples
 */
class QATrain : public TrainSetup
{
public:
  enum { 
    kCDBConnect = 0x1, 
    kEventStats = 0x2,  // Event Statistics (Jan Fiete)
    kCentrality = 0x4,  // Centrality (A. Toia)
    kDefaultFlags = (kCDBConnect|kEventStats|kCentrality)
  };
  enum { 
    kVertex     = 0x000001,  // Vertexing (A. Dainese)
    kSymmetric  = 0x000002,  // TPC QA (E. Sicking)
    kVZERO      = 0x000004,  // VZERO QA  (C. Cheshkov)
    kTPC        = 0x000008,  // TPC (Jacek Otwinowski & Michael Knichel)
    kSPD        = 0x000010,  // SPD (A. Mastroserio) - Needs RP
    kSDD        = 0x000020,  // SDD (F. Prino) Needs RP
    kSSD        = 0x000040,  // SSD dEdx (Marek Chojnacki)
    kITS        = 0x000080,  // 
    kITSSA      = 0x000100,  // ITS saTracks (F.Prino)
    kITSAlign   = 0x000200,  // ITS align (F.Prino)
    kTRD        = 0x000400,  // TRD (Alex Bercuci, M. Fasel) 
    kZDC        = 0x000800,  // ZDC (Chiara Oppedisano) 
    kCALO       = 0x001000,  // Calorimetry (Gustavo Conesa)
    kMUONTRG    = 0x002000,  // Muon Trigger
    kMUONEff    = 0x004000,  // Muon Efficiency (not used) Need geo 
    kV0         = 0x008000,  // V0-Decay Reconstruction (Ana Marin)
			     // (not used) Need MC truth 
    kBRes       = 0x010000,  // Impact parameter resolution
			     // (xianbao.yuan@pd.infn.it,
			     // andrea.dainese@pd.infn.it) 
    kMUON       = 0x020000,  // MUON QA (Philippe Pillot)
    kTOF        = 0x040000,  // TOF (Francesca Bellini)
    kPIDRes     = 0x080000,  // PIDResponse (Jens)
    kPID        = 0x100000,  // PIDqa (Jens)
    kHMPID      = 0x200000,  // HMPID QA (Giacomo Volpe)
    kT0         = 0x400000,  // T0 QA (Alla Mayevskaya)
    kFMD        = 0x800000,  // FMD QA (Christian Holm Christiansen)
    kDefaultModules  = (kVertex|kSymmetric|kVZERO|kTPC|kSPD|kSDD|kSSD|kITS|
			kITSSA|kITSAlign|kTRD|kZDC|kCALO|kMUONTRG|kBRes|
			kMUON|kTOF|kPIDRes|kPID|kHMPID|kT0|kFMD)
  };
    
    

  /** 
   * Constructor.  Date and time must be specified when running this
   * in Termiante mode on Grid
   * 
   * @param name     Name of train 
   */
  QATrain(const char* name="PilotAnalysis")
    : TrainSetup(name, false, 0, 0, 0, 0, 0), 
      fRun(0),
      fFlags(kDefaultFlags), 
      fModules(kDefaultModules), 
      fTriggerMask(AliVEvent::kAnyINT), 
      fTriggerHM(AliVEvent::kHighMult),
      fTriggerEMC(AliVEvent::kEMC7), 
      fTriggerMUONBarrel(AliVEvent::kMUU7),
      fCollisionType(0) // 0: pp, 1: PbPb
  {}
  void SetFlags(UShort_t flags) { fFlags = flags; }
  void SetRun(UInt_t run) { fRun = run; }
  void SetModules(UInt_t m) { fModules = m; }
protected:
  AliVEventHandler* CreateInputHandler(EType type)
  {
    if (type != kESD) return 0;
    AliAnalysisManager::GetAnalysisManager()->SetRunFromPath(fRun);
    
    AliESDInputHandlerRP* ih = new AliESDInputHandlerRP();
    ih->SetReadFriends(kTRUE);
    ih->SetActiveBranches("ESDfriend");
    return ih;
  }
  AliAnalysisTaskSE* CreateTaskAndSetCollisionCandidates(const char* macro,
							 const char* args="")
  {
    AliAnalysisTaskSE* task = CoupleSECar(macro, args);
    if (task) task->SelectCollisionCandidates(fTriggerMask);
    return task;
  }
  void CreateCDBConnect()
  {                                 
    ::Info("CreateCDBConnect", "Loading CDB connect w/run=%d", fRun);
    AliAnalysisTask* task = CoupleCar("AddTaskCDBconnect.C", Form("%d", fRun));
    ::Info("CreateCDBConnect", "Loaded %p", task);
    if (!task) return;
    AliCDBManager::Instance()->SetDefaultStorage("raw://");
  }
  void CreatePhysicsSelection(Bool_t mc,
			      AliAnalysisManager* mgr)
  {
    // Event Statistics (Jan Fiete)
    if (!(fFlags & kEventStats)) return;
    TrainSetup::CreatePhysicsSelection(mc, mgr);
  }
  void CreateCentralitySelection(Bool_t mc, AliAnalysisManager* mgr)
  {
    // Centrality (A. Toia)
    if (!(fFlags & kCentrality)) return;
    TrainSetup::CreateCentralitySelection(mc, mgr);
  } 
  void CreateVertex()
  {
    // Vertexing (A. Dainese)
    CoupleCar("AddTaskVertexESD.C", Form("kFALSE,0x%x", fTriggerMask));
  }
  void CreateSymmetric()
  {
    // TPC QA (E. Sicking)
    CoupleCar("AddTaskQAsym.C", Form("0,0x%x,0x%x,0x%x,0x%x",
				     fTriggerMask, fTriggerHM, fTriggerEMC, 
				     fTriggerMUONBarrel));
  }
  void CreateVZERO()
  {
    //  VZERO QA  (C. Cheshkov)
    CoupleCar("AddTaskVZEROQA.C", "0");
  }
  void CreateTPC()
  {
    // TPC (Jacek Otwinowski & Michael Knichel)
    //
    // Optionally MC information can be used by setting the 1st
    // argument to true 
    // 
    // Optionally friends information can be switched off by setting
    // the 2st argument to false
    // 
    // Optionally highMult axis can be used by setting the 3st
    // argument to true (for PbPb)
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGPP/TPC/macros",
			     gROOT->GetMacroPath()));
    CreateTaskAndSetCollisionCandidates("AddTaskPerformanceTPCdEdxQA.C",
					"kFALSE,kTRUE,kFALSE");
  }
  void CreateSPD()
  {
    // SPD (A. Mastroserio)
    CreateTaskAndSetCollisionCandidates("AddTaskSPDQA.C");
    // AliAnalysisTask* task = 
    //   CreateTaskAndSetCollisionCandidates("AddTaskSPDQA.C");
    // if (!task) return;
    // task->SetOCDBInfo(fRun, "raw://");
  }
  void CreateSDD()
  {
    // SDD (F. Prino)
    CreateTaskAndSetCollisionCandidates("AddSDDPoints.C");
  }
  void CreateSSD()
  {
    // SSD dEdx (Marek Chojnacki)
    CreateTaskAndSetCollisionCandidates("AddTaskdEdxSSDQA.C");
  }
  void CreateITS()
  {
    CoupleCar("AddTaskPerformanceITS.C","false");
    if (fCollisionType == 0) return;

    gROOT->ProcessLine("AddTaskPerformanceITS(false,false,false,3500,10000)");
    gROOT->ProcessLine("AddTaskPerformanceITS(false,false,false,590,1570)");
    gROOT->ProcessLine("AddTaskPerformanceITS(false,false,false,70,310)");
  }
  void CreateITSSA() 
  {
    // ITS saTracks, align (F.Prino)
    CreateTaskAndSetCollisionCandidates("AddTaskITSsaTracks.C",
					"false,false)");
  }
  void CreateITSAlign()
  {
    // ITS saTracks, align (F.Prino)
    CoupleCar("AddTaskITSAlign.C","0,2011");
  }
  void CreateTRD()
  {
    // TRD (Alex Bercuci, M. Fasel) 
    gSystem->AddIncludePath("-I${ALICE_ROOT}/PWGPP/TRD");
    CoupleCar("AddTrainPerformanceTRD.C","\"ESD DET EFF RES PID\""); 
  }
  void CreateZDC()
  {
    // ZDC (Chiara Oppedisano)
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGPP/ZDC",
			     gROOT->GetMacroPath()));
    CreateTaskAndSetCollisionCandidates("AddTaskZDCQA.C");
  }
  void CreateCALO(EMode mode, Bool_t par)
  {
    // Calorimetry (Gustavo Conesa)
    LoadLibrary("EMCALUtils", mode, par, true);
    LoadLibrary("PHOSUtils", mode, par, true);
    LoadLibrary("PWG4PartCorrBase", mode, par, true);
    LoadLibrary("PWG4PartCorrDep", mode, par, true);
    
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWG4/macros/QA",
			     gROOT->GetMacroPath()));
    CreateTaskAndSetCollisionCandidates("AddTaskCalorimeterQA.C",
					"\"ESD\",20011,false,false)");
    Long_t ret = 
      gROOT->ProcessLine("AddTaskCalorimeterQA(\"ESD\",2011,false,false,\"\",\"EMC7\")");
    if (!ret) return;
    AliAnalysisTaskSE* task = reinterpret_cast<AliAnalysisTaskSE*>(ret);
    task->SelectCollisionCandidates(fTriggerEMC);
  }
  void CreateMUONTRG(EMode mode, Bool_t par)
  {
    // Muon Trigger
    LoadLibrary("PWG3base", mode, par, true);
    LoadLibrary("PWG3muon", mode, par, true);
    LoadLibrary("PWG3muondep", mode, par, true);
    
    CoupleCar("AddTaskMTRchamberEfficiency.C");
  }
  void CreateMUONEff()
  {
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWG3/muondep",
			     gROOT->GetMacroPath()));
    CoupleCar("AddTaskMUONTrackingEfficiency.C");
  }
  void CreateV0()
  {
    // V0-Decay Reconstruction (Ana Marin) (not used)
    CoupleCar("AddTaskV0QA.C","false");
  }
  void CreateBRes()
  {
    // Impact parameter resolution (xianbao.yuan@pd.infn.it,
    // andrea.dainese@pd.infn.it) 
    CreateTaskAndSetCollisionCandidates(Form("AddTaskImpParRes.C", 
					     fCollisionType == 0 ? 
					     "" : 
					     "false,-1,false,false"));
  }
  void CreateMUON(EMode mode, Bool_t par)
  {
    // MUON QA (Philippe Pillot)
    LoadLibrary("PWG3base", mode, par, true);
    LoadLibrary("PWG3muon", mode, par, true);
    LoadLibrary("PWG3muondep", mode, par, true);
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWG3/muon",
			     gROOT->GetMacroPath()));
    CoupleCar("AddTaskMuonQA.C");
  }
  void CreateTOF()
  {
    // TOF (Francesca Bellini)
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGPP/TOF",
			     gROOT->GetMacroPath()));
    CreateTaskAndSetCollisionCandidates("AddTaskTOFQA.C");
  }
  void CreatePIDRes()
  {
    // PIDResponse (Jens)
    CreateTaskAndSetCollisionCandidates("AddTaskPIDResponse.C");
  }

  void CreatePID()
  {
    // PIDqa (Jens)
    CreateTaskAndSetCollisionCandidates("AddTaskPIDqa.C");
  }
  void CreateHMPID()
  {
    // HMPID QA (Giacomo Volpe)
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGPP/HMPID",
			     gROOT->GetMacroPath()));
    CreateTaskAndSetCollisionCandidates("AddTaskHmpidQA.C");
  }
  void CreateT0()
  {
    // T0 QA (Alla Mayevskaya)
    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGPP/T0",
			     gROOT->GetMacroPath()));
    CreateTaskAndSetCollisionCandidates("AddTaskT0QA.C");
  }
  void CreateFMD(EMode mode, Bool_t par)
  {
    // FMD QA (Christian Holm Christiansen)
    LoadLibrary("PWGLFforward2", mode, par, true);
    Bool_t mc = AliAnalysisManager::GetAnalysisManager()
      ->GetMCtruthEventHandler() != 0;
    CoupleCar("AddTaskForwardQA.C", Form("(%d,%d)",mc,(fFlags & kCentrality)));
  }
  //__________________________________________________________________
  /** 
   * Create the tasks 
   * 
   * @param mode Processing mode
   * @param par  Whether to use par files 
   * @param mgr  Analysis manager 
   */
  void CreateTasks(EMode mode, Bool_t par, AliAnalysisManager* mgr)
  {
    // --- Output file name ------------------------------------------
    AliAnalysisManager::SetCommonFileName("QAResults.root");

    LoadLibrary("CORRFW", mode, par);
    LoadLibrary("TENDER", mode, par);
    LoadLibrary("PWG0base", mode, par);
    LoadLibrary("PWG0dep", mode, par);
    LoadLibrary("PWG0selectors", mode, par);
    LoadLibrary("PWGPP", mode, par);    

    gROOT->SetMacroPath(Form("%s:$(ALICE_ROOT)/PWGPP/PilotTrain"
			     ":$(ALICE_ROOT)/PWGPP/macros",
			     gROOT->GetMacroPath()));   
 
    mgr->AddStatisticsTask(fTriggerMask);
    if (fFlags   & kCDBConnect) CreateCDBConnect();
    if (fModules & kVertex)     CreateVertex();
    if (fModules & kSymmetric)  CreateSymmetric();
    if (fModules & kVZERO)      CreateVZERO();
    if (fModules & kTPC)        CreateTPC();
    if (fModules & kSPD)        CreateSPD();
    if (fModules & kSDD)        CreateSDD();
    if (fModules & kSSD)        CreateSSD();
    if (fModules & kITS)        CreateITS();
    if (fModules & kITSSA)      CreateITSSA();
    if (fModules & kITSAlign)   CreateITSAlign();
    if (fModules & kTRD)        CreateTRD(); 
    if (fModules & kZDC)        CreateZDC(); 
    if (fModules & kCALO)       CreateCALO(mode, par); 
    if (fModules & kMUONTRG)    CreateMUONTRG(mode, par); 
    if (fModules & kMUONEff)    CreateMUONEff(); 
    if (fModules & kV0)         CreateV0(); 
    if (fModules & kBRes)       CreateBRes(); 
    if (fModules & kMUON)       CreateMUON(mode, par); 
    if (fModules & kTOF)        CreateTOF(); 
    if (fModules & kPIDRes)     CreatePIDRes(); 
    if (fModules & kPID)        CreatePID(); 
    if (fModules & kHMPID)      CreateHMPID(); 
    if (fModules & kT0)         CreateT0(); 
    if (fModules & kFMD)        CreateFMD(mode, par); 
  }
  /** 
   * Crete output handler - we don't want one here. 
   * 
   * @return 0
   */
  AliVEventHandler* CreateOutputHandler(EType) { return 0; }
  UInt_t   fRun; // Run number 
  UShort_t fFlags; // Flags 
  UInt_t   fModules; // Modules to load 
  UInt_t   fTriggerMask; 
  UInt_t   fTriggerHM;
  UInt_t   fTriggerEMC;
  UInt_t   fTriggerMUONBarrel;
  UShort_t fCollisionType; // 0: pp, 1: PbPb 
  
  
  Bool_t fUseCent; // Whether to use centrality or not 
};

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