1 // $Id: AliHLTTRDCalibFitComponent.cxx 40282 2010-04-09 13:29:10Z richterm $
3 /**************************************************************************
4 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
7 * for The ALICE HLT Project. *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
18 // @file AliHLTTRDCalibFitComponent.cxx
19 // @author Theodor Rascanu
21 // @brief A TRDCalibration fitting component for the HLT.
33 #include "TProfile2D.h"
35 #include "AliHLTReadoutList.h"
37 #include "AliHLTTRDCalibFitComponent.h"
38 #include "AliHLTTRDDefinitions.h"
39 #include "AliHLTTRDUtils.h"
41 #include "AliRawReaderMemory.h"
43 #include "AliTRDCalPad.h"
44 #include "AliTRDCalDet.h"
46 #include "AliTRDCalibraFillHisto.h"
47 #include "AliTRDtrackV1.h"
49 #include "AliTRDCalibraFit.h"
50 #include "AliTRDCalibraMode.h"
51 #include "AliTRDCalibraVector.h"
52 #include "AliTRDCalibraVdriftLinearFit.h"
53 #include "AliTRDReconstructor.h"
54 #include "AliTRDrecoParam.h"
60 ClassImp(AliHLTTRDCalibFitComponent);
62 AliHLTTRDCalibFitComponent::AliHLTTRDCalibFitComponent()
63 : AliHLTCalibrationProcessor(),
69 // Default constructor
72 AliHLTTRDCalibFitComponent::~AliHLTTRDCalibFitComponent()
77 const char* AliHLTTRDCalibFitComponent::GetComponentID()
79 // Return the component ID const char *
80 return "TRDCalibFit"; // The ID of this component
83 void AliHLTTRDCalibFitComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
85 // Get the list of input data
86 list.clear(); // We do not have any requirements for our input data type(s).
87 list.push_back(AliHLTTRDDefinitions::fgkCalibrationDataType);
90 AliHLTComponentDataType AliHLTTRDCalibFitComponent::GetOutputDataType()
92 // Get the output data type
93 return kAliHLTMultipleDataType;
94 // return AliHLTTRDDefinitions::fgkCalibrationDataType;
98 int AliHLTTRDCalibFitComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
100 // Get the output data type
102 tgtList.push_back(AliHLTTRDDefinitions::fgkCalibrationDataType);
103 tgtList.push_back(AliHLTTRDDefinitions::fgkEORCalibrationDataType);
104 return tgtList.size();
107 void AliHLTTRDCalibFitComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
109 // Get the output data size
110 constBase = fOutputSize;
114 AliHLTComponent* AliHLTTRDCalibFitComponent::Spawn()
116 // Spawn function, return new instance of this class
117 return new AliHLTTRDCalibFitComponent;
120 Int_t AliHLTTRDCalibFitComponent::InitCalibration()
122 for(int i=0; i<18; i++)
125 fOutArray = new TObjArray(4);
126 fAfterRunArray=new TObjArray(5);
131 Int_t AliHLTTRDCalibFitComponent::DeinitCalibration()
134 // Deinitialization of the component
136 HLTDebug("DeinitCalibration");
137 //fOutArray->Delete();
139 delete fTempArray; fTempArray=0;
141 delete fOutArray; fOutArray=0;
142 fAfterRunArray->Delete();
143 delete fAfterRunArray; fAfterRunArray=0;
147 Int_t AliHLTTRDCalibFitComponent::ProcessCalibration(const AliHLTComponent_EventData& /*evtData*/,
148 const AliHLTComponent_BlockData* /*blocks*/,
149 AliHLTComponent_TriggerData& /*trigData*/,
150 AliHLTUInt8_t* /*outputPtr*/,
151 AliHLTUInt32_t& /*size*/,
152 vector<AliHLTComponent_BlockData>& /*outputBlocks*/)
156 if(!IsDataEvent())return 0;
160 for(const TObject* iter = GetFirstInputObject(AliHLTTRDDefinitions::fgkCalibrationDataType);
161 iter != NULL; iter = GetNextInputObject() ) {
163 if(!dynamic_cast<const TObjArray*>(iter))
166 AliHLTUInt32_t spec = GetSpecification(iter);
167 int SM = AliHLTTRDUtils::GetSM(spec);
169 HLTInfo("Got Data from SM %i", SM);
173 PushBack(fTempArray, AliHLTTRDDefinitions::fgkCalibrationDataType);
176 fOutArray = fTempArray;
178 for(int i=0; i<18; i++)
185 if(!fTempArray) fTempArray = (TObjArray*)iter->Clone();
187 TObjArray* inArr = (TObjArray*)iter;
188 for(int i = inArr->GetEntriesFast(); i--;){
189 const TH1* histo = dynamic_cast<const TH1*>(inArr->At(i));
191 if(fTempArray->At(i)){
192 ((TH1*)fTempArray->At(i))->Add(histo);
194 fTempArray->AddAt(histo->Clone(), i);
198 AliTRDCalibraVdriftLinearFit* obj = dynamic_cast<AliTRDCalibraVdriftLinearFit*>(inArr->At(i));
200 if(fTempArray->At(i)){
201 ((AliTRDCalibraVdriftLinearFit*)fTempArray->At(i))->Add(obj);
203 fTempArray->AddAt(new AliTRDCalibraVdriftLinearFit(*obj), i);
214 Int_t AliHLTTRDCalibFitComponent::ShipDataToFXS(const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/)
216 //fTRDCalibraFillHisto->DestroyDebugStreamer();
218 AliHLTReadoutList rdList(AliHLTReadoutList::kTRD);
222 fOutArray->Remove(fOutArray->FindObject("AliTRDCalibraVdriftLinearFit"));
223 //fOutArray->Remove(fOutArray->FindObject("PRF2d"));
224 //fOutArray->Remove(fOutArray->FindObject("PH2d"));
225 //fOutArray->Remove(fOutArray->FindObject("CH2d"));
227 if(!(fOutArray->FindObject("CH2d"))) {
228 TH2I * ch2d = new TH2I("CH2d","Nz0Nrphi0",100,0.0,300.0,540,0,540);
229 fOutArray->Add(ch2d);
232 if(!(fOutArray->FindObject("PH2d"))) {
233 TProfile2D * ph2d = new TProfile2D("PH2d","Nz0Nrphi0",30,-0.05,2.95,540,0,540);
234 fOutArray->Add(ph2d);
237 if(!(fOutArray->FindObject("PRF2d"))) {
238 TProfile2D * prf2d = new TProfile2D("PRF2d","Nz0Nrphi0Ngp3",60,-9.0,9.0,540,0,540);
239 fOutArray->Add(prf2d);
242 HLTDebug("Size of the fOutArray is %d\n",fOutArray->GetEntriesFast());
244 PushToFXS((TObject*)fOutArray, "TRD", "GAINDRIFTPRF", rdList.Buffer() );
245 //PushToFXS((TObject*)fOutArray->FindObject("CH2d"), "TRD", "GAINDRIFTPRF", rdList.Buffer() );
250 Int_t AliHLTTRDCalibFitComponent::EORCalibration()
252 //Also Fill histograms for the online display
253 TH2I *hCH2d=(TH2I*)fOutArray->FindObject("CH2d");
254 TProfile2D *hPH2d=(TProfile2D*)fOutArray->FindObject("PH2d");
255 TProfile2D *hPRF2d= (TProfile2D*)fOutArray->FindObject("PRF2d");
256 AliTRDCalibraVdriftLinearFit* hVdriftLinearFit = (AliTRDCalibraVdriftLinearFit*)fOutArray->FindObject("AliTRDCalibraVdriftLinearFit");
259 if(!hCH2d || !hPH2d || !hPRF2d || !hVdriftLinearFit) return 0;
262 AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
265 calibra->SetMinEntries(100);
266 calibra->AnalyseCH(hCH2d);
267 Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(0))
268 + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(0));
269 Int_t nbfit = calibra->GetNumberFit();
270 Int_t nbE = calibra->GetNumberEnt();
271 TH1F *coefgain = 0x0;
274 // (nbfit >= 0.2*nbE)) {
275 // create the cal objects
276 //calibra->PutMeanValueOtherVectorFit(1,kTRUE);
277 TObjArray object = calibra->GetVectorFit();
278 AliTRDCalDet *objgaindet = calibra->CreateDetObjectGain(&object,kFALSE);
279 coefgain = objgaindet->MakeHisto1DAsFunctionOfDet();
281 calibra->ResetVectorFit();
283 // vdrift second method
284 calibra->SetMinEntries(100); // If there is less than 100
285 hVdriftLinearFit->FillPEArray();
286 calibra->AnalyseLinearFitters(hVdriftLinearFit);
288 nbfit = calibra->GetNumberFit();
289 nbE = calibra->GetNumberEnt();
290 TH1F *coefdriftsecond = 0x0;
293 // (nbfit >= 0.1*nbE)) {
294 // create the cal objects
295 //calibra->PutMeanValueOtherVectorFit(1,kTRUE);
296 object = calibra->GetVectorFit();
297 AliTRDCalDet *objdriftvelocitydetsecond = calibra->CreateDetObjectVdrift(&object,kTRUE);
298 objdriftvelocitydetsecond->SetTitle("secondmethodvdrift");
299 coefdriftsecond = objdriftvelocitydetsecond->MakeHisto1DAsFunctionOfDet();
301 calibra->ResetVectorFit();
303 // vdrift first method
304 calibra->SetMinEntries(100*20); // If there is less than 20000
305 calibra->AnalysePH(hPH2d);
306 nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(1))
307 + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(1));
308 nbfit = calibra->GetNumberFit();
309 nbE = calibra->GetNumberEnt();
310 TH1F *coefdrift = 0x0;
314 // (nbfit >= 0.2*nbE)) {
315 // create the cal objects
316 //calibra->PutMeanValueOtherVectorFit(1,kTRUE);
317 //calibra->PutMeanValueOtherVectorFit2(1,kTRUE);
318 object = calibra->GetVectorFit();
319 AliTRDCalDet *objdriftvelocitydet = calibra->CreateDetObjectVdrift(&object,kTRUE);
320 coefdrift = objdriftvelocitydet->MakeHisto1DAsFunctionOfDet();
321 object = calibra->GetVectorFit2();
322 AliTRDCalDet *objtime0det = calibra->CreateDetObjectT0(&object,kTRUE);
323 coeft0 = objtime0det->MakeHisto1DAsFunctionOfDet();
325 calibra->ResetVectorFit();
329 calibra->SetMinEntries(200);
330 calibra->AnalysePRFMarianFit(hPRF2d);
331 nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(2))
332 + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(2));
333 nbfit = calibra->GetNumberFit();
334 nbE = calibra->GetNumberEnt();
338 // (nbfit >= 0.95*nbE)) {
339 // create cal pad objects
340 object = calibra->GetVectorFit();
341 TObject *objPRFpad = calibra->CreatePadObjectPRF(&object);
342 coefprf = ((AliTRDCalPad *) objPRFpad)->MakeHisto1D();
344 calibra->ResetVectorFit();
347 coefgain->SetName("coefgain");
348 coefprf->SetName("coefprf");
349 coefdrift->SetName("coefdrift");
350 coefdriftsecond->SetName("coefdriftsecond");
351 coeft0->SetName("coeft0");
352 if(coefgain) fAfterRunArray->Add(coefgain);
353 if(coefprf) fAfterRunArray->Add(coefprf);
354 if(coefdrift) fAfterRunArray->Add(coefdrift);
355 if(coefdriftsecond) fAfterRunArray->Add(coefdriftsecond);
356 if(coeft0) fAfterRunArray->Add(coeft0);
359 if(coefgain||coefprf||coefdrift||coeft0||coefdriftsecond) {
360 PushBack(fAfterRunArray, AliHLTTRDDefinitions::fgkEORCalibrationDataType);
363 // TString fileName="/tmp/CalibHistoDump_run";
364 // fileName+=AliCDBManager::Instance()->GetRun();
365 // fileName+=".root";
366 // HLTInfo("Dumping Histogram file to %s",fileName.Data());
367 // TFile* file = TFile::Open(fileName, "RECREATE");
368 // fAfterRunArray->Write();
369 // fOutArray->Write();
371 // HLTInfo("Histogram file dumped");