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 AliHLTTRDCalibrationComponent.cxx
21 // @brief A TRDCalibration processing component for the HLT.
29 #include "TProfile2D.h"
31 #include "AliHLTReadoutList.h"
33 #include "AliHLTTRDCalibrationComponent.h"
34 #include "AliHLTTRDDefinitions.h"
35 #include "AliHLTTRDUtils.h"
37 #include "AliCDBManager.h"
38 #include "AliCDBStorage.h"
39 #include "AliRawReaderMemory.h"
41 #include "AliTRDCalPad.h"
42 #include "AliTRDCalDet.h"
44 #include "AliTRDCalibraFillHisto.h"
45 #include "AliTRDtrackV1.h"
47 #include "AliTRDCalibraFit.h"
48 #include "AliTRDCalibraMode.h"
49 #include "AliTRDCalibraVector.h"
50 #include "AliTRDCalibraVdriftLinearFit.h"
51 #include "AliTRDReconstructor.h"
52 #include "AliTRDrecoParam.h"
60 ClassImp(AliHLTTRDCalibrationComponent);
62 AliHLTTRDCalibrationComponent::AliHLTTRDCalibrationComponent()
63 : AliHLTCalibrationProcessor(),
64 fTRDCalibraFillHisto(NULL),
70 fSavedTimeBins(kFALSE),
75 fTakeAllEvents(kFALSE)
77 // Default constructor
80 AliHLTTRDCalibrationComponent::~AliHLTTRDCalibrationComponent()
85 const char* AliHLTTRDCalibrationComponent::GetComponentID()
87 // Return the component ID const char *
88 return "TRDCalibration"; // The ID of this component
91 void AliHLTTRDCalibrationComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
93 // Get the list of input data
94 list.clear(); // We do not have any requirements for our input data type(s).
95 list.push_back(AliHLTTRDDefinitions::fgkTracksDataType);
98 AliHLTComponentDataType AliHLTTRDCalibrationComponent::GetOutputDataType()
100 // Get the output data type
101 return kAliHLTMultipleDataType;
102 // return AliHLTTRDDefinitions::fgkCalibrationDataType;
106 int AliHLTTRDCalibrationComponent::GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList)
108 // Get the output data type
110 tgtList.push_back(AliHLTTRDDefinitions::fgkCalibrationDataType);
111 tgtList.push_back(AliHLTTRDDefinitions::fgkEORCalibrationDataType);
112 return tgtList.size();
115 void AliHLTTRDCalibrationComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
117 // Get the output data size
118 constBase = fOutputSize;
122 AliHLTComponent* AliHLTTRDCalibrationComponent::Spawn()
124 // Spawn function, return new instance of this class
125 return new AliHLTTRDCalibrationComponent;
128 Int_t AliHLTTRDCalibrationComponent::ScanArgument( int argc, const char** argv )
130 // perform initialization. We check whether our relative output size is specified in the arguments.
134 fTrgStrings = new TObjArray();
138 HLTDebug("argv[%d] == %s", i, argv[i] );
139 if ( !strcmp( argv[i], "output_size" ) )
143 HLTError("Missing output_size parameter");
146 HLTDebug("argv[%d+1] == %s", i, argv[i+1] );
147 fOutputSize = strtoul( argv[i+1], &cpErr, 0 );
150 HLTError("Cannot convert output_size parameter '%s'", argv[i+1] );
153 HLTInfo("Output size set to %lu %%", fOutputSize );
157 if ( !strcmp( argv[i], "-minClusters" ) )
161 HLTError("Missing minClusters parameter");
164 HLTDebug("argv[%d+1] == %s", i, argv[i+1] );
165 fMinClusters = strtoul( argv[i+1], &cpErr, 0 );
169 if ( !strcmp( argv[i], "-minTracklets" ) )
173 HLTError("Missing minTracklets parameter");
176 HLTDebug("argv[%d+1] == %s", i, argv[i+1] );
177 fMinTracklets = strtoul( argv[i+1], &cpErr, 0 );
181 if ( !strcmp( argv[i], "-TrgStr" ) )
185 HLTError("Missing parameter for mbTriggerString");
188 HLTDebug("argv[%d+1] == %s", i, argv[i+1] );
189 fTrgStrings->Add(new TObjString(argv[i+1]));
194 if ( !strcmp( argv[i], "-acceptTrgStr" ) )
200 if ( !strcmp( argv[i], "-rejectTrgStr" ) )
206 if ( !strcmp( argv[i], "-takeAllEvents" ) )
208 fTakeAllEvents = kTRUE;
215 HLTError("Unknown option '%s'", argv[i] );
222 Int_t AliHLTTRDCalibrationComponent::InitCalibration()
226 fTrgStrings = new TObjArray();
228 if(!AliCDBManager::Instance()->IsDefaultStorageSet()){
229 HLTError("DefaultStorage is not set in CDBManager");
232 if(AliCDBManager::Instance()->GetRun()<0){
233 HLTError("Run Number is not set in CDBManager");
236 HLTInfo("CDB default storage: %s; RunNo: %i", (AliCDBManager::Instance()->GetDefaultStorage()->GetBaseFolder()).Data(), AliCDBManager::Instance()->GetRun());
238 if(fTrgStrings->GetEntriesFast()>0 && !fAccRejTrg){
239 HLTError("Trigger string(s) given, but acceptTrgStr or rejectTrgStr not selected");
243 fTRDCalibraFillHisto = AliTRDCalibraFillHisto::Instance();
244 fTRDCalibraFillHisto->SetIsHLT(kTRUE);
245 fTRDCalibraFillHisto->SetHisto2d(); // choose to use histograms
246 fTRDCalibraFillHisto->SetCH2dOn(); // choose to calibrate the gain
247 fTRDCalibraFillHisto->SetPH2dOn(); // choose to calibrate the drift velocity
248 fTRDCalibraFillHisto->SetPRF2dOn(); // choose to look at the PRF
249 fTRDCalibraFillHisto->SetIsHLT(); // per detector
250 //fTRDCalibraFillHisto->SetDebugLevel(1);// debug
251 fTRDCalibraFillHisto->SetFillWithZero(kTRUE);
252 fTRDCalibraFillHisto->SetLinearFitterOn(kTRUE);
253 fTRDCalibraFillHisto->SetNumberBinCharge(100);
255 fTracksArray = new TClonesArray("AliTRDtrackV1");
256 fOutArray = new TObjArray(4);
257 fAfterRunArray=new TObjArray(5);
258 fDisplayArray=new TObjArray(4);
260 HLTDebug("run SetupCTPData");
266 Int_t AliHLTTRDCalibrationComponent::DeinitCalibration()
269 // Deinitialization of the component
271 HLTDebug("DeinitCalibration");
272 delete fTracksArray; fTracksArray=0;
273 fTRDCalibraFillHisto->DestroyDebugStreamer();
274 //fTRDCalibraFillHisto->Destroy();
275 //fOutArray->Delete();
276 delete fOutArray; fOutArray=0;
277 fAfterRunArray->Delete();
278 delete fAfterRunArray; fAfterRunArray=0;
279 fDisplayArray->Delete();
280 delete fDisplayArray; fDisplayArray=0;
281 fTrgStrings->Delete();
282 delete fTrgStrings; fTrgStrings=0;
286 Int_t AliHLTTRDCalibrationComponent::ProcessCalibration(const AliHLTComponent_EventData& /*evtData*/,
287 const AliHLTComponent_BlockData* /*blocks*/,
288 AliHLTComponent_TriggerData& /*trigData*/,
289 AliHLTUInt8_t* /*outputPtr*/,
290 AliHLTUInt32_t& /*size*/,
291 vector<AliHLTComponent_BlockData>& /*outputBlocks*/)
295 TClonesArray* TCAarray[18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
296 Int_t usedEntries = 0;
297 Int_t blockOrObject = 0;
298 Int_t nTimeBins = -1;
300 for (const AliHLTComponentBlockData* pBlock=GetFirstInputBlock(AliHLTTRDDefinitions::fgkTracksDataType); pBlock; pBlock=GetNextInputBlock())
302 TCAarray[0] = fTracksArray;
303 AliHLTTRDUtils::ReadTracks(TCAarray[0], pBlock->fPtr, pBlock->fSize, &nTimeBins);
308 for(const TObject *iter = GetFirstInputObject(AliHLTTRDDefinitions::fgkHiLvlTracksDataType); iter; iter = GetNextInputObject())
311 HLTError("You may not mix high level and low level!");
315 TCAarray[usedEntries] = dynamic_cast<TClonesArray*>(const_cast<TObject*>(iter));
316 if(!TCAarray[usedEntries])continue;
317 TObjString* strg = dynamic_cast<TObjString*>(const_cast<TObject*>(GetNextInputObject()));
320 nTimeBins = strg->String().Atoi();
330 HLTFatal("Number of timebins is negative!");
333 HLTDebug("Saving number of time bins which was read from input block. Value is: %d", nTimeBins);
334 fTRDCalibraFillHisto->Init2Dhistos(nTimeBins); // initialise the histos
335 fTRDCalibraFillHisto->SetNumberClusters(fMinClusters); // At least fMinClusters clusters
336 fTRDCalibraFillHisto->SetNumberClustersf(nTimeBins); // Not more than %d clusters
337 fSavedTimeBins=kTRUE;
340 Bool_t TriggerPassed = fTakeAllEvents;
344 TriggerPassed=kFALSE;
345 for(int i = 0; i < fTrgStrings->GetEntriesFast(); i++){
346 const TObjString *const obString=(TObjString*)fTrgStrings->At(i);
347 const TString tString=obString->GetString();
348 if(CheckCTPTrigger(tString.Data())>0){TriggerPassed=kTRUE; break;}
353 for(int i = 0; i < fTrgStrings->GetEntriesFast(); i++){
354 const TObjString *const obString=(TObjString*)fTrgStrings->At(i);
355 const TString tString=obString->GetString();
356 if(CheckCTPTrigger(tString.Data())>0){TriggerPassed=kFALSE; break;}
361 fTRDCalibraFillHisto->SetCH2dOn(TriggerPassed);
362 fTRDCalibraFillHisto->SetPH2dOn(TriggerPassed);
363 for(int i=0; i<usedEntries; i++){
364 const TClonesArray* inArr = TCAarray[i];
365 Int_t nbEntries = inArr->GetEntries();
366 HLTDebug(" %i TRDtracks in tracksArray", nbEntries);
367 AliTRDtrackV1* trdTrack = 0x0;
368 for (Int_t ii = 0; ii < nbEntries; ii++){
369 HLTDebug("%i/%i: ", ii+1, nbEntries);
370 trdTrack = (AliTRDtrackV1*)inArr->At(ii);
371 if(trdTrack->GetNumberOfTracklets()<fMinTracklets)continue;
372 fTRDCalibraFillHisto->UpdateHistogramsV1(trdTrack);
373 // for(int i3=0; i3<7; i3++)
374 // if(trdTrack->GetTracklet(i3))trdTrack->GetTracklet(i3)->Bootstrap(fReconstructor);
378 if(!fOutArray->At(0))FormOutput(0);
379 if(!fDisplayArray->At(0))FormOutput(1);
380 PushBack(fDisplayArray, AliHLTTRDDefinitions::fgkCalibrationDataType);
383 TCAarray[0]->Delete();
391 * Form output array of histrograms
393 //============================================================================
394 void AliHLTTRDCalibrationComponent::FormOutput(Int_t param)
397 TH2I *hCH2d = fTRDCalibraFillHisto->GetCH2d();
398 if(!param)fOutArray->Add(hCH2d);
399 else fDisplayArray->Add(hCH2d);
401 // drift velocity histo
402 TProfile2D *hPH2d = fTRDCalibraFillHisto->GetPH2d();
403 if(!param)fOutArray->Add(hPH2d);
404 else fDisplayArray->Add(hPH2d);
407 TProfile2D *hPRF2d = fTRDCalibraFillHisto->GetPRF2d();
408 if(!param)fOutArray->Add(hPRF2d);
409 else fDisplayArray->Add(hPRF2d);
413 AliTRDCalibraVdriftLinearFit *hVdriftLinearFitOne=(AliTRDCalibraVdriftLinearFit *)fTRDCalibraFillHisto->GetVdriftLinearFit();
414 fOutArray->Add(hVdriftLinearFitOne);
417 TH2S *hVdriftLinearFitOne = (TH2S *)(((AliTRDCalibraVdriftLinearFit *)fTRDCalibraFillHisto->GetVdriftLinearFit())->GetLinearFitterHisto(10,kTRUE));
418 fDisplayArray->Add(hVdriftLinearFitOne);
421 HLTDebug("GetCH2d = 0x%x; NEntries = %i; size = %i", hCH2d, hCH2d->GetEntries(), sizeof(*hCH2d));
423 HLTDebug("GetPH2d = 0x%x; NEntries = %i; size = %i", hPH2d, hPH2d->GetEntries(), sizeof(*hPH2d));
425 HLTDebug("GetPRF2d = 0x%x; NEntries = %i; size = %i", hPRF2d, hPRF2d->GetEntries(), sizeof(*hPRF2d));
427 //HLTDebug("GetVdriftLinearFit = 0x%x; size = %i", hVdriftLinearFitOne, sizeof(hVdriftLinearFitOne));
429 HLTDebug("output Array: pointer = 0x%x; NEntries = %i; size = %i", fOutArray, fOutArray->GetEntries(), sizeof(fOutArray));
433 Int_t AliHLTTRDCalibrationComponent::ShipDataToFXS(const AliHLTComponentEventData& /*evtData*/, AliHLTComponentTriggerData& /*trigData*/)
435 AliHLTReadoutList rdList(AliHLTReadoutList::kTRD);
439 fOutArray->Remove(fOutArray->FindObject("AliTRDCalibraVdriftLinearFit"));
440 //fOutArray->Remove(fOutArray->FindObject("PRF2d"));
441 //fOutArray->Remove(fOutArray->FindObject("PH2d"));
442 //fOutArray->Remove(fOutArray->FindObject("CH2d"));
444 if(!(fOutArray->FindObject("CH2d"))) {
445 TH2I * ch2d = new TH2I("CH2d","Nz0Nrphi0",100,0.0,300.0,540,0,540);
446 fOutArray->Add(ch2d);
449 if(!(fOutArray->FindObject("PH2d"))) {
450 TProfile2D * ph2d = new TProfile2D("PH2d","Nz0Nrphi0",30,-0.05,2.95,540,0,540);
451 fOutArray->Add(ph2d);
454 if(!(fOutArray->FindObject("PRF2d"))) {
455 TProfile2D * prf2d = new TProfile2D("PRF2d","Nz0Nrphi0Ngp3",60,-9.0,9.0,540,0,540);
456 fOutArray->Add(prf2d);
459 HLTDebug("Size of the fOutArray is %d\n",fOutArray->GetEntriesFast());
461 PushToFXS((TObject*)fOutArray, "TRD", "GAINDRIFTPRF", &rdList );
462 //PushToFXS((TObject*)fOutArray->FindObject("CH2d"), "TRD", "GAINDRIFTPRF", rdList.Buffer() );
467 Int_t AliHLTTRDCalibrationComponent::EORCalibration()
469 //Also Fill histograms for the online display
470 TH2I *hCH2d=(TH2I*)fOutArray->FindObject("CH2d");
471 TProfile2D *hPH2d=(TProfile2D*)fOutArray->FindObject("PH2d");
472 TProfile2D *hPRF2d= (TProfile2D*)fOutArray->FindObject("PRF2d");
473 AliTRDCalibraVdriftLinearFit* hVdriftLinearFit = (AliTRDCalibraVdriftLinearFit*)fOutArray->FindObject("AliTRDCalibraVdriftLinearFit");
476 if(!hCH2d || !hPH2d || !hPRF2d || !hVdriftLinearFit) return 0;
479 AliTRDCalibraFit *calibra = AliTRDCalibraFit::Instance();
482 calibra->SetMinEntries(100);
483 calibra->AnalyseCH(hCH2d);
484 //Int_t nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(0))
485 // + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(0));
486 //Int_t nbfit = calibra->GetNumberFit();
487 //Int_t nbE = calibra->GetNumberEnt();
488 TH1F *coefgain = 0x0;
491 // (nbfit >= 0.2*nbE)) {
492 // create the cal objects
493 //calibra->PutMeanValueOtherVectorFit(1,kTRUE);
494 TObjArray object = calibra->GetVectorFit();
495 AliTRDCalDet *objgaindet = calibra->CreateDetObjectGain(&object,kFALSE);
496 coefgain = objgaindet->MakeHisto1DAsFunctionOfDet();
498 calibra->ResetVectorFit();
500 // vdrift second method
501 calibra->SetMinEntries(100); // If there is less than 100
502 hVdriftLinearFit->FillPEArray();
503 calibra->AnalyseLinearFitters(hVdriftLinearFit);
505 //nbfit = calibra->GetNumberFit();
506 //nbE = calibra->GetNumberEnt();
507 TH1F *coefdriftsecond = 0x0;
510 // (nbfit >= 0.1*nbE)) {
511 // create the cal objects
512 //calibra->PutMeanValueOtherVectorFit(1,kTRUE);
513 object = calibra->GetVectorFit();
514 AliTRDCalDet *objdriftvelocitydetsecond = calibra->CreateDetObjectVdrift(&object,kTRUE);
515 objdriftvelocitydetsecond->SetTitle("secondmethodvdrift");
516 coefdriftsecond = objdriftvelocitydetsecond->MakeHisto1DAsFunctionOfDet();
518 calibra->ResetVectorFit();
520 // vdrift first method
521 calibra->SetMinEntries(100*20); // If there is less than 20000
522 calibra->AnalysePH(hPH2d);
523 //nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(1))
524 // + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(1));
525 //nbfit = calibra->GetNumberFit();
526 //nbE = calibra->GetNumberEnt();
527 TH1F *coefdrift = 0x0;
531 // (nbfit >= 0.2*nbE)) {
532 // create the cal objects
533 //calibra->PutMeanValueOtherVectorFit(1,kTRUE);
534 //calibra->PutMeanValueOtherVectorFit2(1,kTRUE);
535 object = calibra->GetVectorFit();
536 AliTRDCalDet *objdriftvelocitydet = calibra->CreateDetObjectVdrift(&object,kTRUE);
537 coefdrift = objdriftvelocitydet->MakeHisto1DAsFunctionOfDet();
538 object = calibra->GetVectorFit2();
539 AliTRDCalDet *objtime0det = calibra->CreateDetObjectT0(&object,kTRUE);
540 coeft0 = objtime0det->MakeHisto1DAsFunctionOfDet();
542 calibra->ResetVectorFit();
546 calibra->SetMinEntries(200);
547 calibra->AnalysePRFMarianFit(hPRF2d);
548 //nbtg = 6*4*18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb0(2))
549 // + 6* 18*((Int_t) ((AliTRDCalibraMode *)calibra->GetCalibraMode())->GetDetChamb2(2));
550 //nbfit = calibra->GetNumberFit();
551 //nbE = calibra->GetNumberEnt();
555 // (nbfit >= 0.95*nbE)) {
556 // create cal pad objects
557 object = calibra->GetVectorFit();
558 TObject *objPRFpad = calibra->CreatePadObjectPRF(&object);
559 coefprf = ((AliTRDCalPad *) objPRFpad)->MakeHisto1D();
561 calibra->ResetVectorFit();
564 coefgain->SetName("coefgain");
565 coefprf->SetName("coefprf");
566 coefdrift->SetName("coefdrift");
567 coefdriftsecond->SetName("coefdriftsecond");
568 coeft0->SetName("coeft0");
569 fAfterRunArray->Add(coefgain);
570 fAfterRunArray->Add(coefprf);
571 fAfterRunArray->Add(coefdrift);
572 fAfterRunArray->Add(coefdriftsecond);
573 fAfterRunArray->Add(coeft0);
575 PushBack(fAfterRunArray, AliHLTTRDDefinitions::fgkEORCalibrationDataType);
577 // TString fileName="/tmp/CalibHistoDump_run";
578 // fileName+=AliCDBManager::Instance()->GetRun();
579 // fileName+=".root";
580 // HLTInfo("Dumping Histogram file to %s",fileName.Data());
581 // TFile* file = TFile::Open(fileName, "RECREATE");
582 // fAfterRunArray->Write();
583 // fOutArray->Write();
585 // HLTInfo("Histogram file dumped");