ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/


////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//  Preprocessor class for HLT and DAQ                                        //
//  Possible usage: preprocess TPC calibration data                           //
//  to form needed for online viewing/visualizing TPC calibration data        //
//                                                                            //
//  On HLT or DAQ AliTPCPreprocessorOnline::AddComponent(...) is called,      //
//  whereas ... is either an AliTPCCalPad, or an AliTPCCalROC.                //
//  Their names have to be acording the naming convention for AliTPCCalPads   //
//  Special for CalROCs: Add '_ROC<ROC_Number>' to the name.                  //
//                                                                            //
//  Internal the AliTPCCalPads are stored in a TMap, they are retrieved by    //
//  their name.                                                               //
//                                                                            //
//  Once enough values are accumulated, call ::DumpToFile(fileName).          //
//  A TObjArray is created out of the TMap, which is passed to                //
//  AliTPCCalibViewer::MakeTree(...) and the calibratioTree is written        //
//  is written to "filenName". 
//                               
//  The data flow is as follows: 
/* 
Begin_Html 
   <img src="../../TPC/doc/dataFlowCalibViewer.png"> 
End_Html
*/
//                                                                            //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

//     
// ROOT includes 
//
#include <TObject.h>
#include <iostream>
#include <TString.h>
#include "TMap.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TIterator.h"


//
// AliRoot includes
//
#include "AliTPCCalPad.h"
#include "AliTPCCalROC.h"
#include "AliTPCCalibViewer.h"
#include "AliTPCPreprocessorOnline.h"
#include <fstream>



ClassImp(AliTPCPreprocessorOnline)

AliTPCPreprocessorOnline::AliTPCPreprocessorOnline():TObject(), fMap(0)
{
  //
  // Default constructor
  //
  fMap = new TMap();

}

//_____________________________________________________________________________
AliTPCPreprocessorOnline::AliTPCPreprocessorOnline(const AliTPCPreprocessorOnline &c):TObject(c), fMap(0)
{
  //
  // dummy AliTPCPreprocessorOnline copy constructor
  // not yet working!!!
  //
  fMap = c.fMap;
  printf("AliTPCPreprocessorOnline's copy constructor called, NOT WORKING!!!\n");
}

//_____________________________________________________________________________
AliTPCPreprocessorOnline::AliTPCPreprocessorOnline(TMap *map):TObject(), fMap(0)
{
  //
  // Constructor to "copy" the AliTPCPreprocessorOnline
  //
  fMap = map;
}


//____________________________________________________________________________
AliTPCPreprocessorOnline & AliTPCPreprocessorOnline::operator =(const AliTPCPreprocessorOnline & param){
   //
   // assignment operator - dummy
   // not yet working!!!
   //
  if (this == &param) return (*this);

   fMap = param.fMap;
   std::cout << "AliTPCPreprocessorOnline's assignment operator called, NOT WORKING!!!" << std::endl;
   return (*this);
}


//_____________________________________________________________________________
AliTPCPreprocessorOnline::~AliTPCPreprocessorOnline()
{
   //
   // AliTPCPreprocessorOnline destructor
   //
   printf("AliTPCPreprocessorOnline's destructor called. \n");
   fMap->DeleteValues();
   delete fMap;
}



void AliTPCPreprocessorOnline::AddComponent(TObject *obj) {
   //
   // Add components form HLT or DAQ here 
   // The components are either AliTPCCalPads or AliTPCCalROCs
   // other to be defined
   // 
   // As from HLT they will come ROC wise, they have to be set together to one AliTPCCalPad here
   // Then they are added to the Calibration Tree
   // This calibration tree will be written by AliTPCCalibViewer::MakeTree, once you call ::DumpToFile(fileName)
   // 
   // To distinguish, what kind of component is added, there is a Naming-Convention:
   // The normal, already definded naming-Convention for AliTPCCalPads <PadName>
   // <padName>_ROC<ROC_Number>  for example: "CEQmean_ROC34"
   // 
   // 
   // Get name of obj
   // Check, if it ends with "_ROC<Int_t>" / check, if it contains "ROC"
   // If it contains "ROC", find out, to which calibration CalPad it belongs -> Parse first part of the name
   // Get the corsponding AliTPCCalPad / Make a new AliTPCCalPad 
   // Set "_ROC<Int_t>" to zero /? delete it -> Set the new values, out of obj
   // 

   
   // printf(" ****** AliTPCPreprocessorOnline::AddComponent ****** \n");
  if (!obj) return;
   TString objName = obj->GetName();
   
   // Add a whole AliTPCCalPad to the list
   if (TString(obj->ClassName()) == "AliTPCCalPad") {
      // printf("AliTPCCalPad found\n");
      AliTPCCalPad *calPad = (AliTPCCalPad*)obj;
      TObject *listObj = fMap->GetValue(calPad->GetName());
      if (listObj == 0) {
         // current data not yet written to the list, write it to the list
         fMap->Add(new TObjString(calPad->GetName()), calPad);
         return;
      }
      // current data already present
      if (TString(listObj->ClassName()) != "AliTPCCalPad") 
         Error("AddComponent", "Mismatch in internal list: '%s' is no AliTPCCalPad. \n", listObj->ClassName());
      AliTPCCalPad *listCalPad = (AliTPCCalPad*)listObj;
      listCalPad->Add(listCalPad, -1); // reset the current CalPad
      listCalPad->Add(calPad);
      return;
   }
   
   if (TString(obj->ClassName()) == "AliTPCCalROC") {
      // printf("AliTPCCalROC found\n");
      if (! objName.Contains("_ROC"))
         Warning("AddComponent", "Uncomplete object name: '%s' is missing _ROC<ROC_number>\n", objName.Data());
      TObjArray *stokens = objName.Tokenize("_ROC");
      TString rocNumber(""); 
      if (stokens->GetEntriesFast()>1) rocNumber = ((TObjString*)stokens->At(1))->GetString();
      delete stokens;
      Int_t iroc = -1;
      if (rocNumber.IsAlnum()) iroc = rocNumber.Atoi();
      
      // Extract CalPad Name:
      TString removeString("_ROC");
      removeString += rocNumber;
      objName.ReplaceAll(removeString, "");  // Remove "_ROC<number>" from the end
      
      // objName is cleaned and can now be used to extract the coresponding CalPad from the list
      TObject *listObj = fMap->GetValue(objName.Data());
      AliTPCCalROC *calROC = (AliTPCCalROC*)obj;
      if (iroc == -1) iroc = calROC->GetSector();
      if (iroc != (Int_t)calROC->GetSector()) 
         Warning("AddComponent","Mismatch in  ROC_number: ROC has number %i, in its name %i was specified. Treating now as %i. \n", calROC->GetSector(), iroc, iroc);
      calROC->SetNameTitle(objName.Data(), objName.Data());
      if (listObj == 0) {
         // current data not yet written to the list, write it to the list
         AliTPCCalPad *calPad = new AliTPCCalPad(objName.Data(), objName.Data());
         calPad->SetCalROC(calROC, iroc);
         fMap->Add(new TObjString(objName.Data()), calPad);
         return;
      }
      // current data already present
      if (TString(listObj->ClassName()) != "AliTPCCalPad") 
         Error("AddComponent", "Mismatch in internal list: '%s' is no AliTPCCalPad \n", listObj->ClassName());
      AliTPCCalPad *listCalPad = (AliTPCCalPad*)listObj;
      listCalPad->SetCalROC(calROC, iroc);
      return;
     
      
   }
   
   Warning("AddComponent", "Unknown calibration object '%s', skipped.\n", obj->ClassName());
   
   return;
   
   
}



void AliTPCPreprocessorOnline::DumpToFile(const char* fileName){
   // 
   // Function to dump the tree to file
   // A TObjArray is created out of the TMap, which is passed to   
   // AliTPCCalibViewer::MakeTree(...)  
   // 
   
   printf("AliTPCPreprocessorOnline::DumpToFile\n");
   TObjArray *listOfCalPads = new TObjArray();
   TIterator *iterator = fMap->MakeIterator();
   AliTPCCalPad *calPad = 0x0;
//    while ((calibTracks = (AliTPCcalibTracks*)listIterator->Next()) ){
   TObject * obj=0;
   //   while (( calPad = (AliTPCCalPad*)fMap->GetValue(iterator->Next()) )) {
   while ( ( obj = iterator->Next()) ) {
     calPad = (AliTPCCalPad*)fMap->GetValue(obj);
      if (!calPad) continue;
      calPad = (AliTPCCalPad*)calPad;
      printf("adding the following element to the TObjList: %s \n", calPad->GetName());
      printf("It's type:: %s \n", calPad->ClassName());
      calPad->Print();
      listOfCalPads->Add(calPad);
   }
   printf("writing the tree... \n");
   //   AliTPCCalibViewer::MakeTree(fileName, listOfCalPads, "$ALICE_ROOT/TPC/Calib/MapCalibrationObjects.root");
   AliTPCCalibViewer::MakeTree(fileName, listOfCalPads, 0);
 
}

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