ROOT logo
#include <iostream>
#include <fstream>

#include <TAlienCollection.h>
#include <TFile.h>
#include <TGrid.h>
#include <TGridResult.h>
#include <TMath.h>
#include <TROOT.h>
#include <TString.h>
#include <TSystem.h>

#include "AliCDBManager.h"
#include "AliDAQ.h"
#include "AliLog.h"
#include "AliQA.h"
#include "AliQADataMakerSteer.h"
#include "AliRawReader.h"
#include "AliRawReaderRoot.h"
#include "AliTRDrawStreamBase.h"
#include "AliGeomManager.h"

TString ClassName() { return "rawqa" ; } 

//________________________________qa______________________________________
void rawqa(const Int_t runNumber, Int_t maxFiles = 10, const char* year = "08") 
{	
//	char * kDefaultOCDBStorage = Form("alien://folder=/alice/data/20%s/LHC%sd/OCDB/", year, year) ; 
	char * kDefaultOCDBStorage = Form("local://$ALICE_ROOT/OCDB") ; 
	//AliQA::SetQARefStorage(Form("%s%s/", AliQA::GetQARefDefaultStorage(), year)) ;  
	AliQA::SetQARefStorage("local://$ALICE_ROOT/QAref") ;
	
	UInt_t maxEvents = 99999 ;
	if ( maxFiles < 0 ) {
		maxEvents = TMath::Abs(maxFiles) ; 
		maxFiles = 99 ; 
	}
	AliLog::SetGlobalDebugLevel(0) ; 
	// connect to the grid 
	TGrid * grid = 0x0 ; 
//       	grid = TGrid::Connect("alien://") ; 
		
	Bool_t detIn[AliDAQ::kNDetectors] = {kFALSE} ;
	TString detNameOff[AliDAQ::kNDetectors] = {"ITS", "ITS", "ITS", "TPC", "TRD", "TOF", "HMPID", "PHOS", "PHOS", "PMD", "MUON", "MUON", "FMD", "T0", "VZERO", "ZDC", "ACORDE", "TRG", "EMCAL", "DAQ_TEST", "HLT"} ; 
	// make the file name pattern year and run number
	TString pattern;
	pattern.Form("%9d",runNumber);
	pattern.ReplaceAll(" ", "0") ; 
	pattern.Prepend(year);
	pattern.Append("*.root");
	// find the files associated to this run
	TGridResult * result = 0x0 ; 
	Bool_t local = kFALSE ; 
	if (grid) { // get the list of files from AliEn directly 
		TString collectionFile(pattern) ; 
		collectionFile.ReplaceAll("*.root", ".xml") ; 
		if ( gSystem->AccessPathName(collectionFile) == 0 ) { // get the list of files from an a-priori created collection file
			TAlienCollection collection(collectionFile.Data(), maxFiles) ; 
			result = collection.GetGridResult("", 0, 0); 
		} else { 
			TString baseDir; 
			baseDir.Form("/alice/data/20%s/",year);
			result = grid->Query(baseDir, pattern) ;  
		}
	} else {
	   // get the list of files from the local current directory 
	    local = kTRUE ; 
	    char line[100] ; 
	    sprintf(line, ".! ls %s*.root > tempo.txt", pattern.Data()) ; 
	    gROOT->ProcessLine(line) ;
	}
	
	AliLog::Flush();
	ifstream in ; 
	if (local) 
		in.open("tempo.txt", ifstream::in) ; 

	TString detectors  = ""; 
	TString detectorsW = ""; 
	UShort_t file = 0 ; 
	UShort_t filesProcessed = 0 ; 
	UShort_t eventsProcessed = 0 ; 
	AliCDBManager* man = AliCDBManager::Instance();
	man->SetDefaultStorage(kDefaultOCDBStorage) ;  
	man->SetRun(runNumber) ; 
	AliQAManager qam("rec") ; 
  qam->SetDefaultStorage(AliQA::GetQARefStorage()) ; 
  qam->SetRun(runNumber) ; 
    
	AliGeomManager::LoadGeometry();
	for ( file = 0 ; file < maxFiles ; file++) {
		if ( qas.GetCurrentEvent() >= maxEvents) 
			break ;

		TString fileName ; 
		if ( local) {
			in >> fileName ;
		} 
		else 
			fileName = result->GetKey(file, "turl");
	       	if ( fileName == "" )  
		        break ;
		if ( fileName.Contains("tag") )
			continue; 
                filesProcessed++ ;
		char input[200] ; 
		if (local) 
			sprintf(input, "%s", fileName.Data()) ; 
		else 
			sprintf(input, "%s", result->GetKey(file, "turl")); 
		AliInfo(Form("Proccessing file # %d --> %s", file, input)) ;
		AliLog::Flush();
		// check which detectors are present 
		AliRawReader * rawReader = new AliRawReaderRoot(input);
		AliTRDrawStreamBase::SetRawStreamVersion("TB");
		while ( rawReader->NextEvent() ) {
			man->SetRun(rawReader->GetRunNumber());
			qam->SetRun(rawReader->GetRunNumber());
			AliLog::Flush();
			UChar_t * data ; 
			while (rawReader->ReadNextData(data)) {
				Int_t detID = rawReader->GetDetectorID();
				if (detID < 0 || detID >= AliDAQ::kNDetectors) {
					AliError("Wrong detector ID! Skipping payload...");
					continue;
				}
				detIn[detID] = kTRUE ; 
			}
			for (Int_t detID = 0; detID < AliDAQ::kNDetectors ; detID++) {
				if (detIn[detID]) {
					if ( ! detectors.Contains(detNameOff[detID]) ) {
						detectors.Append(detNameOff[detID]) ;
						detectors.Append(" ") ;
					}
				}
			}
			if ( !detectors.IsNull() )
				break ; 
		}
		if ( !detectors.IsNull() ) {
			qam.SetMaxEvents(maxEvents) ; 	
			detectorsW = qam.Run(detectors, rawReader) ;
			qam.Reset() ;
		} else {
			AliError("No valid detectors found") ; 
		} 
		delete rawReader ;
		eventsProcessed += qas.GetCurrentEvent() ; 
	}
	AliLog::Flush();
	qam.Merge(runNumber) ; 
	
	AliLog::Flush();
	// The summary 
	AliInfo(Form("\n\n********** Summary for run %d **********", runNumber)) ; 
	printf("     detectors present in the run        : %s\n", detectors.Data()) ; 
	printf("     detectors present in the run with QA: %s\n", detectorsW.Data()) ; 
	printf("     number of files/events processed    : %d/%d\n", filesProcessed, eventsProcessed) ; 
	TFile * qaResult = TFile::Open(AliQA::GetQAResultFileName()) ; 
	if ( qaResult ) {
		AliQA * qa = dynamic_cast<AliQA *>(qaResult->Get(AliQA::GetQAName())) ; 
		if ( qa) {
			for (Int_t index = 0 ; index < AliQA::kNDET ; index++)
				if (detectorsW.Contains(AliQA::GetDetName(AliQA::DETECTORINDEX_t(index)))) 
					qa->ShowStatus(AliQA::DETECTORINDEX_t(index)) ;
		} else {
			AliError(Form("%s not found in %s !", AliQA::GetQAName(), AliQA::GetQAResultFileName())) ; 
		}
	} else {
		AliError(Form("%s has not been produced !", AliQA::GetQAResultFileName())) ; 
	}
}
 rawqa.C:1
 rawqa.C:2
 rawqa.C:3
 rawqa.C:4
 rawqa.C:5
 rawqa.C:6
 rawqa.C:7
 rawqa.C:8
 rawqa.C:9
 rawqa.C:10
 rawqa.C:11
 rawqa.C:12
 rawqa.C:13
 rawqa.C:14
 rawqa.C:15
 rawqa.C:16
 rawqa.C:17
 rawqa.C:18
 rawqa.C:19
 rawqa.C:20
 rawqa.C:21
 rawqa.C:22
 rawqa.C:23
 rawqa.C:24
 rawqa.C:25
 rawqa.C:26
 rawqa.C:27
 rawqa.C:28
 rawqa.C:29
 rawqa.C:30
 rawqa.C:31
 rawqa.C:32
 rawqa.C:33
 rawqa.C:34
 rawqa.C:35
 rawqa.C:36
 rawqa.C:37
 rawqa.C:38
 rawqa.C:39
 rawqa.C:40
 rawqa.C:41
 rawqa.C:42
 rawqa.C:43
 rawqa.C:44
 rawqa.C:45
 rawqa.C:46
 rawqa.C:47
 rawqa.C:48
 rawqa.C:49
 rawqa.C:50
 rawqa.C:51
 rawqa.C:52
 rawqa.C:53
 rawqa.C:54
 rawqa.C:55
 rawqa.C:56
 rawqa.C:57
 rawqa.C:58
 rawqa.C:59
 rawqa.C:60
 rawqa.C:61
 rawqa.C:62
 rawqa.C:63
 rawqa.C:64
 rawqa.C:65
 rawqa.C:66
 rawqa.C:67
 rawqa.C:68
 rawqa.C:69
 rawqa.C:70
 rawqa.C:71
 rawqa.C:72
 rawqa.C:73
 rawqa.C:74
 rawqa.C:75
 rawqa.C:76
 rawqa.C:77
 rawqa.C:78
 rawqa.C:79
 rawqa.C:80
 rawqa.C:81
 rawqa.C:82
 rawqa.C:83
 rawqa.C:84
 rawqa.C:85
 rawqa.C:86
 rawqa.C:87
 rawqa.C:88
 rawqa.C:89
 rawqa.C:90
 rawqa.C:91
 rawqa.C:92
 rawqa.C:93
 rawqa.C:94
 rawqa.C:95
 rawqa.C:96
 rawqa.C:97
 rawqa.C:98
 rawqa.C:99
 rawqa.C:100
 rawqa.C:101
 rawqa.C:102
 rawqa.C:103
 rawqa.C:104
 rawqa.C:105
 rawqa.C:106
 rawqa.C:107
 rawqa.C:108
 rawqa.C:109
 rawqa.C:110
 rawqa.C:111
 rawqa.C:112
 rawqa.C:113
 rawqa.C:114
 rawqa.C:115
 rawqa.C:116
 rawqa.C:117
 rawqa.C:118
 rawqa.C:119
 rawqa.C:120
 rawqa.C:121
 rawqa.C:122
 rawqa.C:123
 rawqa.C:124
 rawqa.C:125
 rawqa.C:126
 rawqa.C:127
 rawqa.C:128
 rawqa.C:129
 rawqa.C:130
 rawqa.C:131
 rawqa.C:132
 rawqa.C:133
 rawqa.C:134
 rawqa.C:135
 rawqa.C:136
 rawqa.C:137
 rawqa.C:138
 rawqa.C:139
 rawqa.C:140
 rawqa.C:141
 rawqa.C:142
 rawqa.C:143
 rawqa.C:144
 rawqa.C:145
 rawqa.C:146
 rawqa.C:147
 rawqa.C:148
 rawqa.C:149
 rawqa.C:150
 rawqa.C:151
 rawqa.C:152
 rawqa.C:153
 rawqa.C:154
 rawqa.C:155
 rawqa.C:156
 rawqa.C:157
 rawqa.C:158
 rawqa.C:159
 rawqa.C:160
 rawqa.C:161
 rawqa.C:162
 rawqa.C:163
 rawqa.C:164
 rawqa.C:165
 rawqa.C:166
 rawqa.C:167
 rawqa.C:168
 rawqa.C:169
 rawqa.C:170
 rawqa.C:171
 rawqa.C:172
 rawqa.C:173