1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////////
18 // TRD trigger class //
23 ///////////////////////////////////////////////////////////////////////////////
28 #include <TClonesArray.h>
29 #include <TObjArray.h>
33 #include "AliLoader.h"
35 #include "AliTRDdigitsManager.h"
36 #include "AliTRDgeometry.h"
37 #include "AliTRDdataArrayI.h"
38 #include "AliTRDcalibDB.h"
39 #include "AliTRDrawData.h"
40 #include "AliTRDtrigger.h"
41 #include "AliTRDmodule.h"
42 #include "AliTRDmcmTracklet.h"
43 #include "AliTRDgtuTrack.h"
44 #include "AliTRDtrigParam.h"
45 #include "AliTRDmcm.h"
46 #include "AliTRDzmaps.h"
47 #include "AliTRDCalibraFillHisto.h"
48 #include "Cal/AliTRDCalPIDLQ.h"
50 ClassImp(AliTRDtrigger)
52 //_____________________________________________________________________________
53 AliTRDtrigger::AliTRDtrigger()
76 // AliTRDtrigger default constructor
81 //_____________________________________________________________________________
82 AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title)
87 ,fDigitsManager(new AliTRDdigitsManager())
89 ,fTracklets(new TObjArray(400))
102 ,fTracks(new TClonesArray("AliTRDgtuTrack",1000))
105 // AliTRDtrigger constructor
110 //_____________________________________________________________________________
111 AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p)
116 ,fDigitsManager(NULL)
125 ,fNtracklets(p.fNtracklets)
130 ,fNPrimary(p.fNPrimary)
134 // AliTRDtrigger copy constructor
140 fGeo = new AliTRDgeometry();
144 ///_____________________________________________________________________________
145 AliTRDtrigger::~AliTRDtrigger()
148 // AliTRDtrigger destructor
152 fTracklets->Delete();
167 //_____________________________________________________________________________
168 AliTRDtrigger &AliTRDtrigger::operator=(const AliTRDtrigger &p)
171 // Assignment operator
174 if (this != &p) ((AliTRDtrigger &) p).Copy(*this);
179 //_____________________________________________________________________________
180 void AliTRDtrigger::Copy(TObject &) const
186 AliFatal("Not implemented");
190 //_____________________________________________________________________________
191 void AliTRDtrigger::Init()
194 fModule = new AliTRDmodule();
197 // The magnetic field strength
198 Double_t x[3] = { 0.0, 0.0, 0.0 };
200 gAlice->Field(x,b); // b[] is in kilo Gauss
201 fField = b[2] * 0.1; // Tesla
203 fGeo = new AliTRDgeometry();
205 if (!AliTRDcalibDB::Instance()) {
206 AliError("No instance of AliTRDcalibDB.");
212 //_____________________________________________________________________________
213 Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
216 // Opens the AliROOT file.
219 TString evfoldname = AliConfig::GetDefaultEventFolderName();
220 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
223 fRunLoader = AliRunLoader::Open(name);
226 AliError(Form("Can not open session for file %s.",name));
230 // Import the Trees for the event nEvent in the file
231 fRunLoader->GetEvent(nEvent);
234 TObjArray *ioArray = 0;
235 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
236 loader->MakeTree("T");
237 fTrackletTree = loader->TreeT();
238 fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
245 //_____________________________________________________________________________
246 Bool_t AliTRDtrigger::ReadDigits()
249 // Reads the digits arrays from the input aliroot file
253 AliError("Can not find the Run Loader");
257 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
258 if (!loader->TreeD()) {
259 loader->LoadDigits();
261 if (!loader->TreeD()) {
265 return (fDigitsManager->ReadDigits(loader->TreeD()));
269 //_____________________________________________________________________________
270 Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
273 // Reads the digits arrays from the ddl file
276 AliTRDrawData *raw = new AliTRDrawData();
277 fDigitsManager = raw->Raw2Digits(rawReader);
283 //_____________________________________________________________________________
284 Bool_t AliTRDtrigger::ReadDigits(TTree *digitsTree)
287 // Reads the digits arrays from the input tree
290 return (fDigitsManager->ReadDigits(digitsTree));
294 //_____________________________________________________________________________
295 Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
298 // Reads the tracklets find the tracks
303 AliLoader *loader = rl->GetLoader("TRDLoader");
304 loader->LoadTracks();
305 fTrackletTree = loader->TreeT();
307 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
309 AliError("Can't get the branch !");
312 TObjArray *tracklets = new TObjArray(400);
313 branch->SetAddress(&tracklets);
315 Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
319 Int_t iStackPrev = -1;
321 for (iEntry = 0; iEntry < nEntries; iEntry++) {
323 fTrackletTree->GetEvent(iEntry);
325 for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++) {
327 fTrk = (AliTRDmcmTracklet *) tracklets->UncheckedAt(itrk);
328 idet = fTrk->GetDetector();
329 iStack = idet / (AliTRDgeometry::Nplan());
331 if (iStackPrev != iStack) {
332 if (iStackPrev == -1) {
336 MakeTracks(idet - AliTRDgeometry::Nplan());
342 Tracklets()->Add(fTrk);
344 if ((iEntry == (nEntries-1)) &&
345 (itrk == (tracklets->GetEntriesFast() - 1))) {
347 MakeTracks(idet-AliTRDgeometry::Nplan());
355 loader->UnloadTracks();
361 //_____________________________________________________________________________
362 Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
365 // Create tracklets from digits
369 Int_t chamEnd = AliTRDgeometry::Ncham();
371 Int_t planEnd = AliTRDgeometry::Nplan();
373 Int_t sectEnd = AliTRDgeometry::Nsect();
375 fTrkTest = new AliTRDmcmTracklet(0,0,0);
376 fMCM = new AliTRDmcm(0);
385 Int_t iStackPrev = -1;
388 for (Int_t isect = sectBeg; isect < sectEnd; isect++) {
390 for (Int_t icham = chamBeg; icham < chamEnd; icham++) {
392 // Number of ROBs in the chamber
400 for (Int_t iplan = planBeg; iplan < planEnd; iplan++) {
402 idet = fGeo->GetDetector(iplan,icham,isect);
406 iStack = idet / (AliTRDgeometry::Nplan());
407 if (iStackPrev != iStack) {
408 if (iStackPrev == -1) {
412 MakeTracks(idet-AliTRDgeometry::Nplan());
419 Int_t nRowMax = fGeo->GetRowMax(iplan,icham,isect);
420 Int_t nColMax = fGeo->GetColMax(iplan);
421 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
424 fDigits = fDigitsManager->GetDigits(idet);
425 if (!fDigits) return kFALSE;
426 // This is to take care of switched off super modules
427 if (fDigits->GetNtime() == 0) {
431 fTrack0 = fDigitsManager->GetDictionary(idet,0);
432 if (!fTrack0) return kFALSE;
434 fTrack1 = fDigitsManager->GetDictionary(idet,1);
435 if (!fTrack1) return kFALSE;
437 fTrack2 = fDigitsManager->GetDictionary(idet,2);
438 if (!fTrack2) return kFALSE;
441 for (Int_t iRob = 0; iRob < fNROB; iRob++) {
443 for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
446 fMCM->SetRobId(iRob);
447 fMCM->SetChaId(idet);
449 SetMCMcoordinates(iMcm);
451 row = fMCM->GetRow();
453 if ((row < 0) || (row >= nRowMax)) {
454 AliError("MCM row number out of range.");
458 fMCM->GetColRange(col1,col2);
460 for (time = 0; time < nTimeTotal; time++) {
461 for (col = col1; col < col2; col++) {
462 if ((col >= 0) && (col < nColMax)) {
463 amp = TMath::Abs(fDigits->GetDataUnchecked(row,col,time));
468 fMCM->SetADC(col-col1,time,amp);
472 if (AliTRDtrigParam::Instance()->GetTailCancelation()) {
473 fMCM->Filter(AliTRDtrigParam::Instance()->GetNexponential()
474 ,AliTRDtrigParam::Instance()->GetFilterType());
479 for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
481 if (fMCM->GetSeedCol()[iSeed] < 0) {
485 AliDebug(2,Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
487 if (TestTracklet(idet,row,iSeed,0)) {
488 AddTracklet(idet,row,iSeed,fNtracklets++);
500 // Compress the arrays
501 fDigits->Compress(1,0);
502 fTrack0->Compress(1,0);
503 fTrack1->Compress(1,0);
504 fTrack2->Compress(1,0);
506 WriteTracklets(idet);
514 MakeTracks(idet - AliTRDgeometry::Nplan());
522 //_____________________________________________________________________________
523 void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
526 // Configure MCM position in the pad plane
529 Int_t robid = fMCM->GetRobId();
531 // setting the Row and Col range
533 const Int_t kNcolRob = 2; // number of ROBs per chamber in column direction
534 const Int_t kNmcmRob = 4; // number of MCMs per ROB in column/row direction
536 Int_t mcmid = imcm%(kNmcmRob*kNmcmRob);
538 if (robid%kNcolRob == 0) {
540 if (mcmid%kNmcmRob == 0) {
541 fMCM->SetColRange(18*0-1,18*1-1+2+1);
543 if (mcmid%kNmcmRob == 1) {
544 fMCM->SetColRange(18*1-1,18*2-1+2+1);
546 if (mcmid%kNmcmRob == 2) {
547 fMCM->SetColRange(18*2-1,18*3-1+2+1);
549 if (mcmid%kNmcmRob == 3) {
550 fMCM->SetColRange(18*3-1,18*4-1+2+1);
556 if (mcmid%kNmcmRob == 0) {
557 fMCM->SetColRange(18*4-1,18*5-1+2+1);
559 if (mcmid%kNmcmRob == 1) {
560 fMCM->SetColRange(18*5-1,18*6-1+2+1);
562 if (mcmid%kNmcmRob == 2) {
563 fMCM->SetColRange(18*6-1,18*7-1+2+1);
565 if (mcmid%kNmcmRob == 3) {
566 fMCM->SetColRange(18*7-1,18*8-1+2+1);
571 fMCM->SetRow(kNmcmRob*(robid/kNcolRob)+mcmid/kNmcmRob);
575 //_____________________________________________________________________________
576 Bool_t AliTRDtrigger::TestTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
579 // Check first the tracklet pt
582 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
584 // Calibration fill 2D
585 AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance();
587 AliInfo("Could not get Calibra instance\n");
592 fTrkTest->SetDetector(det);
593 fTrkTest->SetRow(row);
596 Int_t iCol, iCol1, iCol2, track[3];
597 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
598 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
601 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
603 amp[0] = fMCM->GetADC(iCol-1,iTime);
604 amp[1] = fMCM->GetADC(iCol ,iTime);
605 amp[2] = fMCM->GetADC(iCol+1,iTime);
607 // extract track contribution only from the central pad
608 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
609 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
610 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
612 if (fMCM->IsCluster(iCol,iTime)) {
614 fTrkTest->AddCluster(iCol+iCol1,iTime,amp,track);
617 else if ((iCol+1+1) < kMcmCol) {
619 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
620 amp[1] = fMCM->GetADC(iCol +1,iTime);
621 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
623 if (fMCM->IsCluster(iCol+1,iTime)) {
625 // extract track contribution only from the central pad
626 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
627 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
628 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
630 fTrkTest->AddCluster(iCol+1+iCol1,iTime,amp,track);
638 fTrkTest->CookLabel(0.8);
640 if (fTrkTest->GetLabel() >= fNPrimary) {
641 Info("AddTracklet","Only primaries are stored!");
646 fTrkTest->MakeTrackletGraph(fGeo,fField);
648 // TRD Online calibration
649 if (calibra->GetMcmTracking()) {
650 calibra->UpdateHistogramcm(fTrkTest);
653 fTrkTest->MakeClusAmpGraph();
655 if (TMath::Abs(fTrkTest->GetPt()) < AliTRDtrigParam::Instance()->GetLtuPtCut()) {
663 //_____________________________________________________________________________
664 void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
667 // Add a found tracklet
670 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
672 fTrk = new AliTRDmcmTracklet(det,row,n);
674 Int_t iCol, iCol1, iCol2, track[3];
675 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
676 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
679 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
681 amp[0] = fMCM->GetADC(iCol-1,iTime);
682 amp[1] = fMCM->GetADC(iCol ,iTime);
683 amp[2] = fMCM->GetADC(iCol+1,iTime);
685 // extract track contribution only from the central pad
686 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
687 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
688 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
690 if (fMCM->IsCluster(iCol,iTime)) {
692 fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
695 else if ((iCol+1+1) < kMcmCol) {
697 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
698 amp[1] = fMCM->GetADC(iCol +1,iTime);
699 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
701 if (fMCM->IsCluster(iCol+1,iTime)) {
703 // extract track contribution only from the central pad
704 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
705 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
706 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
708 fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
716 fTrk->CookLabel(0.8);
718 if (fTrk->GetLabel() >= fNPrimary) {
719 Info("AddTracklet","Only primaries are stored!");
724 fTrk->MakeTrackletGraph(fGeo,fField);
725 fTrk->MakeClusAmpGraph();
726 if (TMath::Abs(fTrk->GetPt()) < AliTRDtrigParam::Instance()->GetLtuPtCut()) {
730 Tracklets()->Add(fTrk);
734 //_____________________________________________________________________________
735 Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
738 // Fills TRDmcmTracklet branch in the tree with the Tracklets
739 // found in detector = det. For det=-1 writes the tree.
742 if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
743 AliError(Form("Unexpected detector index %d.",det));
747 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
749 TObjArray *ioArray = 0;
750 branch = fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
753 if ((det >= 0) && (det < AliTRDgeometry::Ndet())) {
755 Int_t nTracklets = Tracklets()->GetEntriesFast();
756 TObjArray *detTracklets = new TObjArray(400);
758 for (Int_t i = 0; i < nTracklets; i++) {
760 AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
762 if (det == trk->GetDetector()) {
763 detTracklets->AddLast(trk);
768 branch->SetAddress(&detTracklets);
769 fTrackletTree->Fill();
779 AliInfo(Form("Writing the Tracklet tree %s for event %d."
780 ,fTrackletTree->GetName(),fRunLoader->GetEventNumber()));
782 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
783 loader->WriteTracks("OVERWRITE");
793 //_____________________________________________________________________________
794 void AliTRDtrigger::MakeTracks(Int_t det)
797 // Create GTU tracks per module (stack of 6 chambers)
802 Int_t nRowMax, iplan, icham, isect, row;
804 if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
805 AliError(Form("Unexpected detector index %d.",det));
809 Int_t nTracklets = Tracklets()->GetEntriesFast();
811 AliTRDmcmTracklet *trk;
812 for (Int_t i = 0; i < nTracklets; i++) {
814 trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
816 iplan = fGeo->GetPlane(trk->GetDetector());
817 icham = fGeo->GetChamber(trk->GetDetector());
818 isect = fGeo->GetSector(trk->GetDetector());
820 nRowMax = fGeo->GetRowMax(iplan,icham,isect);
823 fModule->AddTracklet(trk->GetDetector(),
835 fModule->SortTracklets();
836 fModule->RemoveMultipleTracklets();
837 fModule->SortZ((Int_t)fGeo->GetChamber(det));
838 fModule->FindTracks();
839 fModule->SortTracks();
840 fModule->RemoveMultipleTracks();
842 Int_t nModTracks = fModule->GetNtracks();
843 AliTRDgtuTrack *gtutrk;
844 for (Int_t i = 0; i < nModTracks; i++) {
845 gtutrk = (AliTRDgtuTrack*)fModule->GetTrack(i);
846 if (TMath::Abs(gtutrk->GetPt()) < AliTRDtrigParam::Instance()->GetGtuPtCut()) continue;
849 AddTrack(gtutrk,det);
854 //_____________________________________________________________________________
855 void AliTRDtrigger::AddTrack(const AliTRDgtuTrack *t, Int_t det)
858 // Add a track to the list
861 AliTRDgtuTrack *track = new(fTracks->operator[](fTracks->GetEntriesFast()))
863 track->SetDetector(det);
867 //_____________________________________________________________________________
868 TObjArray* AliTRDtrigger::Tracklets()
871 // Returns list of tracklets
875 fTracklets = new TObjArray(400);
881 //_____________________________________________________________________________
882 void AliTRDtrigger::ResetTracklets()
885 // Resets the list of tracklets
889 fTracklets->Delete();
894 //_____________________________________________________________________________
895 Int_t AliTRDtrigger::GetNumberOfTracks() const
898 // Returns number of tracks
901 return fTracks->GetEntriesFast();
905 //_____________________________________________________________________________
906 AliTRDgtuTrack* AliTRDtrigger::GetTrack(Int_t i) const
909 // Returns a given track from the list
912 return (AliTRDgtuTrack *) fTracks->UncheckedAt(i);