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 "AliTRDCommonParam.h"
40 #include "AliTRDrawData.h"
41 #include "AliTRDtrigger.h"
42 #include "AliTRDmodule.h"
43 #include "AliTRDmcmTracklet.h"
44 #include "AliTRDgtuTrack.h"
45 #include "AliTRDtrigParam.h"
46 #include "AliTRDmcm.h"
47 #include "AliTRDzmaps.h"
48 #include "Cal/AliTRDCalPIDLQ.h"
50 ClassImp(AliTRDtrigger)
52 //_____________________________________________________________________________
53 AliTRDtrigger::AliTRDtrigger()
79 // AliTRDtrigger default constructor
84 //_____________________________________________________________________________
85 AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title)
93 ,fDigitsManager(new AliTRDdigitsManager())
95 ,fTracklets(new TObjArray(400))
108 ,fTracks(new TClonesArray("AliTRDgtuTrack",1000))
111 // AliTRDtrigger constructor
116 //_____________________________________________________________________________
117 AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p)
125 ,fDigitsManager(NULL)
134 ,fNtracklets(p.fNtracklets)
139 ,fNPrimary(p.fNPrimary)
143 // AliTRDtrigger copy constructor
148 ///_____________________________________________________________________________
149 AliTRDtrigger::~AliTRDtrigger()
152 // AliTRDtrigger destructor
156 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(fTrigParam);
197 fField = fTrigParam->GetField();
198 fGeo = (AliTRDgeometry*)AliTRDgeometry::GetGeometry(fRunLoader);
200 fCalib = AliTRDcalibDB::Instance();
202 AliError("No instance of AliTRDcalibDB.");
206 fCParam = AliTRDCommonParam::Instance();
208 AliError("No common parameters.");
214 //_____________________________________________________________________________
215 Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
218 // Opens the AliROOT file.
221 TString evfoldname = AliConfig::GetDefaultEventFolderName();
222 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
225 fRunLoader = AliRunLoader::Open(name);
228 AliError(Form("Can not open session for file %s.",name));
233 if (fRunLoader->GetAliRun() == 0x0) {
234 fRunLoader->LoadgAlice();
236 gAlice = fRunLoader->GetAliRun();
238 fRunLoader->LoadgAlice();
239 gAlice = fRunLoader->GetAliRun();
241 AliError("Could not find AliRun object.");
246 // Import the Trees for the event nEvent in the file
247 fRunLoader->GetEvent(nEvent);
250 TObjArray *ioArray = 0;
251 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
252 loader->MakeTree("T");
253 fTrackletTree = loader->TreeT();
254 fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
261 //_____________________________________________________________________________
262 Bool_t AliTRDtrigger::ReadDigits()
265 // Reads the digits arrays from the input aliroot file
269 AliError("Can not find the Run Loader");
273 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
274 if (!loader->TreeD()) {
275 loader->LoadDigits();
277 if (!loader->TreeD()) {
281 return (fDigitsManager->ReadDigits(loader->TreeD()));
285 //_____________________________________________________________________________
286 Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
289 // Reads the digits arrays from the ddl file
292 AliTRDrawData *raw = new AliTRDrawData();
293 fDigitsManager = raw->Raw2Digits(rawReader);
299 //_____________________________________________________________________________
300 Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
303 // Reads the tracklets find the tracks
308 AliLoader *loader = rl->GetLoader("TRDLoader");
309 loader->LoadTracks();
310 fTrackletTree = loader->TreeT();
312 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
314 AliError("Can't get the branch !");
317 TObjArray *tracklets = new TObjArray(400);
318 branch->SetAddress(&tracklets);
320 Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
324 Int_t iStackPrev = -1;
326 for (iEntry = 0; iEntry < nEntries; iEntry++) {
328 fTrackletTree->GetEvent(iEntry);
330 for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++) {
332 fTrk = (AliTRDmcmTracklet*)tracklets->UncheckedAt(itrk);
333 idet = fTrk->GetDetector();
334 iStack = idet / (AliTRDgeometry::Nplan());
336 if (iStackPrev != iStack) {
337 if (iStackPrev == -1) {
341 MakeTracks(idet - AliTRDgeometry::Nplan());
347 Tracklets()->Add(fTrk);
349 if ((iEntry == (nEntries-1)) &&
350 (itrk == (tracklets->GetEntriesFast() - 1))) {
352 MakeTracks(idet-AliTRDgeometry::Nplan());
360 loader->UnloadTracks();
366 //_____________________________________________________________________________
367 Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
370 // Create tracklets from digits
374 Int_t chamEnd = AliTRDgeometry::Ncham();
376 Int_t planEnd = AliTRDgeometry::Nplan();
378 Int_t sectEnd = AliTRDgeometry::Nsect();
380 fTrkTest = new AliTRDmcmTracklet(0,0,0);
381 fMCM = new AliTRDmcm(fTrigParam,0);
390 Int_t iStackPrev = -1;
393 for (Int_t isect = sectBeg; isect < sectEnd; isect++) {
395 for (Int_t icham = chamBeg; icham < chamEnd; icham++) {
397 // Number of ROBs in the chamber
405 for (Int_t iplan = planBeg; iplan < planEnd; iplan++) {
407 idet = fGeo->GetDetector(iplan,icham,isect);
411 iStack = idet / (AliTRDgeometry::Nplan());
412 if (iStackPrev != iStack) {
413 if (iStackPrev == -1) {
417 MakeTracks(idet-AliTRDgeometry::Nplan());
424 Int_t nRowMax = fCParam->GetRowMax(iplan,icham,isect);
425 Int_t nColMax = fCParam->GetColMax(iplan);
426 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
429 fDigits = fDigitsManager->GetDigits(idet);
430 if (!fDigits) return kFALSE;
431 // This is to take care of switched off super modules
432 if (fDigits->GetNtime() == 0) {
436 fTrack0 = fDigitsManager->GetDictionary(idet,0);
437 if (!fTrack0) return kFALSE;
439 fTrack1 = fDigitsManager->GetDictionary(idet,1);
440 if (!fTrack1) return kFALSE;
442 fTrack2 = fDigitsManager->GetDictionary(idet,2);
443 if (!fTrack2) return kFALSE;
446 for (Int_t iRob = 0; iRob < fNROB; iRob++) {
448 for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
451 fMCM->SetRobId(iRob);
452 fMCM->SetChaId(idet);
454 SetMCMcoordinates(iMcm);
456 row = fMCM->GetRow();
458 if ((row < 0) || (row >= nRowMax)) {
459 AliError("MCM row number out of range.");
463 fMCM->GetColRange(col1,col2);
465 for (time = 0; time < nTimeTotal; time++) {
466 for (col = col1; col < col2; col++) {
467 if ((col >= 0) && (col < nColMax)) {
468 amp = TMath::Abs(fDigits->GetDataUnchecked(row,col,time));
473 fMCM->SetADC(col-col1,time,amp);
477 if (fTrigParam->GetTailCancelation()) {
478 fMCM->Filter(fTrigParam->GetNexponential(),fTrigParam->GetFilterType());
483 for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
485 if (fMCM->GetSeedCol()[iSeed] < 0) {
489 if (fTrigParam->GetDebugLevel() > 1) {
490 AliInfo(Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
493 if (fTrigParam->GetDebugLevel() == -1) {
494 AliInfo(Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
495 for (time = 0; time < nTimeTotal; time++) {
496 for (col = 0; col < kMcmCol; col++) {
497 printf("%03.0f ",fMCM->GetADC(col,time));
503 if (TestTracklet(idet,row,iSeed,0)) {
504 AddTracklet(idet,row,iSeed,fNtracklets++);
516 // Compress the arrays
517 fDigits->Compress(1,0);
518 fTrack0->Compress(1,0);
519 fTrack1->Compress(1,0);
520 fTrack2->Compress(1,0);
522 WriteTracklets(idet);
530 MakeTracks(idet - AliTRDgeometry::Nplan());
538 //_____________________________________________________________________________
539 void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
542 // Configure MCM position in the pad plane
545 Int_t robid = fMCM->GetRobId();
547 // setting the Row and Col range
549 const Int_t kNcolRob = 2; // number of ROBs per chamber in column direction
550 const Int_t kNmcmRob = 4; // number of MCMs per ROB in column/row direction
552 Int_t mcmid = imcm%(kNmcmRob*kNmcmRob);
554 if (robid%kNcolRob == 0) {
556 if (mcmid%kNmcmRob == 0) {
557 fMCM->SetColRange(18*0-1,18*1-1+2+1);
559 if (mcmid%kNmcmRob == 1) {
560 fMCM->SetColRange(18*1-1,18*2-1+2+1);
562 if (mcmid%kNmcmRob == 2) {
563 fMCM->SetColRange(18*2-1,18*3-1+2+1);
565 if (mcmid%kNmcmRob == 3) {
566 fMCM->SetColRange(18*3-1,18*4-1+2+1);
572 if (mcmid%kNmcmRob == 0) {
573 fMCM->SetColRange(18*4-1,18*5-1+2+1);
575 if (mcmid%kNmcmRob == 1) {
576 fMCM->SetColRange(18*5-1,18*6-1+2+1);
578 if (mcmid%kNmcmRob == 2) {
579 fMCM->SetColRange(18*6-1,18*7-1+2+1);
581 if (mcmid%kNmcmRob == 3) {
582 fMCM->SetColRange(18*7-1,18*8-1+2+1);
587 fMCM->SetRow(kNmcmRob*(robid/kNcolRob)+mcmid/kNmcmRob);
591 //_____________________________________________________________________________
592 Bool_t AliTRDtrigger::TestTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
595 // Check first the tracklet pt
598 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
602 fTrkTest->SetDetector(det);
603 fTrkTest->SetRow(row);
606 Int_t iCol, iCol1, iCol2, track[3];
607 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
608 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
611 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
613 amp[0] = fMCM->GetADC(iCol-1,iTime);
614 amp[1] = fMCM->GetADC(iCol ,iTime);
615 amp[2] = fMCM->GetADC(iCol+1,iTime);
617 // extract track contribution only from the central pad
618 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
619 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
620 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
622 if (fMCM->IsCluster(iCol,iTime)) {
624 fTrkTest->AddCluster(iCol+iCol1,iTime,amp,track);
627 else if ((iCol+1+1) < kMcmCol) {
629 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
630 amp[1] = fMCM->GetADC(iCol +1,iTime);
631 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
633 if (fMCM->IsCluster(iCol+1,iTime)) {
635 // extract track contribution only from the central pad
636 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
637 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
638 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
640 fTrkTest->AddCluster(iCol+1+iCol1,iTime,amp,track);
648 fTrkTest->CookLabel(0.8);
650 if (fTrkTest->GetLabel() >= fNPrimary) {
651 Info("AddTracklet","Only primaries are stored!");
657 fTrkTest->MakeTrackletGraph(fGeo,fField);
658 fTrkTest->MakeClusAmpGraph();
659 if (TMath::Abs(fTrkTest->GetPt()) < fTrigParam->GetLtuPtCut()) {
667 //_____________________________________________________________________________
668 void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
671 // Add a found tracklet
674 Int_t nTimeTotal = fCalib->GetNumberOfTimeBins();
676 fTrk = new AliTRDmcmTracklet(det,row,n);
678 Int_t iCol, iCol1, iCol2, track[3];
679 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
680 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
683 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
685 amp[0] = fMCM->GetADC(iCol-1,iTime);
686 amp[1] = fMCM->GetADC(iCol ,iTime);
687 amp[2] = fMCM->GetADC(iCol+1,iTime);
689 // extract track contribution only from the central pad
690 track[0] = fTrack0->GetDataUnchecked(row,iCol+iCol1,iTime);
691 track[1] = fTrack1->GetDataUnchecked(row,iCol+iCol1,iTime);
692 track[2] = fTrack2->GetDataUnchecked(row,iCol+iCol1,iTime);
694 if (fMCM->IsCluster(iCol,iTime)) {
696 fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
699 else if ((iCol+1+1) < kMcmCol) {
701 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
702 amp[1] = fMCM->GetADC(iCol +1,iTime);
703 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
705 if (fMCM->IsCluster(iCol+1,iTime)) {
707 // extract track contribution only from the central pad
708 track[0] = fTrack0->GetDataUnchecked(row,iCol+1+iCol1,iTime);
709 track[1] = fTrack1->GetDataUnchecked(row,iCol+1+iCol1,iTime);
710 track[2] = fTrack2->GetDataUnchecked(row,iCol+1+iCol1,iTime);
712 fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
720 fTrk->CookLabel(0.8);
722 if (fTrk->GetLabel() >= fNPrimary) {
723 Info("AddTracklet","Only primaries are stored!");
728 fTrk->MakeTrackletGraph(fGeo,fField);
729 fTrk->MakeClusAmpGraph();
730 if (TMath::Abs(fTrk->GetPt()) < fTrigParam->GetLtuPtCut()) {
734 Tracklets()->Add(fTrk);
738 //_____________________________________________________________________________
739 Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
742 // Fills TRDmcmTracklet branch in the tree with the Tracklets
743 // found in detector = det. For det=-1 writes the tree.
746 if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
747 AliError(Form("Unexpected detector index %d.",det));
751 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
753 TObjArray *ioArray = 0;
754 branch = fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
757 if ((det >= 0) && (det < AliTRDgeometry::Ndet())) {
759 Int_t nTracklets = Tracklets()->GetEntriesFast();
760 TObjArray *detTracklets = new TObjArray(400);
762 for (Int_t i = 0; i < nTracklets; i++) {
764 AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
766 if (det == trk->GetDetector()) {
767 detTracklets->AddLast(trk);
772 branch->SetAddress(&detTracklets);
773 fTrackletTree->Fill();
783 AliInfo(Form("Writing the Tracklet tree %s for event %d."
784 ,fTrackletTree->GetName(),fRunLoader->GetEventNumber()));
786 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
787 loader->WriteTracks("OVERWRITE");
797 //_____________________________________________________________________________
798 void AliTRDtrigger::MakeTracks(Int_t det)
801 // Create GTU tracks per module (stack of 6 chambers)
806 Int_t nRowMax, iplan, icham, isect, row;
808 if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
809 AliError(Form("Unexpected detector index %d.",det));
813 Int_t nTracklets = Tracklets()->GetEntriesFast();
815 AliTRDmcmTracklet *trk;
816 for (Int_t i = 0; i < nTracklets; i++) {
818 trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
820 iplan = fGeo->GetPlane(trk->GetDetector());
821 icham = fGeo->GetChamber(trk->GetDetector());
822 isect = fGeo->GetSector(trk->GetDetector());
824 nRowMax = fCParam->GetRowMax(iplan,icham,isect);
827 fModule->AddTracklet(trk->GetDetector(),
839 fModule->SortTracklets();
840 fModule->RemoveMultipleTracklets();
841 fModule->SortZ((Int_t)fGeo->GetChamber(det));
842 fModule->FindTracks();
843 fModule->SortTracks();
844 fModule->RemoveMultipleTracks();
846 Int_t nModTracks = fModule->GetNtracks();
847 AliTRDgtuTrack *gtutrk;
848 for (Int_t i = 0; i < nModTracks; i++) {
849 gtutrk = (AliTRDgtuTrack*)fModule->GetTrack(i);
850 if (TMath::Abs(gtutrk->GetPt()) < fTrigParam->GetGtuPtCut()) continue;
853 AddTrack(gtutrk,det);
858 //_____________________________________________________________________________
859 void AliTRDtrigger::AddTrack(const AliTRDgtuTrack *t, Int_t det)
862 // Add a track to the list
865 AliTRDgtuTrack *track = new(fTracks->operator[](fTracks->GetEntriesFast()))
867 track->SetDetector(det);
871 //_____________________________________________________________________________
872 TObjArray* AliTRDtrigger::Tracklets()
875 // Returns list of tracklets
879 fTracklets = new TObjArray(400);
885 //_____________________________________________________________________________
886 void AliTRDtrigger::ResetTracklets()
889 // Resets the list of tracklets
893 fTracklets->Delete();
898 //_____________________________________________________________________________
899 Int_t AliTRDtrigger::GetNumberOfTracks() const
902 // Returns number of tracks
905 return fTracks->GetEntriesFast();
909 //_____________________________________________________________________________
910 AliTRDgtuTrack* AliTRDtrigger::GetTrack(Int_t i) const
913 // Returns a given track from the list
916 return (AliTRDgtuTrack *) fTracks->UncheckedAt(i);