/[PAMELA software]/DarthVader/TrackerLevel2/src/TrkLevel0.cpp
ViewVC logotype

Diff of /DarthVader/TrackerLevel2/src/TrkLevel0.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by pam-fi, Fri Feb 16 14:56:01 2007 UTC revision 1.7 by pam-fi, Fri Dec 5 08:30:37 2008 UTC
# Line 4  Line 4 
4   */   */
5  #include <TrkLevel0.h>  #include <TrkLevel0.h>
6    
7    //......................................
8    // F77 routines
9    //......................................
10    extern "C" {    
11    
12        void filladc_(int*);
13        void evaluatecn_(int*);
14        void subtractped_(int*);
15    
16    
17    }
18  using namespace pamela::tracker;  using namespace pamela::tracker;
19    
20  /**  /**
21     *
22     *   Function to decode the tracker words.
23     *  
24     *   Tracker words are of three types:
25     *   - ADC data
26     *   - strip address
27     *   - end of ladder
28     *  
29     *   The function returns a struct variable (trkword)
30     *   that contains two quantities, type and decode, which are assigned
31     *   the following values:
32     *  
33     *   type                     decode              
34     *   ----------------------------------------------------
35     *   -1     error             0          
36     *    0     data              0-4095   ADC values
37     *    1     address           0-1023   strip address (relative to ladder)
38     *    2     end-of-ladder     1,2,3    ladder number     (compressed acq mode)      
39     *                            4,5,6    ladder number + 3 (full acq mode)
40     *      
41     **/
42    
43    trkword datadecode(int word){
44      int type =0;
45      int data =0;
46      int nodata = word&0xf000;
47      int zero = 0;
48    
49      trkword thisword;
50        
51      switch (nodata>>12){
52    
53      case 0:      
54            
55        thisword.decode = word;
56        thisword.type = 0;
57        //  cout << thisword.decode << "\n";
58        return (thisword);              //>>>>> ADC data (0)
59    
60      case 1:      
61    
62        type = word&0xC00;
63        data = word&0x3ff;
64    
65        switch(type>>10){
66    
67        case 0:  
68          thisword.decode = data;
69          thisword.type = 1; //>>> address (1)
70          return (thisword);          
71    
72        case 2:  
73          //            if(data>=4)data = data-3;
74          if(data>6){
75            printf("Error on data \n");
76            thisword.decode = zero;
77            thisword.type = -1;
78            return (thisword);     //>>>>> error (-1)
79          }
80          thisword.decode = data;      
81          thisword.type = 2;
82          return (thisword);       //>>> end-of-ladder
83    
84        default:
85          printf("Error on data \n");
86          thisword.decode = zero;
87          thisword.type = -1;
88          return (thisword);              //>>>>> error (-1)
89                
90        }
91    
92      default:
93    
94        printf("Error on data \n");
95        thisword.decode = zero;
96        thisword.type = -1;
97        return (thisword);              //>>>>> error (-1)
98      }
99    }
100    
101    
102    /**
103   * Pass values from the TrkLevel0 object to a struct cTrkLevel0 (to put data in F77 common).   * Pass values from the TrkLevel0 object to a struct cTrkLevel0 (to put data in F77 common).
104   */   */
105  //void TrkLevel0::GetCommonVar(cTrkLevel0 *l0) {  //void TrkLevel0::GetCommonVar(cTrkLevel0 *l0) {
# Line 66  void TrkLevel0::SetFromLevel0Struct(cTrk Line 159  void TrkLevel0::SetFromLevel0Struct(cTrk
159  int TrkLevel0::ProcessEvent(){  int TrkLevel0::ProcessEvent(){
160    
161  //    cout << "int TrkLevel0::ProcessEvent()" << endl;  //    cout << "int TrkLevel0::ProcessEvent()" << endl;
162        TrkParams::Load(6);
163        if( !TrkParams::IsLoaded(6) ){
164            cout << "int TrkLevel0::ProcessEvent() -- ERROR -- VK-mask not loaded"<<endl;
165            return 0;
166        };
167      TrkParams::LoadCalib( );      TrkParams::LoadCalib( );
168      if( !TrkParams::CalibIsLoaded() )return 0;      if( !TrkParams::CalibIsLoaded() ){
169            cout << "int TrkLevel0::ProcessEvent() -- ERROR -- Calibration not loaded"<<endl;
170            return 0;
171        };
172    
173      GetLevel0Struct();      GetLevel0Struct();
174      int F77err = 0;      int F77err = 0;
175      reductionflight_(&F77err);      reductionflight_(&F77err);
176      if(F77err < 0)return 0;      if(F77err < 0){
177            cout << "int TrkLevel0::ProcessEvent() -- ERROR -- from F77 routine"<<endl;
178            return 0;
179        }
180    //    cout << "...done"<<endl;
181            
182      return 1;      return 1;
183    
184  }  }
185    /**
186     * Method to evaluate the raw signal (ADC) of each strip (it performs uncompression).
187     * (it calls F77 routine filladc )
188     */
189    bool TrkLevel0::FillADC(){
190    
191    //    cout << "int TrkLevel0::ProcessEvent()" << endl;
192        TrkParams::Load(6);
193        if( !TrkParams::IsLoaded(6) ){
194            cout << "int TrkLevel0::FillADC() -- ERROR -- VK-mask not loaded"<<endl;
195            return false;
196        };
197        TrkParams::LoadCalib( );
198        if( !TrkParams::CalibIsLoaded() ){
199            cout << "int TrkLevel0::FillADC() -- ERROR -- Calibration not loaded"<<endl;
200            return false;
201        };
202    
203        GetLevel0Struct();
204        int iflag=0;
205        filladc_(&iflag);
206        if(iflag!=0)return false;
207        return true;
208    
209    }
210    /**
211     * Method to evaluate calibrated signal (ADC-CN-PED) of each view
212     * (it calls F77 routines: filladc + evaluatecn + subtractped)
213     * @param iview view number (1-12)
214     */
215    bool TrkLevel0::GetCalibratedEvent(int iview, TGraph* graph){
216    
217        if ( iview<1 || iview>12 )return false;
218        if ( !FillADC() ) return false;
219        evaluatecn_(&iview);
220        subtractped_(&iview);
221    
222        if(graph){
223            graph->Set(NSTRIP);
224            for(int i=0; i<NSTRIP; i++)graph->SetPoint(i,(float)i,calibratedsignal_.value[i]);
225        }
226        
227    
228        return true;
229    
230    }
231    /**
232     * extract compressed/full data for a subset of channels
233     *
234     */
235    void TrkLevel0::Decode(int from,int to,bool& COMPRESSED,bool& FULL, int* datacomp, int* datafull){
236        //
237        int address = 0;
238        int ladder = 1;
239        Int_t whisto[3072]; for(int i=0; i<3072; i++)whisto[i] = -200;
240        //
241        COMPRESSED=false;
242        FULL=false;
243    
244        for(Int_t vi = from ; vi < to ; vi++){
245            int word = yodaobj->TrackerData.At(vi);    
246            trkword thisword = datadecode(word);
247            switch (thisword.type){
248                
249            case 0:  //ADC value
250                whisto[address] = thisword.decode;
251    //          cout << vi<<"    data " << thisword.decode << " @ "<<address << "\n";
252                address++;    
253                break;
254            
255            case 1:  //address
256                address = 1024*(ladder-1) + thisword.decode;
257    //          cout << vi<<"     adr " << address << "\n";
258                break;
259                
260            case 2:  //end-of-ladder
261                ladder = thisword.decode;
262    //          cout << vi<<" Ladder " << ladder << "\n";
263                if(ladder==3){
264                    //                  end of compressed data - FILL HISTO
265    //              cout << ">>> COMPRESSED data" << "\n";
266                    COMPRESSED=true;
267                    for(int ii = 0; ii < 3072; ii++){
268                        *(datacomp+ii) = whisto[ii];
269                        whisto[ii] = -200;
270                    }
271                    address = 0;
272                    ladder = 1;                
273                }else if(ladder==6){
274                    //                  end of full data - FILL HISTO
275    //              cout << ">>> FULL data" << "\n";
276                    FULL=true;
277                    for(int ii = 0; ii < 3072; ii++){
278                        *(datafull+ii) = whisto[ii];
279                        whisto[ii] = -200;
280                    }
281                    address = 0;
282                    ladder = 1;
283                }else{              
284                    if(ladder>3)    ladder=ladder-3;
285                    address= ladder*1024;          
286                    ladder = ladder + 1;    
287                }
288            }    
289        }    
290    
291    }
292    
293    /**
294     * Retrieve full event
295     *
296     */
297    bool TrkLevel0::GetFullEvent(int iview, TGraph* graph){
298    
299    
300        // retrieve the index of the dsp
301        int idsp=0;
302        do{
303            if ( yodaobj->DSPnumber[idsp] == iview )break;
304            idsp++;
305        }while(idsp<12);
306        if(idsp==12)return false;
307        //
308        // check DAQ mode:
309        //  9 full
310        // 10 compressed
311        // 11 compressed+full
312        //  8 special: compressed+full <--> compressed alternati
313        //
314        if( yodaobj->DAQmode[idsp] == 10 )return false;//compressed only
315        //
316        int offset =0;
317        for(int i=0; i<idsp; i++)offset+=yodaobj->DATAlength[i];
318        //
319        // decode data
320        //
321        Int_t whistocomp[3072];
322        Int_t whistofull[3072];
323        bool COMPRESSED=false;
324        bool FULL=false;
325        Decode(offset,offset+yodaobj->DATAlength[idsp],COMPRESSED,FULL,whistocomp,whistofull);
326        if(!FULL) return false;
327        
328        if(!graph)graph=new TGraph(3072);
329        for(int i=0; i<3072; i++)graph->SetPoint(i,(double)i,(double)whistofull[i]);
330        return true;
331    
332    }
333    
334    /**
335     * Retrieve compressed event
336     *
337     */
338    bool TrkLevel0::GetCompressedEvent(int iview, TGraph* graph){
339    
340    
341        // retrieve the index of the dsp
342        int idsp=0;
343        do{
344            if ( yodaobj->DSPnumber[idsp] == iview )break;
345            idsp++;
346        }while(idsp<12);
347        if(idsp==12)return false;
348        //
349        // check DAQ mode:
350        //  9 full
351        // 10 compressed
352        // 11 compressed+full
353        //  8 special: compressed+full <--> compressed alternati
354        //
355        if( yodaobj->DAQmode[idsp] == 9 )return false;
356        //
357        int offset =0;
358        for(int i=0; i<idsp; i++)offset+=yodaobj->DATAlength[i];
359        //
360        // decode data
361        //
362        Int_t whistocomp[3072];
363        Int_t whistofull[3072];
364        bool COMPRESSED=false;
365        bool FULL=false;
366        Decode(offset,offset+yodaobj->DATAlength[idsp],COMPRESSED,FULL,whistocomp,whistofull);
367        if(!COMPRESSED) return false;
368        
369        if(!graph)graph=new TGraph(3072);
370        for(int i=0; i<3072; i++)graph->SetPoint(i,(double)i,(double)whistocomp[i]);
371        return true;
372    
373    }
374    /**
375     * Retrieve uncompressed event event
376     */
377    bool TrkLevel0::GetUnCompressedEvent(int iview, TGraph* graph){
378    
379        if(!graph)graph=new TGraph(3072);
380        //
381        if( !GetCompressedEvent(iview,graph) )return false;
382        //  
383        double* adc;
384        double last=0.;
385        adc = graph->GetY();
386        for(int i=0; i<3072; i++){
387            int ivk = (int)((float)i/128.);
388            int is = i%128;
389            if(*(adc+i)>0)last = adc[i] - (double)pedsigbad_.pedestal_t[is][ivk][iview-1];
390            else{
391                *(adc+i) = last + (double)pedsigbad_.pedestal_t[is][ivk][iview-1];
392            }
393            graph->SetPoint(i,(double)i,*(adc+i));
394        }
395        
396        return true;
397    
398    }
399    /**
400     * Retrieve sigmas
401     */
402    bool TrkLevel0::GetSigma(int iview, TGraph* graph){
403    
404        if(!graph)graph=new TGraph(3072);
405        //
406        for(int i=0; i<3072; i++){
407            int ivk = (int)((float)i/128.);
408            int is = i%128;
409            graph->SetPoint(i,(double)i,(double)pedsigbad_.sigma[is][ivk][iview-1]);
410        }
411        
412        return true;
413    
414    }
415    
416  ClassImp(TrkLevel0);  ClassImp(TrkLevel0);

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.7

  ViewVC Help
Powered by ViewVC 1.1.23