ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/grimes/L1Menu/src/ReducedMenuSample.cpp
(Generate patch)

Comparing UserCode/grimes/L1Menu/src/ReducedMenuSample.cpp (file contents):
Revision 1.4 by grimes, Tue Jun 4 08:17:37 2013 UTC vs.
Revision 1.6 by grimes, Wed Jun 5 11:02:36 2013 UTC

# Line 34 | Line 34 | namespace l1menu
34          class ReducedMenuSamplePrivateMembers
35          {
36          public:
37 <                ReducedMenuSamplePrivateMembers( size_t newNumberOfEvents, size_t numberOfParameters, const l1menu::TriggerMenu newTriggerMenu )
38 <                        : thresholdsForAllEvents( newNumberOfEvents, std::vector<float>(numberOfParameters) ),
39 <                          weights( newNumberOfEvents ), numberOfEvents( newNumberOfEvents ), triggerMenu( newTriggerMenu )
37 >                ReducedMenuSamplePrivateMembers( size_t newNumberOfEvents, size_t newNumberOfParameters, const l1menu::TriggerMenu newTriggerMenu )
38 >                        : numberOfEvents( newNumberOfEvents ), numberOfParameters( newNumberOfParameters ),
39 >                          thresholdsForAllEvents( numberOfEvents, std::vector<float>(numberOfParameters) ),
40 >                          weights( newNumberOfEvents, 1 ), triggerMenu( newTriggerMenu )
41                  {
42 <                        // Run through every event and default every weight to 1.
43 <                        for( auto& eventWeight : weights )
44 <                        {
45 <                                eventWeight=1;
46 <                        }
42 >                        // No operation besides the initialiser list
43 >                }
44 >                ReducedMenuSamplePrivateMembers( size_t newNumberOfParameters, const l1menu::TriggerMenu newTriggerMenu )
45 >                        : numberOfEvents( 0 ), numberOfParameters( newNumberOfParameters ), triggerMenu( newTriggerMenu )
46 >                {
47 >                        // No operation besides the initialiser list
48                  }
49 +                size_t numberOfEvents;
50 +                const size_t numberOfParameters;
51                  std::vector< std::vector<float> > thresholdsForAllEvents;
52                  std::vector<float> weights;
53                  ::ReducedEventImplementation event;
50                size_t numberOfEvents;
54                  const l1menu::TriggerMenu triggerMenu;
55          };
56   }
57  
55 #include <iostream>
58   l1menu::ReducedMenuSample::ReducedMenuSample( const l1menu::MenuSample& originalSample, const l1menu::TriggerMenu& triggerMenu )
59   {
60          size_t numberOfEvents=originalSample.numberOfEvents();
# Line 110 | Line 112 | l1menu::ReducedMenuSample::ReducedMenuSa
112          } // end of loop over events
113   }
114  
115 + l1menu::ReducedMenuSample::ReducedMenuSample( const l1menu::TriggerMenu& triggerMenu )
116 + {
117 +        // Need to find out how many parameters there are for each event. Basically the sum
118 +        // of the number of thresholds for all triggers.
119 +        size_t numberOfParameters=0;
120 +        for( size_t triggerNumber=0; triggerNumber<triggerMenu.numberOfTriggers(); ++triggerNumber )
121 +        {
122 +                const l1menu::ITrigger& trigger=triggerMenu.getTrigger(triggerNumber);
123 +                numberOfParameters+=l1menu::getThresholdNames(trigger).size();
124 +        }
125 +
126 +        // Now I know how many events there are and how many parameters, I can create the pimple
127 +        // with the correct parameters.
128 +        // I get a bad_alloc exception if I pass 0 numberOfEvents, so I'll
129 +        pImple_.reset( new l1menu::ReducedMenuSamplePrivateMembers( numberOfParameters, triggerMenu ) );
130 + }
131 +
132   l1menu::ReducedMenuSample::~ReducedMenuSample()
133   {
134          // No operation. Just need one defined otherwise the default one messes up
# Line 117 | Line 136 | l1menu::ReducedMenuSample::~ReducedMenuS
136          // defined elsewhere.
137   }
138  
139 + void l1menu::ReducedMenuSample::addSample( const l1menu::MenuSample& originalSample )
140 + {
141 +        size_t oldNumberEvents=pImple_->numberOfEvents;
142 +        pImple_->numberOfEvents=oldNumberEvents+originalSample.numberOfEvents();
143 +
144 +        // Resize the containers to make space for the new events
145 +        pImple_->thresholdsForAllEvents.resize( pImple_->numberOfEvents, std::vector<float>(pImple_->numberOfParameters) );
146 +        pImple_->weights.resize( pImple_->numberOfEvents, 1 );
147 +
148 +        //
149 +        // Now I've set the storage to the correct size, run through each event
150 +        // and fill with the correct values.
151 +        //
152 +        for( size_t eventNumber=0; eventNumber<originalSample.numberOfEvents(); ++eventNumber )
153 +        {
154 +                size_t bufferEventNumber=eventNumber+oldNumberEvents;
155 +
156 +                const l1menu::IEvent& event=originalSample.getEvent( eventNumber );
157 +                std::vector<float>& parameters=pImple_->thresholdsForAllEvents[bufferEventNumber];
158 +
159 +                size_t parameterNumber=0;
160 +                // Loop over all of the triggers
161 +                for( size_t triggerNumber=0; triggerNumber<pImple_->triggerMenu.numberOfTriggers(); ++triggerNumber )
162 +                {
163 +                        std::unique_ptr<l1menu::ITrigger> pTrigger=pImple_->triggerMenu.getTriggerCopy(triggerNumber);
164 +                        std::vector<std::string> thresholdNames=getThresholdNames(*pTrigger);
165 +
166 +                        try
167 +                        {
168 +                                setTriggerThresholdsAsTightAsPossible( event, *pTrigger, 0.001 );
169 +                                // Set all of the parameters to match the thresholds in the trigger
170 +                                for( const auto& thresholdName : thresholdNames )
171 +                                {
172 +                                        parameters[parameterNumber]=pTrigger->parameter(thresholdName);
173 +                                        ++parameterNumber;
174 +                                }
175 +                        }
176 +                        catch( std::exception& error )
177 +                        {
178 +                                // setTriggerThresholdsAsTightAsPossible() couldn't find thresholds so record
179 +                                // -1 for everything.
180 +                                for( size_t index=0; index<thresholdNames.size(); ++index )
181 +                                {
182 +                                        parameters[parameterNumber]=-1;
183 +                                        ++parameterNumber;
184 +                                }
185 +                        } // end of try block that sets the trigger thresholds
186 +
187 +                } // end of loop over triggers
188 +        } // end of loop over events
189 +
190 + }
191 +
192   l1menu::ReducedMenuSample::ReducedMenuSample( const std::string& filename )
193   {
194          GOOGLE_PROTOBUF_VERIFY_VERSION;
# Line 152 | Line 224 | l1menu::ReducedMenuSample::ReducedMenuSa
224                  totalNumberOfThresholds+=inputTrigger.threshold_size();
225          }
226  
227 +
228          // Now I have the menu set up as much as I need it (thresholds aren't set
229          // but I don't care about those). I can initialise the ReducedMenuSamplePrivateMembers
230          // pImple_ with the menu and the correct sizes for the data buffer.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines