ROOT logo
void processContainer(TObject* object, TTreeSRedirector* debugStreamer, TString name);
void loadLibraries();
void simpleTrending(TString inputFileName, Int_t run, TString filterExpr=".*", TString trendingFileName="trending.root", TString treeName="trending", TString fileOpenMode="update" );

TString treeName;

void simpleTrending(TString inputFileName, Int_t run, TString filterExpr, TString trendingFileName, TString debugTreeName, TString fileOpenMode )
{

  // Dump the statistical information about all histograms in the file
  //    into a tree
  //
  //
  // 1. Default dump for all histograms
  //    Information to dump:
  //    stat =Entries, Mean, MeanError,  RMS, MaxBin
  //    Branch naming convention:
  //    <detName>_<hisName><statName>
  //
  // 2. Detector statistical information  - to be implemented by expert
  //                                      - First version implemented by MI
  //                                      - updated for QA by MK
  //  
  // 

  loadLibraries();

  treeName=debugTreeName;

  TFile *inputFile = TFile::Open(inputFileName.Data());
  if (!inputFile) return;
  
  TList * keyList = inputFile->GetListOfKeys();
  Int_t nkeys=keyList->GetEntries();
 
  TRegexp filterRegexp=filterExpr.Data();

  //check if we have a matching container, only then create the output file
  TList* keyList=inputFile->GetListOfKeys();
  Int_t nkeys=keyList->GetEntries();
  Bool_t containerExists=kFALSE;
  for (Int_t i=0; i<nkeys; i++)
  {
    TObject* object=keyList->At(i);
    if (!object) continue;
    TString name=object->GetName();
    if (name.Contains(filterRegexp))
    {
      containerExists=kTRUE;
      break;
    }
  }
  if (!containerExists) 
  {
    printf("container %s does not exist in %s\n",filterExpr.Data(),inputFileName.Data());
    return;
  }

  TTreeSRedirector *pcstream = new TTreeSRedirector(trendingFileName,fileOpenMode);
  (*pcstream)<<treeName.Data()<<"run="<<run;
  
  //main loop over the top level objects, filtering is done here
  for (Int_t i=0; i<nkeys; i++)
  {
    TObject * object = inputFile->Get(keyList->At(i)->GetName());
    if (!object) continue;
    TString name=object->GetName();
    if (!name.Contains(filterRegexp)) continue;
    processContainer(object,pcstream,name);
  }
  
  //
  // Expert dump example (MI first iteration):
  //
  // 0.)  TOF dump
  //

  Int_t tofEvents=0;
  Int_t tofTracks=0;
  TList * TOFCalib = (TList*)inputFile->Get("TOFHistos");      
  if (TOFCalib) {
    TH1 *histoEvents = (TH1*)TOFCalib->FindObject("hHistoVertexTimestamp");
    TH1 *histoTracks = (TH1*)TOFCalib->FindObject("hHistoDeltatTimestamp");
    if (histoEvents && histoTracks){
      tofEvents = TMath::Nint(histoEvents->GetEntries());
      tofTracks = TMath::Nint(histoTracks->GetEntries());
    }
    delete TOFCalib;
  }
  printf("Monalisa TOFevents\t%d\n",tofEvents);
  if (pcstream) (*pcstream)<<treeName.Data()<<"TOFevents="<<tofEvents;
  printf("Monalisa TOFtracks\t%d\n",tofTracks);
  if (pcstream) (*pcstream)<<treeName.Data()<<"TOFtracks="<<tofTracks;

  //
  // 1.)  TPC  dump - usefull events/tracks  for the calibration
  //
  Int_t tpcEvents=0;
  Int_t tpcTracks=0;
  TObject* obj = dynamic_cast<TObject*>(inputFile->Get("TPCCalib"));
  TObjArray* array = dynamic_cast<TObjArray*>(obj);
  TDirectory* dir = dynamic_cast<TDirectory*>(obj);
  AliTPCcalibTime  * calibTime = NULL;
  if (dir) {
    calibTime = dynamic_cast<AliTPCcalibTime*>(dir->Get("calibTime"));
  }
  else if (array){
    calibTime = (AliTPCcalibTime *)array->FindObject("calibTime");
  }
  if (calibTime) {
      tpcEvents = TMath::Nint(calibTime->GetTPCVertexHisto(0)->GetEntries());
      tpcTracks = TMath::Nint(calibTime->GetResHistoTPCITS(0)->GetEntries());
  }
  printf("Monalisa TPCevents\t%d\n",tpcEvents);
  if (pcstream) (*pcstream)<<treeName.Data()<<"TPCevents="<<tpcEvents;
  printf("Monalisa TPCtracks\t%d\n",tpcTracks);
  if (pcstream) (*pcstream)<<treeName.Data()<<"TPCtracks="<<tpcTracks;

  //
  // 2. TRD dump 
  //
  Int_t trdEvents=0;
  Int_t trdTracks=0;
  TList * TRDCalib = (TList*)inputFile->Get("TRDCalib");      
  if (TRDCalib) {
    TH1  *histoEvents = (TH1*)TRDCalib->FindObject("NEventsInput_AliTRDCalibTask");
    TH1  *histoTracks = (TH1*)TRDCalib->FindObject("AbsoluteGain_AliTRDCalibTask");
    if (histoEvents && histoTracks){
      trdEvents= TMath::Nint(histoEvents->GetEntries());
      trdTracks= TMath::Nint(histoTracks->GetEntries());
    }
    delete TRDCalib;
  }
  printf("Monalisa TRDevents\t%d\n",trdEvents);
  if (pcstream) (*pcstream)<<treeName.Data()<<"TRDevents="<<trdEvents;
  printf("Monalisa TRDtracks\t%d\n",trdTracks);
  if (pcstream) (*pcstream)<<treeName.Data()<<"TRDtracks="<<trdTracks;

  //
  // 3. T0 dump 
  //
  Int_t T0Events=0;
  TList * T0Calib = (TList*)inputFile->Get("T0Calib");      
  if (T0Calib) {
    TH1  *histoEvents = (TH1*) T0Calib->FindObject("fTzeroORAplusORC");
    if (histoEvents){
      T0Events= TMath::Nint(histoEvents->GetEntries());
    }
    delete T0Calib;
  }
  printf("Monalisa T0events\t%d\n",T0Events);
  if (pcstream) (*pcstream)<<treeName.Data()<<"T0events="<<T0Events;

  //
  // 4. Mean vertex -   dump 
  // Not present in CPass1
  /*
    Int_t meanVertexEvents=0;
  TList * meanVertexCalib = (TList*)inputFile->Get("MeanVertex");      
  if (meanVertexCalib) {
    TH1  *histoEvents = (TH1*) meanVertexCalib->FindObject("hTRKVertexX");
    if (histoEvents){
      meanVertexEvents = TMath::Nint(histoEvents->GetEntries());
    }
    delete meanVertexCalib;
  }
  printf("Monalisa MeanVertexevents\t%d\n",meanVertexEvents);
  if (pcstream) (*pcstream)<<treeName.Data()<<"MeanVertexevents="<<meanVertexEvents;
  */

  //
  // 5. SDD dump 
  //
  Int_t sddEvents=0;
  Int_t sddTracks=0;
  TList * SDDCalib = (TList*)inputFile->Get("clistSDDCalib");      
  if (SDDCalib) {
    TH1  *histoEvents = (TH1*) SDDCalib->FindObject("hNEvents");
    if (histoEvents ){
      sddEvents = TMath::Nint(histoEvents->GetBinContent(4));
      sddTracks = TMath::Nint(histoEvents->GetBinContent(5));
    }
    delete SDDCalib;
  }
  printf("Monalisa SDDevents\t%d\n",sddEvents);
  if (pcstream) (*pcstream)<<treeName.Data()<<"SDDevents="<<sddEvents;
  printf("Monalisa SDDtracks\t%d\n",sddTracks);
  if (pcstream) (*pcstream)<<treeName.Data()<<"SDDtracks="<<sddTracks;

  //
  if (pcstream) (*pcstream)<<treeName.Data()<<"\n";
  delete pcstream;
  delete inputFile;

}

void processContainer(TObject* inputObject, TTreeSRedirector* pcstream, TString parentname)
{
  //recursively process the contents of an object:
  //might be a TDirectory
  //or a TCollection
  //pus information about the contained histograms in the debugStreamer

  TDirectory* inputDir=NULL;
  TSeqCollection* inputCollection=NULL;
  TH1* inputHistogram=NULL;
  
  TString inputObjectName=inputObject->GetName();

  //TDirectory* inputDir=dynamic_cast<TDirectory*>(inputObject);
  //TSeqCollection* inputCollection=dynamic_cast<TSeqCollection*>(inputObject);
  //TH1* inputHistogram=dynamic_cast<TH1*>(inputObject);
  if (inputObject->InheritsFrom("TDirectory")) inputDir=dynamic_cast<TDirectory*>(inputObject);
  if (inputObject->InheritsFrom("TSeqCollection")) inputCollection=dynamic_cast<TSeqCollection*>(inputObject);
  if (inputObject->InheritsFrom("TH1")) inputHistogram=dynamic_cast<TH1*>(inputObject);

  if (inputCollection)
  {
    printf("processing collection: %s\n",inputCollection->GetName());
    Int_t nentries= inputCollection->GetEntries();
    for (Int_t i=0; i<nentries; i++)
    {
      TObject * object = inputCollection->At(i);
      if (!object) continue;
      TString name=parentname+"/"+object->GetName();
      processContainer(object,pcstream,name);
    }
  } 
  else if (inputDir)
  {
    printf("processing directory: %s\n",inputDir->GetName());
    TList* keyList=inputDir->GetListOfKeys();
    Int_t nkeys=keyList->GetEntries();
    for (Int_t i=0; i<nkeys; i++)
    {
      TObject * object = inputDir->Get(keyList->At(i)->GetName());
      if (!object) continue;
      TString name=parentname+"/"+object->GetName();
      processContainer(object,pcstream,name);
    }

  }
  else if (inputHistogram)
  {
    Double_t hisEntries;
    Double_t hisMean;
    Double_t hisMeanError;
    Double_t hisRMS;
    Double_t hisMaxBin;
    if (inputHistogram->InheritsFrom("TH1")==0) continue;
    TH1* phis = (TH1*)inputHistogram;
    hisEntries=phis->GetEntries();	
    Int_t idim=1;
    if (inputHistogram->InheritsFrom("TH2")) idim=2;
    if (inputHistogram->InheritsFrom("TH3")) idim=3;        
    hisMean=phis->GetMean(idim);	
    hisMeanError=phis->GetMeanError(idim);	
    hisRMS=phis->GetRMS(idim);	
    hisMaxBin=phis->GetBinCenter(phis->GetMaximumBin());
    TString name=parentname;
    printf("histogram: %s\n",name.Data());
    if (pcstream) (*pcstream)<<treeName.Data()<<
        Form("%s_Entries=",name.Data())<<hisEntries<<	
        Form("%s_Mean=",name.Data())<<hisMean<<	
        Form("%s_MeanError=",name.Data())<<hisMeanError<<	
        Form("%s_RMS=",name.Data())<<hisRMS<<	
        Form("%s_MaxBin=",name)<<hisMaxBin;	
  }

}

void loadLibraries()
{
  gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD -I$ALICE_ROOT/PWGPP -     I$ALICE_ROOT/PWGPP/TRD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libANALYSIScalib");
  gSystem->Load("libESDfilter");
  gSystem->Load("libCORRFW");
  gSystem->Load("libTENDER");
  gSystem->Load("libPWGPP.so");
  gSystem->Load("libAliHLTTrigger.so");
  gSystem->Load("libPWGTools");
  gSystem->Load("libEMCALUtils");
  gSystem->Load("libPHOSUtils");
  gSystem->Load("libPWGCaloTrackCorrBase");
  gSystem->Load("libPWGGACaloTrackCorrelations");
  gSystem->Load("libPWGGACaloTasks");
  gSystem->Load("libPWGGAPHOSTasks");
  gSystem->Load("libPWGTools");
  gSystem->Load("libPWGEMCAL");
  gSystem->Load("libPWGGAEMCALTasks");
  gSystem->Load("libPWGmuon");
  gSystem->Load("libPWGPPMUONlite");
  gSystem->Load("libPWGmuondep");
  gSystem->Load("libPWGLFforward2");
}

 simpleTrending.C:1
 simpleTrending.C:2
 simpleTrending.C:3
 simpleTrending.C:4
 simpleTrending.C:5
 simpleTrending.C:6
 simpleTrending.C:7
 simpleTrending.C:8
 simpleTrending.C:9
 simpleTrending.C:10
 simpleTrending.C:11
 simpleTrending.C:12
 simpleTrending.C:13
 simpleTrending.C:14
 simpleTrending.C:15
 simpleTrending.C:16
 simpleTrending.C:17
 simpleTrending.C:18
 simpleTrending.C:19
 simpleTrending.C:20
 simpleTrending.C:21
 simpleTrending.C:22
 simpleTrending.C:23
 simpleTrending.C:24
 simpleTrending.C:25
 simpleTrending.C:26
 simpleTrending.C:27
 simpleTrending.C:28
 simpleTrending.C:29
 simpleTrending.C:30
 simpleTrending.C:31
 simpleTrending.C:32
 simpleTrending.C:33
 simpleTrending.C:34
 simpleTrending.C:35
 simpleTrending.C:36
 simpleTrending.C:37
 simpleTrending.C:38
 simpleTrending.C:39
 simpleTrending.C:40
 simpleTrending.C:41
 simpleTrending.C:42
 simpleTrending.C:43
 simpleTrending.C:44
 simpleTrending.C:45
 simpleTrending.C:46
 simpleTrending.C:47
 simpleTrending.C:48
 simpleTrending.C:49
 simpleTrending.C:50
 simpleTrending.C:51
 simpleTrending.C:52
 simpleTrending.C:53
 simpleTrending.C:54
 simpleTrending.C:55
 simpleTrending.C:56
 simpleTrending.C:57
 simpleTrending.C:58
 simpleTrending.C:59
 simpleTrending.C:60
 simpleTrending.C:61
 simpleTrending.C:62
 simpleTrending.C:63
 simpleTrending.C:64
 simpleTrending.C:65
 simpleTrending.C:66
 simpleTrending.C:67
 simpleTrending.C:68
 simpleTrending.C:69
 simpleTrending.C:70
 simpleTrending.C:71
 simpleTrending.C:72
 simpleTrending.C:73
 simpleTrending.C:74
 simpleTrending.C:75
 simpleTrending.C:76
 simpleTrending.C:77
 simpleTrending.C:78
 simpleTrending.C:79
 simpleTrending.C:80
 simpleTrending.C:81
 simpleTrending.C:82
 simpleTrending.C:83
 simpleTrending.C:84
 simpleTrending.C:85
 simpleTrending.C:86
 simpleTrending.C:87
 simpleTrending.C:88
 simpleTrending.C:89
 simpleTrending.C:90
 simpleTrending.C:91
 simpleTrending.C:92
 simpleTrending.C:93
 simpleTrending.C:94
 simpleTrending.C:95
 simpleTrending.C:96
 simpleTrending.C:97
 simpleTrending.C:98
 simpleTrending.C:99
 simpleTrending.C:100
 simpleTrending.C:101
 simpleTrending.C:102
 simpleTrending.C:103
 simpleTrending.C:104
 simpleTrending.C:105
 simpleTrending.C:106
 simpleTrending.C:107
 simpleTrending.C:108
 simpleTrending.C:109
 simpleTrending.C:110
 simpleTrending.C:111
 simpleTrending.C:112
 simpleTrending.C:113
 simpleTrending.C:114
 simpleTrending.C:115
 simpleTrending.C:116
 simpleTrending.C:117
 simpleTrending.C:118
 simpleTrending.C:119
 simpleTrending.C:120
 simpleTrending.C:121
 simpleTrending.C:122
 simpleTrending.C:123
 simpleTrending.C:124
 simpleTrending.C:125
 simpleTrending.C:126
 simpleTrending.C:127
 simpleTrending.C:128
 simpleTrending.C:129
 simpleTrending.C:130
 simpleTrending.C:131
 simpleTrending.C:132
 simpleTrending.C:133
 simpleTrending.C:134
 simpleTrending.C:135
 simpleTrending.C:136
 simpleTrending.C:137
 simpleTrending.C:138
 simpleTrending.C:139
 simpleTrending.C:140
 simpleTrending.C:141
 simpleTrending.C:142
 simpleTrending.C:143
 simpleTrending.C:144
 simpleTrending.C:145
 simpleTrending.C:146
 simpleTrending.C:147
 simpleTrending.C:148
 simpleTrending.C:149
 simpleTrending.C:150
 simpleTrending.C:151
 simpleTrending.C:152
 simpleTrending.C:153
 simpleTrending.C:154
 simpleTrending.C:155
 simpleTrending.C:156
 simpleTrending.C:157
 simpleTrending.C:158
 simpleTrending.C:159
 simpleTrending.C:160
 simpleTrending.C:161
 simpleTrending.C:162
 simpleTrending.C:163
 simpleTrending.C:164
 simpleTrending.C:165
 simpleTrending.C:166
 simpleTrending.C:167
 simpleTrending.C:168
 simpleTrending.C:169
 simpleTrending.C:170
 simpleTrending.C:171
 simpleTrending.C:172
 simpleTrending.C:173
 simpleTrending.C:174
 simpleTrending.C:175
 simpleTrending.C:176
 simpleTrending.C:177
 simpleTrending.C:178
 simpleTrending.C:179
 simpleTrending.C:180
 simpleTrending.C:181
 simpleTrending.C:182
 simpleTrending.C:183
 simpleTrending.C:184
 simpleTrending.C:185
 simpleTrending.C:186
 simpleTrending.C:187
 simpleTrending.C:188
 simpleTrending.C:189
 simpleTrending.C:190
 simpleTrending.C:191
 simpleTrending.C:192
 simpleTrending.C:193
 simpleTrending.C:194
 simpleTrending.C:195
 simpleTrending.C:196
 simpleTrending.C:197
 simpleTrending.C:198
 simpleTrending.C:199
 simpleTrending.C:200
 simpleTrending.C:201
 simpleTrending.C:202
 simpleTrending.C:203
 simpleTrending.C:204
 simpleTrending.C:205
 simpleTrending.C:206
 simpleTrending.C:207
 simpleTrending.C:208
 simpleTrending.C:209
 simpleTrending.C:210
 simpleTrending.C:211
 simpleTrending.C:212
 simpleTrending.C:213
 simpleTrending.C:214
 simpleTrending.C:215
 simpleTrending.C:216
 simpleTrending.C:217
 simpleTrending.C:218
 simpleTrending.C:219
 simpleTrending.C:220
 simpleTrending.C:221
 simpleTrending.C:222
 simpleTrending.C:223
 simpleTrending.C:224
 simpleTrending.C:225
 simpleTrending.C:226
 simpleTrending.C:227
 simpleTrending.C:228
 simpleTrending.C:229
 simpleTrending.C:230
 simpleTrending.C:231
 simpleTrending.C:232
 simpleTrending.C:233
 simpleTrending.C:234
 simpleTrending.C:235
 simpleTrending.C:236
 simpleTrending.C:237
 simpleTrending.C:238
 simpleTrending.C:239
 simpleTrending.C:240
 simpleTrending.C:241
 simpleTrending.C:242
 simpleTrending.C:243
 simpleTrending.C:244
 simpleTrending.C:245
 simpleTrending.C:246
 simpleTrending.C:247
 simpleTrending.C:248
 simpleTrending.C:249
 simpleTrending.C:250
 simpleTrending.C:251
 simpleTrending.C:252
 simpleTrending.C:253
 simpleTrending.C:254
 simpleTrending.C:255
 simpleTrending.C:256
 simpleTrending.C:257
 simpleTrending.C:258
 simpleTrending.C:259
 simpleTrending.C:260
 simpleTrending.C:261
 simpleTrending.C:262
 simpleTrending.C:263
 simpleTrending.C:264
 simpleTrending.C:265
 simpleTrending.C:266
 simpleTrending.C:267
 simpleTrending.C:268
 simpleTrending.C:269
 simpleTrending.C:270
 simpleTrending.C:271
 simpleTrending.C:272
 simpleTrending.C:273
 simpleTrending.C:274
 simpleTrending.C:275
 simpleTrending.C:276
 simpleTrending.C:277
 simpleTrending.C:278
 simpleTrending.C:279
 simpleTrending.C:280
 simpleTrending.C:281
 simpleTrending.C:282
 simpleTrending.C:283
 simpleTrending.C:284
 simpleTrending.C:285
 simpleTrending.C:286
 simpleTrending.C:287
 simpleTrending.C:288
 simpleTrending.C:289
 simpleTrending.C:290
 simpleTrending.C:291
 simpleTrending.C:292
 simpleTrending.C:293
 simpleTrending.C:294
 simpleTrending.C:295
 simpleTrending.C:296
 simpleTrending.C:297
 simpleTrending.C:298
 simpleTrending.C:299