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 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // TRD trigger class //
25 ///////////////////////////////////////////////////////////////////////////////
30 #include <TClonesArray.h>
31 #include <TObjArray.h>
35 #include "AliLoader.h"
37 #include "AliTRDdigitsManager.h"
39 #include "AliTRDarrayDictionary.h"
40 #include "AliTRDarrayADC.h"
42 #include "AliTRDgeometry.h"
43 #include "AliTRDcalibDB.h"
44 #include "AliTRDrawData.h"
45 #include "AliTRDtrigger.h"
46 #include "AliTRDmodule.h"
47 #include "AliTRDmcmTracklet.h"
48 #include "AliTRDgtuTrack.h"
49 #include "AliTRDtrigParam.h"
50 #include "AliTRDmcm.h"
51 #include "AliTRDzmaps.h"
52 // #include "AliTRDCalibraFillHisto.h"
53 #include "Cal/AliTRDCalPID.h"
55 ClassImp(AliTRDtrigger)
57 //_____________________________________________________________________________
58 AliTRDtrigger::AliTRDtrigger()
81 // AliTRDtrigger default constructor
86 //_____________________________________________________________________________
87 AliTRDtrigger::AliTRDtrigger(const Text_t *name, const Text_t *title)
92 ,fDigitsManager(new AliTRDdigitsManager())
94 ,fTracklets(new TObjArray(400))
107 ,fTracks(new TClonesArray("AliTRDgtuTrack",1000))
110 // AliTRDtrigger constructor
115 //_____________________________________________________________________________
116 AliTRDtrigger::AliTRDtrigger(const AliTRDtrigger &p)
121 ,fDigitsManager(NULL)
130 ,fNtracklets(p.fNtracklets)
135 ,fNPrimary(p.fNPrimary)
139 // AliTRDtrigger copy constructor
145 fGeo = new AliTRDgeometry();
149 ///_____________________________________________________________________________
150 AliTRDtrigger::~AliTRDtrigger()
153 // AliTRDtrigger destructor
157 fTracklets->Delete();
170 delete fDigitsManager;
178 //_____________________________________________________________________________
179 AliTRDtrigger &AliTRDtrigger::operator=(const AliTRDtrigger &p)
182 // Assignment operator
185 if (this != &p) ((AliTRDtrigger &) p).Copy(*this);
190 //_____________________________________________________________________________
191 void AliTRDtrigger::Copy(TObject &) const
197 AliFatal("Not implemented");
201 //_____________________________________________________________________________
202 void AliTRDtrigger::Init()
208 fModule = new AliTRDmodule();
211 // The magnetic field strength
212 const Double_t x[3] = { 0.0, 0.0, 0.0 };
214 gAlice->Field(x,b); // b[] is in kilo Gauss
215 fField = b[2] * 0.1; // Tesla
217 fGeo = new AliTRDgeometry();
219 if (!AliTRDcalibDB::Instance()) {
220 AliError("No instance of AliTRDcalibDB.");
226 //_____________________________________________________________________________
227 Bool_t AliTRDtrigger::Open(const Char_t *name, Int_t nEvent)
230 // Opens the AliROOT file.
233 TString evfoldname = AliConfig::GetDefaultEventFolderName();
234 fRunLoader = AliRunLoader::GetRunLoader(evfoldname);
237 fRunLoader = AliRunLoader::Open(name);
240 AliError(Form("Can not open session for file %s.",name));
244 // Import the Trees for the event nEvent in the file
245 fRunLoader->GetEvent(nEvent);
248 TObjArray *ioArray = 0;
249 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
250 loader->MakeTree("T");
251 fTrackletTree = loader->TreeT();
252 fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
259 //_____________________________________________________________________________
260 Bool_t AliTRDtrigger::ReadDigits()
263 // Reads the digits arrays from the input aliroot file
267 AliError("Can not find the Run Loader");
271 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
272 if (!loader->TreeD()) {
273 loader->LoadDigits();
275 if (!loader->TreeD()) {
279 return (fDigitsManager->ReadDigits(loader->TreeD()));
283 //_____________________________________________________________________________
284 Bool_t AliTRDtrigger::ReadDigits(AliRawReader* rawReader)
287 // Reads the digits arrays from the ddl file
290 AliTRDrawData *raw = new AliTRDrawData();
291 fDigitsManager = raw->Raw2Digits(rawReader);
297 //_____________________________________________________________________________
298 Bool_t AliTRDtrigger::ReadDigits(TTree *digitsTree)
301 // Reads the digits arrays from the input tree
304 return (fDigitsManager->ReadDigits(digitsTree));
308 //_____________________________________________________________________________
309 Bool_t AliTRDtrigger::ReadTracklets(AliRunLoader *rl)
312 // Reads the tracklets find the tracks
317 AliLoader *loader = rl->GetLoader("TRDLoader");
318 loader->LoadTracks();
319 fTrackletTree = loader->TreeT();
321 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
323 AliError("Can't get the branch !");
326 TObjArray *tracklets = new TObjArray(400);
327 branch->SetAddress(&tracklets);
329 Int_t nEntries = (Int_t) fTrackletTree->GetEntries();
333 Int_t iStackPrev = -1;
335 for (iEntry = 0; iEntry < nEntries; iEntry++) {
337 fTrackletTree->GetEvent(iEntry);
339 for (itrk = 0; itrk < tracklets->GetEntriesFast(); itrk++) {
341 fTrk = (AliTRDmcmTracklet *) tracklets->UncheckedAt(itrk);
342 idet = fTrk->GetDetector();
343 iStack = idet / (AliTRDgeometry::Nlayer());
345 if (iStackPrev != iStack) {
346 if (iStackPrev == -1) {
350 MakeTracks(idet - AliTRDgeometry::Nlayer());
356 Tracklets()->Add(fTrk);
358 if ((iEntry == (nEntries-1)) &&
359 (itrk == (tracklets->GetEntriesFast() - 1))) {
361 MakeTracks(idet-AliTRDgeometry::Nlayer());
369 loader->UnloadTracks();
375 //_____________________________________________________________________________
376 Bool_t AliTRDtrigger::MakeTracklets(Bool_t makeTracks)
379 // Create tracklets from digits
383 Int_t stackEnd = AliTRDgeometry::Nstack();
385 Int_t layerEnd = AliTRDgeometry::Nlayer();
387 Int_t sectorEnd = AliTRDgeometry::Nsector();
389 fTrkTest = new AliTRDmcmTracklet(0,0,0);
390 fMCM = new AliTRDmcm(0);
398 Int_t iStackCur = -1;
399 Int_t iStackPrev = -1;
402 for (Int_t isector = sectorBeg; isector < sectorEnd; isector++) {
404 for (Int_t istack = stackBeg; istack < stackEnd; istack++) {
406 // Number of ROBs in the chamber
414 for (Int_t ilayer = layerBeg; ilayer < layerEnd; ilayer++) {
416 idet = fGeo->GetDetector(ilayer,istack,isector);
420 iStackCur = idet / (AliTRDgeometry::Nlayer());
421 if (iStackPrev != iStackCur) {
422 if (iStackPrev == -1) {
423 iStackPrev = iStackCur;
426 MakeTracks(idet-AliTRDgeometry::Nlayer());
428 iStackPrev = iStackCur;
433 Int_t nRowMax = fGeo->GetRowMax(ilayer,istack,isector);
434 Int_t nColMax = fGeo->GetColMax(ilayer);
435 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
438 fDigits = (AliTRDarrayADC *) fDigitsManager->GetDigits(idet);
439 if (!fDigits) return kFALSE;
440 // This is to take care of switched off super modules
441 if (fDigits->GetNtime() == 0) {
445 fTrack0 = (AliTRDarrayDictionary *) fDigitsManager->GetDictionary(idet,0);
446 if (!fTrack0) return kFALSE;
448 fTrack1 = (AliTRDarrayDictionary *) fDigitsManager->GetDictionary(idet,1);
449 if (!fTrack1) return kFALSE;
451 fTrack2 = (AliTRDarrayDictionary *) fDigitsManager->GetDictionary(idet,2);
452 if (!fTrack2) return kFALSE;
455 for (Int_t iRob = 0; iRob < fNROB; iRob++) {
457 for (Int_t iMcm = 0; iMcm < kNMCM; iMcm++) {
460 fMCM->SetRobId(iRob);
461 fMCM->SetChaId(idet);
463 SetMCMcoordinates(iMcm);
465 row = fMCM->GetRow();
467 if ((row < 0) || (row >= nRowMax)) {
468 AliError("MCM row number out of range.");
472 fMCM->GetColRange(col1,col2);
474 for (time = 0; time < nTimeTotal; time++) {
475 for (col = col1; col < col2; col++) {
476 if ((col >= 0) && (col < nColMax)) {
477 amp = TMath::Abs(fDigits->GetData(row,col,time));
482 fMCM->SetADC(col-col1,time,amp);
486 if (AliTRDtrigParam::Instance()->GetTailCancelation()) {
487 fMCM->Filter(AliTRDtrigParam::Instance()->GetNexponential()
488 ,AliTRDtrigParam::Instance()->GetFilterType());
493 for (Int_t iSeed = 0; iSeed < kMaxTrackletsPerMCM; iSeed++) {
495 if (fMCM->GetSeedCol()[iSeed] < 0) {
499 AliDebug(2,Form("Add tracklet %d in col %02d \n",fNtracklets,fMCM->GetSeedCol()[iSeed]));
501 if (TestTracklet(idet,row,iSeed,0)) {
502 AddTracklet(idet,row,iSeed,fNtracklets++);
514 // Compress the arrays
520 WriteTracklets(idet);
528 MakeTracks(idet - AliTRDgeometry::Nlayer());
536 //_____________________________________________________________________________
537 void AliTRDtrigger::SetMCMcoordinates(Int_t imcm)
540 // Configure MCM position in the pad plane
543 Int_t robid = fMCM->GetRobId();
545 // setting the Row and Col range
547 const Int_t kNcolRob = 2; // number of ROBs per chamber in column direction
548 const Int_t kNmcmRob = 4; // number of MCMs per ROB in column/row direction
550 Int_t mcmid = imcm%(kNmcmRob*kNmcmRob);
552 if (robid%kNcolRob == 0) {
554 if (mcmid%kNmcmRob == 0) {
555 fMCM->SetColRange(18*0-1,18*1-1+2+1);
557 if (mcmid%kNmcmRob == 1) {
558 fMCM->SetColRange(18*1-1,18*2-1+2+1);
560 if (mcmid%kNmcmRob == 2) {
561 fMCM->SetColRange(18*2-1,18*3-1+2+1);
563 if (mcmid%kNmcmRob == 3) {
564 fMCM->SetColRange(18*3-1,18*4-1+2+1);
570 if (mcmid%kNmcmRob == 0) {
571 fMCM->SetColRange(18*4-1,18*5-1+2+1);
573 if (mcmid%kNmcmRob == 1) {
574 fMCM->SetColRange(18*5-1,18*6-1+2+1);
576 if (mcmid%kNmcmRob == 2) {
577 fMCM->SetColRange(18*6-1,18*7-1+2+1);
579 if (mcmid%kNmcmRob == 3) {
580 fMCM->SetColRange(18*7-1,18*8-1+2+1);
585 fMCM->SetRow(kNmcmRob*(robid/kNcolRob)+mcmid/kNmcmRob);
589 //_____________________________________________________________________________
590 Bool_t AliTRDtrigger::TestTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
593 // Check first the tracklet pt
596 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
598 // Calibration fill 2D
599 // AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance();
601 // AliInfo("Could not get Calibra instance\n");
606 fTrkTest->SetDetector(det);
607 fTrkTest->SetRow(row);
610 Int_t iCol, iCol1, iCol2, track[3];
611 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
612 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
615 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
617 amp[0] = fMCM->GetADC(iCol-1,iTime);
618 amp[1] = fMCM->GetADC(iCol ,iTime);
619 amp[2] = fMCM->GetADC(iCol+1,iTime);
621 // extract track contribution only from the central pad
622 track[0] = fTrack0->GetData(row,iCol+iCol1,iTime);
623 track[1] = fTrack1->GetData(row,iCol+iCol1,iTime);
624 track[2] = fTrack2->GetData(row,iCol+iCol1,iTime);
626 if (fMCM->IsCluster(iCol,iTime)) {
628 fTrkTest->AddCluster(iCol+iCol1,iTime,amp,track);
631 else if ((iCol+1+1) < kMcmCol) {
633 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
634 amp[1] = fMCM->GetADC(iCol +1,iTime);
635 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
637 if (fMCM->IsCluster(iCol+1,iTime)) {
639 // extract track contribution only from the central pad
640 track[0] = fTrack0->GetData(row,iCol+1+iCol1,iTime);
641 track[1] = fTrack1->GetData(row,iCol+1+iCol1,iTime);
642 track[2] = fTrack2->GetData(row,iCol+1+iCol1,iTime);
644 fTrkTest->AddCluster(iCol+1+iCol1,iTime,amp,track);
652 fTrkTest->CookLabel(0.8);
654 if (fTrkTest->GetLabel() >= fNPrimary) {
655 Info("AddTracklet","Only primaries are stored!");
660 fTrkTest->MakeTrackletGraph(fGeo,fField);
662 fTrkTest->MakeClusAmpGraph();
664 if (TMath::Abs(fTrkTest->GetPt()) < AliTRDtrigParam::Instance()->GetLtuPtCut()) {
672 //_____________________________________________________________________________
673 void AliTRDtrigger::AddTracklet(Int_t det, Int_t row, Int_t seed, Int_t n)
676 // Add a found tracklet
679 Int_t nTimeTotal = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
681 fTrk = new AliTRDmcmTracklet(det,row,n);
683 Int_t iCol, iCol1, iCol2, track[3];
684 iCol = fMCM->GetSeedCol()[seed]; // 0....20 (MCM)
685 fMCM->GetColRange(iCol1,iCol2); // range in the pad plane
688 for (Int_t iTime = 0; iTime < nTimeTotal; iTime++) {
690 amp[0] = fMCM->GetADC(iCol-1,iTime);
691 amp[1] = fMCM->GetADC(iCol ,iTime);
692 amp[2] = fMCM->GetADC(iCol+1,iTime);
694 // extract track contribution only from the central pad
695 track[0] = fTrack0->GetData(row,iCol+iCol1,iTime);
696 track[1] = fTrack1->GetData(row,iCol+iCol1,iTime);
697 track[2] = fTrack2->GetData(row,iCol+iCol1,iTime);
699 if (fMCM->IsCluster(iCol,iTime)) {
701 fTrk->AddCluster(iCol+iCol1,iTime,amp,track);
704 else if ((iCol+1+1) < kMcmCol) {
706 amp[0] = fMCM->GetADC(iCol-1+1,iTime);
707 amp[1] = fMCM->GetADC(iCol +1,iTime);
708 amp[2] = fMCM->GetADC(iCol+1+1,iTime);
710 if (fMCM->IsCluster(iCol+1,iTime)) {
712 // extract track contribution only from the central pad
713 track[0] = fTrack0->GetData(row,iCol+1+iCol1,iTime);
714 track[1] = fTrack1->GetData(row,iCol+1+iCol1,iTime);
715 track[2] = fTrack2->GetData(row,iCol+1+iCol1,iTime);
717 fTrk->AddCluster(iCol+1+iCol1,iTime,amp,track);
725 fTrk->CookLabel(0.8);
727 if (fTrk->GetLabel() >= fNPrimary) {
728 Info("AddTracklet","Only primaries are stored!");
733 fTrk->MakeTrackletGraph(fGeo,fField);
734 fTrk->MakeClusAmpGraph();
735 if (TMath::Abs(fTrk->GetPt()) < AliTRDtrigParam::Instance()->GetLtuPtCut()) {
739 Tracklets()->Add(fTrk);
743 //_____________________________________________________________________________
744 Bool_t AliTRDtrigger::WriteTracklets(Int_t det)
747 // Fills TRDmcmTracklet branch in the tree with the Tracklets
748 // found in detector = det. For det=-1 writes the tree.
751 if ((det < -1) || (det >= AliTRDgeometry::Ndet())) {
752 AliError(Form("Unexpected detector index %d.",det));
756 TBranch *branch = fTrackletTree->GetBranch("TRDmcmTracklet");
758 TObjArray *ioArray = 0;
759 branch = fTrackletTree->Branch("TRDmcmTracklet","TObjArray",&ioArray,32000,0);
762 if ((det >= 0) && (det < AliTRDgeometry::Ndet())) {
764 Int_t nTracklets = Tracklets()->GetEntriesFast();
765 TObjArray *detTracklets = new TObjArray(400);
767 for (Int_t i = 0; i < nTracklets; i++) {
769 AliTRDmcmTracklet *trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
771 if (det == trk->GetDetector()) {
772 detTracklets->AddLast(trk);
777 branch->SetAddress(&detTracklets);
778 fTrackletTree->Fill();
788 AliInfo(Form("Writing the Tracklet tree %s for event %d."
789 ,fTrackletTree->GetName(),fRunLoader->GetEventNumber()));
791 AliLoader* loader = fRunLoader->GetLoader("TRDLoader");
792 loader->WriteTracks("OVERWRITE");
802 //_____________________________________________________________________________
803 void AliTRDtrigger::MakeTracks(Int_t det)
806 // Create GTU tracks per module (stack of 6 chambers)
811 Int_t nRowMax, ilayer, istack, isector, row;
813 if ((det < 0) || (det >= AliTRDgeometry::Ndet())) {
814 AliError(Form("Unexpected detector index %d.",det));
818 Int_t nTracklets = Tracklets()->GetEntriesFast();
820 AliTRDmcmTracklet *trk;
821 for (Int_t i = 0; i < nTracklets; i++) {
823 trk = (AliTRDmcmTracklet *) Tracklets()->UncheckedAt(i);
825 ilayer = fGeo->GetLayer(trk->GetDetector());
826 istack = fGeo->GetStack(trk->GetDetector());
827 isector = fGeo->GetSector(trk->GetDetector());
829 nRowMax = fGeo->GetRowMax(ilayer,istack,isector);
832 fModule->AddTracklet(trk->GetDetector(),
844 fModule->SortTracklets();
845 fModule->RemoveMultipleTracklets();
846 fModule->SortZ((Int_t)fGeo->GetStack(det));
847 fModule->FindTracks();
848 fModule->SortTracks();
849 fModule->RemoveMultipleTracks();
851 Int_t nModTracks = fModule->GetNtracks();
852 AliTRDgtuTrack *gtutrk;
853 for (Int_t i = 0; i < nModTracks; i++) {
854 gtutrk = (AliTRDgtuTrack*)fModule->GetTrack(i);
855 if (TMath::Abs(gtutrk->GetPt()) < AliTRDtrigParam::Instance()->GetGtuPtCut()) continue;
858 AddTrack(gtutrk,det);
863 //_____________________________________________________________________________
864 void AliTRDtrigger::AddTrack(const AliTRDgtuTrack *t, Int_t det)
867 // Add a track to the list
870 AliTRDgtuTrack *track = new(fTracks->operator[](fTracks->GetEntriesFast()))
872 track->SetDetector(det);
876 //_____________________________________________________________________________
877 TObjArray* AliTRDtrigger::Tracklets()
880 // Returns list of tracklets
884 fTracklets = new TObjArray(400);
890 //_____________________________________________________________________________
891 void AliTRDtrigger::ResetTracklets()
894 // Resets the list of tracklets
898 fTracklets->Delete();
903 //_____________________________________________________________________________
904 Int_t AliTRDtrigger::GetNumberOfTracks() const
907 // Returns number of tracks
910 return fTracks->GetEntriesFast();
914 //_____________________________________________________________________________
915 AliTRDgtuTrack* AliTRDtrigger::GetTrack(Int_t i) const
918 // Returns a given track from the list
921 return (AliTRDgtuTrack *) fTracks->UncheckedAt(i);