store StreamerInfo object with validity infinity, and only if new streamer infos...
[u/mrichter/AliRoot.git] / HLT / global / AliHLTGlobalPreprocessor.cxx
1 // $Id$
2
3 //**************************************************************************
4 //* This file is property of and copyright by the                          * 
5 //* ALICE Experiment at CERN, All rights reserved.                         *
6 //*                                                                        *
7 //* Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no         *
8 //*                  for The ALICE HLT Project.                            *
9 //*                                                                        *
10 //* Permission to use, copy, modify and distribute this software and its   *
11 //* documentation strictly for non-commercial purposes is hereby granted   *
12 //* without fee, provided that the above copyright notice appears in all   *
13 //* copies and that both the copyright notice and this permission notice   *
14 //* appear in the supporting documentation. The authors make no claims     *
15 //* about the suitability of this software for any purpose. It is          *
16 //* provided "as is" without express or implied warranty.                  *
17 //**************************************************************************
18
19 //  @file   AliHLTGlobalPreprocessor.cxx
20 //  @author Matthias Richter
21 //  @date   2010-08-20
22 //  @brief  HLT Preprocessor plugin for global HLT
23 // 
24
25 #include "AliHLTGlobalPreprocessor.h"
26 #include "AliHLTMisc.h"
27 #include "AliCDBManager.h"
28 #include "AliCDBEntry.h"
29 #include "AliGRPObject.h"
30 #include "AliCDBMetaData.h"
31 #include "AliCDBId.h"
32 #include "AliLog.h"
33 #include <cassert>
34 #include <cerrno>
35
36 #include <TObjArray.h>
37 #include <TStreamerInfo.h>
38 //#include <AliDCSValue.h>
39 //#include <TTimeStamp.h>
40
41
42 ClassImp(AliHLTGlobalPreprocessor)
43
44 AliHLTGlobalPreprocessor::AliHLTGlobalPreprocessor()
45   : AliHLTModulePreprocessor()
46 {
47   // constructor
48   // HLT preprocessor for global HLT objects
49   //
50   // Produced OCDB objects:
51   // - HLT/Calib/Streamerinfo
52   //   The streamer info object is produced by the ROOTSchemaEvolutionComponent
53   //   See ProcessStreamerInfo() for details.
54 }
55
56 const char* AliHLTGlobalPreprocessor::fgkStreamerInfoAlias="StreamerInfo";
57 const char* AliHLTGlobalPreprocessor::fgkStreamerInfoName="StreamerInfo";
58 const char* AliHLTGlobalPreprocessor::fgkStreamerInfoType="Calib";
59
60 AliHLTGlobalPreprocessor::~AliHLTGlobalPreprocessor()
61 {
62   // destructor
63 }
64
65
66 void AliHLTGlobalPreprocessor::Initialize(Int_t /*run*/, UInt_t /*startTime*/, 
67                                           UInt_t /*endTime*/)
68 {
69   // initializes AliHLTGlobalPreprocessor
70
71 }
72
73
74 UInt_t AliHLTGlobalPreprocessor::Process(TMap* dcsAliasMap)
75 {
76   // processes the DCS value map
77   
78   if (!dcsAliasMap) return -EINVAL;
79   if (dcsAliasMap->GetEntries() == 0 ) return 0;
80   
81   TObject* streamerinfo=GetFromMap(dcsAliasMap, fgkStreamerInfoAlias);
82   if (streamerinfo) ProcessStreamerInfo(streamerinfo);
83
84   return 0;
85 }
86
87 Int_t AliHLTGlobalPreprocessor::GetModuleNumber()
88 {
89   // get module number of this preprocessor, corresponds to the position
90   // in the detector bit field, or 0 if no corresponding detector existing
91   Int_t modulenumber = 0;
92   //modulenumber = AliHLTModulePreprocessor::DetectorBitMask("GRP");
93   return modulenumber;
94 }
95
96 int AliHLTGlobalPreprocessor::ProcessStreamerInfo(TObject* object)
97 {
98   /// process the StreamerInfo object
99   int iResult=0;
100   if (!object) return -EINVAL;
101
102   TObjArray* streamerinfos=dynamic_cast<TObjArray*>(object);
103   if (!streamerinfos) {
104     AliError(Form("StreamerInfo object has wrong class type %s, expecting TObjArray", object->ClassName()));
105     return -EINVAL;
106   }
107   if (streamerinfos->GetEntriesFast()==0) return 0;
108
109   bool bStore=false;
110   AliCDBEntry* entry = GetFromOCDB(fgkStreamerInfoType, fgkStreamerInfoName);
111   TObjArray* clone=NULL;
112   if (entry && entry->GetObject()) {
113     TObject* cloneObj=entry->GetObject()->Clone();
114     if (cloneObj) clone=dynamic_cast<TObjArray*>(cloneObj);
115     bStore=AliHLTMisc::Instance().MergeStreamerInfo(clone, streamerinfos, 1)>0;
116   } else {
117     TObject* cloneObj=streamerinfos->Clone();
118     if (cloneObj) clone=dynamic_cast<TObjArray*>(cloneObj);
119     bStore=true;
120   }
121
122   if (clone) {
123     AliCDBMetaData* metaData=entry?entry->GetMetaData():NULL;
124     AliCDBMetaData* newMetaData=NULL;
125     if (!metaData) {
126       newMetaData=new AliCDBMetaData;
127       if (newMetaData) {
128         metaData=newMetaData;
129         metaData->SetBeamPeriod(0);
130         metaData->SetResponsible("ALICE HLT Matthias.Richter@cern.ch");
131         metaData->SetComment("Streamer info for HLTOUT payload");
132         //metaData->SetAliRootVersion(ALIROOT_SVN_BRANCH);
133       } else {
134         iResult=-ENOMEM;
135       }
136     }
137     if (bStore) {
138       // store new object with validity infinity (last parameter kTRUE)
139       Store(fgkStreamerInfoType, fgkStreamerInfoName, clone, metaData, GetRun(), kTRUE);
140     } else if (entry) {
141       AliInfo(Form("skipping object which is already up-to-date"));
142       entry->PrintId();
143     }
144     delete clone;
145     if (newMetaData) delete newMetaData;
146     newMetaData=NULL;
147     metaData=NULL;
148     // TODO
149     // - what to do with variable 'entry', to be deleted?
150
151   } else {
152     AliError("failed to clone streamer info object array");
153     return -ENOMEM;
154   }
155
156   return iResult;
157 }